xref: /rk3399_ARM-atf/include/arch/aarch64/arch_helpers.h (revision f5478dedf9e096d9539362b38ceb096b940ba3e2)
1*f5478dedSAntonio Nino Diaz /*
2*f5478dedSAntonio Nino Diaz  * Copyright (c) 2013-2018, ARM Limited and Contributors. All rights reserved.
3*f5478dedSAntonio Nino Diaz  *
4*f5478dedSAntonio Nino Diaz  * SPDX-License-Identifier: BSD-3-Clause
5*f5478dedSAntonio Nino Diaz  */
6*f5478dedSAntonio Nino Diaz 
7*f5478dedSAntonio Nino Diaz #ifndef ARCH_HELPERS_H
8*f5478dedSAntonio Nino Diaz #define ARCH_HELPERS_H
9*f5478dedSAntonio Nino Diaz 
10*f5478dedSAntonio Nino Diaz #include <arch.h>
11*f5478dedSAntonio Nino Diaz #include <cdefs.h>
12*f5478dedSAntonio Nino Diaz #include <stdbool.h>
13*f5478dedSAntonio Nino Diaz #include <stdint.h>
14*f5478dedSAntonio Nino Diaz #include <string.h>
15*f5478dedSAntonio Nino Diaz 
16*f5478dedSAntonio Nino Diaz /**********************************************************************
17*f5478dedSAntonio Nino Diaz  * Macros which create inline functions to read or write CPU system
18*f5478dedSAntonio Nino Diaz  * registers
19*f5478dedSAntonio Nino Diaz  *********************************************************************/
20*f5478dedSAntonio Nino Diaz 
21*f5478dedSAntonio Nino Diaz #define _DEFINE_SYSREG_READ_FUNC(_name, _reg_name)		\
22*f5478dedSAntonio Nino Diaz static inline u_register_t read_ ## _name(void)			\
23*f5478dedSAntonio Nino Diaz {								\
24*f5478dedSAntonio Nino Diaz 	u_register_t v;						\
25*f5478dedSAntonio Nino Diaz 	__asm__ volatile ("mrs %0, " #_reg_name : "=r" (v));	\
26*f5478dedSAntonio Nino Diaz 	return v;						\
27*f5478dedSAntonio Nino Diaz }
28*f5478dedSAntonio Nino Diaz 
29*f5478dedSAntonio Nino Diaz #define _DEFINE_SYSREG_WRITE_FUNC(_name, _reg_name)			\
30*f5478dedSAntonio Nino Diaz static inline void write_ ## _name(u_register_t v)			\
31*f5478dedSAntonio Nino Diaz {									\
32*f5478dedSAntonio Nino Diaz 	__asm__ volatile ("msr " #_reg_name ", %0" : : "r" (v));	\
33*f5478dedSAntonio Nino Diaz }
34*f5478dedSAntonio Nino Diaz 
35*f5478dedSAntonio Nino Diaz #define SYSREG_WRITE_CONST(reg_name, v)				\
36*f5478dedSAntonio Nino Diaz 	__asm__ volatile ("msr " #reg_name ", %0" : : "i" (v))
37*f5478dedSAntonio Nino Diaz 
38*f5478dedSAntonio Nino Diaz /* Define read function for system register */
39*f5478dedSAntonio Nino Diaz #define DEFINE_SYSREG_READ_FUNC(_name) 			\
40*f5478dedSAntonio Nino Diaz 	_DEFINE_SYSREG_READ_FUNC(_name, _name)
41*f5478dedSAntonio Nino Diaz 
42*f5478dedSAntonio Nino Diaz /* Define read & write function for system register */
43*f5478dedSAntonio Nino Diaz #define DEFINE_SYSREG_RW_FUNCS(_name)			\
44*f5478dedSAntonio Nino Diaz 	_DEFINE_SYSREG_READ_FUNC(_name, _name)		\
45*f5478dedSAntonio Nino Diaz 	_DEFINE_SYSREG_WRITE_FUNC(_name, _name)
46*f5478dedSAntonio Nino Diaz 
47*f5478dedSAntonio Nino Diaz /* Define read & write function for renamed system register */
48*f5478dedSAntonio Nino Diaz #define DEFINE_RENAME_SYSREG_RW_FUNCS(_name, _reg_name)	\
49*f5478dedSAntonio Nino Diaz 	_DEFINE_SYSREG_READ_FUNC(_name, _reg_name)	\
50*f5478dedSAntonio Nino Diaz 	_DEFINE_SYSREG_WRITE_FUNC(_name, _reg_name)
51*f5478dedSAntonio Nino Diaz 
52*f5478dedSAntonio Nino Diaz /* Define read function for renamed system register */
53*f5478dedSAntonio Nino Diaz #define DEFINE_RENAME_SYSREG_READ_FUNC(_name, _reg_name)	\
54*f5478dedSAntonio Nino Diaz 	_DEFINE_SYSREG_READ_FUNC(_name, _reg_name)
55*f5478dedSAntonio Nino Diaz 
56*f5478dedSAntonio Nino Diaz /* Define write function for renamed system register */
57*f5478dedSAntonio Nino Diaz #define DEFINE_RENAME_SYSREG_WRITE_FUNC(_name, _reg_name)	\
58*f5478dedSAntonio Nino Diaz 	_DEFINE_SYSREG_WRITE_FUNC(_name, _reg_name)
59*f5478dedSAntonio Nino Diaz 
60*f5478dedSAntonio Nino Diaz /**********************************************************************
61*f5478dedSAntonio Nino Diaz  * Macros to create inline functions for system instructions
62*f5478dedSAntonio Nino Diaz  *********************************************************************/
63*f5478dedSAntonio Nino Diaz 
64*f5478dedSAntonio Nino Diaz /* Define function for simple system instruction */
65*f5478dedSAntonio Nino Diaz #define DEFINE_SYSOP_FUNC(_op)				\
66*f5478dedSAntonio Nino Diaz static inline void _op(void)				\
67*f5478dedSAntonio Nino Diaz {							\
68*f5478dedSAntonio Nino Diaz 	__asm__ (#_op);					\
69*f5478dedSAntonio Nino Diaz }
70*f5478dedSAntonio Nino Diaz 
71*f5478dedSAntonio Nino Diaz /* Define function for system instruction with type specifier */
72*f5478dedSAntonio Nino Diaz #define DEFINE_SYSOP_TYPE_FUNC(_op, _type)		\
73*f5478dedSAntonio Nino Diaz static inline void _op ## _type(void)			\
74*f5478dedSAntonio Nino Diaz {							\
75*f5478dedSAntonio Nino Diaz 	__asm__ (#_op " " #_type);			\
76*f5478dedSAntonio Nino Diaz }
77*f5478dedSAntonio Nino Diaz 
78*f5478dedSAntonio Nino Diaz /* Define function for system instruction with register parameter */
79*f5478dedSAntonio Nino Diaz #define DEFINE_SYSOP_TYPE_PARAM_FUNC(_op, _type)	\
80*f5478dedSAntonio Nino Diaz static inline void _op ## _type(uint64_t v)		\
81*f5478dedSAntonio Nino Diaz {							\
82*f5478dedSAntonio Nino Diaz 	 __asm__ (#_op " " #_type ", %0" : : "r" (v));	\
83*f5478dedSAntonio Nino Diaz }
84*f5478dedSAntonio Nino Diaz 
85*f5478dedSAntonio Nino Diaz /*******************************************************************************
86*f5478dedSAntonio Nino Diaz  * TLB maintenance accessor prototypes
87*f5478dedSAntonio Nino Diaz  ******************************************************************************/
88*f5478dedSAntonio Nino Diaz 
89*f5478dedSAntonio Nino Diaz #if ERRATA_A57_813419
90*f5478dedSAntonio Nino Diaz /*
91*f5478dedSAntonio Nino Diaz  * Define function for TLBI instruction with type specifier that implements
92*f5478dedSAntonio Nino Diaz  * the workaround for errata 813419 of Cortex-A57.
93*f5478dedSAntonio Nino Diaz  */
94*f5478dedSAntonio Nino Diaz #define DEFINE_TLBIOP_ERRATA_A57_813419_TYPE_FUNC(_type)\
95*f5478dedSAntonio Nino Diaz static inline void tlbi ## _type(void)			\
96*f5478dedSAntonio Nino Diaz {							\
97*f5478dedSAntonio Nino Diaz 	__asm__("tlbi " #_type "\n"			\
98*f5478dedSAntonio Nino Diaz 		"dsb ish\n"				\
99*f5478dedSAntonio Nino Diaz 		"tlbi " #_type);			\
100*f5478dedSAntonio Nino Diaz }
101*f5478dedSAntonio Nino Diaz 
102*f5478dedSAntonio Nino Diaz /*
103*f5478dedSAntonio Nino Diaz  * Define function for TLBI instruction with register parameter that implements
104*f5478dedSAntonio Nino Diaz  * the workaround for errata 813419 of Cortex-A57.
105*f5478dedSAntonio Nino Diaz  */
106*f5478dedSAntonio Nino Diaz #define DEFINE_TLBIOP_ERRATA_A57_813419_TYPE_PARAM_FUNC(_type)	\
107*f5478dedSAntonio Nino Diaz static inline void tlbi ## _type(uint64_t v)			\
108*f5478dedSAntonio Nino Diaz {								\
109*f5478dedSAntonio Nino Diaz 	__asm__("tlbi " #_type ", %0\n"				\
110*f5478dedSAntonio Nino Diaz 		"dsb ish\n"					\
111*f5478dedSAntonio Nino Diaz 		"tlbi " #_type ", %0" : : "r" (v));		\
112*f5478dedSAntonio Nino Diaz }
113*f5478dedSAntonio Nino Diaz #endif /* ERRATA_A57_813419 */
114*f5478dedSAntonio Nino Diaz 
115*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_FUNC(tlbi, alle1)
116*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_FUNC(tlbi, alle1is)
117*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_FUNC(tlbi, alle2)
118*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_FUNC(tlbi, alle2is)
119*f5478dedSAntonio Nino Diaz #if ERRATA_A57_813419
120*f5478dedSAntonio Nino Diaz DEFINE_TLBIOP_ERRATA_A57_813419_TYPE_FUNC(alle3)
121*f5478dedSAntonio Nino Diaz DEFINE_TLBIOP_ERRATA_A57_813419_TYPE_FUNC(alle3is)
122*f5478dedSAntonio Nino Diaz #else
123*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_FUNC(tlbi, alle3)
124*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_FUNC(tlbi, alle3is)
125*f5478dedSAntonio Nino Diaz #endif
126*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_FUNC(tlbi, vmalle1)
127*f5478dedSAntonio Nino Diaz 
128*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_PARAM_FUNC(tlbi, vaae1is)
129*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_PARAM_FUNC(tlbi, vaale1is)
130*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_PARAM_FUNC(tlbi, vae2is)
131*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_PARAM_FUNC(tlbi, vale2is)
132*f5478dedSAntonio Nino Diaz #if ERRATA_A57_813419
133*f5478dedSAntonio Nino Diaz DEFINE_TLBIOP_ERRATA_A57_813419_TYPE_PARAM_FUNC(vae3is)
134*f5478dedSAntonio Nino Diaz DEFINE_TLBIOP_ERRATA_A57_813419_TYPE_PARAM_FUNC(vale3is)
135*f5478dedSAntonio Nino Diaz #else
136*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_PARAM_FUNC(tlbi, vae3is)
137*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_PARAM_FUNC(tlbi, vale3is)
138*f5478dedSAntonio Nino Diaz #endif
139*f5478dedSAntonio Nino Diaz 
140*f5478dedSAntonio Nino Diaz /*******************************************************************************
141*f5478dedSAntonio Nino Diaz  * Cache maintenance accessor prototypes
142*f5478dedSAntonio Nino Diaz  ******************************************************************************/
143*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_PARAM_FUNC(dc, isw)
144*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_PARAM_FUNC(dc, cisw)
145*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_PARAM_FUNC(dc, csw)
146*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_PARAM_FUNC(dc, cvac)
147*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_PARAM_FUNC(dc, ivac)
148*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_PARAM_FUNC(dc, civac)
149*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_PARAM_FUNC(dc, cvau)
150*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_PARAM_FUNC(dc, zva)
151*f5478dedSAntonio Nino Diaz 
152*f5478dedSAntonio Nino Diaz /*******************************************************************************
153*f5478dedSAntonio Nino Diaz  * Address translation accessor prototypes
154*f5478dedSAntonio Nino Diaz  ******************************************************************************/
155*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_PARAM_FUNC(at, s12e1r)
156*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_PARAM_FUNC(at, s12e1w)
157*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_PARAM_FUNC(at, s12e0r)
158*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_PARAM_FUNC(at, s12e0w)
159*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_PARAM_FUNC(at, s1e1r)
160*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_PARAM_FUNC(at, s1e2r)
161*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_PARAM_FUNC(at, s1e3r)
162*f5478dedSAntonio Nino Diaz 
163*f5478dedSAntonio Nino Diaz void flush_dcache_range(uintptr_t addr, size_t size);
164*f5478dedSAntonio Nino Diaz void clean_dcache_range(uintptr_t addr, size_t size);
165*f5478dedSAntonio Nino Diaz void inv_dcache_range(uintptr_t addr, size_t size);
166*f5478dedSAntonio Nino Diaz 
167*f5478dedSAntonio Nino Diaz void dcsw_op_louis(u_register_t op_type);
168*f5478dedSAntonio Nino Diaz void dcsw_op_all(u_register_t op_type);
169*f5478dedSAntonio Nino Diaz 
170*f5478dedSAntonio Nino Diaz void disable_mmu_el1(void);
171*f5478dedSAntonio Nino Diaz void disable_mmu_el3(void);
172*f5478dedSAntonio Nino Diaz void disable_mmu_icache_el1(void);
173*f5478dedSAntonio Nino Diaz void disable_mmu_icache_el3(void);
174*f5478dedSAntonio Nino Diaz 
175*f5478dedSAntonio Nino Diaz /*******************************************************************************
176*f5478dedSAntonio Nino Diaz  * Misc. accessor prototypes
177*f5478dedSAntonio Nino Diaz  ******************************************************************************/
178*f5478dedSAntonio Nino Diaz 
179*f5478dedSAntonio Nino Diaz #define write_daifclr(val) SYSREG_WRITE_CONST(daifclr, val)
180*f5478dedSAntonio Nino Diaz #define write_daifset(val) SYSREG_WRITE_CONST(daifset, val)
181*f5478dedSAntonio Nino Diaz 
182*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(par_el1)
183*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_READ_FUNC(id_pfr1_el1)
184*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_READ_FUNC(id_aa64isar1_el1)
185*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_READ_FUNC(id_aa64pfr0_el1)
186*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_READ_FUNC(id_aa64dfr0_el1)
187*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_READ_FUNC(CurrentEl)
188*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_READ_FUNC(ctr_el0)
189*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(daif)
190*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(spsr_el1)
191*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(spsr_el2)
192*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(spsr_el3)
193*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(elr_el1)
194*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(elr_el2)
195*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(elr_el3)
196*f5478dedSAntonio Nino Diaz 
197*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_FUNC(wfi)
198*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_FUNC(wfe)
199*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_FUNC(sev)
200*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_FUNC(dsb, sy)
201*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_FUNC(dmb, sy)
202*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_FUNC(dmb, st)
203*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_FUNC(dmb, ld)
204*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_FUNC(dsb, ish)
205*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_FUNC(dsb, nsh)
206*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_FUNC(dsb, ishst)
207*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_FUNC(dmb, oshld)
208*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_FUNC(dmb, oshst)
209*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_FUNC(dmb, osh)
210*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_FUNC(dmb, nshld)
211*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_FUNC(dmb, nshst)
212*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_FUNC(dmb, nsh)
213*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_FUNC(dmb, ishld)
214*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_FUNC(dmb, ishst)
215*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_TYPE_FUNC(dmb, ish)
216*f5478dedSAntonio Nino Diaz DEFINE_SYSOP_FUNC(isb)
217*f5478dedSAntonio Nino Diaz 
218*f5478dedSAntonio Nino Diaz static inline void enable_irq(void)
219*f5478dedSAntonio Nino Diaz {
220*f5478dedSAntonio Nino Diaz 	/*
221*f5478dedSAntonio Nino Diaz 	 * The compiler memory barrier will prevent the compiler from
222*f5478dedSAntonio Nino Diaz 	 * scheduling non-volatile memory access after the write to the
223*f5478dedSAntonio Nino Diaz 	 * register.
224*f5478dedSAntonio Nino Diaz 	 *
225*f5478dedSAntonio Nino Diaz 	 * This could happen if some initialization code issues non-volatile
226*f5478dedSAntonio Nino Diaz 	 * accesses to an area used by an interrupt handler, in the assumption
227*f5478dedSAntonio Nino Diaz 	 * that it is safe as the interrupts are disabled at the time it does
228*f5478dedSAntonio Nino Diaz 	 * that (according to program order). However, non-volatile accesses
229*f5478dedSAntonio Nino Diaz 	 * are not necessarily in program order relatively with volatile inline
230*f5478dedSAntonio Nino Diaz 	 * assembly statements (and volatile accesses).
231*f5478dedSAntonio Nino Diaz 	 */
232*f5478dedSAntonio Nino Diaz 	COMPILER_BARRIER();
233*f5478dedSAntonio Nino Diaz 	write_daifclr(DAIF_IRQ_BIT);
234*f5478dedSAntonio Nino Diaz 	isb();
235*f5478dedSAntonio Nino Diaz }
236*f5478dedSAntonio Nino Diaz 
237*f5478dedSAntonio Nino Diaz static inline void enable_fiq(void)
238*f5478dedSAntonio Nino Diaz {
239*f5478dedSAntonio Nino Diaz 	COMPILER_BARRIER();
240*f5478dedSAntonio Nino Diaz 	write_daifclr(DAIF_FIQ_BIT);
241*f5478dedSAntonio Nino Diaz 	isb();
242*f5478dedSAntonio Nino Diaz }
243*f5478dedSAntonio Nino Diaz 
244*f5478dedSAntonio Nino Diaz static inline void enable_serror(void)
245*f5478dedSAntonio Nino Diaz {
246*f5478dedSAntonio Nino Diaz 	COMPILER_BARRIER();
247*f5478dedSAntonio Nino Diaz 	write_daifclr(DAIF_ABT_BIT);
248*f5478dedSAntonio Nino Diaz 	isb();
249*f5478dedSAntonio Nino Diaz }
250*f5478dedSAntonio Nino Diaz 
251*f5478dedSAntonio Nino Diaz static inline void enable_debug_exceptions(void)
252*f5478dedSAntonio Nino Diaz {
253*f5478dedSAntonio Nino Diaz 	COMPILER_BARRIER();
254*f5478dedSAntonio Nino Diaz 	write_daifclr(DAIF_DBG_BIT);
255*f5478dedSAntonio Nino Diaz 	isb();
256*f5478dedSAntonio Nino Diaz }
257*f5478dedSAntonio Nino Diaz 
258*f5478dedSAntonio Nino Diaz static inline void disable_irq(void)
259*f5478dedSAntonio Nino Diaz {
260*f5478dedSAntonio Nino Diaz 	COMPILER_BARRIER();
261*f5478dedSAntonio Nino Diaz 	write_daifset(DAIF_IRQ_BIT);
262*f5478dedSAntonio Nino Diaz 	isb();
263*f5478dedSAntonio Nino Diaz }
264*f5478dedSAntonio Nino Diaz 
265*f5478dedSAntonio Nino Diaz static inline void disable_fiq(void)
266*f5478dedSAntonio Nino Diaz {
267*f5478dedSAntonio Nino Diaz 	COMPILER_BARRIER();
268*f5478dedSAntonio Nino Diaz 	write_daifset(DAIF_FIQ_BIT);
269*f5478dedSAntonio Nino Diaz 	isb();
270*f5478dedSAntonio Nino Diaz }
271*f5478dedSAntonio Nino Diaz 
272*f5478dedSAntonio Nino Diaz static inline void disable_serror(void)
273*f5478dedSAntonio Nino Diaz {
274*f5478dedSAntonio Nino Diaz 	COMPILER_BARRIER();
275*f5478dedSAntonio Nino Diaz 	write_daifset(DAIF_ABT_BIT);
276*f5478dedSAntonio Nino Diaz 	isb();
277*f5478dedSAntonio Nino Diaz }
278*f5478dedSAntonio Nino Diaz 
279*f5478dedSAntonio Nino Diaz static inline void disable_debug_exceptions(void)
280*f5478dedSAntonio Nino Diaz {
281*f5478dedSAntonio Nino Diaz 	COMPILER_BARRIER();
282*f5478dedSAntonio Nino Diaz 	write_daifset(DAIF_DBG_BIT);
283*f5478dedSAntonio Nino Diaz 	isb();
284*f5478dedSAntonio Nino Diaz }
285*f5478dedSAntonio Nino Diaz 
286*f5478dedSAntonio Nino Diaz #if !ERROR_DEPRECATED
287*f5478dedSAntonio Nino Diaz uint32_t get_afflvl_shift(uint32_t);
288*f5478dedSAntonio Nino Diaz uint32_t mpidr_mask_lower_afflvls(uint64_t, uint32_t);
289*f5478dedSAntonio Nino Diaz 
290*f5478dedSAntonio Nino Diaz void __dead2 eret(uint64_t x0, uint64_t x1, uint64_t x2, uint64_t x3,
291*f5478dedSAntonio Nino Diaz 		  uint64_t x4, uint64_t x5, uint64_t x6, uint64_t x7);
292*f5478dedSAntonio Nino Diaz #endif
293*f5478dedSAntonio Nino Diaz void __dead2 smc(uint64_t x0, uint64_t x1, uint64_t x2, uint64_t x3,
294*f5478dedSAntonio Nino Diaz 		 uint64_t x4, uint64_t x5, uint64_t x6, uint64_t x7);
295*f5478dedSAntonio Nino Diaz 
296*f5478dedSAntonio Nino Diaz /*******************************************************************************
297*f5478dedSAntonio Nino Diaz  * System register accessor prototypes
298*f5478dedSAntonio Nino Diaz  ******************************************************************************/
299*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_READ_FUNC(midr_el1)
300*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_READ_FUNC(mpidr_el1)
301*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_READ_FUNC(id_aa64mmfr0_el1)
302*f5478dedSAntonio Nino Diaz 
303*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(scr_el3)
304*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(hcr_el2)
305*f5478dedSAntonio Nino Diaz 
306*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(vbar_el1)
307*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(vbar_el2)
308*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(vbar_el3)
309*f5478dedSAntonio Nino Diaz 
310*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(sctlr_el1)
311*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(sctlr_el2)
312*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(sctlr_el3)
313*f5478dedSAntonio Nino Diaz 
314*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(actlr_el1)
315*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(actlr_el2)
316*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(actlr_el3)
317*f5478dedSAntonio Nino Diaz 
318*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(esr_el1)
319*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(esr_el2)
320*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(esr_el3)
321*f5478dedSAntonio Nino Diaz 
322*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(afsr0_el1)
323*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(afsr0_el2)
324*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(afsr0_el3)
325*f5478dedSAntonio Nino Diaz 
326*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(afsr1_el1)
327*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(afsr1_el2)
328*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(afsr1_el3)
329*f5478dedSAntonio Nino Diaz 
330*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(far_el1)
331*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(far_el2)
332*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(far_el3)
333*f5478dedSAntonio Nino Diaz 
334*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(mair_el1)
335*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(mair_el2)
336*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(mair_el3)
337*f5478dedSAntonio Nino Diaz 
338*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(amair_el1)
339*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(amair_el2)
340*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(amair_el3)
341*f5478dedSAntonio Nino Diaz 
342*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_READ_FUNC(rvbar_el1)
343*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_READ_FUNC(rvbar_el2)
344*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_READ_FUNC(rvbar_el3)
345*f5478dedSAntonio Nino Diaz 
346*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(rmr_el1)
347*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(rmr_el2)
348*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(rmr_el3)
349*f5478dedSAntonio Nino Diaz 
350*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(tcr_el1)
351*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(tcr_el2)
352*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(tcr_el3)
353*f5478dedSAntonio Nino Diaz 
354*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(ttbr0_el1)
355*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(ttbr0_el2)
356*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(ttbr0_el3)
357*f5478dedSAntonio Nino Diaz 
358*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(ttbr1_el1)
359*f5478dedSAntonio Nino Diaz 
360*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(vttbr_el2)
361*f5478dedSAntonio Nino Diaz 
362*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(cptr_el2)
363*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(cptr_el3)
364*f5478dedSAntonio Nino Diaz 
365*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(cpacr_el1)
366*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(cntfrq_el0)
367*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(cnthp_ctl_el2)
368*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(cnthp_tval_el2)
369*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(cnthp_cval_el2)
370*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(cntps_ctl_el1)
371*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(cntps_tval_el1)
372*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(cntps_cval_el1)
373*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(cntp_ctl_el0)
374*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(cntp_tval_el0)
375*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(cntp_cval_el0)
376*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_READ_FUNC(cntpct_el0)
377*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(cnthctl_el2)
378*f5478dedSAntonio Nino Diaz 
379*f5478dedSAntonio Nino Diaz #define get_cntp_ctl_enable(x)  (((x) >> CNTP_CTL_ENABLE_SHIFT) & \
380*f5478dedSAntonio Nino Diaz 					CNTP_CTL_ENABLE_MASK)
381*f5478dedSAntonio Nino Diaz #define get_cntp_ctl_imask(x)   (((x) >> CNTP_CTL_IMASK_SHIFT) & \
382*f5478dedSAntonio Nino Diaz 					CNTP_CTL_IMASK_MASK)
383*f5478dedSAntonio Nino Diaz #define get_cntp_ctl_istatus(x) (((x) >> CNTP_CTL_ISTATUS_SHIFT) & \
384*f5478dedSAntonio Nino Diaz 					CNTP_CTL_ISTATUS_MASK)
385*f5478dedSAntonio Nino Diaz 
386*f5478dedSAntonio Nino Diaz #define set_cntp_ctl_enable(x)  ((x) |= (U(1) << CNTP_CTL_ENABLE_SHIFT))
387*f5478dedSAntonio Nino Diaz #define set_cntp_ctl_imask(x)   ((x) |= (U(1) << CNTP_CTL_IMASK_SHIFT))
388*f5478dedSAntonio Nino Diaz 
389*f5478dedSAntonio Nino Diaz #define clr_cntp_ctl_enable(x)  ((x) &= ~(U(1) << CNTP_CTL_ENABLE_SHIFT))
390*f5478dedSAntonio Nino Diaz #define clr_cntp_ctl_imask(x)   ((x) &= ~(U(1) << CNTP_CTL_IMASK_SHIFT))
391*f5478dedSAntonio Nino Diaz 
392*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(tpidr_el3)
393*f5478dedSAntonio Nino Diaz 
394*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(cntvoff_el2)
395*f5478dedSAntonio Nino Diaz 
396*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(vpidr_el2)
397*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(vmpidr_el2)
398*f5478dedSAntonio Nino Diaz 
399*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_READ_FUNC(isr_el1)
400*f5478dedSAntonio Nino Diaz 
401*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(mdcr_el2)
402*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(mdcr_el3)
403*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(hstr_el2)
404*f5478dedSAntonio Nino Diaz DEFINE_SYSREG_RW_FUNCS(pmcr_el0)
405*f5478dedSAntonio Nino Diaz 
406*f5478dedSAntonio Nino Diaz /* GICv3 System Registers */
407*f5478dedSAntonio Nino Diaz 
408*f5478dedSAntonio Nino Diaz DEFINE_RENAME_SYSREG_RW_FUNCS(icc_sre_el1, ICC_SRE_EL1)
409*f5478dedSAntonio Nino Diaz DEFINE_RENAME_SYSREG_RW_FUNCS(icc_sre_el2, ICC_SRE_EL2)
410*f5478dedSAntonio Nino Diaz DEFINE_RENAME_SYSREG_RW_FUNCS(icc_sre_el3, ICC_SRE_EL3)
411*f5478dedSAntonio Nino Diaz DEFINE_RENAME_SYSREG_RW_FUNCS(icc_pmr_el1, ICC_PMR_EL1)
412*f5478dedSAntonio Nino Diaz DEFINE_RENAME_SYSREG_READ_FUNC(icc_rpr_el1, ICC_RPR_EL1)
413*f5478dedSAntonio Nino Diaz DEFINE_RENAME_SYSREG_RW_FUNCS(icc_igrpen1_el3, ICC_IGRPEN1_EL3)
414*f5478dedSAntonio Nino Diaz DEFINE_RENAME_SYSREG_RW_FUNCS(icc_igrpen1_el1, ICC_IGRPEN1_EL1)
415*f5478dedSAntonio Nino Diaz DEFINE_RENAME_SYSREG_RW_FUNCS(icc_igrpen0_el1, ICC_IGRPEN0_EL1)
416*f5478dedSAntonio Nino Diaz DEFINE_RENAME_SYSREG_READ_FUNC(icc_hppir0_el1, ICC_HPPIR0_EL1)
417*f5478dedSAntonio Nino Diaz DEFINE_RENAME_SYSREG_READ_FUNC(icc_hppir1_el1, ICC_HPPIR1_EL1)
418*f5478dedSAntonio Nino Diaz DEFINE_RENAME_SYSREG_READ_FUNC(icc_iar0_el1, ICC_IAR0_EL1)
419*f5478dedSAntonio Nino Diaz DEFINE_RENAME_SYSREG_READ_FUNC(icc_iar1_el1, ICC_IAR1_EL1)
420*f5478dedSAntonio Nino Diaz DEFINE_RENAME_SYSREG_WRITE_FUNC(icc_eoir0_el1, ICC_EOIR0_EL1)
421*f5478dedSAntonio Nino Diaz DEFINE_RENAME_SYSREG_WRITE_FUNC(icc_eoir1_el1, ICC_EOIR1_EL1)
422*f5478dedSAntonio Nino Diaz DEFINE_RENAME_SYSREG_WRITE_FUNC(icc_sgi0r_el1, ICC_SGI0R_EL1)
423*f5478dedSAntonio Nino Diaz DEFINE_RENAME_SYSREG_RW_FUNCS(icc_sgi1r, ICC_SGI1R)
424*f5478dedSAntonio Nino Diaz 
425*f5478dedSAntonio Nino Diaz DEFINE_RENAME_SYSREG_RW_FUNCS(amcgcr_el0, AMCGCR_EL0)
426*f5478dedSAntonio Nino Diaz DEFINE_RENAME_SYSREG_RW_FUNCS(amcntenclr0_el0, AMCNTENCLR0_EL0)
427*f5478dedSAntonio Nino Diaz DEFINE_RENAME_SYSREG_RW_FUNCS(amcntenset0_el0, AMCNTENSET0_EL0)
428*f5478dedSAntonio Nino Diaz DEFINE_RENAME_SYSREG_RW_FUNCS(amcntenclr1_el0, AMCNTENCLR1_EL0)
429*f5478dedSAntonio Nino Diaz DEFINE_RENAME_SYSREG_RW_FUNCS(amcntenset1_el0, AMCNTENSET1_EL0)
430*f5478dedSAntonio Nino Diaz 
431*f5478dedSAntonio Nino Diaz DEFINE_RENAME_SYSREG_READ_FUNC(mpamidr_el1, MPAMIDR_EL1)
432*f5478dedSAntonio Nino Diaz DEFINE_RENAME_SYSREG_RW_FUNCS(mpam3_el3, MPAM3_EL3)
433*f5478dedSAntonio Nino Diaz DEFINE_RENAME_SYSREG_RW_FUNCS(mpam2_el2, MPAM2_EL2)
434*f5478dedSAntonio Nino Diaz DEFINE_RENAME_SYSREG_RW_FUNCS(mpamhcr_el2, MPAMHCR_EL2)
435*f5478dedSAntonio Nino Diaz 
436*f5478dedSAntonio Nino Diaz DEFINE_RENAME_SYSREG_RW_FUNCS(pmblimitr_el1, PMBLIMITR_EL1)
437*f5478dedSAntonio Nino Diaz 
438*f5478dedSAntonio Nino Diaz DEFINE_RENAME_SYSREG_WRITE_FUNC(zcr_el3, ZCR_EL3)
439*f5478dedSAntonio Nino Diaz DEFINE_RENAME_SYSREG_WRITE_FUNC(zcr_el2, ZCR_EL2)
440*f5478dedSAntonio Nino Diaz 
441*f5478dedSAntonio Nino Diaz DEFINE_RENAME_SYSREG_READ_FUNC(erridr_el1, ERRIDR_EL1)
442*f5478dedSAntonio Nino Diaz DEFINE_RENAME_SYSREG_WRITE_FUNC(errselr_el1, ERRSELR_EL1)
443*f5478dedSAntonio Nino Diaz 
444*f5478dedSAntonio Nino Diaz DEFINE_RENAME_SYSREG_READ_FUNC(erxfr_el1, ERXFR_EL1)
445*f5478dedSAntonio Nino Diaz DEFINE_RENAME_SYSREG_RW_FUNCS(erxctlr_el1, ERXCTLR_EL1)
446*f5478dedSAntonio Nino Diaz DEFINE_RENAME_SYSREG_RW_FUNCS(erxstatus_el1, ERXSTATUS_EL1)
447*f5478dedSAntonio Nino Diaz DEFINE_RENAME_SYSREG_READ_FUNC(erxaddr_el1, ERXADDR_EL1)
448*f5478dedSAntonio Nino Diaz DEFINE_RENAME_SYSREG_READ_FUNC(erxmisc0_el1, ERXMISC0_EL1)
449*f5478dedSAntonio Nino Diaz DEFINE_RENAME_SYSREG_READ_FUNC(erxmisc1_el1, ERXMISC1_EL1)
450*f5478dedSAntonio Nino Diaz 
451*f5478dedSAntonio Nino Diaz /* Armv8.3 Pointer Authentication Registers */
452*f5478dedSAntonio Nino Diaz DEFINE_RENAME_SYSREG_RW_FUNCS(apgakeylo_el1, APGAKeyLo_EL1)
453*f5478dedSAntonio Nino Diaz 
454*f5478dedSAntonio Nino Diaz #define IS_IN_EL(x) \
455*f5478dedSAntonio Nino Diaz 	(GET_EL(read_CurrentEl()) == MODE_EL##x)
456*f5478dedSAntonio Nino Diaz 
457*f5478dedSAntonio Nino Diaz #define IS_IN_EL1() IS_IN_EL(1)
458*f5478dedSAntonio Nino Diaz #define IS_IN_EL2() IS_IN_EL(2)
459*f5478dedSAntonio Nino Diaz #define IS_IN_EL3() IS_IN_EL(3)
460*f5478dedSAntonio Nino Diaz 
461*f5478dedSAntonio Nino Diaz static inline unsigned int get_current_el(void)
462*f5478dedSAntonio Nino Diaz {
463*f5478dedSAntonio Nino Diaz 	return GET_EL(read_CurrentEl());
464*f5478dedSAntonio Nino Diaz }
465*f5478dedSAntonio Nino Diaz 
466*f5478dedSAntonio Nino Diaz /*
467*f5478dedSAntonio Nino Diaz  * Check if an EL is implemented from AA64PFR0 register fields.
468*f5478dedSAntonio Nino Diaz  */
469*f5478dedSAntonio Nino Diaz static inline uint64_t el_implemented(unsigned int el)
470*f5478dedSAntonio Nino Diaz {
471*f5478dedSAntonio Nino Diaz 	if (el > 3U) {
472*f5478dedSAntonio Nino Diaz 		return EL_IMPL_NONE;
473*f5478dedSAntonio Nino Diaz 	} else {
474*f5478dedSAntonio Nino Diaz 		unsigned int shift = ID_AA64PFR0_EL1_SHIFT * el;
475*f5478dedSAntonio Nino Diaz 
476*f5478dedSAntonio Nino Diaz 		return (read_id_aa64pfr0_el1() >> shift) & ID_AA64PFR0_ELX_MASK;
477*f5478dedSAntonio Nino Diaz 	}
478*f5478dedSAntonio Nino Diaz }
479*f5478dedSAntonio Nino Diaz 
480*f5478dedSAntonio Nino Diaz #if !ERROR_DEPRECATED
481*f5478dedSAntonio Nino Diaz #define EL_IMPLEMENTED(_el)	el_implemented(_el)
482*f5478dedSAntonio Nino Diaz #endif
483*f5478dedSAntonio Nino Diaz 
484*f5478dedSAntonio Nino Diaz /* Previously defined accesor functions with incomplete register names  */
485*f5478dedSAntonio Nino Diaz 
486*f5478dedSAntonio Nino Diaz #define read_current_el()	read_CurrentEl()
487*f5478dedSAntonio Nino Diaz 
488*f5478dedSAntonio Nino Diaz #define dsb()			dsbsy()
489*f5478dedSAntonio Nino Diaz 
490*f5478dedSAntonio Nino Diaz #define read_midr()		read_midr_el1()
491*f5478dedSAntonio Nino Diaz 
492*f5478dedSAntonio Nino Diaz #define read_mpidr()		read_mpidr_el1()
493*f5478dedSAntonio Nino Diaz 
494*f5478dedSAntonio Nino Diaz #define read_scr()		read_scr_el3()
495*f5478dedSAntonio Nino Diaz #define write_scr(_v)		write_scr_el3(_v)
496*f5478dedSAntonio Nino Diaz 
497*f5478dedSAntonio Nino Diaz #define read_hcr()		read_hcr_el2()
498*f5478dedSAntonio Nino Diaz #define write_hcr(_v)		write_hcr_el2(_v)
499*f5478dedSAntonio Nino Diaz 
500*f5478dedSAntonio Nino Diaz #define read_cpacr()		read_cpacr_el1()
501*f5478dedSAntonio Nino Diaz #define write_cpacr(_v)		write_cpacr_el1(_v)
502*f5478dedSAntonio Nino Diaz 
503*f5478dedSAntonio Nino Diaz #endif /* ARCH_HELPERS_H */
504