i7core_edac: Probe on Xeons eariler
authorKeith Mannthey <kmannth@us.ibm.com>
Thu, 3 Sep 2009 03:05:05 +0000 (00:05 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Mon, 10 May 2010 14:44:57 +0000 (11:44 -0300)
On the Xeon 55XX series cpus the pci deives are not exposed via acpi so
we much explicitly probe them to make the usable as a Linux PCI device.

This moves the detection of this state to before pci_register_driver is
called.  Its present position was not working on my systems, the driver
would complain about not finding a specific device.

This patch allows the driver to load on my systems.

Signed-off-by: Keith Mannthey <kmannth@us.ibm.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/edac/i7core_edac.c

index 9f4e9d7d4dbf9db4d8f3242cdc929bf66cc13ff4..9fe7ec762e688b3ef097086aae96a86926b4514c 100644 (file)
@@ -1158,6 +1158,23 @@ static void i7core_put_devices(void)
                        pci_dev_put(pci_devs[j].pdev[i]);
 }
 
+static void i7core_xeon_pci_fixup(void)
+{
+       struct pci_dev *pdev = NULL;
+       int i;
+       /*
+        * On Xeon 55xx, the Intel Quckpath Arch Generic Non-core pci buses
+        * aren't announced by acpi. So, we need to use a legacy scan probing
+        * to detect them
+        */
+       pdev = pci_get_device(PCI_VENDOR_ID_INTEL,
+                             pci_devs[0].dev_id, NULL);
+       if (unlikely(!pdev)) {
+               for (i = 0; i < NUM_SOCKETS; i ++)
+                       pcibios_scan_specific_bus(255-i);
+       }
+}
+
 /*
  *     i7core_get_devices      Find and perform 'get' operation on the MCH's
  *                     device/functions we want to reference for this driver
@@ -1173,19 +1190,6 @@ int i7core_get_onedevice(struct pci_dev **prev, int devno)
        pdev = pci_get_device(PCI_VENDOR_ID_INTEL,
                              pci_devs[devno].dev_id, *prev);
 
-       /*
-        * On Xeon 55xx, the Intel Quckpath Arch Generic Non-core pci buses
-        * aren't announced by acpi. So, we need to use a legacy scan probing
-        * to detect them
-        */
-       if (unlikely(!pdev && !devno && !prev)) {
-               pcibios_scan_specific_bus(254);
-               pcibios_scan_specific_bus(255);
-
-               pdev = pci_get_device(PCI_VENDOR_ID_INTEL,
-                                     pci_devs[devno].dev_id, *prev);
-       }
-
        /*
         * On Xeon 55xx, the Intel Quckpath Arch Generic Non-core regs
         * is at addr 8086:2c40, instead of 8086:2c41. So, we need
@@ -1896,6 +1900,8 @@ static int __init i7core_init(void)
        /* Ensure that the OPSTATE is set correctly for POLL or NMI */
        opstate_init();
 
+       i7core_xeon_pci_fixup();
+
        pci_rc = pci_register_driver(&i7core_driver);
 
        if (pci_rc >= 0)