Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 098259eb authored by Marc Zyngier's avatar Marc Zyngier
Browse files

PCI: Add per-device MSI domain hook



So far, we have considered that the MSI domain for a device was
either set via the architecture-dependent pcibios implementation
or inherited from the host bridge.

As we're about to break that assumption, add pci_dev_msi_domain
which is the equivalent of pci_host_bridge_msi_domain, but for
a single device.

Other than moving things around a bit, this patch on its own
has no effect.

Acked-by: default avatarRob Herring <robh@kernel.org>
Acked-by: default avatarBjorn Helgaas <bhelgaas@google.com>
Signed-off-by: default avatarMarc Zyngier <marc.zyngier@arm.com>
parent 82b9b424
Loading
Loading
Loading
Loading
+30 −5
Original line number Diff line number Diff line
@@ -1622,15 +1622,40 @@ static void pci_init_capabilities(struct pci_dev *dev)
	pci_enable_acs(dev);
}

/*
 * This is the equivalent of pci_host_bridge_msi_domain that acts on
 * devices. Firmware interfaces that can select the MSI domain on a
 * per-device basis should be called from here.
 */
static struct irq_domain *pci_dev_msi_domain(struct pci_dev *dev)
{
	struct irq_domain *d;

	/*
	 * If a domain has been set through the pcibios_add_device
	 * callback, then this is the one (platform code knows best).
	 */
	d = dev_get_msi_domain(&dev->dev);
	if (d)
		return d;

	return NULL;
}

static void pci_set_msi_domain(struct pci_dev *dev)
{
	struct irq_domain *d;

	/*
	 * If no domain has been set through the pcibios_add_device
	 * callback, inherit the default from the bus device.
	 * If the platform or firmware interfaces cannot supply a
	 * device-specific MSI domain, then inherit the default domain
	 * from the host bridge itself.
	 */
	if (!dev_get_msi_domain(&dev->dev))
		dev_set_msi_domain(&dev->dev,
				   dev_get_msi_domain(&dev->bus->dev));
	d = pci_dev_msi_domain(dev);
	if (!d)
		d = dev_get_msi_domain(&dev->bus->dev);

	dev_set_msi_domain(&dev->dev, d);
}

void pci_device_add(struct pci_dev *dev, struct pci_bus *bus)