Re: [PATCH v2 04/12] mos6522: switch over to use qdev gpios for IRQs

2022-03-03 Thread Laurent Vivier

Le 24/02/2022 à 12:59, Mark Cave-Ayland a écrit :

For historical reasons each mos6522 instance implements its own setting and
update of the IFR flag bits using methods exposed by MOS6522DeviceClass. As
of today this is no longer required, and it is now possible to implement
the mos6522 IRQs as standard qdev gpios.

Switch over to use qdev gpios for the mos6522 device and update all instances
accordingly.

Signed-off-by: Mark Cave-Ayland 
Reviewed-by: Peter Maydell 
---
  hw/misc/mac_via.c | 56 +++
  hw/misc/macio/cuda.c  |  5 ++--
  hw/misc/macio/pmu.c   |  4 +--
  hw/misc/mos6522.c | 15 +++
  include/hw/misc/mac_via.h |  5 
  include/hw/misc/mos6522.h |  2 ++
  6 files changed, 31 insertions(+), 56 deletions(-)



Reviewed-by: Laurent Vivier 





[PATCH v2 04/12] mos6522: switch over to use qdev gpios for IRQs

2022-02-24 Thread Mark Cave-Ayland
For historical reasons each mos6522 instance implements its own setting and
update of the IFR flag bits using methods exposed by MOS6522DeviceClass. As
of today this is no longer required, and it is now possible to implement
the mos6522 IRQs as standard qdev gpios.

Switch over to use qdev gpios for the mos6522 device and update all instances
accordingly.

Signed-off-by: Mark Cave-Ayland 
Reviewed-by: Peter Maydell 
---
 hw/misc/mac_via.c | 56 +++
 hw/misc/macio/cuda.c  |  5 ++--
 hw/misc/macio/pmu.c   |  4 +--
 hw/misc/mos6522.c | 15 +++
 include/hw/misc/mac_via.h |  5 
 include/hw/misc/mos6522.h |  2 ++
 6 files changed, 31 insertions(+), 56 deletions(-)

diff --git a/hw/misc/mac_via.c b/hw/misc/mac_via.c
index 71b74c3372..80eb433044 100644
--- a/hw/misc/mac_via.c
+++ b/hw/misc/mac_via.c
@@ -325,10 +325,9 @@ static void via1_sixty_hz(void *opaque)
 {
 MOS6522Q800VIA1State *v1s = opaque;
 MOS6522State *s = MOS6522(v1s);
-MOS6522DeviceClass *mdc = MOS6522_GET_CLASS(s);
+qemu_irq irq = qdev_get_gpio_in(DEVICE(s), VIA1_IRQ_60HZ_BIT);
 
-s->ifr |= VIA1_IRQ_60HZ;
-mdc->update_irq(s);
+qemu_set_irq(irq, 1);
 
 via1_sixty_hz_update(v1s);
 }
@@ -337,44 +336,13 @@ static void via1_one_second(void *opaque)
 {
 MOS6522Q800VIA1State *v1s = opaque;
 MOS6522State *s = MOS6522(v1s);
-MOS6522DeviceClass *mdc = MOS6522_GET_CLASS(s);
+qemu_irq irq = qdev_get_gpio_in(DEVICE(s), VIA1_IRQ_ONE_SECOND_BIT);
 
-s->ifr |= VIA1_IRQ_ONE_SECOND;
-mdc->update_irq(s);
+qemu_set_irq(irq, 1);
 
 via1_one_second_update(v1s);
 }
 
-static void via1_irq_request(void *opaque, int irq, int level)
-{
-MOS6522Q800VIA1State *v1s = opaque;
-MOS6522State *s = MOS6522(v1s);
-MOS6522DeviceClass *mdc = MOS6522_GET_CLASS(s);
-
-if (level) {
-s->ifr |= 1 << irq;
-} else {
-s->ifr &= ~(1 << irq);
-}
-
-mdc->update_irq(s);
-}
-
-static void via2_irq_request(void *opaque, int irq, int level)
-{
-MOS6522Q800VIA2State *v2s = opaque;
-MOS6522State *s = MOS6522(v2s);
-MOS6522DeviceClass *mdc = MOS6522_GET_CLASS(s);
-
-if (level) {
-s->ifr |= 1 << irq;
-} else {
-s->ifr &= ~(1 << irq);
-}
-
-mdc->update_irq(s);
-}
-
 
 static void pram_update(MOS6522Q800VIA1State *v1s)
 {
@@ -1061,8 +1029,6 @@ static void mos6522_q800_via1_init(Object *obj)
 qbus_init((BusState *)&v1s->adb_bus, sizeof(v1s->adb_bus),
   TYPE_ADB_BUS, DEVICE(v1s), "adb.0");
 
-qdev_init_gpio_in(DEVICE(obj), via1_irq_request, VIA1_IRQ_NB);
-
 /* A/UX mode */
 qdev_init_gpio_out(DEVICE(obj), &v1s->auxmode_irq, 1);
 }
@@ -1150,22 +1116,20 @@ static void mos6522_q800_via2_reset(DeviceState *dev)
 ms->a = 0x7f;
 }
 
-static void via2_nubus_irq_request(void *opaque, int irq, int level)
+static void via2_nubus_irq_request(void *opaque, int n, int level)
 {
 MOS6522Q800VIA2State *v2s = opaque;
 MOS6522State *s = MOS6522(v2s);
-MOS6522DeviceClass *mdc = MOS6522_GET_CLASS(s);
+qemu_irq irq = qdev_get_gpio_in(DEVICE(s), VIA2_IRQ_NUBUS_BIT);
 
 if (level) {
 /* Port A nubus IRQ inputs are active LOW */
-s->a &= ~(1 << irq);
-s->ifr |= 1 << VIA2_IRQ_NUBUS_BIT;
+s->a &= ~(1 << n);
 } else {
-s->a |= (1 << irq);
-s->ifr &= ~(1 << VIA2_IRQ_NUBUS_BIT);
+s->a |= (1 << n);
 }
 
-mdc->update_irq(s);
+qemu_set_irq(irq, level);
 }
 
 static void mos6522_q800_via2_init(Object *obj)
@@ -1177,8 +1141,6 @@ static void mos6522_q800_via2_init(Object *obj)
   "via2", VIA_SIZE);
 sysbus_init_mmio(sbd, &v2s->via_mem);
 
-qdev_init_gpio_in(DEVICE(obj), via2_irq_request, VIA2_IRQ_NB);
-
 qdev_init_gpio_in_named(DEVICE(obj), via2_nubus_irq_request, "nubus-irq",
 VIA2_NUBUS_IRQ_NB);
 }
diff --git a/hw/misc/macio/cuda.c b/hw/misc/macio/cuda.c
index 233daf1405..693fc82e05 100644
--- a/hw/misc/macio/cuda.c
+++ b/hw/misc/macio/cuda.c
@@ -24,6 +24,7 @@
  */
 
 #include "qemu/osdep.h"
+#include "hw/irq.h"
 #include "hw/ppc/mac.h"
 #include "hw/qdev-properties.h"
 #include "migration/vmstate.h"
@@ -96,9 +97,9 @@ static void cuda_set_sr_int(void *opaque)
 CUDAState *s = opaque;
 MOS6522CUDAState *mcs = &s->mos6522_cuda;
 MOS6522State *ms = MOS6522(mcs);
-MOS6522DeviceClass *mdc = MOS6522_GET_CLASS(ms);
+qemu_irq irq = qdev_get_gpio_in(DEVICE(ms), SR_INT_BIT);
 
-mdc->set_sr_int(ms);
+qemu_set_irq(irq, 1);
 }
 
 static void cuda_delay_set_sr_int(CUDAState *s)
diff --git a/hw/misc/macio/pmu.c b/hw/misc/macio/pmu.c
index 76c608ee19..b210068ab7 100644
--- a/hw/misc/macio/pmu.c
+++ b/hw/misc/macio/pmu.c
@@ -75,9 +75,9 @@ static void via_set_sr_int(void *opaque)
 PMUState *s = opaque;
 MOS6522PMUState *mps = MOS6522_PMU(&s->mos6522_pmu);
 MOS6522State *ms = MOS6522(mps);
-MOS6522DeviceClass *mdc