According to the documentation, simply reading the respective MSR isn't sufficient: It should be written with zeros, cpuid(1) be executed, and then read (see arch/x86/kernel/cpu/intel.c for an example). Signed-off-by: Jan Beulich <jbeulich@xxxxxxxxxx> Cc: Fenghua Yu <fenghua.yu@xxxxxxxxx> Cc: Chen Gong <gong.chen@xxxxxxxxxxxxxxx> --- drivers/hwmon/coretemp.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) --- linux-2.6.36-rc7/drivers/hwmon/coretemp.c +++ 2.6.36-rc7-coretemp-ucode/drivers/hwmon/coretemp.c @@ -292,6 +292,15 @@ static int __devinit get_tjmax(struct cp } } +static void __devinit get_ucode_rev_on_cpu(void *edx) +{ + u32 eax; + + wrmsr(MSR_IA32_UCODE_REV, 0, 0); + sync_core(); + rdmsr(MSR_IA32_UCODE_REV, eax, *(u32 *)edx); +} + static int __devinit coretemp_probe(struct platform_device *pdev) { struct coretemp_data *data; @@ -327,8 +336,13 @@ static int __devinit coretemp_probe(stru if ((c->x86_model == 0xe) && (c->x86_mask < 0xc)) { /* check for microcode update */ - rdmsr_on_cpu(data->id, MSR_IA32_UCODE_REV, &eax, &edx); - if (edx < 0x39) { + err = smp_call_function_single(data->id, get_ucode_rev_on_cpu, + &edx, 1); + if (err) + dev_warn(&pdev->dev, + "Cannot determine microcode revision " + "of the CPU!\n"); + else if (edx < 0x39) { err = -ENODEV; dev_err(&pdev->dev, "Errata AE18 not fixed, update BIOS or " _______________________________________________ lm-sensors mailing list lm-sensors@xxxxxxxxxxxxxx http://lists.lm-sensors.org/mailman/listinfo/lm-sensors