xref: /aosp_15_r20/external/arm-trusted-firmware/lib/cpus/aarch64/neoverse_v1.S (revision 54fd6939e177f8ff529b10183254802c76df6d08)
1*54fd6939SJiyong Park/*
2*54fd6939SJiyong Park * Copyright (c) 2019-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 <common/bl_common.h>
10*54fd6939SJiyong Park#include <neoverse_v1.h>
11*54fd6939SJiyong Park#include <cpu_macros.S>
12*54fd6939SJiyong Park#include <plat_macros.S>
13*54fd6939SJiyong Park
14*54fd6939SJiyong Park/* Hardware handled coherency */
15*54fd6939SJiyong Park#if HW_ASSISTED_COHERENCY == 0
16*54fd6939SJiyong Park#error "Neoverse V1 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-V1 supports only AArch64. Compile with CTX_INCLUDE_AARCH32_REGS=0"
22*54fd6939SJiyong Park#endif
23*54fd6939SJiyong Park
24*54fd6939SJiyong Park	/* --------------------------------------------------
25*54fd6939SJiyong Park	 * Errata Workaround for Neoverse V1 Errata #1774420.
26*54fd6939SJiyong Park	 * This applies to revisions r0p0 and r1p0, fixed in r1p1.
27*54fd6939SJiyong Park	 * x0: variant[4:7] and revision[0:3] of current cpu.
28*54fd6939SJiyong Park	 * Shall clobber: x0-x17
29*54fd6939SJiyong Park	 * --------------------------------------------------
30*54fd6939SJiyong Park	 */
31*54fd6939SJiyong Parkfunc errata_neoverse_v1_1774420_wa
32*54fd6939SJiyong Park	/* Check workaround compatibility. */
33*54fd6939SJiyong Park	mov	x17, x30
34*54fd6939SJiyong Park	bl	check_errata_1774420
35*54fd6939SJiyong Park	cbz	x0, 1f
36*54fd6939SJiyong Park
37*54fd6939SJiyong Park	/* Set bit 53 in CPUECTLR_EL1 */
38*54fd6939SJiyong Park	mrs     x1, NEOVERSE_V1_CPUECTLR_EL1
39*54fd6939SJiyong Park	orr	x1, x1, #NEOVERSE_V1_CPUECTLR_EL1_BIT_53
40*54fd6939SJiyong Park	msr     NEOVERSE_V1_CPUECTLR_EL1, x1
41*54fd6939SJiyong Park	isb
42*54fd6939SJiyong Park1:
43*54fd6939SJiyong Park	ret	x17
44*54fd6939SJiyong Parkendfunc errata_neoverse_v1_1774420_wa
45*54fd6939SJiyong Park
46*54fd6939SJiyong Parkfunc check_errata_1774420
47*54fd6939SJiyong Park	/* Applies to r0p0 and r1p0. */
48*54fd6939SJiyong Park	mov	x1, #0x10
49*54fd6939SJiyong Park	b	cpu_rev_var_ls
50*54fd6939SJiyong Parkendfunc check_errata_1774420
51*54fd6939SJiyong Park
52*54fd6939SJiyong Park	/* --------------------------------------------------
53*54fd6939SJiyong Park	 * Errata Workaround for Neoverse V1 Errata #1791573.
54*54fd6939SJiyong Park	 * This applies to revisions r0p0 and r1p0, fixed in r1p1.
55*54fd6939SJiyong Park	 * x0: variant[4:7] and revision[0:3] of current cpu.
56*54fd6939SJiyong Park	 * Shall clobber: x0-x17
57*54fd6939SJiyong Park	 * --------------------------------------------------
58*54fd6939SJiyong Park	 */
59*54fd6939SJiyong Parkfunc errata_neoverse_v1_1791573_wa
60*54fd6939SJiyong Park	/* Check workaround compatibility. */
61*54fd6939SJiyong Park	mov	x17, x30
62*54fd6939SJiyong Park	bl	check_errata_1791573
63*54fd6939SJiyong Park	cbz	x0, 1f
64*54fd6939SJiyong Park
65*54fd6939SJiyong Park	/* Set bit 2 in ACTLR2_EL1 */
66*54fd6939SJiyong Park	mrs	x1, NEOVERSE_V1_ACTLR2_EL1
67*54fd6939SJiyong Park	orr	x1, x1, #NEOVERSE_V1_ACTLR2_EL1_BIT_2
68*54fd6939SJiyong Park	msr	NEOVERSE_V1_ACTLR2_EL1, x1
69*54fd6939SJiyong Park	isb
70*54fd6939SJiyong Park1:
71*54fd6939SJiyong Park	ret	x17
72*54fd6939SJiyong Parkendfunc errata_neoverse_v1_1791573_wa
73*54fd6939SJiyong Park
74*54fd6939SJiyong Parkfunc check_errata_1791573
75*54fd6939SJiyong Park	/* Applies to r0p0 and r1p0. */
76*54fd6939SJiyong Park	mov	x1, #0x10
77*54fd6939SJiyong Park	b	cpu_rev_var_ls
78*54fd6939SJiyong Parkendfunc check_errata_1791573
79*54fd6939SJiyong Park
80*54fd6939SJiyong Park	/* --------------------------------------------------
81*54fd6939SJiyong Park	 * Errata Workaround for Neoverse V1 Errata #1852267.
82*54fd6939SJiyong Park	 * This applies to revisions r0p0 and r1p0, fixed in r1p1.
83*54fd6939SJiyong Park	 * x0: variant[4:7] and revision[0:3] of current cpu.
84*54fd6939SJiyong Park	 * Shall clobber: x0-x17
85*54fd6939SJiyong Park	 * --------------------------------------------------
86*54fd6939SJiyong Park	 */
87*54fd6939SJiyong Parkfunc errata_neoverse_v1_1852267_wa
88*54fd6939SJiyong Park	/* Check workaround compatibility. */
89*54fd6939SJiyong Park	mov	x17, x30
90*54fd6939SJiyong Park	bl	check_errata_1852267
91*54fd6939SJiyong Park	cbz	x0, 1f
92*54fd6939SJiyong Park
93*54fd6939SJiyong Park	/* Set bit 28 in ACTLR2_EL1 */
94*54fd6939SJiyong Park	mrs	x1, NEOVERSE_V1_ACTLR2_EL1
95*54fd6939SJiyong Park	orr	x1, x1, #NEOVERSE_V1_ACTLR2_EL1_BIT_28
96*54fd6939SJiyong Park	msr	NEOVERSE_V1_ACTLR2_EL1, x1
97*54fd6939SJiyong Park	isb
98*54fd6939SJiyong Park1:
99*54fd6939SJiyong Park	ret	x17
100*54fd6939SJiyong Parkendfunc errata_neoverse_v1_1852267_wa
101*54fd6939SJiyong Park
102*54fd6939SJiyong Parkfunc check_errata_1852267
103*54fd6939SJiyong Park	/* Applies to r0p0 and r1p0. */
104*54fd6939SJiyong Park	mov	x1, #0x10
105*54fd6939SJiyong Park	b	cpu_rev_var_ls
106*54fd6939SJiyong Parkendfunc check_errata_1852267
107*54fd6939SJiyong Park
108*54fd6939SJiyong Park	/* --------------------------------------------------
109*54fd6939SJiyong Park	 * Errata Workaround for Neoverse V1 Errata #1925756.
110*54fd6939SJiyong Park	 * This applies to revisions <= r1p1.
111*54fd6939SJiyong Park	 * x0: variant[4:7] and revision[0:3] of current cpu.
112*54fd6939SJiyong Park	 * Shall clobber: x0-x17
113*54fd6939SJiyong Park	 * --------------------------------------------------
114*54fd6939SJiyong Park	 */
115*54fd6939SJiyong Parkfunc errata_neoverse_v1_1925756_wa
116*54fd6939SJiyong Park	/* Check workaround compatibility. */
117*54fd6939SJiyong Park	mov	x17, x30
118*54fd6939SJiyong Park	bl	check_errata_1925756
119*54fd6939SJiyong Park	cbz	x0, 1f
120*54fd6939SJiyong Park
121*54fd6939SJiyong Park	/* Set bit 8 in CPUECTLR_EL1 */
122*54fd6939SJiyong Park	mrs	x1, NEOVERSE_V1_CPUECTLR_EL1
123*54fd6939SJiyong Park	orr	x1, x1, #NEOVERSE_V1_CPUECTLR_EL1_BIT_8
124*54fd6939SJiyong Park	msr	NEOVERSE_V1_CPUECTLR_EL1, x1
125*54fd6939SJiyong Park	isb
126*54fd6939SJiyong Park1:
127*54fd6939SJiyong Park	ret	x17
128*54fd6939SJiyong Parkendfunc errata_neoverse_v1_1925756_wa
129*54fd6939SJiyong Park
130*54fd6939SJiyong Parkfunc check_errata_1925756
131*54fd6939SJiyong Park	/* Applies to <= r1p1. */
132*54fd6939SJiyong Park	mov	x1, #0x11
133*54fd6939SJiyong Park	b	cpu_rev_var_ls
134*54fd6939SJiyong Parkendfunc check_errata_1925756
135*54fd6939SJiyong Park
136*54fd6939SJiyong Park	/* --------------------------------------------------
137*54fd6939SJiyong Park	 * Errata Workaround for Neoverse V1 Erratum #1940577
138*54fd6939SJiyong Park	 * This applies to revisions r1p0 - r1p1 and is open.
139*54fd6939SJiyong Park	 * It also exists in r0p0 but there is no fix in that
140*54fd6939SJiyong Park	 * revision.
141*54fd6939SJiyong Park	 * Inputs:
142*54fd6939SJiyong Park	 * x0: variant[4:7] and revision[0:3] of current cpu.
143*54fd6939SJiyong Park	 * Shall clobber: x0-x17
144*54fd6939SJiyong Park	 * --------------------------------------------------
145*54fd6939SJiyong Park	 */
146*54fd6939SJiyong Parkfunc errata_neoverse_v1_1940577_wa
147*54fd6939SJiyong Park	/* Compare x0 against revisions r1p0 - r1p1 */
148*54fd6939SJiyong Park	mov	x17, x30
149*54fd6939SJiyong Park	bl	check_errata_1940577
150*54fd6939SJiyong Park	cbz	x0, 1f
151*54fd6939SJiyong Park
152*54fd6939SJiyong Park	mov	x0, #0
153*54fd6939SJiyong Park	msr	S3_6_C15_C8_0, x0
154*54fd6939SJiyong Park	ldr	x0, =0x10E3900002
155*54fd6939SJiyong Park	msr	S3_6_C15_C8_2, x0
156*54fd6939SJiyong Park	ldr	x0, =0x10FFF00083
157*54fd6939SJiyong Park	msr	S3_6_C15_C8_3, x0
158*54fd6939SJiyong Park	ldr	x0, =0x2001003FF
159*54fd6939SJiyong Park	msr	S3_6_C15_C8_1, x0
160*54fd6939SJiyong Park
161*54fd6939SJiyong Park	mov	x0, #1
162*54fd6939SJiyong Park	msr	S3_6_C15_C8_0, x0
163*54fd6939SJiyong Park	ldr	x0, =0x10E3800082
164*54fd6939SJiyong Park	msr	S3_6_C15_C8_2, x0
165*54fd6939SJiyong Park	ldr	x0, =0x10FFF00083
166*54fd6939SJiyong Park	msr	S3_6_C15_C8_3, x0
167*54fd6939SJiyong Park	ldr	x0, =0x2001003FF
168*54fd6939SJiyong Park	msr	S3_6_C15_C8_1, x0
169*54fd6939SJiyong Park
170*54fd6939SJiyong Park	mov	x0, #2
171*54fd6939SJiyong Park	msr	S3_6_C15_C8_0, x0
172*54fd6939SJiyong Park	ldr	x0, =0x10E3800200
173*54fd6939SJiyong Park	msr	S3_6_C15_C8_2, x0
174*54fd6939SJiyong Park	ldr	x0, =0x10FFF003E0
175*54fd6939SJiyong Park	msr	S3_6_C15_C8_3, x0
176*54fd6939SJiyong Park	ldr	x0, =0x2001003FF
177*54fd6939SJiyong Park	msr	S3_6_C15_C8_1, x0
178*54fd6939SJiyong Park
179*54fd6939SJiyong Park	isb
180*54fd6939SJiyong Park1:
181*54fd6939SJiyong Park	ret	x17
182*54fd6939SJiyong Parkendfunc errata_neoverse_v1_1940577_wa
183*54fd6939SJiyong Park
184*54fd6939SJiyong Parkfunc check_errata_1940577
185*54fd6939SJiyong Park	/* Applies to revisions r1p0 - r1p1. */
186*54fd6939SJiyong Park	mov	x1, #0x10
187*54fd6939SJiyong Park	mov	x2, #0x11
188*54fd6939SJiyong Park	b	cpu_rev_var_range
189*54fd6939SJiyong Parkendfunc check_errata_1940577
190*54fd6939SJiyong Park
191*54fd6939SJiyong Park	/* --------------------------------------------------
192*54fd6939SJiyong Park	 * Errata Workaround for Neoverse V1 Errata #1966096
193*54fd6939SJiyong Park	 * This applies to revisions r1p0 - r1p1 and is open.
194*54fd6939SJiyong Park	 * It also exists in r0p0 but there is no workaround
195*54fd6939SJiyong Park	 * for that revision.
196*54fd6939SJiyong Park	 * x0: variant[4:7] and revision[0:3] of current cpu.
197*54fd6939SJiyong Park	 * Shall clobber: x0-x17
198*54fd6939SJiyong Park	 * --------------------------------------------------
199*54fd6939SJiyong Park	 */
200*54fd6939SJiyong Parkfunc errata_neoverse_v1_1966096_wa
201*54fd6939SJiyong Park	/* Check workaround compatibility. */
202*54fd6939SJiyong Park	mov	x17, x30
203*54fd6939SJiyong Park	bl	check_errata_1966096
204*54fd6939SJiyong Park	cbz	x0, 1f
205*54fd6939SJiyong Park
206*54fd6939SJiyong Park	/* Apply the workaround. */
207*54fd6939SJiyong Park	mov	x0, #0x3
208*54fd6939SJiyong Park	msr	S3_6_C15_C8_0, x0
209*54fd6939SJiyong Park	ldr	x0, =0xEE010F12
210*54fd6939SJiyong Park	msr	S3_6_C15_C8_2, x0
211*54fd6939SJiyong Park	ldr	x0, =0xFFFF0FFF
212*54fd6939SJiyong Park	msr	S3_6_C15_C8_3, x0
213*54fd6939SJiyong Park	ldr	x0, =0x80000000003FF
214*54fd6939SJiyong Park	msr	S3_6_C15_C8_1, x0
215*54fd6939SJiyong Park	isb
216*54fd6939SJiyong Park
217*54fd6939SJiyong Park1:
218*54fd6939SJiyong Park	ret	x17
219*54fd6939SJiyong Parkendfunc errata_neoverse_v1_1966096_wa
220*54fd6939SJiyong Park
221*54fd6939SJiyong Parkfunc check_errata_1966096
222*54fd6939SJiyong Park	mov	x1, #0x10
223*54fd6939SJiyong Park	mov	x2, #0x11
224*54fd6939SJiyong Park	b	cpu_rev_var_range
225*54fd6939SJiyong Parkendfunc check_errata_1966096
226*54fd6939SJiyong Park
227*54fd6939SJiyong Park	/* --------------------------------------------------
228*54fd6939SJiyong Park	 * Errata Workaround for Neoverse V1 Errata #2139242.
229*54fd6939SJiyong Park	 * This applies to revisions r0p0, r1p0, and r1p1, it
230*54fd6939SJiyong Park	 * is still open.
231*54fd6939SJiyong Park	 * x0: variant[4:7] and revision[0:3] of current cpu.
232*54fd6939SJiyong Park	 * Shall clobber: x0-x17
233*54fd6939SJiyong Park	 * --------------------------------------------------
234*54fd6939SJiyong Park	 */
235*54fd6939SJiyong Parkfunc errata_neoverse_v1_2139242_wa
236*54fd6939SJiyong Park	/* Check workaround compatibility. */
237*54fd6939SJiyong Park	mov	x17, x30
238*54fd6939SJiyong Park	bl	check_errata_2139242
239*54fd6939SJiyong Park	cbz	x0, 1f
240*54fd6939SJiyong Park
241*54fd6939SJiyong Park	/* Apply the workaround. */
242*54fd6939SJiyong Park	mov	x0, #0x3
243*54fd6939SJiyong Park	msr	S3_6_C15_C8_0, x0
244*54fd6939SJiyong Park	ldr	x0, =0xEE720F14
245*54fd6939SJiyong Park	msr	S3_6_C15_C8_2, x0
246*54fd6939SJiyong Park	ldr	x0, =0xFFFF0FDF
247*54fd6939SJiyong Park	msr	S3_6_C15_C8_3, x0
248*54fd6939SJiyong Park	ldr	x0, =0x40000005003FF
249*54fd6939SJiyong Park	msr	S3_6_C15_C8_1, x0
250*54fd6939SJiyong Park	isb
251*54fd6939SJiyong Park
252*54fd6939SJiyong Park1:
253*54fd6939SJiyong Park	ret	x17
254*54fd6939SJiyong Parkendfunc errata_neoverse_v1_2139242_wa
255*54fd6939SJiyong Park
256*54fd6939SJiyong Parkfunc check_errata_2139242
257*54fd6939SJiyong Park	/* Applies to r0p0, r1p0, r1p1 */
258*54fd6939SJiyong Park	mov	x1, #0x11
259*54fd6939SJiyong Park	b	cpu_rev_var_ls
260*54fd6939SJiyong Parkendfunc check_errata_2139242
261*54fd6939SJiyong Park
262*54fd6939SJiyong Park	/* --------------------------------------------------
263*54fd6939SJiyong Park	 * Errata Workaround for Neoverse V1 Errata #2108267.
264*54fd6939SJiyong Park	 * This applies to revisions r0p0, r1p0, and r1p1, it
265*54fd6939SJiyong Park	 * is still open.
266*54fd6939SJiyong Park	 * x0: variant[4:7] and revision[0:3] of current cpu.
267*54fd6939SJiyong Park	 * Shall clobber: x0-x1, x17
268*54fd6939SJiyong Park	 * --------------------------------------------------
269*54fd6939SJiyong Park	 */
270*54fd6939SJiyong Parkfunc errata_neoverse_v1_2108267_wa
271*54fd6939SJiyong Park	/* Check workaround compatibility. */
272*54fd6939SJiyong Park	mov	x17, x30
273*54fd6939SJiyong Park	bl	check_errata_2108267
274*54fd6939SJiyong Park	cbz	x0, 1f
275*54fd6939SJiyong Park
276*54fd6939SJiyong Park	/* Apply the workaround. */
277*54fd6939SJiyong Park	mrs	x1, NEOVERSE_V1_CPUECTLR_EL1
278*54fd6939SJiyong Park	mov	x0, #NEOVERSE_V1_CPUECTLR_EL1_PF_MODE_CNSRV
279*54fd6939SJiyong Park	bfi	x1, x0, #CPUECTLR_EL1_PF_MODE_LSB, #CPUECTLR_EL1_PF_MODE_WIDTH
280*54fd6939SJiyong Park	msr	NEOVERSE_V1_CPUECTLR_EL1, x1
281*54fd6939SJiyong Park1:
282*54fd6939SJiyong Park	ret	x17
283*54fd6939SJiyong Parkendfunc errata_neoverse_v1_2108267_wa
284*54fd6939SJiyong Park
285*54fd6939SJiyong Parkfunc check_errata_2108267
286*54fd6939SJiyong Park	/* Applies to r0p0, r1p0, r1p1 */
287*54fd6939SJiyong Park	mov	x1, #0x11
288*54fd6939SJiyong Park	b	cpu_rev_var_ls
289*54fd6939SJiyong Parkendfunc check_errata_2108267
290*54fd6939SJiyong Park
291*54fd6939SJiyong Park	/* --------------------------------------------------
292*54fd6939SJiyong Park	 * Errata Workaround for Neoverse V1 Errata #2216392.
293*54fd6939SJiyong Park	 * This applies to revisions r1p0 and r1p1 and is
294*54fd6939SJiyong Park	 * still open.
295*54fd6939SJiyong Park	 * This issue is also present in r0p0 but there is no
296*54fd6939SJiyong Park	 * workaround in that revision.
297*54fd6939SJiyong Park	 * x0: variant[4:7] and revision[0:3] of current cpu.
298*54fd6939SJiyong Park	 * Shall clobber: x0-x17
299*54fd6939SJiyong Park	 * --------------------------------------------------
300*54fd6939SJiyong Park	 */
301*54fd6939SJiyong Parkfunc errata_neoverse_v1_2216392_wa
302*54fd6939SJiyong Park	/* Check workaround compatibility. */
303*54fd6939SJiyong Park	mov	x17, x30
304*54fd6939SJiyong Park	bl	check_errata_2216392
305*54fd6939SJiyong Park	cbz	x0, 1f
306*54fd6939SJiyong Park
307*54fd6939SJiyong Park	ldr	x0, =0x5
308*54fd6939SJiyong Park	msr	S3_6_c15_c8_0, x0 /* CPUPSELR_EL3 */
309*54fd6939SJiyong Park	ldr	x0, =0x10F600E000
310*54fd6939SJiyong Park	msr	S3_6_c15_c8_2, x0 /* CPUPOR_EL3 */
311*54fd6939SJiyong Park	ldr	x0, =0x10FF80E000
312*54fd6939SJiyong Park	msr	S3_6_c15_c8_3, x0 /* CPUPMR_EL3 */
313*54fd6939SJiyong Park	ldr	x0, =0x80000000003FF
314*54fd6939SJiyong Park	msr	S3_6_c15_c8_1, x0 /* CPUPCR_EL3 */
315*54fd6939SJiyong Park
316*54fd6939SJiyong Park	isb
317*54fd6939SJiyong Park1:
318*54fd6939SJiyong Park	ret	x17
319*54fd6939SJiyong Parkendfunc errata_neoverse_v1_2216392_wa
320*54fd6939SJiyong Park
321*54fd6939SJiyong Parkfunc check_errata_2216392
322*54fd6939SJiyong Park	/* Applies to revisions r1p0 and r1p1. */
323*54fd6939SJiyong Park	mov	x1, #CPU_REV(1, 0)
324*54fd6939SJiyong Park	mov	x2, #CPU_REV(1, 1)
325*54fd6939SJiyong Park	b	cpu_rev_var_range
326*54fd6939SJiyong Parkendfunc check_errata_2216392
327*54fd6939SJiyong Park
328*54fd6939SJiyong Park	/* ---------------------------------------------
329*54fd6939SJiyong Park	 * HW will do the cache maintenance while powering down
330*54fd6939SJiyong Park	 * ---------------------------------------------
331*54fd6939SJiyong Park	 */
332*54fd6939SJiyong Parkfunc neoverse_v1_core_pwr_dwn
333*54fd6939SJiyong Park	/* ---------------------------------------------
334*54fd6939SJiyong Park	 * Enable CPU power down bit in power control register
335*54fd6939SJiyong Park	 * ---------------------------------------------
336*54fd6939SJiyong Park	 */
337*54fd6939SJiyong Park	mrs	x0, NEOVERSE_V1_CPUPWRCTLR_EL1
338*54fd6939SJiyong Park	orr	x0, x0, #NEOVERSE_V1_CPUPWRCTLR_EL1_CORE_PWRDN_BIT
339*54fd6939SJiyong Park	msr	NEOVERSE_V1_CPUPWRCTLR_EL1, x0
340*54fd6939SJiyong Park	isb
341*54fd6939SJiyong Park	ret
342*54fd6939SJiyong Parkendfunc neoverse_v1_core_pwr_dwn
343*54fd6939SJiyong Park
344*54fd6939SJiyong Park	/*
345*54fd6939SJiyong Park	 * Errata printing function for Neoverse V1. Must follow AAPCS.
346*54fd6939SJiyong Park	 */
347*54fd6939SJiyong Park#if REPORT_ERRATA
348*54fd6939SJiyong Parkfunc neoverse_v1_errata_report
349*54fd6939SJiyong Park	stp	x8, x30, [sp, #-16]!
350*54fd6939SJiyong Park
351*54fd6939SJiyong Park	bl	cpu_get_rev_var
352*54fd6939SJiyong Park	mov	x8, x0
353*54fd6939SJiyong Park
354*54fd6939SJiyong Park	/*
355*54fd6939SJiyong Park	 * Report all errata. The revision-variant information is passed to
356*54fd6939SJiyong Park	 * checking functions of each errata.
357*54fd6939SJiyong Park	 */
358*54fd6939SJiyong Park	report_errata ERRATA_V1_1774420, neoverse_v1, 1774420
359*54fd6939SJiyong Park	report_errata ERRATA_V1_1791573, neoverse_v1, 1791573
360*54fd6939SJiyong Park	report_errata ERRATA_V1_1852267, neoverse_v1, 1852267
361*54fd6939SJiyong Park	report_errata ERRATA_V1_1925756, neoverse_v1, 1925756
362*54fd6939SJiyong Park	report_errata ERRATA_V1_1940577, neoverse_v1, 1940577
363*54fd6939SJiyong Park	report_errata ERRATA_V1_1966096, neoverse_v1, 1966096
364*54fd6939SJiyong Park	report_errata ERRATA_V1_2139242, neoverse_v1, 2139242
365*54fd6939SJiyong Park	report_errata ERRATA_V1_2108267, neoverse_v1, 2108267
366*54fd6939SJiyong Park	report_errata ERRATA_V1_2216392, neoverse_v1, 2216392
367*54fd6939SJiyong Park
368*54fd6939SJiyong Park	ldp	x8, x30, [sp], #16
369*54fd6939SJiyong Park	ret
370*54fd6939SJiyong Parkendfunc neoverse_v1_errata_report
371*54fd6939SJiyong Park#endif
372*54fd6939SJiyong Park
373*54fd6939SJiyong Parkfunc neoverse_v1_reset_func
374*54fd6939SJiyong Park	mov	x19, x30
375*54fd6939SJiyong Park
376*54fd6939SJiyong Park	/* Disable speculative loads */
377*54fd6939SJiyong Park	msr	SSBS, xzr
378*54fd6939SJiyong Park	isb
379*54fd6939SJiyong Park
380*54fd6939SJiyong Park#if ERRATA_V1_1774420
381*54fd6939SJiyong Park	mov	x0, x18
382*54fd6939SJiyong Park	bl	errata_neoverse_v1_1774420_wa
383*54fd6939SJiyong Park#endif
384*54fd6939SJiyong Park
385*54fd6939SJiyong Park#if ERRATA_V1_1791573
386*54fd6939SJiyong Park	mov	x0, x18
387*54fd6939SJiyong Park	bl	errata_neoverse_v1_1791573_wa
388*54fd6939SJiyong Park#endif
389*54fd6939SJiyong Park
390*54fd6939SJiyong Park#if ERRATA_V1_1852267
391*54fd6939SJiyong Park	mov	x0, x18
392*54fd6939SJiyong Park	bl	errata_neoverse_v1_1852267_wa
393*54fd6939SJiyong Park#endif
394*54fd6939SJiyong Park
395*54fd6939SJiyong Park#if ERRATA_V1_1925756
396*54fd6939SJiyong Park	mov	x0, x18
397*54fd6939SJiyong Park	bl	errata_neoverse_v1_1925756_wa
398*54fd6939SJiyong Park#endif
399*54fd6939SJiyong Park
400*54fd6939SJiyong Park#if ERRATA_V1_1940577
401*54fd6939SJiyong Park	mov	x0, x18
402*54fd6939SJiyong Park	bl	errata_neoverse_v1_1940577_wa
403*54fd6939SJiyong Park#endif
404*54fd6939SJiyong Park
405*54fd6939SJiyong Park#if ERRATA_V1_1966096
406*54fd6939SJiyong Park	mov	x0, x18
407*54fd6939SJiyong Park	bl	errata_neoverse_v1_1966096_wa
408*54fd6939SJiyong Park#endif
409*54fd6939SJiyong Park
410*54fd6939SJiyong Park#if ERRATA_V1_2139242
411*54fd6939SJiyong Park	mov	x0, x18
412*54fd6939SJiyong Park	bl	errata_neoverse_v1_2139242_wa
413*54fd6939SJiyong Park#endif
414*54fd6939SJiyong Park
415*54fd6939SJiyong Park#if ERRATA_V1_2108267
416*54fd6939SJiyong Park	mov	x0, x18
417*54fd6939SJiyong Park	bl	errata_neoverse_v1_2108267_wa
418*54fd6939SJiyong Park#endif
419*54fd6939SJiyong Park
420*54fd6939SJiyong Park#if ERRATA_V1_2216392
421*54fd6939SJiyong Park	mov	x0, x18
422*54fd6939SJiyong Park	bl	errata_neoverse_v1_2216392_wa
423*54fd6939SJiyong Park#endif
424*54fd6939SJiyong Park
425*54fd6939SJiyong Park	ret	x19
426*54fd6939SJiyong Parkendfunc neoverse_v1_reset_func
427*54fd6939SJiyong Park
428*54fd6939SJiyong Park	/* ---------------------------------------------
429*54fd6939SJiyong Park	 * This function provides Neoverse-V1 specific
430*54fd6939SJiyong Park	 * register information for crash reporting.
431*54fd6939SJiyong Park	 * It needs to return with x6 pointing to
432*54fd6939SJiyong Park	 * a list of register names in ascii and
433*54fd6939SJiyong Park	 * x8 - x15 having values of registers to be
434*54fd6939SJiyong Park	 * reported.
435*54fd6939SJiyong Park	 * ---------------------------------------------
436*54fd6939SJiyong Park	 */
437*54fd6939SJiyong Park.section .rodata.neoverse_v1_regs, "aS"
438*54fd6939SJiyong Parkneoverse_v1_regs:  /* The ascii list of register names to be reported */
439*54fd6939SJiyong Park	.asciz	"cpuectlr_el1", ""
440*54fd6939SJiyong Park
441*54fd6939SJiyong Parkfunc neoverse_v1_cpu_reg_dump
442*54fd6939SJiyong Park	adr	x6, neoverse_v1_regs
443*54fd6939SJiyong Park	mrs	x8, NEOVERSE_V1_CPUECTLR_EL1
444*54fd6939SJiyong Park	ret
445*54fd6939SJiyong Parkendfunc neoverse_v1_cpu_reg_dump
446*54fd6939SJiyong Park
447*54fd6939SJiyong Parkdeclare_cpu_ops neoverse_v1, NEOVERSE_V1_MIDR, \
448*54fd6939SJiyong Park	neoverse_v1_reset_func, \
449*54fd6939SJiyong Park	neoverse_v1_core_pwr_dwn
450