hc
2024-03-26 e0728245c89800c2038c23308f2d88969d5b41c8
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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
/* SPDX-License-Identifier: GPL-2.0-only */
/*
 * Copyright (C) 2013, 2014 ARM Limited, All Rights Reserved.
 * Author: Marc Zyngier <marc.zyngier@arm.com>
 */
#ifndef __LINUX_IRQCHIP_ARM_GIC_V3_H
#define __LINUX_IRQCHIP_ARM_GIC_V3_H
 
/*
 * Distributor registers. We assume we're running non-secure, with ARE
 * being set. Secure-only and non-ARE registers are not described.
 */
#define GICD_CTLR            0x0000
#define GICD_TYPER            0x0004
#define GICD_IIDR            0x0008
#define GICD_TYPER2            0x000C
#define GICD_STATUSR            0x0010
#define GICD_SETSPI_NSR            0x0040
#define GICD_CLRSPI_NSR            0x0048
#define GICD_SETSPI_SR            0x0050
#define GICD_CLRSPI_SR            0x0058
#define GICD_IGROUPR            0x0080
#define GICD_ISENABLER            0x0100
#define GICD_ICENABLER            0x0180
#define GICD_ISPENDR            0x0200
#define GICD_ICPENDR            0x0280
#define GICD_ISACTIVER            0x0300
#define GICD_ICACTIVER            0x0380
#define GICD_IPRIORITYR            0x0400
#define GICD_ICFGR            0x0C00
#define GICD_IGRPMODR            0x0D00
#define GICD_NSACR            0x0E00
#define GICD_IGROUPRnE            0x1000
#define GICD_ISENABLERnE        0x1200
#define GICD_ICENABLERnE        0x1400
#define GICD_ISPENDRnE            0x1600
#define GICD_ICPENDRnE            0x1800
#define GICD_ISACTIVERnE        0x1A00
#define GICD_ICACTIVERnE        0x1C00
#define GICD_IPRIORITYRnE        0x2000
#define GICD_ICFGRnE            0x3000
#define GICD_IROUTER            0x6000
#define GICD_IROUTERnE            0x8000
#define GICD_IDREGS            0xFFD0
#define GICD_PIDR2            0xFFE8
 
#define ESPI_BASE_INTID            4096
 
/*
 * Those registers are actually from GICv2, but the spec demands that they
 * are implemented as RES0 if ARE is 1 (which we do in KVM's emulated GICv3).
 */
#define GICD_ITARGETSR            0x0800
#define GICD_SGIR            0x0F00
#define GICD_CPENDSGIR            0x0F10
#define GICD_SPENDSGIR            0x0F20
 
#define GICD_CTLR_RWP            (1U << 31)
#define GICD_CTLR_nASSGIreq        (1U << 8)
#define GICD_CTLR_DS            (1U << 6)
#define GICD_CTLR_ARE_NS        (1U << 4)
#define GICD_CTLR_ENABLE_G1A        (1U << 1)
#define GICD_CTLR_ENABLE_G1        (1U << 0)
 
#define GICD_IIDR_IMPLEMENTER_SHIFT    0
#define GICD_IIDR_IMPLEMENTER_MASK    (0xfff << GICD_IIDR_IMPLEMENTER_SHIFT)
#define GICD_IIDR_REVISION_SHIFT    12
#define GICD_IIDR_REVISION_MASK        (0xf << GICD_IIDR_REVISION_SHIFT)
#define GICD_IIDR_VARIANT_SHIFT        16
#define GICD_IIDR_VARIANT_MASK        (0xf << GICD_IIDR_VARIANT_SHIFT)
#define GICD_IIDR_PRODUCT_ID_SHIFT    24
#define GICD_IIDR_PRODUCT_ID_MASK    (0xff << GICD_IIDR_PRODUCT_ID_SHIFT)
 
 
/*
 * In systems with a single security state (what we emulate in KVM)
 * the meaning of the interrupt group enable bits is slightly different
 */
#define GICD_CTLR_ENABLE_SS_G1        (1U << 1)
#define GICD_CTLR_ENABLE_SS_G0        (1U << 0)
 
#define GICD_TYPER_RSS            (1U << 26)
#define GICD_TYPER_LPIS            (1U << 17)
#define GICD_TYPER_MBIS            (1U << 16)
#define GICD_TYPER_ESPI            (1U << 8)
 
#define GICD_TYPER_ID_BITS(typer)    ((((typer) >> 19) & 0x1f) + 1)
#define GICD_TYPER_NUM_LPIS(typer)    ((((typer) >> 11) & 0x1f) + 1)
#define GICD_TYPER_SPIS(typer)        ((((typer) & 0x1f) + 1) * 32)
#define GICD_TYPER_ESPIS(typer)                        \
   (((typer) & GICD_TYPER_ESPI) ? GICD_TYPER_SPIS((typer) >> 27) : 0)
 
#define GICD_TYPER2_nASSGIcap        (1U << 8)
#define GICD_TYPER2_VIL            (1U << 7)
#define GICD_TYPER2_VID            GENMASK(4, 0)
 
#define GICD_IROUTER_SPI_MODE_ONE    (0U << 31)
#define GICD_IROUTER_SPI_MODE_ANY    (1U << 31)
 
#define GIC_PIDR2_ARCH_MASK        0xf0
#define GIC_PIDR2_ARCH_GICv3        0x30
#define GIC_PIDR2_ARCH_GICv4        0x40
 
#define GIC_V3_DIST_SIZE        0x10000
 
#define GIC_PAGE_SIZE_4K        0ULL
#define GIC_PAGE_SIZE_16K        1ULL
#define GIC_PAGE_SIZE_64K        2ULL
#define GIC_PAGE_SIZE_MASK        3ULL
 
/*
 * Re-Distributor registers, offsets from RD_base
 */
#define GICR_CTLR            GICD_CTLR
#define GICR_IIDR            0x0004
#define GICR_TYPER            0x0008
#define GICR_STATUSR            GICD_STATUSR
#define GICR_WAKER            0x0014
#define GICR_SETLPIR            0x0040
#define GICR_CLRLPIR            0x0048
#define GICR_PROPBASER            0x0070
#define GICR_PENDBASER            0x0078
#define GICR_INVLPIR            0x00A0
#define GICR_INVALLR            0x00B0
#define GICR_SYNCR            0x00C0
#define GICR_IDREGS            GICD_IDREGS
#define GICR_PIDR2            GICD_PIDR2
 
#define GICR_CTLR_ENABLE_LPIS        (1UL << 0)
#define GICR_CTLR_RWP            (1UL << 3)
 
#define GICR_TYPER_CPU_NUMBER(r)    (((r) >> 8) & 0xffff)
 
#define EPPI_BASE_INTID            1056
 
#define GICR_TYPER_NR_PPIS(r)                        \
   ({                                \
       unsigned int __ppinum = ((r) >> 27) & 0x1f;        \
       unsigned int __nr_ppis = 16;                \
       if (__ppinum == 1 || __ppinum == 2)            \
           __nr_ppis +=  __ppinum * 32;            \
                                   \
       __nr_ppis;                        \
    })
 
#define GICR_WAKER_ProcessorSleep    (1U << 1)
#define GICR_WAKER_ChildrenAsleep    (1U << 2)
 
#define GIC_BASER_CACHE_nCnB        0ULL
#define GIC_BASER_CACHE_SameAsInner    0ULL
#define GIC_BASER_CACHE_nC        1ULL
#define GIC_BASER_CACHE_RaWt        2ULL
#define GIC_BASER_CACHE_RaWb        3ULL
#define GIC_BASER_CACHE_WaWt        4ULL
#define GIC_BASER_CACHE_WaWb        5ULL
#define GIC_BASER_CACHE_RaWaWt        6ULL
#define GIC_BASER_CACHE_RaWaWb        7ULL
#define GIC_BASER_CACHE_MASK        7ULL
#define GIC_BASER_NonShareable        0ULL
#define GIC_BASER_InnerShareable    1ULL
#define GIC_BASER_OuterShareable    2ULL
#define GIC_BASER_SHAREABILITY_MASK    3ULL
 
#define GIC_BASER_CACHEABILITY(reg, inner_outer, type)            \
   (GIC_BASER_CACHE_##type << reg##_##inner_outer##_CACHEABILITY_SHIFT)
 
#define GIC_BASER_SHAREABILITY(reg, type)                \
   (GIC_BASER_##type << reg##_SHAREABILITY_SHIFT)
 
/* encode a size field of width @w containing @n - 1 units */
#define GIC_ENCODE_SZ(n, w) (((unsigned long)(n) - 1) & GENMASK_ULL(((w) - 1), 0))
 
#define GICR_PROPBASER_SHAREABILITY_SHIFT        (10)
#define GICR_PROPBASER_INNER_CACHEABILITY_SHIFT        (7)
#define GICR_PROPBASER_OUTER_CACHEABILITY_SHIFT        (56)
#define GICR_PROPBASER_SHAREABILITY_MASK                \
   GIC_BASER_SHAREABILITY(GICR_PROPBASER, SHAREABILITY_MASK)
#define GICR_PROPBASER_INNER_CACHEABILITY_MASK                \
   GIC_BASER_CACHEABILITY(GICR_PROPBASER, INNER, MASK)
#define GICR_PROPBASER_OUTER_CACHEABILITY_MASK                \
   GIC_BASER_CACHEABILITY(GICR_PROPBASER, OUTER, MASK)
#define GICR_PROPBASER_CACHEABILITY_MASK GICR_PROPBASER_INNER_CACHEABILITY_MASK
 
#define GICR_PROPBASER_InnerShareable                    \
   GIC_BASER_SHAREABILITY(GICR_PROPBASER, InnerShareable)
 
#define GICR_PROPBASER_nCnB    GIC_BASER_CACHEABILITY(GICR_PROPBASER, INNER, nCnB)
#define GICR_PROPBASER_nC     GIC_BASER_CACHEABILITY(GICR_PROPBASER, INNER, nC)
#define GICR_PROPBASER_RaWt    GIC_BASER_CACHEABILITY(GICR_PROPBASER, INNER, RaWt)
#define GICR_PROPBASER_RaWb    GIC_BASER_CACHEABILITY(GICR_PROPBASER, INNER, RaWb)
#define GICR_PROPBASER_WaWt    GIC_BASER_CACHEABILITY(GICR_PROPBASER, INNER, WaWt)
#define GICR_PROPBASER_WaWb    GIC_BASER_CACHEABILITY(GICR_PROPBASER, INNER, WaWb)
#define GICR_PROPBASER_RaWaWt    GIC_BASER_CACHEABILITY(GICR_PROPBASER, INNER, RaWaWt)
#define GICR_PROPBASER_RaWaWb    GIC_BASER_CACHEABILITY(GICR_PROPBASER, INNER, RaWaWb)
 
#define GICR_PROPBASER_IDBITS_MASK            (0x1f)
#define GICR_PROPBASER_ADDRESS(x)    ((x) & GENMASK_ULL(51, 12))
#define GICR_PENDBASER_ADDRESS(x)    ((x) & GENMASK_ULL(51, 16))
 
#define GICR_PENDBASER_SHAREABILITY_SHIFT        (10)
#define GICR_PENDBASER_INNER_CACHEABILITY_SHIFT        (7)
#define GICR_PENDBASER_OUTER_CACHEABILITY_SHIFT        (56)
#define GICR_PENDBASER_SHAREABILITY_MASK                \
   GIC_BASER_SHAREABILITY(GICR_PENDBASER, SHAREABILITY_MASK)
#define GICR_PENDBASER_INNER_CACHEABILITY_MASK                \
   GIC_BASER_CACHEABILITY(GICR_PENDBASER, INNER, MASK)
#define GICR_PENDBASER_OUTER_CACHEABILITY_MASK                \
   GIC_BASER_CACHEABILITY(GICR_PENDBASER, OUTER, MASK)
#define GICR_PENDBASER_CACHEABILITY_MASK GICR_PENDBASER_INNER_CACHEABILITY_MASK
 
#define GICR_PENDBASER_InnerShareable                    \
   GIC_BASER_SHAREABILITY(GICR_PENDBASER, InnerShareable)
 
#define GICR_PENDBASER_nCnB    GIC_BASER_CACHEABILITY(GICR_PENDBASER, INNER, nCnB)
#define GICR_PENDBASER_nC     GIC_BASER_CACHEABILITY(GICR_PENDBASER, INNER, nC)
#define GICR_PENDBASER_RaWt    GIC_BASER_CACHEABILITY(GICR_PENDBASER, INNER, RaWt)
#define GICR_PENDBASER_RaWb    GIC_BASER_CACHEABILITY(GICR_PENDBASER, INNER, RaWb)
#define GICR_PENDBASER_WaWt    GIC_BASER_CACHEABILITY(GICR_PENDBASER, INNER, WaWt)
#define GICR_PENDBASER_WaWb    GIC_BASER_CACHEABILITY(GICR_PENDBASER, INNER, WaWb)
#define GICR_PENDBASER_RaWaWt    GIC_BASER_CACHEABILITY(GICR_PENDBASER, INNER, RaWaWt)
#define GICR_PENDBASER_RaWaWb    GIC_BASER_CACHEABILITY(GICR_PENDBASER, INNER, RaWaWb)
 
#define GICR_PENDBASER_PTZ                BIT_ULL(62)
 
/*
 * Re-Distributor registers, offsets from SGI_base
 */
#define GICR_IGROUPR0            GICD_IGROUPR
#define GICR_ISENABLER0            GICD_ISENABLER
#define GICR_ICENABLER0            GICD_ICENABLER
#define GICR_ISPENDR0            GICD_ISPENDR
#define GICR_ICPENDR0            GICD_ICPENDR
#define GICR_ISACTIVER0            GICD_ISACTIVER
#define GICR_ICACTIVER0            GICD_ICACTIVER
#define GICR_IPRIORITYR0        GICD_IPRIORITYR
#define GICR_ICFGR0            GICD_ICFGR
#define GICR_IGRPMODR0            GICD_IGRPMODR
#define GICR_NSACR            GICD_NSACR
 
#define GICR_TYPER_PLPIS        (1U << 0)
#define GICR_TYPER_VLPIS        (1U << 1)
#define GICR_TYPER_DIRTY        (1U << 2)
#define GICR_TYPER_DirectLPIS        (1U << 3)
#define GICR_TYPER_LAST            (1U << 4)
#define GICR_TYPER_RVPEID        (1U << 7)
#define GICR_TYPER_COMMON_LPI_AFF    GENMASK_ULL(25, 24)
#define GICR_TYPER_AFFINITY        GENMASK_ULL(63, 32)
 
#define GICR_INVLPIR_INTID        GENMASK_ULL(31, 0)
#define GICR_INVLPIR_VPEID        GENMASK_ULL(47, 32)
#define GICR_INVLPIR_V            GENMASK_ULL(63, 63)
 
#define GICR_INVALLR_VPEID        GICR_INVLPIR_VPEID
#define GICR_INVALLR_V            GICR_INVLPIR_V
 
#define GIC_V3_REDIST_SIZE        0x20000
 
#define LPI_PROP_GROUP1            (1 << 1)
#define LPI_PROP_ENABLED        (1 << 0)
 
/*
 * Re-Distributor registers, offsets from VLPI_base
 */
#define GICR_VPROPBASER            0x0070
 
#define GICR_VPROPBASER_IDBITS_MASK    0x1f
 
#define GICR_VPROPBASER_SHAREABILITY_SHIFT        (10)
#define GICR_VPROPBASER_INNER_CACHEABILITY_SHIFT    (7)
#define GICR_VPROPBASER_OUTER_CACHEABILITY_SHIFT    (56)
 
#define GICR_VPROPBASER_SHAREABILITY_MASK                \
   GIC_BASER_SHAREABILITY(GICR_VPROPBASER, SHAREABILITY_MASK)
#define GICR_VPROPBASER_INNER_CACHEABILITY_MASK                \
   GIC_BASER_CACHEABILITY(GICR_VPROPBASER, INNER, MASK)
#define GICR_VPROPBASER_OUTER_CACHEABILITY_MASK                \
   GIC_BASER_CACHEABILITY(GICR_VPROPBASER, OUTER, MASK)
#define GICR_VPROPBASER_CACHEABILITY_MASK                \
   GICR_VPROPBASER_INNER_CACHEABILITY_MASK
 
#define GICR_VPROPBASER_InnerShareable                    \
   GIC_BASER_SHAREABILITY(GICR_VPROPBASER, InnerShareable)
 
#define GICR_VPROPBASER_nCnB    GIC_BASER_CACHEABILITY(GICR_VPROPBASER, INNER, nCnB)
#define GICR_VPROPBASER_nC     GIC_BASER_CACHEABILITY(GICR_VPROPBASER, INNER, nC)
#define GICR_VPROPBASER_RaWt    GIC_BASER_CACHEABILITY(GICR_VPROPBASER, INNER, RaWt)
#define GICR_VPROPBASER_RaWb    GIC_BASER_CACHEABILITY(GICR_VPROPBASER, INNER, RaWb)
#define GICR_VPROPBASER_WaWt    GIC_BASER_CACHEABILITY(GICR_VPROPBASER, INNER, WaWt)
#define GICR_VPROPBASER_WaWb    GIC_BASER_CACHEABILITY(GICR_VPROPBASER, INNER, WaWb)
#define GICR_VPROPBASER_RaWaWt    GIC_BASER_CACHEABILITY(GICR_VPROPBASER, INNER, RaWaWt)
#define GICR_VPROPBASER_RaWaWb    GIC_BASER_CACHEABILITY(GICR_VPROPBASER, INNER, RaWaWb)
 
/*
 * GICv4.1 VPROPBASER reinvention. A subtle mix between the old
 * VPROPBASER and ITS_BASER. Just not quite any of the two.
 */
#define GICR_VPROPBASER_4_1_VALID    (1ULL << 63)
#define GICR_VPROPBASER_4_1_ENTRY_SIZE    GENMASK_ULL(61, 59)
#define GICR_VPROPBASER_4_1_INDIRECT    (1ULL << 55)
#define GICR_VPROPBASER_4_1_PAGE_SIZE    GENMASK_ULL(54, 53)
#define GICR_VPROPBASER_4_1_Z        (1ULL << 52)
#define GICR_VPROPBASER_4_1_ADDR    GENMASK_ULL(51, 12)
#define GICR_VPROPBASER_4_1_SIZE    GENMASK_ULL(6, 0)
 
#define GICR_VPENDBASER            0x0078
 
#define GICR_VPENDBASER_SHAREABILITY_SHIFT        (10)
#define GICR_VPENDBASER_INNER_CACHEABILITY_SHIFT    (7)
#define GICR_VPENDBASER_OUTER_CACHEABILITY_SHIFT    (56)
#define GICR_VPENDBASER_SHAREABILITY_MASK                \
   GIC_BASER_SHAREABILITY(GICR_VPENDBASER, SHAREABILITY_MASK)
#define GICR_VPENDBASER_INNER_CACHEABILITY_MASK                \
   GIC_BASER_CACHEABILITY(GICR_VPENDBASER, INNER, MASK)
#define GICR_VPENDBASER_OUTER_CACHEABILITY_MASK                \
   GIC_BASER_CACHEABILITY(GICR_VPENDBASER, OUTER, MASK)
#define GICR_VPENDBASER_CACHEABILITY_MASK                \
   GICR_VPENDBASER_INNER_CACHEABILITY_MASK
 
#define GICR_VPENDBASER_NonShareable                    \
   GIC_BASER_SHAREABILITY(GICR_VPENDBASER, NonShareable)
 
#define GICR_VPENDBASER_InnerShareable                    \
   GIC_BASER_SHAREABILITY(GICR_VPENDBASER, InnerShareable)
 
#define GICR_VPENDBASER_nCnB    GIC_BASER_CACHEABILITY(GICR_VPENDBASER, INNER, nCnB)
#define GICR_VPENDBASER_nC     GIC_BASER_CACHEABILITY(GICR_VPENDBASER, INNER, nC)
#define GICR_VPENDBASER_RaWt    GIC_BASER_CACHEABILITY(GICR_VPENDBASER, INNER, RaWt)
#define GICR_VPENDBASER_RaWb    GIC_BASER_CACHEABILITY(GICR_VPENDBASER, INNER, RaWb)
#define GICR_VPENDBASER_WaWt    GIC_BASER_CACHEABILITY(GICR_VPENDBASER, INNER, WaWt)
#define GICR_VPENDBASER_WaWb    GIC_BASER_CACHEABILITY(GICR_VPENDBASER, INNER, WaWb)
#define GICR_VPENDBASER_RaWaWt    GIC_BASER_CACHEABILITY(GICR_VPENDBASER, INNER, RaWaWt)
#define GICR_VPENDBASER_RaWaWb    GIC_BASER_CACHEABILITY(GICR_VPENDBASER, INNER, RaWaWb)
 
#define GICR_VPENDBASER_Dirty        (1ULL << 60)
#define GICR_VPENDBASER_PendingLast    (1ULL << 61)
#define GICR_VPENDBASER_IDAI        (1ULL << 62)
#define GICR_VPENDBASER_Valid        (1ULL << 63)
 
/*
 * GICv4.1 VPENDBASER, used for VPE residency. On top of these fields,
 * also use the above Valid, PendingLast and Dirty.
 */
#define GICR_VPENDBASER_4_1_DB        (1ULL << 62)
#define GICR_VPENDBASER_4_1_VGRP0EN    (1ULL << 59)
#define GICR_VPENDBASER_4_1_VGRP1EN    (1ULL << 58)
#define GICR_VPENDBASER_4_1_VPEID    GENMASK_ULL(15, 0)
 
#define GICR_VSGIR            0x0080
 
#define GICR_VSGIR_VPEID        GENMASK(15, 0)
 
#define GICR_VSGIPENDR            0x0088
 
#define GICR_VSGIPENDR_BUSY        (1U << 31)
#define GICR_VSGIPENDR_PENDING        GENMASK(15, 0)
 
/*
 * ITS registers, offsets from ITS_base
 */
#define GITS_CTLR            0x0000
#define GITS_IIDR            0x0004
#define GITS_TYPER            0x0008
#define GITS_MPIDR            0x0018
#define GITS_CBASER            0x0080
#define GITS_CWRITER            0x0088
#define GITS_CREADR            0x0090
#define GITS_BASER            0x0100
#define GITS_IDREGS_BASE        0xffd0
#define GITS_PIDR0            0xffe0
#define GITS_PIDR1            0xffe4
#define GITS_PIDR2            GICR_PIDR2
#define GITS_PIDR4            0xffd0
#define GITS_CIDR0            0xfff0
#define GITS_CIDR1            0xfff4
#define GITS_CIDR2            0xfff8
#define GITS_CIDR3            0xfffc
 
#define GITS_TRANSLATER            0x10040
 
#define GITS_SGIR            0x20020
 
#define GITS_SGIR_VPEID            GENMASK_ULL(47, 32)
#define GITS_SGIR_VINTID        GENMASK_ULL(3, 0)
 
#define GITS_CTLR_ENABLE        (1U << 0)
#define GITS_CTLR_ImDe            (1U << 1)
#define    GITS_CTLR_ITS_NUMBER_SHIFT    4
#define    GITS_CTLR_ITS_NUMBER        (0xFU << GITS_CTLR_ITS_NUMBER_SHIFT)
#define GITS_CTLR_QUIESCENT        (1U << 31)
 
#define GITS_TYPER_PLPIS        (1UL << 0)
#define GITS_TYPER_VLPIS        (1UL << 1)
#define GITS_TYPER_ITT_ENTRY_SIZE_SHIFT    4
#define GITS_TYPER_ITT_ENTRY_SIZE    GENMASK_ULL(7, 4)
#define GITS_TYPER_IDBITS_SHIFT        8
#define GITS_TYPER_DEVBITS_SHIFT    13
#define GITS_TYPER_DEVBITS        GENMASK_ULL(17, 13)
#define GITS_TYPER_PTA            (1UL << 19)
#define GITS_TYPER_HCC_SHIFT        24
#define GITS_TYPER_HCC(r)        (((r) >> GITS_TYPER_HCC_SHIFT) & 0xff)
#define GITS_TYPER_VMOVP        (1ULL << 37)
#define GITS_TYPER_VMAPP        (1ULL << 40)
#define GITS_TYPER_SVPET        GENMASK_ULL(42, 41)
 
#define GITS_IIDR_REV_SHIFT        12
#define GITS_IIDR_REV_MASK        (0xf << GITS_IIDR_REV_SHIFT)
#define GITS_IIDR_REV(r)        (((r) >> GITS_IIDR_REV_SHIFT) & 0xf)
#define GITS_IIDR_PRODUCTID_SHIFT    24
 
#define GITS_CBASER_VALID            (1ULL << 63)
#define GITS_CBASER_SHAREABILITY_SHIFT        (10)
#define GITS_CBASER_INNER_CACHEABILITY_SHIFT    (59)
#define GITS_CBASER_OUTER_CACHEABILITY_SHIFT    (53)
#define GITS_CBASER_SHAREABILITY_MASK                    \
   GIC_BASER_SHAREABILITY(GITS_CBASER, SHAREABILITY_MASK)
#define GITS_CBASER_INNER_CACHEABILITY_MASK                \
   GIC_BASER_CACHEABILITY(GITS_CBASER, INNER, MASK)
#define GITS_CBASER_OUTER_CACHEABILITY_MASK                \
   GIC_BASER_CACHEABILITY(GITS_CBASER, OUTER, MASK)
#define GITS_CBASER_CACHEABILITY_MASK GITS_CBASER_INNER_CACHEABILITY_MASK
 
#define GITS_CBASER_InnerShareable                    \
   GIC_BASER_SHAREABILITY(GITS_CBASER, InnerShareable)
 
#define GITS_CBASER_nCnB    GIC_BASER_CACHEABILITY(GITS_CBASER, INNER, nCnB)
#define GITS_CBASER_nC        GIC_BASER_CACHEABILITY(GITS_CBASER, INNER, nC)
#define GITS_CBASER_RaWt    GIC_BASER_CACHEABILITY(GITS_CBASER, INNER, RaWt)
#define GITS_CBASER_RaWb    GIC_BASER_CACHEABILITY(GITS_CBASER, INNER, RaWb)
#define GITS_CBASER_WaWt    GIC_BASER_CACHEABILITY(GITS_CBASER, INNER, WaWt)
#define GITS_CBASER_WaWb    GIC_BASER_CACHEABILITY(GITS_CBASER, INNER, WaWb)
#define GITS_CBASER_RaWaWt    GIC_BASER_CACHEABILITY(GITS_CBASER, INNER, RaWaWt)
#define GITS_CBASER_RaWaWb    GIC_BASER_CACHEABILITY(GITS_CBASER, INNER, RaWaWb)
 
#define GITS_CBASER_ADDRESS(cbaser)    ((cbaser) & GENMASK_ULL(51, 12))
 
#define GITS_BASER_NR_REGS        8
 
#define GITS_BASER_VALID            (1ULL << 63)
#define GITS_BASER_INDIRECT            (1ULL << 62)
 
#define GITS_BASER_INNER_CACHEABILITY_SHIFT    (59)
#define GITS_BASER_OUTER_CACHEABILITY_SHIFT    (53)
#define GITS_BASER_INNER_CACHEABILITY_MASK                \
   GIC_BASER_CACHEABILITY(GITS_BASER, INNER, MASK)
#define GITS_BASER_CACHEABILITY_MASK        GITS_BASER_INNER_CACHEABILITY_MASK
#define GITS_BASER_OUTER_CACHEABILITY_MASK                \
   GIC_BASER_CACHEABILITY(GITS_BASER, OUTER, MASK)
#define GITS_BASER_SHAREABILITY_MASK                    \
   GIC_BASER_SHAREABILITY(GITS_BASER, SHAREABILITY_MASK)
 
#define GITS_BASER_nCnB        GIC_BASER_CACHEABILITY(GITS_BASER, INNER, nCnB)
#define GITS_BASER_nC        GIC_BASER_CACHEABILITY(GITS_BASER, INNER, nC)
#define GITS_BASER_RaWt        GIC_BASER_CACHEABILITY(GITS_BASER, INNER, RaWt)
#define GITS_BASER_RaWb        GIC_BASER_CACHEABILITY(GITS_BASER, INNER, RaWb)
#define GITS_BASER_WaWt        GIC_BASER_CACHEABILITY(GITS_BASER, INNER, WaWt)
#define GITS_BASER_WaWb        GIC_BASER_CACHEABILITY(GITS_BASER, INNER, WaWb)
#define GITS_BASER_RaWaWt    GIC_BASER_CACHEABILITY(GITS_BASER, INNER, RaWaWt)
#define GITS_BASER_RaWaWb    GIC_BASER_CACHEABILITY(GITS_BASER, INNER, RaWaWb)
 
#define GITS_BASER_TYPE_SHIFT            (56)
#define GITS_BASER_TYPE(r)        (((r) >> GITS_BASER_TYPE_SHIFT) & 7)
#define GITS_BASER_ENTRY_SIZE_SHIFT        (48)
#define GITS_BASER_ENTRY_SIZE(r)    ((((r) >> GITS_BASER_ENTRY_SIZE_SHIFT) & 0x1f) + 1)
#define GITS_BASER_ENTRY_SIZE_MASK    GENMASK_ULL(52, 48)
#define GITS_BASER_PHYS_52_to_48(phys)                    \
   (((phys) & GENMASK_ULL(47, 16)) | (((phys) >> 48) & 0xf) << 12)
#define GITS_BASER_ADDR_48_to_52(baser)                    \
   (((baser) & GENMASK_ULL(47, 16)) | (((baser) >> 12) & 0xf) << 48)
 
#define GITS_BASER_SHAREABILITY_SHIFT    (10)
#define GITS_BASER_InnerShareable                    \
   GIC_BASER_SHAREABILITY(GITS_BASER, InnerShareable)
#define GITS_BASER_PAGE_SIZE_SHIFT    (8)
#define __GITS_BASER_PSZ(sz)        (GIC_PAGE_SIZE_ ## sz << GITS_BASER_PAGE_SIZE_SHIFT)
#define GITS_BASER_PAGE_SIZE_4K        __GITS_BASER_PSZ(4K)
#define GITS_BASER_PAGE_SIZE_16K    __GITS_BASER_PSZ(16K)
#define GITS_BASER_PAGE_SIZE_64K    __GITS_BASER_PSZ(64K)
#define GITS_BASER_PAGE_SIZE_MASK    __GITS_BASER_PSZ(MASK)
#define GITS_BASER_PAGES_MAX        256
#define GITS_BASER_PAGES_SHIFT        (0)
#define GITS_BASER_NR_PAGES(r)        (((r) & 0xff) + 1)
 
#define GITS_BASER_TYPE_NONE        0
#define GITS_BASER_TYPE_DEVICE        1
#define GITS_BASER_TYPE_VCPU        2
#define GITS_BASER_TYPE_RESERVED3    3
#define GITS_BASER_TYPE_COLLECTION    4
#define GITS_BASER_TYPE_RESERVED5    5
#define GITS_BASER_TYPE_RESERVED6    6
#define GITS_BASER_TYPE_RESERVED7    7
 
#define GITS_LVL1_ENTRY_SIZE           (8UL)
 
/*
 * ITS commands
 */
#define GITS_CMD_MAPD            0x08
#define GITS_CMD_MAPC            0x09
#define GITS_CMD_MAPTI            0x0a
#define GITS_CMD_MAPI            0x0b
#define GITS_CMD_MOVI            0x01
#define GITS_CMD_DISCARD        0x0f
#define GITS_CMD_INV            0x0c
#define GITS_CMD_MOVALL            0x0e
#define GITS_CMD_INVALL            0x0d
#define GITS_CMD_INT            0x03
#define GITS_CMD_CLEAR            0x04
#define GITS_CMD_SYNC            0x05
 
/*
 * GICv4 ITS specific commands
 */
#define GITS_CMD_GICv4(x)        ((x) | 0x20)
#define GITS_CMD_VINVALL        GITS_CMD_GICv4(GITS_CMD_INVALL)
#define GITS_CMD_VMAPP            GITS_CMD_GICv4(GITS_CMD_MAPC)
#define GITS_CMD_VMAPTI            GITS_CMD_GICv4(GITS_CMD_MAPTI)
#define GITS_CMD_VMOVI            GITS_CMD_GICv4(GITS_CMD_MOVI)
#define GITS_CMD_VSYNC            GITS_CMD_GICv4(GITS_CMD_SYNC)
/* VMOVP, VSGI and INVDB are the odd ones, as they dont have a physical counterpart */
#define GITS_CMD_VMOVP            GITS_CMD_GICv4(2)
#define GITS_CMD_VSGI            GITS_CMD_GICv4(3)
#define GITS_CMD_INVDB            GITS_CMD_GICv4(0xe)
 
/*
 * ITS error numbers
 */
#define E_ITS_MOVI_UNMAPPED_INTERRUPT        0x010107
#define E_ITS_MOVI_UNMAPPED_COLLECTION        0x010109
#define E_ITS_INT_UNMAPPED_INTERRUPT        0x010307
#define E_ITS_CLEAR_UNMAPPED_INTERRUPT        0x010507
#define E_ITS_MAPD_DEVICE_OOR            0x010801
#define E_ITS_MAPD_ITTSIZE_OOR            0x010802
#define E_ITS_MAPC_PROCNUM_OOR            0x010902
#define E_ITS_MAPC_COLLECTION_OOR        0x010903
#define E_ITS_MAPTI_UNMAPPED_DEVICE        0x010a04
#define E_ITS_MAPTI_ID_OOR            0x010a05
#define E_ITS_MAPTI_PHYSICALID_OOR        0x010a06
#define E_ITS_INV_UNMAPPED_INTERRUPT        0x010c07
#define E_ITS_INVALL_UNMAPPED_COLLECTION    0x010d09
#define E_ITS_MOVALL_PROCNUM_OOR        0x010e01
#define E_ITS_DISCARD_UNMAPPED_INTERRUPT    0x010f07
 
/*
 * CPU interface registers
 */
#define ICC_CTLR_EL1_EOImode_SHIFT    (1)
#define ICC_CTLR_EL1_EOImode_drop_dir    (0U << ICC_CTLR_EL1_EOImode_SHIFT)
#define ICC_CTLR_EL1_EOImode_drop    (1U << ICC_CTLR_EL1_EOImode_SHIFT)
#define ICC_CTLR_EL1_EOImode_MASK    (1 << ICC_CTLR_EL1_EOImode_SHIFT)
#define ICC_CTLR_EL1_CBPR_SHIFT        0
#define ICC_CTLR_EL1_CBPR_MASK        (1 << ICC_CTLR_EL1_CBPR_SHIFT)
#define ICC_CTLR_EL1_PMHE_SHIFT        6
#define ICC_CTLR_EL1_PMHE_MASK        (1 << ICC_CTLR_EL1_PMHE_SHIFT)
#define ICC_CTLR_EL1_PRI_BITS_SHIFT    8
#define ICC_CTLR_EL1_PRI_BITS_MASK    (0x7 << ICC_CTLR_EL1_PRI_BITS_SHIFT)
#define ICC_CTLR_EL1_ID_BITS_SHIFT    11
#define ICC_CTLR_EL1_ID_BITS_MASK    (0x7 << ICC_CTLR_EL1_ID_BITS_SHIFT)
#define ICC_CTLR_EL1_SEIS_SHIFT        14
#define ICC_CTLR_EL1_SEIS_MASK        (0x1 << ICC_CTLR_EL1_SEIS_SHIFT)
#define ICC_CTLR_EL1_A3V_SHIFT        15
#define ICC_CTLR_EL1_A3V_MASK        (0x1 << ICC_CTLR_EL1_A3V_SHIFT)
#define ICC_CTLR_EL1_RSS        (0x1 << 18)
#define ICC_CTLR_EL1_ExtRange        (0x1 << 19)
#define ICC_PMR_EL1_SHIFT        0
#define ICC_PMR_EL1_MASK        (0xff << ICC_PMR_EL1_SHIFT)
#define ICC_BPR0_EL1_SHIFT        0
#define ICC_BPR0_EL1_MASK        (0x7 << ICC_BPR0_EL1_SHIFT)
#define ICC_BPR1_EL1_SHIFT        0
#define ICC_BPR1_EL1_MASK        (0x7 << ICC_BPR1_EL1_SHIFT)
#define ICC_IGRPEN0_EL1_SHIFT        0
#define ICC_IGRPEN0_EL1_MASK        (1 << ICC_IGRPEN0_EL1_SHIFT)
#define ICC_IGRPEN1_EL1_SHIFT        0
#define ICC_IGRPEN1_EL1_MASK        (1 << ICC_IGRPEN1_EL1_SHIFT)
#define ICC_SRE_EL1_DIB            (1U << 2)
#define ICC_SRE_EL1_DFB            (1U << 1)
#define ICC_SRE_EL1_SRE            (1U << 0)
 
/*
 * Hypervisor interface registers (SRE only)
 */
#define ICH_LR_VIRTUAL_ID_MASK        ((1ULL << 32) - 1)
 
#define ICH_LR_EOI            (1ULL << 41)
#define ICH_LR_GROUP            (1ULL << 60)
#define ICH_LR_HW            (1ULL << 61)
#define ICH_LR_STATE            (3ULL << 62)
#define ICH_LR_PENDING_BIT        (1ULL << 62)
#define ICH_LR_ACTIVE_BIT        (1ULL << 63)
#define ICH_LR_PHYS_ID_SHIFT        32
#define ICH_LR_PHYS_ID_MASK        (0x3ffULL << ICH_LR_PHYS_ID_SHIFT)
#define ICH_LR_PRIORITY_SHIFT        48
#define ICH_LR_PRIORITY_MASK        (0xffULL << ICH_LR_PRIORITY_SHIFT)
 
/* These are for GICv2 emulation only */
#define GICH_LR_VIRTUALID        (0x3ffUL << 0)
#define GICH_LR_PHYSID_CPUID_SHIFT    (10)
#define GICH_LR_PHYSID_CPUID        (7UL << GICH_LR_PHYSID_CPUID_SHIFT)
 
#define ICH_MISR_EOI            (1 << 0)
#define ICH_MISR_U            (1 << 1)
 
#define ICH_HCR_EN            (1 << 0)
#define ICH_HCR_UIE            (1 << 1)
#define ICH_HCR_NPIE            (1 << 3)
#define ICH_HCR_TC            (1 << 10)
#define ICH_HCR_TALL0            (1 << 11)
#define ICH_HCR_TALL1            (1 << 12)
#define ICH_HCR_EOIcount_SHIFT        27
#define ICH_HCR_EOIcount_MASK        (0x1f << ICH_HCR_EOIcount_SHIFT)
 
#define ICH_VMCR_ACK_CTL_SHIFT        2
#define ICH_VMCR_ACK_CTL_MASK        (1 << ICH_VMCR_ACK_CTL_SHIFT)
#define ICH_VMCR_FIQ_EN_SHIFT        3
#define ICH_VMCR_FIQ_EN_MASK        (1 << ICH_VMCR_FIQ_EN_SHIFT)
#define ICH_VMCR_CBPR_SHIFT        4
#define ICH_VMCR_CBPR_MASK        (1 << ICH_VMCR_CBPR_SHIFT)
#define ICH_VMCR_EOIM_SHIFT        9
#define ICH_VMCR_EOIM_MASK        (1 << ICH_VMCR_EOIM_SHIFT)
#define ICH_VMCR_BPR1_SHIFT        18
#define ICH_VMCR_BPR1_MASK        (7 << ICH_VMCR_BPR1_SHIFT)
#define ICH_VMCR_BPR0_SHIFT        21
#define ICH_VMCR_BPR0_MASK        (7 << ICH_VMCR_BPR0_SHIFT)
#define ICH_VMCR_PMR_SHIFT        24
#define ICH_VMCR_PMR_MASK        (0xffUL << ICH_VMCR_PMR_SHIFT)
#define ICH_VMCR_ENG0_SHIFT        0
#define ICH_VMCR_ENG0_MASK        (1 << ICH_VMCR_ENG0_SHIFT)
#define ICH_VMCR_ENG1_SHIFT        1
#define ICH_VMCR_ENG1_MASK        (1 << ICH_VMCR_ENG1_SHIFT)
 
#define ICH_VTR_PRI_BITS_SHIFT        29
#define ICH_VTR_PRI_BITS_MASK        (7 << ICH_VTR_PRI_BITS_SHIFT)
#define ICH_VTR_ID_BITS_SHIFT        23
#define ICH_VTR_ID_BITS_MASK        (7 << ICH_VTR_ID_BITS_SHIFT)
#define ICH_VTR_SEIS_SHIFT        22
#define ICH_VTR_SEIS_MASK        (1 << ICH_VTR_SEIS_SHIFT)
#define ICH_VTR_A3V_SHIFT        21
#define ICH_VTR_A3V_MASK        (1 << ICH_VTR_A3V_SHIFT)
 
#define ICC_IAR1_EL1_SPURIOUS        0x3ff
 
#define ICC_SRE_EL2_SRE            (1 << 0)
#define ICC_SRE_EL2_ENABLE        (1 << 3)
 
#define ICC_SGI1R_TARGET_LIST_SHIFT    0
#define ICC_SGI1R_TARGET_LIST_MASK    (0xffff << ICC_SGI1R_TARGET_LIST_SHIFT)
#define ICC_SGI1R_AFFINITY_1_SHIFT    16
#define ICC_SGI1R_AFFINITY_1_MASK    (0xff << ICC_SGI1R_AFFINITY_1_SHIFT)
#define ICC_SGI1R_SGI_ID_SHIFT        24
#define ICC_SGI1R_SGI_ID_MASK        (0xfULL << ICC_SGI1R_SGI_ID_SHIFT)
#define ICC_SGI1R_AFFINITY_2_SHIFT    32
#define ICC_SGI1R_AFFINITY_2_MASK    (0xffULL << ICC_SGI1R_AFFINITY_2_SHIFT)
#define ICC_SGI1R_IRQ_ROUTING_MODE_BIT    40
#define ICC_SGI1R_RS_SHIFT        44
#define ICC_SGI1R_RS_MASK        (0xfULL << ICC_SGI1R_RS_SHIFT)
#define ICC_SGI1R_AFFINITY_3_SHIFT    48
#define ICC_SGI1R_AFFINITY_3_MASK    (0xffULL << ICC_SGI1R_AFFINITY_3_SHIFT)
 
#include <asm/arch_gicv3.h>
 
#ifndef __ASSEMBLY__
 
/*
 * We need a value to serve as a irq-type for LPIs. Choose one that will
 * hopefully pique the interest of the reviewer.
 */
#define GIC_IRQ_TYPE_LPI        0xa110c8ed
 
struct rdists {
   struct {
       raw_spinlock_t    rd_lock;
       void __iomem    *rd_base;
       struct page    *pend_page;
       phys_addr_t    phys_base;
       bool        lpi_enabled;
       cpumask_t    *vpe_table_mask;
       void        *vpe_l1_base;
   } __percpu        *rdist;
   phys_addr_t        prop_table_pa;
   void            *prop_table_va;
   u64            flags;
   u32            gicd_typer;
   u32            gicd_typer2;
   bool            has_vlpis;
   bool            has_rvpeid;
   bool            has_direct_lpi;
   bool            has_vpend_valid_dirty;
};
 
struct irq_domain;
struct fwnode_handle;
int its_cpu_init(void);
int its_init(struct fwnode_handle *handle, struct rdists *rdists,
        struct irq_domain *domain);
int mbi_init(struct fwnode_handle *fwnode, struct irq_domain *parent);
 
struct gic_chip_data {
   struct fwnode_handle    *fwnode;
   void __iomem        *dist_base;
   struct redist_region    *redist_regions;
   struct rdists        rdists;
   struct irq_domain    *domain;
   u64            redist_stride;
   u32            nr_redist_regions;
   u64            flags;
   bool            has_rss;
   unsigned int        ppi_nr;
   struct partition_desc    **ppi_descs;
};
 
static inline bool gic_enable_sre(void)
{
   u32 val;
 
   val = gic_read_sre();
   if (val & ICC_SRE_EL1_SRE)
       return true;
 
   val |= ICC_SRE_EL1_SRE;
   gic_write_sre(val);
   val = gic_read_sre();
 
   return !!(val & ICC_SRE_EL1_SRE);
}
 
void gic_resume(void);
 
#endif
 
#endif