1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /*
3 * Copyright (C) 2025 ARM Limited, All Rights Reserved.
4 */
5 #ifndef __LINUX_IRQCHIP_ARM_GIC_V5_H
6 #define __LINUX_IRQCHIP_ARM_GIC_V5_H
7
8 #include <linux/iopoll.h>
9
10 #include <asm/cacheflush.h>
11 #include <asm/smp.h>
12 #include <asm/sysreg.h>
13
14 #define GICV5_IPIS_PER_CPU MAX_IPI
15
16 /*
17 * INTID handling
18 */
19 #define GICV5_HWIRQ_ID GENMASK(23, 0)
20 #define GICV5_HWIRQ_TYPE GENMASK(31, 29)
21 #define GICV5_HWIRQ_INTID GENMASK_ULL(31, 0)
22
23 #define GICV5_HWIRQ_TYPE_PPI UL(0x1)
24 #define GICV5_HWIRQ_TYPE_LPI UL(0x2)
25 #define GICV5_HWIRQ_TYPE_SPI UL(0x3)
26
27 /*
28 * Architected PPIs
29 */
30 #define GICV5_ARCH_PPI_S_DB_PPI 0x0
31 #define GICV5_ARCH_PPI_RL_DB_PPI 0x1
32 #define GICV5_ARCH_PPI_NS_DB_PPI 0x2
33 #define GICV5_ARCH_PPI_SW_PPI 0x3
34 #define GICV5_ARCH_PPI_HACDBSIRQ 0xf
35 #define GICV5_ARCH_PPI_CNTHVS 0x13
36 #define GICV5_ARCH_PPI_CNTHPS 0x14
37 #define GICV5_ARCH_PPI_PMBIRQ 0x15
38 #define GICV5_ARCH_PPI_COMMIRQ 0x16
39 #define GICV5_ARCH_PPI_PMUIRQ 0x17
40 #define GICV5_ARCH_PPI_CTIIRQ 0x18
41 #define GICV5_ARCH_PPI_GICMNT 0x19
42 #define GICV5_ARCH_PPI_CNTHP 0x1a
43 #define GICV5_ARCH_PPI_CNTV 0x1b
44 #define GICV5_ARCH_PPI_CNTHV 0x1c
45 #define GICV5_ARCH_PPI_CNTPS 0x1d
46 #define GICV5_ARCH_PPI_CNTP 0x1e
47 #define GICV5_ARCH_PPI_TRBIRQ 0x1f
48
49 /*
50 * Tables attributes
51 */
52 #define GICV5_NO_READ_ALLOC 0b0
53 #define GICV5_READ_ALLOC 0b1
54 #define GICV5_NO_WRITE_ALLOC 0b0
55 #define GICV5_WRITE_ALLOC 0b1
56
57 #define GICV5_NON_CACHE 0b00
58 #define GICV5_WB_CACHE 0b01
59 #define GICV5_WT_CACHE 0b10
60
61 #define GICV5_NON_SHARE 0b00
62 #define GICV5_OUTER_SHARE 0b10
63 #define GICV5_INNER_SHARE 0b11
64
65 /*
66 * IRS registers and tables structures
67 */
68 #define GICV5_IRS_IDR0 0x0000
69 #define GICV5_IRS_IDR1 0x0004
70 #define GICV5_IRS_IDR2 0x0008
71 #define GICV5_IRS_IDR5 0x0014
72 #define GICV5_IRS_IDR6 0x0018
73 #define GICV5_IRS_IDR7 0x001c
74 #define GICV5_IRS_CR0 0x0080
75 #define GICV5_IRS_CR1 0x0084
76 #define GICV5_IRS_SYNCR 0x00c0
77 #define GICV5_IRS_SYNC_STATUSR 0x00c4
78 #define GICV5_IRS_SPI_SELR 0x0108
79 #define GICV5_IRS_SPI_CFGR 0x0114
80 #define GICV5_IRS_SPI_STATUSR 0x0118
81 #define GICV5_IRS_PE_SELR 0x0140
82 #define GICV5_IRS_PE_STATUSR 0x0144
83 #define GICV5_IRS_PE_CR0 0x0148
84 #define GICV5_IRS_IST_BASER 0x0180
85 #define GICV5_IRS_IST_CFGR 0x0190
86 #define GICV5_IRS_IST_STATUSR 0x0194
87 #define GICV5_IRS_MAP_L2_ISTR 0x01c0
88
89 #define GICV5_IRS_IDR0_VIRT BIT(6)
90
91 #define GICV5_IRS_IDR1_PRIORITY_BITS GENMASK(22, 20)
92 #define GICV5_IRS_IDR1_IAFFID_BITS GENMASK(19, 16)
93
94 #define GICV5_IRS_IDR1_PRIORITY_BITS_1BITS 0b000
95 #define GICV5_IRS_IDR1_PRIORITY_BITS_2BITS 0b001
96 #define GICV5_IRS_IDR1_PRIORITY_BITS_3BITS 0b010
97 #define GICV5_IRS_IDR1_PRIORITY_BITS_4BITS 0b011
98 #define GICV5_IRS_IDR1_PRIORITY_BITS_5BITS 0b100
99
100 #define GICV5_IRS_IDR2_ISTMD_SZ GENMASK(19, 15)
101 #define GICV5_IRS_IDR2_ISTMD BIT(14)
102 #define GICV5_IRS_IDR2_IST_L2SZ GENMASK(13, 11)
103 #define GICV5_IRS_IDR2_IST_LEVELS BIT(10)
104 #define GICV5_IRS_IDR2_MIN_LPI_ID_BITS GENMASK(9, 6)
105 #define GICV5_IRS_IDR2_LPI BIT(5)
106 #define GICV5_IRS_IDR2_ID_BITS GENMASK(4, 0)
107
108 #define GICV5_IRS_IDR5_SPI_RANGE GENMASK(24, 0)
109 #define GICV5_IRS_IDR6_SPI_IRS_RANGE GENMASK(24, 0)
110 #define GICV5_IRS_IDR7_SPI_BASE GENMASK(23, 0)
111
112 #define GICV5_IRS_IST_L2SZ_SUPPORT_4KB(r) FIELD_GET(BIT(11), (r))
113 #define GICV5_IRS_IST_L2SZ_SUPPORT_16KB(r) FIELD_GET(BIT(12), (r))
114 #define GICV5_IRS_IST_L2SZ_SUPPORT_64KB(r) FIELD_GET(BIT(13), (r))
115
116 #define GICV5_IRS_CR0_IDLE BIT(1)
117 #define GICV5_IRS_CR0_IRSEN BIT(0)
118
119 #define GICV5_IRS_CR1_VPED_WA BIT(15)
120 #define GICV5_IRS_CR1_VPED_RA BIT(14)
121 #define GICV5_IRS_CR1_VMD_WA BIT(13)
122 #define GICV5_IRS_CR1_VMD_RA BIT(12)
123 #define GICV5_IRS_CR1_VPET_WA BIT(11)
124 #define GICV5_IRS_CR1_VPET_RA BIT(10)
125 #define GICV5_IRS_CR1_VMT_WA BIT(9)
126 #define GICV5_IRS_CR1_VMT_RA BIT(8)
127 #define GICV5_IRS_CR1_IST_WA BIT(7)
128 #define GICV5_IRS_CR1_IST_RA BIT(6)
129 #define GICV5_IRS_CR1_IC GENMASK(5, 4)
130 #define GICV5_IRS_CR1_OC GENMASK(3, 2)
131 #define GICV5_IRS_CR1_SH GENMASK(1, 0)
132
133 #define GICV5_IRS_SYNCR_SYNC BIT(31)
134
135 #define GICV5_IRS_SYNC_STATUSR_IDLE BIT(0)
136
137 #define GICV5_IRS_SPI_STATUSR_V BIT(1)
138 #define GICV5_IRS_SPI_STATUSR_IDLE BIT(0)
139
140 #define GICV5_IRS_SPI_SELR_ID GENMASK(23, 0)
141
142 #define GICV5_IRS_SPI_CFGR_TM BIT(0)
143
144 #define GICV5_IRS_PE_SELR_IAFFID GENMASK(15, 0)
145
146 #define GICV5_IRS_PE_STATUSR_V BIT(1)
147 #define GICV5_IRS_PE_STATUSR_IDLE BIT(0)
148
149 #define GICV5_IRS_PE_CR0_DPS BIT(0)
150
151 #define GICV5_IRS_IST_STATUSR_IDLE BIT(0)
152
153 #define GICV5_IRS_IST_CFGR_STRUCTURE BIT(16)
154 #define GICV5_IRS_IST_CFGR_ISTSZ GENMASK(8, 7)
155 #define GICV5_IRS_IST_CFGR_L2SZ GENMASK(6, 5)
156 #define GICV5_IRS_IST_CFGR_LPI_ID_BITS GENMASK(4, 0)
157
158 #define GICV5_IRS_IST_CFGR_STRUCTURE_LINEAR 0b0
159 #define GICV5_IRS_IST_CFGR_STRUCTURE_TWO_LEVEL 0b1
160
161 #define GICV5_IRS_IST_CFGR_ISTSZ_4 0b00
162 #define GICV5_IRS_IST_CFGR_ISTSZ_8 0b01
163 #define GICV5_IRS_IST_CFGR_ISTSZ_16 0b10
164
165 #define GICV5_IRS_IST_CFGR_L2SZ_4K 0b00
166 #define GICV5_IRS_IST_CFGR_L2SZ_16K 0b01
167 #define GICV5_IRS_IST_CFGR_L2SZ_64K 0b10
168
169 #define GICV5_IRS_IST_BASER_ADDR_MASK GENMASK_ULL(55, 6)
170 #define GICV5_IRS_IST_BASER_VALID BIT_ULL(0)
171
172 #define GICV5_IRS_MAP_L2_ISTR_ID GENMASK(23, 0)
173
174 #define GICV5_ISTL1E_VALID BIT_ULL(0)
175
176 #define GICV5_ISTL1E_L2_ADDR_MASK GENMASK_ULL(55, 12)
177
178 /*
179 * ITS registers and tables structures
180 */
181 #define GICV5_ITS_IDR1 0x0004
182 #define GICV5_ITS_IDR2 0x0008
183 #define GICV5_ITS_CR0 0x0080
184 #define GICV5_ITS_CR1 0x0084
185 #define GICV5_ITS_DT_BASER 0x00c0
186 #define GICV5_ITS_DT_CFGR 0x00d0
187 #define GICV5_ITS_DIDR 0x0100
188 #define GICV5_ITS_EIDR 0x0108
189 #define GICV5_ITS_INV_EVENTR 0x010c
190 #define GICV5_ITS_INV_DEVICER 0x0110
191 #define GICV5_ITS_STATUSR 0x0120
192 #define GICV5_ITS_SYNCR 0x0140
193 #define GICV5_ITS_SYNC_STATUSR 0x0148
194
195 #define GICV5_ITS_IDR1_L2SZ GENMASK(10, 8)
196 #define GICV5_ITS_IDR1_ITT_LEVELS BIT(7)
197 #define GICV5_ITS_IDR1_DT_LEVELS BIT(6)
198 #define GICV5_ITS_IDR1_DEVICEID_BITS GENMASK(5, 0)
199
200 #define GICV5_ITS_IDR1_L2SZ_SUPPORT_4KB(r) FIELD_GET(BIT(8), (r))
201 #define GICV5_ITS_IDR1_L2SZ_SUPPORT_16KB(r) FIELD_GET(BIT(9), (r))
202 #define GICV5_ITS_IDR1_L2SZ_SUPPORT_64KB(r) FIELD_GET(BIT(10), (r))
203
204 #define GICV5_ITS_IDR2_XDMN_EVENTs GENMASK(6, 5)
205 #define GICV5_ITS_IDR2_EVENTID_BITS GENMASK(4, 0)
206
207 #define GICV5_ITS_CR0_IDLE BIT(1)
208 #define GICV5_ITS_CR0_ITSEN BIT(0)
209
210 #define GICV5_ITS_CR1_ITT_RA BIT(7)
211 #define GICV5_ITS_CR1_DT_RA BIT(6)
212 #define GICV5_ITS_CR1_IC GENMASK(5, 4)
213 #define GICV5_ITS_CR1_OC GENMASK(3, 2)
214 #define GICV5_ITS_CR1_SH GENMASK(1, 0)
215
216 #define GICV5_ITS_DT_CFGR_STRUCTURE BIT(16)
217 #define GICV5_ITS_DT_CFGR_L2SZ GENMASK(7, 6)
218 #define GICV5_ITS_DT_CFGR_DEVICEID_BITS GENMASK(5, 0)
219
220 #define GICV5_ITS_DT_BASER_ADDR_MASK GENMASK_ULL(55, 3)
221
222 #define GICV5_ITS_INV_DEVICER_I BIT(31)
223 #define GICV5_ITS_INV_DEVICER_EVENTID_BITS GENMASK(5, 1)
224 #define GICV5_ITS_INV_DEVICER_L1 BIT(0)
225
226 #define GICV5_ITS_DIDR_DEVICEID GENMASK_ULL(31, 0)
227
228 #define GICV5_ITS_EIDR_EVENTID GENMASK(15, 0)
229
230 #define GICV5_ITS_INV_EVENTR_I BIT(31)
231 #define GICV5_ITS_INV_EVENTR_ITT_L2SZ GENMASK(2, 1)
232 #define GICV5_ITS_INV_EVENTR_L1 BIT(0)
233
234 #define GICV5_ITS_STATUSR_IDLE BIT(0)
235
236 #define GICV5_ITS_SYNCR_SYNC BIT_ULL(63)
237 #define GICV5_ITS_SYNCR_SYNCALL BIT_ULL(32)
238 #define GICV5_ITS_SYNCR_DEVICEID GENMASK_ULL(31, 0)
239
240 #define GICV5_ITS_SYNC_STATUSR_IDLE BIT(0)
241
242 #define GICV5_DTL1E_VALID BIT_ULL(0)
243 /* Note that there is no shift for the address by design */
244 #define GICV5_DTL1E_L2_ADDR_MASK GENMASK_ULL(55, 3)
245 #define GICV5_DTL1E_SPAN GENMASK_ULL(63, 60)
246
247 #define GICV5_DTL2E_VALID BIT_ULL(0)
248 #define GICV5_DTL2E_ITT_L2SZ GENMASK_ULL(2, 1)
249 /* Note that there is no shift for the address by design */
250 #define GICV5_DTL2E_ITT_ADDR_MASK GENMASK_ULL(55, 3)
251 #define GICV5_DTL2E_ITT_DSWE BIT_ULL(57)
252 #define GICV5_DTL2E_ITT_STRUCTURE BIT_ULL(58)
253 #define GICV5_DTL2E_EVENT_ID_BITS GENMASK_ULL(63, 59)
254
255 #define GICV5_ITTL1E_VALID BIT_ULL(0)
256 /* Note that there is no shift for the address by design */
257 #define GICV5_ITTL1E_L2_ADDR_MASK GENMASK_ULL(55, 3)
258 #define GICV5_ITTL1E_SPAN GENMASK_ULL(63, 60)
259
260 #define GICV5_ITTL2E_LPI_ID GENMASK_ULL(23, 0)
261 #define GICV5_ITTL2E_DAC GENMASK_ULL(29, 28)
262 #define GICV5_ITTL2E_VIRTUAL BIT_ULL(30)
263 #define GICV5_ITTL2E_VALID BIT_ULL(31)
264 #define GICV5_ITTL2E_VM_ID GENMASK_ULL(47, 32)
265
266 #define GICV5_ITS_DT_ITT_CFGR_L2SZ_4k 0b00
267 #define GICV5_ITS_DT_ITT_CFGR_L2SZ_16k 0b01
268 #define GICV5_ITS_DT_ITT_CFGR_L2SZ_64k 0b10
269
270 #define GICV5_ITS_DT_ITT_CFGR_STRUCTURE_LINEAR 0
271 #define GICV5_ITS_DT_ITT_CFGR_STRUCTURE_TWO_LEVEL 1
272
273 #define GICV5_ITS_HWIRQ_DEVICE_ID GENMASK_ULL(31, 0)
274 #define GICV5_ITS_HWIRQ_EVENT_ID GENMASK_ULL(63, 32)
275
276 /*
277 * IWB registers
278 */
279 #define GICV5_IWB_IDR0 0x0000
280 #define GICV5_IWB_CR0 0x0080
281 #define GICV5_IWB_WENABLE_STATUSR 0x00c0
282 #define GICV5_IWB_WENABLER 0x2000
283 #define GICV5_IWB_WTMR 0x4000
284
285 #define GICV5_IWB_IDR0_INT_DOMS GENMASK(14, 11)
286 #define GICV5_IWB_IDR0_IW_RANGE GENMASK(10, 0)
287
288 #define GICV5_IWB_CR0_IDLE BIT(1)
289 #define GICV5_IWB_CR0_IWBEN BIT(0)
290
291 #define GICV5_IWB_WENABLE_STATUSR_IDLE BIT(0)
292
293 #define GICV5_GSI_IC_TYPE GENMASK(31, 29)
294 #define GICV5_GSI_IWB_TYPE 0x7
295
296 #define GICV5_GSI_IWB_FRAME_ID GENMASK(28, 16)
297 #define GICV5_GSI_IWB_WIRE GENMASK(15, 0)
298
299 /*
300 * Global Data structures and functions
301 */
302 struct gicv5_chip_data {
303 struct fwnode_handle *fwnode;
304 struct irq_domain *ppi_domain;
305 struct irq_domain *spi_domain;
306 struct irq_domain *lpi_domain;
307 struct irq_domain *ipi_domain;
308 u32 global_spi_count;
309 u8 cpuif_pri_bits;
310 u8 cpuif_id_bits;
311 u8 irs_pri_bits;
312 bool virt_capable;
313 struct {
314 __le64 *l1ist_addr;
315 u32 l2_size;
316 u8 l2_bits;
317 bool l2;
318 } ist;
319 };
320
321 extern struct gicv5_chip_data gicv5_global_data __read_mostly;
322
323 struct gicv5_irs_chip_data {
324 struct list_head entry;
325 struct fwnode_handle *fwnode;
326 void __iomem *irs_base;
327 u32 flags;
328 u32 spi_min;
329 u32 spi_range;
330 raw_spinlock_t spi_config_lock;
331 };
332
gicv5_wait_for_op_s_atomic(void __iomem * addr,u32 offset,const char * reg_s,u32 mask,u32 * val)333 static inline int gicv5_wait_for_op_s_atomic(void __iomem *addr, u32 offset,
334 const char *reg_s, u32 mask,
335 u32 *val)
336 {
337 void __iomem *reg = addr + offset;
338 u32 tmp;
339 int ret;
340
341 ret = readl_poll_timeout_atomic(reg, tmp, tmp & mask, 1, 10 * USEC_PER_MSEC);
342 if (unlikely(ret == -ETIMEDOUT)) {
343 pr_err_ratelimited("%s timeout...\n", reg_s);
344 return ret;
345 }
346
347 if (val)
348 *val = tmp;
349
350 return 0;
351 }
352
gicv5_wait_for_op_s(void __iomem * addr,u32 offset,const char * reg_s,u32 mask)353 static inline int gicv5_wait_for_op_s(void __iomem *addr, u32 offset,
354 const char *reg_s, u32 mask)
355 {
356 void __iomem *reg = addr + offset;
357 u32 val;
358 int ret;
359
360 ret = readl_poll_timeout(reg, val, val & mask, 1, 10 * USEC_PER_MSEC);
361 if (unlikely(ret == -ETIMEDOUT)) {
362 pr_err_ratelimited("%s timeout...\n", reg_s);
363 return ret;
364 }
365
366 return 0;
367 }
368
369 #define gicv5_wait_for_op_atomic(base, reg, mask, val) \
370 gicv5_wait_for_op_s_atomic(base, reg, #reg, mask, val)
371
372 #define gicv5_wait_for_op(base, reg, mask) \
373 gicv5_wait_for_op_s(base, reg, #reg, mask)
374
375 void __init gicv5_init_lpi_domain(void);
376 void __init gicv5_free_lpi_domain(void);
377
378 int gicv5_irs_of_probe(struct device_node *parent);
379 int gicv5_irs_acpi_probe(void);
380 void gicv5_irs_remove(void);
381 int gicv5_irs_enable(void);
382 void gicv5_irs_its_probe(void);
383 int gicv5_irs_register_cpu(int cpuid);
384 int gicv5_irs_cpu_to_iaffid(int cpu_id, u16 *iaffid);
385 struct gicv5_irs_chip_data *gicv5_irs_lookup_by_spi_id(u32 spi_id);
386 int gicv5_spi_irq_set_type(struct irq_data *d, unsigned int type);
387 int gicv5_irs_iste_alloc(u32 lpi);
388 void gicv5_irs_syncr(void);
389
390 /* Embedded in kvm.arch */
391 struct gicv5_vpe {
392 bool resident;
393 };
394
395 struct gicv5_its_devtab_cfg {
396 union {
397 struct {
398 __le64 *devtab;
399 } linear;
400 struct {
401 __le64 *l1devtab;
402 __le64 **l2ptrs;
403 } l2;
404 };
405 u32 cfgr;
406 };
407
408 struct gicv5_its_itt_cfg {
409 union {
410 struct {
411 __le64 *itt;
412 unsigned int num_ents;
413 } linear;
414 struct {
415 __le64 *l1itt;
416 __le64 **l2ptrs;
417 unsigned int num_l1_ents;
418 u8 l2sz;
419 } l2;
420 };
421 u8 event_id_bits;
422 bool l2itt;
423 };
424
425 void gicv5_init_lpis(u32 max);
426 void gicv5_deinit_lpis(void);
427
428 void __init gicv5_its_of_probe(struct device_node *parent);
429 void __init gicv5_its_acpi_probe(void);
430 #endif
431