PCI: xgene: Defer probing if the MSI widget driver hasn't probed yet

As a preparatory work to make the XGene MSI driver probe less of
a sorry hack, make the PCI driver check for the availability of
the MSI parent domain, and defer the probing otherwise.

Signed-off-by: Marc Zyngier <maz@kernel.org>
Signed-off-by: Lorenzo Pieralisi <lpieralisi@kernel.org>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Link: https://lore.kernel.org/r/20250708173404.1278635-3-maz@kernel.org
This commit is contained in:
Marc Zyngier 2025-07-08 18:33:53 +01:00 committed by Bjorn Helgaas
parent 2c9e7f8574
commit 0d402bd41a
1 changed files with 23 additions and 0 deletions

View File

@ -12,6 +12,7 @@
#include <linux/jiffies.h>
#include <linux/memblock.h>
#include <linux/init.h>
#include <linux/irqdomain.h>
#include <linux/of.h>
#include <linux/of_address.h>
#include <linux/of_pci.h>
@ -594,6 +595,24 @@ static struct pci_ops xgene_pcie_ops = {
.write = pci_generic_config_write32,
};
static bool xgene_check_pcie_msi_ready(void)
{
struct device_node *np;
struct irq_domain *d;
if (!IS_ENABLED(CONFIG_PCI_XGENE_MSI))
return true;
np = of_find_compatible_node(NULL, NULL, "apm,xgene1-msi");
if (!np)
return true;
d = irq_find_matching_host(np, DOMAIN_BUS_PCI_MSI);
of_node_put(np);
return d && irq_domain_is_msi_parent(d);
}
static int xgene_pcie_probe(struct platform_device *pdev)
{
struct device *dev = &pdev->dev;
@ -602,6 +621,10 @@ static int xgene_pcie_probe(struct platform_device *pdev)
struct pci_host_bridge *bridge;
int ret;
if (!xgene_check_pcie_msi_ready())
return dev_err_probe(&pdev->dev, -EPROBE_DEFER,
"MSI driver not ready\n");
bridge = devm_pci_alloc_host_bridge(dev, sizeof(*port));
if (!bridge)
return -ENOMEM;