irqchip/gic-v3-its: Flag device allocation as proxied if behind a PCI bridge
authorMarc Zyngier <maz@kernel.org>
Sun, 29 Nov 2020 13:52:08 +0000 (13:52 +0000)
committerMarc Zyngier <maz@kernel.org>
Fri, 11 Dec 2020 14:47:50 +0000 (14:47 +0000)
An aliasing PCI bridge is another case where we should flag the
corresponding allocation as "proxied", as MSIs are coming with
the bridge's RID, and not the originating device's.

Signed-off-by: Marc Zyngier <maz@kernel.org>
Tested-by: John Garry <john.garry@huawei.com>
Link: https://lore.kernel.org/r/20201129135208.680293-4-maz@kernel.org
drivers/irqchip/irq-gic-v3-its-pci-msi.c

index 87711e0..ad2810c 100644 (file)
@@ -67,11 +67,16 @@ static int its_pci_msi_prepare(struct irq_domain *domain, struct device *dev,
        /*
         * If pdev is downstream of any aliasing bridges, take an upper
         * bound of how many other vectors could map to the same DevID.
+        * Also tell the ITS that the signalling will come from a proxy
+        * device, and that special allocation rules apply.
         */
        pci_for_each_dma_alias(pdev, its_get_pci_alias, &alias_dev);
-       if (alias_dev != pdev && alias_dev->subordinate)
-               pci_walk_bus(alias_dev->subordinate, its_pci_msi_vec_count,
-                            &alias_count);
+       if (alias_dev != pdev) {
+               if (alias_dev->subordinate)
+                       pci_walk_bus(alias_dev->subordinate,
+                                    its_pci_msi_vec_count, &alias_count);
+               info->flags |= MSI_ALLOC_FLAGS_PROXY_DEVICE;
+       }
 
        /* ITS specific DeviceID, as the core ITS ignores dev. */
        info->scratchpad[0].ul = pci_msi_domain_get_msi_rid(domain, pdev);