diff options
author | Bartlomiej Zolnierkiewicz <bzolnier@gmail.com> | 2009-07-28 18:04:59 -0400 |
---|---|---|
committer | H. Peter Anvin <hpa@zytor.com> | 2009-07-29 18:45:13 -0400 |
commit | f3a0867b12e0cf1512c0bd0665f2339fc75ed2a8 (patch) | |
tree | 151e06e2a47fcd5bcc262d576e6714230d620e71 | |
parent | d0c87d1f61704ed589fc0788bedd753632340e98 (diff) |
x86, mce: fix reporting of Thermal Monitoring mechanism enabled
Early Pentium M models use different method for enabling TM2
(per paragraph 13.5.2.3 of the "Intel 64 and IA-32 Architectures
Software Developer's Manual Volume 3A: System Programming Guide,
Part 1").
Tested on the affected Pentium M variant (model == 13).
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Cc: Andi Kleen <andi@firstfloor.org>
Signed-off-by: H. Peter Anvin <hpa@zytor.com>
-rw-r--r-- | arch/x86/include/asm/msr-index.h | 4 | ||||
-rw-r--r-- | arch/x86/kernel/cpu/mcheck/therm_throt.c | 13 |
2 files changed, 14 insertions, 3 deletions
diff --git a/arch/x86/include/asm/msr-index.h b/arch/x86/include/asm/msr-index.h index 3d1ce094586a..cbec06deb68b 100644 --- a/arch/x86/include/asm/msr-index.h +++ b/arch/x86/include/asm/msr-index.h | |||
@@ -222,6 +222,10 @@ | |||
222 | 222 | ||
223 | #define THERM_STATUS_PROCHOT (1 << 0) | 223 | #define THERM_STATUS_PROCHOT (1 << 0) |
224 | 224 | ||
225 | #define MSR_THERM2_CTL 0x0000019d | ||
226 | |||
227 | #define MSR_THERM2_CTL_TM_SELECT (1ULL << 16) | ||
228 | |||
225 | #define MSR_IA32_MISC_ENABLE 0x000001a0 | 229 | #define MSR_IA32_MISC_ENABLE 0x000001a0 |
226 | 230 | ||
227 | /* MISC_ENABLE bits: architectural */ | 231 | /* MISC_ENABLE bits: architectural */ |
diff --git a/arch/x86/kernel/cpu/mcheck/therm_throt.c b/arch/x86/kernel/cpu/mcheck/therm_throt.c index bff8dd191dd5..15f2bc07bb60 100644 --- a/arch/x86/kernel/cpu/mcheck/therm_throt.c +++ b/arch/x86/kernel/cpu/mcheck/therm_throt.c | |||
@@ -253,9 +253,6 @@ void intel_init_thermal(struct cpuinfo_x86 *c) | |||
253 | return; | 253 | return; |
254 | } | 254 | } |
255 | 255 | ||
256 | if (cpu_has(c, X86_FEATURE_TM2) && (l & MSR_IA32_MISC_ENABLE_TM2)) | ||
257 | tm2 = 1; | ||
258 | |||
259 | /* Check whether a vector already exists */ | 256 | /* Check whether a vector already exists */ |
260 | if (h & APIC_VECTOR_MASK) { | 257 | if (h & APIC_VECTOR_MASK) { |
261 | printk(KERN_DEBUG | 258 | printk(KERN_DEBUG |
@@ -264,6 +261,16 @@ void intel_init_thermal(struct cpuinfo_x86 *c) | |||
264 | return; | 261 | return; |
265 | } | 262 | } |
266 | 263 | ||
264 | /* early Pentium M models use different method for enabling TM2 */ | ||
265 | if (cpu_has(c, X86_FEATURE_TM2)) { | ||
266 | if (c->x86 == 6 && (c->x86_model == 9 || c->x86_model == 13)) { | ||
267 | rdmsr(MSR_THERM2_CTL, l, h); | ||
268 | if (l & MSR_THERM2_CTL_TM_SELECT) | ||
269 | tm2 = 1; | ||
270 | } else if (l & MSR_IA32_MISC_ENABLE_TM2) | ||
271 | tm2 = 1; | ||
272 | } | ||
273 | |||
267 | /* We'll mask the thermal vector in the lapic till we're ready: */ | 274 | /* We'll mask the thermal vector in the lapic till we're ready: */ |
268 | h = THERMAL_APIC_VECTOR | APIC_DM_FIXED | APIC_LVT_MASKED; | 275 | h = THERMAL_APIC_VECTOR | APIC_DM_FIXED | APIC_LVT_MASKED; |
269 | apic_write(APIC_LVTTHMR, h); | 276 | apic_write(APIC_LVTTHMR, h); |