@@ -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