On 03/10/2015 06:43 PM, Michael S. Tsirkin wrote:
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?
PXB device with is a PCI host-bridge device.

Thanks,
Marcel


+     *
+     * 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


Reply via email to