lkml.org 
[lkml]   [2021]   [Jan]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH v6 3/4] scmi-cpufreq: Get opp_shared_cpus from opp-v2 for EM
    On 11-01-21, 15:45, Nicola Mazzucato wrote:
    > By design, SCMI performance domains define the granularity of
    > performance controls, they do not describe any underlying hardware
    > dependencies (although they may match in many cases).
    >
    > It is therefore possible to have some platforms where hardware may have
    > the ability to control CPU performance at different granularity and choose
    > to describe fine-grained performance control through SCMI.
    >
    > In such situations, the energy model would be provided with inaccurate
    > information based on controls, while it still needs to know the
    > performance boundaries.
    >
    > To restore correct functionality, retrieve information of CPUs under the
    > same performance domain from operating-points-v2 in DT, and pass it on to
    > EM.
    >
    > Signed-off-by: Nicola Mazzucato <nicola.mazzucato@arm.com>
    > ---
    > drivers/cpufreq/scmi-cpufreq.c | 22 ++++++++++++++++++++--
    > 1 file changed, 20 insertions(+), 2 deletions(-)
    >
    > diff --git a/drivers/cpufreq/scmi-cpufreq.c b/drivers/cpufreq/scmi-cpufreq.c
    > index 4aa97cdc5997..ff6ba6fab58b 100644
    > --- a/drivers/cpufreq/scmi-cpufreq.c
    > +++ b/drivers/cpufreq/scmi-cpufreq.c
    > @@ -226,9 +226,12 @@ static int scmi_init_device(const struct scmi_handle *handle, int cpu)
    > struct em_data_callback em_cb = EM_DATA_CB(scmi_get_cpu_power);
    > bool power_scale_mw;
    > cpumask_var_t scmi_cpus;
    > + cpumask_var_t opp_shared_cpus;
    >
    > if (!zalloc_cpumask_var(&scmi_cpus, GFP_KERNEL))
    > return -ENOMEM;
    > + if (!zalloc_cpumask_var(&opp_shared_cpus, GFP_KERNEL))
    > + return -ENOMEM;
    >
    > cpumask_set_cpu(cpu, scmi_cpus);
    >
    > @@ -240,6 +243,20 @@ static int scmi_init_device(const struct scmi_handle *handle, int cpu)
    > goto free_cpumask;
    > }
    >
    > + /*
    > + * The OPP 'sharing cpus' info may come from dt through an empty opp
    > + * table and opp-shared. If found, it takes precedence over the SCMI
    > + * domain IDs info.
    > + */
    > + ret = dev_pm_opp_of_get_sharing_cpus(cpu_dev, opp_shared_cpus);

    If this succeeds, you shouldn't even try to call the other
    get_sharing_cpus variant.

    > + if (ret || !cpumask_weight(opp_shared_cpus)) {
    > + /*
    > + * Either opp-table is not set or no opp-shared was found,
    > + * use the information from SCMI domain IDs.
    > + */
    > + cpumask_copy(opp_shared_cpus, scmi_cpus);
    > + }
    > +
    > /*
    > * We get here for each CPU. Add OPPs only on those CPUs for which we
    > * haven't already done so, or set their OPPs as shared.
    > @@ -252,7 +269,7 @@ static int scmi_init_device(const struct scmi_handle *handle, int cpu)
    > goto free_cpumask;
    > }
    >
    > - ret = dev_pm_opp_set_sharing_cpus(cpu_dev, scmi_cpus);
    > + ret = dev_pm_opp_set_sharing_cpus(cpu_dev, opp_shared_cpus);
    > if (ret) {
    > dev_err(cpu_dev, "%s: failed to mark OPPs as shared: %d\n",
    > __func__, ret);
    > @@ -269,7 +286,7 @@ static int scmi_init_device(const struct scmi_handle *handle, int cpu)
    > }
    >
    > power_scale_mw = handle->perf_ops->power_scale_mw_get(handle);
    > - em_dev_register_perf_domain(cpu_dev, nr_opp, &em_cb, scmi_cpus,
    > + em_dev_register_perf_domain(cpu_dev, nr_opp, &em_cb, opp_shared_cpus,
    > power_scale_mw);
    > }
    >
    > @@ -284,6 +301,7 @@ static int scmi_init_device(const struct scmi_handle *handle, int cpu)
    >
    > free_cpumask:
    > free_cpumask_var(scmi_cpus);
    > + free_cpumask_var(opp_shared_cpus);
    > return ret;
    > }
    >
    > --
    > 2.27.0

    --
    viresh

    \
     
     \ /
      Last update: 2021-01-12 12:23    [W:2.468 / U:0.100 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site