qemu-ppc
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-ppc] [Qemu-devel] [PATCH v5 for-2.3 23/28] hw/pxb: add map_irq


From: Marcel Apfelbaum
Subject: Re: [Qemu-ppc] [Qemu-devel] [PATCH v5 for-2.3 23/28] hw/pxb: add map_irq func
Date: Mon, 16 Mar 2015 14:11:45 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.4.0

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 <address@hidden>
---
  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

[Prev in Thread] Current Thread [Next in Thread]