Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

PCI/MSI: Let PCI host bridges declare their reliance on MSI domains

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>

authored by

Marc Zyngier and committed by
Lorenzo Pieralisi
94e89b14 f8bcf249

+3
+2
drivers/pci/probe.c
··· 925 925 device_enable_async_suspend(bus->bridge); 926 926 pci_set_bus_of_node(bus); 927 927 pci_set_bus_msi_domain(bus); 928 + if (bridge->msi_domain && !dev_get_msi_domain(&bus->dev)) 929 + bus->bus_flags |= PCI_BUS_FLAGS_NO_MSI; 928 930 929 931 if (!parent) 930 932 set_dev_node(bus->bridge, pcibus_to_node(bus));
+1
include/linux/pci.h
··· 550 550 unsigned int native_dpc:1; /* OS may use PCIe DPC */ 551 551 unsigned int preserve_config:1; /* Preserve FW resource setup */ 552 552 unsigned int size_windows:1; /* Enable root bus sizing */ 553 + unsigned int msi_domain:1; /* Bridge wants MSI domain */ 553 554 554 555 /* Resource alignment requirements */ 555 556 resource_size_t (*align_resource)(struct pci_dev *dev,