Index: linux-2.6.27-rc7/drivers/hwmon/k8temp.c =================================================================== --- linux-2.6.27-rc7.orig/drivers/hwmon/k8temp.c 2008-09-28 11:01:45.855284456 +0200 +++ linux-2.6.27-rc7/drivers/hwmon/k8temp.c 2008-09-28 11:13:42.396117790 +0200 @@ -34,6 +34,7 @@ #define TEMP_FROM_REG(val) (((((val) >> 16) & 0xff) - 49) * 1000) #define REG_TEMP 0xe4 +#define REG_CPUID 0xfc #define SEL_PLACE 0x40 #define SEL_CORE 0x04 @@ -47,6 +48,7 @@ /* registers values */ u8 sensorsp; /* sensor presence bits - SEL_CORE & SEL_PLACE */ u32 temp[2][2]; /* core, place */ + u8 fam; }; static struct k8temp_data *k8temp_update_device(struct device *dev) @@ -141,6 +143,7 @@ int err; u8 scfg; u32 temp; + struct k8temp_data *data; u32 cpuid = cpuid_eax(1); @@ -155,6 +158,18 @@ goto exit; } + /* get real PCI based cpuid, prior revF of fam 0Fh, this reg is 0 */ + pci_read_config_dword(pdev, REG_CPUID, &cpuid); + + data->fam = (cpuid & 0x00000f00) >> 8; + data->fam += (cpuid & 0x00f00000) >> 20; + + switch (data->fam) { + case 0xf: + dev_warn(&pdev->dev, "Temperature readouts might be wrong" + " - check errata #141\n"); + } + pci_read_config_byte(pdev, REG_TEMP, &scfg); scfg &= ~(SEL_PLACE | SEL_CORE); /* Select sensor 0, core0 */ pci_write_config_byte(pdev, REG_TEMP, scfg);