The Energy Model (EM) supports performance limits updates. Use the SCMI notifications to get information from FW about allowed frequency scope for the CPUs. Signed-off-by: Lukasz Luba <lukasz.luba@xxxxxxx> --- drivers/cpufreq/scmi-cpufreq.c | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/drivers/cpufreq/scmi-cpufreq.c b/drivers/cpufreq/scmi-cpufreq.c index d946b7a082584..90c8448578cb1 100644 --- a/drivers/cpufreq/scmi-cpufreq.c +++ b/drivers/cpufreq/scmi-cpufreq.c @@ -185,12 +185,25 @@ static int scmi_limit_notify_cb(struct notifier_block *nb, unsigned long event, { struct scmi_data *priv = container_of(nb, struct scmi_data, limit_notify_nb); struct scmi_perf_limits_report *limit_notify = data; + unsigned int limit_freq_max_khz, limit_freq_min_khz; struct cpufreq_policy *policy = priv->policy; - unsigned int limit_freq_khz; + struct em_perf_domain *pd; + int ret; + + limit_freq_max_khz = limit_notify->range_max_freq / HZ_PER_KHZ; + limit_freq_min_khz = limit_notify->range_min_freq / HZ_PER_KHZ; - limit_freq_khz = limit_notify->range_max_freq / HZ_PER_KHZ; + pd = em_cpu_get(policy->cpu); + if (pd) { + ret = em_update_performance_limits(pd, limit_freq_min_khz, + limit_freq_max_khz); + if (ret) + dev_warn(priv->cpu_dev, + "EM perf limits update failed\n"); + } - policy->max = clamp(limit_freq_khz, policy->cpuinfo.min_freq, policy->cpuinfo.max_freq); + policy->max = clamp(limit_freq_max_khz, policy->cpuinfo.min_freq, + policy->cpuinfo.max_freq); cpufreq_update_pressure(policy); -- 2.25.1