PCI/MSI: Let PCI host bridges declare their reliance on MSI domains
authorMarc Zyngier <maz@kernel.org>
Tue, 30 Mar 2021 15:11:41 +0000 (16:11 +0100)
committerLorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Tue, 20 Apr 2021 13:11:22 +0000 (14:11 +0100)
There is a whole class of host bridges that cannot know whether
MSIs will be provided or not, as they rely on other blocks
to provide the MSI functionnality, using MSI domains.  This is
the case for example on systems that use the ARM GIC architecture.

Introduce a new attribute ('msi_domain') indicating that implicit
dependency, and use this property to set the NO_MSI flag when
no MSI domain is found at probe time.

Link: https://lore.kernel.org/r/20210330151145.997953-11-maz@kernel.org
Signed-off-by: Marc Zyngier <maz@kernel.org>
Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
drivers/pci/probe.c
include/linux/pci.h

index fb04fc81a8bda4ba7e50c8dd7a57ce0b99693139..aa6fba35f5d1b40f9498b8063b746a189bef76b2 100644 (file)
@@ -925,6 +925,8 @@ static int pci_register_host_bridge(struct pci_host_bridge *bridge)
        device_enable_async_suspend(bus->bridge);
        pci_set_bus_of_node(bus);
        pci_set_bus_msi_domain(bus);
+       if (bridge->msi_domain && !dev_get_msi_domain(&bus->dev))
+               bus->bus_flags |= PCI_BUS_FLAGS_NO_MSI;
 
        if (!parent)
                set_dev_node(bus->bridge, pcibus_to_node(bus));
index ebf557e59d8736c0c6eb187620fa7c85bc42098a..ede0aef2cfd461b58c54fe9e10b998e423524322 100644 (file)
@@ -550,6 +550,7 @@ struct pci_host_bridge {
        unsigned int    native_dpc:1;           /* OS may use PCIe DPC */
        unsigned int    preserve_config:1;      /* Preserve FW resource setup */
        unsigned int    size_windows:1;         /* Enable root bus sizing */
+       unsigned int    msi_domain:1;           /* Bridge wants MSI domain */
 
        /* Resource alignment requirements */
        resource_size_t (*align_resource)(struct pci_dev *dev,