From f14f00511365d3ba794389a1a5382f02ed669c47 Mon Sep 17 00:00:00 2001 From: Chuck Tuffli Date: Wed, 10 Jun 2020 20:12:45 +0000 Subject: [PATCH] pci: loosen PCIe hot-plug requirements The original PCIe hot-plug code required a couple of things which cause PCI probing errors on the QEMU Q35 system and possibly physical systems (Dell R6515). Allocate the hot-plug interrupt as shared to support INTx interrupts. The hot-plug interrupt mechanism should normally be MSI as PCIe mandates MSI support, but QEMU's Q35 bridge only provides INTx interrupts. Second, the code required the Electromechanical Interlock (Slot Status EIS) to be engaged if present (Slot Capability EIP). Some platforms including QEMU Q35 set EIP but not EIS. Fix by deleting the check. Reviewed by: imp, mav, jhb MFC after: 2 weeks Differential Revision: https://reviews.freebsd.org/D24877 --- sys/dev/pci/pci_pci.c | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/sys/dev/pci/pci_pci.c b/sys/dev/pci/pci_pci.c index 4b9aa08057e1..dc1008e9838b 100644 --- a/sys/dev/pci/pci_pci.c +++ b/sys/dev/pci/pci_pci.c @@ -1073,14 +1073,6 @@ pcib_hotplug_present(struct pcib_softc *sc) if (!pcib_hotplug_inserted(sc)) return (0); - /* - * Require the Electromechanical Interlock to be engaged if - * present. - */ - if (sc->pcie_slot_cap & PCIEM_SLOT_CAP_EIP && - (sc->pcie_slot_sta & PCIEM_SLOT_STA_EIS) == 0) - return (0); - /* Require the Data Link Layer to be active. */ if (!(sc->pcie_link_sta & PCIEM_LINK_STA_DL_ACTIVE)) return (0); @@ -1338,7 +1330,7 @@ pcib_alloc_pcie_irq(struct pcib_softc *sc) rid = 0; sc->pcie_irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, - RF_ACTIVE); + RF_ACTIVE | RF_SHAREABLE); if (sc->pcie_irq == NULL) { device_printf(dev, "Failed to allocate interrupt for PCI-e events\n");