From 70bfdce6a1263fd06144ecc1c3727c44e562d89b Mon Sep 17 00:00:00 2001 From: Pranavkumar Sawargaonkar Date: Thu, 14 Sep 2017 18:43:18 +0100 Subject: hw/pci-host/gpex: Set INTx index/gsi mapping To implement INTx to gsi routing we need to pass the gpex host bridge the gsi associated to each INTx index. Let's introduce irq_num array and gpex_set_irq_num setter function. Signed-off-by: Pranavkumar Sawargaonkar Signed-off-by: Tushar Jagad Signed-off-by: Eric Auger Tested-by: Feng Kan Reviewed-by: Andrew Jones Message-id: 1505296004-6798-2-git-send-email-eric.auger@redhat.com Signed-off-by: Peter Maydell --- hw/pci-host/gpex.c | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'hw/pci-host/gpex.c') diff --git a/hw/pci-host/gpex.c b/hw/pci-host/gpex.c index 83084b9aab..41a884da3f 100644 --- a/hw/pci-host/gpex.c +++ b/hw/pci-host/gpex.c @@ -43,6 +43,16 @@ static void gpex_set_irq(void *opaque, int irq_num, int level) qemu_set_irq(s->irq[irq_num], level); } +int gpex_set_irq_num(GPEXHost *s, int index, int gsi) +{ + if (index >= GPEX_NUM_IRQS) { + return -EINVAL; + } + + s->irq_num[index] = gsi; + return 0; +} + static void gpex_host_realize(DeviceState *dev, Error **errp) { PCIHostState *pci = PCI_HOST_BRIDGE(dev); -- cgit 1.4.1 From d464814ae729f3200234ff74d5f050ddad4f1f20 Mon Sep 17 00:00:00 2001 From: Pranavkumar Sawargaonkar Date: Thu, 14 Sep 2017 18:43:19 +0100 Subject: hw/pci-host/gpex: Implement PCI INTx routing Now we are able to retrieve the gsi from the INTx pin, let's enable intx_to_irq routing. From that point on, irqfd becomes usable along with INTx when assigning a PCIe device. Signed-off-by: Pranavkumar Sawargaonkar Signed-off-by: Tushar Jagad Signed-off-by: Eric Auger Reviewed-by: Andrew Jones Tested-by: Feng Kan Message-id: 1505296004-6798-4-git-send-email-eric.auger@redhat.com Signed-off-by: Peter Maydell --- hw/pci-host/gpex.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'hw/pci-host/gpex.c') diff --git a/hw/pci-host/gpex.c b/hw/pci-host/gpex.c index 41a884da3f..be25245219 100644 --- a/hw/pci-host/gpex.c +++ b/hw/pci-host/gpex.c @@ -53,6 +53,17 @@ int gpex_set_irq_num(GPEXHost *s, int index, int gsi) return 0; } +static PCIINTxRoute gpex_route_intx_pin_to_irq(void *opaque, int pin) +{ + PCIINTxRoute route; + GPEXHost *s = opaque; + + route.mode = PCI_INTX_ENABLED; + route.irq = s->irq_num[pin]; + + return route; +} + static void gpex_host_realize(DeviceState *dev, Error **errp) { PCIHostState *pci = PCI_HOST_BRIDGE(dev); @@ -77,6 +88,7 @@ static void gpex_host_realize(DeviceState *dev, Error **errp) &s->io_ioport, 0, 4, TYPE_PCIE_BUS); qdev_set_parent_bus(DEVICE(&s->gpex_root), BUS(pci->bus)); + pci_bus_set_route_irq_fn(pci->bus, gpex_route_intx_pin_to_irq); qdev_init_nofail(DEVICE(&s->gpex_root)); } -- cgit 1.4.1