|
@@ -143,6 +143,37 @@ static const struct pci_device_id k8temp_ids[] = {
|
|
|
|
|
|
MODULE_DEVICE_TABLE(pci, k8temp_ids);
|
|
MODULE_DEVICE_TABLE(pci, k8temp_ids);
|
|
|
|
|
|
|
|
+static int __devinit is_rev_g_desktop(u8 model)
|
|
|
|
+{
|
|
|
|
+ u32 brandidx;
|
|
|
|
+
|
|
|
|
+ if (model < 0x69)
|
|
|
|
+ return 0;
|
|
|
|
+
|
|
|
|
+ if (model == 0xc1 || model == 0x6c || model == 0x7c)
|
|
|
|
+ return 0;
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ * Differentiate between AM2 and ASB1.
|
|
|
|
+ * See "Constructing the processor Name String" in "Revision
|
|
|
|
+ * Guide for AMD NPT Family 0Fh Processors" (33610).
|
|
|
|
+ */
|
|
|
|
+ brandidx = cpuid_ebx(0x80000001);
|
|
|
|
+ brandidx = (brandidx >> 9) & 0x1f;
|
|
|
|
+
|
|
|
|
+ /* Single core */
|
|
|
|
+ if ((model == 0x6f || model == 0x7f) &&
|
|
|
|
+ (brandidx == 0x7 || brandidx == 0x9 || brandidx == 0xc))
|
|
|
|
+ return 0;
|
|
|
|
+
|
|
|
|
+ /* Dual core */
|
|
|
|
+ if (model == 0x6b &&
|
|
|
|
+ (brandidx == 0xb || brandidx == 0xc))
|
|
|
|
+ return 0;
|
|
|
|
+
|
|
|
|
+ return 1;
|
|
|
|
+}
|
|
|
|
+
|
|
static int __devinit k8temp_probe(struct pci_dev *pdev,
|
|
static int __devinit k8temp_probe(struct pci_dev *pdev,
|
|
const struct pci_device_id *id)
|
|
const struct pci_device_id *id)
|
|
{
|
|
{
|
|
@@ -179,9 +210,7 @@ static int __devinit k8temp_probe(struct pci_dev *pdev,
|
|
"wrong - check erratum #141\n");
|
|
"wrong - check erratum #141\n");
|
|
}
|
|
}
|
|
|
|
|
|
- if ((model >= 0x69) &&
|
|
|
|
- !(model == 0xc1 || model == 0x6c || model == 0x7c ||
|
|
|
|
- model == 0x6b || model == 0x6f || model == 0x7f)) {
|
|
|
|
|
|
+ if (is_rev_g_desktop(model)) {
|
|
/*
|
|
/*
|
|
* RevG desktop CPUs (i.e. no socket S1G1 or
|
|
* RevG desktop CPUs (i.e. no socket S1G1 or
|
|
* ASB1 parts) need additional offset,
|
|
* ASB1 parts) need additional offset,
|