58 lines
2.5 KiB
Diff
58 lines
2.5 KiB
Diff
From c4fde0d177bdb33912f450914d84d6432391a8b5 Mon Sep 17 00:00:00 2001
|
|
From: Mario Limonciello <mario.limonciello@amd.com>
|
|
Date: Sat, 12 Oct 2024 12:45:16 -0500
|
|
Subject: 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: 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
|
|
Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
|
|
---
|
|
drivers/cpufreq/amd-pstate.c | 20 ++++++++++++++------
|
|
1 file changed, 14 insertions(+), 6 deletions(-)
|
|
|
|
--- a/drivers/cpufreq/amd-pstate.c
|
|
+++ b/drivers/cpufreq/amd-pstate.c
|
|
@@ -566,11 +566,16 @@ static int amd_pstate_verify(struct cpuf
|
|
|
|
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)
|
|
@@ -1526,10 +1531,13 @@ static int amd_pstate_epp_update_limit(s
|
|
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;
|