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