We don't need to use northbridge based CPUID checking as the allowed combinations of processors ensure that all processors in a multisocket system have similar characteristics, e.g. (1) provide temperature sensor interface (>=RevC && <RevF) (2) are affected by erratum #141 (>=RevF) Thus it is sufficient to check the revision of the boot CPU. For "mixed silicon support" refer to "Revision Guide for AMD Athlon 64 and AMD Opteron Processors" (RevA-E) and "Revision Guide for AMD NPT Family 0Fh Processors" (RefF-G). Cc: Rudolf Marek <r.marek at assembler.cz> Signed-off-by: Andreas Herrmann <andreas.herrmann3 at amd.com> --- drivers/hwmon/k8temp.c | 26 +++++++++++--------------- 1 files changed, 11 insertions(+), 15 deletions(-) diff --git a/drivers/hwmon/k8temp.c b/drivers/hwmon/k8temp.c index 3b90384..be93387 100644 --- a/drivers/hwmon/k8temp.c +++ b/drivers/hwmon/k8temp.c @@ -31,10 +31,10 @@ #include <linux/hwmon-sysfs.h> #include <linux/err.h> #include <linux/mutex.h> +#include <asm/processor.h> #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 @@ -48,7 +48,6 @@ struct k8temp_data { /* 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) @@ -143,28 +142,25 @@ static int __devinit k8temp_probe(struct pci_dev *pdev, int err; u8 scfg; u32 temp; + u8 model, stepping; struct k8temp_data *data; - u32 cpuid = cpuid_eax(1); - - /* this feature should be available since SH-C0 core */ - if ((cpuid == 0xf40) || (cpuid == 0xf50) || (cpuid == 0xf51)) { - err = -ENODEV; - goto exit; - } if (!(data = kzalloc(sizeof(struct k8temp_data), GFP_KERNEL))) { err = -ENOMEM; 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 & 0x0ff00000) >> 20; + model = boot_cpu_data.x86_model; + stepping = boot_cpu_data.x86_mask; - switch (data->fam) { + switch (boot_cpu_data.x86) { case 0xf: + /* feature available since SH-C0, exclude older revisions */ + if (((model == 4) && (stepping == 0)) || + ((model == 5) && ((stepping == 0) || (stepping == 1)))) { + err = -ENODEV; + goto exit; + } dev_warn(&pdev->dev, "Temperature readouts might be wrong" " - check errata #141\n"); break; -- 1.6.0.4