diff mbox series

[v6,2/8] PCI: Support populating MSI domains of root buses via bridges

Message ID 20210726180657.142727-3-boqun.feng@gmail.com (mailing list archive)
State Accepted
Delegated to: Lorenzo Pieralisi
Headers show
Series PCI: hv: Support host bridge probing on ARM64 | expand

Commit Message

Boqun Feng July 26, 2021, 6:06 p.m. UTC
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>
Signed-off-by: Boqun Feng <boqun.feng@gmail.com>
---
 drivers/pci/probe.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

Comments

Bjorn Helgaas July 27, 2021, 4:14 p.m. UTC | #1
On Tue, Jul 27, 2021 at 02:06:51AM +0800, Boqun Feng wrote:
> 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>
> Signed-off-by: Boqun Feng <boqun.feng@gmail.com>

Acked-by: Bjorn Helgaas <bhelgaas@google.com>

> ---
>  drivers/pci/probe.c | 6 +++++-
>  1 file changed, 5 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
> index 60c50d4f156f..ea7f2a57e2f5 100644
> --- a/drivers/pci/probe.c
> +++ b/drivers/pci/probe.c
> @@ -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);
>  
> -- 
> 2.32.0
>
diff mbox series

Patch

diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index 60c50d4f156f..ea7f2a57e2f5 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -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);