Commit 18d9b522 authored by Mario Limonciello's avatar Mario Limonciello

cpufreq/amd-pstate: Use nominal perf for limits when boost is disabled

When boost has been disabled the limit for perf should be nominal perf not
the highest perf.  Using the latter to do calculations will lead to
incorrect values that are still above nominal.

Fixes: ad4caad5 ("cpufreq: amd-pstate: Merge amd_pstate_highest_perf_set() into amd_get_boost_ratio_numerator()")
Reported-by: default avatarPeter Jung <ptr1337@cachyos.org>
Closes: https://bugzilla.kernel.org/show_bug.cgi?id=219348Reviewed-by: default avatarPerry Yuan <perry.yuan@amd.com>
Reviewed-by: default avatarGautham R. Shenoy <gautham.shenoy@amd.com>
Tested-by: default avatarDhananjay Ugwekar <dhananjay.ugwekar@amd.com>
Link: https://lore.kernel.org/r/20241012174519.897-1-mario.limonciello@amd.comSigned-off-by: default avatarMario Limonciello <mario.limonciello@amd.com>
parent c10e50a4
...@@ -536,11 +536,16 @@ static int amd_pstate_verify(struct cpufreq_policy_data *policy) ...@@ -536,11 +536,16 @@ static int amd_pstate_verify(struct cpufreq_policy_data *policy)
static int amd_pstate_update_min_max_limit(struct cpufreq_policy *policy) static int amd_pstate_update_min_max_limit(struct cpufreq_policy *policy)
{ {
u32 max_limit_perf, min_limit_perf, lowest_perf; u32 max_limit_perf, min_limit_perf, lowest_perf, max_perf;
struct amd_cpudata *cpudata = policy->driver_data; struct amd_cpudata *cpudata = policy->driver_data;
max_limit_perf = div_u64(policy->max * cpudata->highest_perf, cpudata->max_freq); if (cpudata->boost_supported && !policy->boost_enabled)
min_limit_perf = div_u64(policy->min * cpudata->highest_perf, cpudata->max_freq); max_perf = READ_ONCE(cpudata->nominal_perf);
else
max_perf = READ_ONCE(cpudata->highest_perf);
max_limit_perf = div_u64(policy->max * max_perf, policy->cpuinfo.max_freq);
min_limit_perf = div_u64(policy->min * max_perf, policy->cpuinfo.max_freq);
lowest_perf = READ_ONCE(cpudata->lowest_perf); lowest_perf = READ_ONCE(cpudata->lowest_perf);
if (min_limit_perf < lowest_perf) if (min_limit_perf < lowest_perf)
...@@ -1506,10 +1511,13 @@ static int amd_pstate_epp_update_limit(struct cpufreq_policy *policy) ...@@ -1506,10 +1511,13 @@ static int amd_pstate_epp_update_limit(struct cpufreq_policy *policy)
u64 value; u64 value;
s16 epp; s16 epp;
max_perf = READ_ONCE(cpudata->highest_perf); if (cpudata->boost_supported && !policy->boost_enabled)
max_perf = READ_ONCE(cpudata->nominal_perf);
else
max_perf = READ_ONCE(cpudata->highest_perf);
min_perf = READ_ONCE(cpudata->lowest_perf); min_perf = READ_ONCE(cpudata->lowest_perf);
max_limit_perf = div_u64(policy->max * cpudata->highest_perf, cpudata->max_freq); max_limit_perf = div_u64(policy->max * max_perf, policy->cpuinfo.max_freq);
min_limit_perf = div_u64(policy->min * cpudata->highest_perf, cpudata->max_freq); min_limit_perf = div_u64(policy->min * max_perf, policy->cpuinfo.max_freq);
if (min_limit_perf < min_perf) if (min_limit_perf < min_perf)
min_limit_perf = min_perf; min_limit_perf = min_perf;
......
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