All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH v4 0/3] Generic PCIe host bridge INTx determination for INTx routing
@ 2017-09-13  9:46 Eric Auger
  2017-09-13  9:46 ` [Qemu-devel] [PATCH v4 1/3] hw/pci-host/gpex: Set INTx index/gsi mapping Eric Auger
                   ` (3 more replies)
  0 siblings, 4 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

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

History:
v3 -> v3:
- use int instead of uint32_t for gsis
- added Drew's R-b
- Added Feng's T-b

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              |  1 +
 hw/pci-host/gpex.c         | 22 ++++++++++++++++++++++
 include/hw/pci-host/gpex.h |  3 +++
 3 files changed, 26 insertions(+)

-- 
2.5.5

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [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

* [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 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

* 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

end of thread, other threads:[~2017-09-14 15:06 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
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 11:45   ` Andrew Jones
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 ` [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

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.