]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
cpufreq/amd-pstate: Use nominal perf for limits when boost is disabled
authorMario Limonciello <mario.limonciello@amd.com>
Sat, 12 Oct 2024 17:45:16 +0000 (12:45 -0500)
committerMario Limonciello <mario.limonciello@amd.com>
Wed, 16 Oct 2024 04:54:15 +0000 (23:54 -0500)
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: ad4caad58d91 ("cpufreq: amd-pstate: Merge amd_pstate_highest_perf_set() into amd_get_boost_ratio_numerator()")
Reported-by: Peter Jung <ptr1337@cachyos.org>
Closes: https://bugzilla.kernel.org/show_bug.cgi?id=219348
Reviewed-by: Perry Yuan <perry.yuan@amd.com>
Reviewed-by: Gautham R. Shenoy <gautham.shenoy@amd.com>
Tested-by: Dhananjay Ugwekar <dhananjay.ugwekar@amd.com>
Link: https://lore.kernel.org/r/20241012174519.897-1-mario.limonciello@amd.com
Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
drivers/cpufreq/amd-pstate.c

index 4cf2ac5694cb1bffd6419a9ef2480d91dcc84782..b63863f77c67780b14713d4fb56b9dba7a18288d 100644 (file)
@@ -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)
 {
-       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;
 
-       max_limit_perf = div_u64(policy->max * cpudata->highest_perf, cpudata->max_freq);
-       min_limit_perf = div_u64(policy->min * cpudata->highest_perf, cpudata->max_freq);
+       if (cpudata->boost_supported && !policy->boost_enabled)
+               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);
        if (min_limit_perf < lowest_perf)
@@ -1506,10 +1511,13 @@ static int amd_pstate_epp_update_limit(struct cpufreq_policy *policy)
        u64 value;
        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);
-       max_limit_perf = div_u64(policy->max * cpudata->highest_perf, cpudata->max_freq);
-       min_limit_perf = div_u64(policy->min * 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 * max_perf, policy->cpuinfo.max_freq);
 
        if (min_limit_perf < min_perf)
                min_limit_perf = min_perf;