xref: /arm-trusted-firmware/include/arch/aarch64/arch_helpers.h (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu /*
2*91f16700Schasinglulu  * Copyright (c) 2013-2023, Arm Limited and Contributors. All rights reserved.
3*91f16700Schasinglulu  *
4*91f16700Schasinglulu  * SPDX-License-Identifier: BSD-3-Clause
5*91f16700Schasinglulu  */
6*91f16700Schasinglulu 
7*91f16700Schasinglulu #ifndef ARCH_HELPERS_H
8*91f16700Schasinglulu #define ARCH_HELPERS_H
9*91f16700Schasinglulu 
10*91f16700Schasinglulu #include <cdefs.h>
11*91f16700Schasinglulu #include <stdbool.h>
12*91f16700Schasinglulu #include <stdint.h>
13*91f16700Schasinglulu #include <string.h>
14*91f16700Schasinglulu 
15*91f16700Schasinglulu #include <arch.h>
16*91f16700Schasinglulu 
17*91f16700Schasinglulu /**********************************************************************
18*91f16700Schasinglulu  * Macros which create inline functions to read or write CPU system
19*91f16700Schasinglulu  * registers
20*91f16700Schasinglulu  *********************************************************************/
21*91f16700Schasinglulu 
22*91f16700Schasinglulu #define _DEFINE_SYSREG_READ_FUNC(_name, _reg_name)		\
23*91f16700Schasinglulu static inline u_register_t read_ ## _name(void)			\
24*91f16700Schasinglulu {								\
25*91f16700Schasinglulu 	u_register_t v;						\
26*91f16700Schasinglulu 	__asm__ volatile ("mrs %0, " #_reg_name : "=r" (v));	\
27*91f16700Schasinglulu 	return v;						\
28*91f16700Schasinglulu }
29*91f16700Schasinglulu 
30*91f16700Schasinglulu #define _DEFINE_SYSREG_READ_FUNC_NV(_name, _reg_name)		\
31*91f16700Schasinglulu static inline u_register_t read_ ## _name(void)			\
32*91f16700Schasinglulu {								\
33*91f16700Schasinglulu 	u_register_t v;						\
34*91f16700Schasinglulu 	__asm__ ("mrs %0, " #_reg_name : "=r" (v));		\
35*91f16700Schasinglulu 	return v;						\
36*91f16700Schasinglulu }
37*91f16700Schasinglulu 
38*91f16700Schasinglulu #define _DEFINE_SYSREG_WRITE_FUNC(_name, _reg_name)			\
39*91f16700Schasinglulu static inline void write_ ## _name(u_register_t v)			\
40*91f16700Schasinglulu {									\
41*91f16700Schasinglulu 	__asm__ volatile ("msr " #_reg_name ", %0" : : "r" (v));	\
42*91f16700Schasinglulu }
43*91f16700Schasinglulu 
44*91f16700Schasinglulu #define SYSREG_WRITE_CONST(reg_name, v)				\
45*91f16700Schasinglulu 	__asm__ volatile ("msr " #reg_name ", %0" : : "i" (v))
46*91f16700Schasinglulu 
47*91f16700Schasinglulu /* Define read function for system register */
48*91f16700Schasinglulu #define DEFINE_SYSREG_READ_FUNC(_name) 			\
49*91f16700Schasinglulu 	_DEFINE_SYSREG_READ_FUNC(_name, _name)
50*91f16700Schasinglulu 
51*91f16700Schasinglulu /* Define read & write function for system register */
52*91f16700Schasinglulu #define DEFINE_SYSREG_RW_FUNCS(_name)			\
53*91f16700Schasinglulu 	_DEFINE_SYSREG_READ_FUNC(_name, _name)		\
54*91f16700Schasinglulu 	_DEFINE_SYSREG_WRITE_FUNC(_name, _name)
55*91f16700Schasinglulu 
56*91f16700Schasinglulu /* Define read & write function for renamed system register */
57*91f16700Schasinglulu #define DEFINE_RENAME_SYSREG_RW_FUNCS(_name, _reg_name)	\
58*91f16700Schasinglulu 	_DEFINE_SYSREG_READ_FUNC(_name, _reg_name)	\
59*91f16700Schasinglulu 	_DEFINE_SYSREG_WRITE_FUNC(_name, _reg_name)
60*91f16700Schasinglulu 
61*91f16700Schasinglulu /* Define read function for renamed system register */
62*91f16700Schasinglulu #define DEFINE_RENAME_SYSREG_READ_FUNC(_name, _reg_name)	\
63*91f16700Schasinglulu 	_DEFINE_SYSREG_READ_FUNC(_name, _reg_name)
64*91f16700Schasinglulu 
65*91f16700Schasinglulu /* Define write function for renamed system register */
66*91f16700Schasinglulu #define DEFINE_RENAME_SYSREG_WRITE_FUNC(_name, _reg_name)	\
67*91f16700Schasinglulu 	_DEFINE_SYSREG_WRITE_FUNC(_name, _reg_name)
68*91f16700Schasinglulu 
69*91f16700Schasinglulu /* Define read function for ID register (w/o volatile qualifier) */
70*91f16700Schasinglulu #define DEFINE_IDREG_READ_FUNC(_name)			\
71*91f16700Schasinglulu 	_DEFINE_SYSREG_READ_FUNC_NV(_name, _name)
72*91f16700Schasinglulu 
73*91f16700Schasinglulu /* Define read function for renamed ID register (w/o volatile qualifier) */
74*91f16700Schasinglulu #define DEFINE_RENAME_IDREG_READ_FUNC(_name, _reg_name)	\
75*91f16700Schasinglulu 	_DEFINE_SYSREG_READ_FUNC_NV(_name, _reg_name)
76*91f16700Schasinglulu 
77*91f16700Schasinglulu /**********************************************************************
78*91f16700Schasinglulu  * Macros to create inline functions for system instructions
79*91f16700Schasinglulu  *********************************************************************/
80*91f16700Schasinglulu 
81*91f16700Schasinglulu /* Define function for simple system instruction */
82*91f16700Schasinglulu #define DEFINE_SYSOP_FUNC(_op)				\
83*91f16700Schasinglulu static inline void _op(void)				\
84*91f16700Schasinglulu {							\
85*91f16700Schasinglulu 	__asm__ (#_op);					\
86*91f16700Schasinglulu }
87*91f16700Schasinglulu 
88*91f16700Schasinglulu /* Define function for system instruction with register parameter */
89*91f16700Schasinglulu #define DEFINE_SYSOP_PARAM_FUNC(_op)			\
90*91f16700Schasinglulu static inline void _op(uint64_t v)			\
91*91f16700Schasinglulu {							\
92*91f16700Schasinglulu 	 __asm__ (#_op "  %0" : : "r" (v));		\
93*91f16700Schasinglulu }
94*91f16700Schasinglulu 
95*91f16700Schasinglulu /* Define function for system instruction with type specifier */
96*91f16700Schasinglulu #define DEFINE_SYSOP_TYPE_FUNC(_op, _type)		\
97*91f16700Schasinglulu static inline void _op ## _type(void)			\
98*91f16700Schasinglulu {							\
99*91f16700Schasinglulu 	__asm__ (#_op " " #_type : : : "memory");			\
100*91f16700Schasinglulu }
101*91f16700Schasinglulu 
102*91f16700Schasinglulu /* Define function for system instruction with register parameter */
103*91f16700Schasinglulu #define DEFINE_SYSOP_TYPE_PARAM_FUNC(_op, _type)	\
104*91f16700Schasinglulu static inline void _op ## _type(uint64_t v)		\
105*91f16700Schasinglulu {							\
106*91f16700Schasinglulu 	 __asm__ (#_op " " #_type ", %0" : : "r" (v));	\
107*91f16700Schasinglulu }
108*91f16700Schasinglulu 
109*91f16700Schasinglulu /*******************************************************************************
110*91f16700Schasinglulu  * TLB maintenance accessor prototypes
111*91f16700Schasinglulu  ******************************************************************************/
112*91f16700Schasinglulu 
113*91f16700Schasinglulu #if ERRATA_A57_813419 || ERRATA_A76_1286807
114*91f16700Schasinglulu /*
115*91f16700Schasinglulu  * Define function for TLBI instruction with type specifier that implements
116*91f16700Schasinglulu  * the workaround for errata 813419 of Cortex-A57 or errata 1286807 of
117*91f16700Schasinglulu  * Cortex-A76.
118*91f16700Schasinglulu  */
119*91f16700Schasinglulu #define DEFINE_TLBIOP_ERRATA_TYPE_FUNC(_type)\
120*91f16700Schasinglulu static inline void tlbi ## _type(void)			\
121*91f16700Schasinglulu {							\
122*91f16700Schasinglulu 	__asm__("tlbi " #_type "\n"			\
123*91f16700Schasinglulu 		"dsb ish\n"				\
124*91f16700Schasinglulu 		"tlbi " #_type);			\
125*91f16700Schasinglulu }
126*91f16700Schasinglulu 
127*91f16700Schasinglulu /*
128*91f16700Schasinglulu  * Define function for TLBI instruction with register parameter that implements
129*91f16700Schasinglulu  * the workaround for errata 813419 of Cortex-A57 or errata 1286807 of
130*91f16700Schasinglulu  * Cortex-A76.
131*91f16700Schasinglulu  */
132*91f16700Schasinglulu #define DEFINE_TLBIOP_ERRATA_TYPE_PARAM_FUNC(_type)	\
133*91f16700Schasinglulu static inline void tlbi ## _type(uint64_t v)			\
134*91f16700Schasinglulu {								\
135*91f16700Schasinglulu 	__asm__("tlbi " #_type ", %0\n"				\
136*91f16700Schasinglulu 		"dsb ish\n"					\
137*91f16700Schasinglulu 		"tlbi " #_type ", %0" : : "r" (v));		\
138*91f16700Schasinglulu }
139*91f16700Schasinglulu #endif /* ERRATA_A57_813419 */
140*91f16700Schasinglulu 
141*91f16700Schasinglulu #if ERRATA_A53_819472 || ERRATA_A53_824069 || ERRATA_A53_827319
142*91f16700Schasinglulu /*
143*91f16700Schasinglulu  * Define function for DC instruction with register parameter that enables
144*91f16700Schasinglulu  * the workaround for errata 819472, 824069 and 827319 of Cortex-A53.
145*91f16700Schasinglulu  */
146*91f16700Schasinglulu #define DEFINE_DCOP_ERRATA_A53_TYPE_PARAM_FUNC(_name, _type)	\
147*91f16700Schasinglulu static inline void dc ## _name(uint64_t v)			\
148*91f16700Schasinglulu {								\
149*91f16700Schasinglulu 	__asm__("dc " #_type ", %0" : : "r" (v));		\
150*91f16700Schasinglulu }
151*91f16700Schasinglulu #endif /* ERRATA_A53_819472 || ERRATA_A53_824069 || ERRATA_A53_827319 */
152*91f16700Schasinglulu 
153*91f16700Schasinglulu #if ERRATA_A57_813419
154*91f16700Schasinglulu DEFINE_SYSOP_TYPE_FUNC(tlbi, alle1)
155*91f16700Schasinglulu DEFINE_SYSOP_TYPE_FUNC(tlbi, alle1is)
156*91f16700Schasinglulu DEFINE_SYSOP_TYPE_FUNC(tlbi, alle2)
157*91f16700Schasinglulu DEFINE_SYSOP_TYPE_FUNC(tlbi, alle2is)
158*91f16700Schasinglulu DEFINE_TLBIOP_ERRATA_TYPE_FUNC(alle3)
159*91f16700Schasinglulu DEFINE_TLBIOP_ERRATA_TYPE_FUNC(alle3is)
160*91f16700Schasinglulu DEFINE_SYSOP_TYPE_FUNC(tlbi, vmalle1)
161*91f16700Schasinglulu #elif ERRATA_A76_1286807
162*91f16700Schasinglulu DEFINE_TLBIOP_ERRATA_TYPE_FUNC(alle1)
163*91f16700Schasinglulu DEFINE_TLBIOP_ERRATA_TYPE_FUNC(alle1is)
164*91f16700Schasinglulu DEFINE_TLBIOP_ERRATA_TYPE_FUNC(alle2)
165*91f16700Schasinglulu DEFINE_TLBIOP_ERRATA_TYPE_FUNC(alle2is)
166*91f16700Schasinglulu DEFINE_TLBIOP_ERRATA_TYPE_FUNC(alle3)
167*91f16700Schasinglulu DEFINE_TLBIOP_ERRATA_TYPE_FUNC(alle3is)
168*91f16700Schasinglulu DEFINE_TLBIOP_ERRATA_TYPE_FUNC(vmalle1)
169*91f16700Schasinglulu #else
170*91f16700Schasinglulu DEFINE_SYSOP_TYPE_FUNC(tlbi, alle1)
171*91f16700Schasinglulu DEFINE_SYSOP_TYPE_FUNC(tlbi, alle1is)
172*91f16700Schasinglulu DEFINE_SYSOP_TYPE_FUNC(tlbi, alle2)
173*91f16700Schasinglulu DEFINE_SYSOP_TYPE_FUNC(tlbi, alle2is)
174*91f16700Schasinglulu DEFINE_SYSOP_TYPE_FUNC(tlbi, alle3)
175*91f16700Schasinglulu DEFINE_SYSOP_TYPE_FUNC(tlbi, alle3is)
176*91f16700Schasinglulu DEFINE_SYSOP_TYPE_FUNC(tlbi, vmalle1)
177*91f16700Schasinglulu #endif
178*91f16700Schasinglulu 
179*91f16700Schasinglulu #if ERRATA_A57_813419
180*91f16700Schasinglulu DEFINE_SYSOP_TYPE_PARAM_FUNC(tlbi, vaae1is)
181*91f16700Schasinglulu DEFINE_SYSOP_TYPE_PARAM_FUNC(tlbi, vaale1is)
182*91f16700Schasinglulu DEFINE_SYSOP_TYPE_PARAM_FUNC(tlbi, vae2is)
183*91f16700Schasinglulu DEFINE_SYSOP_TYPE_PARAM_FUNC(tlbi, vale2is)
184*91f16700Schasinglulu DEFINE_TLBIOP_ERRATA_TYPE_PARAM_FUNC(vae3is)
185*91f16700Schasinglulu DEFINE_TLBIOP_ERRATA_TYPE_PARAM_FUNC(vale3is)
186*91f16700Schasinglulu #elif ERRATA_A76_1286807
187*91f16700Schasinglulu DEFINE_TLBIOP_ERRATA_TYPE_PARAM_FUNC(vaae1is)
188*91f16700Schasinglulu DEFINE_TLBIOP_ERRATA_TYPE_PARAM_FUNC(vaale1is)
189*91f16700Schasinglulu DEFINE_TLBIOP_ERRATA_TYPE_PARAM_FUNC(vae2is)
190*91f16700Schasinglulu DEFINE_TLBIOP_ERRATA_TYPE_PARAM_FUNC(vale2is)
191*91f16700Schasinglulu DEFINE_TLBIOP_ERRATA_TYPE_PARAM_FUNC(vae3is)
192*91f16700Schasinglulu DEFINE_TLBIOP_ERRATA_TYPE_PARAM_FUNC(vale3is)
193*91f16700Schasinglulu #else
194*91f16700Schasinglulu DEFINE_SYSOP_TYPE_PARAM_FUNC(tlbi, vaae1is)
195*91f16700Schasinglulu DEFINE_SYSOP_TYPE_PARAM_FUNC(tlbi, vaale1is)
196*91f16700Schasinglulu DEFINE_SYSOP_TYPE_PARAM_FUNC(tlbi, vae2is)
197*91f16700Schasinglulu DEFINE_SYSOP_TYPE_PARAM_FUNC(tlbi, vale2is)
198*91f16700Schasinglulu DEFINE_SYSOP_TYPE_PARAM_FUNC(tlbi, vae3is)
199*91f16700Schasinglulu DEFINE_SYSOP_TYPE_PARAM_FUNC(tlbi, vale3is)
200*91f16700Schasinglulu #endif
201*91f16700Schasinglulu 
202*91f16700Schasinglulu /*******************************************************************************
203*91f16700Schasinglulu  * Cache maintenance accessor prototypes
204*91f16700Schasinglulu  ******************************************************************************/
205*91f16700Schasinglulu DEFINE_SYSOP_TYPE_PARAM_FUNC(dc, isw)
206*91f16700Schasinglulu DEFINE_SYSOP_TYPE_PARAM_FUNC(dc, cisw)
207*91f16700Schasinglulu #if ERRATA_A53_827319
208*91f16700Schasinglulu DEFINE_DCOP_ERRATA_A53_TYPE_PARAM_FUNC(csw, cisw)
209*91f16700Schasinglulu #else
210*91f16700Schasinglulu DEFINE_SYSOP_TYPE_PARAM_FUNC(dc, csw)
211*91f16700Schasinglulu #endif
212*91f16700Schasinglulu #if ERRATA_A53_819472 || ERRATA_A53_824069 || ERRATA_A53_827319
213*91f16700Schasinglulu DEFINE_DCOP_ERRATA_A53_TYPE_PARAM_FUNC(cvac, civac)
214*91f16700Schasinglulu #else
215*91f16700Schasinglulu DEFINE_SYSOP_TYPE_PARAM_FUNC(dc, cvac)
216*91f16700Schasinglulu #endif
217*91f16700Schasinglulu DEFINE_SYSOP_TYPE_PARAM_FUNC(dc, ivac)
218*91f16700Schasinglulu DEFINE_SYSOP_TYPE_PARAM_FUNC(dc, civac)
219*91f16700Schasinglulu #if ERRATA_A53_819472 || ERRATA_A53_824069 || ERRATA_A53_827319
220*91f16700Schasinglulu DEFINE_DCOP_ERRATA_A53_TYPE_PARAM_FUNC(cvau, civac)
221*91f16700Schasinglulu #else
222*91f16700Schasinglulu DEFINE_SYSOP_TYPE_PARAM_FUNC(dc, cvau)
223*91f16700Schasinglulu #endif
224*91f16700Schasinglulu DEFINE_SYSOP_TYPE_PARAM_FUNC(dc, zva)
225*91f16700Schasinglulu 
226*91f16700Schasinglulu /*******************************************************************************
227*91f16700Schasinglulu  * Address translation accessor prototypes
228*91f16700Schasinglulu  ******************************************************************************/
229*91f16700Schasinglulu DEFINE_SYSOP_TYPE_PARAM_FUNC(at, s12e1r)
230*91f16700Schasinglulu DEFINE_SYSOP_TYPE_PARAM_FUNC(at, s12e1w)
231*91f16700Schasinglulu DEFINE_SYSOP_TYPE_PARAM_FUNC(at, s12e0r)
232*91f16700Schasinglulu DEFINE_SYSOP_TYPE_PARAM_FUNC(at, s12e0w)
233*91f16700Schasinglulu DEFINE_SYSOP_TYPE_PARAM_FUNC(at, s1e1r)
234*91f16700Schasinglulu DEFINE_SYSOP_TYPE_PARAM_FUNC(at, s1e2r)
235*91f16700Schasinglulu DEFINE_SYSOP_TYPE_PARAM_FUNC(at, s1e3r)
236*91f16700Schasinglulu 
237*91f16700Schasinglulu /*******************************************************************************
238*91f16700Schasinglulu  * Strip Pointer Authentication Code
239*91f16700Schasinglulu  ******************************************************************************/
240*91f16700Schasinglulu DEFINE_SYSOP_PARAM_FUNC(xpaci)
241*91f16700Schasinglulu 
242*91f16700Schasinglulu void flush_dcache_range(uintptr_t addr, size_t size);
243*91f16700Schasinglulu void flush_dcache_to_popa_range(uintptr_t addr, size_t size);
244*91f16700Schasinglulu void clean_dcache_range(uintptr_t addr, size_t size);
245*91f16700Schasinglulu void inv_dcache_range(uintptr_t addr, size_t size);
246*91f16700Schasinglulu bool is_dcache_enabled(void);
247*91f16700Schasinglulu 
248*91f16700Schasinglulu void dcsw_op_louis(u_register_t op_type);
249*91f16700Schasinglulu void dcsw_op_all(u_register_t op_type);
250*91f16700Schasinglulu 
251*91f16700Schasinglulu void disable_mmu_el1(void);
252*91f16700Schasinglulu void disable_mmu_el3(void);
253*91f16700Schasinglulu void disable_mpu_el2(void);
254*91f16700Schasinglulu void disable_mmu_icache_el1(void);
255*91f16700Schasinglulu void disable_mmu_icache_el3(void);
256*91f16700Schasinglulu void disable_mpu_icache_el2(void);
257*91f16700Schasinglulu 
258*91f16700Schasinglulu /*******************************************************************************
259*91f16700Schasinglulu  * Misc. accessor prototypes
260*91f16700Schasinglulu  ******************************************************************************/
261*91f16700Schasinglulu 
262*91f16700Schasinglulu #define write_daifclr(val) SYSREG_WRITE_CONST(daifclr, val)
263*91f16700Schasinglulu #define write_daifset(val) SYSREG_WRITE_CONST(daifset, val)
264*91f16700Schasinglulu 
265*91f16700Schasinglulu DEFINE_SYSREG_RW_FUNCS(par_el1)
266*91f16700Schasinglulu DEFINE_IDREG_READ_FUNC(id_pfr1_el1)
267*91f16700Schasinglulu DEFINE_IDREG_READ_FUNC(id_aa64isar0_el1)
268*91f16700Schasinglulu DEFINE_IDREG_READ_FUNC(id_aa64isar1_el1)
269*91f16700Schasinglulu DEFINE_RENAME_IDREG_READ_FUNC(id_aa64isar2_el1, ID_AA64ISAR2_EL1)
270*91f16700Schasinglulu DEFINE_IDREG_READ_FUNC(id_aa64pfr0_el1)
271*91f16700Schasinglulu DEFINE_IDREG_READ_FUNC(id_aa64pfr1_el1)
272*91f16700Schasinglulu DEFINE_RENAME_IDREG_READ_FUNC(id_aa64pfr2_el1, ID_AA64PFR2_EL1)
273*91f16700Schasinglulu DEFINE_IDREG_READ_FUNC(id_aa64dfr0_el1)
274*91f16700Schasinglulu DEFINE_IDREG_READ_FUNC(id_afr0_el1)
275*91f16700Schasinglulu DEFINE_SYSREG_READ_FUNC(CurrentEl)
276*91f16700Schasinglulu DEFINE_SYSREG_READ_FUNC(ctr_el0)
277*91f16700Schasinglulu DEFINE_SYSREG_RW_FUNCS(daif)
278*91f16700Schasinglulu DEFINE_SYSREG_RW_FUNCS(spsr_el1)
279*91f16700Schasinglulu DEFINE_SYSREG_RW_FUNCS(spsr_el2)
280*91f16700Schasinglulu DEFINE_SYSREG_RW_FUNCS(spsr_el3)
281*91f16700Schasinglulu DEFINE_SYSREG_RW_FUNCS(elr_el1)
282*91f16700Schasinglulu DEFINE_SYSREG_RW_FUNCS(elr_el2)
283*91f16700Schasinglulu DEFINE_SYSREG_RW_FUNCS(elr_el3)
284*91f16700Schasinglulu DEFINE_SYSREG_RW_FUNCS(mdccsr_el0)
285*91f16700Schasinglulu DEFINE_SYSREG_RW_FUNCS(dbgdtrrx_el0)
286*91f16700Schasinglulu DEFINE_SYSREG_RW_FUNCS(dbgdtrtx_el0)
287*91f16700Schasinglulu DEFINE_SYSREG_RW_FUNCS(sp_el1)
288*91f16700Schasinglulu DEFINE_SYSREG_RW_FUNCS(sp_el2)
289*91f16700Schasinglulu 
290*91f16700Schasinglulu DEFINE_SYSOP_FUNC(wfi)
291*91f16700Schasinglulu DEFINE_SYSOP_FUNC(wfe)
292*91f16700Schasinglulu DEFINE_SYSOP_FUNC(sev)
293*91f16700Schasinglulu DEFINE_SYSOP_TYPE_FUNC(dsb, sy)
294*91f16700Schasinglulu DEFINE_SYSOP_TYPE_FUNC(dmb, sy)
295*91f16700Schasinglulu DEFINE_SYSOP_TYPE_FUNC(dmb, st)
296*91f16700Schasinglulu DEFINE_SYSOP_TYPE_FUNC(dmb, ld)
297*91f16700Schasinglulu DEFINE_SYSOP_TYPE_FUNC(dsb, ish)
298*91f16700Schasinglulu DEFINE_SYSOP_TYPE_FUNC(dsb, osh)
299*91f16700Schasinglulu DEFINE_SYSOP_TYPE_FUNC(dsb, nsh)
300*91f16700Schasinglulu DEFINE_SYSOP_TYPE_FUNC(dsb, ishst)
301*91f16700Schasinglulu DEFINE_SYSOP_TYPE_FUNC(dsb, oshst)
302*91f16700Schasinglulu DEFINE_SYSOP_TYPE_FUNC(dmb, oshld)
303*91f16700Schasinglulu DEFINE_SYSOP_TYPE_FUNC(dmb, oshst)
304*91f16700Schasinglulu DEFINE_SYSOP_TYPE_FUNC(dmb, osh)
305*91f16700Schasinglulu DEFINE_SYSOP_TYPE_FUNC(dmb, nshld)
306*91f16700Schasinglulu DEFINE_SYSOP_TYPE_FUNC(dmb, nshst)
307*91f16700Schasinglulu DEFINE_SYSOP_TYPE_FUNC(dmb, nsh)
308*91f16700Schasinglulu DEFINE_SYSOP_TYPE_FUNC(dmb, ishld)
309*91f16700Schasinglulu DEFINE_SYSOP_TYPE_FUNC(dmb, ishst)
310*91f16700Schasinglulu DEFINE_SYSOP_TYPE_FUNC(dmb, ish)
311*91f16700Schasinglulu DEFINE_SYSOP_FUNC(isb)
312*91f16700Schasinglulu 
313*91f16700Schasinglulu static inline void enable_irq(void)
314*91f16700Schasinglulu {
315*91f16700Schasinglulu 	/*
316*91f16700Schasinglulu 	 * The compiler memory barrier will prevent the compiler from
317*91f16700Schasinglulu 	 * scheduling non-volatile memory access after the write to the
318*91f16700Schasinglulu 	 * register.
319*91f16700Schasinglulu 	 *
320*91f16700Schasinglulu 	 * This could happen if some initialization code issues non-volatile
321*91f16700Schasinglulu 	 * accesses to an area used by an interrupt handler, in the assumption
322*91f16700Schasinglulu 	 * that it is safe as the interrupts are disabled at the time it does
323*91f16700Schasinglulu 	 * that (according to program order). However, non-volatile accesses
324*91f16700Schasinglulu 	 * are not necessarily in program order relatively with volatile inline
325*91f16700Schasinglulu 	 * assembly statements (and volatile accesses).
326*91f16700Schasinglulu 	 */
327*91f16700Schasinglulu 	COMPILER_BARRIER();
328*91f16700Schasinglulu 	write_daifclr(DAIF_IRQ_BIT);
329*91f16700Schasinglulu 	isb();
330*91f16700Schasinglulu }
331*91f16700Schasinglulu 
332*91f16700Schasinglulu static inline void enable_fiq(void)
333*91f16700Schasinglulu {
334*91f16700Schasinglulu 	COMPILER_BARRIER();
335*91f16700Schasinglulu 	write_daifclr(DAIF_FIQ_BIT);
336*91f16700Schasinglulu 	isb();
337*91f16700Schasinglulu }
338*91f16700Schasinglulu 
339*91f16700Schasinglulu static inline void enable_serror(void)
340*91f16700Schasinglulu {
341*91f16700Schasinglulu 	COMPILER_BARRIER();
342*91f16700Schasinglulu 	write_daifclr(DAIF_ABT_BIT);
343*91f16700Schasinglulu 	isb();
344*91f16700Schasinglulu }
345*91f16700Schasinglulu 
346*91f16700Schasinglulu static inline void enable_debug_exceptions(void)
347*91f16700Schasinglulu {
348*91f16700Schasinglulu 	COMPILER_BARRIER();
349*91f16700Schasinglulu 	write_daifclr(DAIF_DBG_BIT);
350*91f16700Schasinglulu 	isb();
351*91f16700Schasinglulu }
352*91f16700Schasinglulu 
353*91f16700Schasinglulu static inline void disable_irq(void)
354*91f16700Schasinglulu {
355*91f16700Schasinglulu 	COMPILER_BARRIER();
356*91f16700Schasinglulu 	write_daifset(DAIF_IRQ_BIT);
357*91f16700Schasinglulu 	isb();
358*91f16700Schasinglulu }
359*91f16700Schasinglulu 
360*91f16700Schasinglulu static inline void disable_fiq(void)
361*91f16700Schasinglulu {
362*91f16700Schasinglulu 	COMPILER_BARRIER();
363*91f16700Schasinglulu 	write_daifset(DAIF_FIQ_BIT);
364*91f16700Schasinglulu 	isb();
365*91f16700Schasinglulu }
366*91f16700Schasinglulu 
367*91f16700Schasinglulu static inline void disable_serror(void)
368*91f16700Schasinglulu {
369*91f16700Schasinglulu 	COMPILER_BARRIER();
370*91f16700Schasinglulu 	write_daifset(DAIF_ABT_BIT);
371*91f16700Schasinglulu 	isb();
372*91f16700Schasinglulu }
373*91f16700Schasinglulu 
374*91f16700Schasinglulu static inline void disable_debug_exceptions(void)
375*91f16700Schasinglulu {
376*91f16700Schasinglulu 	COMPILER_BARRIER();
377*91f16700Schasinglulu 	write_daifset(DAIF_DBG_BIT);
378*91f16700Schasinglulu 	isb();
379*91f16700Schasinglulu }
380*91f16700Schasinglulu 
381*91f16700Schasinglulu void __dead2 smc(uint64_t x0, uint64_t x1, uint64_t x2, uint64_t x3,
382*91f16700Schasinglulu 		 uint64_t x4, uint64_t x5, uint64_t x6, uint64_t x7);
383*91f16700Schasinglulu 
384*91f16700Schasinglulu /*******************************************************************************
385*91f16700Schasinglulu  * System register accessor prototypes
386*91f16700Schasinglulu  ******************************************************************************/
387*91f16700Schasinglulu DEFINE_IDREG_READ_FUNC(midr_el1)
388*91f16700Schasinglulu DEFINE_SYSREG_READ_FUNC(mpidr_el1)
389*91f16700Schasinglulu DEFINE_IDREG_READ_FUNC(id_aa64mmfr0_el1)
390*91f16700Schasinglulu DEFINE_IDREG_READ_FUNC(id_aa64mmfr1_el1)
391*91f16700Schasinglulu 
392*91f16700Schasinglulu DEFINE_SYSREG_RW_FUNCS(scr_el3)
393*91f16700Schasinglulu DEFINE_SYSREG_RW_FUNCS(hcr_el2)
394*91f16700Schasinglulu 
395*91f16700Schasinglulu DEFINE_SYSREG_RW_FUNCS(vbar_el1)
396*91f16700Schasinglulu DEFINE_SYSREG_RW_FUNCS(vbar_el2)
397*91f16700Schasinglulu DEFINE_SYSREG_RW_FUNCS(vbar_el3)
398*91f16700Schasinglulu 
399*91f16700Schasinglulu DEFINE_SYSREG_RW_FUNCS(sctlr_el1)
400*91f16700Schasinglulu DEFINE_SYSREG_RW_FUNCS(sctlr_el2)
401*91f16700Schasinglulu DEFINE_SYSREG_RW_FUNCS(sctlr_el3)
402*91f16700Schasinglulu 
403*91f16700Schasinglulu DEFINE_SYSREG_RW_FUNCS(actlr_el1)
404*91f16700Schasinglulu DEFINE_SYSREG_RW_FUNCS(actlr_el2)
405*91f16700Schasinglulu DEFINE_SYSREG_RW_FUNCS(actlr_el3)
406*91f16700Schasinglulu 
407*91f16700Schasinglulu DEFINE_SYSREG_RW_FUNCS(esr_el1)
408*91f16700Schasinglulu DEFINE_SYSREG_RW_FUNCS(esr_el2)
409*91f16700Schasinglulu DEFINE_SYSREG_RW_FUNCS(esr_el3)
410*91f16700Schasinglulu 
411*91f16700Schasinglulu DEFINE_SYSREG_RW_FUNCS(afsr0_el1)
412*91f16700Schasinglulu DEFINE_SYSREG_RW_FUNCS(afsr0_el2)
413*91f16700Schasinglulu DEFINE_SYSREG_RW_FUNCS(afsr0_el3)
414*91f16700Schasinglulu 
415*91f16700Schasinglulu DEFINE_SYSREG_RW_FUNCS(afsr1_el1)
416*91f16700Schasinglulu DEFINE_SYSREG_RW_FUNCS(afsr1_el2)
417*91f16700Schasinglulu DEFINE_SYSREG_RW_FUNCS(afsr1_el3)
418*91f16700Schasinglulu 
419*91f16700Schasinglulu DEFINE_SYSREG_RW_FUNCS(far_el1)
420*91f16700Schasinglulu DEFINE_SYSREG_RW_FUNCS(far_el2)
421*91f16700Schasinglulu DEFINE_SYSREG_RW_FUNCS(far_el3)
422*91f16700Schasinglulu 
423*91f16700Schasinglulu DEFINE_SYSREG_RW_FUNCS(mair_el1)
424*91f16700Schasinglulu DEFINE_SYSREG_RW_FUNCS(mair_el2)
425*91f16700Schasinglulu DEFINE_SYSREG_RW_FUNCS(mair_el3)
426*91f16700Schasinglulu 
427*91f16700Schasinglulu DEFINE_SYSREG_RW_FUNCS(amair_el1)
428*91f16700Schasinglulu DEFINE_SYSREG_RW_FUNCS(amair_el2)
429*91f16700Schasinglulu DEFINE_SYSREG_RW_FUNCS(amair_el3)
430*91f16700Schasinglulu 
431*91f16700Schasinglulu DEFINE_SYSREG_READ_FUNC(rvbar_el1)
432*91f16700Schasinglulu DEFINE_SYSREG_READ_FUNC(rvbar_el2)
433*91f16700Schasinglulu DEFINE_SYSREG_READ_FUNC(rvbar_el3)
434*91f16700Schasinglulu 
435*91f16700Schasinglulu DEFINE_SYSREG_RW_FUNCS(rmr_el1)
436*91f16700Schasinglulu DEFINE_SYSREG_RW_FUNCS(rmr_el2)
437*91f16700Schasinglulu DEFINE_SYSREG_RW_FUNCS(rmr_el3)
438*91f16700Schasinglulu 
439*91f16700Schasinglulu DEFINE_SYSREG_RW_FUNCS(tcr_el1)
440*91f16700Schasinglulu DEFINE_SYSREG_RW_FUNCS(tcr_el2)
441*91f16700Schasinglulu DEFINE_SYSREG_RW_FUNCS(tcr_el3)
442*91f16700Schasinglulu 
443*91f16700Schasinglulu DEFINE_SYSREG_RW_FUNCS(ttbr0_el1)
444*91f16700Schasinglulu DEFINE_SYSREG_RW_FUNCS(ttbr0_el2)
445*91f16700Schasinglulu DEFINE_SYSREG_RW_FUNCS(ttbr0_el3)
446*91f16700Schasinglulu 
447*91f16700Schasinglulu DEFINE_SYSREG_RW_FUNCS(ttbr1_el1)
448*91f16700Schasinglulu 
449*91f16700Schasinglulu DEFINE_SYSREG_RW_FUNCS(vttbr_el2)
450*91f16700Schasinglulu 
451*91f16700Schasinglulu DEFINE_SYSREG_RW_FUNCS(cptr_el2)
452*91f16700Schasinglulu DEFINE_SYSREG_RW_FUNCS(cptr_el3)
453*91f16700Schasinglulu 
454*91f16700Schasinglulu DEFINE_SYSREG_RW_FUNCS(cpacr_el1)
455*91f16700Schasinglulu DEFINE_SYSREG_RW_FUNCS(cntfrq_el0)
456*91f16700Schasinglulu DEFINE_SYSREG_RW_FUNCS(cnthp_ctl_el2)
457*91f16700Schasinglulu DEFINE_SYSREG_RW_FUNCS(cnthp_tval_el2)
458*91f16700Schasinglulu DEFINE_SYSREG_RW_FUNCS(cnthp_cval_el2)
459*91f16700Schasinglulu DEFINE_SYSREG_RW_FUNCS(cntps_ctl_el1)
460*91f16700Schasinglulu DEFINE_SYSREG_RW_FUNCS(cntps_tval_el1)
461*91f16700Schasinglulu DEFINE_SYSREG_RW_FUNCS(cntps_cval_el1)
462*91f16700Schasinglulu DEFINE_SYSREG_RW_FUNCS(cntp_ctl_el0)
463*91f16700Schasinglulu DEFINE_SYSREG_RW_FUNCS(cntp_tval_el0)
464*91f16700Schasinglulu DEFINE_SYSREG_RW_FUNCS(cntp_cval_el0)
465*91f16700Schasinglulu DEFINE_SYSREG_READ_FUNC(cntpct_el0)
466*91f16700Schasinglulu DEFINE_SYSREG_RW_FUNCS(cnthctl_el2)
467*91f16700Schasinglulu 
468*91f16700Schasinglulu DEFINE_SYSREG_RW_FUNCS(vtcr_el2)
469*91f16700Schasinglulu 
470*91f16700Schasinglulu #define get_cntp_ctl_enable(x)  (((x) >> CNTP_CTL_ENABLE_SHIFT) & \
471*91f16700Schasinglulu 					CNTP_CTL_ENABLE_MASK)
472*91f16700Schasinglulu #define get_cntp_ctl_imask(x)   (((x) >> CNTP_CTL_IMASK_SHIFT) & \
473*91f16700Schasinglulu 					CNTP_CTL_IMASK_MASK)
474*91f16700Schasinglulu #define get_cntp_ctl_istatus(x) (((x) >> CNTP_CTL_ISTATUS_SHIFT) & \
475*91f16700Schasinglulu 					CNTP_CTL_ISTATUS_MASK)
476*91f16700Schasinglulu 
477*91f16700Schasinglulu #define set_cntp_ctl_enable(x)  ((x) |= (U(1) << CNTP_CTL_ENABLE_SHIFT))
478*91f16700Schasinglulu #define set_cntp_ctl_imask(x)   ((x) |= (U(1) << CNTP_CTL_IMASK_SHIFT))
479*91f16700Schasinglulu 
480*91f16700Schasinglulu #define clr_cntp_ctl_enable(x)  ((x) &= ~(U(1) << CNTP_CTL_ENABLE_SHIFT))
481*91f16700Schasinglulu #define clr_cntp_ctl_imask(x)   ((x) &= ~(U(1) << CNTP_CTL_IMASK_SHIFT))
482*91f16700Schasinglulu 
483*91f16700Schasinglulu DEFINE_SYSREG_RW_FUNCS(tpidr_el3)
484*91f16700Schasinglulu 
485*91f16700Schasinglulu DEFINE_SYSREG_RW_FUNCS(cntvoff_el2)
486*91f16700Schasinglulu 
487*91f16700Schasinglulu DEFINE_SYSREG_RW_FUNCS(vpidr_el2)
488*91f16700Schasinglulu DEFINE_SYSREG_RW_FUNCS(vmpidr_el2)
489*91f16700Schasinglulu 
490*91f16700Schasinglulu DEFINE_SYSREG_RW_FUNCS(hacr_el2)
491*91f16700Schasinglulu DEFINE_SYSREG_RW_FUNCS(hpfar_el2)
492*91f16700Schasinglulu DEFINE_SYSREG_RW_FUNCS(tpidr_el2)
493*91f16700Schasinglulu DEFINE_SYSREG_RW_FUNCS(dbgvcr32_el2)
494*91f16700Schasinglulu DEFINE_RENAME_SYSREG_RW_FUNCS(ich_hcr_el2, ICH_HCR_EL2)
495*91f16700Schasinglulu DEFINE_RENAME_SYSREG_RW_FUNCS(ich_vmcr_el2, ICH_VMCR_EL2)
496*91f16700Schasinglulu 
497*91f16700Schasinglulu DEFINE_SYSREG_READ_FUNC(isr_el1)
498*91f16700Schasinglulu 
499*91f16700Schasinglulu DEFINE_SYSREG_RW_FUNCS(mdcr_el2)
500*91f16700Schasinglulu DEFINE_SYSREG_RW_FUNCS(mdcr_el3)
501*91f16700Schasinglulu DEFINE_SYSREG_RW_FUNCS(hstr_el2)
502*91f16700Schasinglulu DEFINE_SYSREG_RW_FUNCS(pmcr_el0)
503*91f16700Schasinglulu 
504*91f16700Schasinglulu /* GICv3 System Registers */
505*91f16700Schasinglulu 
506*91f16700Schasinglulu DEFINE_RENAME_SYSREG_RW_FUNCS(icc_sre_el1, ICC_SRE_EL1)
507*91f16700Schasinglulu DEFINE_RENAME_SYSREG_RW_FUNCS(icc_sre_el2, ICC_SRE_EL2)
508*91f16700Schasinglulu DEFINE_RENAME_SYSREG_RW_FUNCS(icc_sre_el3, ICC_SRE_EL3)
509*91f16700Schasinglulu DEFINE_RENAME_SYSREG_RW_FUNCS(icc_pmr_el1, ICC_PMR_EL1)
510*91f16700Schasinglulu DEFINE_RENAME_SYSREG_READ_FUNC(icc_rpr_el1, ICC_RPR_EL1)
511*91f16700Schasinglulu DEFINE_RENAME_SYSREG_RW_FUNCS(icc_igrpen1_el3, ICC_IGRPEN1_EL3)
512*91f16700Schasinglulu DEFINE_RENAME_SYSREG_RW_FUNCS(icc_igrpen1_el1, ICC_IGRPEN1_EL1)
513*91f16700Schasinglulu DEFINE_RENAME_SYSREG_RW_FUNCS(icc_igrpen0_el1, ICC_IGRPEN0_EL1)
514*91f16700Schasinglulu DEFINE_RENAME_SYSREG_READ_FUNC(icc_hppir0_el1, ICC_HPPIR0_EL1)
515*91f16700Schasinglulu DEFINE_RENAME_SYSREG_READ_FUNC(icc_hppir1_el1, ICC_HPPIR1_EL1)
516*91f16700Schasinglulu DEFINE_RENAME_SYSREG_READ_FUNC(icc_iar0_el1, ICC_IAR0_EL1)
517*91f16700Schasinglulu DEFINE_RENAME_SYSREG_READ_FUNC(icc_iar1_el1, ICC_IAR1_EL1)
518*91f16700Schasinglulu DEFINE_RENAME_SYSREG_WRITE_FUNC(icc_eoir0_el1, ICC_EOIR0_EL1)
519*91f16700Schasinglulu DEFINE_RENAME_SYSREG_WRITE_FUNC(icc_eoir1_el1, ICC_EOIR1_EL1)
520*91f16700Schasinglulu DEFINE_RENAME_SYSREG_WRITE_FUNC(icc_sgi0r_el1, ICC_SGI0R_EL1)
521*91f16700Schasinglulu DEFINE_RENAME_SYSREG_RW_FUNCS(icc_sgi1r, ICC_SGI1R)
522*91f16700Schasinglulu DEFINE_RENAME_SYSREG_RW_FUNCS(icc_asgi1r, ICC_ASGI1R)
523*91f16700Schasinglulu 
524*91f16700Schasinglulu DEFINE_RENAME_SYSREG_READ_FUNC(amcfgr_el0, AMCFGR_EL0)
525*91f16700Schasinglulu DEFINE_RENAME_SYSREG_READ_FUNC(amcgcr_el0, AMCGCR_EL0)
526*91f16700Schasinglulu DEFINE_RENAME_SYSREG_READ_FUNC(amcg1idr_el0, AMCG1IDR_EL0)
527*91f16700Schasinglulu DEFINE_RENAME_SYSREG_RW_FUNCS(amcr_el0, AMCR_EL0)
528*91f16700Schasinglulu DEFINE_RENAME_SYSREG_RW_FUNCS(amcntenclr0_el0, AMCNTENCLR0_EL0)
529*91f16700Schasinglulu DEFINE_RENAME_SYSREG_RW_FUNCS(amcntenset0_el0, AMCNTENSET0_EL0)
530*91f16700Schasinglulu DEFINE_RENAME_SYSREG_RW_FUNCS(amcntenclr1_el0, AMCNTENCLR1_EL0)
531*91f16700Schasinglulu DEFINE_RENAME_SYSREG_RW_FUNCS(amcntenset1_el0, AMCNTENSET1_EL0)
532*91f16700Schasinglulu 
533*91f16700Schasinglulu DEFINE_RENAME_SYSREG_RW_FUNCS(pmblimitr_el1, PMBLIMITR_EL1)
534*91f16700Schasinglulu 
535*91f16700Schasinglulu DEFINE_RENAME_SYSREG_WRITE_FUNC(zcr_el3, ZCR_EL3)
536*91f16700Schasinglulu DEFINE_RENAME_SYSREG_WRITE_FUNC(zcr_el2, ZCR_EL2)
537*91f16700Schasinglulu 
538*91f16700Schasinglulu DEFINE_RENAME_IDREG_READ_FUNC(id_aa64smfr0_el1, ID_AA64SMFR0_EL1)
539*91f16700Schasinglulu DEFINE_RENAME_SYSREG_RW_FUNCS(smcr_el3, SMCR_EL3)
540*91f16700Schasinglulu 
541*91f16700Schasinglulu DEFINE_RENAME_SYSREG_READ_FUNC(erridr_el1, ERRIDR_EL1)
542*91f16700Schasinglulu DEFINE_RENAME_SYSREG_WRITE_FUNC(errselr_el1, ERRSELR_EL1)
543*91f16700Schasinglulu 
544*91f16700Schasinglulu DEFINE_RENAME_SYSREG_READ_FUNC(erxfr_el1, ERXFR_EL1)
545*91f16700Schasinglulu DEFINE_RENAME_SYSREG_RW_FUNCS(erxctlr_el1, ERXCTLR_EL1)
546*91f16700Schasinglulu DEFINE_RENAME_SYSREG_RW_FUNCS(erxstatus_el1, ERXSTATUS_EL1)
547*91f16700Schasinglulu DEFINE_RENAME_SYSREG_READ_FUNC(erxaddr_el1, ERXADDR_EL1)
548*91f16700Schasinglulu DEFINE_RENAME_SYSREG_RW_FUNCS(erxmisc0_el1, ERXMISC0_EL1)
549*91f16700Schasinglulu DEFINE_RENAME_SYSREG_READ_FUNC(erxmisc1_el1, ERXMISC1_EL1)
550*91f16700Schasinglulu 
551*91f16700Schasinglulu DEFINE_RENAME_SYSREG_RW_FUNCS(scxtnum_el2, SCXTNUM_EL2)
552*91f16700Schasinglulu 
553*91f16700Schasinglulu /* Armv8.1 VHE Registers */
554*91f16700Schasinglulu DEFINE_RENAME_SYSREG_RW_FUNCS(contextidr_el2, CONTEXTIDR_EL2)
555*91f16700Schasinglulu DEFINE_RENAME_SYSREG_RW_FUNCS(ttbr1_el2, TTBR1_EL2)
556*91f16700Schasinglulu 
557*91f16700Schasinglulu /* Armv8.2 ID Registers */
558*91f16700Schasinglulu DEFINE_RENAME_IDREG_READ_FUNC(id_aa64mmfr2_el1, ID_AA64MMFR2_EL1)
559*91f16700Schasinglulu 
560*91f16700Schasinglulu /* Armv8.2 RAS Registers */
561*91f16700Schasinglulu DEFINE_RENAME_SYSREG_RW_FUNCS(vdisr_el2, VDISR_EL2)
562*91f16700Schasinglulu DEFINE_RENAME_SYSREG_RW_FUNCS(vsesr_el2, VSESR_EL2)
563*91f16700Schasinglulu 
564*91f16700Schasinglulu /* Armv8.2 MPAM Registers */
565*91f16700Schasinglulu DEFINE_RENAME_SYSREG_READ_FUNC(mpamidr_el1, MPAMIDR_EL1)
566*91f16700Schasinglulu DEFINE_RENAME_SYSREG_RW_FUNCS(mpam3_el3, MPAM3_EL3)
567*91f16700Schasinglulu DEFINE_RENAME_SYSREG_RW_FUNCS(mpam2_el2, MPAM2_EL2)
568*91f16700Schasinglulu DEFINE_RENAME_SYSREG_RW_FUNCS(mpamhcr_el2, MPAMHCR_EL2)
569*91f16700Schasinglulu DEFINE_RENAME_SYSREG_RW_FUNCS(mpamvpm0_el2, MPAMVPM0_EL2)
570*91f16700Schasinglulu DEFINE_RENAME_SYSREG_RW_FUNCS(mpamvpm1_el2, MPAMVPM1_EL2)
571*91f16700Schasinglulu DEFINE_RENAME_SYSREG_RW_FUNCS(mpamvpm2_el2, MPAMVPM2_EL2)
572*91f16700Schasinglulu DEFINE_RENAME_SYSREG_RW_FUNCS(mpamvpm3_el2, MPAMVPM3_EL2)
573*91f16700Schasinglulu DEFINE_RENAME_SYSREG_RW_FUNCS(mpamvpm4_el2, MPAMVPM4_EL2)
574*91f16700Schasinglulu DEFINE_RENAME_SYSREG_RW_FUNCS(mpamvpm5_el2, MPAMVPM5_EL2)
575*91f16700Schasinglulu DEFINE_RENAME_SYSREG_RW_FUNCS(mpamvpm6_el2, MPAMVPM6_EL2)
576*91f16700Schasinglulu DEFINE_RENAME_SYSREG_RW_FUNCS(mpamvpm7_el2, MPAMVPM7_EL2)
577*91f16700Schasinglulu DEFINE_RENAME_SYSREG_RW_FUNCS(mpamvpmv_el2, MPAMVPMV_EL2)
578*91f16700Schasinglulu 
579*91f16700Schasinglulu /* Armv8.3 Pointer Authentication Registers */
580*91f16700Schasinglulu DEFINE_RENAME_SYSREG_RW_FUNCS(apiakeyhi_el1, APIAKeyHi_EL1)
581*91f16700Schasinglulu DEFINE_RENAME_SYSREG_RW_FUNCS(apiakeylo_el1, APIAKeyLo_EL1)
582*91f16700Schasinglulu 
583*91f16700Schasinglulu /* Armv8.4 Data Independent Timing Register */
584*91f16700Schasinglulu DEFINE_RENAME_SYSREG_RW_FUNCS(dit, DIT)
585*91f16700Schasinglulu 
586*91f16700Schasinglulu /* Armv8.4 FEAT_TRF Register */
587*91f16700Schasinglulu DEFINE_RENAME_SYSREG_RW_FUNCS(trfcr_el2, TRFCR_EL2)
588*91f16700Schasinglulu DEFINE_RENAME_SYSREG_RW_FUNCS(vncr_el2, VNCR_EL2)
589*91f16700Schasinglulu 
590*91f16700Schasinglulu /* Armv8.5 MTE Registers */
591*91f16700Schasinglulu DEFINE_RENAME_SYSREG_RW_FUNCS(tfsre0_el1, TFSRE0_EL1)
592*91f16700Schasinglulu DEFINE_RENAME_SYSREG_RW_FUNCS(tfsr_el1, TFSR_EL1)
593*91f16700Schasinglulu DEFINE_RENAME_SYSREG_RW_FUNCS(rgsr_el1, RGSR_EL1)
594*91f16700Schasinglulu DEFINE_RENAME_SYSREG_RW_FUNCS(gcr_el1, GCR_EL1)
595*91f16700Schasinglulu DEFINE_RENAME_SYSREG_RW_FUNCS(tfsr_el2, TFSR_EL2)
596*91f16700Schasinglulu 
597*91f16700Schasinglulu /* Armv8.5 FEAT_RNG Registers */
598*91f16700Schasinglulu DEFINE_RENAME_SYSREG_READ_FUNC(rndr, RNDR)
599*91f16700Schasinglulu DEFINE_RENAME_SYSREG_READ_FUNC(rndrrs, RNDRRS)
600*91f16700Schasinglulu 
601*91f16700Schasinglulu /* Armv8.6 FEAT_FGT Registers */
602*91f16700Schasinglulu DEFINE_RENAME_SYSREG_RW_FUNCS(hdfgrtr_el2, HDFGRTR_EL2)
603*91f16700Schasinglulu DEFINE_RENAME_SYSREG_RW_FUNCS(hafgrtr_el2, HAFGRTR_EL2)
604*91f16700Schasinglulu DEFINE_RENAME_SYSREG_RW_FUNCS(hdfgwtr_el2, HDFGWTR_EL2)
605*91f16700Schasinglulu DEFINE_RENAME_SYSREG_RW_FUNCS(hfgitr_el2, HFGITR_EL2)
606*91f16700Schasinglulu DEFINE_RENAME_SYSREG_RW_FUNCS(hfgrtr_el2, HFGRTR_EL2)
607*91f16700Schasinglulu DEFINE_RENAME_SYSREG_RW_FUNCS(hfgwtr_el2, HFGWTR_EL2)
608*91f16700Schasinglulu 
609*91f16700Schasinglulu /* ARMv8.6 FEAT_ECV Register */
610*91f16700Schasinglulu DEFINE_RENAME_SYSREG_RW_FUNCS(cntpoff_el2, CNTPOFF_EL2)
611*91f16700Schasinglulu 
612*91f16700Schasinglulu /* FEAT_HCX Register */
613*91f16700Schasinglulu DEFINE_RENAME_SYSREG_RW_FUNCS(hcrx_el2, HCRX_EL2)
614*91f16700Schasinglulu 
615*91f16700Schasinglulu /* Armv8.9 system registers */
616*91f16700Schasinglulu DEFINE_RENAME_IDREG_READ_FUNC(id_aa64mmfr3_el1, ID_AA64MMFR3_EL1)
617*91f16700Schasinglulu 
618*91f16700Schasinglulu /* FEAT_TCR2 Register */
619*91f16700Schasinglulu DEFINE_RENAME_SYSREG_RW_FUNCS(tcr2_el2, TCR2_EL2)
620*91f16700Schasinglulu 
621*91f16700Schasinglulu /* FEAT_SxPIE Registers */
622*91f16700Schasinglulu DEFINE_RENAME_SYSREG_RW_FUNCS(pire0_el2, PIRE0_EL2)
623*91f16700Schasinglulu DEFINE_RENAME_SYSREG_RW_FUNCS(pir_el2, PIR_EL2)
624*91f16700Schasinglulu DEFINE_RENAME_SYSREG_RW_FUNCS(s2pir_el2, S2PIR_EL2)
625*91f16700Schasinglulu 
626*91f16700Schasinglulu /* FEAT_SxPOE Registers */
627*91f16700Schasinglulu DEFINE_RENAME_SYSREG_RW_FUNCS(por_el2, POR_EL2)
628*91f16700Schasinglulu 
629*91f16700Schasinglulu /* FEAT_GCS Registers */
630*91f16700Schasinglulu DEFINE_RENAME_SYSREG_RW_FUNCS(gcscr_el2, GCSCR_EL2)
631*91f16700Schasinglulu DEFINE_RENAME_SYSREG_RW_FUNCS(gcspr_el2, GCSPR_EL2)
632*91f16700Schasinglulu 
633*91f16700Schasinglulu /* DynamIQ Shared Unit power management */
634*91f16700Schasinglulu DEFINE_RENAME_SYSREG_RW_FUNCS(clusterpwrdn_el1, CLUSTERPWRDN_EL1)
635*91f16700Schasinglulu 
636*91f16700Schasinglulu /* CPU Power/Performance Management registers */
637*91f16700Schasinglulu DEFINE_RENAME_SYSREG_RW_FUNCS(cpuppmcr_el3, CPUPPMCR_EL3)
638*91f16700Schasinglulu DEFINE_RENAME_SYSREG_RW_FUNCS(cpumpmmcr_el3, CPUMPMMCR_EL3)
639*91f16700Schasinglulu 
640*91f16700Schasinglulu /* Armv9.2 RME Registers */
641*91f16700Schasinglulu DEFINE_RENAME_SYSREG_RW_FUNCS(gptbr_el3, GPTBR_EL3)
642*91f16700Schasinglulu DEFINE_RENAME_SYSREG_RW_FUNCS(gpccr_el3, GPCCR_EL3)
643*91f16700Schasinglulu 
644*91f16700Schasinglulu #define IS_IN_EL(x) \
645*91f16700Schasinglulu 	(GET_EL(read_CurrentEl()) == MODE_EL##x)
646*91f16700Schasinglulu 
647*91f16700Schasinglulu #define IS_IN_EL1() IS_IN_EL(1)
648*91f16700Schasinglulu #define IS_IN_EL2() IS_IN_EL(2)
649*91f16700Schasinglulu #define IS_IN_EL3() IS_IN_EL(3)
650*91f16700Schasinglulu 
651*91f16700Schasinglulu static inline unsigned int get_current_el(void)
652*91f16700Schasinglulu {
653*91f16700Schasinglulu 	return GET_EL(read_CurrentEl());
654*91f16700Schasinglulu }
655*91f16700Schasinglulu 
656*91f16700Schasinglulu static inline unsigned int get_current_el_maybe_constant(void)
657*91f16700Schasinglulu {
658*91f16700Schasinglulu #if defined(IMAGE_AT_EL1)
659*91f16700Schasinglulu 	return 1;
660*91f16700Schasinglulu #elif defined(IMAGE_AT_EL2)
661*91f16700Schasinglulu 	return 2;	/* no use-case in TF-A */
662*91f16700Schasinglulu #elif defined(IMAGE_AT_EL3)
663*91f16700Schasinglulu 	return 3;
664*91f16700Schasinglulu #else
665*91f16700Schasinglulu 	/*
666*91f16700Schasinglulu 	 * If we do not know which exception level this is being built for
667*91f16700Schasinglulu 	 * (e.g. built for library), fall back to run-time detection.
668*91f16700Schasinglulu 	 */
669*91f16700Schasinglulu 	return get_current_el();
670*91f16700Schasinglulu #endif
671*91f16700Schasinglulu }
672*91f16700Schasinglulu 
673*91f16700Schasinglulu /*
674*91f16700Schasinglulu  * Check if an EL is implemented from AA64PFR0 register fields.
675*91f16700Schasinglulu  */
676*91f16700Schasinglulu static inline uint64_t el_implemented(unsigned int el)
677*91f16700Schasinglulu {
678*91f16700Schasinglulu 	if (el > 3U) {
679*91f16700Schasinglulu 		return EL_IMPL_NONE;
680*91f16700Schasinglulu 	} else {
681*91f16700Schasinglulu 		unsigned int shift = ID_AA64PFR0_EL1_SHIFT * el;
682*91f16700Schasinglulu 
683*91f16700Schasinglulu 		return (read_id_aa64pfr0_el1() >> shift) & ID_AA64PFR0_ELX_MASK;
684*91f16700Schasinglulu 	}
685*91f16700Schasinglulu }
686*91f16700Schasinglulu 
687*91f16700Schasinglulu /*
688*91f16700Schasinglulu  * TLBIPAALLOS instruction
689*91f16700Schasinglulu  * (TLB Inivalidate GPT Information by PA,
690*91f16700Schasinglulu  * All Entries, Outer Shareable)
691*91f16700Schasinglulu  */
692*91f16700Schasinglulu static inline void tlbipaallos(void)
693*91f16700Schasinglulu {
694*91f16700Schasinglulu 	__asm__("SYS #6,c8,c1,#4");
695*91f16700Schasinglulu }
696*91f16700Schasinglulu 
697*91f16700Schasinglulu /*
698*91f16700Schasinglulu  * Invalidate TLBs of GPT entries by Physical address, last level.
699*91f16700Schasinglulu  *
700*91f16700Schasinglulu  * @pa: the starting address for the range
701*91f16700Schasinglulu  *      of invalidation
702*91f16700Schasinglulu  * @size: size of the range of invalidation
703*91f16700Schasinglulu  */
704*91f16700Schasinglulu void gpt_tlbi_by_pa_ll(uint64_t pa, size_t size);
705*91f16700Schasinglulu 
706*91f16700Schasinglulu 
707*91f16700Schasinglulu /* Previously defined accessor functions with incomplete register names  */
708*91f16700Schasinglulu 
709*91f16700Schasinglulu #define read_current_el()	read_CurrentEl()
710*91f16700Schasinglulu 
711*91f16700Schasinglulu #define dsb()			dsbsy()
712*91f16700Schasinglulu 
713*91f16700Schasinglulu #define read_midr()		read_midr_el1()
714*91f16700Schasinglulu 
715*91f16700Schasinglulu #define read_mpidr()		read_mpidr_el1()
716*91f16700Schasinglulu 
717*91f16700Schasinglulu #define read_scr()		read_scr_el3()
718*91f16700Schasinglulu #define write_scr(_v)		write_scr_el3(_v)
719*91f16700Schasinglulu 
720*91f16700Schasinglulu #define read_hcr()		read_hcr_el2()
721*91f16700Schasinglulu #define write_hcr(_v)		write_hcr_el2(_v)
722*91f16700Schasinglulu 
723*91f16700Schasinglulu #define read_cpacr()		read_cpacr_el1()
724*91f16700Schasinglulu #define write_cpacr(_v)		write_cpacr_el1(_v)
725*91f16700Schasinglulu 
726*91f16700Schasinglulu #define read_clusterpwrdn()	read_clusterpwrdn_el1()
727*91f16700Schasinglulu #define write_clusterpwrdn(_v)	write_clusterpwrdn_el1(_v)
728*91f16700Schasinglulu 
729*91f16700Schasinglulu #if ERRATA_SPECULATIVE_AT
730*91f16700Schasinglulu /*
731*91f16700Schasinglulu  * Assuming SCTLR.M bit is already enabled
732*91f16700Schasinglulu  * 1. Enable page table walk by clearing TCR_EL1.EPDx bits
733*91f16700Schasinglulu  * 2. Execute AT instruction for lower EL1/0
734*91f16700Schasinglulu  * 3. Disable page table walk by setting TCR_EL1.EPDx bits
735*91f16700Schasinglulu  */
736*91f16700Schasinglulu #define AT(_at_inst, _va)	\
737*91f16700Schasinglulu {	\
738*91f16700Schasinglulu 	assert((read_sctlr_el1() & SCTLR_M_BIT) != 0ULL);	\
739*91f16700Schasinglulu 	write_tcr_el1(read_tcr_el1() & ~(TCR_EPD0_BIT | TCR_EPD1_BIT));	\
740*91f16700Schasinglulu 	isb();	\
741*91f16700Schasinglulu 	_at_inst(_va);	\
742*91f16700Schasinglulu 	write_tcr_el1(read_tcr_el1() | (TCR_EPD0_BIT | TCR_EPD1_BIT));	\
743*91f16700Schasinglulu 	isb();	\
744*91f16700Schasinglulu }
745*91f16700Schasinglulu #else
746*91f16700Schasinglulu #define AT(_at_inst, _va)	_at_inst(_va)
747*91f16700Schasinglulu #endif
748*91f16700Schasinglulu 
749*91f16700Schasinglulu #endif /* ARCH_HELPERS_H */
750