Message ID | 20220118174855.19325-1-Jonathan.Cameron@huawei.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | hw/pci-bridge/pxb: Fix missing swizzle | expand |
On Tue, 18 Jan 2022 17:48:55 +0000 Jonathan Cameron via <qemu-devel@nongnu.org> wrote: > From: Jonathan Cameron <jonathan.cameron@huawei.com> > > pxb_map_irq_fn() handled the necessary removal of the swizzle > applied to the PXB interrupts by the bus to which it was attached > but neglected to apply the normal swizzle for PCI root ports > on the expander bridge. > > Result of this was on ARM virt, the PME interrupts for a second > RP on a PXB instance were miss-routed to #45 rather than #46. > > Tested with a selection of different configurations with 1 to 5 > RP per PXB instance. Note on my x86 test setup the PME interrupts > are not triggered so I haven't been able to test this. > > Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com> > Cc: Michael S. Tsirkin <mst@redhat.com> > Cc: Marcel Apfelbaum <marcel.apfelbaum@gmail.com> Ping. > --- > hw/pci-bridge/pci_expander_bridge.c | 6 ++++++ > 1 file changed, 6 insertions(+) > > diff --git a/hw/pci-bridge/pci_expander_bridge.c b/hw/pci-bridge/pci_expander_bridge.c > index 10e6e7c2ab..de932286b5 100644 > --- a/hw/pci-bridge/pci_expander_bridge.c > +++ b/hw/pci-bridge/pci_expander_bridge.c > @@ -192,6 +192,12 @@ static int pxb_map_irq_fn(PCIDevice *pci_dev, int pin) > { > PCIDevice *pxb = pci_get_bus(pci_dev)->parent_dev; > > + /* > + * First carry out normal swizzle to handle > + * multple root ports on a pxb instance. > + */ > + pin = pci_swizzle_map_irq_fn(pci_dev, pin); > + > /* > * The bios does not index the pxb slot number when > * it computes the IRQ because it resides on bus 0
diff --git a/hw/pci-bridge/pci_expander_bridge.c b/hw/pci-bridge/pci_expander_bridge.c index 10e6e7c2ab..de932286b5 100644 --- a/hw/pci-bridge/pci_expander_bridge.c +++ b/hw/pci-bridge/pci_expander_bridge.c @@ -192,6 +192,12 @@ static int pxb_map_irq_fn(PCIDevice *pci_dev, int pin) { PCIDevice *pxb = pci_get_bus(pci_dev)->parent_dev; + /* + * First carry out normal swizzle to handle + * multple root ports on a pxb instance. + */ + pin = pci_swizzle_map_irq_fn(pci_dev, pin); + /* * The bios does not index the pxb slot number when * it computes the IRQ because it resides on bus 0