]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
cpufreq/amd-pstate: Fix min_limit perf and freq updation for performance governor
authorDhananjay Ugwekar <dhananjay.ugwekar@amd.com>
Mon, 7 Apr 2025 08:19:26 +0000 (08:19 +0000)
committerMario Limonciello <mario.limonciello@amd.com>
Mon, 7 Apr 2025 13:56:21 +0000 (08:56 -0500)
The min_limit perf and freq values can get disconnected with performance
governor, as we only modify the perf value in the special case. Fix that
by modifying the perf and freq values together

Fixes: 009d1c29a451 ("cpufreq/amd-pstate: Move perf values into a union")
Signed-off-by: Dhananjay Ugwekar <dhananjay.ugwekar@amd.com>
Reviewed-by: Mario Limonciello <mario.limonciello@amd.com>
Link: https://lore.kernel.org/r/20250407081925.850473-1-dhananjay.ugwekar@amd.com
Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
drivers/cpufreq/amd-pstate.c

index 6789eed1bb5ba00a6519a2c4c6d110c8f7abe27f..c54c031939c830d57c9b30597e1431ec9da3b0f3 100644 (file)
@@ -607,13 +607,16 @@ static void amd_pstate_update_min_max_limit(struct cpufreq_policy *policy)
        union perf_cached perf = READ_ONCE(cpudata->perf);
 
        perf.max_limit_perf = freq_to_perf(perf, cpudata->nominal_freq, policy->max);
-       perf.min_limit_perf = freq_to_perf(perf, cpudata->nominal_freq, policy->min);
+       WRITE_ONCE(cpudata->max_limit_freq, policy->max);
 
-       if (cpudata->policy == CPUFREQ_POLICY_PERFORMANCE)
+       if (cpudata->policy == CPUFREQ_POLICY_PERFORMANCE) {
                perf.min_limit_perf = min(perf.nominal_perf, perf.max_limit_perf);
+               WRITE_ONCE(cpudata->min_limit_freq, min(cpudata->nominal_freq, cpudata->max_limit_freq));
+       } else {
+               perf.min_limit_perf = freq_to_perf(perf, cpudata->nominal_freq, policy->min);
+               WRITE_ONCE(cpudata->min_limit_freq, policy->min);
+       }
 
-       WRITE_ONCE(cpudata->max_limit_freq, policy->max);
-       WRITE_ONCE(cpudata->min_limit_freq, policy->min);
        WRITE_ONCE(cpudata->perf, perf);
 }