Zephyr API Documentation
4.3.99
A Scalable Open Source RTOS
Loading...
Searching...
No Matches
cpu.h
Go to the documentation of this file.
1
/*
2
* Copyright (c) 2019 Carlo Caione <ccaione@baylibre.com>
3
*
4
* SPDX-License-Identifier: Apache-2.0
5
*/
6
7
#ifndef ZEPHYR_INCLUDE_ARCH_ARM64_CPU_H_
8
#define ZEPHYR_INCLUDE_ARCH_ARM64_CPU_H_
9
10
#include <
zephyr/sys/util_macro.h
>
11
#include <
stdbool.h
>
12
13
#define DAIFSET_FIQ_BIT BIT(0)
14
#define DAIFSET_IRQ_BIT BIT(1)
15
#define DAIFSET_ABT_BIT BIT(2)
16
#define DAIFSET_DBG_BIT BIT(3)
17
18
#define DAIFCLR_FIQ_BIT BIT(0)
19
#define DAIFCLR_IRQ_BIT BIT(1)
20
#define DAIFCLR_ABT_BIT BIT(2)
21
#define DAIFCLR_DBG_BIT BIT(3)
22
23
#define DAIF_FIQ_BIT BIT(6)
24
#define DAIF_IRQ_BIT BIT(7)
25
#define DAIF_ABT_BIT BIT(8)
26
#define DAIF_DBG_BIT BIT(9)
27
28
#define SPSR_DAIF_SHIFT (6)
29
#define SPSR_DAIF_MASK (0xf << SPSR_DAIF_SHIFT)
30
31
#define SPSR_MODE_EL0T (0x0)
32
#define SPSR_MODE_EL1T (0x4)
33
#define SPSR_MODE_EL1H (0x5)
34
#define SPSR_MODE_EL2T (0x8)
35
#define SPSR_MODE_EL2H (0x9)
36
#define SPSR_MODE_MASK (0xf)
37
38
39
#define SCTLR_EL3_RES1 (BIT(29) | BIT(28) | BIT(23) | \
40
BIT(22) | BIT(18) | BIT(16) | \
41
BIT(11) | BIT(5) | BIT(4))
42
43
#define SCTLR_EL2_RES1 (BIT(29) | BIT(28) | BIT(23) | \
44
BIT(22) | BIT(18) | BIT(16) | \
45
BIT(11) | BIT(5) | BIT(4))
46
47
#define SCTLR_EL1_RES1 (BIT(29) | BIT(28) | BIT(23) | \
48
BIT(22) | BIT(20) | BIT(11))
49
50
#define SCTLR_M_BIT BIT(0)
51
#define SCTLR_A_BIT BIT(1)
52
#define SCTLR_C_BIT BIT(2)
53
#define SCTLR_SA_BIT BIT(3)
54
#define SCTLR_I_BIT BIT(12)
55
#define SCTLR_BR_BIT BIT(17)
56
57
#define CPACR_EL1_FPEN GENMASK(21, 20)
58
#define CPACR_EL1_ZEN GENMASK(17, 16)
59
60
#define SCR_NS_BIT BIT(0)
61
#define SCR_IRQ_BIT BIT(1)
62
#define SCR_FIQ_BIT BIT(2)
63
#define SCR_EA_BIT BIT(3)
64
#define SCR_SMD_BIT BIT(7)
65
#define SCR_HCE_BIT BIT(8)
66
#define SCR_RW_BIT BIT(10)
67
#define SCR_ST_BIT BIT(11)
68
#define SCR_EEL2_BIT BIT(18)
69
70
#define SCR_RES1 (BIT(4) | BIT(5))
71
72
/* MPIDR */
73
#define MPIDR_AFFLVL_MASK (0xffULL)
74
75
#define MPIDR_AFF0_SHIFT (0)
76
#define MPIDR_AFF1_SHIFT (8)
77
#define MPIDR_AFF2_SHIFT (16)
78
#define MPIDR_AFF3_SHIFT (32)
79
80
#define MPIDR_AFF_MASK (GENMASK(23, 0) | GENMASK(39, 32))
81
82
#define MPIDR_AFFLVL(mpidr, aff_level) \
83
(((mpidr) >> MPIDR_AFF##aff_level##_SHIFT) & MPIDR_AFFLVL_MASK)
84
85
#define GET_MPIDR() read_sysreg(mpidr_el1)
86
#define MPIDR_TO_CORE(mpidr) (mpidr & MPIDR_AFF_MASK)
87
88
#define MODE_EL_SHIFT (0x2)
89
#define MODE_EL_MASK (0x3)
90
91
#define MODE_EL3 (0x3)
92
#define MODE_EL2 (0x2)
93
#define MODE_EL1 (0x1)
94
#define MODE_EL0 (0x0)
95
96
#define GET_EL(_mode) (((_mode) >> MODE_EL_SHIFT) & MODE_EL_MASK)
97
98
#define ESR_EC_SHIFT (26)
99
#define ESR_EC_MASK BIT_MASK(6)
100
#define ESR_ISS_SHIFT (0)
101
#define ESR_ISS_MASK BIT_MASK(25)
102
#define ESR_IL_SHIFT (25)
103
#define ESR_IL_MASK BIT_MASK(1)
104
105
#define GET_ESR_EC(esr) (((esr) >> ESR_EC_SHIFT) & ESR_EC_MASK)
106
#define GET_ESR_IL(esr) (((esr) >> ESR_IL_SHIFT) & ESR_IL_MASK)
107
#define GET_ESR_ISS(esr) (((esr) >> ESR_ISS_SHIFT) & ESR_ISS_MASK)
108
109
#define CNTV_CTL_ENABLE_BIT BIT(0)
110
#define CNTV_CTL_IMASK_BIT BIT(1)
111
112
#define ID_AA64PFR0_EL0_SHIFT (0)
113
#define ID_AA64PFR0_EL1_SHIFT (4)
114
#define ID_AA64PFR0_EL2_SHIFT (8)
115
#define ID_AA64PFR0_EL3_SHIFT (12)
116
#define ID_AA64PFR0_ELX_MASK (0xf)
117
#define ID_AA64PFR0_FP_SHIFT (16)
118
#define ID_AA64PFR0_FP_MASK (0xf)
119
#define ID_AA64PFR0_ADVSIMD_SHIFT (20)
120
#define ID_AA64PFR0_ADVSIMD_MASK (0xf)
121
#define ID_AA64PFR0_SVE_SHIFT (32)
122
#define ID_AA64PFR0_SVE_MASK (0xf)
123
#define ID_AA64PFR0_SEL2_SHIFT (36)
124
#define ID_AA64PFR0_SEL2_MASK (0xf)
125
126
/*
127
* TODO: ACTLR is of class implementation defined. All core implementations
128
* in armv8a have the same implementation so far w.r.t few controls.
129
* When there will be differences we have to create core specific headers.
130
*/
131
#define ACTLR_EL3_CPUACTLR_BIT BIT(0)
132
#define ACTLR_EL3_CPUECTLR_BIT BIT(1)
133
#define ACTLR_EL3_L2CTLR_BIT BIT(4)
134
#define ACTLR_EL3_L2ECTLR_BIT BIT(5)
135
#define ACTLR_EL3_L2ACTLR_BIT BIT(6)
136
137
#define CPTR_EZ_BIT BIT(8)
138
#define CPTR_TFP_BIT BIT(10)
139
#define CPTR_TTA_BIT BIT(20)
140
#define CPTR_TCPAC_BIT BIT(31)
141
142
/* SVE-specific CPTR_EL2 bits */
143
#define CPTR_EL2_TZ_BIT BIT(8)
144
#define CPTR_EL2_ZEN_SHIFT 16
145
#define CPTR_EL2_ZEN_MASK (0x3 << CPTR_EL2_ZEN_SHIFT)
146
#define CPTR_EL2_ZEN_EL1_EN BIT(16)
147
#define CPTR_EL2_ZEN_EL0_EN BIT(17)
148
149
#define CPTR_EL2_RES1 BIT(13) | BIT(12) | BIT(9) | (0xff)
150
151
/* SVE Control Register (ZCR) */
152
#define ZCR_EL1 S3_0_C1_C2_0
153
#define ZCR_EL2 S3_4_C1_C2_0
154
#define ZCR_EL3 S3_6_C1_C2_0
155
156
#define HCR_FMO_BIT BIT(3)
157
#define HCR_IMO_BIT BIT(4)
158
#define HCR_AMO_BIT BIT(5)
159
#define HCR_TGE_BIT BIT(27)
160
#define HCR_RW_BIT BIT(31)
161
162
/* System register interface to GICv3 */
163
#define ICC_IGRPEN1_EL1 S3_0_C12_C12_7
164
#define ICC_SGI1R S3_0_C12_C11_5
165
#define ICC_SRE_EL1 S3_0_C12_C12_5
166
#define ICC_SRE_EL2 S3_4_C12_C9_5
167
#define ICC_SRE_EL3 S3_6_C12_C12_5
168
#define ICC_CTLR_EL1 S3_0_C12_C12_4
169
#define ICC_CTLR_EL3 S3_6_C12_C12_4
170
#define ICC_PMR_EL1 S3_0_C4_C6_0
171
#define ICC_RPR_EL1 S3_0_C12_C11_3
172
#define ICC_IGRPEN1_EL3 S3_6_C12_C12_7
173
#define ICC_IGRPEN0_EL1 S3_0_C12_C12_6
174
#define ICC_HPPIR0_EL1 S3_0_C12_C8_2
175
#define ICC_HPPIR1_EL1 S3_0_C12_C12_2
176
#define ICC_IAR0_EL1 S3_0_C12_C8_0
177
#define ICC_IAR1_EL1 S3_0_C12_C12_0
178
#define ICC_EOIR0_EL1 S3_0_C12_C8_1
179
#define ICC_EOIR1_EL1 S3_0_C12_C12_1
180
#define ICC_SGI0R_EL1 S3_0_C12_C11_7
181
182
/* register constants */
183
#define ICC_SRE_ELx_SRE_BIT BIT(0)
184
#define ICC_SRE_ELx_DFB_BIT BIT(1)
185
#define ICC_SRE_ELx_DIB_BIT BIT(2)
186
#define ICC_SRE_EL3_EN_BIT BIT(3)
187
188
/* ICC SGI macros */
189
#define SGIR_TGT_MASK (0xffff)
190
#define SGIR_AFF1_SHIFT (16)
191
#define SGIR_AFF2_SHIFT (32)
192
#define SGIR_AFF3_SHIFT (48)
193
#define SGIR_AFF_MASK (0xff)
194
#define SGIR_INTID_SHIFT (24)
195
#define SGIR_INTID_MASK (0xf)
196
#define SGIR_IRM_SHIFT (40)
197
#define SGIR_IRM_MASK (0x1)
198
#define SGIR_IRM_TO_AFF (0)
199
200
#define GICV3_SGIR_VALUE(_aff3, _aff2, _aff1, _intid, _irm, _tgt) \
201
((((uint64_t) (_aff3) & SGIR_AFF_MASK) << SGIR_AFF3_SHIFT) | \
202
(((uint64_t) (_irm) & SGIR_IRM_MASK) << SGIR_IRM_SHIFT) | \
203
(((uint64_t) (_aff2) & SGIR_AFF_MASK) << SGIR_AFF2_SHIFT) | \
204
(((_intid) & SGIR_INTID_MASK) << SGIR_INTID_SHIFT) | \
205
(((_aff1) & SGIR_AFF_MASK) << SGIR_AFF1_SHIFT) | \
206
((_tgt) & SGIR_TGT_MASK))
207
208
/* Implementation defined register definitions */
209
#if defined(CONFIG_CPU_CORTEX_A72)
210
211
#define CORTEX_A72_L2CTLR_EL1 S3_1_C11_C0_2
212
#define CORTEX_A72_L2CTLR_DATA_RAM_LATENCY_SHIFT (0)
213
#define CORTEX_A72_L2CTLR_DATA_RAM_SETUP_SHIFT (5)
214
#define CORTEX_A72_L2CTLR_TAG_RAM_LATENCY_SHIFT (6)
215
#define CORTEX_A72_L2CTLR_TAG_RAM_SETUP_SHIFT (9)
216
217
#define CORTEX_A72_L2_DATA_RAM_LATENCY_3_CYCLES (2)
218
#define CORTEX_A72_L2_DATA_RAM_LATENCY_MASK (0x7)
219
#define CORTEX_A72_L2_DATA_RAM_SETUP_1_CYCLE (1)
220
#define CORTEX_A72_L2_TAG_RAM_LATENCY_2_CYCLES (1)
221
#define CORTEX_A72_L2_TAG_RAM_LATENCY_3_CYCLES (2)
222
#define CORTEX_A72_L2_TAG_RAM_LATENCY_MASK (0x7)
223
#define CORTEX_A72_L2_TAG_RAM_SETUP_1_CYCLE (1)
224
225
#define CORTEX_A72_L2ACTLR_EL1 S3_1_C15_C0_0
226
#define CORTEX_A72_L2ACTLR_DISABLE_ACE_SH_OR_CHI_BIT BIT(6)
227
228
#endif
/* CONFIG_CPU_CORTEX_A72 */
229
230
#define L1_CACHE_SHIFT (6)
231
#define L1_CACHE_BYTES BIT(L1_CACHE_SHIFT)
232
#define ARM64_CPU_INIT_SIZE L1_CACHE_BYTES
233
234
#endif
/* ZEPHYR_INCLUDE_ARCH_ARM64_CPU_H_ */
stdbool.h
util_macro.h
Macro utilities.
zephyr
arch
arm64
cpu.h
Generated on
for Zephyr API Documentation by
1.14.0