|
@@ -446,18 +446,20 @@ void intel_init_thermal(struct cpuinfo_x86 *c)
|
|
|
*/
|
|
|
rdmsr(MSR_IA32_MISC_ENABLE, l, h);
|
|
|
|
|
|
+ h = lvtthmr_init;
|
|
|
/*
|
|
|
* The initial value of thermal LVT entries on all APs always reads
|
|
|
* 0x10000 because APs are woken up by BSP issuing INIT-SIPI-SIPI
|
|
|
* sequence to them and LVT registers are reset to 0s except for
|
|
|
* the mask bits which are set to 1s when APs receive INIT IPI.
|
|
|
- * Always restore the value that BIOS has programmed on AP based on
|
|
|
- * BSP's info we saved since BIOS is always setting the same value
|
|
|
- * for all threads/cores
|
|
|
+ * If BIOS takes over the thermal interrupt and sets its interrupt
|
|
|
+ * delivery mode to SMI (not fixed), it restores the value that the
|
|
|
+ * BIOS has programmed on AP based on BSP's info we saved since BIOS
|
|
|
+ * is always setting the same value for all threads/cores.
|
|
|
*/
|
|
|
- apic_write(APIC_LVTTHMR, lvtthmr_init);
|
|
|
+ if ((h & APIC_DM_FIXED_MASK) != APIC_DM_FIXED)
|
|
|
+ apic_write(APIC_LVTTHMR, lvtthmr_init);
|
|
|
|
|
|
- h = lvtthmr_init;
|
|
|
|
|
|
if ((l & MSR_IA32_MISC_ENABLE_TM1) && (h & APIC_DM_SMI)) {
|
|
|
printk(KERN_DEBUG
|