[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

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.