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 <m...@kernel.org>
---
 drivers/irqchip/irq-gic-v3-its-pci-msi.c | 11 ++++++++---
 1 file changed, 8 insertions(+), 3 deletions(-)

diff --git a/drivers/irqchip/irq-gic-v3-its-pci-msi.c 
b/drivers/irqchip/irq-gic-v3-its-pci-msi.c
index 87711e0f8014..ad2810c017ed 100644
--- a/drivers/irqchip/irq-gic-v3-its-pci-msi.c
+++ b/drivers/irqchip/irq-gic-v3-its-pci-msi.c
@@ -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);
-- 
2.28.0

Reply via email to