From: Rudolf Marek Subject: hwmon/coretemp: Add more safety checks Add detection of AE18 Errata of Core processor and warns users that the absolute readings might be wrong for Core2 processor. Signed-off-by: Rudolf Marek Signed-off-by: Jean Delvare --- drivers/hwmon/coretemp.c | 32 +++++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) --- linux-2.6.22-rc1.orig/drivers/hwmon/coretemp.c 2007-05-13 11:11:27.000000000 +0200 +++ linux-2.6.22-rc1/drivers/hwmon/coretemp.c 2007-05-13 11:12:21.000000000 +0200 @@ -176,6 +176,22 @@ static int __devinit coretemp_probe(stru goto exit_free; } + /* Check if we have problem with errata AE18 of Core processors: + Readings might stop update when processor visited too deep sleep, + fixed for stepping D0 (6EC). + */ + + 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) { + dev_err(&pdev->dev, + "Errata AE18 not fixed, update BIOS or " + "microcode of the CPU!\n"); + goto exit_free; + } + } + /* Some processors have Tjmax 85 following magic should detect it Intel won't disclose the information without signed NDA, but individuals cannot sign it. Catch(ed) 22. @@ -193,6 +209,19 @@ static int __devinit coretemp_probe(stru } } + /* Intel says that above should not work for desktop Core2 processors, + but it seems to work. There is no other way how get the absolute + readings. Warn the user about this. First check if are desktop, + bit 50 of MSR_IA32_PLATFORM_ID should be 0. + */ + + rdmsr_safe_on_cpu(data->id, MSR_IA32_PLATFORM_ID, &eax, &edx); + + if ((c->x86_model == 0xf) && (!(edx & 0x00040000))) { + dev_warn(&pdev->dev, "Using undocumented features, absolute " + "temperature might be wrong!\n"); + } + platform_set_drvdata(pdev, data); if ((err = sysfs_create_group(&pdev->dev.kobj, &coretemp_group))) @@ -330,9 +359,6 @@ static int __init coretemp_init(void) int i, err = -ENODEV; struct pdev_entry *p, *n; - printk(KERN_NOTICE DRVNAME ": This driver uses undocumented features " - "of Core CPU. Temperature might be wrong!\n"); - /* quick check if we run Intel */ if (cpu_data[0].x86_vendor != X86_VENDOR_INTEL) goto exit;