Commit f37a4d6b authored by Sibi Sankar's avatar Sibi Sankar Committed by Rafael J. Wysocki

cpufreq: Fix per-policy boost behavior on SoCs using cpufreq_boost_set_sw()

In the existing code, per-policy flags don't have any impact i.e.
if cpufreq_driver boost is enabled and boost is disabled for one or
more of the policies, the cpufreq driver will behave as if boost is
enabled.

Fix this by incorporating per-policy boost flag in the policy->max
computation used in cpufreq_frequency_table_cpuinfo and setting the
default per-policy boost to mirror the cpufreq_driver boost flag.

Fixes: 218a06a7 ("cpufreq: Support per-policy performance boost")
Reported-by: default avatarDietmar Eggemann <dietmar.eggemann@arm.com>
Reviewed-by: default avatarViresh Kumar <viresh.kumar@linaro.org>
Reviewed-by: default avatarDhruva Gole <d-gole@ti.com>
Signed-off-by: default avatarSibi Sankar <quic_sibis@quicinc.com>
Tested-by: default avatarYipeng Zou &lt;zouyipeng@huawei.com&gt; <mailto:zouyipeng@huawei.com>
Reviewed-by: default avatarYipeng Zou &lt;zouyipeng@huawei.com&gt; <mailto:zouyipeng@huawei.com>
Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
parent 07abb19a
...@@ -653,14 +653,16 @@ static ssize_t store_local_boost(struct cpufreq_policy *policy, ...@@ -653,14 +653,16 @@ static ssize_t store_local_boost(struct cpufreq_policy *policy,
if (policy->boost_enabled == enable) if (policy->boost_enabled == enable)
return count; return count;
policy->boost_enabled = enable;
cpus_read_lock(); cpus_read_lock();
ret = cpufreq_driver->set_boost(policy, enable); ret = cpufreq_driver->set_boost(policy, enable);
cpus_read_unlock(); cpus_read_unlock();
if (ret) if (ret) {
policy->boost_enabled = !policy->boost_enabled;
return ret; return ret;
}
policy->boost_enabled = enable;
return count; return count;
} }
...@@ -1428,6 +1430,9 @@ static int cpufreq_online(unsigned int cpu) ...@@ -1428,6 +1430,9 @@ static int cpufreq_online(unsigned int cpu)
goto out_free_policy; goto out_free_policy;
} }
/* Let the per-policy boost flag mirror the cpufreq_driver boost during init */
policy->boost_enabled = cpufreq_boost_enabled() && policy_has_boost_freq(policy);
/* /*
* The initialization has succeeded and the policy is online. * The initialization has succeeded and the policy is online.
* If there is a problem with its frequency table, take it * If there is a problem with its frequency table, take it
...@@ -2769,11 +2774,12 @@ int cpufreq_boost_trigger_state(int state) ...@@ -2769,11 +2774,12 @@ int cpufreq_boost_trigger_state(int state)
cpus_read_lock(); cpus_read_lock();
for_each_active_policy(policy) { for_each_active_policy(policy) {
policy->boost_enabled = state;
ret = cpufreq_driver->set_boost(policy, state); ret = cpufreq_driver->set_boost(policy, state);
if (ret) if (ret) {
policy->boost_enabled = !policy->boost_enabled;
goto err_reset_state; goto err_reset_state;
}
policy->boost_enabled = state;
} }
cpus_read_unlock(); cpus_read_unlock();
......
...@@ -40,7 +40,7 @@ int cpufreq_frequency_table_cpuinfo(struct cpufreq_policy *policy, ...@@ -40,7 +40,7 @@ int cpufreq_frequency_table_cpuinfo(struct cpufreq_policy *policy,
cpufreq_for_each_valid_entry(pos, table) { cpufreq_for_each_valid_entry(pos, table) {
freq = pos->frequency; freq = pos->frequency;
if (!cpufreq_boost_enabled() if ((!cpufreq_boost_enabled() || !policy->boost_enabled)
&& (pos->flags & CPUFREQ_BOOST_FREQ)) && (pos->flags & CPUFREQ_BOOST_FREQ))
continue; continue;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment