Skip to content

Commit 4b747cc

Browse files
spandruvadarafaeljw
authored andcommitted
cpufreq: intel_pstate: Check IDA only before MSR_IA32_PERF_CTL writes
Commit ac4e04d ("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: ac4e04d ("cpufreq: intel_pstate: Unchecked MSR aceess in legacy mode") Reported-by: Aaron Rainbolt <arainbolt@kfocus.org> Closes: https://bugs.launchpad.net/ubuntu/+source/linux/+bug/2122531 [1] Tested-by: Aaron Rainbolt <arainbolt@kfocus.org> Signed-off-by: Srinivas 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: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
1 parent e9a6fb0 commit 4b747cc

1 file changed

Lines changed: 4 additions & 5 deletions

File tree

drivers/cpufreq/intel_pstate.c

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -603,9 +603,6 @@ static bool turbo_is_disabled(void)
603603
{
604604
u64 misc_en;
605605

606-
if (!cpu_feature_enabled(X86_FEATURE_IDA))
607-
return true;
608-
609606
rdmsrq(MSR_IA32_MISC_ENABLE, misc_en);
610607

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

21082105
val = (u64)pstate << 8;
2109-
if (READ_ONCE(global.no_turbo) && !READ_ONCE(global.turbo_disabled))
2106+
if (READ_ONCE(global.no_turbo) && !READ_ONCE(global.turbo_disabled) &&
2107+
cpu_feature_enabled(X86_FEATURE_IDA))
21102108
val |= (u64)1 << 32;
21112109

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

22732271
val = (u64)pstate << 8;
2274-
if (READ_ONCE(global.no_turbo) && !READ_ONCE(global.turbo_disabled))
2272+
if (READ_ONCE(global.no_turbo) && !READ_ONCE(global.turbo_disabled) &&
2273+
cpu_feature_enabled(X86_FEATURE_IDA))
22752274
val |= (u64)1 << 32;
22762275

22772276
return val;

0 commit comments

Comments
 (0)