Skip to content

Commit

Permalink
hw/pxb: add map_irq func
Browse files Browse the repository at this point in the history
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 of the PXB device.

Synchronize between bios and Qemu by canceling
pxb's effect.

Signed-off-by: Marcel Apfelbaum <marcel@redhat.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Acked-by: Laszlo Ersek <lersek@redhat.com>
  • Loading branch information
marcel-apf authored and mstsirkin committed Jun 3, 2015
1 parent 2118196 commit 0639b00
Showing 1 changed file with 19 additions and 1 deletion.
20 changes: 19 additions & 1 deletion hw/pci-bridge/pci_expander_bridge.c
Expand Up @@ -120,6 +120,24 @@ static int pxb_register_bus(PCIDevice *dev, PCIBus *pxb_bus)
return 0;
}

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 of the PXB
* device.
*
* 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);
Expand All @@ -137,7 +155,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;
Expand Down

0 comments on commit 0639b00

Please sign in to comment.