PCI: Support populating MSI domains of root buses via bridges
Currently, at probing time, the MSI domains of root buses are populated if either the information of MSI domain is available from firmware (DT or ACPI), or arch-specific sysdata is used to pass the fwnode of the MSI domain. These two conditions don't cover all, e.g. Hyper-V virtual PCI on ARM64, which doesn't have the MSI information in the firmware and couldn't use arch-specific sysdata because running on an architecture with PCI_DOMAINS_GENERIC=y. To support populating MSI domains of the root buses at the probing when neither of the above condition is true, the ->msi_domain of the corresponding bridge device is used: in pci_host_bridge_msi_domain(), which should return the MSI domain of the root bus, the ->msi_domain of the corresponding bridge is fetched first as a potential value of the MSI domain of the root bus. In order to use the approach to populate MSI domains, the driver needs to dev_set_msi_domain() on the bridge before calling pci_register_host_bridge(), and makes sure GENERIC_MSI_IRQ_DOMAIN=y. Another advantage of this new approach is providing an arch-independent way to populate MSI domains, which allows sharing the driver code as much as possible between architectures. Originally-by: Arnd Bergmann <arnd@arndb.de> Link: https://lore.kernel.org/r/20210726180657.142727-3-boqun.feng@gmail.com Signed-off-by: Boqun Feng <boqun.feng@gmail.com> Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com> Acked-by: Bjorn Helgaas <bhelgaas@google.com>
This commit is contained in:
Родитель
15d82ca23c
Коммит
41dd40fd71
|
@ -829,11 +829,15 @@ static struct irq_domain *pci_host_bridge_msi_domain(struct pci_bus *bus)
|
|||
{
|
||||
struct irq_domain *d;
|
||||
|
||||
/* If the host bridge driver sets a MSI domain of the bridge, use it */
|
||||
d = dev_get_msi_domain(bus->bridge);
|
||||
|
||||
/*
|
||||
* Any firmware interface that can resolve the msi_domain
|
||||
* should be called from here.
|
||||
*/
|
||||
d = pci_host_bridge_of_msi_domain(bus);
|
||||
if (!d)
|
||||
d = pci_host_bridge_of_msi_domain(bus);
|
||||
if (!d)
|
||||
d = pci_host_bridge_acpi_msi_domain(bus);
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче