Skip to content

Commit d0b85e7

Browse files
committed
Merge tag 'thermal-6.3-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm
Pull thermal control fix from Rafael Wysocki: "Modify the Intel thermal throttling code to avoid updating unsupported status clearing mask bits which causes the kernel to complain about unchecked MSR access (Srinivas Pandruvada)" * tag 'thermal-6.3-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm: thermal: intel: Avoid updating unsupported THERM_STATUS_CLEAR mask bits
2 parents e251c42 + 117e4e5 commit d0b85e7

1 file changed

Lines changed: 66 additions & 7 deletions

File tree

drivers/thermal/intel/therm_throt.c

Lines changed: 66 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -193,8 +193,67 @@ static const struct attribute_group thermal_attr_group = {
193193
#define THERM_THROT_POLL_INTERVAL HZ
194194
#define THERM_STATUS_PROCHOT_LOG BIT(1)
195195

196-
#define THERM_STATUS_CLEAR_CORE_MASK (BIT(1) | BIT(3) | BIT(5) | BIT(7) | BIT(9) | BIT(11) | BIT(13) | BIT(15))
197-
#define THERM_STATUS_CLEAR_PKG_MASK (BIT(1) | BIT(3) | BIT(5) | BIT(7) | BIT(9) | BIT(11))
196+
static u64 therm_intr_core_clear_mask;
197+
static u64 therm_intr_pkg_clear_mask;
198+
199+
static void thermal_intr_init_core_clear_mask(void)
200+
{
201+
if (therm_intr_core_clear_mask)
202+
return;
203+
204+
/*
205+
* Reference: Intel SDM Volume 4
206+
* "Table 2-2. IA-32 Architectural MSRs", MSR 0x19C
207+
* IA32_THERM_STATUS.
208+
*/
209+
210+
/*
211+
* Bit 1, 3, 5: CPUID.01H:EDX[22] = 1. This driver will not
212+
* enable interrupts, when 0 as it checks for X86_FEATURE_ACPI.
213+
*/
214+
therm_intr_core_clear_mask = (BIT(1) | BIT(3) | BIT(5));
215+
216+
/*
217+
* Bit 7 and 9: Thermal Threshold #1 and #2 log
218+
* If CPUID.01H:ECX[8] = 1
219+
*/
220+
if (boot_cpu_has(X86_FEATURE_TM2))
221+
therm_intr_core_clear_mask |= (BIT(7) | BIT(9));
222+
223+
/* Bit 11: Power Limitation log (R/WC0) If CPUID.06H:EAX[4] = 1 */
224+
if (boot_cpu_has(X86_FEATURE_PLN))
225+
therm_intr_core_clear_mask |= BIT(11);
226+
227+
/*
228+
* Bit 13: Current Limit log (R/WC0) If CPUID.06H:EAX[7] = 1
229+
* Bit 15: Cross Domain Limit log (R/WC0) If CPUID.06H:EAX[7] = 1
230+
*/
231+
if (boot_cpu_has(X86_FEATURE_HWP))
232+
therm_intr_core_clear_mask |= (BIT(13) | BIT(15));
233+
}
234+
235+
static void thermal_intr_init_pkg_clear_mask(void)
236+
{
237+
if (therm_intr_pkg_clear_mask)
238+
return;
239+
240+
/*
241+
* Reference: Intel SDM Volume 4
242+
* "Table 2-2. IA-32 Architectural MSRs", MSR 0x1B1
243+
* IA32_PACKAGE_THERM_STATUS.
244+
*/
245+
246+
/* All bits except BIT 26 depend on CPUID.06H: EAX[6] = 1 */
247+
if (boot_cpu_has(X86_FEATURE_PTS))
248+
therm_intr_pkg_clear_mask = (BIT(1) | BIT(3) | BIT(5) | BIT(7) | BIT(9) | BIT(11));
249+
250+
/*
251+
* Intel SDM Volume 2A: Thermal and Power Management Leaf
252+
* Bit 26: CPUID.06H: EAX[19] = 1
253+
*/
254+
if (boot_cpu_has(X86_FEATURE_HFI))
255+
therm_intr_pkg_clear_mask |= BIT(26);
256+
}
198257

199258
/*
200259
* Clear the bits in package thermal status register for bit = 1
@@ -207,13 +266,10 @@ void thermal_clear_package_intr_status(int level, u64 bit_mask)
207266

208267
if (level == CORE_LEVEL) {
209268
msr = MSR_IA32_THERM_STATUS;
210-
msr_val = THERM_STATUS_CLEAR_CORE_MASK;
269+
msr_val = therm_intr_core_clear_mask;
211270
} else {
212271
msr = MSR_IA32_PACKAGE_THERM_STATUS;
213-
msr_val = THERM_STATUS_CLEAR_PKG_MASK;
214-
if (boot_cpu_has(X86_FEATURE_HFI))
215-
msr_val |= BIT(26);
216-
272+
msr_val = therm_intr_pkg_clear_mask;
217273
}
218274

219275
msr_val &= ~bit_mask;
@@ -708,6 +764,9 @@ void intel_init_thermal(struct cpuinfo_x86 *c)
708764
h = THERMAL_APIC_VECTOR | APIC_DM_FIXED | APIC_LVT_MASKED;
709765
apic_write(APIC_LVTTHMR, h);
710766

767+
thermal_intr_init_core_clear_mask();
768+
thermal_intr_init_pkg_clear_mask();
769+
711770
rdmsr(MSR_IA32_THERM_INTERRUPT, l, h);
712771
if (cpu_has(c, X86_FEATURE_PLN) && !int_pln_enable)
713772
wrmsr(MSR_IA32_THERM_INTERRUPT,

0 commit comments

Comments
 (0)