* [Qemu-devel] [PATCH v4 1/3] hw/pci-host/gpex: Set INTx index/gsi mapping
2017-09-13 9:46 [Qemu-devel] [PATCH v4 0/3] Generic PCIe host bridge INTx determination for INTx routing Eric Auger
@ 2017-09-13 9:46 ` Eric Auger
2017-09-13 11:45 ` Andrew Jones
2017-09-13 9:46 ` [Qemu-devel] [PATCH v4 2/3] hw/arm/virt: Set INTx/gsi mapping Eric Auger
` (2 subsequent siblings)
3 siblings, 1 reply; 6+ messages in thread
From: Eric Auger @ 2017-09-13 9:46 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>
Tested-by: Feng Kan <fkan@apm.com>
---
v3 -> v4:
- use int for gsi
---
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 83084b9..41a884d 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);
diff --git a/include/hw/pci-host/gpex.h b/include/hw/pci-host/gpex.h
index 68c9348..aef38b8 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];
+ int irq_num[GPEX_NUM_IRQS];
} GPEXHost;
+int gpex_set_irq_num(GPEXHost *s, int index, int gsi);
+
#endif /* HW_GPEX_H */
--
2.5.5
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [Qemu-devel] [PATCH v4 1/3] hw/pci-host/gpex: Set INTx index/gsi mapping
2017-09-13 9:46 ` [Qemu-devel] [PATCH v4 1/3] hw/pci-host/gpex: Set INTx index/gsi mapping Eric Auger
@ 2017-09-13 11:45 ` Andrew Jones
0 siblings, 0 replies; 6+ messages in thread
From: Andrew Jones @ 2017-09-13 11:45 UTC (permalink / raw)
To: Eric Auger
Cc: eric.auger.pro, peter.maydell, alex.williamson, qemu-arm,
qemu-devel, christoffer.dall, agraf, pranavkumar, wei
On Wed, Sep 13, 2017 at 11:46:42AM +0200, Eric Auger wrote:
> 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>
> Tested-by: Feng Kan <fkan@apm.com>
>
> ---
>
> v3 -> v4:
> - use int for gsi
> ---
> 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 83084b9..41a884d 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);
> diff --git a/include/hw/pci-host/gpex.h b/include/hw/pci-host/gpex.h
> index 68c9348..aef38b8 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];
> + int irq_num[GPEX_NUM_IRQS];
> } GPEXHost;
>
> +int gpex_set_irq_num(GPEXHost *s, int index, int gsi);
> +
> #endif /* HW_GPEX_H */
> --
> 2.5.5
>
Reviewed-by: Andrew Jones <drjones@redhat.com>
^ permalink raw reply [flat|nested] 6+ messages in thread
* [Qemu-devel] [PATCH v4 2/3] hw/arm/virt: Set INTx/gsi mapping
2017-09-13 9:46 [Qemu-devel] [PATCH v4 0/3] Generic PCIe host bridge INTx determination for INTx routing Eric Auger
2017-09-13 9:46 ` [Qemu-devel] [PATCH v4 1/3] hw/pci-host/gpex: Set INTx index/gsi mapping Eric Auger
@ 2017-09-13 9:46 ` Eric Auger
2017-09-13 9:46 ` [Qemu-devel] [PATCH v4 3/3] hw/pci-host/gpex: Implement PCI INTx routing Eric Auger
2017-09-14 15:06 ` [Qemu-devel] [PATCH v4 0/3] Generic PCIe host bridge INTx determination for " Peter Maydell
3 siblings, 0 replies; 6+ messages in thread
From: Eric Auger @ 2017-09-13 9:46 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>
Reviewed-by: Andrew Jones <drjones@redhat.com>
Tested-by: Feng Kan <fkan@apm.com>
---
v3 -> v4:
- don't use GPEXHost *s anymore
- added Drew's R-b
---
hw/arm/virt.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
index fe96557..cfd834d 100644
--- a/hw/arm/virt.c
+++ b/hw/arm/virt.c
@@ -1057,6 +1057,7 @@ static void create_pcie(const VirtMachineState *vms, qemu_irq *pic)
for (i = 0; i < GPEX_NUM_IRQS; i++) {
sysbus_connect_irq(SYS_BUS_DEVICE(dev), i, pic[irq + i]);
+ gpex_set_irq_num(GPEX_HOST(dev), i, irq + i);
}
pci = PCI_HOST_BRIDGE(dev);
--
2.5.5
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [Qemu-devel] [PATCH v4 3/3] hw/pci-host/gpex: Implement PCI INTx routing
2017-09-13 9:46 [Qemu-devel] [PATCH v4 0/3] Generic PCIe host bridge INTx determination for INTx routing Eric Auger
2017-09-13 9:46 ` [Qemu-devel] [PATCH v4 1/3] hw/pci-host/gpex: Set INTx index/gsi mapping Eric Auger
2017-09-13 9:46 ` [Qemu-devel] [PATCH v4 2/3] hw/arm/virt: Set INTx/gsi mapping Eric Auger
@ 2017-09-13 9:46 ` Eric Auger
2017-09-14 15:06 ` [Qemu-devel] [PATCH v4 0/3] Generic PCIe host bridge INTx determination for " Peter Maydell
3 siblings, 0 replies; 6+ messages in thread
From: Eric Auger @ 2017-09-13 9:46 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>
Reviewed-by: Andrew Jones <drjones@redhat.com>
Tested-by: Feng Kan <fkan@apm.com>
---
v3 -> v4:
- remove the cast to int
- added Drew's R-b
---
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 41a884d..be25245 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));
}
--
2.5.5
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [Qemu-devel] [PATCH v4 0/3] Generic PCIe host bridge INTx determination for INTx routing
2017-09-13 9:46 [Qemu-devel] [PATCH v4 0/3] Generic PCIe host bridge INTx determination for INTx routing Eric Auger
` (2 preceding siblings ...)
2017-09-13 9:46 ` [Qemu-devel] [PATCH v4 3/3] hw/pci-host/gpex: Implement PCI INTx routing Eric Auger
@ 2017-09-14 15:06 ` Peter Maydell
3 siblings, 0 replies; 6+ messages in thread
From: Peter Maydell @ 2017-09-14 15:06 UTC (permalink / raw)
To: Eric Auger
Cc: eric.auger.pro, Alex Williamson, qemu-arm, QEMU Developers,
Christoffer Dall, Alexander Graf, Pranavkumar Sawargaonkar,
Andrew Jones, Wei Huang
On 13 September 2017 at 10:46, Eric Auger <eric.auger@redhat.com> 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.
>
> This series can be found at:
> https://github.com/eauger/qemu/tree/v2.10.0-gpex-v4
>
> References:
> [1] Generic PCIe host bridge INTx determination for INTx routing
> https://lists.gnu.org/archive/html/qemu-devel/2015-09/msg04975.html
Applied to target-arm.next, thanks.
-- PMM
^ permalink raw reply [flat|nested] 6+ messages in thread