xref: /arm-trusted-firmware/lib/cpus/aarch32/cortex_a53.S (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu/*
2*91f16700Schasinglulu * Copyright (c) 2017-2023, Arm Limited and Contributors. All rights reserved.
3*91f16700Schasinglulu *
4*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause
5*91f16700Schasinglulu */
6*91f16700Schasinglulu
7*91f16700Schasinglulu#include <arch.h>
8*91f16700Schasinglulu#include <asm_macros.S>
9*91f16700Schasinglulu#include <assert_macros.S>
10*91f16700Schasinglulu#include <common/debug.h>
11*91f16700Schasinglulu#include <cortex_a53.h>
12*91f16700Schasinglulu#include <cpu_macros.S>
13*91f16700Schasinglulu
14*91f16700Schasinglulu#if A53_DISABLE_NON_TEMPORAL_HINT
15*91f16700Schasinglulu#undef ERRATA_A53_836870
16*91f16700Schasinglulu#define ERRATA_A53_836870	1
17*91f16700Schasinglulu#endif
18*91f16700Schasinglulu
19*91f16700Schasinglulu	/* ---------------------------------------------
20*91f16700Schasinglulu	 * Disable intra-cluster coherency
21*91f16700Schasinglulu	 * ---------------------------------------------
22*91f16700Schasinglulu	 */
23*91f16700Schasinglulufunc cortex_a53_disable_smp
24*91f16700Schasinglulu	ldcopr16	r0, r1, CORTEX_A53_ECTLR
25*91f16700Schasinglulu	bic64_imm	r0, r1, CORTEX_A53_ECTLR_SMP_BIT
26*91f16700Schasinglulu	stcopr16	r0, r1, CORTEX_A53_ECTLR
27*91f16700Schasinglulu	isb
28*91f16700Schasinglulu	dsb	sy
29*91f16700Schasinglulu	bx	lr
30*91f16700Schasingluluendfunc cortex_a53_disable_smp
31*91f16700Schasinglulu
32*91f16700Schasinglulu	/* ---------------------------------------------------
33*91f16700Schasinglulu	 * Errata Workaround for Cortex A53 Errata #819472.
34*91f16700Schasinglulu	 * This applies only to revision <= r0p1 of Cortex A53.
35*91f16700Schasinglulu	 * ---------------------------------------------------
36*91f16700Schasinglulu	 */
37*91f16700Schasinglulufunc check_errata_819472
38*91f16700Schasinglulu	/*
39*91f16700Schasinglulu	 * Even though this is only needed for revision <= r0p1, it
40*91f16700Schasinglulu	 * is always applied due to limitations of the current
41*91f16700Schasinglulu	 * errata framework.
42*91f16700Schasinglulu	 */
43*91f16700Schasinglulu	mov	r0, #ERRATA_APPLIES
44*91f16700Schasinglulu	bx	lr
45*91f16700Schasingluluendfunc check_errata_819472
46*91f16700Schasinglulu
47*91f16700Schasingluluadd_erratum_entry cortex_a53, ERRATUM(819472), ERRATA_A53_819472
48*91f16700Schasinglulu
49*91f16700Schasinglulu	/* ---------------------------------------------------
50*91f16700Schasinglulu	 * Errata Workaround for Cortex A53 Errata #824069.
51*91f16700Schasinglulu	 * This applies only to revision <= r0p2 of Cortex A53.
52*91f16700Schasinglulu	 * ---------------------------------------------------
53*91f16700Schasinglulu	 */
54*91f16700Schasinglulufunc check_errata_824069
55*91f16700Schasinglulu	/*
56*91f16700Schasinglulu	 * Even though this is only needed for revision <= r0p2, it
57*91f16700Schasinglulu	 * is always applied due to limitations of the current
58*91f16700Schasinglulu	 * errata framework.
59*91f16700Schasinglulu	 */
60*91f16700Schasinglulu	mov	r0, #ERRATA_APPLIES
61*91f16700Schasinglulu	bx	lr
62*91f16700Schasingluluendfunc check_errata_824069
63*91f16700Schasinglulu
64*91f16700Schasingluluadd_erratum_entry cortex_a53, ERRATUM(824069), ERRATA_A53_824069
65*91f16700Schasinglulu
66*91f16700Schasinglulu	/* --------------------------------------------------
67*91f16700Schasinglulu	 * Errata Workaround for Cortex A53 Errata #826319.
68*91f16700Schasinglulu	 * This applies only to revision <= r0p2 of Cortex A53.
69*91f16700Schasinglulu	 * Inputs:
70*91f16700Schasinglulu	 * r0: variant[4:7] and revision[0:3] of current cpu.
71*91f16700Schasinglulu	 * Shall clobber: r0-r3
72*91f16700Schasinglulu	 * --------------------------------------------------
73*91f16700Schasinglulu	 */
74*91f16700Schasinglulufunc errata_a53_826319_wa
75*91f16700Schasinglulu	/*
76*91f16700Schasinglulu	 * Compare r0 against revision r0p2
77*91f16700Schasinglulu	 */
78*91f16700Schasinglulu	mov	r2, lr
79*91f16700Schasinglulu	bl	check_errata_826319
80*91f16700Schasinglulu	mov	lr, r2
81*91f16700Schasinglulu	cmp	r0, #ERRATA_NOT_APPLIES
82*91f16700Schasinglulu	beq	1f
83*91f16700Schasinglulu	ldcopr	r0, CORTEX_A53_L2ACTLR
84*91f16700Schasinglulu	bic	r0, #CORTEX_A53_L2ACTLR_ENABLE_UNIQUECLEAN
85*91f16700Schasinglulu	orr	r0, #CORTEX_A53_L2ACTLR_DISABLE_CLEAN_PUSH
86*91f16700Schasinglulu	stcopr	r0, CORTEX_A53_L2ACTLR
87*91f16700Schasinglulu1:
88*91f16700Schasinglulu	bx	lr
89*91f16700Schasingluluendfunc errata_a53_826319_wa
90*91f16700Schasinglulu
91*91f16700Schasinglulufunc check_errata_826319
92*91f16700Schasinglulu	mov	r1, #0x02
93*91f16700Schasinglulu	b	cpu_rev_var_ls
94*91f16700Schasingluluendfunc check_errata_826319
95*91f16700Schasinglulu
96*91f16700Schasingluluadd_erratum_entry cortex_a53, ERRATUM(826319), ERRATA_A53_826319
97*91f16700Schasinglulu
98*91f16700Schasinglulu	/* ---------------------------------------------------
99*91f16700Schasinglulu	 * Errata Workaround for Cortex A53 Errata #827319.
100*91f16700Schasinglulu	 * This applies only to revision <= r0p2 of Cortex A53.
101*91f16700Schasinglulu	 * ---------------------------------------------------
102*91f16700Schasinglulu	 */
103*91f16700Schasinglulufunc check_errata_827319
104*91f16700Schasinglulu	/*
105*91f16700Schasinglulu	 * Even though this is only needed for revision <= r0p2, it
106*91f16700Schasinglulu	 * is always applied due to limitations of the current
107*91f16700Schasinglulu	 * errata framework.
108*91f16700Schasinglulu	 */
109*91f16700Schasinglulu	mov	r0, #ERRATA_APPLIES
110*91f16700Schasinglulu	bx	lr
111*91f16700Schasingluluendfunc check_errata_827319
112*91f16700Schasinglulu
113*91f16700Schasingluluadd_erratum_entry cortex_a53, ERRATUM(827319), ERRATA_A53_827319
114*91f16700Schasinglulu
115*91f16700Schasinglulu	/* ---------------------------------------------------------------------
116*91f16700Schasinglulu	 * Disable the cache non-temporal hint.
117*91f16700Schasinglulu	 *
118*91f16700Schasinglulu	 * This ignores the Transient allocation hint in the MAIR and treats
119*91f16700Schasinglulu	 * allocations the same as non-transient allocation types. As a result,
120*91f16700Schasinglulu	 * the LDNP and STNP instructions in AArch64 behave the same as the
121*91f16700Schasinglulu	 * equivalent LDP and STP instructions.
122*91f16700Schasinglulu	 *
123*91f16700Schasinglulu	 * This is relevant only for revisions <= r0p3 of Cortex-A53.
124*91f16700Schasinglulu	 * From r0p4 and onwards, the bit to disable the hint is enabled by
125*91f16700Schasinglulu	 * default at reset.
126*91f16700Schasinglulu	 *
127*91f16700Schasinglulu	 * Inputs:
128*91f16700Schasinglulu	 * r0: variant[4:7] and revision[0:3] of current cpu.
129*91f16700Schasinglulu	 * Shall clobber: r0-r3
130*91f16700Schasinglulu	 * ---------------------------------------------------------------------
131*91f16700Schasinglulu	 */
132*91f16700Schasinglulufunc a53_disable_non_temporal_hint
133*91f16700Schasinglulu	/*
134*91f16700Schasinglulu	 * Compare r0 against revision r0p3
135*91f16700Schasinglulu	 */
136*91f16700Schasinglulu	mov		r2, lr
137*91f16700Schasinglulu	bl		check_errata_disable_non_temporal_hint
138*91f16700Schasinglulu	mov		lr, r2
139*91f16700Schasinglulu	cmp		r0, #ERRATA_NOT_APPLIES
140*91f16700Schasinglulu	beq		1f
141*91f16700Schasinglulu	ldcopr16	r0, r1, CORTEX_A53_CPUACTLR
142*91f16700Schasinglulu	orr64_imm	r0, r1, CORTEX_A53_CPUACTLR_DTAH
143*91f16700Schasinglulu	stcopr16	r0, r1, CORTEX_A53_CPUACTLR
144*91f16700Schasinglulu1:
145*91f16700Schasinglulu	bx		lr
146*91f16700Schasingluluendfunc a53_disable_non_temporal_hint
147*91f16700Schasinglulu
148*91f16700Schasinglulufunc check_errata_disable_non_temporal_hint
149*91f16700Schasinglulu	mov	r1, #0x03
150*91f16700Schasinglulu	b	cpu_rev_var_ls
151*91f16700Schasingluluendfunc check_errata_disable_non_temporal_hint
152*91f16700Schasinglulu
153*91f16700Schasingluluadd_erratum_entry cortex_a53, ERRATUM(836870), ERRATA_A53_836870 | A53_DISABLE_NON_TEMPORAL_HINT, \
154*91f16700Schasinglulu	disable_non_temporal_hint
155*91f16700Schasinglulu
156*91f16700Schasinglulu	/* --------------------------------------------------
157*91f16700Schasinglulu	 * Errata Workaround for Cortex A53 Errata #855873.
158*91f16700Schasinglulu	 *
159*91f16700Schasinglulu	 * This applies only to revisions >= r0p3 of Cortex A53.
160*91f16700Schasinglulu	 * Earlier revisions of the core are affected as well, but don't
161*91f16700Schasinglulu	 * have the chicken bit in the CPUACTLR register. It is expected that
162*91f16700Schasinglulu	 * the rich OS takes care of that, especially as the workaround is
163*91f16700Schasinglulu	 * shared with other erratas in those revisions of the CPU.
164*91f16700Schasinglulu	 * Inputs:
165*91f16700Schasinglulu	 * r0: variant[4:7] and revision[0:3] of current cpu.
166*91f16700Schasinglulu	 * Shall clobber: r0-r3
167*91f16700Schasinglulu	 * --------------------------------------------------
168*91f16700Schasinglulu	 */
169*91f16700Schasinglulufunc errata_a53_855873_wa
170*91f16700Schasinglulu	/*
171*91f16700Schasinglulu	 * Compare r0 against revision r0p3 and higher
172*91f16700Schasinglulu	 */
173*91f16700Schasinglulu	mov		r2, lr
174*91f16700Schasinglulu	bl		check_errata_855873
175*91f16700Schasinglulu	mov		lr, r2
176*91f16700Schasinglulu	cmp		r0, #ERRATA_NOT_APPLIES
177*91f16700Schasinglulu	beq		1f
178*91f16700Schasinglulu	ldcopr16	r0, r1, CORTEX_A53_CPUACTLR
179*91f16700Schasinglulu	orr64_imm	r0, r1, CORTEX_A53_CPUACTLR_ENDCCASCI
180*91f16700Schasinglulu	stcopr16	r0, r1, CORTEX_A53_CPUACTLR
181*91f16700Schasinglulu1:
182*91f16700Schasinglulu	bx		lr
183*91f16700Schasingluluendfunc errata_a53_855873_wa
184*91f16700Schasinglulu
185*91f16700Schasinglulufunc check_errata_855873
186*91f16700Schasinglulu	mov	r1, #0x03
187*91f16700Schasinglulu	b	cpu_rev_var_hs
188*91f16700Schasingluluendfunc check_errata_855873
189*91f16700Schasinglulu
190*91f16700Schasingluluadd_erratum_entry cortex_a53, ERRATUM(855873), ERRATA_A53_855873
191*91f16700Schasinglulu
192*91f16700Schasinglulu	/* -------------------------------------------------
193*91f16700Schasinglulu	 * The CPU Ops reset function for Cortex-A53.
194*91f16700Schasinglulu	 * Shall clobber: r0-r6
195*91f16700Schasinglulu	 * -------------------------------------------------
196*91f16700Schasinglulu	 */
197*91f16700Schasinglulufunc cortex_a53_reset_func
198*91f16700Schasinglulu	mov	r5, lr
199*91f16700Schasinglulu	bl	cpu_get_rev_var
200*91f16700Schasinglulu	mov	r4, r0
201*91f16700Schasinglulu
202*91f16700Schasinglulu#if ERRATA_A53_826319
203*91f16700Schasinglulu	mov	r0, r4
204*91f16700Schasinglulu	bl	errata_a53_826319_wa
205*91f16700Schasinglulu#endif
206*91f16700Schasinglulu
207*91f16700Schasinglulu#if ERRATA_A53_836870
208*91f16700Schasinglulu	mov	r0, r4
209*91f16700Schasinglulu	bl	a53_disable_non_temporal_hint
210*91f16700Schasinglulu#endif
211*91f16700Schasinglulu
212*91f16700Schasinglulu#if ERRATA_A53_855873
213*91f16700Schasinglulu	mov	r0, r4
214*91f16700Schasinglulu	bl	errata_a53_855873_wa
215*91f16700Schasinglulu#endif
216*91f16700Schasinglulu
217*91f16700Schasinglulu	/* ---------------------------------------------
218*91f16700Schasinglulu	 * Enable the SMP bit.
219*91f16700Schasinglulu	 * ---------------------------------------------
220*91f16700Schasinglulu	 */
221*91f16700Schasinglulu	ldcopr16	r0, r1, CORTEX_A53_ECTLR
222*91f16700Schasinglulu	orr64_imm	r0, r1, CORTEX_A53_ECTLR_SMP_BIT
223*91f16700Schasinglulu	stcopr16	r0, r1,	CORTEX_A53_ECTLR
224*91f16700Schasinglulu	isb
225*91f16700Schasinglulu	bx	r5
226*91f16700Schasingluluendfunc cortex_a53_reset_func
227*91f16700Schasinglulu
228*91f16700Schasinglulu	/* ----------------------------------------------------
229*91f16700Schasinglulu	 * The CPU Ops core power down function for Cortex-A53.
230*91f16700Schasinglulu	 * ----------------------------------------------------
231*91f16700Schasinglulu	 */
232*91f16700Schasinglulufunc cortex_a53_core_pwr_dwn
233*91f16700Schasinglulu	push	{r12, lr}
234*91f16700Schasinglulu
235*91f16700Schasinglulu	/* Assert if cache is enabled */
236*91f16700Schasinglulu#if ENABLE_ASSERTIONS
237*91f16700Schasinglulu	ldcopr	r0, SCTLR
238*91f16700Schasinglulu	tst	r0, #SCTLR_C_BIT
239*91f16700Schasinglulu	ASM_ASSERT(eq)
240*91f16700Schasinglulu#endif
241*91f16700Schasinglulu
242*91f16700Schasinglulu	/* ---------------------------------------------
243*91f16700Schasinglulu	 * Flush L1 caches.
244*91f16700Schasinglulu	 * ---------------------------------------------
245*91f16700Schasinglulu	 */
246*91f16700Schasinglulu	mov	r0, #DC_OP_CISW
247*91f16700Schasinglulu	bl	dcsw_op_level1
248*91f16700Schasinglulu
249*91f16700Schasinglulu	/* ---------------------------------------------
250*91f16700Schasinglulu	 * Come out of intra cluster coherency
251*91f16700Schasinglulu	 * ---------------------------------------------
252*91f16700Schasinglulu	 */
253*91f16700Schasinglulu	pop	{r12, lr}
254*91f16700Schasinglulu	b	cortex_a53_disable_smp
255*91f16700Schasingluluendfunc cortex_a53_core_pwr_dwn
256*91f16700Schasinglulu
257*91f16700Schasinglulu	/* -------------------------------------------------------
258*91f16700Schasinglulu	 * The CPU Ops cluster power down function for Cortex-A53.
259*91f16700Schasinglulu	 * Clobbers: r0-r3
260*91f16700Schasinglulu	 * -------------------------------------------------------
261*91f16700Schasinglulu	 */
262*91f16700Schasinglulufunc cortex_a53_cluster_pwr_dwn
263*91f16700Schasinglulu	push	{r12, lr}
264*91f16700Schasinglulu
265*91f16700Schasinglulu	/* Assert if cache is enabled */
266*91f16700Schasinglulu#if ENABLE_ASSERTIONS
267*91f16700Schasinglulu	ldcopr	r0, SCTLR
268*91f16700Schasinglulu	tst	r0, #SCTLR_C_BIT
269*91f16700Schasinglulu	ASM_ASSERT(eq)
270*91f16700Schasinglulu#endif
271*91f16700Schasinglulu
272*91f16700Schasinglulu	/* ---------------------------------------------
273*91f16700Schasinglulu	 * Flush L1 caches.
274*91f16700Schasinglulu	 * ---------------------------------------------
275*91f16700Schasinglulu	 */
276*91f16700Schasinglulu	mov	r0, #DC_OP_CISW
277*91f16700Schasinglulu	bl	dcsw_op_level1
278*91f16700Schasinglulu
279*91f16700Schasinglulu	/* ---------------------------------------------
280*91f16700Schasinglulu	 * Disable the optional ACP.
281*91f16700Schasinglulu	 * ---------------------------------------------
282*91f16700Schasinglulu	 */
283*91f16700Schasinglulu	bl	plat_disable_acp
284*91f16700Schasinglulu
285*91f16700Schasinglulu	/* ---------------------------------------------
286*91f16700Schasinglulu	 * Flush L2 caches.
287*91f16700Schasinglulu	 * ---------------------------------------------
288*91f16700Schasinglulu	 */
289*91f16700Schasinglulu	mov	r0, #DC_OP_CISW
290*91f16700Schasinglulu	bl	dcsw_op_level2
291*91f16700Schasinglulu
292*91f16700Schasinglulu	/* ---------------------------------------------
293*91f16700Schasinglulu	 * Come out of intra cluster coherency
294*91f16700Schasinglulu	 * ---------------------------------------------
295*91f16700Schasinglulu	 */
296*91f16700Schasinglulu	pop	{r12, lr}
297*91f16700Schasinglulu	b	cortex_a53_disable_smp
298*91f16700Schasingluluendfunc cortex_a53_cluster_pwr_dwn
299*91f16700Schasinglulu
300*91f16700Schasingluluerrata_report_shim cortex_a53
301*91f16700Schasinglulu
302*91f16700Schasingluludeclare_cpu_ops cortex_a53, CORTEX_A53_MIDR, \
303*91f16700Schasinglulu	cortex_a53_reset_func, \
304*91f16700Schasinglulu	cortex_a53_core_pwr_dwn, \
305*91f16700Schasinglulu	cortex_a53_cluster_pwr_dwn
306