-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy path0005-hw-intc-allwinner-f1c100s-intc-fix-interrupt-control.patch
92 lines (85 loc) · 3.32 KB
/
0005-hw-intc-allwinner-f1c100s-intc-fix-interrupt-control.patch
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
From 2f231a0ec11f8c16a6e965361193d46bcbb4cf79 Mon Sep 17 00:00:00 2001
From: LuHui <[email protected]>
Date: Tue, 14 Mar 2023 21:24:19 +0800
Subject: [PATCH 5/6] hw/intc/allwinner-f1c100s-intc: fix interrupt controller
not working on FreeRTOS
Signed-off-by: LuHui <[email protected]>
---
hw/arm/allwinner-f1c100s.c | 2 --
hw/intc/allwinner-f1c100s-intc.c | 18 +++++++++---------
include/hw/intc/allwinner-f1c100s-intc.h | 1 -
3 files changed, 9 insertions(+), 12 deletions(-)
diff --git a/hw/arm/allwinner-f1c100s.c b/hw/arm/allwinner-f1c100s.c
index a7c0638897..1beca17543 100644
--- a/hw/arm/allwinner-f1c100s.c
+++ b/hw/arm/allwinner-f1c100s.c
@@ -173,8 +173,6 @@ static void aw_f1c100s_realize(DeviceState *dev, Error **errp)
s->memmap[AW_F1C100S_DEV_INTC]);
sysbus_connect_irq(SYS_BUS_DEVICE(&s->intc), 0,
qdev_get_gpio_in(DEVICE(&s->cpu), ARM_CPU_IRQ));
- sysbus_connect_irq(SYS_BUS_DEVICE(&s->intc), 1,
- qdev_get_gpio_in(DEVICE(&s->cpu), ARM_CPU_FIQ));
qdev_pass_gpios(DEVICE(&s->intc), dev, NULL);
/* timer */
diff --git a/hw/intc/allwinner-f1c100s-intc.c b/hw/intc/allwinner-f1c100s-intc.c
index 615df3b1e2..148b671567 100644
--- a/hw/intc/allwinner-f1c100s-intc.c
+++ b/hw/intc/allwinner-f1c100s-intc.c
@@ -2,6 +2,7 @@
* Allwinner f1c100s interrupt controller device emulation
*
* Copyright (C) 2023 Lu Hui <[email protected]>
+ * Copyright (C) 2023 zhaosx <[email protected]>
*
* a lot of code copy from ./allwinner-a10-pit.c:
* Copyright (C) 2013 Li Guang
@@ -42,22 +43,22 @@ static void aw_f1c100s_intc_update(AwF1c100sIntcState *s)
{
int i;
int zeroes;
- int irq[2];
+ int irq;
+ int irq_trigger = 0;
s->vector = 0;
for (i = 0 ; i < 2; i++) {
- irq[i] |= s->pending[i] & s->enable[i];
- irq[i] |= s->pending[i] & ~s->mask[i];
+ irq = ~s->mask[i] & s->enable[i];
if (!s->vector) {
- zeroes = ctz32(irq[i]);
- if (zeroes != 32) {
+ zeroes = ctz32(irq & s->pending[i]);
+ if ((zeroes != 32) && (irq_trigger == 0) ) {
s->vector = (i * 32 + zeroes) * 4;
+ s->pending[i] |= ~(0x1 << zeroes);
+ irq_trigger = 1;
}
}
}
-
- qemu_set_irq(s->parent_irq, !!irq[0]);
- qemu_set_irq(s->parent_fiq, !!irq[1]);
+ qemu_set_irq(s->parent_irq, !!irq_trigger);
}
static void aw_f1c100s_intc_set_irq(void *opaque, int irq, int level)
@@ -162,7 +163,6 @@ static void aw_f1c100s_intc_init(Object *obj)
/* f1c100s have 41 irq */
qdev_init_gpio_in(DEVICE(dev), aw_f1c100s_intc_set_irq, 41);
sysbus_init_irq(dev, &s->parent_irq);
- sysbus_init_irq(dev, &s->parent_fiq);
memory_region_init_io(&s->iomem, OBJECT(s), &aw_f1c100s_intc_ops, s,
TYPE_AW_F1C100S_INTC, 0x400);
sysbus_init_mmio(dev, &s->iomem);
diff --git a/include/hw/intc/allwinner-f1c100s-intc.h b/include/hw/intc/allwinner-f1c100s-intc.h
index 78db5322f0..e61ff6adac 100644
--- a/include/hw/intc/allwinner-f1c100s-intc.h
+++ b/include/hw/intc/allwinner-f1c100s-intc.h
@@ -12,7 +12,6 @@ struct AwF1c100sIntcState {
SysBusDevice parent_obj;
/*< public >*/
MemoryRegion iomem;
- qemu_irq parent_fiq;
qemu_irq parent_irq;
uint32_t vector;
--
2.35.7