[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 12/15] hw/timer/arm_timer: Pass timer output IRQ as parameter to
From: |
Philippe Mathieu-Daudé |
Subject: |
[PATCH 12/15] hw/timer/arm_timer: Pass timer output IRQ as parameter to arm_timer_new |
Date: |
Wed, 31 May 2023 22:35:56 +0200 |
Both SP804State/IcpPitState peek at ArmTimerState internal state.
This is fine so far but we want to convert ArmTimerState to QOM
where peeking at QOM state internal should be avoided.
ArmTimerState's IRQ is just a pointer, so we can pass/set it via
argument, avoiding accessing ArmTimerState internal state except
from the arm_timer_*() methods.
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
hw/timer/arm_timer.c | 15 +++++++++------
1 file changed, 9 insertions(+), 6 deletions(-)
diff --git a/hw/timer/arm_timer.c b/hw/timer/arm_timer.c
index 19789ad2c4..6f444e1789 100644
--- a/hw/timer/arm_timer.c
+++ b/hw/timer/arm_timer.c
@@ -177,7 +177,7 @@ static void arm_timer_reset(ArmTimerState *s)
s->control = TIMER_CTRL_IE;
}
-static ArmTimerState *arm_timer_new(uint32_t freq)
+static ArmTimerState *arm_timer_new(uint32_t freq, qemu_irq irq_out)
{
ArmTimerState *s;
@@ -185,6 +185,7 @@ static ArmTimerState *arm_timer_new(uint32_t freq)
s->freq = freq;
arm_timer_reset(s);
+ s->irq = irq_out;
s->timer = ptimer_init(arm_timer_tick, s, PTIMER_POLICY_LEGACY);
vmstate_register(NULL, VMSTATE_INSTANCE_ID_ANY, &vmstate_arm_timer, s);
return s;
@@ -207,6 +208,7 @@ struct SP804State {
uint32_t freq[2];
int level[2];
qemu_irq irq;
+ qemu_irq irq_in[2];
};
static const uint8_t sp804_ids[] = {
@@ -309,8 +311,8 @@ static void sp804_realize(DeviceState *dev, Error **errp)
SP804State *s = SP804(dev);
for (unsigned i = 0; i < ARRAY_SIZE(s->timer); i++) {
- s->timer[i] = arm_timer_new(s->freq[i]);
- s->timer[i]->irq = qemu_allocate_irq(sp804_set_irq, s, i);
+ s->irq_in[i] = qemu_allocate_irq(sp804_set_irq, s, i);
+ s->timer[i] = arm_timer_new(s->freq[i], s->irq_in[i]);
}
}
@@ -319,7 +321,7 @@ static void sp804_unrealize(DeviceState *dev)
SP804State *s = SP804(dev);
for (unsigned i = 0; i < ARRAY_SIZE(s->timer); i++) {
- qemu_free_irq(s->timer[i]->irq);
+ qemu_free_irq(s->irq_in[i]);
}
}
@@ -349,6 +351,7 @@ struct IntegratorPitState {
MemoryRegion iomem;
ArmTimerState *timer[3];
+ qemu_irq irq_in[3];
};
static uint64_t icp_pit_read(void *opaque, hwaddr offset,
@@ -400,8 +403,8 @@ static void icp_pit_init(Object *obj)
SysBusDevice *dev = SYS_BUS_DEVICE(obj);
for (unsigned i = 0; i < ARRAY_SIZE(s->timer); i++) {
- s->timer[i] = arm_timer_new(tmr_freq[i]);
- sysbus_init_irq(dev, &s->timer[i]->irq);
+ s->timer[i] = arm_timer_new(tmr_freq[i], s->irq_in[i]);
+ sysbus_init_irq(dev, &s->irq_in[i]);
}
memory_region_init_io(&s->iomem, obj, &icp_pit_ops, s,
--
2.38.1
- [PATCH 02/15] hw/timer/arm_timer: Move SP804 code around, (continued)
- [PATCH 02/15] hw/timer/arm_timer: Move SP804 code around, Philippe Mathieu-Daudé, 2023/05/31
- [PATCH 03/15] hw/timer/arm_timer: Add missing sp804_unrealize() handler, Philippe Mathieu-Daudé, 2023/05/31
- [PATCH 04/15] hw/timer/arm_timer: Remove pointless cast from void *, Philippe Mathieu-Daudé, 2023/05/31
- [PATCH 05/15] hw/timer/arm_timer: CamelCase rename icp_pit_state -> IntegratorPitState, Philippe Mathieu-Daudé, 2023/05/31
- [PATCH 06/15] hw/timer/arm_timer: CamelCase rename arm_timer_state -> ArmTimerState, Philippe Mathieu-Daudé, 2023/05/31
- [PATCH 07/15] hw/timer/arm_timer: Extract arm_timer_reset(), Philippe Mathieu-Daudé, 2023/05/31
- [PATCH 08/15] hw/timer/arm_timer: Rename arm_timer_init() -> arm_timer_new(), Philippe Mathieu-Daudé, 2023/05/31
- [PATCH 09/15] hw/timer/arm_timer: Convert ArmTimerState::freq to uint32_t type, Philippe Mathieu-Daudé, 2023/05/31
- [PATCH 10/15] hw/timer/arm_timer: Use array of frequency in SP804State, Philippe Mathieu-Daudé, 2023/05/31
- [PATCH 11/15] hw/timer/arm_timer: Iterate on timers using for() loop statement, Philippe Mathieu-Daudé, 2023/05/31
- [PATCH 12/15] hw/timer/arm_timer: Pass timer output IRQ as parameter to arm_timer_new,
Philippe Mathieu-Daudé <=
- [PATCH 13/15] hw/timer/arm_timer: Fix misuse of SysBus IRQ in IcpPitState, Philippe Mathieu-Daudé, 2023/05/31
- [PATCH 14/15] hw/timer/arm_timer: Extract icp_pit_realize() from icp_pit_init(), Philippe Mathieu-Daudé, 2023/05/31
- [PATCH 15/15] hw/timer/arm_timer: QOM'ify ARM_TIMER, Philippe Mathieu-Daudé, 2023/05/31