WS63 SDK 文档 7021f4f@fbb_ws63
ws63 和 ws63e 解决方案的 SDK 文档
载入中...
搜索中...
未找到
gic_v3.h
浏览该文件的文档.
1/* ----------------------------------------------------------------------------
2 * Copyright (c) Huawei Technologies Co., Ltd. 2018-2019. All rights reserved.
3 * Description: General interrupt controller version 3.0 (GICv3).
4 * Author: Huawei LiteOS Team
5 * Create: 2018-09-15
6 * Redistribution and use in source and binary forms, with or without modification,
7 * are permitted provided that the following conditions are met:
8 * 1. Redistributions of source code must retain the above copyright notice, this list of
9 * conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright notice, this list
11 * of conditions and the following disclaimer in the documentation and/or other materials
12 * provided with the distribution.
13 * 3. Neither the name of the copyright holder nor the names of its contributors may be used
14 * to endorse or promote products derived from this software without specific prior written
15 * permission.
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
18 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
20 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
21 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
22 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
23 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
25 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
26 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 * --------------------------------------------------------------------------- */
28
29#ifndef _GIC_V3_H
30#define _GIC_V3_H
31
32#include "stdint.h"
33#include "asm/platform.h"
34#include "arch/cpu.h"
35
36#ifdef __cplusplus
37extern "C" {
38#endif /* __cplusplus */
39
40#define BIT_32(bit) (1u << bit)
41#define BIT_64(bit) (1ul << bit)
42
43#ifdef LOSCFG_ARCH_ARM_AARCH64
44
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"
57
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"
61
62#else /* LOSCFG_ARCH_ARM_AARCH32 */
63
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"
72
73#endif
74
75/* GICD_CTLR bit definitions */
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)
86#else
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)
91#endif
92
93/* peripheral identification registers */
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)
102
103/* GICD_PIDR bit definitions and masks */
104#define GICD_PIDR2_ARCHREV_SHIFT 4
105#define GICD_PIDR2_ARCHREV_MASK 0xf
106
107/* redistributor registers */
108#define GICR_SGI_OFFSET (GICR_OFFSET + 0x10000)
109
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)
116
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)
129
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)
136
137#ifdef LOSCFG_ARM_GIC_LPI_ENABLE
141#define OS_HWI_LPI_MAX_NUM 65536
142
146#define OS_HWI_LPI_MAX ((OS_HWI_LPI_MAX_NUM) - 1)
147
151#define OS_HWI_LPI_MIN 8192
152
153#define OS_HWI_LPI_NUM (OS_HWI_LPI_MAX_NUM - OS_HWI_LPI_MIN)
154
158#define OS_HWI_SPI_MAX 1024
159
160#define LPI_NUM_CHECK(intNum) (((intNum) >= OS_HWI_LPI_MIN) && ((intNum) <= OS_HWI_LPI_MAX))
161
162/* LPI not support */
163#define GIC_LPI_CHECK_RETURN(intNum) \
164 if (LPI_NUM_CHECK(intNum)) { \
165 return LOS_OK; \
166 }
167#else
168#define GIC_LPI_CHECK_RETURN(intNum)
169#endif
170
171/* Interrupt preemption config */
172#define GIC_PRIORITY_MASK 0xFFU
173#define GIC_PRIORITY_OFFSET 8U
174
175/*
176 * The number of bits to shift for an interrupt priority is dependent
177 * on the number of bits implemented by the interrupt controller.
178 * If the MAX_BINARY_POINT_VALUE is 7,
179 * it means that interrupt preemption is not supported.
180 * The macro is the binary point value that decides the maximum preemption level
181 * when LOSCFG_ARCH_INTERRUPT_PREEMPTION is defined. If preemption supported, the
182 * config value is [0, 1, 2, 3, 4, 5, 6], to the corresponding preemption level value
183 * is [128, 64, 32, 16, 8, 4, 2].
184 */
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
201#else
202#error "LOSCFG_HWI_PRIO_LIMIT error configuration"
203#endif
204#define PRIORITY_SHIFT ((MAX_BINARY_POINT_VALUE + 1) % GIC_PRIORITY_OFFSET)
205
206#ifdef LOSCFG_ARCH_ARM_AARCH64
207
209{
210#ifdef LOSCFG_ARCH_SECURE_MONITOR_MODE
211 __asm__ volatile("msr " ICC_CTLR_EL3 ", %0" ::"r"(val));
212#else
213 __asm__ volatile("msr " ICC_CTLR_EL1 ", %0" ::"r"(val));
214#endif
215 ISB();
216 DSB();
217}
218
220{
221 __asm__ volatile("msr " ICC_PMR_EL1 ", %0" ::"r"(val));
222 ISB();
223 DSB();
224}
225
226STATIC INLINE UINT32 GiccGetPmr(VOID)
227{
228 UINT32 temp;
229 __asm__ volatile("mrs %0, " ICC_PMR_EL1 : "=r"(temp));
230 return temp;
231}
232
233STATIC INLINE VOID GiccSetIgrpen0(UINT32 val)
234{
235 __asm__ volatile("msr " ICC_IGRPEN0_EL1 ", %0" ::"r"(val));
236 ISB();
237 DSB();
238}
239
241{
242#ifdef LOSCFG_ARCH_SECURE_MONITOR_MODE
243 __asm__ volatile("msr " ICC_IGRPEN1_EL3 ", %0" ::"r"(val));
244#else
245 __asm__ volatile("msr " ICC_IGRPEN1_EL1 ", %0" ::"r"(val));
246#endif
247 ISB();
248 DSB();
249}
250
252{
253 UINT32 temp;
254#ifdef LOSCFG_ARCH_SECURE_MONITOR_MODE
255 __asm__ volatile("mrs %0, " ICC_SRE_EL3 : "=r"(temp));
256#else
257 __asm__ volatile("mrs %0, " ICC_SRE_EL1 : "=r"(temp));
258#endif
259 return temp;
260}
261
263{
264#ifdef LOSCFG_ARCH_SECURE_MONITOR_MODE
265 __asm__ volatile("msr " ICC_SRE_EL3 ", %0" ::"r"(val));
266#else
267 __asm__ volatile("msr " ICC_SRE_EL1 ", %0" ::"r"(val));
268#endif
269 ISB();
270 DSB();
271}
272
274{
275#ifdef LOSCFG_ARCH_SECURE_MONITOR_MODE
276 __asm__ volatile("msr " ICC_EOIR0_EL1 ", %0" ::"r"(val));
277#else
278 __asm__ volatile("msr " ICC_EOIR1_EL1 ", %0" ::"r"(val));
279#endif
280 ISB();
281 DSB();
282}
283
285{
286 UINT32 temp;
287
288#ifdef LOSCFG_ARCH_SECURE_MONITOR_MODE
289 __asm__ volatile("mrs %0, " ICC_IAR0_EL1 : "=r"(temp));
290#else
291 __asm__ volatile("mrs %0, " ICC_IAR1_EL1 : "=r"(temp));
292#endif
293 return temp;
294}
295
297{
298 __asm__ volatile("msr " ICC_SGI1R_EL1 ", %0" ::"r"(val));
299 ISB();
300 DSB();
301}
302
303STATIC INLINE VOID GiccSetBpr0(UINT32 val)
304{
305 __asm__ volatile("msr " ICC_BPR0_EL1 ", %0" ::"r"(val));
306 ISB();
307 DSB();
308}
309
311{
312 __asm__ volatile("msr " ICC_BPR1_EL1 ", %0" ::"r"(val));
313 ISB();
314 DSB();
315}
316
317STATIC INLINE UINT32 GiccGetBpr1(VOID)
318{
319 UINT32 temp;
320 __asm__ volatile("mrs %0, " ICC_BPR1_EL1 : "=r"(temp));
321
322 return temp;
323}
324
325#define MPIDR_AFF_LEVEL0 0
326#define MPIDR_AFF_LEVEL1 1
327#define MPIDR_AFF_LEVEL2 2
328#define MPIDR_AFF_LEVEL3 3
329
330#define MPIDR_AFF_LEVEL1_SHIFT 8
331#define MPIDR_AFF_LEVEL2_SHIFT 16
332#define MPIDR_AFF_LEVEL3_SHIFT 32
333
335{
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)));
340}
341
342#else /* LOSCFG_ARCH_ARM_AARCH32 */
343
345{
346 __asm__ volatile("mcr p15, 0, %0, c12, c12, 4" : : "r"(val));
347 ISB();
348}
349
351{
352 __asm__ volatile("mcr p15, 0, %0, c4, c6, 0" : : "r"(val));
353 ISB();
354 DSB();
355}
356
358{
359 __asm__ volatile("mcr p15, 0, %0, c12, c12, 7" : : "r"(val));
360 ISB();
361 DSB();
362}
363
365{
366 UINT32 temp;
367 __asm__ volatile("mrc p15, 0, %0, c12, c12, 5" : "=r" (temp));
368 return temp;
369}
370
372{
373 __asm__ volatile("mcr p15, 0, %0, c12, c12, 5" : : "r"(val));
374 ISB();
375}
376
378{
379 __asm__ volatile("mcr p15, 0, %0, c12, c12, 1" : : "r"(val));
380 ISB();
381}
382
384{
385 UINT32 temp;
386 __asm__ volatile("mrc p15, 0, %0, c12, c12, 0" : "=r" (temp));
387 DSB();
388 return temp;
389}
390
392{
393 UINT32 valLow = (UINT32)val;
394 UINT32 valHigh = (UINT32)(val >> 32);
395 __asm__ volatile("mcrr p15, 0, %0, %1, c12" : : "r"(valLow), "r"(valHigh));
396 ISB();
397 DSB();
398}
399
401{
402 __asm__ volatile("mcr p15, 0, %0, c12, c12, 3" : : "r"(val));
403 ISB();
404}
405
407{
408 /* Aff3 is not supported in AArch32 state. */
409 return (mpidr & 0xffffff);
410}
411#endif
412
413#ifdef __cplusplus
414}
415#endif /* __cplusplus */
416
417#endif /* _GIC_V3_H */
#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