1 /*
2  * Copyright 2020 Broadcom
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 #ifndef ZEPHYR_INCLUDE_DRIVERS_INTC_GIC_COMMON_PRIV_H_
8 #define ZEPHYR_INCLUDE_DRIVERS_INTC_GIC_COMMON_PRIV_H_
9 
10 /* Offsets from GICD base or GICR(n) SGI_base */
11 #define GIC_DIST_IGROUPR    0x0080
12 #define GIC_DIST_ISENABLER  0x0100
13 #define GIC_DIST_ICENABLER  0x0180
14 #define GIC_DIST_ISPENDR    0x0200
15 #define GIC_DIST_ICPENDR    0x0280
16 #define GIC_DIST_ISACTIVER  0x0300
17 #define GIC_DIST_ICACTIVER  0x0380
18 #define GIC_DIST_IPRIORITYR 0x0400
19 #define GIC_DIST_ITARGETSR  0x0800
20 #define GIC_DIST_ICFGR      0x0c00
21 #define GIC_DIST_IGROUPMODR 0x0d00
22 #define GIC_DIST_SGIR       0x0f00
23 
24 /* GICv3.1 Support for Extended SPI Range */
25 #define GIC_ESPI_START        4096
26 #define GIC_ESPI_END          5119
27 #define GIC_DIST_IGROUPRnE    0x1000
28 #define GIC_DIST_ISENABLERnE  0x1200
29 #define GIC_DIST_ICENABLERnE  0x1400
30 #define GIC_DIST_ISPENDRnE    0x1600
31 #define GIC_DIST_ICPENDRnE    0x1800
32 #define GIC_DIST_ISACTIVERnE  0x1a00
33 #define GIC_DIST_ICACTIVERnE  0x1c00
34 #define GIC_DIST_IPRIORITYRnE 0x2000
35 #define GIC_DIST_ICFGRnE      0x3000
36 #define GIC_DIST_IGROUPMODRnE 0x3400
37 
38 /* GICD GICR common access macros */
39 #define IGROUPR(base, n)    (base + GIC_DIST_IGROUPR + (n) * 4)
40 #define ISENABLER(base, n)  (base + GIC_DIST_ISENABLER + (n) * 4)
41 #define ICENABLER(base, n)  (base + GIC_DIST_ICENABLER + (n) * 4)
42 #define ISPENDR(base, n)    (base + GIC_DIST_ISPENDR + (n) * 4)
43 #define ICPENDR(base, n)    (base + GIC_DIST_ICPENDR + (n) * 4)
44 #define IPRIORITYR(base, n) (base + GIC_DIST_IPRIORITYR + n)
45 #define ITARGETSR(base, n)  (base + GIC_DIST_ITARGETSR + (n) * 4)
46 #define ICFGR(base, n)      (base + GIC_DIST_ICFGR + (n) * 4)
47 #define IGROUPMODR(base, n) (base + GIC_DIST_IGROUPMODR + (n) * 4)
48 
49 /* GICD Extended SPI (GICv3.1) common access macros */
50 #define IGROUPRnE(base, n)    (base + GIC_DIST_IGROUPRnE + (n) * 4)
51 #define ISENABLERnE(base, n)  (base + GIC_DIST_ISENABLERnE + (n) * 4)
52 #define ICENABLERnE(base, n)  (base + GIC_DIST_ICENABLERnE + (n) * 4)
53 #define ISPENDRnE(base, n)    (base + GIC_DIST_ISPENDRnE + (n) * 4)
54 #define ICPENDRnE(base, n)    (base + GIC_DIST_ICPENDRnE + (n) * 4)
55 #define IPRIORITYRnE(base, n) (base + GIC_DIST_IPRIORITYRnE + n)
56 #define ICFGRnE(base, n)      (base + GIC_DIST_ICFGRnE + (n) * 4)
57 #define IGROUPMODRnE(base, n) (base + GIC_DIST_IGROUPMODRnE + (n) * 4)
58 
59 /*
60  * selects redistributor SGI_base for current core for PPI and SGI
61  * selects distributor base for SPI
62  * The macro translates to distributor base for GICv2 and GICv1
63  */
64 
65 #if CONFIG_GIC_VER <= 2
66 #define GET_DIST_BASE(intid) GIC_DIST_BASE
67 #define GIC_IS_ESPI(intid)   0
68 #else
69 #define GET_DIST_BASE(intid)                                                                       \
70 	((intid < GIC_SPI_INT_BASE) ? (gic_get_rdist() + GICR_SGI_BASE_OFF) : GIC_DIST_BASE)
71 #define GIC_IS_ESPI(intid) ((intid >= GIC_ESPI_START) && (intid <= GIC_ESPI_END))
72 #endif
73 #endif /* ZEPHYR_INCLUDE_DRIVERS_INTC_GIC_COMMON_PRIV_H */
74