Commit 4b747cc6 authored by Srinivas Pandruvada's avatar Srinivas Pandruvada Committed by Rafael J. Wysocki
Browse files

cpufreq: intel_pstate: Check IDA only before MSR_IA32_PERF_CTL writes



Commit ac4e04d9 ("cpufreq: intel_pstate: Unchecked MSR aceess in
legacy mode") introduced a check for feature X86_FEATURE_IDA to verify
turbo mode support. Although this is the correct way to check for turbo
mode support, it causes issues on some platforms that disable turbo
during OS boot, but enable it later [1]. Before adding this feature
check, users were able to get turbo mode frequencies by writing 0 to
/sys/devices/system/cpu/intel_pstate/no_turbo post-boot.

To restore the old behavior on the affected systems while still
addressing the unchecked MSR issue on some Skylake-X systems, check
X86_FEATURE_IDA only immediately before updates of MSR_IA32_PERF_CTL
that may involve setting the Turbo Engage Bit (bit 32).

Fixes: ac4e04d9 ("cpufreq: intel_pstate: Unchecked MSR aceess in legacy mode")
Reported-by: default avatarAaron Rainbolt <arainbolt@kfocus.org>
Closes: https://bugs.launchpad.net/ubuntu/+source/linux/+bug/2122531

 [1]
Tested-by: default avatarAaron Rainbolt <arainbolt@kfocus.org>
Signed-off-by: default avatarSrinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
[ rjw: Subject adjustment, changelog edits ]
Link: https://patch.msgid.link/20251111010840.141490-1-srinivas.pandruvada@linux.intel.com


Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
parent e9a6fb0b
Loading
Loading
Loading
Loading
+4 −5
Original line number Diff line number Diff line
@@ -603,9 +603,6 @@ static bool turbo_is_disabled(void)
{
	u64 misc_en;

	if (!cpu_feature_enabled(X86_FEATURE_IDA))
		return true;

	rdmsrq(MSR_IA32_MISC_ENABLE, misc_en);

	return !!(misc_en & MSR_IA32_MISC_ENABLE_TURBO_DISABLE);
@@ -2106,7 +2103,8 @@ static u64 atom_get_val(struct cpudata *cpudata, int pstate)
	u32 vid;

	val = (u64)pstate << 8;
	if (READ_ONCE(global.no_turbo) && !READ_ONCE(global.turbo_disabled))
	if (READ_ONCE(global.no_turbo) && !READ_ONCE(global.turbo_disabled) &&
	    cpu_feature_enabled(X86_FEATURE_IDA))
		val |= (u64)1 << 32;

	vid_fp = cpudata->vid.min + mul_fp(
@@ -2271,7 +2269,8 @@ static u64 core_get_val(struct cpudata *cpudata, int pstate)
	u64 val;

	val = (u64)pstate << 8;
	if (READ_ONCE(global.no_turbo) && !READ_ONCE(global.turbo_disabled))
	if (READ_ONCE(global.no_turbo) && !READ_ONCE(global.turbo_disabled) &&
	    cpu_feature_enabled(X86_FEATURE_IDA))
		val |= (u64)1 << 32;

	return val;