On Tue, Mar 10, 2015 at 05:32:09PM +0200, Marcel Apfelbaum wrote: > The bios does not index the pxb slot number when > it computes the IRQ because it resides on bus 0 > and not on the current bus. > However Qemu routes the irq through bus 0 and adds > the pxb slot to the IRQ computation. > > Synchronize between bios and Qemu by canceling > pxb's effect. > > Signed-off-by: Marcel Apfelbaum <mar...@redhat.com> > --- > hw/pci-bridge/pci_expander_bridge.c | 20 +++++++++++++++++++- > 1 file changed, 19 insertions(+), 1 deletion(-) > > diff --git a/hw/pci-bridge/pci_expander_bridge.c > b/hw/pci-bridge/pci_expander_bridge.c > index 941f3c8..87515c1 100644 > --- a/hw/pci-bridge/pci_expander_bridge.c > +++ b/hw/pci-bridge/pci_expander_bridge.c > @@ -92,6 +92,24 @@ static const TypeInfo pxb_host_info = { > .class_init = pxb_host_class_init, > }; > > + > +static int pxb_map_irq_fn(PCIDevice *pci_dev, int pin) > +{ > + PCIDevice *pxb = pci_dev->bus->parent_dev; > + > + /* > + * The bios does not index the pxb slot number when > + * it computes the IRQ because it resides on bus 0 > + * and not on the current bus. > + * However QEMU routes the irq through bus 0 and adds > + * the pxb slot to the IRQ computation.
I know it's QEMU but which function exactly? > + * > + * Synchronize between bios and QEMU by canceling > + * pxb's effect. > + */ > + return pin - PCI_SLOT(pxb->devfn); > +} > + > static int pxb_dev_initfn(PCIDevice *dev) > { > PXBDev *pxb = PXB_DEV(dev); > @@ -118,7 +136,7 @@ static int pxb_dev_initfn(PCIDevice *dev) > bus->parent_dev = dev; > bus->address_space_mem = dev->bus->address_space_mem; > bus->address_space_io = dev->bus->address_space_io; > - bus->map_irq = pci_swizzle_map_irq_fn; > + bus->map_irq = pxb_map_irq_fn; > > bds = qdev_create(BUS(bus), "pci-bridge"); > bds->id = dev_name; > -- > 2.1.0