Commit ba3319e5 authored by Mario Limonciello (AMD)'s avatar Mario Limonciello (AMD)
Browse files

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 608a76b6 ("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: 608a76b6 ("cpufreq/amd-pstate: Add support for the "Requested CPU Min frequency" BIOS option")
Fixes: b7a41156 ("cpufreq/amd-pstate: Invalidate cppc_req_cached during suspend")
Reported-by: default avatargoldens <goldenspinach.rhbugzilla@gmail.com>
Closes: https://community.frame.work/t/increased-power-usage-after-resuming-from-suspend-on-ryzen-7040-kernel-6-15-regression/
Closes: https://bugzilla.redhat.com/show_bug.cgi?id=2391221


Tested-by: default avatargoldens <goldenspinach.rhbugzilla@gmail.com>
Tested-by: default avatarWillian Wang <kernel@willian.wang>
Reported-by: default avatarVincent Mauirn <vincent.maurin.fr@gmail.com>
Closes: https://bugzilla.kernel.org/show_bug.cgi?id=219981


Tested-by: default avatarAlex De Lorenzo <kernel@alexdelorenzo.dev>
Reviewed-by: default avatarGautham R. Shenoy <gautham.shenoy@amd.com>
Link: https://lore.kernel.org/r/20250826052747.2240670-1-superm1@kernel.org


Signed-off-by: default avatarMario Limonciello (AMD) <superm1@kernel.org>
parent 220abf77
Loading
Loading
Loading
Loading
+5 −4
Original line number Diff line number Diff line
@@ -1628,13 +1628,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;