40#define BIT_32(bit) (1u << bit)
41#define BIT_64(bit) (1ul << bit)
43#ifdef LOSCFG_ARCH_ARM_AARCH64
45#define ICC_CTLR_EL1 "S3_0_C12_C12_4"
46#define ICC_PMR_EL1 "S3_0_C4_C6_0"
47#define ICC_IAR1_EL1 "S3_0_C12_C12_0"
48#define ICC_SRE_EL1 "S3_0_C12_C12_5"
49#define ICC_BPR0_EL1 "S3_0_C12_C8_3"
50#define ICC_BPR1_EL1 "S3_0_C12_C12_3"
51#define ICC_IGRPEN0_EL1 "S3_0_C12_C12_6"
52#define ICC_IGRPEN1_EL1 "S3_0_C12_C12_7"
53#define ICC_EOIR1_EL1 "S3_0_C12_C12_1"
54#define ICC_SGI1R_EL1 "S3_0_C12_C11_5"
55#define ICC_EOIR0_EL1 "S3_0_c12_c8_1"
56#define ICC_IAR0_EL1 "S3_0_C12_C8_0"
58#define ICC_CTLR_EL3 "S3_6_C12_C12_4"
59#define ICC_SRE_EL3 "S3_6_C12_C12_5"
60#define ICC_IGRPEN1_EL3 "S3_6_C12_C12_7"
64#define ICC_CTLR_EL1 "c12, c12, 4"
65#define ICC_PMR_EL1 "c4, c6, 0"
66#define ICC_IAR1_EL1 "c12, c12, 0"
67#define ICC_SRE_EL1 "c12, c12, 5"
68#define ICC_BPR1_EL1 "c12, c12, 3"
69#define ICC_IGRPEN1_EL1 "c12, c12, 7"
70#define ICC_EOIR1_EL1 "c12, c12, 1"
71#define ICC_SGI1R_EL1 "c12"
76#ifdef LOSCFG_ARCH_SECURE_MONITOR_MODE
77#define CTLR_ENALBE_G0 BIT_32(0)
78#define CTLR_ENABLE_G1NS BIT_32(1)
79#define CTLR_ENABLE_G1S BIT_32(2)
80#define CTLR_RES0 BIT_32(3)
81#define CTLR_ARE_S BIT_32(4)
82#define CTLR_ARE_NS BIT_32(5)
83#define CTLR_DS BIT_32(6)
84#define CTLR_E1NWF BIT_32(7)
85#define GICD_CTLR_RWP BIT_32(31)
87#define CTLR_ENALBE_G1 BIT_32(0)
88#define CTLR_ENABLE_G1A BIT_32(1)
89#define CTLR_ARE_NS BIT_32(4)
90#define GICD_CTLR_RWP BIT_32(31)
94#define GICD_CIDR0 (GICD_OFFSET + 0xfff0)
95#define GICD_CIDR1 (GICD_OFFSET + 0xfff4)
96#define GICD_CIDR2 (GICD_OFFSET + 0xfff8)
97#define GICD_CIDR3 (GICD_OFFSET + 0xfffc)
98#define GICD_PIDR0 (GICD_OFFSET + 0xffe0)
99#define GICD_PIDR1 (GICD_OFFSET + 0xffe4)
100#define GICD_PIDR2 (GICD_OFFSET + 0xffe8)
101#define GICD_PIDR3 (GICD_OFFSET + 0xffec)
104#define GICD_PIDR2_ARCHREV_SHIFT 4
105#define GICD_PIDR2_ARCHREV_MASK 0xf
108#define GICR_SGI_OFFSET (GICR_OFFSET + 0x10000)
110#define GICR_CTLR(i) (GICR_OFFSET + GICR_STRIDE * (i) + 0x0000)
111#define GICR_IIDR(i) (GICR_OFFSET + GICR_STRIDE * (i) + 0x0004)
112#define GICR_TYPER(i) (GICR_OFFSET + GICR_STRIDE * (i) + 0x0008)
113#define GICR_STATUSR(i) (GICR_OFFSET + GICR_STRIDE * (i) + 0x0010)
114#define GICR_WAKER(i) (GICR_OFFSET + GICR_STRIDE * (i) + 0x0014)
115#define GICR_PWRR(i) (GICR_OFFSET + GICR_STRIDE * (i) + 0x0024)
117#define GICR_IGROUPR0(i) (GICR_SGI_OFFSET + GICR_STRIDE * (i) + 0x0080)
118#define GICR_IGRPMOD0(i) (GICR_SGI_OFFSET + GICR_STRIDE * (i) + 0x0d00)
119#define GICR_ISENABLER0(i) (GICR_SGI_OFFSET + GICR_STRIDE * (i) + 0x0100)
120#define GICR_ICENABLER0(i) (GICR_SGI_OFFSET + GICR_STRIDE * (i) + 0x0180)
121#define GICR_ISPENDR0(i) (GICR_SGI_OFFSET + GICR_STRIDE * (i) + 0x0200)
122#define GICR_ICPENDR0(i) (GICR_SGI_OFFSET + GICR_STRIDE * (i) + 0x0280)
123#define GICR_ISACTIVER0(i) (GICR_SGI_OFFSET + GICR_STRIDE * (i) + 0x0300)
124#define GICR_ICACTIVER0(i) (GICR_SGI_OFFSET + GICR_STRIDE * (i) + 0x0380)
125#define GICR_IPRIORITYR(i, n) (GICR_SGI_OFFSET + GICR_STRIDE * (i) + 0x0400 + (n) * 4)
126#define GICR_ICFGR0(i) (GICR_SGI_OFFSET + GICR_STRIDE * (i) + 0x0c00)
127#define GICR_ICFGR1(i) (GICR_SGI_OFFSET + GICR_STRIDE * (i) + 0x0c04)
128#define GICR_NSACR(i) (GICR_SGI_OFFSET + GICR_STRIDE * (i) + 0x0e00)
130#define GICR_WAKER_PROCESSORSLEEP_LEN 1U
131#define GICR_WAKER_PROCESSORSLEEP_OFFSET 1
132#define GICR_WAKER_CHILDRENASLEEP_LEN 1U
133#define GICR_WAKER_CHILDRENASLEEP_OFFSET 2
134#define GICR_WAKER_PROCESSORSLEEP (GICR_WAKER_PROCESSORSLEEP_LEN << GICR_WAKER_PROCESSORSLEEP_OFFSET)
135#define GICR_WAKER_CHILDRENASLEEP (GICR_WAKER_CHILDRENASLEEP_LEN << GICR_WAKER_CHILDRENASLEEP_OFFSET)
137#ifdef LOSCFG_ARM_GIC_LPI_ENABLE
141#define OS_HWI_LPI_MAX_NUM 65536
146#define OS_HWI_LPI_MAX ((OS_HWI_LPI_MAX_NUM) - 1)
151#define OS_HWI_LPI_MIN 8192
153#define OS_HWI_LPI_NUM (OS_HWI_LPI_MAX_NUM - OS_HWI_LPI_MIN)
158#define OS_HWI_SPI_MAX 1024
160#define LPI_NUM_CHECK(intNum) (((intNum) >= OS_HWI_LPI_MIN) && ((intNum) <= OS_HWI_LPI_MAX))
163#define GIC_LPI_CHECK_RETURN(intNum) \
164 if (LPI_NUM_CHECK(intNum)) { \
168#define GIC_LPI_CHECK_RETURN(intNum)
172#define GIC_PRIORITY_MASK 0xFFU
173#define GIC_PRIORITY_OFFSET 8U
185#if (LOSCFG_HWI_PRIO_LIMIT > 0) && (LOSCFG_HWI_PRIO_LIMIT <= 1)
186#define MAX_BINARY_POINT_VALUE 7
187#elif (LOSCFG_HWI_PRIO_LIMIT > 1) && (LOSCFG_HWI_PRIO_LIMIT <= 2)
188#define MAX_BINARY_POINT_VALUE 6
189#elif (LOSCFG_HWI_PRIO_LIMIT > 2) && (LOSCFG_HWI_PRIO_LIMIT <= 4)
190#define MAX_BINARY_POINT_VALUE 5
191#elif (LOSCFG_HWI_PRIO_LIMIT > 4) && (LOSCFG_HWI_PRIO_LIMIT <= 8)
192#define MAX_BINARY_POINT_VALUE 4
193#elif (LOSCFG_HWI_PRIO_LIMIT > 8) && (LOSCFG_HWI_PRIO_LIMIT <= 16)
194#define MAX_BINARY_POINT_VALUE 3
195#elif (LOSCFG_HWI_PRIO_LIMIT > 16) && (LOSCFG_HWI_PRIO_LIMIT <= 32)
196#define MAX_BINARY_POINT_VALUE 2
197#elif (LOSCFG_HWI_PRIO_LIMIT > 32) && (LOSCFG_HWI_PRIO_LIMIT <= 64)
198#define MAX_BINARY_POINT_VALUE 1
199#elif (LOSCFG_HWI_PRIO_LIMIT > 64) && (LOSCFG_HWI_PRIO_LIMIT <= 128)
200#define MAX_BINARY_POINT_VALUE 0
202#error "LOSCFG_HWI_PRIO_LIMIT error configuration"
204#define PRIORITY_SHIFT ((MAX_BINARY_POINT_VALUE + 1) % GIC_PRIORITY_OFFSET)
206#ifdef LOSCFG_ARCH_ARM_AARCH64
210#ifdef LOSCFG_ARCH_SECURE_MONITOR_MODE
211 __asm__
volatile(
"msr " ICC_CTLR_EL3
", %0" ::
"r"(val));
213 __asm__
volatile(
"msr " ICC_CTLR_EL1 ", %0" ::
"r"(val));
221 __asm__
volatile(
"msr " ICC_PMR_EL1 ", %0" ::
"r"(val));
229 __asm__
volatile(
"mrs %0, " ICC_PMR_EL1 :
"=r"(temp));
235 __asm__
volatile(
"msr " ICC_IGRPEN0_EL1
", %0" ::
"r"(val));
242#ifdef LOSCFG_ARCH_SECURE_MONITOR_MODE
243 __asm__
volatile(
"msr " ICC_IGRPEN1_EL3
", %0" ::
"r"(val));
254#ifdef LOSCFG_ARCH_SECURE_MONITOR_MODE
255 __asm__
volatile(
"mrs %0, " ICC_SRE_EL3 :
"=r"(temp));
257 __asm__
volatile(
"mrs %0, " ICC_SRE_EL1 :
"=r"(temp));
264#ifdef LOSCFG_ARCH_SECURE_MONITOR_MODE
265 __asm__
volatile(
"msr " ICC_SRE_EL3
", %0" ::
"r"(val));
267 __asm__
volatile(
"msr " ICC_SRE_EL1 ", %0" ::
"r"(val));
275#ifdef LOSCFG_ARCH_SECURE_MONITOR_MODE
276 __asm__
volatile(
"msr " ICC_EOIR0_EL1
", %0" ::
"r"(val));
288#ifdef LOSCFG_ARCH_SECURE_MONITOR_MODE
289 __asm__
volatile(
"mrs %0, " ICC_IAR0_EL1 :
"=r"(temp));
305 __asm__
volatile(
"msr " ICC_BPR0_EL1
", %0" ::
"r"(val));
312 __asm__
volatile(
"msr " ICC_BPR1_EL1 ", %0" ::
"r"(val));
325#define MPIDR_AFF_LEVEL0 0
326#define MPIDR_AFF_LEVEL1 1
327#define MPIDR_AFF_LEVEL2 2
328#define MPIDR_AFF_LEVEL3 3
330#define MPIDR_AFF_LEVEL1_SHIFT 8
331#define MPIDR_AFF_LEVEL2_SHIFT 16
332#define MPIDR_AFF_LEVEL3_SHIFT 32
336 return ((MPIDR_AFF_LEVEL(mpidr, MPIDR_AFF_LEVEL3) << MPIDR_AFF_LEVEL3_SHIFT) |
337 (MPIDR_AFF_LEVEL(mpidr, MPIDR_AFF_LEVEL2) << MPIDR_AFF_LEVEL2_SHIFT) |
338 (MPIDR_AFF_LEVEL(mpidr, MPIDR_AFF_LEVEL1) << MPIDR_AFF_LEVEL1_SHIFT) |
339 (MPIDR_AFF_LEVEL(mpidr, MPIDR_AFF_LEVEL0)));
346 __asm__
volatile(
"mcr p15, 0, %0, c12, c12, 4" : :
"r"(val));
352 __asm__
volatile(
"mcr p15, 0, %0, c4, c6, 0" : :
"r"(val));
359 __asm__
volatile(
"mcr p15, 0, %0, c12, c12, 7" : :
"r"(val));
367 __asm__
volatile(
"mrc p15, 0, %0, c12, c12, 5" :
"=r" (temp));
373 __asm__
volatile(
"mcr p15, 0, %0, c12, c12, 5" : :
"r"(val));
379 __asm__
volatile(
"mcr p15, 0, %0, c12, c12, 1" : :
"r"(val));
386 __asm__
volatile(
"mrc p15, 0, %0, c12, c12, 0" :
"=r" (temp));
395 __asm__
volatile(
"mcrr p15, 0, %0, %1, c12" : :
"r"(valLow),
"r"(valHigh));
402 __asm__
volatile(
"mcr p15, 0, %0, c12, c12, 3" : :
"r"(val));
409 return (mpidr & 0xffffff);
#define STATIC
Definition common_def.h:57
#define INLINE
Definition common_def.h:65
#define ICC_SRE_EL1
Definition gic_v3.h:67
#define ICC_CTLR_EL1
Definition gic_v3.h:64
STATIC INLINE VOID GiccSetCtlr(UINT32 val)
Definition gic_v3.h:344
#define ICC_IAR1_EL1
Definition gic_v3.h:66
STATIC INLINE VOID GiccSetIgrpen1(UINT32 val)
Definition gic_v3.h:357
#define ICC_SGI1R_EL1
Definition gic_v3.h:71
#define ICC_PMR_EL1
Definition gic_v3.h:65
#define ICC_EOIR1_EL1
Definition gic_v3.h:70
STATIC INLINE VOID GiccSetBpr1(UINT32 val)
Definition gic_v3.h:400
STATIC INLINE UINT32 GiccGetSre(VOID)
Definition gic_v3.h:364
STATIC INLINE UINT32 GiccGetIar(VOID)
Definition gic_v3.h:383
STATIC INLINE VOID GiccSetEoir(UINT32 val)
Definition gic_v3.h:377
STATIC INLINE VOID GiccSetPmr(UINT32 val)
Definition gic_v3.h:350
STATIC INLINE VOID GiccSetSgi1r(UINT64 val)
Definition gic_v3.h:391
STATIC INLINE UINT64 MpidrToAffinity(UINT64 mpidr)
Definition gic_v3.h:406
STATIC INLINE VOID GiccSetSre(UINT32 val)
Definition gic_v3.h:371
#define ICC_IGRPEN1_EL1
Definition gic_v3.h:69
#define ICC_BPR1_EL1
Definition gic_v3.h:68
unsigned long long UINT64
Definition los_typedef.h:72
#define VOID
Definition los_typedef.h:88
unsigned int UINT32
Definition los_typedef.h:52