[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [RFC PATCH 29/31] xen/arm: Introduce CPUFreq Interface component
On Wed, 6 Dec 2017, Oleksandr Tyshchenko wrote: > >> + perf->platform_limit = platform_limit; > >> + perf->shared_type = CPUFREQ_SHARED_TYPE_ANY; > >> + perf->domain_info.domain = cpumask_first(mask); > >> + perf->domain_info.num_processors = cpumask_weight(mask); > >> + > >> + /* Iterate through all CPUs which are on the same boat */ > >> + for_each_cpu( cpu, mask ) > >> + { > >> + ret = set_px_pminfo(cpu, perf); > >> + if ( ret ) > >> + { > >> + printk("cpu%d: failed to set Px states (%d)\n", cpu, ret); > >> + break; > >> + } > >> + > >> + printk(XENLOG_DEBUG "cpu%d: set Px states\n", cpu); > >> + } > >> + > >> + xfree(states); > >> +out: > >> + xfree(perf); > >> + > >> + return ret; > >> +} > >> + > >> +static int __init scpi_cpufreq_postinit(void) > >> +{ > >> + struct cpufreq_frequency_table *freq_table = NULL; > >> + cpumask_t processed_cpus, shared_cpus; > >> + unsigned int cpu; > >> + int ret = -ENODEV; > >> + > >> + cpumask_clear(&processed_cpus); > >> + > >> + for_each_online_cpu( cpu ) > >> + { > >> + if ( cpumask_test_cpu(cpu, &processed_cpus) ) > >> + continue; > >> + > >> + if ( !is_dvfs_capable(cpu) ) > >> + continue; > >> + > >> + ret = get_sharing_cpus(cpu, &shared_cpus); > >> + if ( ret ) > >> + { > >> + printk("cpu%d: failed to get sharing cpumask (%d)\n", cpu, > >> ret); > >> + return ret; > >> + } > >> + > >> + BUG_ON(cpumask_empty(&shared_cpus)); > >> + cpumask_or(&processed_cpus, &processed_cpus, &shared_cpus); > >> + > >> + /* Create intermediate frequency table */ > >> + ret = init_cpufreq_table(cpu, &freq_table); > >> + if ( ret ) > >> + { > >> + printk("cpu%d: failed to initialize frequency table (%d)\n", > >> + cpu, ret); > >> + return ret; > >> + } > >> + > >> + ret = upload_cpufreq_data(&shared_cpus, freq_table); > >> + /* Destroy intermediate frequency table */ > >> + free_cpufreq_table(&freq_table); > >> + if ( ret ) > >> + { > >> + printk("cpu%d: failed to upload cpufreq data (%d)\n", cpu, > >> ret); > >> + return ret; > >> + } > >> + > >> + printk(XENLOG_DEBUG "cpu%d: uploaded cpufreq data\n", cpu); > >> + } > >> + > >> + return ret; > >> +} > >> + > >> +static int __init scpi_cpufreq_preinit(void) > >> +{ > >> + struct dt_device_node *scpi, *clk, *dvfs_clk; > >> + int ret; > >> + > >> + /* Initialize SCPI Message protocol */ > >> + ret = scpi_init(); > >> + if ( ret ) > >> + { > >> + printk("failed to initialize SCPI (%d)\n", ret); > >> + return ret; > >> + } > >> + > >> + /* Sanity check */ > >> + if ( !get_scpi_ops() || !get_scpi_dev() ) > >> + return -ENXIO; > >> + > >> + scpi = get_scpi_dev()->of_node; > >> + scpi_ops = get_scpi_ops(); > >> + > >> + ret = -ENODEV; > >> + > >> + /* > >> + * Check for clock related nodes for now. But it might additional > >> nodes, > >> + * like thermal sensor, etc. > >> + */ > >> + dt_for_each_child_node( scpi, clk ) > > > > Wouldn't it make sense to have a proper: > > > > DT_DEVICE_START > > ... > > DT_DEVICE_END > > > > block and register the driver that way? > > I am not sure that I got your question completely. > Which driver need to be registered in a such way? > If we had separate dt-related driver to manage clocks we would have to > register it in a proposed way. > Here we just iterating through all SCPI child in order to be sure that > DVFS clock sub-node is present. > Let say, preliminary check. > > BTW, in a proposed way I register ARM SMC triggered mailbox driver: > https://www.mail-archive.com/xen-devel@xxxxxxxxxxxxx/msg128411.html > With adding new DEVICE_MAILBOX class: > https://www.mail-archive.com/xen-devel@xxxxxxxxxxxxx/msg128402.html Fair enough, and I see that it is not even scanning the whole device tree but only the scpi node. It's fine then. _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |