mirror of https://gitee.com/openkylin/linux.git
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: Rob Herring <robh@kernel.org> Acked-by: Bjorn Helgaas <bhelgaas@google.com> Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
This commit is contained in:
parent
82b9b4243c
commit
098259eb16
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue