xref: /arm-trusted-firmware/lib/cpus/aarch32/cortex_a57.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#include <arch.h>
7*91f16700Schasinglulu#include <asm_macros.S>
8*91f16700Schasinglulu#include <assert_macros.S>
9*91f16700Schasinglulu#include <common/debug.h>
10*91f16700Schasinglulu#include <cortex_a57.h>
11*91f16700Schasinglulu#include <cpu_macros.S>
12*91f16700Schasinglulu
13*91f16700Schasinglulu	/* ---------------------------------------------
14*91f16700Schasinglulu	 * Disable intra-cluster coherency
15*91f16700Schasinglulu	 * Clobbers: r0-r1
16*91f16700Schasinglulu	 * ---------------------------------------------
17*91f16700Schasinglulu	 */
18*91f16700Schasinglulufunc cortex_a57_disable_smp
19*91f16700Schasinglulu	ldcopr16	r0, r1, CORTEX_A57_ECTLR
20*91f16700Schasinglulu	bic64_imm	r0, r1, CORTEX_A57_ECTLR_SMP_BIT
21*91f16700Schasinglulu	stcopr16	r0, r1, CORTEX_A57_ECTLR
22*91f16700Schasinglulu	bx	lr
23*91f16700Schasingluluendfunc cortex_a57_disable_smp
24*91f16700Schasinglulu
25*91f16700Schasinglulu	/* ---------------------------------------------
26*91f16700Schasinglulu	 * Disable all types of L2 prefetches.
27*91f16700Schasinglulu	 * Clobbers: r0-r2
28*91f16700Schasinglulu	 * ---------------------------------------------
29*91f16700Schasinglulu	 */
30*91f16700Schasinglulufunc cortex_a57_disable_l2_prefetch
31*91f16700Schasinglulu	ldcopr16	r0, r1, CORTEX_A57_ECTLR
32*91f16700Schasinglulu	orr64_imm	r0, r1, CORTEX_A57_ECTLR_DIS_TWD_ACC_PFTCH_BIT
33*91f16700Schasinglulu	bic64_imm	r0, r1, (CORTEX_A57_ECTLR_L2_IPFTCH_DIST_MASK | \
34*91f16700Schasinglulu				 CORTEX_A57_ECTLR_L2_DPFTCH_DIST_MASK)
35*91f16700Schasinglulu	stcopr16	r0, r1, CORTEX_A57_ECTLR
36*91f16700Schasinglulu	isb
37*91f16700Schasinglulu	dsb	ish
38*91f16700Schasinglulu	bx	lr
39*91f16700Schasingluluendfunc cortex_a57_disable_l2_prefetch
40*91f16700Schasinglulu
41*91f16700Schasinglulu	/* ---------------------------------------------
42*91f16700Schasinglulu	 * Disable debug interfaces
43*91f16700Schasinglulu	 * ---------------------------------------------
44*91f16700Schasinglulu	 */
45*91f16700Schasinglulufunc cortex_a57_disable_ext_debug
46*91f16700Schasinglulu	mov	r0, #1
47*91f16700Schasinglulu	stcopr	r0, DBGOSDLR
48*91f16700Schasinglulu	isb
49*91f16700Schasinglulu#if ERRATA_A57_817169
50*91f16700Schasinglulu	/*
51*91f16700Schasinglulu	 * Invalidate any TLB address
52*91f16700Schasinglulu	 */
53*91f16700Schasinglulu	mov	r0, #0
54*91f16700Schasinglulu	stcopr	r0, TLBIMVA
55*91f16700Schasinglulu#endif
56*91f16700Schasinglulu	dsb	sy
57*91f16700Schasinglulu	bx	lr
58*91f16700Schasingluluendfunc cortex_a57_disable_ext_debug
59*91f16700Schasinglulu
60*91f16700Schasinglulu	/* --------------------------------------------------
61*91f16700Schasinglulu	 * Errata Workaround for Cortex A57 Errata #806969.
62*91f16700Schasinglulu	 * This applies only to revision r0p0 of Cortex A57.
63*91f16700Schasinglulu	 * Inputs:
64*91f16700Schasinglulu	 * r0: variant[4:7] and revision[0:3] of current cpu.
65*91f16700Schasinglulu	 * Shall clobber: r0-r3
66*91f16700Schasinglulu	 * --------------------------------------------------
67*91f16700Schasinglulu	 */
68*91f16700Schasinglulufunc errata_a57_806969_wa
69*91f16700Schasinglulu	/*
70*91f16700Schasinglulu	 * Compare r0 against revision r0p0
71*91f16700Schasinglulu	 */
72*91f16700Schasinglulu	mov		r2, lr
73*91f16700Schasinglulu	bl		check_errata_806969
74*91f16700Schasinglulu	mov		lr, r2
75*91f16700Schasinglulu	cmp		r0, #ERRATA_NOT_APPLIES
76*91f16700Schasinglulu	beq		1f
77*91f16700Schasinglulu	ldcopr16	r0, r1, CORTEX_A57_CPUACTLR
78*91f16700Schasinglulu	orr64_imm	r0, r1, CORTEX_A57_CPUACTLR_NO_ALLOC_WBWA
79*91f16700Schasinglulu	stcopr16	r0, r1, CORTEX_A57_CPUACTLR
80*91f16700Schasinglulu1:
81*91f16700Schasinglulu	bx	lr
82*91f16700Schasingluluendfunc errata_a57_806969_wa
83*91f16700Schasinglulu
84*91f16700Schasinglulufunc check_errata_806969
85*91f16700Schasinglulu	mov	r1, #0x00
86*91f16700Schasinglulu	b	cpu_rev_var_ls
87*91f16700Schasingluluendfunc check_errata_806969
88*91f16700Schasinglulu
89*91f16700Schasingluluadd_erratum_entry cortex_a57, ERRATUM(806969), ERRATA_A57_806969
90*91f16700Schasinglulu
91*91f16700Schasinglulu	/* ---------------------------------------------------
92*91f16700Schasinglulu	 * Errata Workaround for Cortex A57 Errata #813419.
93*91f16700Schasinglulu	 * This applies only to revision r0p0 of Cortex A57.
94*91f16700Schasinglulu	 * ---------------------------------------------------
95*91f16700Schasinglulu	 */
96*91f16700Schasinglulufunc check_errata_813419
97*91f16700Schasinglulu	/*
98*91f16700Schasinglulu	 * Even though this is only needed for revision r0p0, it
99*91f16700Schasinglulu	 * is always applied due to limitations of the current
100*91f16700Schasinglulu	 * errata framework.
101*91f16700Schasinglulu	 */
102*91f16700Schasinglulu	mov	r0, #ERRATA_APPLIES
103*91f16700Schasinglulu	bx	lr
104*91f16700Schasingluluendfunc check_errata_813419
105*91f16700Schasinglulu
106*91f16700Schasingluluadd_erratum_entry cortex_a57, ERRATUM(813419), ERRATA_A57_813419
107*91f16700Schasinglulu
108*91f16700Schasinglulu	/* ---------------------------------------------------
109*91f16700Schasinglulu	 * Errata Workaround for Cortex A57 Errata #813420.
110*91f16700Schasinglulu	 * This applies only to revision r0p0 of Cortex A57.
111*91f16700Schasinglulu	 * Inputs:
112*91f16700Schasinglulu	 * r0: variant[4:7] and revision[0:3] of current cpu.
113*91f16700Schasinglulu	 * Shall clobber: r0-r3
114*91f16700Schasinglulu	 * ---------------------------------------------------
115*91f16700Schasinglulu	 */
116*91f16700Schasinglulufunc errata_a57_813420_wa
117*91f16700Schasinglulu	/*
118*91f16700Schasinglulu	 * Compare r0 against revision r0p0
119*91f16700Schasinglulu	 */
120*91f16700Schasinglulu	mov		r2, lr
121*91f16700Schasinglulu	bl		check_errata_813420
122*91f16700Schasinglulu	mov		lr, r2
123*91f16700Schasinglulu	cmp		r0, #ERRATA_NOT_APPLIES
124*91f16700Schasinglulu	beq		1f
125*91f16700Schasinglulu	ldcopr16	r0, r1, CORTEX_A57_CPUACTLR
126*91f16700Schasinglulu	orr64_imm	r0, r1, CORTEX_A57_CPUACTLR_DCC_AS_DCCI
127*91f16700Schasinglulu	stcopr16	r0, r1, CORTEX_A57_CPUACTLR
128*91f16700Schasinglulu1:
129*91f16700Schasinglulu	bx		lr
130*91f16700Schasingluluendfunc errata_a57_813420_wa
131*91f16700Schasinglulu
132*91f16700Schasinglulufunc check_errata_813420
133*91f16700Schasinglulu	mov	r1, #0x00
134*91f16700Schasinglulu	b	cpu_rev_var_ls
135*91f16700Schasingluluendfunc check_errata_813420
136*91f16700Schasinglulu
137*91f16700Schasingluluadd_erratum_entry cortex_a57, ERRATUM(813420), ERRATA_A57_813420
138*91f16700Schasinglulu
139*91f16700Schasinglulu	/* ---------------------------------------------------
140*91f16700Schasinglulu	 * Errata Workaround for Cortex A57 Errata #814670.
141*91f16700Schasinglulu	 * This applies only to revision r0p0 of Cortex A57.
142*91f16700Schasinglulu	 * Inputs:
143*91f16700Schasinglulu	 * r0: variant[4:7] and revision[0:3] of current cpu.
144*91f16700Schasinglulu	 * Shall clobber: r0-r3
145*91f16700Schasinglulu	 * ---------------------------------------------------
146*91f16700Schasinglulu	 */
147*91f16700Schasinglulufunc errata_a57_814670_wa
148*91f16700Schasinglulu	/*
149*91f16700Schasinglulu	 * Compare r0 against revision r0p0
150*91f16700Schasinglulu	 */
151*91f16700Schasinglulu	mov		r2, lr
152*91f16700Schasinglulu	bl		check_errata_814670
153*91f16700Schasinglulu	cmp		r0, #ERRATA_NOT_APPLIES
154*91f16700Schasinglulu	beq		1f
155*91f16700Schasinglulu	ldcopr16	r0, r1, CORTEX_A57_CPUACTLR
156*91f16700Schasinglulu	orr64_imm	r0, r1, CORTEX_A57_CPUACTLR_DIS_DMB_NULLIFICATION
157*91f16700Schasinglulu	stcopr16	r0, r1, CORTEX_A57_CPUACTLR
158*91f16700Schasinglulu	isb
159*91f16700Schasinglulu1:
160*91f16700Schasinglulu	bx		r2
161*91f16700Schasingluluendfunc errata_a57_814670_wa
162*91f16700Schasinglulu
163*91f16700Schasinglulufunc check_errata_814670
164*91f16700Schasinglulu	mov	r1, #0x00
165*91f16700Schasinglulu	b	cpu_rev_var_ls
166*91f16700Schasingluluendfunc check_errata_814670
167*91f16700Schasinglulu
168*91f16700Schasingluluadd_erratum_entry cortex_a57, ERRATUM(814670), ERRATA_A57_814670
169*91f16700Schasinglulu
170*91f16700Schasinglulu	/* ----------------------------------------------------
171*91f16700Schasinglulu	 * Errata Workaround for Cortex A57 Errata #817169.
172*91f16700Schasinglulu	 * This applies only to revision <= r0p1 of Cortex A57.
173*91f16700Schasinglulu	 * ----------------------------------------------------
174*91f16700Schasinglulu	 */
175*91f16700Schasinglulufunc check_errata_817169
176*91f16700Schasinglulu	/*
177*91f16700Schasinglulu	 * Even though this is only needed for revision <= r0p1, it
178*91f16700Schasinglulu	 * is always applied because of the low cost of the workaround.
179*91f16700Schasinglulu	 */
180*91f16700Schasinglulu	mov	r0, #ERRATA_APPLIES
181*91f16700Schasinglulu	bx	lr
182*91f16700Schasingluluendfunc check_errata_817169
183*91f16700Schasinglulu
184*91f16700Schasingluluadd_erratum_entry cortex_a57, ERRATUM(817169), ERRATA_A57_817169
185*91f16700Schasinglulu
186*91f16700Schasinglulu	/* --------------------------------------------------------------------
187*91f16700Schasinglulu	 * Disable the over-read from the LDNP instruction.
188*91f16700Schasinglulu	 *
189*91f16700Schasinglulu	 * This applies to all revisions <= r1p2. The performance degradation
190*91f16700Schasinglulu	 * observed with LDNP/STNP has been fixed on r1p3 and onwards.
191*91f16700Schasinglulu	 *
192*91f16700Schasinglulu	 * Inputs:
193*91f16700Schasinglulu	 * r0: variant[4:7] and revision[0:3] of current cpu.
194*91f16700Schasinglulu	 * Shall clobber: r0-r3
195*91f16700Schasinglulu	 * ---------------------------------------------------------------------
196*91f16700Schasinglulu	 */
197*91f16700Schasinglulufunc a57_disable_ldnp_overread
198*91f16700Schasinglulu	/*
199*91f16700Schasinglulu	 * Compare r0 against revision r1p2
200*91f16700Schasinglulu	 */
201*91f16700Schasinglulu	mov		r2, lr
202*91f16700Schasinglulu	bl		check_errata_disable_ldnp_overread
203*91f16700Schasinglulu	mov		lr, r2
204*91f16700Schasinglulu	cmp		r0, #ERRATA_NOT_APPLIES
205*91f16700Schasinglulu	beq		1f
206*91f16700Schasinglulu	ldcopr16	r0, r1, CORTEX_A57_CPUACTLR
207*91f16700Schasinglulu	orr64_imm	r0, r1, CORTEX_A57_CPUACTLR_DIS_OVERREAD
208*91f16700Schasinglulu	stcopr16	r0, r1, CORTEX_A57_CPUACTLR
209*91f16700Schasinglulu1:
210*91f16700Schasinglulu	bx		lr
211*91f16700Schasingluluendfunc a57_disable_ldnp_overread
212*91f16700Schasinglulu
213*91f16700Schasinglulufunc check_errata_disable_ldnp_overread
214*91f16700Schasinglulu	mov	r1, #0x12
215*91f16700Schasinglulu	b	cpu_rev_var_ls
216*91f16700Schasingluluendfunc check_errata_disable_ldnp_overread
217*91f16700Schasinglulu
218*91f16700Schasingluluadd_erratum_entry cortex_a57, ERRATUM(1), A57_DISABLE_NON_TEMPORAL_HINT, disable_ldnp_overread
219*91f16700Schasinglulu
220*91f16700Schasinglulu	/* ---------------------------------------------------
221*91f16700Schasinglulu	 * Errata Workaround for Cortex A57 Errata #826974.
222*91f16700Schasinglulu	 * This applies only to revision <= r1p1 of Cortex A57.
223*91f16700Schasinglulu	 * Inputs:
224*91f16700Schasinglulu	 * r0: variant[4:7] and revision[0:3] of current cpu.
225*91f16700Schasinglulu	 * Shall clobber: r0-r3
226*91f16700Schasinglulu	 * ---------------------------------------------------
227*91f16700Schasinglulu	 */
228*91f16700Schasinglulufunc errata_a57_826974_wa
229*91f16700Schasinglulu	/*
230*91f16700Schasinglulu	 * Compare r0 against revision r1p1
231*91f16700Schasinglulu	 */
232*91f16700Schasinglulu	mov		r2, lr
233*91f16700Schasinglulu	bl		check_errata_826974
234*91f16700Schasinglulu	mov		lr, r2
235*91f16700Schasinglulu	cmp		r0, #ERRATA_NOT_APPLIES
236*91f16700Schasinglulu	beq		1f
237*91f16700Schasinglulu	ldcopr16	r0, r1, CORTEX_A57_CPUACTLR
238*91f16700Schasinglulu	orr64_imm	r0, r1, CORTEX_A57_CPUACTLR_DIS_LOAD_PASS_DMB
239*91f16700Schasinglulu	stcopr16	r0, r1, CORTEX_A57_CPUACTLR
240*91f16700Schasinglulu1:
241*91f16700Schasinglulu	bx		lr
242*91f16700Schasingluluendfunc errata_a57_826974_wa
243*91f16700Schasinglulu
244*91f16700Schasinglulufunc check_errata_826974
245*91f16700Schasinglulu	mov	r1, #0x11
246*91f16700Schasinglulu	b	cpu_rev_var_ls
247*91f16700Schasingluluendfunc check_errata_826974
248*91f16700Schasinglulu
249*91f16700Schasingluluadd_erratum_entry cortex_a57, ERRATUM(826974), ERRATA_A57_826974
250*91f16700Schasinglulu
251*91f16700Schasinglulu	/* ---------------------------------------------------
252*91f16700Schasinglulu	 * Errata Workaround for Cortex A57 Errata #826977.
253*91f16700Schasinglulu	 * This applies only to revision <= r1p1 of Cortex A57.
254*91f16700Schasinglulu	 * Inputs:
255*91f16700Schasinglulu	 * r0: variant[4:7] and revision[0:3] of current cpu.
256*91f16700Schasinglulu	 * Shall clobber: r0-r3
257*91f16700Schasinglulu	 * ---------------------------------------------------
258*91f16700Schasinglulu	 */
259*91f16700Schasinglulufunc errata_a57_826977_wa
260*91f16700Schasinglulu	/*
261*91f16700Schasinglulu	 * Compare r0 against revision r1p1
262*91f16700Schasinglulu	 */
263*91f16700Schasinglulu	mov		r2, lr
264*91f16700Schasinglulu	bl		check_errata_826977
265*91f16700Schasinglulu	mov		lr, r2
266*91f16700Schasinglulu	cmp		r0, #ERRATA_NOT_APPLIES
267*91f16700Schasinglulu	beq		1f
268*91f16700Schasinglulu	ldcopr16	r0, r1, CORTEX_A57_CPUACTLR
269*91f16700Schasinglulu	orr64_imm	r0, r1, CORTEX_A57_CPUACTLR_GRE_NGRE_AS_NGNRE
270*91f16700Schasinglulu	stcopr16	r0, r1, CORTEX_A57_CPUACTLR
271*91f16700Schasinglulu1:
272*91f16700Schasinglulu	bx		lr
273*91f16700Schasingluluendfunc errata_a57_826977_wa
274*91f16700Schasinglulu
275*91f16700Schasinglulufunc check_errata_826977
276*91f16700Schasinglulu	mov	r1, #0x11
277*91f16700Schasinglulu	b	cpu_rev_var_ls
278*91f16700Schasingluluendfunc check_errata_826977
279*91f16700Schasinglulu
280*91f16700Schasingluluadd_erratum_entry cortex_a57, ERRATUM(826977), ERRATA_A57_826977
281*91f16700Schasinglulu
282*91f16700Schasinglulu	/* ---------------------------------------------------
283*91f16700Schasinglulu	 * Errata Workaround for Cortex A57 Errata #828024.
284*91f16700Schasinglulu	 * This applies only to revision <= r1p1 of Cortex A57.
285*91f16700Schasinglulu	 * Inputs:
286*91f16700Schasinglulu	 * r0: variant[4:7] and revision[0:3] of current cpu.
287*91f16700Schasinglulu	 * Shall clobber: r0-r3
288*91f16700Schasinglulu	 * ---------------------------------------------------
289*91f16700Schasinglulu	 */
290*91f16700Schasinglulufunc errata_a57_828024_wa
291*91f16700Schasinglulu	/*
292*91f16700Schasinglulu	 * Compare r0 against revision r1p1
293*91f16700Schasinglulu	 */
294*91f16700Schasinglulu	mov		r2, lr
295*91f16700Schasinglulu	bl		check_errata_828024
296*91f16700Schasinglulu	mov		lr, r2
297*91f16700Schasinglulu	cmp		r0, #ERRATA_NOT_APPLIES
298*91f16700Schasinglulu	beq		1f
299*91f16700Schasinglulu	ldcopr16	r0, r1, CORTEX_A57_CPUACTLR
300*91f16700Schasinglulu	/*
301*91f16700Schasinglulu	 * Setting the relevant bits in CORTEX_A57_CPUACTLR has to be done in 2
302*91f16700Schasinglulu	 * instructions here because the resulting bitmask doesn't fit in a
303*91f16700Schasinglulu	 * 16-bit value so it cannot be encoded in a single instruction.
304*91f16700Schasinglulu	 */
305*91f16700Schasinglulu	orr64_imm	r0, r1, CORTEX_A57_CPUACTLR_NO_ALLOC_WBWA
306*91f16700Schasinglulu	orr64_imm	r0, r1, (CORTEX_A57_CPUACTLR_DIS_L1_STREAMING | CORTEX_A57_CPUACTLR_DIS_STREAMING)
307*91f16700Schasinglulu	stcopr16	r0, r1, CORTEX_A57_CPUACTLR
308*91f16700Schasinglulu1:
309*91f16700Schasinglulu	bx		lr
310*91f16700Schasingluluendfunc errata_a57_828024_wa
311*91f16700Schasinglulu
312*91f16700Schasinglulufunc check_errata_828024
313*91f16700Schasinglulu	mov	r1, #0x11
314*91f16700Schasinglulu	b	cpu_rev_var_ls
315*91f16700Schasingluluendfunc check_errata_828024
316*91f16700Schasinglulu
317*91f16700Schasingluluadd_erratum_entry cortex_a57, ERRATUM(828024), ERRATA_A57_828024
318*91f16700Schasinglulu
319*91f16700Schasinglulu	/* ---------------------------------------------------
320*91f16700Schasinglulu	 * Errata Workaround for Cortex A57 Errata #829520.
321*91f16700Schasinglulu	 * This applies only to revision <= r1p2 of Cortex A57.
322*91f16700Schasinglulu	 * Inputs:
323*91f16700Schasinglulu	 * r0: variant[4:7] and revision[0:3] of current cpu.
324*91f16700Schasinglulu	 * Shall clobber: r0-r3
325*91f16700Schasinglulu	 * ---------------------------------------------------
326*91f16700Schasinglulu	 */
327*91f16700Schasinglulufunc errata_a57_829520_wa
328*91f16700Schasinglulu	/*
329*91f16700Schasinglulu	 * Compare r0 against revision r1p2
330*91f16700Schasinglulu	 */
331*91f16700Schasinglulu	mov		r2, lr
332*91f16700Schasinglulu	bl		check_errata_829520
333*91f16700Schasinglulu	mov		lr, r2
334*91f16700Schasinglulu	cmp		r0, #ERRATA_NOT_APPLIES
335*91f16700Schasinglulu	beq		1f
336*91f16700Schasinglulu	ldcopr16	r0, r1, CORTEX_A57_CPUACTLR
337*91f16700Schasinglulu	orr64_imm	r0, r1, CORTEX_A57_CPUACTLR_DIS_INDIRECT_PREDICTOR
338*91f16700Schasinglulu	stcopr16	r0, r1, CORTEX_A57_CPUACTLR
339*91f16700Schasinglulu1:
340*91f16700Schasinglulu	bx		lr
341*91f16700Schasingluluendfunc errata_a57_829520_wa
342*91f16700Schasinglulu
343*91f16700Schasinglulufunc check_errata_829520
344*91f16700Schasinglulu	mov	r1, #0x12
345*91f16700Schasinglulu	b	cpu_rev_var_ls
346*91f16700Schasingluluendfunc check_errata_829520
347*91f16700Schasinglulu
348*91f16700Schasingluluadd_erratum_entry cortex_a57, ERRATUM(829520), ERRATA_A57_829520
349*91f16700Schasinglulu
350*91f16700Schasinglulu	/* ---------------------------------------------------
351*91f16700Schasinglulu	 * Errata Workaround for Cortex A57 Errata #833471.
352*91f16700Schasinglulu	 * This applies only to revision <= r1p2 of Cortex A57.
353*91f16700Schasinglulu	 * Inputs:
354*91f16700Schasinglulu	 * r0: variant[4:7] and revision[0:3] of current cpu.
355*91f16700Schasinglulu	 * Shall clobber: r0-r3
356*91f16700Schasinglulu	 * ---------------------------------------------------
357*91f16700Schasinglulu	 */
358*91f16700Schasinglulufunc errata_a57_833471_wa
359*91f16700Schasinglulu	/*
360*91f16700Schasinglulu	 * Compare r0 against revision r1p2
361*91f16700Schasinglulu	 */
362*91f16700Schasinglulu	mov		r2, lr
363*91f16700Schasinglulu	bl		check_errata_833471
364*91f16700Schasinglulu	mov		lr, r2
365*91f16700Schasinglulu	cmp		r0, #ERRATA_NOT_APPLIES
366*91f16700Schasinglulu	beq		1f
367*91f16700Schasinglulu	ldcopr16	r0, r1, CORTEX_A57_CPUACTLR
368*91f16700Schasinglulu	orr64_imm	r1, r1, CORTEX_A57_CPUACTLR_FORCE_FPSCR_FLUSH
369*91f16700Schasinglulu	stcopr16	r0, r1, CORTEX_A57_CPUACTLR
370*91f16700Schasinglulu1:
371*91f16700Schasinglulu	bx		lr
372*91f16700Schasingluluendfunc errata_a57_833471_wa
373*91f16700Schasinglulu
374*91f16700Schasinglulufunc check_errata_833471
375*91f16700Schasinglulu	mov	r1, #0x12
376*91f16700Schasinglulu	b	cpu_rev_var_ls
377*91f16700Schasingluluendfunc check_errata_833471
378*91f16700Schasinglulu
379*91f16700Schasingluluadd_erratum_entry cortex_a57, ERRATUM(833471), ERRATA_A57_833471
380*91f16700Schasinglulu
381*91f16700Schasinglulu	/* ---------------------------------------------------
382*91f16700Schasinglulu	 * Errata Workaround for Cortex A57 Errata #859972.
383*91f16700Schasinglulu	 * This applies only to revision <= r1p3 of Cortex A57.
384*91f16700Schasinglulu	 * Inputs:
385*91f16700Schasinglulu	 * r0: variant[4:7] and revision[0:3] of current cpu.
386*91f16700Schasinglulu	 * Shall clobber: r0-r3
387*91f16700Schasinglulu	 * ---------------------------------------------------
388*91f16700Schasinglulu	 */
389*91f16700Schasinglulufunc errata_a57_859972_wa
390*91f16700Schasinglulu	mov		r2, lr
391*91f16700Schasinglulu	bl		check_errata_859972
392*91f16700Schasinglulu	mov		lr, r2
393*91f16700Schasinglulu	cmp		r0, #ERRATA_NOT_APPLIES
394*91f16700Schasinglulu	beq		1f
395*91f16700Schasinglulu	ldcopr16	r0, r1, CORTEX_A57_CPUACTLR
396*91f16700Schasinglulu	orr64_imm	r1, r1, CORTEX_A57_CPUACTLR_DIS_INSTR_PREFETCH
397*91f16700Schasinglulu	stcopr16	r0, r1, CORTEX_A57_CPUACTLR
398*91f16700Schasinglulu1:
399*91f16700Schasinglulu	bx		lr
400*91f16700Schasingluluendfunc errata_a57_859972_wa
401*91f16700Schasinglulu
402*91f16700Schasinglulufunc check_errata_859972
403*91f16700Schasinglulu	mov	r1, #0x13
404*91f16700Schasinglulu	b	cpu_rev_var_ls
405*91f16700Schasingluluendfunc check_errata_859972
406*91f16700Schasinglulu
407*91f16700Schasingluluadd_erratum_entry cortex_a57, ERRATUM(859972), ERRATA_A57_859972
408*91f16700Schasinglulu
409*91f16700Schasinglulufunc check_errata_cve_2017_5715
410*91f16700Schasinglulu	mov	r0, #ERRATA_MISSING
411*91f16700Schasinglulu	bx	lr
412*91f16700Schasingluluendfunc check_errata_cve_2017_5715
413*91f16700Schasinglulu
414*91f16700Schasingluluadd_erratum_entry cortex_a57, CVE(2017, 5715), WORKAROUND_CVE_2017_5715
415*91f16700Schasinglulu
416*91f16700Schasinglulufunc check_errata_cve_2018_3639
417*91f16700Schasinglulu#if WORKAROUND_CVE_2018_3639
418*91f16700Schasinglulu	mov	r0, #ERRATA_APPLIES
419*91f16700Schasinglulu#else
420*91f16700Schasinglulu	mov	r0, #ERRATA_MISSING
421*91f16700Schasinglulu#endif
422*91f16700Schasinglulu	bx	lr
423*91f16700Schasingluluendfunc check_errata_cve_2018_3639
424*91f16700Schasinglulu
425*91f16700Schasingluluadd_erratum_entry cortex_a57, CVE(2018, 3639), WORKAROUND_CVE_2018_3639
426*91f16700Schasinglulu
427*91f16700Schasinglulufunc check_errata_cve_2022_23960
428*91f16700Schasinglulu	mov	r0, #ERRATA_MISSING
429*91f16700Schasinglulu	bx	lr
430*91f16700Schasingluluendfunc check_errata_cve_2022_23960
431*91f16700Schasinglulu
432*91f16700Schasingluluadd_erratum_entry cortex_a57, CVE(2022, 23960), WORKAROUND_CVE_2022_23960
433*91f16700Schasinglulu
434*91f16700Schasinglulu	/* -------------------------------------------------
435*91f16700Schasinglulu	 * The CPU Ops reset function for Cortex-A57.
436*91f16700Schasinglulu	 * Shall clobber: r0-r6
437*91f16700Schasinglulu	 * -------------------------------------------------
438*91f16700Schasinglulu	 */
439*91f16700Schasinglulufunc cortex_a57_reset_func
440*91f16700Schasinglulu	mov	r5, lr
441*91f16700Schasinglulu	bl	cpu_get_rev_var
442*91f16700Schasinglulu	mov	r4, r0
443*91f16700Schasinglulu
444*91f16700Schasinglulu#if ERRATA_A57_806969
445*91f16700Schasinglulu	mov	r0, r4
446*91f16700Schasinglulu	bl	errata_a57_806969_wa
447*91f16700Schasinglulu#endif
448*91f16700Schasinglulu
449*91f16700Schasinglulu#if ERRATA_A57_813420
450*91f16700Schasinglulu	mov	r0, r4
451*91f16700Schasinglulu	bl	errata_a57_813420_wa
452*91f16700Schasinglulu#endif
453*91f16700Schasinglulu
454*91f16700Schasinglulu#if ERRATA_A57_814670
455*91f16700Schasinglulu	mov	r0, r4
456*91f16700Schasinglulu	bl	errata_a57_814670_wa
457*91f16700Schasinglulu#endif
458*91f16700Schasinglulu
459*91f16700Schasinglulu#if A57_DISABLE_NON_TEMPORAL_HINT
460*91f16700Schasinglulu	mov	r0, r4
461*91f16700Schasinglulu	bl	a57_disable_ldnp_overread
462*91f16700Schasinglulu#endif
463*91f16700Schasinglulu
464*91f16700Schasinglulu#if ERRATA_A57_826974
465*91f16700Schasinglulu	mov	r0, r4
466*91f16700Schasinglulu	bl	errata_a57_826974_wa
467*91f16700Schasinglulu#endif
468*91f16700Schasinglulu
469*91f16700Schasinglulu#if ERRATA_A57_826977
470*91f16700Schasinglulu	mov	r0, r4
471*91f16700Schasinglulu	bl	errata_a57_826977_wa
472*91f16700Schasinglulu#endif
473*91f16700Schasinglulu
474*91f16700Schasinglulu#if ERRATA_A57_828024
475*91f16700Schasinglulu	mov	r0, r4
476*91f16700Schasinglulu	bl	errata_a57_828024_wa
477*91f16700Schasinglulu#endif
478*91f16700Schasinglulu
479*91f16700Schasinglulu#if ERRATA_A57_829520
480*91f16700Schasinglulu	mov	r0, r4
481*91f16700Schasinglulu	bl	errata_a57_829520_wa
482*91f16700Schasinglulu#endif
483*91f16700Schasinglulu
484*91f16700Schasinglulu#if ERRATA_A57_833471
485*91f16700Schasinglulu	mov	r0, r4
486*91f16700Schasinglulu	bl	errata_a57_833471_wa
487*91f16700Schasinglulu#endif
488*91f16700Schasinglulu
489*91f16700Schasinglulu#if ERRATA_A57_859972
490*91f16700Schasinglulu	mov	r0, r4
491*91f16700Schasinglulu	bl	errata_a57_859972_wa
492*91f16700Schasinglulu#endif
493*91f16700Schasinglulu
494*91f16700Schasinglulu#if WORKAROUND_CVE_2018_3639
495*91f16700Schasinglulu	ldcopr16	r0, r1, CORTEX_A57_CPUACTLR
496*91f16700Schasinglulu	orr64_imm	r0, r1, CORTEX_A57_CPUACTLR_DIS_LOAD_PASS_STORE
497*91f16700Schasinglulu	stcopr16	r0, r1, CORTEX_A57_CPUACTLR
498*91f16700Schasinglulu	isb
499*91f16700Schasinglulu	dsb	sy
500*91f16700Schasinglulu#endif
501*91f16700Schasinglulu
502*91f16700Schasinglulu	/* ---------------------------------------------
503*91f16700Schasinglulu	 * Enable the SMP bit.
504*91f16700Schasinglulu	 * ---------------------------------------------
505*91f16700Schasinglulu	 */
506*91f16700Schasinglulu	ldcopr16	r0, r1, CORTEX_A57_ECTLR
507*91f16700Schasinglulu	orr64_imm	r0, r1, CORTEX_A57_ECTLR_SMP_BIT
508*91f16700Schasinglulu	stcopr16	r0, r1,	CORTEX_A57_ECTLR
509*91f16700Schasinglulu	isb
510*91f16700Schasinglulu	bx	r5
511*91f16700Schasingluluendfunc cortex_a57_reset_func
512*91f16700Schasinglulu
513*91f16700Schasinglulu	/* ----------------------------------------------------
514*91f16700Schasinglulu	 * The CPU Ops core power down function for Cortex-A57.
515*91f16700Schasinglulu	 * ----------------------------------------------------
516*91f16700Schasinglulu	 */
517*91f16700Schasinglulufunc cortex_a57_core_pwr_dwn
518*91f16700Schasinglulu	push	{r12, lr}
519*91f16700Schasinglulu
520*91f16700Schasinglulu	/* Assert if cache is enabled */
521*91f16700Schasinglulu#if ENABLE_ASSERTIONS
522*91f16700Schasinglulu	ldcopr	r0, SCTLR
523*91f16700Schasinglulu	tst	r0, #SCTLR_C_BIT
524*91f16700Schasinglulu	ASM_ASSERT(eq)
525*91f16700Schasinglulu#endif
526*91f16700Schasinglulu
527*91f16700Schasinglulu	/* ---------------------------------------------
528*91f16700Schasinglulu	 * Disable the L2 prefetches.
529*91f16700Schasinglulu	 * ---------------------------------------------
530*91f16700Schasinglulu	 */
531*91f16700Schasinglulu	bl	cortex_a57_disable_l2_prefetch
532*91f16700Schasinglulu
533*91f16700Schasinglulu	/* ---------------------------------------------
534*91f16700Schasinglulu	 * Flush L1 caches.
535*91f16700Schasinglulu	 * ---------------------------------------------
536*91f16700Schasinglulu	 */
537*91f16700Schasinglulu	mov	r0, #DC_OP_CISW
538*91f16700Schasinglulu	bl	dcsw_op_level1
539*91f16700Schasinglulu
540*91f16700Schasinglulu	/* ---------------------------------------------
541*91f16700Schasinglulu	 * Come out of intra cluster coherency
542*91f16700Schasinglulu	 * ---------------------------------------------
543*91f16700Schasinglulu	 */
544*91f16700Schasinglulu	bl	cortex_a57_disable_smp
545*91f16700Schasinglulu
546*91f16700Schasinglulu	/* ---------------------------------------------
547*91f16700Schasinglulu	 * Force the debug interfaces to be quiescent
548*91f16700Schasinglulu	 * ---------------------------------------------
549*91f16700Schasinglulu	 */
550*91f16700Schasinglulu	pop	{r12, lr}
551*91f16700Schasinglulu	b	cortex_a57_disable_ext_debug
552*91f16700Schasingluluendfunc cortex_a57_core_pwr_dwn
553*91f16700Schasinglulu
554*91f16700Schasinglulu	/* -------------------------------------------------------
555*91f16700Schasinglulu	 * The CPU Ops cluster power down function for Cortex-A57.
556*91f16700Schasinglulu	 * Clobbers: r0-r3
557*91f16700Schasinglulu	 * -------------------------------------------------------
558*91f16700Schasinglulu	 */
559*91f16700Schasinglulufunc cortex_a57_cluster_pwr_dwn
560*91f16700Schasinglulu	push	{r12, lr}
561*91f16700Schasinglulu
562*91f16700Schasinglulu	/* Assert if cache is enabled */
563*91f16700Schasinglulu#if ENABLE_ASSERTIONS
564*91f16700Schasinglulu	ldcopr	r0, SCTLR
565*91f16700Schasinglulu	tst	r0, #SCTLR_C_BIT
566*91f16700Schasinglulu	ASM_ASSERT(eq)
567*91f16700Schasinglulu#endif
568*91f16700Schasinglulu
569*91f16700Schasinglulu	/* ---------------------------------------------
570*91f16700Schasinglulu	 * Disable the L2 prefetches.
571*91f16700Schasinglulu	 * ---------------------------------------------
572*91f16700Schasinglulu	 */
573*91f16700Schasinglulu	bl	cortex_a57_disable_l2_prefetch
574*91f16700Schasinglulu
575*91f16700Schasinglulu	/* ---------------------------------------------
576*91f16700Schasinglulu	 * Flush L1 caches.
577*91f16700Schasinglulu	 * ---------------------------------------------
578*91f16700Schasinglulu	 */
579*91f16700Schasinglulu	mov	r0, #DC_OP_CISW
580*91f16700Schasinglulu	bl	dcsw_op_level1
581*91f16700Schasinglulu
582*91f16700Schasinglulu	/* ---------------------------------------------
583*91f16700Schasinglulu	 * Disable the optional ACP.
584*91f16700Schasinglulu	 * ---------------------------------------------
585*91f16700Schasinglulu	 */
586*91f16700Schasinglulu	bl	plat_disable_acp
587*91f16700Schasinglulu
588*91f16700Schasinglulu	/* ---------------------------------------------
589*91f16700Schasinglulu	 * Flush L2 caches.
590*91f16700Schasinglulu	 * ---------------------------------------------
591*91f16700Schasinglulu	 */
592*91f16700Schasinglulu	mov	r0, #DC_OP_CISW
593*91f16700Schasinglulu	bl	dcsw_op_level2
594*91f16700Schasinglulu
595*91f16700Schasinglulu	/* ---------------------------------------------
596*91f16700Schasinglulu	 * Come out of intra cluster coherency
597*91f16700Schasinglulu	 * ---------------------------------------------
598*91f16700Schasinglulu	 */
599*91f16700Schasinglulu	bl	cortex_a57_disable_smp
600*91f16700Schasinglulu
601*91f16700Schasinglulu	/* ---------------------------------------------
602*91f16700Schasinglulu	 * Force the debug interfaces to be quiescent
603*91f16700Schasinglulu	 * ---------------------------------------------
604*91f16700Schasinglulu	 */
605*91f16700Schasinglulu	pop	{r12, lr}
606*91f16700Schasinglulu	b	cortex_a57_disable_ext_debug
607*91f16700Schasingluluendfunc cortex_a57_cluster_pwr_dwn
608*91f16700Schasinglulu
609*91f16700Schasingluluerrata_report_shim cortex_a57
610*91f16700Schasinglulu
611*91f16700Schasingluludeclare_cpu_ops cortex_a57, CORTEX_A57_MIDR, \
612*91f16700Schasinglulu	cortex_a57_reset_func, \
613*91f16700Schasinglulu	cortex_a57_core_pwr_dwn, \
614*91f16700Schasinglulu	cortex_a57_cluster_pwr_dwn
615