* [Qemu-devel] [PATCH v3 1/3] hw/pci-host/gpex: Set INTx index/gsi mapping
2017-06-13 13:31 [Qemu-devel] [PATCH v3 0/3] Generic PCIe host bridge INTx determination for INTx routing Eric Auger
@ 2017-06-13 13:31 ` Eric Auger
2017-06-13 13:31 ` [Qemu-devel] [PATCH v3 2/3] hw/arm/virt: Set INTx/gsi mapping Eric Auger
` (2 subsequent siblings)
3 siblings, 0 replies; 5+ messages in thread
From: Eric Auger @ 2017-06-13 13:31 UTC (permalink / raw)
To: eric.auger.pro, eric.auger, peter.maydell, alex.williamson,
qemu-arm, qemu-devel
Cc: christoffer.dall, agraf, pranavkumar, drjones, wei
From: Pranavkumar Sawargaonkar <pranavkumar@linaro.org>
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 <pranavkumar@linaro.org>
Signed-off-by: Tushar Jagad <tushar.jagad@linaro.org>
Signed-off-by: Eric Auger <eric.auger@redhat.com>
---
hw/pci-host/gpex.c | 10 ++++++++++
include/hw/pci-host/gpex.h | 3 +++
2 files changed, 13 insertions(+)
diff --git a/hw/pci-host/gpex.c b/hw/pci-host/gpex.c
index e2629ce..22367aa4 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, uint32_t 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);
diff --git a/include/hw/pci-host/gpex.h b/include/hw/pci-host/gpex.h
index 68c9348..db26b3e 100644
--- a/include/hw/pci-host/gpex.h
+++ b/include/hw/pci-host/gpex.h
@@ -51,6 +51,9 @@ typedef struct GPEXHost {
MemoryRegion io_ioport;
MemoryRegion io_mmio;
qemu_irq irq[GPEX_NUM_IRQS];
+ uint32_t irq_num[GPEX_NUM_IRQS];
} GPEXHost;
+int gpex_set_irq_num(GPEXHost *s, int index, uint32_t gsi);
+
#endif /* HW_GPEX_H */
--
2.5.5
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [Qemu-devel] [PATCH v3 2/3] hw/arm/virt: Set INTx/gsi mapping
2017-06-13 13:31 [Qemu-devel] [PATCH v3 0/3] Generic PCIe host bridge INTx determination for INTx routing Eric Auger
2017-06-13 13:31 ` [Qemu-devel] [PATCH v3 1/3] hw/pci-host/gpex: Set INTx index/gsi mapping Eric Auger
@ 2017-06-13 13:31 ` Eric Auger
2017-06-13 13:31 ` [Qemu-devel] [PATCH v3 3/3] hw/pci-host/gpex: Implement PCI INTx routing Eric Auger
2017-07-03 11:37 ` [Qemu-devel] [PATCH v3 0/3] Generic PCIe host bridge INTx determination for " Auger Eric
3 siblings, 0 replies; 5+ messages in thread
From: Eric Auger @ 2017-06-13 13:31 UTC (permalink / raw)
To: eric.auger.pro, eric.auger, peter.maydell, alex.williamson,
qemu-arm, qemu-devel
Cc: christoffer.dall, agraf, pranavkumar, drjones, wei
From: Pranavkumar Sawargaonkar <pranavkumar@linaro.org>
Let's provide the GPEX host bridge with the INTx/gsi mapping. This is
needed for INTx/gsi routing.
Signed-off-by: Pranavkumar Sawargaonkar <pranavkumar@linaro.org>
Signed-off-by: Tushar Jagad <tushar.jagad@linaro.org>
Signed-off-by: Eric Auger <eric.auger@redhat.com>
---
hw/arm/virt.c | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
index 010f724..f86c229 100644
--- a/hw/arm/virt.c
+++ b/hw/arm/virt.c
@@ -1012,6 +1012,7 @@ static void create_pcie(const VirtMachineState *vms, qemu_irq *pic)
char *nodename;
int i;
PCIHostState *pci;
+ GPEXHost *s;
dev = qdev_create(NULL, TYPE_GPEX_HOST);
qdev_init_nofail(dev);
@@ -1047,8 +1048,11 @@ static void create_pcie(const VirtMachineState *vms, qemu_irq *pic)
/* Map IO port space */
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 2, base_pio);
+ s = GPEX_HOST(dev);
+
for (i = 0; i < GPEX_NUM_IRQS; i++) {
sysbus_connect_irq(SYS_BUS_DEVICE(dev), i, pic[irq + i]);
+ gpex_set_irq_num(s, i, irq + i);
}
pci = PCI_HOST_BRIDGE(dev);
--
2.5.5
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [Qemu-devel] [PATCH v3 3/3] hw/pci-host/gpex: Implement PCI INTx routing
2017-06-13 13:31 [Qemu-devel] [PATCH v3 0/3] Generic PCIe host bridge INTx determination for INTx routing Eric Auger
2017-06-13 13:31 ` [Qemu-devel] [PATCH v3 1/3] hw/pci-host/gpex: Set INTx index/gsi mapping Eric Auger
2017-06-13 13:31 ` [Qemu-devel] [PATCH v3 2/3] hw/arm/virt: Set INTx/gsi mapping Eric Auger
@ 2017-06-13 13:31 ` Eric Auger
2017-07-03 11:37 ` [Qemu-devel] [PATCH v3 0/3] Generic PCIe host bridge INTx determination for " Auger Eric
3 siblings, 0 replies; 5+ messages in thread
From: Eric Auger @ 2017-06-13 13:31 UTC (permalink / raw)
To: eric.auger.pro, eric.auger, peter.maydell, alex.williamson,
qemu-arm, qemu-devel
Cc: christoffer.dall, agraf, pranavkumar, drjones, wei
From: Pranavkumar Sawargaonkar <pranavkumar@linaro.org>
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 <pranavkumar@linaro.org>
Signed-off-by: Tushar Jagad <tushar.jagad@linaro.org>
Signed-off-by: Eric Auger <eric.auger@redhat.com>
---
hw/pci-host/gpex.c | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/hw/pci-host/gpex.c b/hw/pci-host/gpex.c
index 22367aa4..2ec918b 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, uint32_t 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 = (int)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));
}
--
2.5.5
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [Qemu-devel] [PATCH v3 0/3] Generic PCIe host bridge INTx determination for INTx routing
2017-06-13 13:31 [Qemu-devel] [PATCH v3 0/3] Generic PCIe host bridge INTx determination for INTx routing Eric Auger
` (2 preceding siblings ...)
2017-06-13 13:31 ` [Qemu-devel] [PATCH v3 3/3] hw/pci-host/gpex: Implement PCI INTx routing Eric Auger
@ 2017-07-03 11:37 ` Auger Eric
3 siblings, 0 replies; 5+ messages in thread
From: Auger Eric @ 2017-07-03 11:37 UTC (permalink / raw)
To: eric.auger.pro, peter.maydell, alex.williamson, qemu-arm,
qemu-devel
Cc: christoffer.dall, agraf, pranavkumar, drjones, wei
Hi,
On 13/06/2017 15:31, Eric Auger wrote:
> This series implements INTx to gsi routing for ARM VIRT/GPEX. This is
> a respin of [1] which was lost in limbo.
>
> ARM virt uses GPEX PCIe bridge. This latter does not implement INTx
> to GSI routing. PCIe/INTx assignment works but the consequence is
> irqfd is not used along with INTx interrupts and VFIO INTx handlers
> are executed on userspace leading to an important performance degradation.
>
> This issue is witnessed by the following messages;
>
> qemu-system-aarch64: -device vfio-pci,host=0006:90:00.0: PCI: Bug -
> unimplemented PCI INTx routing (gpex-pcihost)
> qemu-system-aarch64: PCI: Bug - unimplemented PCI INTx routing (gpex-pcihost)
> qemu-system-aarch64: PCI: Bug - unimplemented PCI INTx routing (gpex-pcihost)
>
> So with this series, irqfd is set up for PCIe/INTx passthrough and we get
> the optimal performance. Also we get rid of the above messages.
Ping? any feedback on this series that fixes irqfd setup for PCIe
passthrough/ARM with legacy interrupts?
Thanks
Eric
>
> This series can be found at:
> https://github.com/eauger/qemu/tree/v2.9-gpex-intx-v3
>
> References:
> [1] Generic PCIe host bridge INTx determination for INTx routing
> https://lists.gnu.org/archive/html/qemu-devel/2015-09/msg04975.html
>
> Pranavkumar Sawargaonkar (3):
> hw/pci-host/gpex: Set INTx index/gsi mapping
> hw/arm/virt: Set INTx/gsi mapping
> hw/pci-host/gpex: Implement PCI INTx routing
>
> hw/arm/virt.c | 4 ++++
> hw/pci-host/gpex.c | 22 ++++++++++++++++++++++
> include/hw/pci-host/gpex.h | 3 +++
> 3 files changed, 29 insertions(+)
>
^ permalink raw reply [flat|nested] 5+ messages in thread