aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/edac
diff options
context:
space:
mode:
authorKeith Mannthey <kmannth@us.ibm.com>2009-09-02 23:05:05 -0400
committerMauro Carvalho Chehab <mchehab@redhat.com>2010-05-10 10:44:57 -0400
commitbc2d7245ff1c5466c877a0c32a7ec9563187a032 (patch)
tree861d83fdfc710a9cb6d5e0d785367934080c645f /drivers/edac
parent14d2c08343eecd13f6c6ec232c98b16762b97924 (diff)
i7core_edac: Probe on Xeons eariler
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>
Diffstat (limited to 'drivers/edac')
-rw-r--r--drivers/edac/i7core_edac.c32
1 files changed, 19 insertions, 13 deletions
diff --git a/drivers/edac/i7core_edac.c b/drivers/edac/i7core_edac.c
index 9f4e9d7d4dbf..9fe7ec762e68 100644
--- a/drivers/edac/i7core_edac.c
+++ b/drivers/edac/i7core_edac.c
@@ -1158,6 +1158,23 @@ static void i7core_put_devices(void)
1158 pci_dev_put(pci_devs[j].pdev[i]); 1158 pci_dev_put(pci_devs[j].pdev[i]);
1159} 1159}
1160 1160
1161static void i7core_xeon_pci_fixup(void)
1162{
1163 struct pci_dev *pdev = NULL;
1164 int i;
1165 /*
1166 * On Xeon 55xx, the Intel Quckpath Arch Generic Non-core pci buses
1167 * aren't announced by acpi. So, we need to use a legacy scan probing
1168 * to detect them
1169 */
1170 pdev = pci_get_device(PCI_VENDOR_ID_INTEL,
1171 pci_devs[0].dev_id, NULL);
1172 if (unlikely(!pdev)) {
1173 for (i = 0; i < NUM_SOCKETS; i ++)
1174 pcibios_scan_specific_bus(255-i);
1175 }
1176}
1177
1161/* 1178/*
1162 * i7core_get_devices Find and perform 'get' operation on the MCH's 1179 * i7core_get_devices Find and perform 'get' operation on the MCH's
1163 * device/functions we want to reference for this driver 1180 * device/functions we want to reference for this driver
@@ -1174,19 +1191,6 @@ int i7core_get_onedevice(struct pci_dev **prev, int devno)
1174 pci_devs[devno].dev_id, *prev); 1191 pci_devs[devno].dev_id, *prev);
1175 1192
1176 /* 1193 /*
1177 * On Xeon 55xx, the Intel Quckpath Arch Generic Non-core pci buses
1178 * aren't announced by acpi. So, we need to use a legacy scan probing
1179 * to detect them
1180 */
1181 if (unlikely(!pdev && !devno && !prev)) {
1182 pcibios_scan_specific_bus(254);
1183 pcibios_scan_specific_bus(255);
1184
1185 pdev = pci_get_device(PCI_VENDOR_ID_INTEL,
1186 pci_devs[devno].dev_id, *prev);
1187 }
1188
1189 /*
1190 * On Xeon 55xx, the Intel Quckpath Arch Generic Non-core regs 1194 * On Xeon 55xx, the Intel Quckpath Arch Generic Non-core regs
1191 * is at addr 8086:2c40, instead of 8086:2c41. So, we need 1195 * is at addr 8086:2c40, instead of 8086:2c41. So, we need
1192 * to probe for the alternate address in case of failure 1196 * to probe for the alternate address in case of failure
@@ -1896,6 +1900,8 @@ static int __init i7core_init(void)
1896 /* Ensure that the OPSTATE is set correctly for POLL or NMI */ 1900 /* Ensure that the OPSTATE is set correctly for POLL or NMI */
1897 opstate_init(); 1901 opstate_init();
1898 1902
1903 i7core_xeon_pci_fixup();
1904
1899 pci_rc = pci_register_driver(&i7core_driver); 1905 pci_rc = pci_register_driver(&i7core_driver);
1900 1906
1901 if (pci_rc >= 0) 1907 if (pci_rc >= 0)