PCI: of: Allow matching of an interrupt-map local to a PCI device
authorMarc Zyngier <maz@kernel.org>
Wed, 29 Sep 2021 16:38:36 +0000 (17:38 +0100)
committerBjorn Helgaas <bhelgaas@google.com>
Thu, 4 Nov 2021 19:16:56 +0000 (14:16 -0500)
Just as we now allow an interrupt map to be parsed when part of an
interrupt controller, there is no reason to ignore an interrupt map that
would be part of a pci device node such as a root port since we already
allow interrupt specifiers.

Allow the matching of such property when local to the node of a PCI
device, which allows the device itself to use the interrupt map for for
its own purpose.

Link: https://lore.kernel.org/r/20210929163847.2807812-4-maz@kernel.org
Tested-by: Alyssa Rosenzweig <alyssa@rosenzweig.io>
Signed-off-by: Marc Zyngier <maz@kernel.org>
Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Reviewed-by: Rob Herring <robh@kernel.org>
drivers/pci/of.c

index d84381ce82b528b3ff3f55e77d5fa11e23e015e2..0b1237cff239a6b455201a7c8f64d0dd837db5ab 100644 (file)
@@ -423,7 +423,7 @@ failed:
  */
 static int of_irq_parse_pci(const struct pci_dev *pdev, struct of_phandle_args *out_irq)
 {
-       struct device_node *dn, *ppnode;
+       struct device_node *dn, *ppnode = NULL;
        struct pci_dev *ppdev;
        __be32 laddr[3];
        u8 pin;
@@ -452,8 +452,14 @@ static int of_irq_parse_pci(const struct pci_dev *pdev, struct of_phandle_args *
        if (pin == 0)
                return -ENODEV;
 
+       /* Local interrupt-map in the device node? Use it! */
+       if (of_get_property(dn, "interrupt-map", NULL)) {
+               pin = pci_swizzle_interrupt_pin(pdev, pin);
+               ppnode = dn;
+       }
+
        /* Now we walk up the PCI tree */
-       for (;;) {
+       while (!ppnode) {
                /* Get the pci_dev of our parent */
                ppdev = pdev->bus->self;