qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/7] hw/sysbus: Add sysbus_init_irqs and reduce SYSBUS_DEVICE_GPIO_IRQ scope
@ 2023-05-31 22:33 Philippe Mathieu-Daudé
  2023-05-31 22:33 ` [PATCH 1/7] hw/arm/xlnx-versal: Do not open-code sysbus_connect_irq() Philippe Mathieu-Daudé
                   ` (6 more replies)
  0 siblings, 7 replies; 17+ messages in thread
From: Philippe Mathieu-Daudé @ 2023-05-31 22:33 UTC (permalink / raw)
  To: qemu-devel
  Cc: Thomas Huth, qemu-arm, qemu-ppc, Eduardo Habkost,
	Markus Armbruster, Marc-André Lureau, Mark Cave-Ayland,
	Philippe Mathieu-Daudé

This series:

- Remove uses (out of sysbus.c) to the SYSBUS_DEVICE_GPIO_IRQ
  definition, using proper SysBus API methods,
- Reduce SYSBUS_DEVICE_GPIO_IRQ scope, making it SysBus API
  internal,
- Convert various for() loops iterating over sysbus_init_irq()
  by calling a single sysbus_init_irqs() instead. Mostly an
  automatic convertion except 4 files.

The resulting code looks nicer IMHO, and is possibly less
bug prone.

Philippe Mathieu-Daudé (7):
  hw/arm/xlnx-versal: Do not open-code sysbus_connect_irq()
  hw/usb/xlnx: Do not open-code sysbus_pass_irq()
  hw/sysbus: Introduce sysbus_init_irqs()
  hw/usb/hcd-xhci: Use sysbus_init_irqs()
  hw/sysbus: Make SYSBUS_DEVICE_GPIO_IRQ API internal
  hw: Simplify using sysbus_init_irqs() [automatic]
  hw: Simplify using sysbus_init_irqs() [manual]

 include/hw/sysbus.h           |  3 +--
 hw/arm/smmuv3.c               |  6 +-----
 hw/arm/stellaris.c            |  5 +----
 hw/arm/strongarm.c            |  5 +----
 hw/arm/versatilepb.c          |  5 +----
 hw/arm/xlnx-versal.c          |  4 +---
 hw/char/pl011.c               |  5 +----
 hw/char/renesas_sci.c         |  5 +----
 hw/core/platform-bus.c        |  5 +----
 hw/core/sysbus.c              |  9 ++++++++-
 hw/dma/pl330.c                |  4 +---
 hw/dma/sifive_pdma.c          |  5 +----
 hw/gpio/sifive_gpio.c         |  5 +----
 hw/i386/kvm/xen_evtchn.c      |  5 +----
 hw/intc/arm_gic_common.c      | 20 +++++---------------
 hw/intc/arm_gicv2m.c          |  5 +----
 hw/intc/exynos4210_combiner.c |  5 +----
 hw/intc/loongarch_extioi.c    |  7 ++-----
 hw/intc/loongson_liointc.c    |  5 +----
 hw/intc/omap_intc.c           |  3 +--
 hw/intc/openpic.c             |  6 ++----
 hw/intc/slavio_intctl.c       |  6 ++----
 hw/misc/avr_power.c           |  4 +---
 hw/misc/macio/gpio.c          |  5 +----
 hw/misc/stm32f4xx_exti.c      |  5 +----
 hw/net/cadence_gem.c          |  5 +----
 hw/net/mcf_fec.c              |  5 +----
 hw/pci-host/designware.c      |  5 +----
 hw/pci-host/gpex.c            |  2 +-
 hw/pci-host/ppce500.c         |  4 +---
 hw/pci-host/raven.c           |  4 +---
 hw/pci-host/sh_pci.c          |  5 +----
 hw/pci-host/versatile.c       |  4 +---
 hw/ppc/ppc405_uc.c            | 10 ++--------
 hw/ppc/ppc440_uc.c            |  6 ++----
 hw/ppc/ppc4xx_devs.c          |  4 +---
 hw/ppc/ppc4xx_pci.c           |  5 +----
 hw/ssi/ibex_spi_host.c        |  5 +----
 hw/ssi/imx_spi.c              |  5 +----
 hw/ssi/sifive_spi.c           |  5 +----
 hw/ssi/xilinx_spi.c           |  5 +----
 hw/ssi/xilinx_spips.c         |  4 +---
 hw/ssi/xlnx-versal-ospi.c     |  4 +---
 hw/timer/allwinner-a10-pit.c  |  4 +---
 hw/timer/exynos4210_mct.c     |  4 +---
 hw/timer/hpet.c               |  4 +---
 hw/timer/renesas_cmt.c        |  5 +----
 hw/timer/renesas_tmr.c        |  9 +++------
 hw/timer/sifive_pwm.c         |  5 +----
 hw/usb/hcd-xhci-sysbus.c      |  5 ++---
 hw/usb/xlnx-usb-subsystem.c   |  2 +-
 51 files changed, 70 insertions(+), 197 deletions(-)

-- 
2.38.1



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

* [PATCH 1/7] hw/arm/xlnx-versal: Do not open-code sysbus_connect_irq()
  2023-05-31 22:33 [PATCH 0/7] hw/sysbus: Add sysbus_init_irqs and reduce SYSBUS_DEVICE_GPIO_IRQ scope Philippe Mathieu-Daudé
@ 2023-05-31 22:33 ` Philippe Mathieu-Daudé
  2023-06-01  3:02   ` Richard Henderson
  2023-05-31 22:33 ` [PATCH 2/7] hw/usb/xlnx: Do not open-code sysbus_pass_irq() Philippe Mathieu-Daudé
                   ` (5 subsequent siblings)
  6 siblings, 1 reply; 17+ messages in thread
From: Philippe Mathieu-Daudé @ 2023-05-31 22:33 UTC (permalink / raw)
  To: qemu-devel
  Cc: Thomas Huth, qemu-arm, qemu-ppc, Eduardo Habkost,
	Markus Armbruster, Marc-André Lureau, Mark Cave-Ayland,
	Philippe Mathieu-Daudé

The SYSBUS_DEVICE_GPIO_IRQ definition should be internal to
the SysBus API. Here we simply open-coded sysbus_connect_irq().
Replace to use the proper API.

Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
 hw/arm/xlnx-versal.c | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/hw/arm/xlnx-versal.c b/hw/arm/xlnx-versal.c
index 69b1b99e93..de5af506f7 100644
--- a/hw/arm/xlnx-versal.c
+++ b/hw/arm/xlnx-versal.c
@@ -704,9 +704,7 @@ static void versal_unimp(Versal *s)
                                 gpio_in);
 
     gpio_in = qdev_get_gpio_in_named(DEVICE(s), "irq-parity-imr-dummy", 0);
-    qdev_connect_gpio_out_named(DEVICE(&s->pmc.iou.slcr),
-                                SYSBUS_DEVICE_GPIO_IRQ, 0,
-                                gpio_in);
+    sysbus_connect_irq(SYS_BUS_DEVICE(&s->pmc.iou.slcr), 0, gpio_in);
 }
 
 static void versal_realize(DeviceState *dev, Error **errp)
-- 
2.38.1



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

* [PATCH 2/7] hw/usb/xlnx: Do not open-code sysbus_pass_irq()
  2023-05-31 22:33 [PATCH 0/7] hw/sysbus: Add sysbus_init_irqs and reduce SYSBUS_DEVICE_GPIO_IRQ scope Philippe Mathieu-Daudé
  2023-05-31 22:33 ` [PATCH 1/7] hw/arm/xlnx-versal: Do not open-code sysbus_connect_irq() Philippe Mathieu-Daudé
@ 2023-05-31 22:33 ` Philippe Mathieu-Daudé
  2023-06-01  3:04   ` Richard Henderson
  2023-05-31 22:33 ` [PATCH 3/7] hw/sysbus: Introduce sysbus_init_irqs() Philippe Mathieu-Daudé
                   ` (4 subsequent siblings)
  6 siblings, 1 reply; 17+ messages in thread
From: Philippe Mathieu-Daudé @ 2023-05-31 22:33 UTC (permalink / raw)
  To: qemu-devel
  Cc: Thomas Huth, qemu-arm, qemu-ppc, Eduardo Habkost,
	Markus Armbruster, Marc-André Lureau, Mark Cave-Ayland,
	Philippe Mathieu-Daudé

The SYSBUS_DEVICE_GPIO_IRQ definition should be internal to
the SysBus API. Here we simply open-coded sysbus_pass_irq().
Replace to use the proper API.

Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
 hw/usb/xlnx-usb-subsystem.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/hw/usb/xlnx-usb-subsystem.c b/hw/usb/xlnx-usb-subsystem.c
index d8deeb6ced..462ce6c3ff 100644
--- a/hw/usb/xlnx-usb-subsystem.c
+++ b/hw/usb/xlnx-usb-subsystem.c
@@ -49,7 +49,7 @@ static void versal_usb2_realize(DeviceState *dev, Error **errp)
     }
     sysbus_init_mmio(sbd, &s->dwc3_mr);
     sysbus_init_mmio(sbd, &s->usb2Ctrl_mr);
-    qdev_pass_gpios(DEVICE(&s->dwc3.sysbus_xhci), dev, SYSBUS_DEVICE_GPIO_IRQ);
+    sysbus_pass_irq(sbd, SYS_BUS_DEVICE(&s->dwc3.sysbus_xhci));
 }
 
 static void versal_usb2_init(Object *obj)
-- 
2.38.1



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

* [PATCH 3/7] hw/sysbus: Introduce sysbus_init_irqs()
  2023-05-31 22:33 [PATCH 0/7] hw/sysbus: Add sysbus_init_irqs and reduce SYSBUS_DEVICE_GPIO_IRQ scope Philippe Mathieu-Daudé
  2023-05-31 22:33 ` [PATCH 1/7] hw/arm/xlnx-versal: Do not open-code sysbus_connect_irq() Philippe Mathieu-Daudé
  2023-05-31 22:33 ` [PATCH 2/7] hw/usb/xlnx: Do not open-code sysbus_pass_irq() Philippe Mathieu-Daudé
@ 2023-05-31 22:33 ` Philippe Mathieu-Daudé
  2023-06-01  3:08   ` Richard Henderson
  2023-05-31 22:33 ` [PATCH 4/7] hw/usb/hcd-xhci: Use sysbus_init_irqs() Philippe Mathieu-Daudé
                   ` (3 subsequent siblings)
  6 siblings, 1 reply; 17+ messages in thread
From: Philippe Mathieu-Daudé @ 2023-05-31 22:33 UTC (permalink / raw)
  To: qemu-devel
  Cc: Thomas Huth, qemu-arm, qemu-ppc, Eduardo Habkost,
	Markus Armbruster, Marc-André Lureau, Mark Cave-Ayland,
	Philippe Mathieu-Daudé

The SysBus API currently only provides a method to initialize
a single IRQ: sysbus_init_irq(). When we want to initialize
multiple SysBus IRQs, we have to call this function multiple
times. In order to allow further simplifications, introduce
the sysbus_init_irqs() method.

Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
 include/hw/sysbus.h | 1 +
 hw/core/sysbus.c    | 7 ++++++-
 2 files changed, 7 insertions(+), 1 deletion(-)

diff --git a/include/hw/sysbus.h b/include/hw/sysbus.h
index 3564b7b6a2..bc174b2dc3 100644
--- a/include/hw/sysbus.h
+++ b/include/hw/sysbus.h
@@ -70,6 +70,7 @@ typedef void FindSysbusDeviceFunc(SysBusDevice *sbdev, void *opaque);
 void sysbus_init_mmio(SysBusDevice *dev, MemoryRegion *memory);
 MemoryRegion *sysbus_mmio_get_region(SysBusDevice *dev, int n);
 void sysbus_init_irq(SysBusDevice *dev, qemu_irq *p);
+void sysbus_init_irqs(SysBusDevice *dev, qemu_irq *p, unsigned count);
 void sysbus_pass_irq(SysBusDevice *dev, SysBusDevice *target);
 void sysbus_init_ioports(SysBusDevice *dev, uint32_t ioport, uint32_t size);
 
diff --git a/hw/core/sysbus.c b/hw/core/sysbus.c
index 35f902b582..a1b4c362c9 100644
--- a/hw/core/sysbus.c
+++ b/hw/core/sysbus.c
@@ -175,10 +175,15 @@ void sysbus_mmio_map_overlap(SysBusDevice *dev, int n, hwaddr addr,
     sysbus_mmio_map_common(dev, n, addr, true, priority);
 }
 
+void sysbus_init_irqs(SysBusDevice *dev, qemu_irq *p, unsigned count)
+{
+    qdev_init_gpio_out_named(DEVICE(dev), p, SYSBUS_DEVICE_GPIO_IRQ, count);
+}
+
 /* Request an IRQ source.  The actual IRQ object may be populated later.  */
 void sysbus_init_irq(SysBusDevice *dev, qemu_irq *p)
 {
-    qdev_init_gpio_out_named(DEVICE(dev), p, SYSBUS_DEVICE_GPIO_IRQ, 1);
+    sysbus_init_irqs(dev, p, 1);
 }
 
 /* Pass IRQs from a target device.  */
-- 
2.38.1



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

* [PATCH 4/7] hw/usb/hcd-xhci: Use sysbus_init_irqs()
  2023-05-31 22:33 [PATCH 0/7] hw/sysbus: Add sysbus_init_irqs and reduce SYSBUS_DEVICE_GPIO_IRQ scope Philippe Mathieu-Daudé
                   ` (2 preceding siblings ...)
  2023-05-31 22:33 ` [PATCH 3/7] hw/sysbus: Introduce sysbus_init_irqs() Philippe Mathieu-Daudé
@ 2023-05-31 22:33 ` Philippe Mathieu-Daudé
  2023-06-01  3:09   ` Richard Henderson
  2023-05-31 22:33 ` [PATCH 5/7] hw/sysbus: Make SYSBUS_DEVICE_GPIO_IRQ API internal Philippe Mathieu-Daudé
                   ` (2 subsequent siblings)
  6 siblings, 1 reply; 17+ messages in thread
From: Philippe Mathieu-Daudé @ 2023-05-31 22:33 UTC (permalink / raw)
  To: qemu-devel
  Cc: Thomas Huth, qemu-arm, qemu-ppc, Eduardo Habkost,
	Markus Armbruster, Marc-André Lureau, Mark Cave-Ayland,
	Philippe Mathieu-Daudé

The SYSBUS_DEVICE_GPIO_IRQ definition should be internal to
the SysBus API. Use the recently introduced sysbus_init_irqs()
method to avoid using this internal definition.

Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
 hw/usb/hcd-xhci-sysbus.c | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/hw/usb/hcd-xhci-sysbus.c b/hw/usb/hcd-xhci-sysbus.c
index faf57b4797..e512849b34 100644
--- a/hw/usb/hcd-xhci-sysbus.c
+++ b/hw/usb/hcd-xhci-sysbus.c
@@ -40,9 +40,6 @@ static void xhci_sysbus_realize(DeviceState *dev, Error **errp)
     if (!qdev_realize(DEVICE(&s->xhci), NULL, errp)) {
         return;
     }
-    s->irq = g_new0(qemu_irq, s->xhci.numintrs);
-    qdev_init_gpio_out_named(dev, s->irq, SYSBUS_DEVICE_GPIO_IRQ,
-                             s->xhci.numintrs);
     if (s->xhci.dma_mr) {
         s->xhci.as =  g_malloc0(sizeof(AddressSpace));
         address_space_init(s->xhci.as, s->xhci.dma_mr, NULL);
@@ -50,6 +47,8 @@ static void xhci_sysbus_realize(DeviceState *dev, Error **errp)
         s->xhci.as = &address_space_memory;
     }
 
+    s->irq = g_new0(qemu_irq, s->xhci.numintrs);
+    sysbus_init_irqs(SYS_BUS_DEVICE(dev), s->irq, s->xhci.numintrs);
     sysbus_init_mmio(SYS_BUS_DEVICE(dev), &s->xhci.mem);
 }
 
-- 
2.38.1



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

* [PATCH 5/7] hw/sysbus: Make SYSBUS_DEVICE_GPIO_IRQ API internal
  2023-05-31 22:33 [PATCH 0/7] hw/sysbus: Add sysbus_init_irqs and reduce SYSBUS_DEVICE_GPIO_IRQ scope Philippe Mathieu-Daudé
                   ` (3 preceding siblings ...)
  2023-05-31 22:33 ` [PATCH 4/7] hw/usb/hcd-xhci: Use sysbus_init_irqs() Philippe Mathieu-Daudé
@ 2023-05-31 22:33 ` Philippe Mathieu-Daudé
  2023-06-01  3:10   ` Richard Henderson
  2023-05-31 22:33 ` [PATCH 6/7] hw: Simplify using sysbus_init_irqs() [automatic] Philippe Mathieu-Daudé
  2023-05-31 22:33 ` [PATCH 7/7] hw: Simplify using sysbus_init_irqs() [manual] Philippe Mathieu-Daudé
  6 siblings, 1 reply; 17+ messages in thread
From: Philippe Mathieu-Daudé @ 2023-05-31 22:33 UTC (permalink / raw)
  To: qemu-devel
  Cc: Thomas Huth, qemu-arm, qemu-ppc, Eduardo Habkost,
	Markus Armbruster, Marc-André Lureau, Mark Cave-Ayland,
	Philippe Mathieu-Daudé

Since we don't have any use of the SYSBUS_DEVICE_GPIO_IRQ definition
outside of sysbus.c, we can reduce its scope, making it internal to
the API.

Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
 include/hw/sysbus.h | 2 --
 hw/core/sysbus.c    | 2 ++
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/include/hw/sysbus.h b/include/hw/sysbus.h
index bc174b2dc3..cdd83c555e 100644
--- a/include/hw/sysbus.h
+++ b/include/hw/sysbus.h
@@ -26,8 +26,6 @@ OBJECT_DECLARE_TYPE(SysBusDevice, SysBusDeviceClass,
  * classes overriding it are not required to invoke its implementation.
  */
 
-#define SYSBUS_DEVICE_GPIO_IRQ "sysbus-irq"
-
 struct SysBusDeviceClass {
     /*< private >*/
     DeviceClass parent_class;
diff --git a/hw/core/sysbus.c b/hw/core/sysbus.c
index a1b4c362c9..f0ba57dcbf 100644
--- a/hw/core/sysbus.c
+++ b/hw/core/sysbus.c
@@ -24,6 +24,8 @@
 #include "monitor/monitor.h"
 #include "exec/address-spaces.h"
 
+#define SYSBUS_DEVICE_GPIO_IRQ "sysbus-irq"
+
 static void sysbus_dev_print(Monitor *mon, DeviceState *dev, int indent);
 static char *sysbus_get_fw_dev_path(DeviceState *dev);
 
-- 
2.38.1



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

* [PATCH 6/7] hw: Simplify using sysbus_init_irqs() [automatic]
  2023-05-31 22:33 [PATCH 0/7] hw/sysbus: Add sysbus_init_irqs and reduce SYSBUS_DEVICE_GPIO_IRQ scope Philippe Mathieu-Daudé
                   ` (4 preceding siblings ...)
  2023-05-31 22:33 ` [PATCH 5/7] hw/sysbus: Make SYSBUS_DEVICE_GPIO_IRQ API internal Philippe Mathieu-Daudé
@ 2023-05-31 22:33 ` Philippe Mathieu-Daudé
  2023-06-01  3:11   ` Richard Henderson
  2023-05-31 22:33 ` [PATCH 7/7] hw: Simplify using sysbus_init_irqs() [manual] Philippe Mathieu-Daudé
  6 siblings, 1 reply; 17+ messages in thread
From: Philippe Mathieu-Daudé @ 2023-05-31 22:33 UTC (permalink / raw)
  To: qemu-devel
  Cc: Thomas Huth, qemu-arm, qemu-ppc, Eduardo Habkost,
	Markus Armbruster, Marc-André Lureau, Mark Cave-Ayland,
	Philippe Mathieu-Daudé

Change created mechanically using the following coccinelle
semantic patch:

    @@
    expression array;
    identifier i;
    expression sbd, count;
    @@

    -    for (i = 0; i < count; i++) {
    -        sysbus_init_irq(sbd, &array[i]);
    -    }
    +    sysbus_init_irqs(sbd, array, count);

Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
 hw/arm/smmuv3.c               |  6 +-----
 hw/arm/stellaris.c            |  5 +----
 hw/arm/strongarm.c            |  5 +----
 hw/arm/versatilepb.c          |  5 +----
 hw/char/pl011.c               |  5 +----
 hw/char/renesas_sci.c         |  5 +----
 hw/core/platform-bus.c        |  5 +----
 hw/dma/pl330.c                |  4 +---
 hw/dma/sifive_pdma.c          |  5 +----
 hw/gpio/sifive_gpio.c         |  5 +----
 hw/i386/kvm/xen_evtchn.c      |  5 +----
 hw/intc/arm_gic_common.c      | 20 +++++---------------
 hw/intc/arm_gicv2m.c          |  5 +----
 hw/intc/exynos4210_combiner.c |  5 +----
 hw/intc/loongarch_extioi.c    |  6 ++----
 hw/intc/loongson_liointc.c    |  5 +----
 hw/intc/openpic.c             |  6 ++----
 hw/intc/slavio_intctl.c       |  6 ++----
 hw/misc/avr_power.c           |  4 +---
 hw/misc/macio/gpio.c          |  5 +----
 hw/misc/stm32f4xx_exti.c      |  5 +----
 hw/net/cadence_gem.c          |  5 +----
 hw/net/mcf_fec.c              |  5 +----
 hw/pci-host/designware.c      |  5 +----
 hw/pci-host/ppce500.c         |  4 +---
 hw/pci-host/raven.c           |  4 +---
 hw/pci-host/sh_pci.c          |  5 +----
 hw/pci-host/versatile.c       |  4 +---
 hw/ppc/ppc405_uc.c            | 10 ++--------
 hw/ppc/ppc440_uc.c            |  6 ++----
 hw/ppc/ppc4xx_devs.c          |  4 +---
 hw/ppc/ppc4xx_pci.c           |  5 +----
 hw/ssi/ibex_spi_host.c        |  5 +----
 hw/ssi/imx_spi.c              |  5 +----
 hw/ssi/sifive_spi.c           |  5 +----
 hw/ssi/xilinx_spi.c           |  5 +----
 hw/ssi/xilinx_spips.c         |  4 +---
 hw/ssi/xlnx-versal-ospi.c     |  4 +---
 hw/timer/allwinner-a10-pit.c  |  4 +---
 hw/timer/exynos4210_mct.c     |  4 +---
 hw/timer/hpet.c               |  4 +---
 hw/timer/renesas_cmt.c        |  5 +----
 hw/timer/sifive_pwm.c         |  5 +----
 43 files changed, 52 insertions(+), 177 deletions(-)

diff --git a/hw/arm/smmuv3.c b/hw/arm/smmuv3.c
index 932f009697..f080d97d3f 100644
--- a/hw/arm/smmuv3.c
+++ b/hw/arm/smmuv3.c
@@ -1692,11 +1692,7 @@ static const MemoryRegionOps smmu_mem_ops = {
 
 static void smmu_init_irq(SMMUv3State *s, SysBusDevice *dev)
 {
-    int i;
-
-    for (i = 0; i < ARRAY_SIZE(s->irq); i++) {
-        sysbus_init_irq(dev, &s->irq[i]);
-    }
+    sysbus_init_irqs(dev, s->irq, ARRAY_SIZE(s->irq));
 }
 
 static void smmu_reset_hold(Object *obj)
diff --git a/hw/arm/stellaris.c b/hw/arm/stellaris.c
index f7e99baf62..4bf9ef05c8 100644
--- a/hw/arm/stellaris.c
+++ b/hw/arm/stellaris.c
@@ -934,11 +934,8 @@ static void stellaris_adc_init(Object *obj)
     DeviceState *dev = DEVICE(obj);
     StellarisADCState *s = STELLARIS_ADC(obj);
     SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
-    int n;
 
-    for (n = 0; n < 4; n++) {
-        sysbus_init_irq(sbd, &s->irq[n]);
-    }
+    sysbus_init_irqs(sbd, s->irq, 4);
 
     memory_region_init_io(&s->iomem, obj, &stellaris_adc_ops, s,
                           "adc", 0x1000);
diff --git a/hw/arm/strongarm.c b/hw/arm/strongarm.c
index cc73145053..f785dcf08e 100644
--- a/hw/arm/strongarm.c
+++ b/hw/arm/strongarm.c
@@ -658,7 +658,6 @@ static void strongarm_gpio_initfn(Object *obj)
     DeviceState *dev = DEVICE(obj);
     StrongARMGPIOInfo *s = STRONGARM_GPIO(obj);
     SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
-    int i;
 
     qdev_init_gpio_in(dev, strongarm_gpio_set, 28);
     qdev_init_gpio_out(dev, s->handler, 28);
@@ -667,9 +666,7 @@ static void strongarm_gpio_initfn(Object *obj)
                           "gpio", 0x1000);
 
     sysbus_init_mmio(sbd, &s->iomem);
-    for (i = 0; i < 11; i++) {
-        sysbus_init_irq(sbd, &s->irqs[i]);
-    }
+    sysbus_init_irqs(sbd, s->irqs, 11);
     sysbus_init_irq(sbd, &s->irqX);
 }
 
diff --git a/hw/arm/versatilepb.c b/hw/arm/versatilepb.c
index 05b9462a5b..6a5b1fc53e 100644
--- a/hw/arm/versatilepb.c
+++ b/hw/arm/versatilepb.c
@@ -160,12 +160,9 @@ static void vpb_sic_init(Object *obj)
     DeviceState *dev = DEVICE(obj);
     vpb_sic_state *s = VERSATILE_PB_SIC(obj);
     SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
-    int i;
 
     qdev_init_gpio_in(dev, vpb_sic_set_irq, 32);
-    for (i = 0; i < 32; i++) {
-        sysbus_init_irq(sbd, &s->parent[i]);
-    }
+    sysbus_init_irqs(sbd, s->parent, 32);
     s->irq = 31;
     memory_region_init_io(&s->iomem, obj, &vpb_sic_ops, s,
                           "vpb-sic", 0x1000);
diff --git a/hw/char/pl011.c b/hw/char/pl011.c
index 77bbc2a982..2056e32385 100644
--- a/hw/char/pl011.c
+++ b/hw/char/pl011.c
@@ -442,13 +442,10 @@ static void pl011_init(Object *obj)
 {
     SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
     PL011State *s = PL011(obj);
-    int i;
 
     memory_region_init_io(&s->iomem, OBJECT(s), &pl011_ops, s, "pl011", 0x1000);
     sysbus_init_mmio(sbd, &s->iomem);
-    for (i = 0; i < ARRAY_SIZE(s->irq); i++) {
-        sysbus_init_irq(sbd, &s->irq[i]);
-    }
+    sysbus_init_irqs(sbd, s->irq, ARRAY_SIZE(s->irq));
 
     s->clk = qdev_init_clock_in(DEVICE(obj), "clk", pl011_clock_update, s,
                                 ClockUpdate);
diff --git a/hw/char/renesas_sci.c b/hw/char/renesas_sci.c
index 1c63467290..d404976279 100644
--- a/hw/char/renesas_sci.c
+++ b/hw/char/renesas_sci.c
@@ -286,15 +286,12 @@ static void rsci_init(Object *obj)
 {
     SysBusDevice *d = SYS_BUS_DEVICE(obj);
     RSCIState *sci = RSCI(obj);
-    int i;
 
     memory_region_init_io(&sci->memory, OBJECT(sci), &sci_ops,
                           sci, "renesas-sci", 0x8);
     sysbus_init_mmio(d, &sci->memory);
 
-    for (i = 0; i < SCI_NR_IRQ; i++) {
-        sysbus_init_irq(d, &sci->irq[i]);
-    }
+    sysbus_init_irqs(d, sci->irq, SCI_NR_IRQ);
     timer_init_ns(&sci->timer, QEMU_CLOCK_VIRTUAL, txend, sci);
 }
 
diff --git a/hw/core/platform-bus.c b/hw/core/platform-bus.c
index b8487b26b6..5e75324434 100644
--- a/hw/core/platform-bus.c
+++ b/hw/core/platform-bus.c
@@ -182,7 +182,6 @@ static void platform_bus_realize(DeviceState *dev, Error **errp)
 {
     PlatformBusDevice *pbus;
     SysBusDevice *d;
-    int i;
 
     d = SYS_BUS_DEVICE(dev);
     pbus = PLATFORM_BUS_DEVICE(dev);
@@ -193,9 +192,7 @@ static void platform_bus_realize(DeviceState *dev, Error **errp)
 
     pbus->used_irqs = bitmap_new(pbus->num_irqs);
     pbus->irqs = g_new0(qemu_irq, pbus->num_irqs);
-    for (i = 0; i < pbus->num_irqs; i++) {
-        sysbus_init_irq(d, &pbus->irqs[i]);
-    }
+    sysbus_init_irqs(d, pbus->irqs, pbus->num_irqs);
 
     /* some devices might be initialized before so update used IRQs map */
     plaform_bus_refresh_irqs(pbus);
diff --git a/hw/dma/pl330.c b/hw/dma/pl330.c
index e7e67dd8b6..d1c24fa7b8 100644
--- a/hw/dma/pl330.c
+++ b/hw/dma/pl330.c
@@ -1620,9 +1620,7 @@ static void pl330_realize(DeviceState *dev, Error **errp)
     s->manager.is_manager = true;
 
     s->irq = g_new0(qemu_irq, s->num_events);
-    for (i = 0; i < s->num_events; i++) {
-        sysbus_init_irq(SYS_BUS_DEVICE(dev), &s->irq[i]);
-    }
+    sysbus_init_irqs(SYS_BUS_DEVICE(dev), s->irq, s->num_events);
 
     qdev_init_gpio_in(dev, pl330_dma_stop_irq, PL330_PERIPH_NUM);
 
diff --git a/hw/dma/sifive_pdma.c b/hw/dma/sifive_pdma.c
index 1dd88f3479..61c138323b 100644
--- a/hw/dma/sifive_pdma.c
+++ b/hw/dma/sifive_pdma.c
@@ -454,15 +454,12 @@ static const MemoryRegionOps sifive_pdma_ops = {
 static void sifive_pdma_realize(DeviceState *dev, Error **errp)
 {
     SiFivePDMAState *s = SIFIVE_PDMA(dev);
-    int i;
 
     memory_region_init_io(&s->iomem, OBJECT(dev), &sifive_pdma_ops, s,
                           TYPE_SIFIVE_PDMA, SIFIVE_PDMA_REG_SIZE);
     sysbus_init_mmio(SYS_BUS_DEVICE(dev), &s->iomem);
 
-    for (i = 0; i < SIFIVE_PDMA_IRQS; i++) {
-        sysbus_init_irq(SYS_BUS_DEVICE(dev), &s->irq[i]);
-    }
+    sysbus_init_irqs(SYS_BUS_DEVICE(dev), s->irq, SIFIVE_PDMA_IRQS);
 }
 
 static void sifive_pdma_class_init(ObjectClass *klass, void *data)
diff --git a/hw/gpio/sifive_gpio.c b/hw/gpio/sifive_gpio.c
index 78bf29e996..fcb863a3ef 100644
--- a/hw/gpio/sifive_gpio.c
+++ b/hw/gpio/sifive_gpio.c
@@ -362,10 +362,7 @@ static void sifive_gpio_realize(DeviceState *dev, Error **errp)
             TYPE_SIFIVE_GPIO, SIFIVE_GPIO_SIZE);
 
     sysbus_init_mmio(SYS_BUS_DEVICE(dev), &s->mmio);
-
-    for (int i = 0; i < s->ngpio; i++) {
-        sysbus_init_irq(SYS_BUS_DEVICE(dev), &s->irq[i]);
-    }
+    sysbus_init_irqs(SYS_BUS_DEVICE(dev), s->irq, s->ngpio);
 
     qdev_init_gpio_in(DEVICE(s), sifive_gpio_set, s->ngpio);
     qdev_init_gpio_out(DEVICE(s), s->output, s->ngpio);
diff --git a/hw/i386/kvm/xen_evtchn.c b/hw/i386/kvm/xen_evtchn.c
index 3048329474..12c4419907 100644
--- a/hw/i386/kvm/xen_evtchn.c
+++ b/hw/i386/kvm/xen_evtchn.c
@@ -303,16 +303,13 @@ void xen_evtchn_create(void)
 {
     XenEvtchnState *s = XEN_EVTCHN(sysbus_create_simple(TYPE_XEN_EVTCHN,
                                                         -1, NULL));
-    int i;
 
     xen_evtchn_singleton = s;
 
     qemu_mutex_init(&s->port_lock);
     s->gsi_bh = aio_bh_new(qemu_get_aio_context(), gsi_assert_bh, s);
 
-    for (i = 0; i < IOAPIC_NUM_PINS; i++) {
-        sysbus_init_irq(SYS_BUS_DEVICE(s), &s->gsis[i]);
-    }
+    sysbus_init_irqs(SYS_BUS_DEVICE(s), s->gsis, IOAPIC_NUM_PINS);
 
     /*
      * The Xen scheme for encoding PIRQ# into an MSI message is not
diff --git a/hw/intc/arm_gic_common.c b/hw/intc/arm_gic_common.c
index a379cea395..1742c752eb 100644
--- a/hw/intc/arm_gic_common.c
+++ b/hw/intc/arm_gic_common.c
@@ -143,22 +143,12 @@ void gic_init_irqs_and_mmio(GICState *s, qemu_irq_handler handler,
     i += (GIC_INTERNAL * s->num_cpu);
     qdev_init_gpio_in(DEVICE(s), handler, i);
 
-    for (i = 0; i < s->num_cpu; i++) {
-        sysbus_init_irq(sbd, &s->parent_irq[i]);
-    }
-    for (i = 0; i < s->num_cpu; i++) {
-        sysbus_init_irq(sbd, &s->parent_fiq[i]);
-    }
-    for (i = 0; i < s->num_cpu; i++) {
-        sysbus_init_irq(sbd, &s->parent_virq[i]);
-    }
-    for (i = 0; i < s->num_cpu; i++) {
-        sysbus_init_irq(sbd, &s->parent_vfiq[i]);
-    }
+    sysbus_init_irqs(sbd, s->parent_irq, s->num_cpu);
+    sysbus_init_irqs(sbd, s->parent_fiq, s->num_cpu);
+    sysbus_init_irqs(sbd, s->parent_virq, s->num_cpu);
+    sysbus_init_irqs(sbd, s->parent_vfiq, s->num_cpu);
     if (s->virt_extn) {
-        for (i = 0; i < s->num_cpu; i++) {
-            sysbus_init_irq(sbd, &s->maintenance_irq[i]);
-        }
+        sysbus_init_irqs(sbd, s->maintenance_irq, s->num_cpu);
     }
 
     /* Distributor */
diff --git a/hw/intc/arm_gicv2m.c b/hw/intc/arm_gicv2m.c
index d564b857eb..8167d5886c 100644
--- a/hw/intc/arm_gicv2m.c
+++ b/hw/intc/arm_gicv2m.c
@@ -135,7 +135,6 @@ static const MemoryRegionOps gicv2m_ops = {
 static void gicv2m_realize(DeviceState *dev, Error **errp)
 {
     ARMGICv2mState *s = ARM_GICV2M(dev);
-    int i;
 
     if (s->num_spi > GICV2M_NUM_SPI_MAX) {
         error_setg(errp,
@@ -151,9 +150,7 @@ static void gicv2m_realize(DeviceState *dev, Error **errp)
         return;
     }
 
-    for (i = 0; i < s->num_spi; i++) {
-        sysbus_init_irq(SYS_BUS_DEVICE(dev), &s->spi[i]);
-    }
+    sysbus_init_irqs(SYS_BUS_DEVICE(dev), s->spi, s->num_spi);
 
     msi_nonbroken = true;
     kvm_gsi_direct_mapping = true;
diff --git a/hw/intc/exynos4210_combiner.c b/hw/intc/exynos4210_combiner.c
index 4ba448fdb1..eb793e5623 100644
--- a/hw/intc/exynos4210_combiner.c
+++ b/hw/intc/exynos4210_combiner.c
@@ -309,16 +309,13 @@ static void exynos4210_combiner_init(Object *obj)
     DeviceState *dev = DEVICE(obj);
     Exynos4210CombinerState *s = EXYNOS4210_COMBINER(obj);
     SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
-    unsigned int i;
 
     /* Allocate general purpose input signals and connect a handler to each of
      * them */
     qdev_init_gpio_in(dev, exynos4210_combiner_handler, IIC_NIRQ);
 
     /* Connect SysBusDev irqs to device specific irqs */
-    for (i = 0; i < IIC_NGRP; i++) {
-        sysbus_init_irq(sbd, &s->output_irq[i]);
-    }
+    sysbus_init_irqs(sbd, s->output_irq, IIC_NGRP);
 
     memory_region_init_io(&s->iomem, obj, &exynos4210_combiner_ops, s,
                           "exynos4210-combiner", IIC_REGION_SIZE);
diff --git a/hw/intc/loongarch_extioi.c b/hw/intc/loongarch_extioi.c
index 0e7a3e32f3..db941de20e 100644
--- a/hw/intc/loongarch_extioi.c
+++ b/hw/intc/loongarch_extioi.c
@@ -273,11 +273,9 @@ static void loongarch_extioi_instance_init(Object *obj)
 {
     SysBusDevice *dev = SYS_BUS_DEVICE(obj);
     LoongArchExtIOI *s = LOONGARCH_EXTIOI(obj);
-    int i, cpu, pin;
+    int cpu, pin;
 
-    for (i = 0; i < EXTIOI_IRQS; i++) {
-        sysbus_init_irq(SYS_BUS_DEVICE(dev), &s->irq[i]);
-    }
+    sysbus_init_irqs(SYS_BUS_DEVICE(dev), s->irq, EXTIOI_IRQS);
 
     qdev_init_gpio_in(DEVICE(obj), extioi_setirq, EXTIOI_IRQS);
 
diff --git a/hw/intc/loongson_liointc.c b/hw/intc/loongson_liointc.c
index cc11b544cb..37b5f473d4 100644
--- a/hw/intc/loongson_liointc.c
+++ b/hw/intc/loongson_liointc.c
@@ -221,13 +221,10 @@ static void irq_handler(void *opaque, int irq, int level)
 static void loongson_liointc_init(Object *obj)
 {
     struct loongson_liointc *p = LOONGSON_LIOINTC(obj);
-    int i;
 
     qdev_init_gpio_in(DEVICE(obj), irq_handler, 32);
 
-    for (i = 0; i < NUM_PARENTS; i++) {
-        sysbus_init_irq(SYS_BUS_DEVICE(obj), &p->parent_irq[i]);
-    }
+    sysbus_init_irqs(SYS_BUS_DEVICE(obj), p->parent_irq, NUM_PARENTS);
 
     memory_region_init_io(&p->mmio, obj, &pic_ops, p,
                          TYPE_LOONGSON_LIOINTC, R_END);
diff --git a/hw/intc/openpic.c b/hw/intc/openpic.c
index c757adbe53..da9b833c33 100644
--- a/hw/intc/openpic.c
+++ b/hw/intc/openpic.c
@@ -1505,7 +1505,7 @@ static void openpic_realize(DeviceState *dev, Error **errp)
 {
     SysBusDevice *d = SYS_BUS_DEVICE(dev);
     OpenPICState *opp = OPENPIC(dev);
-    int i, j;
+    int i;
     int list_count = 0;
     static const MemReg list_le[] = {
         {"glb", &openpic_glb_ops_le,
@@ -1597,9 +1597,7 @@ static void openpic_realize(DeviceState *dev, Error **errp)
 
     for (i = 0; i < opp->nb_cpus; i++) {
         opp->dst[i].irqs = g_new0(qemu_irq, OPENPIC_OUTPUT_NB);
-        for (j = 0; j < OPENPIC_OUTPUT_NB; j++) {
-            sysbus_init_irq(d, &opp->dst[i].irqs[j]);
-        }
+        sysbus_init_irqs(d, opp->dst[i].irqs, OPENPIC_OUTPUT_NB);
 
         opp->dst[i].raised.queue_size = IRQQUEUE_SIZE_BITS;
         opp->dst[i].raised.queue = bitmap_new(IRQQUEUE_SIZE_BITS);
diff --git a/hw/intc/slavio_intctl.c b/hw/intc/slavio_intctl.c
index f7e59ba643..e2a3bd3e86 100644
--- a/hw/intc/slavio_intctl.c
+++ b/hw/intc/slavio_intctl.c
@@ -419,7 +419,7 @@ static void slavio_intctl_init(Object *obj)
     DeviceState *dev = DEVICE(obj);
     SLAVIO_INTCTLState *s = SLAVIO_INTCTL(obj);
     SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
-    unsigned int i, j;
+    unsigned int i;
     char slave_name[45];
 
     qdev_init_gpio_in(dev, slavio_set_irq_all, 32 + MAX_CPUS);
@@ -430,9 +430,7 @@ static void slavio_intctl_init(Object *obj)
     for (i = 0; i < MAX_CPUS; i++) {
         snprintf(slave_name, sizeof(slave_name),
                  "slave-interrupt-controller-%i", i);
-        for (j = 0; j < MAX_PILS; j++) {
-            sysbus_init_irq(sbd, &s->cpu_irqs[i][j]);
-        }
+        sysbus_init_irqs(sbd, s->cpu_irqs[i], MAX_PILS);
         memory_region_init_io(&s->slaves[i].iomem, OBJECT(s),
                               &slavio_intctl_mem_ops,
                               &s->slaves[i], slave_name, INTCTL_SIZE);
diff --git a/hw/misc/avr_power.c b/hw/misc/avr_power.c
index a5412f2cfe..5c6806ecbc 100644
--- a/hw/misc/avr_power.c
+++ b/hw/misc/avr_power.c
@@ -83,10 +83,8 @@ static void avr_mask_init(Object *dev)
     memory_region_init_io(&s->iomem, dev, &avr_mask_ops, s, TYPE_AVR_MASK,
                           0x01);
     sysbus_init_mmio(busdev, &s->iomem);
+    sysbus_init_irqs(busdev, s->irq, 8);
 
-    for (int i = 0; i < 8; i++) {
-        sysbus_init_irq(busdev, &s->irq[i]);
-    }
     s->val = 0x00;
 }
 
diff --git a/hw/misc/macio/gpio.c b/hw/misc/macio/gpio.c
index 4deb330471..bfbcf4ed87 100644
--- a/hw/misc/macio/gpio.c
+++ b/hw/misc/macio/gpio.c
@@ -153,11 +153,8 @@ static void macio_gpio_init(Object *obj)
 {
     SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
     MacIOGPIOState *s = MACIO_GPIO(obj);
-    int i;
 
-    for (i = 0; i < 10; i++) {
-        sysbus_init_irq(sbd, &s->gpio_extirqs[i]);
-    }
+    sysbus_init_irqs(sbd, s->gpio_extirqs, 10);
 
     memory_region_init_io(&s->gpiomem, OBJECT(s), &macio_gpio_ops, obj,
                           "gpio", 0x30);
diff --git a/hw/misc/stm32f4xx_exti.c b/hw/misc/stm32f4xx_exti.c
index 02e7810046..3bfefbf49b 100644
--- a/hw/misc/stm32f4xx_exti.c
+++ b/hw/misc/stm32f4xx_exti.c
@@ -135,11 +135,8 @@ static const MemoryRegionOps stm32f4xx_exti_ops = {
 static void stm32f4xx_exti_init(Object *obj)
 {
     STM32F4xxExtiState *s = STM32F4XX_EXTI(obj);
-    int i;
 
-    for (i = 0; i < NUM_INTERRUPT_OUT_LINES; i++) {
-        sysbus_init_irq(SYS_BUS_DEVICE(obj), &s->irq[i]);
-    }
+    sysbus_init_irqs(SYS_BUS_DEVICE(obj), s->irq, NUM_INTERRUPT_OUT_LINES);
 
     memory_region_init_io(&s->mmio, obj, &stm32f4xx_exti_ops, s,
                           TYPE_STM32F4XX_EXTI, 0x400);
diff --git a/hw/net/cadence_gem.c b/hw/net/cadence_gem.c
index 42ea2411a2..2a2293e0cc 100644
--- a/hw/net/cadence_gem.c
+++ b/hw/net/cadence_gem.c
@@ -1606,7 +1606,6 @@ static NetClientInfo net_gem_info = {
 static void gem_realize(DeviceState *dev, Error **errp)
 {
     CadenceGEMState *s = CADENCE_GEM(dev);
-    int i;
 
     address_space_init(&s->dma_as,
                        s->dma_mr ? s->dma_mr : get_system_memory(), "dma");
@@ -1626,9 +1625,7 @@ static void gem_realize(DeviceState *dev, Error **errp)
         return;
     }
 
-    for (i = 0; i < s->num_priority_queues; ++i) {
-        sysbus_init_irq(SYS_BUS_DEVICE(dev), &s->irq[i]);
-    }
+    sysbus_init_irqs(SYS_BUS_DEVICE(dev), s->irq, s->num_priority_queues);
 
     qemu_macaddr_default_if_unset(&s->conf.macaddr);
 
diff --git a/hw/net/mcf_fec.c b/hw/net/mcf_fec.c
index 8aa27bd322..34d5ecce5e 100644
--- a/hw/net/mcf_fec.c
+++ b/hw/net/mcf_fec.c
@@ -651,13 +651,10 @@ static void mcf_fec_instance_init(Object *obj)
 {
     SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
     mcf_fec_state *s = MCF_FEC_NET(obj);
-    int i;
 
     memory_region_init_io(&s->iomem, obj, &mcf_fec_ops, s, "fec", 0x400);
     sysbus_init_mmio(sbd, &s->iomem);
-    for (i = 0; i < FEC_NUM_IRQ; i++) {
-        sysbus_init_irq(sbd, &s->irq[i]);
-    }
+    sysbus_init_irqs(sbd, s->irq, FEC_NUM_IRQ);
 }
 
 static Property mcf_fec_properties[] = {
diff --git a/hw/pci-host/designware.c b/hw/pci-host/designware.c
index 9e183caa48..b75fd3d5f5 100644
--- a/hw/pci-host/designware.c
+++ b/hw/pci-host/designware.c
@@ -668,11 +668,8 @@ static void designware_pcie_host_realize(DeviceState *dev, Error **errp)
     PCIHostState *pci = PCI_HOST_BRIDGE(dev);
     DesignwarePCIEHost *s = DESIGNWARE_PCIE_HOST(dev);
     SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
-    size_t i;
 
-    for (i = 0; i < ARRAY_SIZE(s->pci.irqs); i++) {
-        sysbus_init_irq(sbd, &s->pci.irqs[i]);
-    }
+    sysbus_init_irqs(sbd, s->pci.irqs, ARRAY_SIZE(s->pci.irqs));
 
     memory_region_init_io(&s->mmio,
                           OBJECT(s),
diff --git a/hw/pci-host/ppce500.c b/hw/pci-host/ppce500.c
index 38814247f2..98ee49e4ee 100644
--- a/hw/pci-host/ppce500.c
+++ b/hw/pci-host/ppce500.c
@@ -446,9 +446,7 @@ static void e500_pcihost_realize(DeviceState *dev, Error **errp)
     h = PCI_HOST_BRIDGE(dev);
     s = PPC_E500_PCI_HOST_BRIDGE(dev);
 
-    for (i = 0; i < ARRAY_SIZE(s->irq); i++) {
-        sysbus_init_irq(sbd, &s->irq[i]);
-    }
+    sysbus_init_irqs(sbd, s->irq, ARRAY_SIZE(s->irq));
 
     for (i = 0; i < PCI_NUM_PINS; i++) {
         s->irq_num[i] = s->first_pin_irq + i;
diff --git a/hw/pci-host/raven.c b/hw/pci-host/raven.c
index 9a11ac4b2b..dd22964c27 100644
--- a/hw/pci-host/raven.c
+++ b/hw/pci-host/raven.c
@@ -239,9 +239,7 @@ static void raven_pcihost_realizefn(DeviceState *d, Error **errp)
     int i;
 
     if (s->is_legacy_prep) {
-        for (i = 0; i < PCI_NUM_PINS; i++) {
-            sysbus_init_irq(dev, &s->pci_irqs[i]);
-        }
+        sysbus_init_irqs(dev, s->pci_irqs, PCI_NUM_PINS);
     } else {
         /* According to PReP specification section 6.1.6 "System Interrupt
          * Assignments", all PCI interrupts are routed via IRQ 15 */
diff --git a/hw/pci-host/sh_pci.c b/hw/pci-host/sh_pci.c
index 77e7bbc65f..6aade6e5d7 100644
--- a/hw/pci-host/sh_pci.c
+++ b/hw/pci-host/sh_pci.c
@@ -121,11 +121,8 @@ static void sh_pci_device_realize(DeviceState *dev, Error **errp)
     SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
     SHPCIState *s = SH_PCI_HOST_BRIDGE(dev);
     PCIHostState *phb = PCI_HOST_BRIDGE(s);
-    int i;
 
-    for (i = 0; i < 4; i++) {
-        sysbus_init_irq(sbd, &s->irq[i]);
-    }
+    sysbus_init_irqs(sbd, s->irq, 4);
     phb->bus = pci_register_root_bus(dev, "pci",
                                      sh_pci_set_irq, sh_pci_map_irq,
                                      s->irq,
diff --git a/hw/pci-host/versatile.c b/hw/pci-host/versatile.c
index 60d4e7cd92..3eb9ad6f5c 100644
--- a/hw/pci-host/versatile.c
+++ b/hw/pci-host/versatile.c
@@ -412,9 +412,7 @@ static void pci_vpb_realize(DeviceState *dev, Error **errp)
 
     object_initialize(&s->pci_dev, sizeof(s->pci_dev), TYPE_VERSATILE_PCI_HOST);
 
-    for (i = 0; i < 4; i++) {
-        sysbus_init_irq(sbd, &s->irq[i]);
-    }
+    sysbus_init_irqs(sbd, s->irq, 4);
 
     if (s->realview) {
         mapfn = pci_vpb_rv_map_irq;
diff --git a/hw/ppc/ppc405_uc.c b/hw/ppc/ppc405_uc.c
index 0cc68178ad..5faa40a9d4 100644
--- a/hw/ppc/ppc405_uc.c
+++ b/hw/ppc/ppc405_uc.c
@@ -265,11 +265,8 @@ static void ppc405_dma_realize(DeviceState *dev, Error **errp)
 {
     Ppc405DmaState *dma = PPC405_DMA(dev);
     Ppc4xxDcrDeviceState *dcr = PPC4xx_DCR_DEVICE(dev);
-    int i;
 
-    for (i = 0; i < ARRAY_SIZE(dma->irqs); i++) {
-        sysbus_init_irq(SYS_BUS_DEVICE(dma), &dma->irqs[i]);
-    }
+    sysbus_init_irqs(SYS_BUS_DEVICE(dma), dma->irqs, ARRAY_SIZE(dma->irqs));
 
     ppc4xx_dcr_register(dcr, DMA0_CR0, dma, &dcr_read_dma, &dcr_write_dma);
     ppc4xx_dcr_register(dcr, DMA0_CT0, dma, &dcr_read_dma, &dcr_write_dma);
@@ -702,15 +699,12 @@ static void ppc405_gpt_realize(DeviceState *dev, Error **errp)
 {
     Ppc405GptState *s = PPC405_GPT(dev);
     SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
-    int i;
 
     s->timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, &ppc4xx_gpt_cb, s);
     memory_region_init_io(&s->iomem, OBJECT(s), &gpt_ops, s, "gpt", 0xd4);
     sysbus_init_mmio(sbd, &s->iomem);
 
-    for (i = 0; i < ARRAY_SIZE(s->irqs); i++) {
-        sysbus_init_irq(sbd, &s->irqs[i]);
-    }
+    sysbus_init_irqs(sbd, s->irqs, ARRAY_SIZE(s->irqs));
 }
 
 static void ppc405_gpt_finalize(Object *obj)
diff --git a/hw/ppc/ppc440_uc.c b/hw/ppc/ppc440_uc.c
index 651263926e..89e16766e4 100644
--- a/hw/ppc/ppc440_uc.c
+++ b/hw/ppc/ppc440_uc.c
@@ -1004,7 +1004,7 @@ static void ppc460ex_pcie_realize(DeviceState *dev, Error **errp)
 {
     PPC460EXPCIEState *s = PPC460EX_PCIE_HOST(dev);
     PCIHostState *pci = PCI_HOST_BRIDGE(dev);
-    int i, id;
+    int id;
     char buf[16];
 
     switch (s->dcrn_base) {
@@ -1020,9 +1020,7 @@ static void ppc460ex_pcie_realize(DeviceState *dev, Error **errp)
     }
     snprintf(buf, sizeof(buf), "pcie%d-io", id);
     memory_region_init(&s->iomem, OBJECT(s), buf, UINT64_MAX);
-    for (i = 0; i < 4; i++) {
-        sysbus_init_irq(SYS_BUS_DEVICE(dev), &s->irq[i]);
-    }
+    sysbus_init_irqs(SYS_BUS_DEVICE(dev), s->irq, 4);
     snprintf(buf, sizeof(buf), "pcie.%d", id);
     pci->bus = pci_register_root_bus(DEVICE(s), buf, ppc460ex_set_irq,
                                 pci_swizzle_map_irq_fn, s, &s->iomem,
diff --git a/hw/ppc/ppc4xx_devs.c b/hw/ppc/ppc4xx_devs.c
index c1d111465d..f938ac80a4 100644
--- a/hw/ppc/ppc4xx_devs.c
+++ b/hw/ppc/ppc4xx_devs.c
@@ -193,9 +193,7 @@ static void ppc4xx_mal_realize(DeviceState *dev, Error **errp)
     mal->rxctpr = g_new0(uint32_t, mal->rxcnum);
     mal->rcbs = g_new0(uint32_t, mal->rxcnum);
 
-    for (i = 0; i < ARRAY_SIZE(mal->irqs); i++) {
-        sysbus_init_irq(SYS_BUS_DEVICE(dev), &mal->irqs[i]);
-    }
+    sysbus_init_irqs(SYS_BUS_DEVICE(dev), mal->irqs, ARRAY_SIZE(mal->irqs));
 
     ppc4xx_dcr_register(dcr, MAL0_CFG, mal, &dcr_read_mal, &dcr_write_mal);
     ppc4xx_dcr_register(dcr, MAL0_ESR, mal, &dcr_read_mal, &dcr_write_mal);
diff --git a/hw/ppc/ppc4xx_pci.c b/hw/ppc/ppc4xx_pci.c
index 1d4a50fa7c..55957af77d 100644
--- a/hw/ppc/ppc4xx_pci.c
+++ b/hw/ppc/ppc4xx_pci.c
@@ -318,14 +318,11 @@ static void ppc4xx_pcihost_realize(DeviceState *dev, Error **errp)
     PPC4xxPCIState *s;
     PCIHostState *h;
     PCIBus *b;
-    int i;
 
     h = PCI_HOST_BRIDGE(dev);
     s = PPC4xx_PCI_HOST_BRIDGE(dev);
 
-    for (i = 0; i < ARRAY_SIZE(s->irq); i++) {
-        sysbus_init_irq(sbd, &s->irq[i]);
-    }
+    sysbus_init_irqs(sbd, s->irq, ARRAY_SIZE(s->irq));
 
     b = pci_register_root_bus(dev, NULL, ppc4xx_pci_set_irq,
                               ppc4xx_pci_map_irq, s->irq, get_system_memory(),
diff --git a/hw/ssi/ibex_spi_host.c b/hw/ssi/ibex_spi_host.c
index 1ee7d88c22..512b09d13e 100644
--- a/hw/ssi/ibex_spi_host.c
+++ b/hw/ssi/ibex_spi_host.c
@@ -589,14 +589,11 @@ static void fifo_trigger_update(void *opaque)
 static void ibex_spi_host_realize(DeviceState *dev, Error **errp)
 {
     IbexSPIHostState *s = IBEX_SPI_HOST(dev);
-    int i;
 
     s->ssi = ssi_create_bus(dev, "ssi");
     s->cs_lines = g_new0(qemu_irq, s->num_cs);
 
-    for (i = 0; i < s->num_cs; ++i) {
-        sysbus_init_irq(SYS_BUS_DEVICE(dev), &s->cs_lines[i]);
-    }
+    sysbus_init_irqs(SYS_BUS_DEVICE(dev), s->cs_lines, s->num_cs);
 
     /* Setup CONFIGOPTS Multi-register */
     s->config_opts = g_new0(uint32_t, s->num_cs);
diff --git a/hw/ssi/imx_spi.c b/hw/ssi/imx_spi.c
index 189423bb3a..86c130c77b 100644
--- a/hw/ssi/imx_spi.c
+++ b/hw/ssi/imx_spi.c
@@ -458,7 +458,6 @@ static const struct MemoryRegionOps imx_spi_ops = {
 static void imx_spi_realize(DeviceState *dev, Error **errp)
 {
     IMXSPIState *s = IMX_SPI(dev);
-    int i;
 
     s->bus = ssi_create_bus(dev, "spi");
 
@@ -467,9 +466,7 @@ static void imx_spi_realize(DeviceState *dev, Error **errp)
     sysbus_init_mmio(SYS_BUS_DEVICE(dev), &s->iomem);
     sysbus_init_irq(SYS_BUS_DEVICE(dev), &s->irq);
 
-    for (i = 0; i < ECSPI_NUM_CS; ++i) {
-        sysbus_init_irq(SYS_BUS_DEVICE(dev), &s->cs_lines[i]);
-    }
+    sysbus_init_irqs(SYS_BUS_DEVICE(dev), s->cs_lines, ECSPI_NUM_CS);
 
     fifo32_create(&s->tx_fifo, ECSPI_FIFO_SIZE);
     fifo32_create(&s->rx_fifo, ECSPI_FIFO_SIZE);
diff --git a/hw/ssi/sifive_spi.c b/hw/ssi/sifive_spi.c
index 1b4a401ca1..928c7c5035 100644
--- a/hw/ssi/sifive_spi.c
+++ b/hw/ssi/sifive_spi.c
@@ -310,15 +310,12 @@ static void sifive_spi_realize(DeviceState *dev, Error **errp)
 {
     SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
     SiFiveSPIState *s = SIFIVE_SPI(dev);
-    int i;
 
     s->spi = ssi_create_bus(dev, "spi");
     sysbus_init_irq(sbd, &s->irq);
 
     s->cs_lines = g_new0(qemu_irq, s->num_cs);
-    for (i = 0; i < s->num_cs; i++) {
-        sysbus_init_irq(sbd, &s->cs_lines[i]);
-    }
+    sysbus_init_irqs(sbd, s->cs_lines, s->num_cs);
 
     memory_region_init_io(&s->mmio, OBJECT(s), &sifive_spi_ops, s,
                           TYPE_SIFIVE_SPI, 0x1000);
diff --git a/hw/ssi/xilinx_spi.c b/hw/ssi/xilinx_spi.c
index d4de2e7aab..e0ea0bb1cf 100644
--- a/hw/ssi/xilinx_spi.c
+++ b/hw/ssi/xilinx_spi.c
@@ -327,7 +327,6 @@ static void xilinx_spi_realize(DeviceState *dev, Error **errp)
 {
     SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
     XilinxSPI *s = XILINX_SPI(dev);
-    int i;
 
     DB_PRINT("\n");
 
@@ -335,9 +334,7 @@ static void xilinx_spi_realize(DeviceState *dev, Error **errp)
 
     sysbus_init_irq(sbd, &s->irq);
     s->cs_lines = g_new0(qemu_irq, s->num_cs);
-    for (i = 0; i < s->num_cs; ++i) {
-        sysbus_init_irq(sbd, &s->cs_lines[i]);
-    }
+    sysbus_init_irqs(sbd, s->cs_lines, s->num_cs);
 
     memory_region_init_io(&s->mmio, OBJECT(s), &spi_ops, s,
                           "xilinx-spi", R_MAX * 4);
diff --git a/hw/ssi/xilinx_spips.c b/hw/ssi/xilinx_spips.c
index 97009d3a5d..c696a07916 100644
--- a/hw/ssi/xilinx_spips.c
+++ b/hw/ssi/xilinx_spips.c
@@ -1294,9 +1294,7 @@ static void xilinx_spips_realize(DeviceState *dev, Error **errp)
     s->cs_lines_state = g_new0(bool, s->num_cs * s->num_busses);
 
     sysbus_init_irq(sbd, &s->irq);
-    for (i = 0; i < s->num_cs * s->num_busses; ++i) {
-        sysbus_init_irq(sbd, &s->cs_lines[i]);
-    }
+    sysbus_init_irqs(sbd, s->cs_lines, s->num_cs * s->num_busses);
 
     memory_region_init_io(&s->iomem, OBJECT(s), xsc->reg_ops, s,
                           "spi", XLNX_ZYNQMP_SPIPS_R_MAX * 4);
diff --git a/hw/ssi/xlnx-versal-ospi.c b/hw/ssi/xlnx-versal-ospi.c
index c762e0b367..b280fbedaf 100644
--- a/hw/ssi/xlnx-versal-ospi.c
+++ b/hw/ssi/xlnx-versal-ospi.c
@@ -1740,9 +1740,7 @@ static void xlnx_versal_ospi_realize(DeviceState *dev, Error **errp)
     s->num_cs = 4;
     s->spi = ssi_create_bus(dev, "spi0");
     s->cs_lines = g_new0(qemu_irq, s->num_cs);
-    for (int i = 0; i < s->num_cs; ++i) {
-        sysbus_init_irq(sbd, &s->cs_lines[i]);
-    }
+    sysbus_init_irqs(sbd, s->cs_lines, s->num_cs);
 
     fifo8_create(&s->rx_fifo, RXFF_SZ);
     fifo8_create(&s->tx_fifo, TXFF_SZ);
diff --git a/hw/timer/allwinner-a10-pit.c b/hw/timer/allwinner-a10-pit.c
index 971f78462a..1126d19127 100644
--- a/hw/timer/allwinner-a10-pit.c
+++ b/hw/timer/allwinner-a10-pit.c
@@ -263,9 +263,7 @@ static void a10_pit_init(Object *obj)
     SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
     uint8_t i;
 
-    for (i = 0; i < AW_A10_PIT_TIMER_NR; i++) {
-        sysbus_init_irq(sbd, &s->irq[i]);
-    }
+    sysbus_init_irqs(sbd, s->irq, AW_A10_PIT_TIMER_NR);
     memory_region_init_io(&s->iomem, OBJECT(s), &a10_pit_ops, s,
                           TYPE_AW_A10_PIT, 0x400);
     sysbus_init_mmio(sbd, &s->iomem);
diff --git a/hw/timer/exynos4210_mct.c b/hw/timer/exynos4210_mct.c
index 446bbd2b96..6a53068a1d 100644
--- a/hw/timer/exynos4210_mct.c
+++ b/hw/timer/exynos4210_mct.c
@@ -1521,9 +1521,7 @@ static void exynos4210_mct_init(Object *obj)
     }
 
     /* IRQs */
-    for (i = 0; i < MCT_GT_CMP_NUM; i++) {
-        sysbus_init_irq(dev, &s->g_timer.irq[i]);
-    }
+    sysbus_init_irqs(dev, s->g_timer.irq, MCT_GT_CMP_NUM);
     for (i = 0; i < 2; i++) {
         sysbus_init_irq(dev, &s->l_timer[i].irq);
     }
diff --git a/hw/timer/hpet.c b/hw/timer/hpet.c
index 6998094233..95b68f1c90 100644
--- a/hw/timer/hpet.c
+++ b/hw/timer/hpet.c
@@ -756,9 +756,7 @@ static void hpet_realize(DeviceState *dev, Error **errp)
 
     s->hpet_id = hpet_cfg.count++;
 
-    for (i = 0; i < HPET_NUM_IRQ_ROUTES; i++) {
-        sysbus_init_irq(sbd, &s->irqs[i]);
-    }
+    sysbus_init_irqs(sbd, s->irqs, HPET_NUM_IRQ_ROUTES);
 
     if (s->num_timers < HPET_MIN_TIMERS) {
         s->num_timers = HPET_MIN_TIMERS;
diff --git a/hw/timer/renesas_cmt.c b/hw/timer/renesas_cmt.c
index 69eabc678a..3fae6d40d7 100644
--- a/hw/timer/renesas_cmt.c
+++ b/hw/timer/renesas_cmt.c
@@ -225,15 +225,12 @@ static void rcmt_init(Object *obj)
 {
     SysBusDevice *d = SYS_BUS_DEVICE(obj);
     RCMTState *cmt = RCMT(obj);
-    int i;
 
     memory_region_init_io(&cmt->memory, OBJECT(cmt), &cmt_ops,
                           cmt, "renesas-cmt", 0x10);
     sysbus_init_mmio(d, &cmt->memory);
 
-    for (i = 0; i < ARRAY_SIZE(cmt->cmi); i++) {
-        sysbus_init_irq(d, &cmt->cmi[i]);
-    }
+    sysbus_init_irqs(d, cmt->cmi, ARRAY_SIZE(cmt->cmi));
     timer_init_ns(&cmt->timer[0], QEMU_CLOCK_VIRTUAL, timer_event0, cmt);
     timer_init_ns(&cmt->timer[1], QEMU_CLOCK_VIRTUAL, timer_event1, cmt);
 }
diff --git a/hw/timer/sifive_pwm.c b/hw/timer/sifive_pwm.c
index c664480ccf..d5f1273232 100644
--- a/hw/timer/sifive_pwm.c
+++ b/hw/timer/sifive_pwm.c
@@ -414,11 +414,8 @@ static Property sifive_pwm_properties[] = {
 static void sifive_pwm_init(Object *obj)
 {
     SiFivePwmState *s = SIFIVE_PWM(obj);
-    int i;
 
-    for (i = 0; i < SIFIVE_PWM_IRQS; i++) {
-        sysbus_init_irq(SYS_BUS_DEVICE(obj), &s->irqs[i]);
-    }
+    sysbus_init_irqs(SYS_BUS_DEVICE(obj), s->irqs, SIFIVE_PWM_IRQS);
 
     memory_region_init_io(&s->mmio, obj, &sifive_pwm_ops, s,
                           TYPE_SIFIVE_PWM, 0x100);
-- 
2.38.1



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

* [PATCH 7/7] hw: Simplify using sysbus_init_irqs() [manual]
  2023-05-31 22:33 [PATCH 0/7] hw/sysbus: Add sysbus_init_irqs and reduce SYSBUS_DEVICE_GPIO_IRQ scope Philippe Mathieu-Daudé
                   ` (5 preceding siblings ...)
  2023-05-31 22:33 ` [PATCH 6/7] hw: Simplify using sysbus_init_irqs() [automatic] Philippe Mathieu-Daudé
@ 2023-05-31 22:33 ` Philippe Mathieu-Daudé
  2023-06-01  3:13   ` Richard Henderson
  2023-06-01  5:59   ` Markus Armbruster
  6 siblings, 2 replies; 17+ messages in thread
From: Philippe Mathieu-Daudé @ 2023-05-31 22:33 UTC (permalink / raw)
  To: qemu-devel
  Cc: Thomas Huth, qemu-arm, qemu-ppc, Eduardo Habkost,
	Markus Armbruster, Marc-André Lureau, Mark Cave-Ayland,
	Philippe Mathieu-Daudé

Audit the sysbus_init_irq() calls and manually convert
to sysbus_init_irqs() when a loop is involved.

Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
 hw/intc/loongarch_extioi.c | 3 +--
 hw/intc/omap_intc.c        | 3 +--
 hw/pci-host/gpex.c         | 2 +-
 hw/timer/renesas_tmr.c     | 9 +++------
 4 files changed, 6 insertions(+), 11 deletions(-)

diff --git a/hw/intc/loongarch_extioi.c b/hw/intc/loongarch_extioi.c
index db941de20e..c579636215 100644
--- a/hw/intc/loongarch_extioi.c
+++ b/hw/intc/loongarch_extioi.c
@@ -275,8 +275,7 @@ static void loongarch_extioi_instance_init(Object *obj)
     LoongArchExtIOI *s = LOONGARCH_EXTIOI(obj);
     int cpu, pin;
 
-    sysbus_init_irqs(SYS_BUS_DEVICE(dev), s->irq, EXTIOI_IRQS);
-
+    sysbus_init_irqs(dev, s->irq, EXTIOI_IRQS);
     qdev_init_gpio_in(DEVICE(obj), extioi_setirq, EXTIOI_IRQS);
 
     for (cpu = 0; cpu < EXTIOI_CPUS; cpu++) {
diff --git a/hw/intc/omap_intc.c b/hw/intc/omap_intc.c
index 647bf324a8..f324b640e3 100644
--- a/hw/intc/omap_intc.c
+++ b/hw/intc/omap_intc.c
@@ -627,8 +627,7 @@ static void omap2_intc_init(Object *obj)
 
     s->level_only = 1;
     s->nbanks = 3;
-    sysbus_init_irq(sbd, &s->parent_intr[0]);
-    sysbus_init_irq(sbd, &s->parent_intr[1]);
+    sysbus_init_irqs(sbd, s->parent_intr, ARRAY_SIZE(s->parent_intr));
     qdev_init_gpio_in(dev, omap_set_intr_noedge, s->nbanks * 32);
     memory_region_init_io(&s->mmio, obj, &omap2_inth_mem_ops, s,
                           "omap2-intc", 0x1000);
diff --git a/hw/pci-host/gpex.c b/hw/pci-host/gpex.c
index a6752fac5e..7b46e3e36e 100644
--- a/hw/pci-host/gpex.c
+++ b/hw/pci-host/gpex.c
@@ -128,8 +128,8 @@ static void gpex_host_realize(DeviceState *dev, Error **errp)
         sysbus_init_mmio(sbd, &s->io_ioport);
     }
 
+    sysbus_init_irqs(sbd, s->irq, GPEX_NUM_IRQS);
     for (i = 0; i < GPEX_NUM_IRQS; i++) {
-        sysbus_init_irq(sbd, &s->irq[i]);
         s->irq_num[i] = -1;
     }
 
diff --git a/hw/timer/renesas_tmr.c b/hw/timer/renesas_tmr.c
index c15f654738..dd2929d6e7 100644
--- a/hw/timer/renesas_tmr.c
+++ b/hw/timer/renesas_tmr.c
@@ -428,17 +428,14 @@ static void rtmr_init(Object *obj)
 {
     SysBusDevice *d = SYS_BUS_DEVICE(obj);
     RTMRState *tmr = RTMR(obj);
-    int i;
 
     memory_region_init_io(&tmr->memory, OBJECT(tmr), &tmr_ops,
                           tmr, "renesas-tmr", 0x10);
     sysbus_init_mmio(d, &tmr->memory);
 
-    for (i = 0; i < ARRAY_SIZE(tmr->ovi); i++) {
-        sysbus_init_irq(d, &tmr->cmia[i]);
-        sysbus_init_irq(d, &tmr->cmib[i]);
-        sysbus_init_irq(d, &tmr->ovi[i]);
-    }
+    sysbus_init_irqs(d, tmr->cmia, ARRAY_SIZE(tmr->cmia));
+    sysbus_init_irqs(d, tmr->cmib, ARRAY_SIZE(tmr->cmib));
+    sysbus_init_irqs(d, tmr->ovi, ARRAY_SIZE(tmr->ovi));
     timer_init_ns(&tmr->timer[0], QEMU_CLOCK_VIRTUAL, timer_event0, tmr);
     timer_init_ns(&tmr->timer[1], QEMU_CLOCK_VIRTUAL, timer_event1, tmr);
 }
-- 
2.38.1



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

* Re: [PATCH 1/7] hw/arm/xlnx-versal: Do not open-code sysbus_connect_irq()
  2023-05-31 22:33 ` [PATCH 1/7] hw/arm/xlnx-versal: Do not open-code sysbus_connect_irq() Philippe Mathieu-Daudé
@ 2023-06-01  3:02   ` Richard Henderson
  0 siblings, 0 replies; 17+ messages in thread
From: Richard Henderson @ 2023-06-01  3:02 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé, qemu-devel
  Cc: Thomas Huth, qemu-arm, qemu-ppc, Eduardo Habkost,
	Markus Armbruster, Marc-André Lureau, Mark Cave-Ayland

On 5/31/23 15:33, Philippe Mathieu-Daudé wrote:
> The SYSBUS_DEVICE_GPIO_IRQ definition should be internal to
> the SysBus API. Here we simply open-coded sysbus_connect_irq().
> Replace to use the proper API.
> 
> Signed-off-by: Philippe Mathieu-Daudé<philmd@linaro.org>
> ---
>   hw/arm/xlnx-versal.c | 4 +---
>   1 file changed, 1 insertion(+), 3 deletions(-)

Reviewed-by: Richard Henderson <richard.henderson@linaro.org>

r~


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

* Re: [PATCH 2/7] hw/usb/xlnx: Do not open-code sysbus_pass_irq()
  2023-05-31 22:33 ` [PATCH 2/7] hw/usb/xlnx: Do not open-code sysbus_pass_irq() Philippe Mathieu-Daudé
@ 2023-06-01  3:04   ` Richard Henderson
  0 siblings, 0 replies; 17+ messages in thread
From: Richard Henderson @ 2023-06-01  3:04 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé, qemu-devel
  Cc: Thomas Huth, qemu-arm, qemu-ppc, Eduardo Habkost,
	Markus Armbruster, Marc-André Lureau, Mark Cave-Ayland

On 5/31/23 15:33, Philippe Mathieu-Daudé wrote:
> The SYSBUS_DEVICE_GPIO_IRQ definition should be internal to
> the SysBus API. Here we simply open-coded sysbus_pass_irq().
> Replace to use the proper API.
> 
> Signed-off-by: Philippe Mathieu-Daudé<philmd@linaro.org>
> ---
>   hw/usb/xlnx-usb-subsystem.c | 2 +-
>   1 file changed, 1 insertion(+), 1 deletion(-)

Reviewed-by: Richard Henderson <richard.henderson@linaro.org>

r~


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

* Re: [PATCH 3/7] hw/sysbus: Introduce sysbus_init_irqs()
  2023-05-31 22:33 ` [PATCH 3/7] hw/sysbus: Introduce sysbus_init_irqs() Philippe Mathieu-Daudé
@ 2023-06-01  3:08   ` Richard Henderson
  0 siblings, 0 replies; 17+ messages in thread
From: Richard Henderson @ 2023-06-01  3:08 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé, qemu-devel
  Cc: Thomas Huth, qemu-arm, qemu-ppc, Eduardo Habkost,
	Markus Armbruster, Marc-André Lureau, Mark Cave-Ayland

On 5/31/23 15:33, Philippe Mathieu-Daudé wrote:
> +void sysbus_init_irqs(SysBusDevice *dev, qemu_irq *p, unsigned count);

unsigned count does not match qdev_init_gpio_out_named int n.

Otherwise,
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>


r~


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

* Re: [PATCH 4/7] hw/usb/hcd-xhci: Use sysbus_init_irqs()
  2023-05-31 22:33 ` [PATCH 4/7] hw/usb/hcd-xhci: Use sysbus_init_irqs() Philippe Mathieu-Daudé
@ 2023-06-01  3:09   ` Richard Henderson
  0 siblings, 0 replies; 17+ messages in thread
From: Richard Henderson @ 2023-06-01  3:09 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé, qemu-devel
  Cc: Thomas Huth, qemu-arm, qemu-ppc, Eduardo Habkost,
	Markus Armbruster, Marc-André Lureau, Mark Cave-Ayland

On 5/31/23 15:33, Philippe Mathieu-Daudé wrote:
> The SYSBUS_DEVICE_GPIO_IRQ definition should be internal to
> the SysBus API. Use the recently introduced sysbus_init_irqs()
> method to avoid using this internal definition.
> 
> Signed-off-by: Philippe Mathieu-Daudé<philmd@linaro.org>
> ---
>   hw/usb/hcd-xhci-sysbus.c | 5 ++---
>   1 file changed, 2 insertions(+), 3 deletions(-)

Reviewed-by: Richard Henderson <richard.henderson@linaro.org>

r~


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

* Re: [PATCH 5/7] hw/sysbus: Make SYSBUS_DEVICE_GPIO_IRQ API internal
  2023-05-31 22:33 ` [PATCH 5/7] hw/sysbus: Make SYSBUS_DEVICE_GPIO_IRQ API internal Philippe Mathieu-Daudé
@ 2023-06-01  3:10   ` Richard Henderson
  0 siblings, 0 replies; 17+ messages in thread
From: Richard Henderson @ 2023-06-01  3:10 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé, qemu-devel
  Cc: Thomas Huth, qemu-arm, qemu-ppc, Eduardo Habkost,
	Markus Armbruster, Marc-André Lureau, Mark Cave-Ayland

On 5/31/23 15:33, Philippe Mathieu-Daudé wrote:
> Since we don't have any use of the SYSBUS_DEVICE_GPIO_IRQ definition
> outside of sysbus.c, we can reduce its scope, making it internal to
> the API.
> 
> Signed-off-by: Philippe Mathieu-Daudé<philmd@linaro.org>
> ---
>   include/hw/sysbus.h | 2 --
>   hw/core/sysbus.c    | 2 ++
>   2 files changed, 2 insertions(+), 2 deletions(-)

Yay!

Reviewed-by: Richard Henderson <richard.henderson@linaro.org>


r~


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

* Re: [PATCH 6/7] hw: Simplify using sysbus_init_irqs() [automatic]
  2023-05-31 22:33 ` [PATCH 6/7] hw: Simplify using sysbus_init_irqs() [automatic] Philippe Mathieu-Daudé
@ 2023-06-01  3:11   ` Richard Henderson
  0 siblings, 0 replies; 17+ messages in thread
From: Richard Henderson @ 2023-06-01  3:11 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé, qemu-devel
  Cc: Thomas Huth, qemu-arm, qemu-ppc, Eduardo Habkost,
	Markus Armbruster, Marc-André Lureau, Mark Cave-Ayland

On 5/31/23 15:33, Philippe Mathieu-Daudé wrote:
> Change created mechanically using the following coccinelle
> semantic patch:
> 
>      @@
>      expression array;
>      identifier i;
>      expression sbd, count;
>      @@
> 
>      -    for (i = 0; i < count; i++) {
>      -        sysbus_init_irq(sbd, &array[i]);
>      -    }
>      +    sysbus_init_irqs(sbd, array, count);
> 
> Signed-off-by: Philippe Mathieu-Daudé<philmd@linaro.org>
> ---

Reviewed-by: Richard Henderson <richard.henderson@linaro.org>

r~


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

* Re: [PATCH 7/7] hw: Simplify using sysbus_init_irqs() [manual]
  2023-05-31 22:33 ` [PATCH 7/7] hw: Simplify using sysbus_init_irqs() [manual] Philippe Mathieu-Daudé
@ 2023-06-01  3:13   ` Richard Henderson
  2023-06-01  5:59   ` Markus Armbruster
  1 sibling, 0 replies; 17+ messages in thread
From: Richard Henderson @ 2023-06-01  3:13 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé, qemu-devel
  Cc: Thomas Huth, qemu-arm, qemu-ppc, Eduardo Habkost,
	Markus Armbruster, Marc-André Lureau, Mark Cave-Ayland

On 5/31/23 15:33, Philippe Mathieu-Daudé wrote:
> Audit the sysbus_init_irq() calls and manually convert
> to sysbus_init_irqs() when a loop is involved.
> 
> Signed-off-by: Philippe Mathieu-Daudé<philmd@linaro.org>
> ---
>   hw/intc/loongarch_extioi.c | 3 +--
>   hw/intc/omap_intc.c        | 3 +--
>   hw/pci-host/gpex.c         | 2 +-
>   hw/timer/renesas_tmr.c     | 9 +++------
>   4 files changed, 6 insertions(+), 11 deletions(-)

Reviewed-by: Richard Henderson <richard.henderson@linaro.org>

r~


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

* Re: [PATCH 7/7] hw: Simplify using sysbus_init_irqs() [manual]
  2023-05-31 22:33 ` [PATCH 7/7] hw: Simplify using sysbus_init_irqs() [manual] Philippe Mathieu-Daudé
  2023-06-01  3:13   ` Richard Henderson
@ 2023-06-01  5:59   ` Markus Armbruster
  2023-06-01  8:58     ` Philippe Mathieu-Daudé
  1 sibling, 1 reply; 17+ messages in thread
From: Markus Armbruster @ 2023-06-01  5:59 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé
  Cc: qemu-devel, Thomas Huth, qemu-arm, qemu-ppc, Eduardo Habkost,
	Marc-André Lureau, Mark Cave-Ayland

Philippe Mathieu-Daudé <philmd@linaro.org> writes:

> Audit the sysbus_init_irq() calls and manually convert
> to sysbus_init_irqs() when a loop is involved.
>
> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
> ---
>  hw/intc/loongarch_extioi.c | 3 +--
>  hw/intc/omap_intc.c        | 3 +--
>  hw/pci-host/gpex.c         | 2 +-
>  hw/timer/renesas_tmr.c     | 9 +++------
>  4 files changed, 6 insertions(+), 11 deletions(-)
>
> diff --git a/hw/intc/loongarch_extioi.c b/hw/intc/loongarch_extioi.c
> index db941de20e..c579636215 100644
> --- a/hw/intc/loongarch_extioi.c
> +++ b/hw/intc/loongarch_extioi.c
> @@ -275,8 +275,7 @@ static void loongarch_extioi_instance_init(Object *obj)
>      LoongArchExtIOI *s = LOONGARCH_EXTIOI(obj);
>      int cpu, pin;
>  
> -    sysbus_init_irqs(SYS_BUS_DEVICE(dev), s->irq, EXTIOI_IRQS);
> -
> +    sysbus_init_irqs(dev, s->irq, EXTIOI_IRQS);

Commit message claims "when a loop is involved".  No loop here.  That
work was actually done in the previous patch:

  diff --git a/hw/intc/loongarch_extioi.c b/hw/intc/loongarch_extioi.c
  index 0e7a3e32f3..db941de20e 100644
  --- a/hw/intc/loongarch_extioi.c
  +++ b/hw/intc/loongarch_extioi.c
  @@ -273,11 +273,9 @@ static void loongarch_extioi_instance_init(Object *obj)
   {
       SysBusDevice *dev = SYS_BUS_DEVICE(obj);
       LoongArchExtIOI *s = LOONGARCH_EXTIOI(obj);
  -    int i, cpu, pin;
  +    int cpu, pin;

  -    for (i = 0; i < EXTIOI_IRQS; i++) {
  -        sysbus_init_irq(SYS_BUS_DEVICE(dev), &s->irq[i]);
  -    }
  +    sysbus_init_irqs(SYS_BUS_DEVICE(dev), s->irq, EXTIOI_IRQS);

       qdev_init_gpio_in(DEVICE(obj), extioi_setirq, EXTIOI_IRQS);

In this patch, you merely delete a superfluous type conversion that is
present even before your series.

There are more of them in this function.  Please delete them all, and in
a separate patch.

Actually, there are more elsewhere.  Coccinelle script

    @@
    typedef SysBusDevice;
    SysBusDevice *dev;
    @@
    -    SYS_BUS_DEVICE(dev)
    +    dev

finds some in hw/arm/xlnx-versal.c and hw/rx/rx62n.c, too.

Would be nice to do this for every QOM type, but I don't know how
without duplicating the semantic patch for each of them.  There are
almost 150 uses os OBJECT_DECLARE_TYPE()...

You might want to address this in a separate series, to not delay this
one.

>      qdev_init_gpio_in(DEVICE(obj), extioi_setirq, EXTIOI_IRQS);
>  
>      for (cpu = 0; cpu < EXTIOI_CPUS; cpu++) {
> diff --git a/hw/intc/omap_intc.c b/hw/intc/omap_intc.c
> index 647bf324a8..f324b640e3 100644
> --- a/hw/intc/omap_intc.c
> +++ b/hw/intc/omap_intc.c
> @@ -627,8 +627,7 @@ static void omap2_intc_init(Object *obj)
>  
>      s->level_only = 1;
>      s->nbanks = 3;
> -    sysbus_init_irq(sbd, &s->parent_intr[0]);
> -    sysbus_init_irq(sbd, &s->parent_intr[1]);
> +    sysbus_init_irqs(sbd, s->parent_intr, ARRAY_SIZE(s->parent_intr));

Unrolled loop.  s->parent_intr[] indeed has 2 elements.  Okay.

>      qdev_init_gpio_in(dev, omap_set_intr_noedge, s->nbanks * 32);
>      memory_region_init_io(&s->mmio, obj, &omap2_inth_mem_ops, s,
>                            "omap2-intc", 0x1000);

[...]



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

* Re: [PATCH 7/7] hw: Simplify using sysbus_init_irqs() [manual]
  2023-06-01  5:59   ` Markus Armbruster
@ 2023-06-01  8:58     ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 17+ messages in thread
From: Philippe Mathieu-Daudé @ 2023-06-01  8:58 UTC (permalink / raw)
  To: Markus Armbruster
  Cc: qemu-devel, Thomas Huth, qemu-arm, qemu-ppc, Eduardo Habkost,
	Marc-André Lureau, Mark Cave-Ayland

On 1/6/23 07:59, Markus Armbruster wrote:
> Philippe Mathieu-Daudé <philmd@linaro.org> writes:
> 
>> Audit the sysbus_init_irq() calls and manually convert
>> to sysbus_init_irqs() when a loop is involved.
>>
>> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
>> ---
>>   hw/intc/loongarch_extioi.c | 3 +--
>>   hw/intc/omap_intc.c        | 3 +--
>>   hw/pci-host/gpex.c         | 2 +-
>>   hw/timer/renesas_tmr.c     | 9 +++------
>>   4 files changed, 6 insertions(+), 11 deletions(-)
>>
>> diff --git a/hw/intc/loongarch_extioi.c b/hw/intc/loongarch_extioi.c
>> index db941de20e..c579636215 100644
>> --- a/hw/intc/loongarch_extioi.c
>> +++ b/hw/intc/loongarch_extioi.c
>> @@ -275,8 +275,7 @@ static void loongarch_extioi_instance_init(Object *obj)
>>       LoongArchExtIOI *s = LOONGARCH_EXTIOI(obj);
>>       int cpu, pin;
>>   
>> -    sysbus_init_irqs(SYS_BUS_DEVICE(dev), s->irq, EXTIOI_IRQS);
>> -
>> +    sysbus_init_irqs(dev, s->irq, EXTIOI_IRQS);
> 
> Commit message claims "when a loop is involved".  No loop here.  That
> work was actually done in the previous patch:
> 
>    diff --git a/hw/intc/loongarch_extioi.c b/hw/intc/loongarch_extioi.c
>    index 0e7a3e32f3..db941de20e 100644
>    --- a/hw/intc/loongarch_extioi.c
>    +++ b/hw/intc/loongarch_extioi.c
>    @@ -273,11 +273,9 @@ static void loongarch_extioi_instance_init(Object *obj)
>     {
>         SysBusDevice *dev = SYS_BUS_DEVICE(obj);
>         LoongArchExtIOI *s = LOONGARCH_EXTIOI(obj);
>    -    int i, cpu, pin;
>    +    int cpu, pin;
> 
>    -    for (i = 0; i < EXTIOI_IRQS; i++) {
>    -        sysbus_init_irq(SYS_BUS_DEVICE(dev), &s->irq[i]);
>    -    }
>    +    sysbus_init_irqs(SYS_BUS_DEVICE(dev), s->irq, EXTIOI_IRQS);
> 
>         qdev_init_gpio_in(DEVICE(obj), extioi_setirq, EXTIOI_IRQS);
> 
> In this patch, you merely delete a superfluous type conversion that is
> present even before your series.

Right. I guess I did that automatically "why are we casting the same
type?" without even noticing.

> There are more of them in this function.  Please delete them all, and in
> a separate patch.

OK.

> Actually, there are more elsewhere.  Coccinelle script
> 
>      @@
>      typedef SysBusDevice;
>      SysBusDevice *dev;
>      @@
>      -    SYS_BUS_DEVICE(dev)
>      +    dev
> 
> finds some in hw/arm/xlnx-versal.c and hw/rx/rx62n.c, too.
> 
> Would be nice to do this for every QOM type, but I don't know how
> without duplicating the semantic patch for each of them.  There are
> almost 150 uses os OBJECT_DECLARE_TYPE()...

Checking all QOM macros, I counted 1076 types...



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

end of thread, other threads:[~2023-06-01  8:59 UTC | newest]

Thread overview: 17+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-05-31 22:33 [PATCH 0/7] hw/sysbus: Add sysbus_init_irqs and reduce SYSBUS_DEVICE_GPIO_IRQ scope Philippe Mathieu-Daudé
2023-05-31 22:33 ` [PATCH 1/7] hw/arm/xlnx-versal: Do not open-code sysbus_connect_irq() Philippe Mathieu-Daudé
2023-06-01  3:02   ` Richard Henderson
2023-05-31 22:33 ` [PATCH 2/7] hw/usb/xlnx: Do not open-code sysbus_pass_irq() Philippe Mathieu-Daudé
2023-06-01  3:04   ` Richard Henderson
2023-05-31 22:33 ` [PATCH 3/7] hw/sysbus: Introduce sysbus_init_irqs() Philippe Mathieu-Daudé
2023-06-01  3:08   ` Richard Henderson
2023-05-31 22:33 ` [PATCH 4/7] hw/usb/hcd-xhci: Use sysbus_init_irqs() Philippe Mathieu-Daudé
2023-06-01  3:09   ` Richard Henderson
2023-05-31 22:33 ` [PATCH 5/7] hw/sysbus: Make SYSBUS_DEVICE_GPIO_IRQ API internal Philippe Mathieu-Daudé
2023-06-01  3:10   ` Richard Henderson
2023-05-31 22:33 ` [PATCH 6/7] hw: Simplify using sysbus_init_irqs() [automatic] Philippe Mathieu-Daudé
2023-06-01  3:11   ` Richard Henderson
2023-05-31 22:33 ` [PATCH 7/7] hw: Simplify using sysbus_init_irqs() [manual] Philippe Mathieu-Daudé
2023-06-01  3:13   ` Richard Henderson
2023-06-01  5:59   ` Markus Armbruster
2023-06-01  8:58     ` Philippe Mathieu-Daudé

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).