[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20210112112041.7kjjrrgsqfbuq5mh@vireshk-i7>
Date: Tue, 12 Jan 2021 16:50:41 +0530
From: Viresh Kumar <viresh.kumar@...aro.org>
To: Nicola Mazzucato <nicola.mazzucato@....com>
Cc: linux-kernel@...r.kernel.org, linux-arm-kernel@...ts.infradead.org,
linux-pm@...r.kernel.org, sudeep.holla@....com, rjw@...ysocki.net,
vireshk@...nel.org, cristian.marussi@....com,
morten.rasmussen@....com, chris.redpath@....com
Subject: Re: [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@....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
Powered by blists - more mailing lists