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 <r.marek@assembler.cz> Signed-off-by: Jean Delvare <khali@linux-fr.org>
This commit is contained in:
parent
7574d7e937
commit
67f363b1f6
@ -176,6 +176,22 @@ static int __devinit coretemp_probe(struct platform_device *pdev)
|
|||||||
goto exit_free;
|
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
|
/* Some processors have Tjmax 85 following magic should detect it
|
||||||
Intel won't disclose the information without signed NDA, but
|
Intel won't disclose the information without signed NDA, but
|
||||||
individuals cannot sign it. Catch(ed) 22.
|
individuals cannot sign it. Catch(ed) 22.
|
||||||
@ -193,6 +209,19 @@ static int __devinit coretemp_probe(struct platform_device *pdev)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* 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);
|
platform_set_drvdata(pdev, data);
|
||||||
|
|
||||||
if ((err = sysfs_create_group(&pdev->dev.kobj, &coretemp_group)))
|
if ((err = sysfs_create_group(&pdev->dev.kobj, &coretemp_group)))
|
||||||
@ -330,9 +359,6 @@ static int __init coretemp_init(void)
|
|||||||
int i, err = -ENODEV;
|
int i, err = -ENODEV;
|
||||||
struct pdev_entry *p, *n;
|
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 */
|
/* quick check if we run Intel */
|
||||||
if (cpu_data[0].x86_vendor != X86_VENDOR_INTEL)
|
if (cpu_data[0].x86_vendor != X86_VENDOR_INTEL)
|
||||||
goto exit;
|
goto exit;
|
||||||
|
Loading…
Reference in New Issue
Block a user