summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2017-09-15 09:03:01 +0000
committerkib <kib@FreeBSD.org>2017-09-15 09:03:01 +0000
commit64cc93af0d2fb59974a2476fd886d74d6575863a (patch)
treea81824a8c77641a6720ab0fefcc7d0242cf99512
parent87d70833f8209c99dd9adb0e8116fd622fae4730 (diff)
downloadFreeBSD-src-64cc93af0d2fb59974a2476fd886d74d6575863a.zip
FreeBSD-src-64cc93af0d2fb59974a2476fd886d74d6575863a.tar.gz
MFC r323327:
Enhance qpi.c to make it usable on all Core-microarchitecture Xeons.
-rw-r--r--sys/x86/pci/qpi.c42
1 files changed, 27 insertions, 15 deletions
diff --git a/sys/x86/pci/qpi.c b/sys/x86/pci/qpi.c
index d721722..27e2332 100644
--- a/sys/x86/pci/qpi.c
+++ b/sys/x86/pci/qpi.c
@@ -63,11 +63,17 @@ static MALLOC_DEFINE(M_QPI, "qpidrv", "qpi system device");
static void
qpi_identify(driver_t *driver, device_t parent)
{
+ int do_qpi;
/* Check CPUID to ensure this is an i7 CPU of some sort. */
- if (!(cpu_vendor_id == CPU_VENDOR_INTEL &&
- CPUID_TO_FAMILY(cpu_id) == 0x6 &&
- (CPUID_TO_MODEL(cpu_id) == 0x1a || CPUID_TO_MODEL(cpu_id) == 0x2c)))
+ if (cpu_vendor_id != CPU_VENDOR_INTEL ||
+ CPUID_TO_FAMILY(cpu_id) != 0x6)
+ return;
+
+ /* Only discover buses with configuration devices if allowed by user */
+ do_qpi = 0;
+ TUNABLE_INT_FETCH("hw.attach_intel_csr_pci", &do_qpi);
+ if (!do_qpi)
return;
/* PCI config register access is required. */
@@ -97,6 +103,7 @@ qpi_probe_pcib(device_t dev, int bus)
struct qpi_device *qdev;
device_t child;
uint32_t devid;
+ int s;
/*
* If a PCI bus already exists for this bus number, then
@@ -106,18 +113,23 @@ qpi_probe_pcib(device_t dev, int bus)
return (EEXIST);
/*
- * Attempt to read the device id for device 0, function 0 on
- * the bus. A value of 0xffffffff means that the bus is not
- * present.
+ * Attempt to read the device id for every slot, function 0 on
+ * the bus. If all read values are 0xffffffff this means that
+ * the bus is not present.
*/
- devid = pci_cfgregread(bus, 0, 0, PCIR_DEVVENDOR, 4);
+ for (s = 0; s <= PCI_SLOTMAX; s++) {
+ devid = pci_cfgregread(bus, s, 0, PCIR_DEVVENDOR, 4);
+ if (devid != 0xffffffff)
+ break;
+ }
if (devid == 0xffffffff)
return (ENOENT);
if ((devid & 0xffff) != 0x8086) {
- device_printf(dev,
- "Device at pci%d.0.0 has non-Intel vendor 0x%x\n", bus,
- devid & 0xffff);
+ if (bootverbose)
+ device_printf(dev,
+ "Device at pci%d.%d.0 has non-Intel vendor 0x%x\n",
+ bus, s, devid & 0xffff);
return (ENXIO);
}
@@ -137,12 +149,12 @@ qpi_attach(device_t dev)
int bus;
/*
- * Each processor socket has a dedicated PCI bus counting down from
- * 255. We keep probing buses until one fails.
+ * Each processor socket has a dedicated PCI bus, sometimes
+ * not enumerated by ACPI. Probe all unattached buses from 0
+ * to 255.
*/
- for (bus = 255;; bus--)
- if (qpi_probe_pcib(dev, bus) != 0)
- break;
+ for (bus = PCI_BUSMAX; bus >= 0; bus--)
+ qpi_probe_pcib(dev, bus);
return (bus_generic_attach(dev));
}
OpenPOWER on IntegriCloud