[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 13/15] hw/timer/arm_timer: Fix misuse of SysBus IRQ in IcpPitStat
|
From: |
Philippe Mathieu-Daudé |
|
Subject: |
[PATCH 13/15] hw/timer/arm_timer: Fix misuse of SysBus IRQ in IcpPitState |
|
Date: |
Wed, 31 May 2023 22:35:57 +0200 |
SysBus IRQ are *output* IRQs. As some sort of simplification
to avoid to forward it, IcpPitState misuses it as ARM timer
input IRQ. Fix that by using a simple IRQ forwarder handler.
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
hw/timer/arm_timer.c | 15 ++++++++++++++-
1 file changed, 14 insertions(+), 1 deletion(-)
diff --git a/hw/timer/arm_timer.c b/hw/timer/arm_timer.c
index 6f444e1789..874f9b63bc 100644
--- a/hw/timer/arm_timer.c
+++ b/hw/timer/arm_timer.c
@@ -352,6 +352,7 @@ struct IntegratorPitState {
MemoryRegion iomem;
ArmTimerState *timer[3];
qemu_irq irq_in[3];
+ qemu_irq irq[3];
};
static uint64_t icp_pit_read(void *opaque, hwaddr offset,
@@ -391,6 +392,13 @@ static const MemoryRegionOps icp_pit_ops = {
.endianness = DEVICE_NATIVE_ENDIAN,
};
+static void icp_pit_fwd_irq(void *opaque, int n, int level)
+{
+ IntegratorPitState *s = opaque;
+
+ qemu_set_irq(s->irq[n], level);
+}
+
static void icp_pit_init(Object *obj)
{
static const uint32_t tmr_freq[] = {
@@ -402,9 +410,14 @@ static void icp_pit_init(Object *obj)
IntegratorPitState *s = INTEGRATOR_PIT(obj);
SysBusDevice *dev = SYS_BUS_DEVICE(obj);
+ qdev_init_gpio_in_named(DEVICE(obj), icp_pit_fwd_irq,
+ "timer-in", ARRAY_SIZE(s->timer));
+
for (unsigned i = 0; i < ARRAY_SIZE(s->timer); i++) {
s->timer[i] = arm_timer_new(tmr_freq[i], s->irq_in[i]);
- sysbus_init_irq(dev, &s->irq_in[i]);
+ sysbus_init_irq(dev, &s->irq[i]);
+ sysbus_connect_irq(dev, i,
+ qdev_get_gpio_in_named(DEVICE(obj), "timer-in", i));
}
memory_region_init_io(&s->iomem, obj, &icp_pit_ops, s,
--
2.38.1
- [PATCH 03/15] hw/timer/arm_timer: Add missing sp804_unrealize() handler, (continued)
- [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é, 2023/05/31
- [PATCH 13/15] hw/timer/arm_timer: Fix misuse of SysBus IRQ in IcpPitState,
Philippe Mathieu-Daudé <=
- [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