xref: /aosp_15_r20/external/arm-trusted-firmware/lib/cpus/aarch64/neoverse_n1.S (revision 54fd6939e177f8ff529b10183254802c76df6d08)
1*54fd6939SJiyong Park/*
2*54fd6939SJiyong Park * Copyright (c) 2017-2021, Arm Limited and Contributors. All rights reserved.
3*54fd6939SJiyong Park *
4*54fd6939SJiyong Park * SPDX-License-Identifier: BSD-3-Clause
5*54fd6939SJiyong Park */
6*54fd6939SJiyong Park
7*54fd6939SJiyong Park#include <arch.h>
8*54fd6939SJiyong Park#include <asm_macros.S>
9*54fd6939SJiyong Park#include <cpuamu.h>
10*54fd6939SJiyong Park#include <cpu_macros.S>
11*54fd6939SJiyong Park#include <context.h>
12*54fd6939SJiyong Park#include <neoverse_n1.h>
13*54fd6939SJiyong Park
14*54fd6939SJiyong Park/* Hardware handled coherency */
15*54fd6939SJiyong Park#if HW_ASSISTED_COHERENCY == 0
16*54fd6939SJiyong Park#error "Neoverse N1 must be compiled with HW_ASSISTED_COHERENCY enabled"
17*54fd6939SJiyong Park#endif
18*54fd6939SJiyong Park
19*54fd6939SJiyong Park/* 64-bit only core */
20*54fd6939SJiyong Park#if CTX_INCLUDE_AARCH32_REGS == 1
21*54fd6939SJiyong Park#error "Neoverse-N1 supports only AArch64. Compile with CTX_INCLUDE_AARCH32_REGS=0"
22*54fd6939SJiyong Park#endif
23*54fd6939SJiyong Park
24*54fd6939SJiyong Park	.global neoverse_n1_errata_ic_trap_handler
25*54fd6939SJiyong Park
26*54fd6939SJiyong Park/* --------------------------------------------------
27*54fd6939SJiyong Park * Errata Workaround for Neoverse N1 Erratum 1043202.
28*54fd6939SJiyong Park * This applies to revision r0p0 and r1p0 of Neoverse N1.
29*54fd6939SJiyong Park * Inputs:
30*54fd6939SJiyong Park * x0: variant[4:7] and revision[0:3] of current cpu.
31*54fd6939SJiyong Park * Shall clobber: x0-x17
32*54fd6939SJiyong Park * --------------------------------------------------
33*54fd6939SJiyong Park */
34*54fd6939SJiyong Parkfunc errata_n1_1043202_wa
35*54fd6939SJiyong Park	/* Compare x0 against revision r1p0 */
36*54fd6939SJiyong Park	mov	x17, x30
37*54fd6939SJiyong Park	bl	check_errata_1043202
38*54fd6939SJiyong Park	cbz	x0, 1f
39*54fd6939SJiyong Park
40*54fd6939SJiyong Park	/* Apply instruction patching sequence */
41*54fd6939SJiyong Park	ldr	x0, =0x0
42*54fd6939SJiyong Park	msr	CPUPSELR_EL3, x0
43*54fd6939SJiyong Park	ldr	x0, =0xF3BF8F2F
44*54fd6939SJiyong Park	msr	CPUPOR_EL3, x0
45*54fd6939SJiyong Park	ldr	x0, =0xFFFFFFFF
46*54fd6939SJiyong Park	msr	CPUPMR_EL3, x0
47*54fd6939SJiyong Park	ldr	x0, =0x800200071
48*54fd6939SJiyong Park	msr	CPUPCR_EL3, x0
49*54fd6939SJiyong Park	isb
50*54fd6939SJiyong Park1:
51*54fd6939SJiyong Park	ret	x17
52*54fd6939SJiyong Parkendfunc errata_n1_1043202_wa
53*54fd6939SJiyong Park
54*54fd6939SJiyong Parkfunc check_errata_1043202
55*54fd6939SJiyong Park	/* Applies to r0p0 and r1p0 */
56*54fd6939SJiyong Park	mov	x1, #0x10
57*54fd6939SJiyong Park	b	cpu_rev_var_ls
58*54fd6939SJiyong Parkendfunc check_errata_1043202
59*54fd6939SJiyong Park
60*54fd6939SJiyong Park/* --------------------------------------------------
61*54fd6939SJiyong Park * Disable speculative loads if Neoverse N1 supports
62*54fd6939SJiyong Park * SSBS.
63*54fd6939SJiyong Park *
64*54fd6939SJiyong Park * Shall clobber: x0.
65*54fd6939SJiyong Park * --------------------------------------------------
66*54fd6939SJiyong Park */
67*54fd6939SJiyong Parkfunc neoverse_n1_disable_speculative_loads
68*54fd6939SJiyong Park	/* Check if the PE implements SSBS */
69*54fd6939SJiyong Park	mrs	x0, id_aa64pfr1_el1
70*54fd6939SJiyong Park	tst	x0, #(ID_AA64PFR1_EL1_SSBS_MASK << ID_AA64PFR1_EL1_SSBS_SHIFT)
71*54fd6939SJiyong Park	b.eq	1f
72*54fd6939SJiyong Park
73*54fd6939SJiyong Park	/* Disable speculative loads */
74*54fd6939SJiyong Park	msr	SSBS, xzr
75*54fd6939SJiyong Park
76*54fd6939SJiyong Park1:
77*54fd6939SJiyong Park	ret
78*54fd6939SJiyong Parkendfunc neoverse_n1_disable_speculative_loads
79*54fd6939SJiyong Park
80*54fd6939SJiyong Park/* --------------------------------------------------
81*54fd6939SJiyong Park * Errata Workaround for Neoverse N1 Errata #1073348
82*54fd6939SJiyong Park * This applies to revision r0p0 and r1p0 of Neoverse N1.
83*54fd6939SJiyong Park * Inputs:
84*54fd6939SJiyong Park * x0: variant[4:7] and revision[0:3] of current cpu.
85*54fd6939SJiyong Park * Shall clobber: x0-x17
86*54fd6939SJiyong Park * --------------------------------------------------
87*54fd6939SJiyong Park */
88*54fd6939SJiyong Parkfunc errata_n1_1073348_wa
89*54fd6939SJiyong Park	/* Compare x0 against revision r1p0 */
90*54fd6939SJiyong Park	mov	x17, x30
91*54fd6939SJiyong Park	bl	check_errata_1073348
92*54fd6939SJiyong Park	cbz	x0, 1f
93*54fd6939SJiyong Park	mrs	x1, NEOVERSE_N1_CPUACTLR_EL1
94*54fd6939SJiyong Park	orr	x1, x1, NEOVERSE_N1_CPUACTLR_EL1_BIT_6
95*54fd6939SJiyong Park	msr	NEOVERSE_N1_CPUACTLR_EL1, x1
96*54fd6939SJiyong Park1:
97*54fd6939SJiyong Park	ret	x17
98*54fd6939SJiyong Parkendfunc errata_n1_1073348_wa
99*54fd6939SJiyong Park
100*54fd6939SJiyong Parkfunc check_errata_1073348
101*54fd6939SJiyong Park	/* Applies to r0p0 and r1p0 */
102*54fd6939SJiyong Park	mov	x1, #0x10
103*54fd6939SJiyong Park	b	cpu_rev_var_ls
104*54fd6939SJiyong Parkendfunc check_errata_1073348
105*54fd6939SJiyong Park
106*54fd6939SJiyong Park/* --------------------------------------------------
107*54fd6939SJiyong Park * Errata Workaround for Neoverse N1 Errata #1130799
108*54fd6939SJiyong Park * This applies to revision <=r2p0 of Neoverse N1.
109*54fd6939SJiyong Park * Inputs:
110*54fd6939SJiyong Park * x0: variant[4:7] and revision[0:3] of current cpu.
111*54fd6939SJiyong Park * Shall clobber: x0-x17
112*54fd6939SJiyong Park * --------------------------------------------------
113*54fd6939SJiyong Park */
114*54fd6939SJiyong Parkfunc errata_n1_1130799_wa
115*54fd6939SJiyong Park	/* Compare x0 against revision r2p0 */
116*54fd6939SJiyong Park	mov	x17, x30
117*54fd6939SJiyong Park	bl	check_errata_1130799
118*54fd6939SJiyong Park	cbz	x0, 1f
119*54fd6939SJiyong Park	mrs	x1, NEOVERSE_N1_CPUACTLR2_EL1
120*54fd6939SJiyong Park	orr	x1, x1, NEOVERSE_N1_CPUACTLR2_EL1_BIT_59
121*54fd6939SJiyong Park	msr	NEOVERSE_N1_CPUACTLR2_EL1, x1
122*54fd6939SJiyong Park1:
123*54fd6939SJiyong Park	ret	x17
124*54fd6939SJiyong Parkendfunc errata_n1_1130799_wa
125*54fd6939SJiyong Park
126*54fd6939SJiyong Parkfunc check_errata_1130799
127*54fd6939SJiyong Park	/* Applies to <=r2p0 */
128*54fd6939SJiyong Park	mov	x1, #0x20
129*54fd6939SJiyong Park	b	cpu_rev_var_ls
130*54fd6939SJiyong Parkendfunc check_errata_1130799
131*54fd6939SJiyong Park
132*54fd6939SJiyong Park/* --------------------------------------------------
133*54fd6939SJiyong Park * Errata Workaround for Neoverse N1 Errata #1165347
134*54fd6939SJiyong Park * This applies to revision <=r2p0 of Neoverse N1.
135*54fd6939SJiyong Park * Inputs:
136*54fd6939SJiyong Park * x0: variant[4:7] and revision[0:3] of current cpu.
137*54fd6939SJiyong Park * Shall clobber: x0-x17
138*54fd6939SJiyong Park * --------------------------------------------------
139*54fd6939SJiyong Park */
140*54fd6939SJiyong Parkfunc errata_n1_1165347_wa
141*54fd6939SJiyong Park	/* Compare x0 against revision r2p0 */
142*54fd6939SJiyong Park	mov	x17, x30
143*54fd6939SJiyong Park	bl	check_errata_1165347
144*54fd6939SJiyong Park	cbz	x0, 1f
145*54fd6939SJiyong Park	mrs	x1, NEOVERSE_N1_CPUACTLR2_EL1
146*54fd6939SJiyong Park	orr	x1, x1, NEOVERSE_N1_CPUACTLR2_EL1_BIT_0
147*54fd6939SJiyong Park	orr	x1, x1, NEOVERSE_N1_CPUACTLR2_EL1_BIT_15
148*54fd6939SJiyong Park	msr	NEOVERSE_N1_CPUACTLR2_EL1, x1
149*54fd6939SJiyong Park1:
150*54fd6939SJiyong Park	ret	x17
151*54fd6939SJiyong Parkendfunc errata_n1_1165347_wa
152*54fd6939SJiyong Park
153*54fd6939SJiyong Parkfunc check_errata_1165347
154*54fd6939SJiyong Park	/* Applies to <=r2p0 */
155*54fd6939SJiyong Park	mov	x1, #0x20
156*54fd6939SJiyong Park	b	cpu_rev_var_ls
157*54fd6939SJiyong Parkendfunc check_errata_1165347
158*54fd6939SJiyong Park
159*54fd6939SJiyong Park/* --------------------------------------------------
160*54fd6939SJiyong Park * Errata Workaround for Neoverse N1 Errata #1207823
161*54fd6939SJiyong Park * This applies to revision <=r2p0 of Neoverse N1.
162*54fd6939SJiyong Park * Inputs:
163*54fd6939SJiyong Park * x0: variant[4:7] and revision[0:3] of current cpu.
164*54fd6939SJiyong Park * Shall clobber: x0-x17
165*54fd6939SJiyong Park * --------------------------------------------------
166*54fd6939SJiyong Park */
167*54fd6939SJiyong Parkfunc errata_n1_1207823_wa
168*54fd6939SJiyong Park	/* Compare x0 against revision r2p0 */
169*54fd6939SJiyong Park	mov	x17, x30
170*54fd6939SJiyong Park	bl	check_errata_1207823
171*54fd6939SJiyong Park	cbz	x0, 1f
172*54fd6939SJiyong Park	mrs	x1, NEOVERSE_N1_CPUACTLR2_EL1
173*54fd6939SJiyong Park	orr	x1, x1, NEOVERSE_N1_CPUACTLR2_EL1_BIT_11
174*54fd6939SJiyong Park	msr	NEOVERSE_N1_CPUACTLR2_EL1, x1
175*54fd6939SJiyong Park1:
176*54fd6939SJiyong Park	ret	x17
177*54fd6939SJiyong Parkendfunc errata_n1_1207823_wa
178*54fd6939SJiyong Park
179*54fd6939SJiyong Parkfunc check_errata_1207823
180*54fd6939SJiyong Park	/* Applies to <=r2p0 */
181*54fd6939SJiyong Park	mov	x1, #0x20
182*54fd6939SJiyong Park	b	cpu_rev_var_ls
183*54fd6939SJiyong Parkendfunc check_errata_1207823
184*54fd6939SJiyong Park
185*54fd6939SJiyong Park/* --------------------------------------------------
186*54fd6939SJiyong Park * Errata Workaround for Neoverse N1 Errata #1220197
187*54fd6939SJiyong Park * This applies to revision <=r2p0 of Neoverse N1.
188*54fd6939SJiyong Park * Inputs:
189*54fd6939SJiyong Park * x0: variant[4:7] and revision[0:3] of current cpu.
190*54fd6939SJiyong Park * Shall clobber: x0-x17
191*54fd6939SJiyong Park * --------------------------------------------------
192*54fd6939SJiyong Park */
193*54fd6939SJiyong Parkfunc errata_n1_1220197_wa
194*54fd6939SJiyong Park	/* Compare x0 against revision r2p0 */
195*54fd6939SJiyong Park	mov	x17, x30
196*54fd6939SJiyong Park	bl	check_errata_1220197
197*54fd6939SJiyong Park	cbz	x0, 1f
198*54fd6939SJiyong Park	mrs	x1, NEOVERSE_N1_CPUECTLR_EL1
199*54fd6939SJiyong Park	orr	x1, x1, NEOVERSE_N1_WS_THR_L2_MASK
200*54fd6939SJiyong Park	msr	NEOVERSE_N1_CPUECTLR_EL1, x1
201*54fd6939SJiyong Park1:
202*54fd6939SJiyong Park	ret	x17
203*54fd6939SJiyong Parkendfunc errata_n1_1220197_wa
204*54fd6939SJiyong Park
205*54fd6939SJiyong Parkfunc check_errata_1220197
206*54fd6939SJiyong Park	/* Applies to <=r2p0 */
207*54fd6939SJiyong Park	mov	x1, #0x20
208*54fd6939SJiyong Park	b	cpu_rev_var_ls
209*54fd6939SJiyong Parkendfunc check_errata_1220197
210*54fd6939SJiyong Park
211*54fd6939SJiyong Park/* --------------------------------------------------
212*54fd6939SJiyong Park * Errata Workaround for Neoverse N1 Errata #1257314
213*54fd6939SJiyong Park * This applies to revision <=r3p0 of Neoverse N1.
214*54fd6939SJiyong Park * Inputs:
215*54fd6939SJiyong Park * x0: variant[4:7] and revision[0:3] of current cpu.
216*54fd6939SJiyong Park * Shall clobber: x0-x17
217*54fd6939SJiyong Park * --------------------------------------------------
218*54fd6939SJiyong Park */
219*54fd6939SJiyong Parkfunc errata_n1_1257314_wa
220*54fd6939SJiyong Park	/* Compare x0 against revision r3p0 */
221*54fd6939SJiyong Park	mov	x17, x30
222*54fd6939SJiyong Park	bl	check_errata_1257314
223*54fd6939SJiyong Park	cbz	x0, 1f
224*54fd6939SJiyong Park	mrs	x1, NEOVERSE_N1_CPUACTLR3_EL1
225*54fd6939SJiyong Park	orr	x1, x1, NEOVERSE_N1_CPUACTLR3_EL1_BIT_10
226*54fd6939SJiyong Park	msr	NEOVERSE_N1_CPUACTLR3_EL1, x1
227*54fd6939SJiyong Park1:
228*54fd6939SJiyong Park	ret	x17
229*54fd6939SJiyong Parkendfunc errata_n1_1257314_wa
230*54fd6939SJiyong Park
231*54fd6939SJiyong Parkfunc check_errata_1257314
232*54fd6939SJiyong Park	/* Applies to <=r3p0 */
233*54fd6939SJiyong Park	mov	x1, #0x30
234*54fd6939SJiyong Park	b	cpu_rev_var_ls
235*54fd6939SJiyong Parkendfunc check_errata_1257314
236*54fd6939SJiyong Park
237*54fd6939SJiyong Park/* --------------------------------------------------
238*54fd6939SJiyong Park * Errata Workaround for Neoverse N1 Errata #1262606
239*54fd6939SJiyong Park * This applies to revision <=r3p0 of Neoverse N1.
240*54fd6939SJiyong Park * Inputs:
241*54fd6939SJiyong Park * x0: variant[4:7] and revision[0:3] of current cpu.
242*54fd6939SJiyong Park * Shall clobber: x0-x17
243*54fd6939SJiyong Park * --------------------------------------------------
244*54fd6939SJiyong Park */
245*54fd6939SJiyong Parkfunc errata_n1_1262606_wa
246*54fd6939SJiyong Park	/* Compare x0 against revision r3p0 */
247*54fd6939SJiyong Park	mov	x17, x30
248*54fd6939SJiyong Park	bl	check_errata_1262606
249*54fd6939SJiyong Park	cbz	x0, 1f
250*54fd6939SJiyong Park	mrs	x1, NEOVERSE_N1_CPUACTLR_EL1
251*54fd6939SJiyong Park	orr	x1, x1, NEOVERSE_N1_CPUACTLR_EL1_BIT_13
252*54fd6939SJiyong Park	msr	NEOVERSE_N1_CPUACTLR_EL1, x1
253*54fd6939SJiyong Park1:
254*54fd6939SJiyong Park	ret	x17
255*54fd6939SJiyong Parkendfunc errata_n1_1262606_wa
256*54fd6939SJiyong Park
257*54fd6939SJiyong Parkfunc check_errata_1262606
258*54fd6939SJiyong Park	/* Applies to <=r3p0 */
259*54fd6939SJiyong Park	mov	x1, #0x30
260*54fd6939SJiyong Park	b	cpu_rev_var_ls
261*54fd6939SJiyong Parkendfunc check_errata_1262606
262*54fd6939SJiyong Park
263*54fd6939SJiyong Park/* --------------------------------------------------
264*54fd6939SJiyong Park * Errata Workaround for Neoverse N1 Errata #1262888
265*54fd6939SJiyong Park * This applies to revision <=r3p0 of Neoverse N1.
266*54fd6939SJiyong Park * Inputs:
267*54fd6939SJiyong Park * x0: variant[4:7] and revision[0:3] of current cpu.
268*54fd6939SJiyong Park * Shall clobber: x0-x17
269*54fd6939SJiyong Park * --------------------------------------------------
270*54fd6939SJiyong Park */
271*54fd6939SJiyong Parkfunc errata_n1_1262888_wa
272*54fd6939SJiyong Park	/* Compare x0 against revision r3p0 */
273*54fd6939SJiyong Park	mov	x17, x30
274*54fd6939SJiyong Park	bl	check_errata_1262888
275*54fd6939SJiyong Park	cbz	x0, 1f
276*54fd6939SJiyong Park	mrs	x1, NEOVERSE_N1_CPUECTLR_EL1
277*54fd6939SJiyong Park	orr	x1, x1, NEOVERSE_N1_CPUECTLR_EL1_MM_TLBPF_DIS_BIT
278*54fd6939SJiyong Park	msr	NEOVERSE_N1_CPUECTLR_EL1, x1
279*54fd6939SJiyong Park1:
280*54fd6939SJiyong Park	ret	x17
281*54fd6939SJiyong Parkendfunc errata_n1_1262888_wa
282*54fd6939SJiyong Park
283*54fd6939SJiyong Parkfunc check_errata_1262888
284*54fd6939SJiyong Park	/* Applies to <=r3p0 */
285*54fd6939SJiyong Park	mov	x1, #0x30
286*54fd6939SJiyong Park	b	cpu_rev_var_ls
287*54fd6939SJiyong Parkendfunc check_errata_1262888
288*54fd6939SJiyong Park
289*54fd6939SJiyong Park/* --------------------------------------------------
290*54fd6939SJiyong Park * Errata Workaround for Neoverse N1 Errata #1275112
291*54fd6939SJiyong Park * This applies to revision <=r3p0 of Neoverse N1.
292*54fd6939SJiyong Park * Inputs:
293*54fd6939SJiyong Park * x0: variant[4:7] and revision[0:3] of current cpu.
294*54fd6939SJiyong Park * Shall clobber: x0-x17
295*54fd6939SJiyong Park * --------------------------------------------------
296*54fd6939SJiyong Park */
297*54fd6939SJiyong Parkfunc errata_n1_1275112_wa
298*54fd6939SJiyong Park	/* Compare x0 against revision r3p0 */
299*54fd6939SJiyong Park	mov	x17, x30
300*54fd6939SJiyong Park	bl	check_errata_1275112
301*54fd6939SJiyong Park	cbz	x0, 1f
302*54fd6939SJiyong Park	mrs	x1, NEOVERSE_N1_CPUACTLR_EL1
303*54fd6939SJiyong Park	orr	x1, x1, NEOVERSE_N1_CPUACTLR_EL1_BIT_13
304*54fd6939SJiyong Park	msr	NEOVERSE_N1_CPUACTLR_EL1, x1
305*54fd6939SJiyong Park1:
306*54fd6939SJiyong Park	ret	x17
307*54fd6939SJiyong Parkendfunc errata_n1_1275112_wa
308*54fd6939SJiyong Park
309*54fd6939SJiyong Parkfunc check_errata_1275112
310*54fd6939SJiyong Park	/* Applies to <=r3p0 */
311*54fd6939SJiyong Park	mov	x1, #0x30
312*54fd6939SJiyong Park	b	cpu_rev_var_ls
313*54fd6939SJiyong Parkendfunc check_errata_1275112
314*54fd6939SJiyong Park
315*54fd6939SJiyong Park/* --------------------------------------------------
316*54fd6939SJiyong Park * Errata Workaround for Neoverse N1 Erratum 1315703.
317*54fd6939SJiyong Park * This applies to revision <= r3p0 of Neoverse N1.
318*54fd6939SJiyong Park * Inputs:
319*54fd6939SJiyong Park * x0: variant[4:7] and revision[0:3] of current cpu.
320*54fd6939SJiyong Park * Shall clobber: x0-x17
321*54fd6939SJiyong Park * --------------------------------------------------
322*54fd6939SJiyong Park */
323*54fd6939SJiyong Parkfunc errata_n1_1315703_wa
324*54fd6939SJiyong Park	/* Compare x0 against revision r3p1 */
325*54fd6939SJiyong Park	mov	x17, x30
326*54fd6939SJiyong Park	bl	check_errata_1315703
327*54fd6939SJiyong Park	cbz	x0, 1f
328*54fd6939SJiyong Park
329*54fd6939SJiyong Park	mrs	x0, NEOVERSE_N1_CPUACTLR2_EL1
330*54fd6939SJiyong Park	orr	x0, x0, #NEOVERSE_N1_CPUACTLR2_EL1_BIT_16
331*54fd6939SJiyong Park	msr	NEOVERSE_N1_CPUACTLR2_EL1, x0
332*54fd6939SJiyong Park
333*54fd6939SJiyong Park1:
334*54fd6939SJiyong Park	ret	x17
335*54fd6939SJiyong Parkendfunc errata_n1_1315703_wa
336*54fd6939SJiyong Park
337*54fd6939SJiyong Parkfunc check_errata_1315703
338*54fd6939SJiyong Park	/* Applies to everything <= r3p0. */
339*54fd6939SJiyong Park	mov	x1, #0x30
340*54fd6939SJiyong Park	b	cpu_rev_var_ls
341*54fd6939SJiyong Parkendfunc check_errata_1315703
342*54fd6939SJiyong Park
343*54fd6939SJiyong Park/* --------------------------------------------------
344*54fd6939SJiyong Park * Errata Workaround for Neoverse N1 Erratum 1542419.
345*54fd6939SJiyong Park * This applies to revisions r3p0 - r4p0 of Neoverse N1
346*54fd6939SJiyong Park * Inputs:
347*54fd6939SJiyong Park * x0: variant[4:7] and revision[0:3] of current cpu.
348*54fd6939SJiyong Park * Shall clobber: x0-x17
349*54fd6939SJiyong Park * --------------------------------------------------
350*54fd6939SJiyong Park */
351*54fd6939SJiyong Parkfunc errata_n1_1542419_wa
352*54fd6939SJiyong Park	/* Compare x0 against revision r3p0 and r4p0 */
353*54fd6939SJiyong Park	mov	x17, x30
354*54fd6939SJiyong Park	bl	check_errata_1542419
355*54fd6939SJiyong Park	cbz	x0, 1f
356*54fd6939SJiyong Park
357*54fd6939SJiyong Park	/* Apply instruction patching sequence */
358*54fd6939SJiyong Park	ldr	x0, =0x0
359*54fd6939SJiyong Park	msr	CPUPSELR_EL3, x0
360*54fd6939SJiyong Park	ldr	x0, =0xEE670D35
361*54fd6939SJiyong Park	msr	CPUPOR_EL3, x0
362*54fd6939SJiyong Park	ldr	x0, =0xFFFF0FFF
363*54fd6939SJiyong Park	msr	CPUPMR_EL3, x0
364*54fd6939SJiyong Park	ldr	x0, =0x08000020007D
365*54fd6939SJiyong Park	msr	CPUPCR_EL3, x0
366*54fd6939SJiyong Park	isb
367*54fd6939SJiyong Park1:
368*54fd6939SJiyong Park	ret	x17
369*54fd6939SJiyong Parkendfunc errata_n1_1542419_wa
370*54fd6939SJiyong Park
371*54fd6939SJiyong Parkfunc check_errata_1542419
372*54fd6939SJiyong Park	/* Applies to everything r3p0 - r4p0. */
373*54fd6939SJiyong Park	mov	x1, #0x30
374*54fd6939SJiyong Park	mov	x2, #0x40
375*54fd6939SJiyong Park	b	cpu_rev_var_range
376*54fd6939SJiyong Parkendfunc check_errata_1542419
377*54fd6939SJiyong Park
378*54fd6939SJiyong Park	/* --------------------------------------------------
379*54fd6939SJiyong Park	 * Errata Workaround for Neoverse N1 Errata #1868343.
380*54fd6939SJiyong Park	 * This applies to revision <= r4p0 of Neoverse N1.
381*54fd6939SJiyong Park	 * This workaround is the same as the workaround for
382*54fd6939SJiyong Park	 * errata 1262606 and 1275112 but applies to a wider
383*54fd6939SJiyong Park	 * revision range.
384*54fd6939SJiyong Park	 * Inputs:
385*54fd6939SJiyong Park	 * x0: variant[4:7] and revision[0:3] of current cpu.
386*54fd6939SJiyong Park	 * Shall clobber: x0-x17
387*54fd6939SJiyong Park	 * --------------------------------------------------
388*54fd6939SJiyong Park	 */
389*54fd6939SJiyong Parkfunc errata_n1_1868343_wa
390*54fd6939SJiyong Park	/*
391*54fd6939SJiyong Park	 * Compare x0 against revision r4p0
392*54fd6939SJiyong Park	 */
393*54fd6939SJiyong Park	mov	x17, x30
394*54fd6939SJiyong Park	bl	check_errata_1868343
395*54fd6939SJiyong Park	cbz	x0, 1f
396*54fd6939SJiyong Park	mrs	x1, NEOVERSE_N1_CPUACTLR_EL1
397*54fd6939SJiyong Park	orr	x1, x1, NEOVERSE_N1_CPUACTLR_EL1_BIT_13
398*54fd6939SJiyong Park	msr	NEOVERSE_N1_CPUACTLR_EL1, x1
399*54fd6939SJiyong Park	isb
400*54fd6939SJiyong Park1:
401*54fd6939SJiyong Park	ret	x17
402*54fd6939SJiyong Parkendfunc errata_n1_1868343_wa
403*54fd6939SJiyong Park
404*54fd6939SJiyong Parkfunc check_errata_1868343
405*54fd6939SJiyong Park	/* Applies to everything <= r4p0 */
406*54fd6939SJiyong Park	mov	x1, #0x40
407*54fd6939SJiyong Park	b	cpu_rev_var_ls
408*54fd6939SJiyong Parkendfunc check_errata_1868343
409*54fd6939SJiyong Park
410*54fd6939SJiyong Park	/* --------------------------------------------------
411*54fd6939SJiyong Park	 * Errata Workaround for Neoverse N1 Errata #1946160.
412*54fd6939SJiyong Park	 * This applies to revisions r3p0, r3p1, r4p0, and
413*54fd6939SJiyong Park	 * r4p1 of Neoverse N1. It also exists in r0p0, r1p0,
414*54fd6939SJiyong Park	 * and r2p0 but there is no fix in these revisions.
415*54fd6939SJiyong Park	 * Inputs:
416*54fd6939SJiyong Park	 * x0: variant[4:7] and revision[0:3] of current cpu.
417*54fd6939SJiyong Park	 * Shall clobber: x0-x17
418*54fd6939SJiyong Park	 * --------------------------------------------------
419*54fd6939SJiyong Park	 */
420*54fd6939SJiyong Parkfunc errata_n1_1946160_wa
421*54fd6939SJiyong Park	/*
422*54fd6939SJiyong Park	 * Compare x0 against r3p0 - r4p1
423*54fd6939SJiyong Park	 */
424*54fd6939SJiyong Park	mov	x17, x30
425*54fd6939SJiyong Park	bl	check_errata_1946160
426*54fd6939SJiyong Park	cbz	x0, 1f
427*54fd6939SJiyong Park
428*54fd6939SJiyong Park	mov	x0, #3
429*54fd6939SJiyong Park	msr	S3_6_C15_C8_0, x0
430*54fd6939SJiyong Park	ldr	x0, =0x10E3900002
431*54fd6939SJiyong Park	msr	S3_6_C15_C8_2, x0
432*54fd6939SJiyong Park	ldr	x0, =0x10FFF00083
433*54fd6939SJiyong Park	msr	S3_6_C15_C8_3, x0
434*54fd6939SJiyong Park	ldr	x0, =0x2001003FF
435*54fd6939SJiyong Park	msr	S3_6_C15_C8_1, x0
436*54fd6939SJiyong Park
437*54fd6939SJiyong Park	mov	x0, #4
438*54fd6939SJiyong Park	msr	S3_6_C15_C8_0, x0
439*54fd6939SJiyong Park	ldr	x0, =0x10E3800082
440*54fd6939SJiyong Park	msr	S3_6_C15_C8_2, x0
441*54fd6939SJiyong Park	ldr	x0, =0x10FFF00083
442*54fd6939SJiyong Park	msr	S3_6_C15_C8_3, x0
443*54fd6939SJiyong Park	ldr	x0, =0x2001003FF
444*54fd6939SJiyong Park	msr	S3_6_C15_C8_1, x0
445*54fd6939SJiyong Park
446*54fd6939SJiyong Park	mov	x0, #5
447*54fd6939SJiyong Park	msr	S3_6_C15_C8_0, x0
448*54fd6939SJiyong Park	ldr	x0, =0x10E3800200
449*54fd6939SJiyong Park	msr	S3_6_C15_C8_2, x0
450*54fd6939SJiyong Park	ldr	x0, =0x10FFF003E0
451*54fd6939SJiyong Park	msr	S3_6_C15_C8_3, x0
452*54fd6939SJiyong Park	ldr	x0, =0x2001003FF
453*54fd6939SJiyong Park	msr	S3_6_C15_C8_1, x0
454*54fd6939SJiyong Park
455*54fd6939SJiyong Park	isb
456*54fd6939SJiyong Park1:
457*54fd6939SJiyong Park	ret	x17
458*54fd6939SJiyong Parkendfunc errata_n1_1946160_wa
459*54fd6939SJiyong Park
460*54fd6939SJiyong Parkfunc check_errata_1946160
461*54fd6939SJiyong Park	/* Applies to r3p0 - r4p1. */
462*54fd6939SJiyong Park	mov	x1, #0x30
463*54fd6939SJiyong Park	mov	x2, #0x41
464*54fd6939SJiyong Park	b	cpu_rev_var_range
465*54fd6939SJiyong Parkendfunc check_errata_1946160
466*54fd6939SJiyong Park
467*54fd6939SJiyong Parkfunc neoverse_n1_reset_func
468*54fd6939SJiyong Park	mov	x19, x30
469*54fd6939SJiyong Park
470*54fd6939SJiyong Park	bl neoverse_n1_disable_speculative_loads
471*54fd6939SJiyong Park
472*54fd6939SJiyong Park	/* Forces all cacheable atomic instructions to be near */
473*54fd6939SJiyong Park	mrs	x0, NEOVERSE_N1_CPUACTLR2_EL1
474*54fd6939SJiyong Park	orr	x0, x0, #NEOVERSE_N1_CPUACTLR2_EL1_BIT_2
475*54fd6939SJiyong Park	msr	NEOVERSE_N1_CPUACTLR2_EL1, x0
476*54fd6939SJiyong Park	isb
477*54fd6939SJiyong Park
478*54fd6939SJiyong Park	bl	cpu_get_rev_var
479*54fd6939SJiyong Park	mov	x18, x0
480*54fd6939SJiyong Park
481*54fd6939SJiyong Park#if ERRATA_N1_1043202
482*54fd6939SJiyong Park	mov	x0, x18
483*54fd6939SJiyong Park	bl	errata_n1_1043202_wa
484*54fd6939SJiyong Park#endif
485*54fd6939SJiyong Park
486*54fd6939SJiyong Park#if ERRATA_N1_1073348
487*54fd6939SJiyong Park	mov	x0, x18
488*54fd6939SJiyong Park	bl	errata_n1_1073348_wa
489*54fd6939SJiyong Park#endif
490*54fd6939SJiyong Park
491*54fd6939SJiyong Park#if ERRATA_N1_1130799
492*54fd6939SJiyong Park	mov	x0, x18
493*54fd6939SJiyong Park	bl	errata_n1_1130799_wa
494*54fd6939SJiyong Park#endif
495*54fd6939SJiyong Park
496*54fd6939SJiyong Park#if ERRATA_N1_1165347
497*54fd6939SJiyong Park	mov	x0, x18
498*54fd6939SJiyong Park	bl	errata_n1_1165347_wa
499*54fd6939SJiyong Park#endif
500*54fd6939SJiyong Park
501*54fd6939SJiyong Park#if ERRATA_N1_1207823
502*54fd6939SJiyong Park	mov	x0, x18
503*54fd6939SJiyong Park	bl	errata_n1_1207823_wa
504*54fd6939SJiyong Park#endif
505*54fd6939SJiyong Park
506*54fd6939SJiyong Park#if ERRATA_N1_1220197
507*54fd6939SJiyong Park	mov	x0, x18
508*54fd6939SJiyong Park	bl	errata_n1_1220197_wa
509*54fd6939SJiyong Park#endif
510*54fd6939SJiyong Park
511*54fd6939SJiyong Park#if ERRATA_N1_1257314
512*54fd6939SJiyong Park	mov	x0, x18
513*54fd6939SJiyong Park	bl	errata_n1_1257314_wa
514*54fd6939SJiyong Park#endif
515*54fd6939SJiyong Park
516*54fd6939SJiyong Park#if ERRATA_N1_1262606
517*54fd6939SJiyong Park	mov	x0, x18
518*54fd6939SJiyong Park	bl	errata_n1_1262606_wa
519*54fd6939SJiyong Park#endif
520*54fd6939SJiyong Park
521*54fd6939SJiyong Park#if ERRATA_N1_1262888
522*54fd6939SJiyong Park	mov	x0, x18
523*54fd6939SJiyong Park	bl	errata_n1_1262888_wa
524*54fd6939SJiyong Park#endif
525*54fd6939SJiyong Park
526*54fd6939SJiyong Park#if ERRATA_N1_1275112
527*54fd6939SJiyong Park	mov	x0, x18
528*54fd6939SJiyong Park	bl	errata_n1_1275112_wa
529*54fd6939SJiyong Park#endif
530*54fd6939SJiyong Park
531*54fd6939SJiyong Park#if ERRATA_N1_1315703
532*54fd6939SJiyong Park	mov	x0, x18
533*54fd6939SJiyong Park	bl	errata_n1_1315703_wa
534*54fd6939SJiyong Park#endif
535*54fd6939SJiyong Park
536*54fd6939SJiyong Park#if ERRATA_N1_1542419
537*54fd6939SJiyong Park	mov	x0, x18
538*54fd6939SJiyong Park	bl	errata_n1_1542419_wa
539*54fd6939SJiyong Park#endif
540*54fd6939SJiyong Park
541*54fd6939SJiyong Park#if ERRATA_N1_1868343
542*54fd6939SJiyong Park	mov	x0, x18
543*54fd6939SJiyong Park	bl	errata_n1_1868343_wa
544*54fd6939SJiyong Park#endif
545*54fd6939SJiyong Park
546*54fd6939SJiyong Park#if ERRATA_N1_1946160
547*54fd6939SJiyong Park	mov	x0, x18
548*54fd6939SJiyong Park	bl	errata_n1_1946160_wa
549*54fd6939SJiyong Park#endif
550*54fd6939SJiyong Park
551*54fd6939SJiyong Park#if ENABLE_AMU
552*54fd6939SJiyong Park	/* Make sure accesses from EL0/EL1 and EL2 are not trapped to EL3 */
553*54fd6939SJiyong Park	mrs	x0, actlr_el3
554*54fd6939SJiyong Park	orr	x0, x0, #NEOVERSE_N1_ACTLR_AMEN_BIT
555*54fd6939SJiyong Park	msr	actlr_el3, x0
556*54fd6939SJiyong Park
557*54fd6939SJiyong Park	/* Make sure accesses from EL0/EL1 are not trapped to EL2 */
558*54fd6939SJiyong Park	mrs	x0, actlr_el2
559*54fd6939SJiyong Park	orr	x0, x0, #NEOVERSE_N1_ACTLR_AMEN_BIT
560*54fd6939SJiyong Park	msr	actlr_el2, x0
561*54fd6939SJiyong Park
562*54fd6939SJiyong Park	/* Enable group0 counters */
563*54fd6939SJiyong Park	mov	x0, #NEOVERSE_N1_AMU_GROUP0_MASK
564*54fd6939SJiyong Park	msr	CPUAMCNTENSET_EL0, x0
565*54fd6939SJiyong Park#endif
566*54fd6939SJiyong Park
567*54fd6939SJiyong Park#if NEOVERSE_Nx_EXTERNAL_LLC
568*54fd6939SJiyong Park	/* Some system may have External LLC, core needs to be made aware */
569*54fd6939SJiyong Park	mrs     x0, NEOVERSE_N1_CPUECTLR_EL1
570*54fd6939SJiyong Park	orr     x0, x0, NEOVERSE_N1_CPUECTLR_EL1_EXTLLC_BIT
571*54fd6939SJiyong Park	msr     NEOVERSE_N1_CPUECTLR_EL1, x0
572*54fd6939SJiyong Park#endif
573*54fd6939SJiyong Park
574*54fd6939SJiyong Park#if ERRATA_DSU_936184
575*54fd6939SJiyong Park	bl	errata_dsu_936184_wa
576*54fd6939SJiyong Park#endif
577*54fd6939SJiyong Park
578*54fd6939SJiyong Park	isb
579*54fd6939SJiyong Park	ret	x19
580*54fd6939SJiyong Parkendfunc neoverse_n1_reset_func
581*54fd6939SJiyong Park
582*54fd6939SJiyong Park	/* ---------------------------------------------
583*54fd6939SJiyong Park	 * HW will do the cache maintenance while powering down
584*54fd6939SJiyong Park	 * ---------------------------------------------
585*54fd6939SJiyong Park	 */
586*54fd6939SJiyong Parkfunc neoverse_n1_core_pwr_dwn
587*54fd6939SJiyong Park	/* ---------------------------------------------
588*54fd6939SJiyong Park	 * Enable CPU power down bit in power control register
589*54fd6939SJiyong Park	 * ---------------------------------------------
590*54fd6939SJiyong Park	 */
591*54fd6939SJiyong Park	mrs	x0, NEOVERSE_N1_CPUPWRCTLR_EL1
592*54fd6939SJiyong Park	orr	x0, x0, #NEOVERSE_N1_CORE_PWRDN_EN_MASK
593*54fd6939SJiyong Park	msr	NEOVERSE_N1_CPUPWRCTLR_EL1, x0
594*54fd6939SJiyong Park	isb
595*54fd6939SJiyong Park	ret
596*54fd6939SJiyong Parkendfunc neoverse_n1_core_pwr_dwn
597*54fd6939SJiyong Park
598*54fd6939SJiyong Park#if REPORT_ERRATA
599*54fd6939SJiyong Park/*
600*54fd6939SJiyong Park * Errata printing function for Neoverse N1. Must follow AAPCS.
601*54fd6939SJiyong Park */
602*54fd6939SJiyong Parkfunc neoverse_n1_errata_report
603*54fd6939SJiyong Park	stp	x8, x30, [sp, #-16]!
604*54fd6939SJiyong Park
605*54fd6939SJiyong Park	bl	cpu_get_rev_var
606*54fd6939SJiyong Park	mov	x8, x0
607*54fd6939SJiyong Park
608*54fd6939SJiyong Park	/*
609*54fd6939SJiyong Park	 * Report all errata. The revision-variant information is passed to
610*54fd6939SJiyong Park	 * checking functions of each errata.
611*54fd6939SJiyong Park	 */
612*54fd6939SJiyong Park	report_errata ERRATA_N1_1043202, neoverse_n1, 1043202
613*54fd6939SJiyong Park	report_errata ERRATA_N1_1073348, neoverse_n1, 1073348
614*54fd6939SJiyong Park	report_errata ERRATA_N1_1130799, neoverse_n1, 1130799
615*54fd6939SJiyong Park	report_errata ERRATA_N1_1165347, neoverse_n1, 1165347
616*54fd6939SJiyong Park	report_errata ERRATA_N1_1207823, neoverse_n1, 1207823
617*54fd6939SJiyong Park	report_errata ERRATA_N1_1220197, neoverse_n1, 1220197
618*54fd6939SJiyong Park	report_errata ERRATA_N1_1257314, neoverse_n1, 1257314
619*54fd6939SJiyong Park	report_errata ERRATA_N1_1262606, neoverse_n1, 1262606
620*54fd6939SJiyong Park	report_errata ERRATA_N1_1262888, neoverse_n1, 1262888
621*54fd6939SJiyong Park	report_errata ERRATA_N1_1275112, neoverse_n1, 1275112
622*54fd6939SJiyong Park	report_errata ERRATA_N1_1315703, neoverse_n1, 1315703
623*54fd6939SJiyong Park	report_errata ERRATA_N1_1542419, neoverse_n1, 1542419
624*54fd6939SJiyong Park	report_errata ERRATA_N1_1868343, neoverse_n1, 1868343
625*54fd6939SJiyong Park	report_errata ERRATA_N1_1946160, neoverse_n1, 1946160
626*54fd6939SJiyong Park	report_errata ERRATA_DSU_936184, neoverse_n1, dsu_936184
627*54fd6939SJiyong Park
628*54fd6939SJiyong Park	ldp	x8, x30, [sp], #16
629*54fd6939SJiyong Park	ret
630*54fd6939SJiyong Parkendfunc neoverse_n1_errata_report
631*54fd6939SJiyong Park#endif
632*54fd6939SJiyong Park
633*54fd6939SJiyong Park/*
634*54fd6939SJiyong Park * Handle trap of EL0 IC IVAU instructions to EL3 by executing a TLB
635*54fd6939SJiyong Park * inner-shareable invalidation to an arbitrary address followed by a DSB.
636*54fd6939SJiyong Park *
637*54fd6939SJiyong Park * x1: Exception Syndrome
638*54fd6939SJiyong Park */
639*54fd6939SJiyong Parkfunc neoverse_n1_errata_ic_trap_handler
640*54fd6939SJiyong Park	cmp	x1, #NEOVERSE_N1_EC_IC_TRAP
641*54fd6939SJiyong Park	b.ne	1f
642*54fd6939SJiyong Park	tlbi	vae3is, xzr
643*54fd6939SJiyong Park	dsb	sy
644*54fd6939SJiyong Park
645*54fd6939SJiyong Park	# Skip the IC instruction itself
646*54fd6939SJiyong Park	mrs     x3, elr_el3
647*54fd6939SJiyong Park	add     x3, x3, #4
648*54fd6939SJiyong Park	msr     elr_el3, x3
649*54fd6939SJiyong Park
650*54fd6939SJiyong Park	ldp	x0, x1, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X0]
651*54fd6939SJiyong Park	ldp	x2, x3, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X2]
652*54fd6939SJiyong Park	ldp	x4, x5, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X4]
653*54fd6939SJiyong Park	ldr	x30, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_LR]
654*54fd6939SJiyong Park
655*54fd6939SJiyong Park#if IMAGE_BL31 && RAS_EXTENSION
656*54fd6939SJiyong Park	/*
657*54fd6939SJiyong Park	 * Issue Error Synchronization Barrier to synchronize SErrors before
658*54fd6939SJiyong Park	 * exiting EL3. We're running with EAs unmasked, so any synchronized
659*54fd6939SJiyong Park	 * errors would be taken immediately; therefore no need to inspect
660*54fd6939SJiyong Park	 * DISR_EL1 register.
661*54fd6939SJiyong Park	 */
662*54fd6939SJiyong Park	esb
663*54fd6939SJiyong Park#endif
664*54fd6939SJiyong Park	exception_return
665*54fd6939SJiyong Park1:
666*54fd6939SJiyong Park	ret
667*54fd6939SJiyong Parkendfunc neoverse_n1_errata_ic_trap_handler
668*54fd6939SJiyong Park
669*54fd6939SJiyong Park	/* ---------------------------------------------
670*54fd6939SJiyong Park	 * This function provides neoverse_n1 specific
671*54fd6939SJiyong Park	 * register information for crash reporting.
672*54fd6939SJiyong Park	 * It needs to return with x6 pointing to
673*54fd6939SJiyong Park	 * a list of register names in ascii and
674*54fd6939SJiyong Park	 * x8 - x15 having values of registers to be
675*54fd6939SJiyong Park	 * reported.
676*54fd6939SJiyong Park	 * ---------------------------------------------
677*54fd6939SJiyong Park	 */
678*54fd6939SJiyong Park.section .rodata.neoverse_n1_regs, "aS"
679*54fd6939SJiyong Parkneoverse_n1_regs:  /* The ascii list of register names to be reported */
680*54fd6939SJiyong Park	.asciz	"cpuectlr_el1", ""
681*54fd6939SJiyong Park
682*54fd6939SJiyong Parkfunc neoverse_n1_cpu_reg_dump
683*54fd6939SJiyong Park	adr	x6, neoverse_n1_regs
684*54fd6939SJiyong Park	mrs	x8, NEOVERSE_N1_CPUECTLR_EL1
685*54fd6939SJiyong Park	ret
686*54fd6939SJiyong Parkendfunc neoverse_n1_cpu_reg_dump
687*54fd6939SJiyong Park
688*54fd6939SJiyong Parkdeclare_cpu_ops_eh neoverse_n1, NEOVERSE_N1_MIDR, \
689*54fd6939SJiyong Park	neoverse_n1_reset_func, \
690*54fd6939SJiyong Park	neoverse_n1_errata_ic_trap_handler, \
691*54fd6939SJiyong Park	neoverse_n1_core_pwr_dwn
692