Am 21. Januar 2025 08:44:52 UTC schrieb "Philippe Mathieu-Daudé"
<phi...@linaro.org>:
>No need to dynamically allocate IRQ when we know before hands
>how many we'll use. Declare the 2 of them in IPackDevice state
>and initialize them in the DeviceRealize handler.
>
>Signed-off-by: Philippe Mathieu-Daudé <phi...@linaro.org>
>---
> include/hw/ipack/ipack.h | 7 ++-----
> hw/char/ipoctal232.c | 4 ++--
> hw/ipack/ipack.c | 7 +++----
> hw/ipack/tpci200.c | 6 +++---
> 4 files changed, 10 insertions(+), 14 deletions(-)
>
>diff --git a/include/hw/ipack/ipack.h b/include/hw/ipack/ipack.h
>index cbcdda509d3..00f397fd020 100644
>--- a/include/hw/ipack/ipack.h
>+++ b/include/hw/ipack/ipack.h
>@@ -12,6 +12,7 @@
> #define QEMU_IPACK_H
>
> #include "hw/qdev-core.h"
>+#include "hw/irq.h"
> #include "qom/object.h"
>
>
>@@ -19,10 +20,8 @@
> OBJECT_DECLARE_SIMPLE_TYPE(IPackBus, IPACK_BUS)
>
> struct IPackBus {
>- /*< private >*/
> BusState parent_obj;
>
>- /* All fields are private */
> uint8_t n_slots;
> uint8_t free_slot;
> qemu_irq_handler set_irq;
>@@ -58,13 +57,11 @@ struct IPackDeviceClass {
> };
>
> struct IPackDevice {
>- /*< private >*/
> DeviceState parent_obj;
>- /*< public >*/
>
> int32_t slot;
> /* IRQ objects for the IndustryPack INT0# and INT1# */
>- qemu_irq *irq;
>+ IRQState irq[2];
> };
>
> extern const VMStateDescription vmstate_ipack_device;
>diff --git a/hw/char/ipoctal232.c b/hw/char/ipoctal232.c
>index d1e5f6dad2e..a2879977fb3 100644
>--- a/hw/char/ipoctal232.c
>+++ b/hw/char/ipoctal232.c
>@@ -184,9 +184,9 @@ static void update_irq(IPOctalState *dev, unsigned block)
> unsigned intno = block / 2;
>
> if ((blk0->isr & blk0->imr) || (blk1->isr & blk1->imr)) {
>- qemu_irq_raise(idev->irq[intno]);
>+ qemu_irq_raise(&idev->irq[intno]);
> } else {
>- qemu_irq_lower(idev->irq[intno]);
>+ qemu_irq_lower(&idev->irq[intno]);
> }
> }
>
>diff --git a/hw/ipack/ipack.c b/hw/ipack/ipack.c
>index ed75f791832..eeb48dd331c 100644
>--- a/hw/ipack/ipack.c
>+++ b/hw/ipack/ipack.c
>@@ -55,22 +55,21 @@ static void ipack_device_realize(DeviceState *dev, Error
>**errp)
> }
> bus->free_slot = idev->slot + 1;
>
>- idev->irq = qemu_allocate_irqs(bus->set_irq, idev, 2);
>+ for (int i = 0; i < ARRAY_SIZE(idev->irq); i++) {
>+ qemu_init_irq(&idev->irq[i], bus->set_irq, idev, i);
I wonder if we eventually need a qemu_init_irqs() (note the plural) as we
remove further uses of qemu_allocate_irqs().
>+ }
>
> k->realize(dev, errp);
> }
>
> static void ipack_device_unrealize(DeviceState *dev)
> {
>- IPackDevice *idev = IPACK_DEVICE(dev);
> IPackDeviceClass *k = IPACK_DEVICE_GET_CLASS(dev);
>
> if (k->unrealize) {
> k->unrealize(dev);
> return;
> }
>-
>- qemu_free_irqs(idev->irq, 2);
> }
>
> static const Property ipack_device_props[] = {
>diff --git a/hw/ipack/tpci200.c b/hw/ipack/tpci200.c
>index 88eef4b8308..470a4203ae4 100644
>--- a/hw/ipack/tpci200.c
>+++ b/hw/ipack/tpci200.c
>@@ -275,11 +275,11 @@ static void tpci200_write_las0(void *opaque, hwaddr
>addr, uint64_t val,
> if (ip != NULL) {
> if (val & STATUS_INT(i, 0)) {
> DPRINTF("Clear IP %c INT0# status\n", 'A' + i);
>- qemu_irq_lower(ip->irq[0]);
>+ qemu_irq_lower(&ip->irq[0]);
> }
> if (val & STATUS_INT(i, 1)) {
> DPRINTF("Clear IP %c INT1# status\n", 'A' + i);
>- qemu_irq_lower(ip->irq[1]);
>+ qemu_irq_lower(&ip->irq[1]);
> }
> }
>
>@@ -344,7 +344,7 @@ static uint64_t tpci200_read_las1(void *opaque, hwaddr
>addr, unsigned size)
> bool int_set = s->status & STATUS_INT(ip_n, intno);
> bool int_edge_sensitive = s->ctrl[ip_n] &
> CTRL_INT_EDGE(intno);
> if (int_set && !int_edge_sensitive) {
>- qemu_irq_lower(ip->irq[intno]);
>+ qemu_irq_lower(&ip->irq[intno]);
> }
> }
>
With the above addressed:
Reviewed-by: Bernhard Beschow <shen...@gmail.com>