[PATCH 1/2] PCI: Add per-device flag to disable native PCIe port services
Han Gao <[email protected]> Wed, 1 Apr 2026 01:56:57 +0800
| Newsgroups | dev.linux.lists.sophgo,org.infradead.lists.linux-riscv,org.kernel.vger.linux-kernel,org.kernel.vger.linux-pci,org.kernel.vger.stable |
|---|---|
| Message-ID | <[email protected]> |
Add PCI_DEV_FLAGS_NO_PORT_SERVICES to allow quirks to prevent the PCIe port service driver from probing specific devices. This provides a per-device equivalent of the global pcie_ports=compat kernel parameter. Some platforms have PCIe root ports that break MSI delivery to downstream devices when native port services (AER, PME, bwctrl, etc.) are active. The existing pci_host_bridge native_* flags do not cover all services (notably bwctrl), so a mechanism to skip port driver probing entirely on a per-device basis is needed. Cc: [email protected] Signed-off-by: Han Gao <[email protected]> --- drivers/pci/pcie/portdrv.c | 3 +++ include/linux/pci.h | 2 ++ 2 files changed, 5 insertions(+) diff --git a/drivers/pci/pcie/portdrv.c b/drivers/pci/pcie/portdrv.c index 2d6aa488fe7b..3386818d200d 100644 --- a/drivers/pci/pcie/portdrv.c +++ b/drivers/pci/pcie/portdrv.c @@ -685,6 +685,9 @@ static const struct dev_pm_ops pcie_portdrv_pm_ops = { static int pcie_portdrv_probe(struct pci_dev *dev, const struct pci_device_id *id) { + if (dev->dev_flags & PCI_DEV_FLAGS_NO_PORT_SERVICES) + return -ENODEV; + int type = pci_pcie_type(dev); int status; diff --git a/include/linux/pci.h b/include/linux/pci.h index 1c270f1d5123..e038fe14ef78 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h @@ -253,6 +253,8 @@ enum pci_dev_flags { * integrated with the downstream devices and doesn't use real PCI. */ PCI_DEV_FLAGS_PCI_BRIDGE_NO_ALIAS = (__force pci_dev_flags_t) (1 << 14), + /* Do not use native PCIe port services (equivalent to pcie_ports=compat) */ + PCI_DEV_FLAGS_NO_PORT_SERVICES = (__force pci_dev_flags_t) (1 << 15), }; enum pci_irq_reroute_variant { -- 2.47.3