Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
1// SPDX-License-Identifier: GPL-2.0-only
2/*
3 * Copyright (C) 2024-2025 ARM Limited, All Rights Reserved.
4 */
5
6#define pr_fmt(fmt) "GICv5 IRS: " fmt
7
8#include <linux/acpi.h>
9#include <linux/kmemleak.h>
10#include <linux/log2.h>
11#include <linux/of.h>
12#include <linux/of_address.h>
13
14#include <linux/irqchip.h>
15#include <linux/irqchip/arm-gic-v5.h>
16
17/*
18 * Hardcoded ID_BITS limit for systems supporting only a 1-level IST
19 * table. Systems supporting only a 1-level IST table aren't expected
20 * to require more than 2^12 LPIs. Tweak as required.
21 */
22#define LPI_ID_BITS_LINEAR 12
23
24#define IRS_FLAGS_NON_COHERENT BIT(0)
25
26static DEFINE_PER_CPU_READ_MOSTLY(struct gicv5_irs_chip_data *, per_cpu_irs_data);
27static LIST_HEAD(irs_nodes);
28
29static u32 irs_readl_relaxed(struct gicv5_irs_chip_data *irs_data,
30 const u32 reg_offset)
31{
32 return readl_relaxed(irs_data->irs_base + reg_offset);
33}
34
35static void irs_writel_relaxed(struct gicv5_irs_chip_data *irs_data,
36 const u32 val, const u32 reg_offset)
37{
38 writel_relaxed(val, irs_data->irs_base + reg_offset);
39}
40
41static u64 irs_readq_relaxed(struct gicv5_irs_chip_data *irs_data,
42 const u32 reg_offset)
43{
44 return readq_relaxed(irs_data->irs_base + reg_offset);
45}
46
47static void irs_writeq_relaxed(struct gicv5_irs_chip_data *irs_data,
48 const u64 val, const u32 reg_offset)
49{
50 writeq_relaxed(val, irs_data->irs_base + reg_offset);
51}
52
53/*
54 * The polling wait (in gicv5_wait_for_op_s_atomic()) on a GIC register
55 * provides the memory barriers (through MMIO accessors)
56 * required to synchronize CPU and GIC access to IST memory.
57 */
58static int gicv5_irs_ist_synchronise(struct gicv5_irs_chip_data *irs_data)
59{
60 return gicv5_wait_for_op_atomic(irs_data->irs_base, GICV5_IRS_IST_STATUSR,
61 GICV5_IRS_IST_STATUSR_IDLE, NULL);
62}
63
64static int __init gicv5_irs_init_ist_linear(struct gicv5_irs_chip_data *irs_data,
65 unsigned int lpi_id_bits,
66 unsigned int istsz)
67{
68 size_t l2istsz;
69 u32 n, cfgr;
70 void *ist;
71 u64 baser;
72 int ret;
73
74 /* Taken from GICv5 specifications 10.2.1.13 IRS_IST_BASER */
75 n = max(5, lpi_id_bits + 1 + istsz);
76
77 l2istsz = BIT(n + 1);
78 /*
79 * Check memory requirements. For a linear IST we cap the
80 * number of ID bits to a value that should never exceed
81 * kmalloc interface memory allocation limits, so this
82 * check is really belt and braces.
83 */
84 if (l2istsz > KMALLOC_MAX_SIZE) {
85 u8 lpi_id_cap = ilog2(KMALLOC_MAX_SIZE) - 2 + istsz;
86
87 pr_warn("Limiting LPI ID bits from %u to %u\n",
88 lpi_id_bits, lpi_id_cap);
89 lpi_id_bits = lpi_id_cap;
90 l2istsz = KMALLOC_MAX_SIZE;
91 }
92
93 ist = kzalloc(l2istsz, GFP_KERNEL);
94 if (!ist)
95 return -ENOMEM;
96
97 if (irs_data->flags & IRS_FLAGS_NON_COHERENT)
98 dcache_clean_inval_poc((unsigned long)ist,
99 (unsigned long)ist + l2istsz);
100 else
101 dsb(ishst);
102
103 cfgr = FIELD_PREP(GICV5_IRS_IST_CFGR_STRUCTURE,
104 GICV5_IRS_IST_CFGR_STRUCTURE_LINEAR) |
105 FIELD_PREP(GICV5_IRS_IST_CFGR_ISTSZ, istsz) |
106 FIELD_PREP(GICV5_IRS_IST_CFGR_L2SZ,
107 GICV5_IRS_IST_CFGR_L2SZ_4K) |
108 FIELD_PREP(GICV5_IRS_IST_CFGR_LPI_ID_BITS, lpi_id_bits);
109 irs_writel_relaxed(irs_data, cfgr, GICV5_IRS_IST_CFGR);
110
111 gicv5_global_data.ist.l2 = false;
112
113 baser = (virt_to_phys(ist) & GICV5_IRS_IST_BASER_ADDR_MASK) |
114 FIELD_PREP(GICV5_IRS_IST_BASER_VALID, 0x1);
115 irs_writeq_relaxed(irs_data, baser, GICV5_IRS_IST_BASER);
116
117 ret = gicv5_irs_ist_synchronise(irs_data);
118 if (ret) {
119 kfree(ist);
120 return ret;
121 }
122 kmemleak_ignore(ist);
123
124 return 0;
125}
126
127static int __init gicv5_irs_init_ist_two_level(struct gicv5_irs_chip_data *irs_data,
128 unsigned int lpi_id_bits,
129 unsigned int istsz,
130 unsigned int l2sz)
131{
132 __le64 *l1ist;
133 u32 cfgr, n;
134 size_t l1sz;
135 u64 baser;
136 int ret;
137
138 /* Taken from GICv5 specifications 10.2.1.13 IRS_IST_BASER */
139 n = max(5, lpi_id_bits - ((10 - istsz) + (2 * l2sz)) + 2);
140
141 l1sz = BIT(n + 1);
142
143 l1ist = kzalloc(l1sz, GFP_KERNEL);
144 if (!l1ist)
145 return -ENOMEM;
146
147 if (irs_data->flags & IRS_FLAGS_NON_COHERENT)
148 dcache_clean_inval_poc((unsigned long)l1ist,
149 (unsigned long)l1ist + l1sz);
150 else
151 dsb(ishst);
152
153 cfgr = FIELD_PREP(GICV5_IRS_IST_CFGR_STRUCTURE,
154 GICV5_IRS_IST_CFGR_STRUCTURE_TWO_LEVEL) |
155 FIELD_PREP(GICV5_IRS_IST_CFGR_ISTSZ, istsz) |
156 FIELD_PREP(GICV5_IRS_IST_CFGR_L2SZ, l2sz) |
157 FIELD_PREP(GICV5_IRS_IST_CFGR_LPI_ID_BITS, lpi_id_bits);
158 irs_writel_relaxed(irs_data, cfgr, GICV5_IRS_IST_CFGR);
159
160 /*
161 * The L2SZ determine bits required at L2 level. Number of bytes
162 * required by metadata is reported through istsz - the number of bits
163 * covered by L2 entries scales accordingly.
164 */
165 gicv5_global_data.ist.l2_size = BIT(11 + (2 * l2sz) + 1);
166 gicv5_global_data.ist.l2_bits = (10 - istsz) + (2 * l2sz);
167 gicv5_global_data.ist.l1ist_addr = l1ist;
168 gicv5_global_data.ist.l2 = true;
169
170 baser = (virt_to_phys(l1ist) & GICV5_IRS_IST_BASER_ADDR_MASK) |
171 FIELD_PREP(GICV5_IRS_IST_BASER_VALID, 0x1);
172 irs_writeq_relaxed(irs_data, baser, GICV5_IRS_IST_BASER);
173
174 ret = gicv5_irs_ist_synchronise(irs_data);
175 if (ret) {
176 kfree(l1ist);
177 return ret;
178 }
179
180 return 0;
181}
182
183/*
184 * Alloc L2 IST entries on demand.
185 *
186 * Locking/serialization is guaranteed by irqdomain core code by
187 * taking the hierarchical domain struct irq_domain.root->mutex.
188 */
189int gicv5_irs_iste_alloc(const u32 lpi)
190{
191 struct gicv5_irs_chip_data *irs_data;
192 unsigned int index;
193 u32 l2istr, l2bits;
194 __le64 *l1ist;
195 size_t l2size;
196 void *l2ist;
197 int ret;
198
199 if (!gicv5_global_data.ist.l2)
200 return 0;
201
202 irs_data = per_cpu(per_cpu_irs_data, smp_processor_id());
203 if (!irs_data)
204 return -ENOENT;
205
206 l2size = gicv5_global_data.ist.l2_size;
207 l2bits = gicv5_global_data.ist.l2_bits;
208 l1ist = gicv5_global_data.ist.l1ist_addr;
209 index = lpi >> l2bits;
210
211 if (FIELD_GET(GICV5_ISTL1E_VALID, le64_to_cpu(l1ist[index])))
212 return 0;
213
214 l2ist = kzalloc(l2size, GFP_KERNEL);
215 if (!l2ist)
216 return -ENOMEM;
217
218 l1ist[index] = cpu_to_le64(virt_to_phys(l2ist) & GICV5_ISTL1E_L2_ADDR_MASK);
219
220 if (irs_data->flags & IRS_FLAGS_NON_COHERENT) {
221 dcache_clean_inval_poc((unsigned long)l2ist,
222 (unsigned long)l2ist + l2size);
223 dcache_clean_poc((unsigned long)(l1ist + index),
224 (unsigned long)(l1ist + index) + sizeof(*l1ist));
225 } else {
226 dsb(ishst);
227 }
228
229 l2istr = FIELD_PREP(GICV5_IRS_MAP_L2_ISTR_ID, lpi);
230 irs_writel_relaxed(irs_data, l2istr, GICV5_IRS_MAP_L2_ISTR);
231
232 ret = gicv5_irs_ist_synchronise(irs_data);
233 if (ret) {
234 l1ist[index] = 0;
235 kfree(l2ist);
236 return ret;
237 }
238 kmemleak_ignore(l2ist);
239
240 /*
241 * Make sure we invalidate the cache line pulled before the IRS
242 * had a chance to update the L1 entry and mark it valid.
243 */
244 if (irs_data->flags & IRS_FLAGS_NON_COHERENT) {
245 /*
246 * gicv5_irs_ist_synchronise() includes memory
247 * barriers (MMIO accessors) required to guarantee that the
248 * following dcache invalidation is not executed before the
249 * IST mapping operation has completed.
250 */
251 dcache_inval_poc((unsigned long)(l1ist + index),
252 (unsigned long)(l1ist + index) + sizeof(*l1ist));
253 }
254
255 return 0;
256}
257
258/*
259 * Try to match the L2 IST size to the pagesize, and if this is not possible
260 * pick the smallest supported L2 size in order to minimise the requirement for
261 * physically contiguous blocks of memory as page-sized allocations are
262 * guaranteed to be physically contiguous, and are by definition the easiest to
263 * find.
264 *
265 * Fall back to the smallest supported size (in the event that the pagesize
266 * itself is not supported) again serves to make it easier to find physically
267 * contiguous blocks of memory.
268 */
269static unsigned int gicv5_irs_l2_sz(u32 idr2)
270{
271 switch (PAGE_SIZE) {
272 case SZ_64K:
273 if (GICV5_IRS_IST_L2SZ_SUPPORT_64KB(idr2))
274 return GICV5_IRS_IST_CFGR_L2SZ_64K;
275 fallthrough;
276 case SZ_4K:
277 if (GICV5_IRS_IST_L2SZ_SUPPORT_4KB(idr2))
278 return GICV5_IRS_IST_CFGR_L2SZ_4K;
279 fallthrough;
280 case SZ_16K:
281 if (GICV5_IRS_IST_L2SZ_SUPPORT_16KB(idr2))
282 return GICV5_IRS_IST_CFGR_L2SZ_16K;
283 break;
284 }
285
286 if (GICV5_IRS_IST_L2SZ_SUPPORT_4KB(idr2))
287 return GICV5_IRS_IST_CFGR_L2SZ_4K;
288
289 return GICV5_IRS_IST_CFGR_L2SZ_64K;
290}
291
292static int __init gicv5_irs_init_ist(struct gicv5_irs_chip_data *irs_data)
293{
294 u32 lpi_id_bits, idr2_id_bits, idr2_min_lpi_id_bits, l2_iste_sz, l2sz;
295 u32 l2_iste_sz_split, idr2;
296 bool two_levels, istmd;
297 u64 baser;
298 int ret;
299
300 baser = irs_readq_relaxed(irs_data, GICV5_IRS_IST_BASER);
301 if (FIELD_GET(GICV5_IRS_IST_BASER_VALID, baser)) {
302 pr_err("IST is marked as valid already; cannot allocate\n");
303 return -EPERM;
304 }
305
306 idr2 = irs_readl_relaxed(irs_data, GICV5_IRS_IDR2);
307 two_levels = !!FIELD_GET(GICV5_IRS_IDR2_IST_LEVELS, idr2);
308
309 idr2_id_bits = FIELD_GET(GICV5_IRS_IDR2_ID_BITS, idr2);
310 idr2_min_lpi_id_bits = FIELD_GET(GICV5_IRS_IDR2_MIN_LPI_ID_BITS, idr2);
311
312 /*
313 * For two level tables we are always supporting the maximum allowed
314 * number of IDs.
315 *
316 * For 1-level tables, we should support a number of bits that
317 * is >= min_lpi_id_bits but cap it to LPI_ID_BITS_LINEAR lest
318 * the level 1-table gets too large and its memory allocation
319 * may fail.
320 */
321 if (two_levels) {
322 lpi_id_bits = idr2_id_bits;
323 } else {
324 lpi_id_bits = max(LPI_ID_BITS_LINEAR, idr2_min_lpi_id_bits);
325 lpi_id_bits = min(lpi_id_bits, idr2_id_bits);
326 }
327
328 /*
329 * Cap the ID bits according to the CPUIF supported ID bits
330 */
331 lpi_id_bits = min(lpi_id_bits, gicv5_global_data.cpuif_id_bits);
332
333 if (two_levels)
334 l2sz = gicv5_irs_l2_sz(idr2);
335
336 istmd = !!FIELD_GET(GICV5_IRS_IDR2_ISTMD, idr2);
337
338 l2_iste_sz = GICV5_IRS_IST_CFGR_ISTSZ_4;
339
340 if (istmd) {
341 l2_iste_sz_split = FIELD_GET(GICV5_IRS_IDR2_ISTMD_SZ, idr2);
342
343 if (lpi_id_bits < l2_iste_sz_split)
344 l2_iste_sz = GICV5_IRS_IST_CFGR_ISTSZ_8;
345 else
346 l2_iste_sz = GICV5_IRS_IST_CFGR_ISTSZ_16;
347 }
348
349 /*
350 * Follow GICv5 specification recommendation to opt in for two
351 * level tables (ref: 10.2.1.14 IRS_IST_CFGR).
352 */
353 if (two_levels && (lpi_id_bits > ((10 - l2_iste_sz) + (2 * l2sz)))) {
354 ret = gicv5_irs_init_ist_two_level(irs_data, lpi_id_bits,
355 l2_iste_sz, l2sz);
356 } else {
357 ret = gicv5_irs_init_ist_linear(irs_data, lpi_id_bits,
358 l2_iste_sz);
359 }
360 if (ret)
361 return ret;
362
363 gicv5_init_lpis(BIT(lpi_id_bits));
364
365 return 0;
366}
367
368struct iaffid_entry {
369 u16 iaffid;
370 bool valid;
371};
372
373static DEFINE_PER_CPU(struct iaffid_entry, cpu_iaffid);
374
375int gicv5_irs_cpu_to_iaffid(int cpuid, u16 *iaffid)
376{
377 if (!per_cpu(cpu_iaffid, cpuid).valid) {
378 pr_err("IAFFID for CPU %d has not been initialised\n", cpuid);
379 return -ENODEV;
380 }
381
382 *iaffid = per_cpu(cpu_iaffid, cpuid).iaffid;
383
384 return 0;
385}
386
387struct gicv5_irs_chip_data *gicv5_irs_lookup_by_spi_id(u32 spi_id)
388{
389 struct gicv5_irs_chip_data *irs_data;
390 u32 min, max;
391
392 list_for_each_entry(irs_data, &irs_nodes, entry) {
393 if (!irs_data->spi_range)
394 continue;
395
396 min = irs_data->spi_min;
397 max = irs_data->spi_min + irs_data->spi_range - 1;
398 if (spi_id >= min && spi_id <= max)
399 return irs_data;
400 }
401
402 return NULL;
403}
404
405static int gicv5_irs_wait_for_spi_op(struct gicv5_irs_chip_data *irs_data)
406{
407 u32 statusr;
408 int ret;
409
410 ret = gicv5_wait_for_op_atomic(irs_data->irs_base, GICV5_IRS_SPI_STATUSR,
411 GICV5_IRS_SPI_STATUSR_IDLE, &statusr);
412 if (ret)
413 return ret;
414
415 return !!FIELD_GET(GICV5_IRS_SPI_STATUSR_V, statusr) ? 0 : -EIO;
416}
417
418static int gicv5_irs_wait_for_irs_pe(struct gicv5_irs_chip_data *irs_data,
419 bool selr)
420{
421 bool valid = true;
422 u32 statusr;
423 int ret;
424
425 ret = gicv5_wait_for_op_atomic(irs_data->irs_base, GICV5_IRS_PE_STATUSR,
426 GICV5_IRS_PE_STATUSR_IDLE, &statusr);
427 if (ret)
428 return ret;
429
430 if (selr)
431 valid = !!FIELD_GET(GICV5_IRS_PE_STATUSR_V, statusr);
432
433 return valid ? 0 : -EIO;
434}
435
436static int gicv5_irs_wait_for_pe_selr(struct gicv5_irs_chip_data *irs_data)
437{
438 return gicv5_irs_wait_for_irs_pe(irs_data, true);
439}
440
441static int gicv5_irs_wait_for_pe_cr0(struct gicv5_irs_chip_data *irs_data)
442{
443 return gicv5_irs_wait_for_irs_pe(irs_data, false);
444}
445
446int gicv5_spi_irq_set_type(struct irq_data *d, unsigned int type)
447{
448 struct gicv5_irs_chip_data *irs_data = d->chip_data;
449 u32 selr, cfgr;
450 bool level;
451 int ret;
452
453 /*
454 * There is no distinction between HIGH/LOW for level IRQs
455 * and RISING/FALLING for edge IRQs in the architecture,
456 * hence consider them equivalent.
457 */
458 switch (type) {
459 case IRQ_TYPE_EDGE_RISING:
460 case IRQ_TYPE_EDGE_FALLING:
461 level = false;
462 break;
463 case IRQ_TYPE_LEVEL_HIGH:
464 case IRQ_TYPE_LEVEL_LOW:
465 level = true;
466 break;
467 default:
468 return -EINVAL;
469 }
470
471 guard(raw_spinlock)(&irs_data->spi_config_lock);
472
473 selr = FIELD_PREP(GICV5_IRS_SPI_SELR_ID, d->hwirq);
474 irs_writel_relaxed(irs_data, selr, GICV5_IRS_SPI_SELR);
475 ret = gicv5_irs_wait_for_spi_op(irs_data);
476 if (ret)
477 return ret;
478
479 cfgr = FIELD_PREP(GICV5_IRS_SPI_CFGR_TM, level);
480 irs_writel_relaxed(irs_data, cfgr, GICV5_IRS_SPI_CFGR);
481
482 return gicv5_irs_wait_for_spi_op(irs_data);
483}
484
485static int gicv5_irs_wait_for_idle(struct gicv5_irs_chip_data *irs_data)
486{
487 return gicv5_wait_for_op_atomic(irs_data->irs_base, GICV5_IRS_CR0,
488 GICV5_IRS_CR0_IDLE, NULL);
489}
490
491void gicv5_irs_syncr(void)
492{
493 struct gicv5_irs_chip_data *irs_data;
494 u32 syncr;
495
496 irs_data = list_first_entry_or_null(&irs_nodes, struct gicv5_irs_chip_data, entry);
497 if (WARN_ON_ONCE(!irs_data))
498 return;
499
500 syncr = FIELD_PREP(GICV5_IRS_SYNCR_SYNC, 1);
501 irs_writel_relaxed(irs_data, syncr, GICV5_IRS_SYNCR);
502
503 gicv5_wait_for_op(irs_data->irs_base, GICV5_IRS_SYNC_STATUSR,
504 GICV5_IRS_SYNC_STATUSR_IDLE);
505}
506
507int gicv5_irs_register_cpu(int cpuid)
508{
509 struct gicv5_irs_chip_data *irs_data;
510 u32 selr, cr0;
511 u16 iaffid;
512 int ret;
513
514 ret = gicv5_irs_cpu_to_iaffid(cpuid, &iaffid);
515 if (ret) {
516 pr_err("IAFFID for CPU %d has not been initialised\n", cpuid);
517 return ret;
518 }
519
520 irs_data = per_cpu(per_cpu_irs_data, cpuid);
521 if (!irs_data) {
522 pr_err("No IRS associated with CPU %u\n", cpuid);
523 return -ENXIO;
524 }
525
526 selr = FIELD_PREP(GICV5_IRS_PE_SELR_IAFFID, iaffid);
527 irs_writel_relaxed(irs_data, selr, GICV5_IRS_PE_SELR);
528
529 ret = gicv5_irs_wait_for_pe_selr(irs_data);
530 if (ret) {
531 pr_err("IAFFID 0x%x used in IRS_PE_SELR is invalid\n", iaffid);
532 return -ENXIO;
533 }
534
535 cr0 = FIELD_PREP(GICV5_IRS_PE_CR0_DPS, 0x1);
536 irs_writel_relaxed(irs_data, cr0, GICV5_IRS_PE_CR0);
537
538 ret = gicv5_irs_wait_for_pe_cr0(irs_data);
539 if (ret)
540 return ret;
541
542 pr_debug("CPU %d enabled PE IAFFID 0x%x\n", cpuid, iaffid);
543
544 return 0;
545}
546
547static void __init gicv5_irs_init_bases(struct gicv5_irs_chip_data *irs_data,
548 void __iomem *irs_base,
549 bool noncoherent)
550{
551 u32 cr0, cr1;
552
553 irs_data->irs_base = irs_base;
554
555 if (noncoherent) {
556 /*
557 * A non-coherent IRS implies that some cache levels cannot be
558 * used coherently by the cores and GIC. Our only option is to mark
559 * memory attributes for the GIC as non-cacheable; by default,
560 * non-cacheable memory attributes imply outer-shareable
561 * shareability, the value written into IRS_CR1_SH is ignored.
562 */
563 cr1 = FIELD_PREP(GICV5_IRS_CR1_VPED_WA, GICV5_NO_WRITE_ALLOC) |
564 FIELD_PREP(GICV5_IRS_CR1_VPED_RA, GICV5_NO_READ_ALLOC) |
565 FIELD_PREP(GICV5_IRS_CR1_VMD_WA, GICV5_NO_WRITE_ALLOC) |
566 FIELD_PREP(GICV5_IRS_CR1_VMD_RA, GICV5_NO_READ_ALLOC) |
567 FIELD_PREP(GICV5_IRS_CR1_VPET_RA, GICV5_NO_READ_ALLOC) |
568 FIELD_PREP(GICV5_IRS_CR1_VMT_RA, GICV5_NO_READ_ALLOC) |
569 FIELD_PREP(GICV5_IRS_CR1_IST_WA, GICV5_NO_WRITE_ALLOC) |
570 FIELD_PREP(GICV5_IRS_CR1_IST_RA, GICV5_NO_READ_ALLOC) |
571 FIELD_PREP(GICV5_IRS_CR1_IC, GICV5_NON_CACHE) |
572 FIELD_PREP(GICV5_IRS_CR1_OC, GICV5_NON_CACHE);
573 irs_data->flags |= IRS_FLAGS_NON_COHERENT;
574 } else {
575 cr1 = FIELD_PREP(GICV5_IRS_CR1_VPED_WA, GICV5_WRITE_ALLOC) |
576 FIELD_PREP(GICV5_IRS_CR1_VPED_RA, GICV5_READ_ALLOC) |
577 FIELD_PREP(GICV5_IRS_CR1_VMD_WA, GICV5_WRITE_ALLOC) |
578 FIELD_PREP(GICV5_IRS_CR1_VMD_RA, GICV5_READ_ALLOC) |
579 FIELD_PREP(GICV5_IRS_CR1_VPET_RA, GICV5_READ_ALLOC) |
580 FIELD_PREP(GICV5_IRS_CR1_VMT_RA, GICV5_READ_ALLOC) |
581 FIELD_PREP(GICV5_IRS_CR1_IST_WA, GICV5_WRITE_ALLOC) |
582 FIELD_PREP(GICV5_IRS_CR1_IST_RA, GICV5_READ_ALLOC) |
583 FIELD_PREP(GICV5_IRS_CR1_IC, GICV5_WB_CACHE) |
584 FIELD_PREP(GICV5_IRS_CR1_OC, GICV5_WB_CACHE) |
585 FIELD_PREP(GICV5_IRS_CR1_SH, GICV5_INNER_SHARE);
586 }
587
588 irs_writel_relaxed(irs_data, cr1, GICV5_IRS_CR1);
589
590 cr0 = FIELD_PREP(GICV5_IRS_CR0_IRSEN, 0x1);
591 irs_writel_relaxed(irs_data, cr0, GICV5_IRS_CR0);
592 gicv5_irs_wait_for_idle(irs_data);
593}
594
595static int __init gicv5_irs_of_init_affinity(struct device_node *node,
596 struct gicv5_irs_chip_data *irs_data,
597 u8 iaffid_bits)
598{
599 /*
600 * Detect IAFFID<->CPU mappings from the device tree and
601 * record IRS<->CPU topology information.
602 */
603 u16 iaffid_mask = GENMASK(iaffid_bits - 1, 0);
604 int ret, i, ncpus, niaffids;
605
606 ncpus = of_count_phandle_with_args(node, "cpus", NULL);
607 if (ncpus < 0)
608 return -EINVAL;
609
610 niaffids = of_property_count_elems_of_size(node, "arm,iaffids",
611 sizeof(u16));
612 if (niaffids != ncpus)
613 return -EINVAL;
614
615 u16 *iaffids __free(kfree) = kcalloc(niaffids, sizeof(*iaffids), GFP_KERNEL);
616 if (!iaffids)
617 return -ENOMEM;
618
619 ret = of_property_read_u16_array(node, "arm,iaffids", iaffids, niaffids);
620 if (ret)
621 return ret;
622
623 for (i = 0; i < ncpus; i++) {
624 struct device_node *cpu_node;
625 int cpu;
626
627 cpu_node = of_parse_phandle(node, "cpus", i);
628 if (!cpu_node) {
629 pr_warn(FW_BUG "Erroneous CPU node phandle\n");
630 continue;
631 }
632
633 cpu = of_cpu_node_to_id(cpu_node);
634 of_node_put(cpu_node);
635 if (cpu < 0)
636 continue;
637
638 if (iaffids[i] & ~iaffid_mask) {
639 pr_warn("CPU %d iaffid 0x%x exceeds IRS iaffid bits\n",
640 cpu, iaffids[i]);
641 continue;
642 }
643
644 per_cpu(cpu_iaffid, cpu).iaffid = iaffids[i];
645 per_cpu(cpu_iaffid, cpu).valid = true;
646
647 /* We also know that the CPU is connected to this IRS */
648 per_cpu(per_cpu_irs_data, cpu) = irs_data;
649 }
650
651 return ret;
652}
653
654static void irs_setup_pri_bits(u32 idr1)
655{
656 switch (FIELD_GET(GICV5_IRS_IDR1_PRIORITY_BITS, idr1)) {
657 case GICV5_IRS_IDR1_PRIORITY_BITS_1BITS:
658 gicv5_global_data.irs_pri_bits = 1;
659 break;
660 case GICV5_IRS_IDR1_PRIORITY_BITS_2BITS:
661 gicv5_global_data.irs_pri_bits = 2;
662 break;
663 case GICV5_IRS_IDR1_PRIORITY_BITS_3BITS:
664 gicv5_global_data.irs_pri_bits = 3;
665 break;
666 case GICV5_IRS_IDR1_PRIORITY_BITS_4BITS:
667 gicv5_global_data.irs_pri_bits = 4;
668 break;
669 case GICV5_IRS_IDR1_PRIORITY_BITS_5BITS:
670 gicv5_global_data.irs_pri_bits = 5;
671 break;
672 default:
673 pr_warn("Detected wrong IDR priority bits value 0x%lx\n",
674 FIELD_GET(GICV5_IRS_IDR1_PRIORITY_BITS, idr1));
675 gicv5_global_data.irs_pri_bits = 1;
676 break;
677 }
678}
679
680static int __init gicv5_irs_init(struct gicv5_irs_chip_data *irs_data)
681{
682 u32 spi_count, idr = irs_readl_relaxed(irs_data, GICV5_IRS_IDR2);
683
684 if (WARN(!FIELD_GET(GICV5_IRS_IDR2_LPI, idr),
685 "LPI support not available - no IPIs, can't proceed\n")) {
686 return -ENODEV;
687 }
688
689 idr = irs_readl_relaxed(irs_data, GICV5_IRS_IDR7);
690 irs_data->spi_min = FIELD_GET(GICV5_IRS_IDR7_SPI_BASE, idr);
691
692 idr = irs_readl_relaxed(irs_data, GICV5_IRS_IDR6);
693 irs_data->spi_range = FIELD_GET(GICV5_IRS_IDR6_SPI_IRS_RANGE, idr);
694
695 /*
696 * Do the global setting only on the first IRS.
697 * Global properties (iaffid_bits, global spi count) are guaranteed to
698 * be consistent across IRSes by the architecture.
699 */
700 if (list_empty(&irs_nodes)) {
701 idr = irs_readl_relaxed(irs_data, GICV5_IRS_IDR0);
702 gicv5_global_data.virt_capable = !!FIELD_GET(GICV5_IRS_IDR0_VIRT, idr);
703
704 idr = irs_readl_relaxed(irs_data, GICV5_IRS_IDR1);
705 irs_setup_pri_bits(idr);
706
707 idr = irs_readl_relaxed(irs_data, GICV5_IRS_IDR5);
708
709 spi_count = FIELD_GET(GICV5_IRS_IDR5_SPI_RANGE, idr);
710 gicv5_global_data.global_spi_count = spi_count;
711
712 gicv5_init_lpi_domain();
713
714 pr_debug("Detected %u SPIs globally\n", spi_count);
715 }
716
717 list_add_tail(&irs_data->entry, &irs_nodes);
718
719 return 0;
720}
721
722static int __init gicv5_irs_of_init(struct device_node *node)
723{
724 struct gicv5_irs_chip_data *irs_data;
725 void __iomem *irs_base;
726 u8 iaffid_bits;
727 u32 idr;
728 int ret;
729
730 irs_data = kzalloc_obj(*irs_data);
731 if (!irs_data)
732 return -ENOMEM;
733
734 raw_spin_lock_init(&irs_data->spi_config_lock);
735
736 ret = of_property_match_string(node, "reg-names", "ns-config");
737 if (ret < 0) {
738 pr_err("%pOF: ns-config reg-name not present\n", node);
739 goto out_err;
740 }
741
742 irs_base = of_io_request_and_map(node, ret, of_node_full_name(node));
743 if (IS_ERR(irs_base)) {
744 pr_err("%pOF: unable to map GICv5 IRS registers\n", node);
745 ret = PTR_ERR(irs_base);
746 goto out_err;
747 }
748
749 irs_data->fwnode = of_fwnode_handle(node);
750 gicv5_irs_init_bases(irs_data, irs_base, of_property_read_bool(node, "dma-noncoherent"));
751
752 idr = irs_readl_relaxed(irs_data, GICV5_IRS_IDR1);
753 iaffid_bits = FIELD_GET(GICV5_IRS_IDR1_IAFFID_BITS, idr) + 1;
754
755 ret = gicv5_irs_of_init_affinity(node, irs_data, iaffid_bits);
756 if (ret) {
757 pr_err("Failed to parse CPU IAFFIDs from the device tree!\n");
758 goto out_iomem;
759 }
760
761 ret = gicv5_irs_init(irs_data);
762 if (ret)
763 goto out_iomem;
764
765 if (irs_data->spi_range) {
766 pr_info("%s detected SPI range [%u-%u]\n",
767 of_node_full_name(node),
768 irs_data->spi_min,
769 irs_data->spi_min +
770 irs_data->spi_range - 1);
771 }
772
773 return ret;
774
775out_iomem:
776 iounmap(irs_base);
777out_err:
778 kfree(irs_data);
779 return ret;
780}
781
782void __init gicv5_irs_remove(void)
783{
784 struct gicv5_irs_chip_data *irs_data, *tmp_data;
785
786 gicv5_free_lpi_domain();
787 gicv5_deinit_lpis();
788
789 list_for_each_entry_safe(irs_data, tmp_data, &irs_nodes, entry) {
790 iounmap(irs_data->irs_base);
791 list_del(&irs_data->entry);
792 kfree(irs_data);
793 }
794}
795
796int __init gicv5_irs_enable(void)
797{
798 struct gicv5_irs_chip_data *irs_data;
799 int ret;
800
801 irs_data = list_first_entry_or_null(&irs_nodes,
802 struct gicv5_irs_chip_data, entry);
803 if (!irs_data)
804 return -ENODEV;
805
806 ret = gicv5_irs_init_ist(irs_data);
807 if (ret) {
808 pr_err("Failed to init IST\n");
809 return ret;
810 }
811
812 return 0;
813}
814
815void __init gicv5_irs_its_probe(void)
816{
817 struct gicv5_irs_chip_data *irs_data;
818
819 if (acpi_disabled)
820 list_for_each_entry(irs_data, &irs_nodes, entry)
821 gicv5_its_of_probe(to_of_node(irs_data->fwnode));
822 else
823 gicv5_its_acpi_probe();
824}
825
826int __init gicv5_irs_of_probe(struct device_node *parent)
827{
828 struct device_node *np;
829 int ret;
830
831 for_each_available_child_of_node(parent, np) {
832 if (!of_device_is_compatible(np, "arm,gic-v5-irs"))
833 continue;
834
835 ret = gicv5_irs_of_init(np);
836 if (ret)
837 pr_err("Failed to init IRS %s\n", np->full_name);
838 }
839
840 return list_empty(&irs_nodes) ? -ENODEV : 0;
841}
842
843#ifdef CONFIG_ACPI
844
845#define ACPI_GICV5_IRS_MEM_SIZE (SZ_64K)
846static struct gicv5_irs_chip_data *current_irs_data __initdata;
847static int current_irsid __initdata = -1;
848static u8 current_iaffid_bits __initdata;
849
850static int __init gic_acpi_parse_iaffid(union acpi_subtable_headers *header,
851 const unsigned long end)
852{
853 struct acpi_madt_generic_interrupt *gicc = (struct acpi_madt_generic_interrupt *)header;
854 int cpu;
855
856 if (!(gicc->flags & (ACPI_MADT_ENABLED | ACPI_MADT_GICC_ONLINE_CAPABLE)))
857 return 0;
858
859 if (gicc->irs_id != current_irsid)
860 return 0;
861
862 cpu = get_logical_index(gicc->arm_mpidr);
863
864 if (gicc->iaffid & ~GENMASK(current_iaffid_bits - 1, 0)) {
865 pr_warn("CPU %d iaffid 0x%x exceeds IRS iaffid bits\n", cpu, gicc->iaffid);
866 return 0;
867 }
868
869 /* Bind the IAFFID and the CPU */
870 per_cpu(cpu_iaffid, cpu).iaffid = gicc->iaffid;
871 per_cpu(cpu_iaffid, cpu).valid = true;
872 pr_debug("Processed IAFFID %u for CPU%d", per_cpu(cpu_iaffid, cpu).iaffid, cpu);
873
874 /* We also know that the CPU is connected to this IRS */
875 per_cpu(per_cpu_irs_data, cpu) = current_irs_data;
876
877 return 0;
878}
879
880static int __init gicv5_irs_acpi_init_affinity(u32 irsid, struct gicv5_irs_chip_data *irs_data)
881{
882 u32 idr;
883
884 current_irsid = irsid;
885 current_irs_data = irs_data;
886
887 idr = irs_readl_relaxed(irs_data, GICV5_IRS_IDR1);
888 current_iaffid_bits = FIELD_GET(GICV5_IRS_IDR1_IAFFID_BITS, idr) + 1;
889
890 acpi_table_parse_madt(ACPI_MADT_TYPE_GENERIC_INTERRUPT, gic_acpi_parse_iaffid, 0);
891
892 return 0;
893}
894
895static struct resource * __init gic_request_region(resource_size_t base, resource_size_t size,
896 const char *name)
897{
898 struct resource *r = request_mem_region(base, size, name);
899
900 if (!r)
901 pr_warn_once(FW_BUG "%s region %pa has overlapping address\n", name, &base);
902
903 return r;
904}
905
906static int __init gic_acpi_parse_madt_irs(union acpi_subtable_headers *header,
907 const unsigned long end)
908{
909 struct acpi_madt_gicv5_irs *irs = (struct acpi_madt_gicv5_irs *)header;
910 struct gicv5_irs_chip_data *irs_data;
911 void __iomem *irs_base;
912 struct resource *r;
913 int ret;
914
915 /* Per-IRS data structure */
916 irs_data = kzalloc_obj(*irs_data);
917 if (!irs_data)
918 return -ENOMEM;
919
920 /* This spinlock is used for SPI config changes */
921 raw_spin_lock_init(&irs_data->spi_config_lock);
922
923 r = gic_request_region(irs->config_base_address, ACPI_GICV5_IRS_MEM_SIZE, "GICv5 IRS");
924 if (!r) {
925 ret = -EBUSY;
926 goto out_free;
927 }
928
929 irs_base = ioremap(irs->config_base_address, ACPI_GICV5_IRS_MEM_SIZE);
930 if (!irs_base) {
931 pr_err("Unable to map GIC IRS registers\n");
932 ret = -ENOMEM;
933 goto out_release;
934 }
935
936 gicv5_irs_init_bases(irs_data, irs_base, irs->flags & ACPI_MADT_IRS_NON_COHERENT);
937
938 gicv5_irs_acpi_init_affinity(irs->irs_id, irs_data);
939
940 ret = gicv5_irs_init(irs_data);
941 if (ret)
942 goto out_map;
943
944 if (irs_data->spi_range) {
945 pr_info("%s @%llx detected SPI range [%u-%u]\n", "IRS", irs->config_base_address,
946 irs_data->spi_min,
947 irs_data->spi_min +
948 irs_data->spi_range - 1);
949 }
950
951 return 0;
952
953out_map:
954 iounmap(irs_base);
955out_release:
956 release_mem_region(r->start, resource_size(r));
957out_free:
958 kfree(irs_data);
959 return ret;
960}
961
962int __init gicv5_irs_acpi_probe(void)
963{
964 acpi_table_parse_madt(ACPI_MADT_TYPE_GICV5_IRS, gic_acpi_parse_madt_irs, 0);
965
966 return list_empty(&irs_nodes) ? -ENODEV : 0;
967}
968#endif