Commit 94e89b14 authored by Marc Zyngier's avatar Marc Zyngier Committed by Lorenzo Pieralisi
Browse files

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: default avatarMarc Zyngier <maz@kernel.org>
Signed-off-by: default avatarLorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Acked-by: default avatarBjorn Helgaas <bhelgaas@google.com>
parent f8bcf249
Loading
Loading
Loading
Loading
+2 −0
Original line number Original line Diff line number Diff line
@@ -925,6 +925,8 @@ static int pci_register_host_bridge(struct pci_host_bridge *bridge)
	device_enable_async_suspend(bus->bridge);
	device_enable_async_suspend(bus->bridge);
	pci_set_bus_of_node(bus);
	pci_set_bus_of_node(bus);
	pci_set_bus_msi_domain(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)
	if (!parent)
		set_dev_node(bus->bridge, pcibus_to_node(bus));
		set_dev_node(bus->bridge, pcibus_to_node(bus));
+1 −0
Original line number Original line Diff line number Diff line
@@ -550,6 +550,7 @@ struct pci_host_bridge {
	unsigned int	native_dpc:1;		/* OS may use PCIe DPC */
	unsigned int	native_dpc:1;		/* OS may use PCIe DPC */
	unsigned int	preserve_config:1;	/* Preserve FW resource setup */
	unsigned int	preserve_config:1;	/* Preserve FW resource setup */
	unsigned int	size_windows:1;		/* Enable root bus sizing */
	unsigned int	size_windows:1;		/* Enable root bus sizing */
	unsigned int	msi_domain:1;		/* Bridge wants MSI domain */


	/* Resource alignment requirements */
	/* Resource alignment requirements */
	resource_size_t (*align_resource)(struct pci_dev *dev,
	resource_size_t (*align_resource)(struct pci_dev *dev,