1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24#ifndef HW_ARM_GICV3_COMMON_H
25#define HW_ARM_GICV3_COMMON_H
26
27#include "hw/sysbus.h"
28#include "hw/intc/arm_gic_common.h"
29#include "qom/object.h"
30
31
32
33
34
35
36#define GICV3_MAXIRQ 1020
37#define GICV3_MAXSPI (GICV3_MAXIRQ - GIC_INTERNAL)
38
39#define GICV3_LPI_INTID_START 8192
40
41#define GICV3_REDIST_SIZE 0x20000
42
43
44#define GICV3_TARGETLIST_BITS 16
45
46
47#define GICV3_LR_MAX 16
48
49
50#define GIC_MIN_BPR 0
51
52#define GIC_MIN_BPR_NS (GIC_MIN_BPR + 1)
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68#define GICV3_BMP_SIZE DIV_ROUND_UP(GICV3_MAXIRQ, 32)
69
70#define GIC_DECLARE_BITMAP(name) \
71 uint32_t name[GICV3_BMP_SIZE]
72
73#define GIC_BIT_MASK(nr) (1U << ((nr) % 32))
74#define GIC_BIT_WORD(nr) ((nr) / 32)
75
76static inline void gic_bmp_set_bit(int nr, uint32_t *addr)
77{
78 uint32_t mask = GIC_BIT_MASK(nr);
79 uint32_t *p = addr + GIC_BIT_WORD(nr);
80
81 *p |= mask;
82}
83
84static inline void gic_bmp_clear_bit(int nr, uint32_t *addr)
85{
86 uint32_t mask = GIC_BIT_MASK(nr);
87 uint32_t *p = addr + GIC_BIT_WORD(nr);
88
89 *p &= ~mask;
90}
91
92static inline int gic_bmp_test_bit(int nr, const uint32_t *addr)
93{
94 return 1U & (addr[GIC_BIT_WORD(nr)] >> (nr & 31));
95}
96
97static inline void gic_bmp_replace_bit(int nr, uint32_t *addr, int val)
98{
99 uint32_t mask = GIC_BIT_MASK(nr);
100 uint32_t *p = addr + GIC_BIT_WORD(nr);
101
102 *p &= ~mask;
103 *p |= (val & 1U) << (nr % 32);
104}
105
106
107static inline uint32_t *gic_bmp_ptr32(uint32_t *addr, int nr)
108{
109 return addr + GIC_BIT_WORD(nr);
110}
111
112typedef struct GICv3State GICv3State;
113typedef struct GICv3CPUState GICv3CPUState;
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133#define GICV3_G0 0
134#define GICV3_G1 1
135#define GICV3_G1NS 2
136
137
138
139
140
141
142#define GICV3_S 0
143#define GICV3_NS 1
144
145typedef struct {
146 int irq;
147 uint8_t prio;
148 int grp;
149} PendingIrq;
150
151struct GICv3CPUState {
152 GICv3State *gic;
153 CPUState *cpu;
154 qemu_irq parent_irq;
155 qemu_irq parent_fiq;
156 qemu_irq parent_virq;
157 qemu_irq parent_vfiq;
158
159
160 uint32_t level;
161
162 uint32_t gicr_ctlr;
163 uint64_t gicr_typer;
164 uint32_t gicr_statusr[2];
165 uint32_t gicr_waker;
166 uint64_t gicr_propbaser;
167 uint64_t gicr_pendbaser;
168
169 uint32_t gicr_igroupr0;
170 uint32_t gicr_ienabler0;
171 uint32_t gicr_ipendr0;
172 uint32_t gicr_iactiver0;
173 uint32_t edge_trigger;
174 uint32_t gicr_igrpmodr0;
175 uint32_t gicr_nsacr;
176 uint8_t gicr_ipriorityr[GIC_INTERNAL];
177
178
179 uint64_t icc_sre_el1;
180 uint64_t icc_ctlr_el1[2];
181 uint64_t icc_pmr_el1;
182 uint64_t icc_bpr[3];
183 uint64_t icc_apr[3][4];
184 uint64_t icc_igrpen[3];
185 uint64_t icc_ctlr_el3;
186
187
188 uint64_t ich_apr[3][4];
189 uint64_t ich_hcr_el2;
190 uint64_t ich_lr_el2[GICV3_LR_MAX];
191 uint64_t ich_vmcr_el2;
192
193
194
195
196
197
198 int num_list_regs;
199 int vpribits;
200 int vprebits;
201
202
203
204
205
206 PendingIrq hppi;
207
208
209
210
211
212 PendingIrq hpplpi;
213
214
215 bool seenbetter;
216};
217
218
219
220
221
222typedef struct GICv3RedistRegion {
223 GICv3State *gic;
224 MemoryRegion iomem;
225 uint32_t cpuidx;
226} GICv3RedistRegion;
227
228struct GICv3State {
229
230 SysBusDevice parent_obj;
231
232
233 MemoryRegion iomem_dist;
234 GICv3RedistRegion *redist_regions;
235 uint32_t *redist_region_count;
236 uint32_t nb_redist_regions;
237
238 uint32_t num_cpu;
239 uint32_t num_irq;
240 uint32_t revision;
241 bool lpi_enable;
242 bool security_extn;
243 bool irq_reset_nonsecure;
244 bool gicd_no_migration_shift_bug;
245
246 int dev_fd;
247 Error *migration_blocker;
248
249 MemoryRegion *dma;
250 AddressSpace dma_as;
251
252
253
254
255
256
257 uint32_t gicd_ctlr;
258 uint32_t gicd_statusr[2];
259 GIC_DECLARE_BITMAP(group);
260 GIC_DECLARE_BITMAP(grpmod);
261 GIC_DECLARE_BITMAP(enabled);
262 GIC_DECLARE_BITMAP(pending);
263 GIC_DECLARE_BITMAP(active);
264 GIC_DECLARE_BITMAP(level);
265 GIC_DECLARE_BITMAP(edge_trigger);
266 uint8_t gicd_ipriority[GICV3_MAXIRQ];
267 uint64_t gicd_irouter[GICV3_MAXIRQ];
268
269
270
271 GICv3CPUState *gicd_irouter_target[GICV3_MAXIRQ];
272 uint32_t gicd_nsacr[DIV_ROUND_UP(GICV3_MAXIRQ, 16)];
273
274 GICv3CPUState *cpu;
275};
276
277#define GICV3_BITMAP_ACCESSORS(BMP) \
278 static inline void gicv3_gicd_##BMP##_set(GICv3State *s, int irq) \
279 { \
280 gic_bmp_set_bit(irq, s->BMP); \
281 } \
282 static inline int gicv3_gicd_##BMP##_test(GICv3State *s, int irq) \
283 { \
284 return gic_bmp_test_bit(irq, s->BMP); \
285 } \
286 static inline void gicv3_gicd_##BMP##_clear(GICv3State *s, int irq) \
287 { \
288 gic_bmp_clear_bit(irq, s->BMP); \
289 } \
290 static inline void gicv3_gicd_##BMP##_replace(GICv3State *s, \
291 int irq, int value) \
292 { \
293 gic_bmp_replace_bit(irq, s->BMP, value); \
294 }
295
296GICV3_BITMAP_ACCESSORS(group)
297GICV3_BITMAP_ACCESSORS(grpmod)
298GICV3_BITMAP_ACCESSORS(enabled)
299GICV3_BITMAP_ACCESSORS(pending)
300GICV3_BITMAP_ACCESSORS(active)
301GICV3_BITMAP_ACCESSORS(level)
302GICV3_BITMAP_ACCESSORS(edge_trigger)
303
304#define TYPE_ARM_GICV3_COMMON "arm-gicv3-common"
305typedef struct ARMGICv3CommonClass ARMGICv3CommonClass;
306DECLARE_OBJ_CHECKERS(GICv3State, ARMGICv3CommonClass,
307 ARM_GICV3_COMMON, TYPE_ARM_GICV3_COMMON)
308
309struct ARMGICv3CommonClass {
310
311 SysBusDeviceClass parent_class;
312
313
314 void (*pre_save)(GICv3State *s);
315 void (*post_load)(GICv3State *s);
316};
317
318void gicv3_init_irqs_and_mmio(GICv3State *s, qemu_irq_handler handler,
319 const MemoryRegionOps *ops);
320
321#endif
322