cpufreq/amd-pstate: Fix a regression leading to EPP 0 after resume
Subsystems (2)
PATCH 1/1 cpufreq/amd-pstate: Fix a regression leading to EPP 0 after resume
During the suspend sequence the cached CPPC request is destroyed with the expectation that it's restored during resume. This assumption broke when the separate cache EPP variable was removed, and then it was broken again by commit 608a76b65288 ("cpufreq/amd-pstate: Add support for the "Requested CPU Min frequency" BIOS option") which explicitly set it to zero during suspend.
Remove the invalidation and set the value during the suspend call to update limits so that the cached variable can be used to restore on resume.
--- drivers/cpufreq/amd-pstate.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-)
drivers/cpufreq/amd-pstate.c +5 -4
@@ -1626,13 +1626,14 @@ static int amd_pstate_suspend(struct cpufreq_policy *policy)* min_perf value across kexec reboots. If this CPU is just resumed back without kexec, * the limits, epp and desired perf will get reset to the cached values in cpudata struct */ - ret =amd_pstate_update_perf (policy, perf.bios_min_perf,0U ,0U ,0U , false); + ret =amd_pstate_update_perf (policy, perf.bios_min_perf, +FIELD_GET (AMD_CPPC_DES_PERF_MASK , cpudata->cppc_req_cached), +FIELD_GET (AMD_CPPC_MAX_PERF_MASK , cpudata->cppc_req_cached), +FIELD_GET (AMD_CPPC_EPP_PERF_MASK , cpudata->cppc_req_cached), + false);if (ret)return ret; -/* invalidate to ensure it's rewritten during resume */ - cpudata->cppc_req_cached =0 ; -/* set this flag to avoid setting core offline*/ cpudata->suspended = true;
Signature · 1 line
2.43.0
Hi, I can confim that this patch works as intended. I only checked the value of "energy performance preference" field on cpupower frequency-info before and after suspend/resume cycle. If there are any other tests you want me to do, please let me know.
I'm using Fedora KDE 42, AMD 7840U, Tuned-2.25.1.
Hello Mario,
Quoted 29 lines · Mario Limonciello (AMD)
During the suspend sequence the cached CPPC request is destroyed with the expectation that it's restored during resume. This assumption broke when the separate cache EPP variable was removed, and then it was broken again by commit
608a76b65288("cpufreq/amd-pstate: Add support for the "Requested CPU Min frequency" BIOS option") which explicitly set it to zero during suspend.Remove the invalidation and set the value during the suspend call to update limits so that the cached variable can be used to restore on resume.
Fixes 608a76b65288 ("cpufreq/amd-pstate: Add support for the "Requested CPU Min frequency" BIOS option")Fixes b7a41156588a ("cpufreq/amd-pstate: Invalidate cppc_req_cached during suspend")Signed-off-by Mario Limonciello (AMD) <[email protected]>--- drivers/cpufreq/amd-pstate.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-)drivers/cpufreq/amd-pstate.c +1
-1@@ -1626,13 +1626,14 @@ static int amd_pstate_suspend(struct cpufreq_policy *policy)* min_perf value across kexec reboots. If this CPU is just resumed back without kexec, * the limits, epp and desired perf will get reset to the cached values in cpudata struct */ - ret =amd_pstate_update_perf (policy, perf.bios_min_perf,0U ,0U ,0U , false); + ret = amd_pstate_update_perf(policy, perf.bios_min_perf,
drivers/cpufreq/amd-pstate.c static int amd_pstate_suspend(struct cpufreq_policy *policy) · line 1635
Quoted 10 lines
drivers/cpufreq/amd-pstate.c +4
-3+FIELD_GET (AMD_CPPC_DES_PERF_MASK , cpudata->cppc_req_cached), +FIELD_GET (AMD_CPPC_MAX_PERF_MASK , cpudata->cppc_req_cached), +FIELD_GET (AMD_CPPC_EPP_PERF_MASK , cpudata->cppc_req_cached), + false);if (ret)return ret; -/* invalidate to ensure it's rewritten during resume */ - cpudata->cppc_req_cached =0 ; -
Ah, so cppc_req_cached is required to extract the EPP value in amd_pstate_epp_update_limit() which is called by amd_pstate_epp_resume().
Looks good to me.
Signature · 2 lines
Thanks and Regards gautham.
Quoted 6 lines
drivers/cpufreq/amd-pstate.c +0
-0/* set this flag to avoid setting core offline*/ cpudata->suspended = true;Signature · 1 line
2.43.0