xref: /aosp_15_r20/external/arm-trusted-firmware/lib/cpus/aarch64/neoverse_n2.S (revision 54fd6939e177f8ff529b10183254802c76df6d08)
1*54fd6939SJiyong Park/*
2*54fd6939SJiyong Park * Copyright (c) 2020-2021, Arm Limited. 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 <cpu_macros.S>
10*54fd6939SJiyong Park#include <neoverse_n2.h>
11*54fd6939SJiyong Park
12*54fd6939SJiyong Park/* Hardware handled coherency */
13*54fd6939SJiyong Park#if HW_ASSISTED_COHERENCY == 0
14*54fd6939SJiyong Park#error "Neoverse N2 must be compiled with HW_ASSISTED_COHERENCY enabled"
15*54fd6939SJiyong Park#endif
16*54fd6939SJiyong Park
17*54fd6939SJiyong Park/* 64-bit only core */
18*54fd6939SJiyong Park#if CTX_INCLUDE_AARCH32_REGS == 1
19*54fd6939SJiyong Park#error "Neoverse-N2 supports only AArch64. Compile with CTX_INCLUDE_AARCH32_REGS=0"
20*54fd6939SJiyong Park#endif
21*54fd6939SJiyong Park
22*54fd6939SJiyong Park/* --------------------------------------------------
23*54fd6939SJiyong Park * Errata Workaround for Neoverse N2 Erratum 2002655.
24*54fd6939SJiyong Park * This applies to revision r0p0 of Neoverse N2. it is still open.
25*54fd6939SJiyong Park * Inputs:
26*54fd6939SJiyong Park * x0: variant[4:7] and revision[0:3] of current cpu.
27*54fd6939SJiyong Park * Shall clobber: x0-x17
28*54fd6939SJiyong Park * --------------------------------------------------
29*54fd6939SJiyong Park */
30*54fd6939SJiyong Parkfunc errata_n2_2002655_wa
31*54fd6939SJiyong Park	/* Check revision. */
32*54fd6939SJiyong Park	mov	x17, x30
33*54fd6939SJiyong Park	bl	check_errata_2002655
34*54fd6939SJiyong Park	cbz	x0, 1f
35*54fd6939SJiyong Park
36*54fd6939SJiyong Park	/* Apply instruction patching sequence */
37*54fd6939SJiyong Park	ldr x0,=0x6
38*54fd6939SJiyong Park	msr S3_6_c15_c8_0,x0
39*54fd6939SJiyong Park	ldr x0,=0xF3A08002
40*54fd6939SJiyong Park	msr S3_6_c15_c8_2,x0
41*54fd6939SJiyong Park	ldr x0,=0xFFF0F7FE
42*54fd6939SJiyong Park	msr S3_6_c15_c8_3,x0
43*54fd6939SJiyong Park	ldr x0,=0x40000001003ff
44*54fd6939SJiyong Park	msr S3_6_c15_c8_1,x0
45*54fd6939SJiyong Park	ldr x0,=0x7
46*54fd6939SJiyong Park	msr S3_6_c15_c8_0,x0
47*54fd6939SJiyong Park	ldr x0,=0xBF200000
48*54fd6939SJiyong Park	msr S3_6_c15_c8_2,x0
49*54fd6939SJiyong Park	ldr x0,=0xFFEF0000
50*54fd6939SJiyong Park	msr S3_6_c15_c8_3,x0
51*54fd6939SJiyong Park	ldr x0,=0x40000001003f3
52*54fd6939SJiyong Park	msr S3_6_c15_c8_1,x0
53*54fd6939SJiyong Park	isb
54*54fd6939SJiyong Park1:
55*54fd6939SJiyong Park	ret	x17
56*54fd6939SJiyong Parkendfunc errata_n2_2002655_wa
57*54fd6939SJiyong Park
58*54fd6939SJiyong Parkfunc check_errata_2002655
59*54fd6939SJiyong Park	/* Applies to r0p0 */
60*54fd6939SJiyong Park	mov	x1, #0x00
61*54fd6939SJiyong Park	b	cpu_rev_var_ls
62*54fd6939SJiyong Parkendfunc check_errata_2002655
63*54fd6939SJiyong Park
64*54fd6939SJiyong Park/* ---------------------------------------------------------------
65*54fd6939SJiyong Park * Errata Workaround for Neoverse N2 Erratum 2067956.
66*54fd6939SJiyong Park * This applies to revision r0p0 of Neoverse N2 and is still open.
67*54fd6939SJiyong Park * Inputs:
68*54fd6939SJiyong Park * x0: variant[4:7] and revision[0:3] of current cpu.
69*54fd6939SJiyong Park * Shall clobber: x0-x17
70*54fd6939SJiyong Park * ---------------------------------------------------------------
71*54fd6939SJiyong Park */
72*54fd6939SJiyong Parkfunc errata_n2_2067956_wa
73*54fd6939SJiyong Park	/* Compare x0 against revision r0p0 */
74*54fd6939SJiyong Park	mov	x17, x30
75*54fd6939SJiyong Park	bl	check_errata_2067956
76*54fd6939SJiyong Park	cbz	x0, 1f
77*54fd6939SJiyong Park	mrs	x1, NEOVERSE_N2_CPUACTLR_EL1
78*54fd6939SJiyong Park	orr	x1, x1, NEOVERSE_N2_CPUACTLR_EL1_BIT_46
79*54fd6939SJiyong Park	msr	NEOVERSE_N2_CPUACTLR_EL1, x1
80*54fd6939SJiyong Park1:
81*54fd6939SJiyong Park	ret	x17
82*54fd6939SJiyong Parkendfunc errata_n2_2067956_wa
83*54fd6939SJiyong Park
84*54fd6939SJiyong Parkfunc check_errata_2067956
85*54fd6939SJiyong Park	/* Applies to r0p0 */
86*54fd6939SJiyong Park	mov	x1, #0x00
87*54fd6939SJiyong Park	b	cpu_rev_var_ls
88*54fd6939SJiyong Parkendfunc check_errata_2067956
89*54fd6939SJiyong Park
90*54fd6939SJiyong Park/* ---------------------------------------------------------------
91*54fd6939SJiyong Park * Errata Workaround for Neoverse N2 Erratum 2025414.
92*54fd6939SJiyong Park * This applies to revision r0p0 of Neoverse N2 and is still open.
93*54fd6939SJiyong Park * Inputs:
94*54fd6939SJiyong Park * x0: variant[4:7] and revision[0:3] of current cpu.
95*54fd6939SJiyong Park * Shall clobber: x0-x17
96*54fd6939SJiyong Park * ---------------------------------------------------------------
97*54fd6939SJiyong Park */
98*54fd6939SJiyong Parkfunc errata_n2_2025414_wa
99*54fd6939SJiyong Park	/* Compare x0 against revision r0p0 */
100*54fd6939SJiyong Park	mov     x17, x30
101*54fd6939SJiyong Park	bl      check_errata_2025414
102*54fd6939SJiyong Park	cbz     x0, 1f
103*54fd6939SJiyong Park	mrs     x1, NEOVERSE_N2_CPUECTLR_EL1
104*54fd6939SJiyong Park	orr     x1, x1, NEOVERSE_N2_CPUECTLR_EL1_PFSTIDIS_BIT
105*54fd6939SJiyong Park	msr     NEOVERSE_N2_CPUECTLR_EL1, x1
106*54fd6939SJiyong Park
107*54fd6939SJiyong Park1:
108*54fd6939SJiyong Park	ret     x17
109*54fd6939SJiyong Parkendfunc errata_n2_2025414_wa
110*54fd6939SJiyong Park
111*54fd6939SJiyong Parkfunc check_errata_2025414
112*54fd6939SJiyong Park	/* Applies to r0p0 */
113*54fd6939SJiyong Park	mov     x1, #0x00
114*54fd6939SJiyong Park	b       cpu_rev_var_ls
115*54fd6939SJiyong Parkendfunc check_errata_2025414
116*54fd6939SJiyong Park
117*54fd6939SJiyong Park/* ---------------------------------------------------------------
118*54fd6939SJiyong Park * Errata Workaround for Neoverse N2 Erratum 2189731.
119*54fd6939SJiyong Park * This applies to revision r0p0 of Neoverse N2 and is still open.
120*54fd6939SJiyong Park * Inputs:
121*54fd6939SJiyong Park * x0: variant[4:7] and revision[0:3] of current cpu.
122*54fd6939SJiyong Park * Shall clobber: x0-x17
123*54fd6939SJiyong Park * ---------------------------------------------------------------
124*54fd6939SJiyong Park */
125*54fd6939SJiyong Parkfunc errata_n2_2189731_wa
126*54fd6939SJiyong Park	/* Compare x0 against revision r0p0 */
127*54fd6939SJiyong Park	mov     x17, x30
128*54fd6939SJiyong Park	bl      check_errata_2189731
129*54fd6939SJiyong Park	cbz     x0, 1f
130*54fd6939SJiyong Park	mrs     x1, NEOVERSE_N2_CPUACTLR5_EL1
131*54fd6939SJiyong Park	orr     x1, x1, NEOVERSE_N2_CPUACTLR5_EL1_BIT_44
132*54fd6939SJiyong Park	msr     NEOVERSE_N2_CPUACTLR5_EL1, x1
133*54fd6939SJiyong Park
134*54fd6939SJiyong Park1:
135*54fd6939SJiyong Park	ret     x17
136*54fd6939SJiyong Parkendfunc errata_n2_2189731_wa
137*54fd6939SJiyong Park
138*54fd6939SJiyong Parkfunc check_errata_2189731
139*54fd6939SJiyong Park	/* Applies to r0p0 */
140*54fd6939SJiyong Park	mov     x1, #0x00
141*54fd6939SJiyong Park	b       cpu_rev_var_ls
142*54fd6939SJiyong Parkendfunc check_errata_2189731
143*54fd6939SJiyong Park
144*54fd6939SJiyong Park/* --------------------------------------------------
145*54fd6939SJiyong Park * Errata Workaround for Neoverse N2 Erratum 2138956.
146*54fd6939SJiyong Park * This applies to revision r0p0 of Neoverse N2. it is still open.
147*54fd6939SJiyong Park * Inputs:
148*54fd6939SJiyong Park * x0: variant[4:7] and revision[0:3] of current cpu.
149*54fd6939SJiyong Park * Shall clobber: x0-x17
150*54fd6939SJiyong Park * --------------------------------------------------
151*54fd6939SJiyong Park */
152*54fd6939SJiyong Parkfunc errata_n2_2138956_wa
153*54fd6939SJiyong Park	/* Check revision. */
154*54fd6939SJiyong Park	mov	x17, x30
155*54fd6939SJiyong Park	bl	check_errata_2138956
156*54fd6939SJiyong Park	cbz	x0, 1f
157*54fd6939SJiyong Park
158*54fd6939SJiyong Park	/* Apply instruction patching sequence */
159*54fd6939SJiyong Park	ldr	x0,=0x3
160*54fd6939SJiyong Park	msr	S3_6_c15_c8_0,x0
161*54fd6939SJiyong Park	ldr	x0,=0xF3A08002
162*54fd6939SJiyong Park	msr	S3_6_c15_c8_2,x0
163*54fd6939SJiyong Park	ldr	x0,=0xFFF0F7FE
164*54fd6939SJiyong Park	msr	S3_6_c15_c8_3,x0
165*54fd6939SJiyong Park	ldr	x0,=0x10002001003FF
166*54fd6939SJiyong Park	msr	S3_6_c15_c8_1,x0
167*54fd6939SJiyong Park	ldr	x0,=0x4
168*54fd6939SJiyong Park	msr	S3_6_c15_c8_0,x0
169*54fd6939SJiyong Park	ldr	x0,=0xBF200000
170*54fd6939SJiyong Park	msr	S3_6_c15_c8_2,x0
171*54fd6939SJiyong Park	ldr	x0,=0xFFEF0000
172*54fd6939SJiyong Park	msr	S3_6_c15_c8_3,x0
173*54fd6939SJiyong Park	ldr	x0,=0x10002001003F3
174*54fd6939SJiyong Park	msr	S3_6_c15_c8_1,x0
175*54fd6939SJiyong Park	isb
176*54fd6939SJiyong Park1:
177*54fd6939SJiyong Park	ret	x17
178*54fd6939SJiyong Parkendfunc errata_n2_2138956_wa
179*54fd6939SJiyong Park
180*54fd6939SJiyong Parkfunc check_errata_2138956
181*54fd6939SJiyong Park	/* Applies to r0p0 */
182*54fd6939SJiyong Park	mov	x1, #0x00
183*54fd6939SJiyong Park	b	cpu_rev_var_ls
184*54fd6939SJiyong Parkendfunc check_errata_2138956
185*54fd6939SJiyong Park
186*54fd6939SJiyong Park/* --------------------------------------------------
187*54fd6939SJiyong Park * Errata Workaround for Neoverse N2 Erratum 2242415.
188*54fd6939SJiyong Park * This applies to revision r0p0 of Neoverse N2. it is still open.
189*54fd6939SJiyong Park * Inputs:
190*54fd6939SJiyong Park * x0: variant[4:7] and revision[0:3] of current cpu.
191*54fd6939SJiyong Park * Shall clobber: x0-x1, x17
192*54fd6939SJiyong Park * --------------------------------------------------
193*54fd6939SJiyong Park */
194*54fd6939SJiyong Parkfunc errata_n2_2242415_wa
195*54fd6939SJiyong Park	/* Check revision. */
196*54fd6939SJiyong Park	mov	x17, x30
197*54fd6939SJiyong Park	bl	check_errata_2242415
198*54fd6939SJiyong Park	cbz	x0, 1f
199*54fd6939SJiyong Park
200*54fd6939SJiyong Park	/* Apply instruction patching sequence */
201*54fd6939SJiyong Park	mrs	x1, NEOVERSE_N2_CPUACTLR_EL1
202*54fd6939SJiyong Park	orr	x1, x1, NEOVERSE_N2_CPUACTLR_EL1_BIT_22
203*54fd6939SJiyong Park	msr	NEOVERSE_N2_CPUACTLR_EL1, x1
204*54fd6939SJiyong Park1:
205*54fd6939SJiyong Park	ret	x17
206*54fd6939SJiyong Parkendfunc errata_n2_2242415_wa
207*54fd6939SJiyong Park
208*54fd6939SJiyong Parkfunc check_errata_2242415
209*54fd6939SJiyong Park	/* Applies to r0p0 */
210*54fd6939SJiyong Park	mov	x1, #0x00
211*54fd6939SJiyong Park	b	cpu_rev_var_ls
212*54fd6939SJiyong Parkendfunc check_errata_2242415
213*54fd6939SJiyong Park
214*54fd6939SJiyong Park/* --------------------------------------------------
215*54fd6939SJiyong Park * Errata Workaround for Neoverse N2 Erratum 2138953.
216*54fd6939SJiyong Park * This applies to revision r0p0 of Neoverse N2. it is still open.
217*54fd6939SJiyong Park * Inputs:
218*54fd6939SJiyong Park * x0: variant[4:7] and revision[0:3] of current cpu.
219*54fd6939SJiyong Park * Shall clobber: x0-x1, x17
220*54fd6939SJiyong Park * --------------------------------------------------
221*54fd6939SJiyong Park */
222*54fd6939SJiyong Parkfunc errata_n2_2138953_wa
223*54fd6939SJiyong Park	/* Check revision. */
224*54fd6939SJiyong Park	mov	x17, x30
225*54fd6939SJiyong Park	bl	check_errata_2138953
226*54fd6939SJiyong Park	cbz	x0, 1f
227*54fd6939SJiyong Park
228*54fd6939SJiyong Park	/* Apply instruction patching sequence */
229*54fd6939SJiyong Park	mrs	x1, NEOVERSE_N2_CPUECTLR2_EL1
230*54fd6939SJiyong Park	mov	x0, #NEOVERSE_N2_CPUECTLR2_EL1_PF_MODE_CNSRV
231*54fd6939SJiyong Park	bfi	x1, x0, #CPUECTLR2_EL1_PF_MODE_LSB, #CPUECTLR2_EL1_PF_MODE_WIDTH
232*54fd6939SJiyong Park	msr	NEOVERSE_N2_CPUECTLR2_EL1, x1
233*54fd6939SJiyong Park1:
234*54fd6939SJiyong Park	ret	x17
235*54fd6939SJiyong Parkendfunc errata_n2_2138953_wa
236*54fd6939SJiyong Park
237*54fd6939SJiyong Parkfunc check_errata_2138953
238*54fd6939SJiyong Park	/* Applies to r0p0 */
239*54fd6939SJiyong Park	mov	x1, #0x00
240*54fd6939SJiyong Park	b	cpu_rev_var_ls
241*54fd6939SJiyong Parkendfunc check_errata_2138953
242*54fd6939SJiyong Park
243*54fd6939SJiyong Park/* --------------------------------------------------
244*54fd6939SJiyong Park * Errata Workaround for Neoverse N2 Erratum 2138958.
245*54fd6939SJiyong Park * This applies to revision r0p0 of Neoverse N2. it is still open.
246*54fd6939SJiyong Park * Inputs:
247*54fd6939SJiyong Park * x0: variant[4:7] and revision[0:3] of current cpu.
248*54fd6939SJiyong Park * Shall clobber: x0-x1, x17
249*54fd6939SJiyong Park * --------------------------------------------------
250*54fd6939SJiyong Park */
251*54fd6939SJiyong Parkfunc errata_n2_2138958_wa
252*54fd6939SJiyong Park	/* Check revision. */
253*54fd6939SJiyong Park	mov	x17, x30
254*54fd6939SJiyong Park	bl	check_errata_2138958
255*54fd6939SJiyong Park	cbz	x0, 1f
256*54fd6939SJiyong Park
257*54fd6939SJiyong Park	/* Apply instruction patching sequence */
258*54fd6939SJiyong Park	mrs	x1, NEOVERSE_N2_CPUACTLR5_EL1
259*54fd6939SJiyong Park	orr	x1, x1, NEOVERSE_N2_CPUACTLR5_EL1_BIT_13
260*54fd6939SJiyong Park	msr	NEOVERSE_N2_CPUACTLR5_EL1, x1
261*54fd6939SJiyong Park1:
262*54fd6939SJiyong Park	ret	x17
263*54fd6939SJiyong Parkendfunc errata_n2_2138958_wa
264*54fd6939SJiyong Park
265*54fd6939SJiyong Parkfunc check_errata_2138958
266*54fd6939SJiyong Park	/* Applies to r0p0 */
267*54fd6939SJiyong Park	mov	x1, #0x00
268*54fd6939SJiyong Park	b	cpu_rev_var_ls
269*54fd6939SJiyong Parkendfunc check_errata_2138958
270*54fd6939SJiyong Park
271*54fd6939SJiyong Park/* --------------------------------------------------
272*54fd6939SJiyong Park * Errata Workaround for Neoverse N2 Erratum 2242400.
273*54fd6939SJiyong Park * This applies to revision r0p0 of Neoverse N2. it is still open.
274*54fd6939SJiyong Park * Inputs:
275*54fd6939SJiyong Park * x0: variant[4:7] and revision[0:3] of current cpu.
276*54fd6939SJiyong Park * Shall clobber: x0-x1, x17
277*54fd6939SJiyong Park * --------------------------------------------------
278*54fd6939SJiyong Park */
279*54fd6939SJiyong Parkfunc errata_n2_2242400_wa
280*54fd6939SJiyong Park	/* Check revision. */
281*54fd6939SJiyong Park	mov	x17, x30
282*54fd6939SJiyong Park	bl	check_errata_2242400
283*54fd6939SJiyong Park	cbz	x0, 1f
284*54fd6939SJiyong Park
285*54fd6939SJiyong Park	/* Apply instruction patching sequence */
286*54fd6939SJiyong Park	mrs	x1, NEOVERSE_N2_CPUACTLR5_EL1
287*54fd6939SJiyong Park	orr	x1, x1, NEOVERSE_N2_CPUACTLR5_EL1_BIT_17
288*54fd6939SJiyong Park	msr	NEOVERSE_N2_CPUACTLR5_EL1, x1
289*54fd6939SJiyong Park	ldr	x0, =0x2
290*54fd6939SJiyong Park	msr	S3_6_c15_c8_0, x0
291*54fd6939SJiyong Park	ldr	x0, =0x10F600E000
292*54fd6939SJiyong Park	msr	S3_6_c15_c8_2, x0
293*54fd6939SJiyong Park	ldr	x0, =0x10FF80E000
294*54fd6939SJiyong Park	msr	S3_6_c15_c8_3, x0
295*54fd6939SJiyong Park	ldr	x0, =0x80000000003FF
296*54fd6939SJiyong Park	msr	S3_6_c15_c8_1, x0
297*54fd6939SJiyong Park	isb
298*54fd6939SJiyong Park1:
299*54fd6939SJiyong Park	ret	x17
300*54fd6939SJiyong Parkendfunc errata_n2_2242400_wa
301*54fd6939SJiyong Park
302*54fd6939SJiyong Parkfunc check_errata_2242400
303*54fd6939SJiyong Park	/* Applies to r0p0 */
304*54fd6939SJiyong Park	mov	x1, #0x00
305*54fd6939SJiyong Park	b	cpu_rev_var_ls
306*54fd6939SJiyong Parkendfunc check_errata_2242400
307*54fd6939SJiyong Park
308*54fd6939SJiyong Park/* --------------------------------------------------
309*54fd6939SJiyong Park * Errata Workaround for Neoverse N2 Erratum 2280757.
310*54fd6939SJiyong Park * This applies to revision r0p0 of Neoverse N2. it is still open.
311*54fd6939SJiyong Park * Inputs:
312*54fd6939SJiyong Park * x0: variant[4:7] and revision[0:3] of current cpu.
313*54fd6939SJiyong Park * Shall clobber: x0-x1, x17
314*54fd6939SJiyong Park * --------------------------------------------------
315*54fd6939SJiyong Park */
316*54fd6939SJiyong Parkfunc errata_n2_2280757_wa
317*54fd6939SJiyong Park	/* Check revision. */
318*54fd6939SJiyong Park	mov	x17, x30
319*54fd6939SJiyong Park	bl	check_errata_2280757
320*54fd6939SJiyong Park	cbz	x0, 1f
321*54fd6939SJiyong Park
322*54fd6939SJiyong Park	/* Apply instruction patching sequence */
323*54fd6939SJiyong Park	mrs	x1, NEOVERSE_N2_CPUACTLR_EL1
324*54fd6939SJiyong Park	orr	x1, x1, NEOVERSE_N2_CPUACTLR_EL1_BIT_22
325*54fd6939SJiyong Park	msr	NEOVERSE_N2_CPUACTLR_EL1, x1
326*54fd6939SJiyong Park1:
327*54fd6939SJiyong Park	ret	x17
328*54fd6939SJiyong Parkendfunc errata_n2_2280757_wa
329*54fd6939SJiyong Park
330*54fd6939SJiyong Parkfunc check_errata_2280757
331*54fd6939SJiyong Park	/* Applies to r0p0 */
332*54fd6939SJiyong Park	mov	x1, #0x00
333*54fd6939SJiyong Park	b	cpu_rev_var_ls
334*54fd6939SJiyong Parkendfunc check_errata_2280757
335*54fd6939SJiyong Park
336*54fd6939SJiyong Park	/* -------------------------------------------
337*54fd6939SJiyong Park	 * The CPU Ops reset function for Neoverse N2.
338*54fd6939SJiyong Park	 * -------------------------------------------
339*54fd6939SJiyong Park	 */
340*54fd6939SJiyong Parkfunc neoverse_n2_reset_func
341*54fd6939SJiyong Park	mov	x19, x30
342*54fd6939SJiyong Park
343*54fd6939SJiyong Park	/* Check if the PE implements SSBS */
344*54fd6939SJiyong Park	mrs	x0, id_aa64pfr1_el1
345*54fd6939SJiyong Park	tst	x0, #(ID_AA64PFR1_EL1_SSBS_MASK << ID_AA64PFR1_EL1_SSBS_SHIFT)
346*54fd6939SJiyong Park	b.eq	1f
347*54fd6939SJiyong Park
348*54fd6939SJiyong Park	/* Disable speculative loads */
349*54fd6939SJiyong Park	msr	SSBS, xzr
350*54fd6939SJiyong Park1:
351*54fd6939SJiyong Park	/* Force all cacheable atomic instructions to be near */
352*54fd6939SJiyong Park	mrs	x0, NEOVERSE_N2_CPUACTLR2_EL1
353*54fd6939SJiyong Park	orr	x0, x0, #NEOVERSE_N2_CPUACTLR2_EL1_BIT_2
354*54fd6939SJiyong Park	msr	NEOVERSE_N2_CPUACTLR2_EL1, x0
355*54fd6939SJiyong Park
356*54fd6939SJiyong Park#if ERRATA_N2_2067956
357*54fd6939SJiyong Park	mov	x0, x18
358*54fd6939SJiyong Park	bl	errata_n2_2067956_wa
359*54fd6939SJiyong Park#endif
360*54fd6939SJiyong Park
361*54fd6939SJiyong Park#if ERRATA_N2_2025414
362*54fd6939SJiyong Park	mov	x0, x18
363*54fd6939SJiyong Park	bl	errata_n2_2025414_wa
364*54fd6939SJiyong Park#endif
365*54fd6939SJiyong Park
366*54fd6939SJiyong Park#if ERRATA_N2_2189731
367*54fd6939SJiyong Park	mov	x0, x18
368*54fd6939SJiyong Park	bl	errata_n2_2189731_wa
369*54fd6939SJiyong Park#endif
370*54fd6939SJiyong Park
371*54fd6939SJiyong Park
372*54fd6939SJiyong Park#if ERRATA_N2_2138956
373*54fd6939SJiyong Park	mov	x0, x18
374*54fd6939SJiyong Park	bl	errata_n2_2138956_wa
375*54fd6939SJiyong Park#endif
376*54fd6939SJiyong Park
377*54fd6939SJiyong Park#if ERRATA_N2_2138953
378*54fd6939SJiyong Park	mov	x0, x18
379*54fd6939SJiyong Park	bl	errata_n2_2138953_wa
380*54fd6939SJiyong Park#endif
381*54fd6939SJiyong Park
382*54fd6939SJiyong Park#if ERRATA_N2_2242415
383*54fd6939SJiyong Park	mov	x0, x18
384*54fd6939SJiyong Park	bl	errata_n2_2242415_wa
385*54fd6939SJiyong Park#endif
386*54fd6939SJiyong Park
387*54fd6939SJiyong Park#if ERRATA_N2_2138958
388*54fd6939SJiyong Park	mov	x0, x18
389*54fd6939SJiyong Park	bl	errata_n2_2138958_wa
390*54fd6939SJiyong Park#endif
391*54fd6939SJiyong Park
392*54fd6939SJiyong Park#if ERRATA_N2_2242400
393*54fd6939SJiyong Park	mov	x0, x18
394*54fd6939SJiyong Park	bl	errata_n2_2242400_wa
395*54fd6939SJiyong Park#endif
396*54fd6939SJiyong Park
397*54fd6939SJiyong Park#if ERRATA_N2_2280757
398*54fd6939SJiyong Park	mov	x0, x18
399*54fd6939SJiyong Park	bl	errata_n2_2280757_wa
400*54fd6939SJiyong Park#endif
401*54fd6939SJiyong Park
402*54fd6939SJiyong Park#if ENABLE_AMU
403*54fd6939SJiyong Park	/* Make sure accesses from EL0/EL1 and EL2 are not trapped to EL3 */
404*54fd6939SJiyong Park	mrs	x0, cptr_el3
405*54fd6939SJiyong Park	orr	x0, x0, #TAM_BIT
406*54fd6939SJiyong Park	msr	cptr_el3, x0
407*54fd6939SJiyong Park
408*54fd6939SJiyong Park	/* Make sure accesses from EL0/EL1 are not trapped to EL2 */
409*54fd6939SJiyong Park	mrs	x0, cptr_el2
410*54fd6939SJiyong Park	orr	x0, x0, #TAM_BIT
411*54fd6939SJiyong Park	msr	cptr_el2, x0
412*54fd6939SJiyong Park
413*54fd6939SJiyong Park	/* No need to enable the counters as this would be done at el3 exit */
414*54fd6939SJiyong Park#endif
415*54fd6939SJiyong Park
416*54fd6939SJiyong Park#if NEOVERSE_Nx_EXTERNAL_LLC
417*54fd6939SJiyong Park	/* Some systems may have External LLC, core needs to be made aware */
418*54fd6939SJiyong Park	mrs	x0, NEOVERSE_N2_CPUECTLR_EL1
419*54fd6939SJiyong Park	orr	x0, x0, NEOVERSE_N2_CPUECTLR_EL1_EXTLLC_BIT
420*54fd6939SJiyong Park	msr	NEOVERSE_N2_CPUECTLR_EL1, x0
421*54fd6939SJiyong Park#endif
422*54fd6939SJiyong Park
423*54fd6939SJiyong Park	bl	cpu_get_rev_var
424*54fd6939SJiyong Park	mov	x18, x0
425*54fd6939SJiyong Park
426*54fd6939SJiyong Park#if ERRATA_N2_2002655
427*54fd6939SJiyong Park	mov	x0, x18
428*54fd6939SJiyong Park	bl	errata_n2_2002655_wa
429*54fd6939SJiyong Park#endif
430*54fd6939SJiyong Park
431*54fd6939SJiyong Park	isb
432*54fd6939SJiyong Park	ret	x19
433*54fd6939SJiyong Parkendfunc neoverse_n2_reset_func
434*54fd6939SJiyong Park
435*54fd6939SJiyong Parkfunc neoverse_n2_core_pwr_dwn
436*54fd6939SJiyong Park	/* ---------------------------------------------------
437*54fd6939SJiyong Park	 * Enable CPU power down bit in power control register
438*54fd6939SJiyong Park	 * No need to do cache maintenance here.
439*54fd6939SJiyong Park	 * ---------------------------------------------------
440*54fd6939SJiyong Park	 */
441*54fd6939SJiyong Park	mrs	x0, NEOVERSE_N2_CPUPWRCTLR_EL1
442*54fd6939SJiyong Park	orr	x0, x0, #NEOVERSE_N2_CORE_PWRDN_EN_BIT
443*54fd6939SJiyong Park	msr	NEOVERSE_N2_CPUPWRCTLR_EL1, x0
444*54fd6939SJiyong Park	isb
445*54fd6939SJiyong Park	ret
446*54fd6939SJiyong Parkendfunc neoverse_n2_core_pwr_dwn
447*54fd6939SJiyong Park
448*54fd6939SJiyong Park#if REPORT_ERRATA
449*54fd6939SJiyong Park/*
450*54fd6939SJiyong Park * Errata printing function for Neoverse N2 cores. Must follow AAPCS.
451*54fd6939SJiyong Park */
452*54fd6939SJiyong Parkfunc neoverse_n2_errata_report
453*54fd6939SJiyong Park	stp	x8, x30, [sp, #-16]!
454*54fd6939SJiyong Park
455*54fd6939SJiyong Park	bl	cpu_get_rev_var
456*54fd6939SJiyong Park	mov	x8, x0
457*54fd6939SJiyong Park
458*54fd6939SJiyong Park	/*
459*54fd6939SJiyong Park	 * Report all errata. The revision-variant information is passed to
460*54fd6939SJiyong Park	 * checking functions of each errata.
461*54fd6939SJiyong Park	 */
462*54fd6939SJiyong Park	report_errata ERRATA_N2_2002655, neoverse_n2, 2002655
463*54fd6939SJiyong Park	report_errata ERRATA_N2_2067956, neoverse_n2, 2067956
464*54fd6939SJiyong Park	report_errata ERRATA_N2_2025414, neoverse_n2, 2025414
465*54fd6939SJiyong Park	report_errata ERRATA_N2_2189731, neoverse_n2, 2189731
466*54fd6939SJiyong Park	report_errata ERRATA_N2_2138956, neoverse_n2, 2138956
467*54fd6939SJiyong Park	report_errata ERRATA_N2_2138953, neoverse_n2, 2138953
468*54fd6939SJiyong Park	report_errata ERRATA_N2_2242415, neoverse_n2, 2242415
469*54fd6939SJiyong Park	report_errata ERRATA_N2_2138958, neoverse_n2, 2138958
470*54fd6939SJiyong Park	report_errata ERRATA_N2_2242400, neoverse_n2, 2242400
471*54fd6939SJiyong Park	report_errata ERRATA_N2_2280757, neoverse_n2, 2280757
472*54fd6939SJiyong Park
473*54fd6939SJiyong Park	ldp	x8, x30, [sp], #16
474*54fd6939SJiyong Park	ret
475*54fd6939SJiyong Parkendfunc neoverse_n2_errata_report
476*54fd6939SJiyong Park#endif
477*54fd6939SJiyong Park
478*54fd6939SJiyong Park	/* ---------------------------------------------
479*54fd6939SJiyong Park	 * This function provides Neoverse N2 specific
480*54fd6939SJiyong Park	 * register information for crash reporting.
481*54fd6939SJiyong Park	 * It needs to return with x6 pointing to
482*54fd6939SJiyong Park	 * a list of register names in ASCII and
483*54fd6939SJiyong Park	 * x8 - x15 having values of registers to be
484*54fd6939SJiyong Park	 * reported.
485*54fd6939SJiyong Park	 * ---------------------------------------------
486*54fd6939SJiyong Park	 */
487*54fd6939SJiyong Park.section .rodata.neoverse_n2_regs, "aS"
488*54fd6939SJiyong Parkneoverse_n2_regs:  /* The ASCII list of register names to be reported */
489*54fd6939SJiyong Park	.asciz	"cpupwrctlr_el1", ""
490*54fd6939SJiyong Park
491*54fd6939SJiyong Parkfunc neoverse_n2_cpu_reg_dump
492*54fd6939SJiyong Park	adr	x6, neoverse_n2_regs
493*54fd6939SJiyong Park	mrs	x8, NEOVERSE_N2_CPUPWRCTLR_EL1
494*54fd6939SJiyong Park	ret
495*54fd6939SJiyong Parkendfunc neoverse_n2_cpu_reg_dump
496*54fd6939SJiyong Park
497*54fd6939SJiyong Parkdeclare_cpu_ops neoverse_n2, NEOVERSE_N2_MIDR, \
498*54fd6939SJiyong Park	neoverse_n2_reset_func, \
499*54fd6939SJiyong Park	neoverse_n2_core_pwr_dwn
500