xref: /rk3399_ARM-atf/lib/cpus/aarch64/neoverse_n1.S (revision 1ca5c887ba22c829ae06ff82270804c147c44e0a)
1b04ea14bSJohn Tsichritzis/*
2*1ca5c887Slaurenw-arm * Copyright (c) 2017-2023, Arm Limited and Contributors. All rights reserved.
3b04ea14bSJohn Tsichritzis *
4b04ea14bSJohn Tsichritzis * SPDX-License-Identifier: BSD-3-Clause
5b04ea14bSJohn Tsichritzis */
6b04ea14bSJohn Tsichritzis
7b04ea14bSJohn Tsichritzis#include <arch.h>
8b04ea14bSJohn Tsichritzis#include <asm_macros.S>
9b04ea14bSJohn Tsichritzis#include <cpuamu.h>
10b04ea14bSJohn Tsichritzis#include <cpu_macros.S>
1125bbbd2dSJavier Almansa Sobrino#include <neoverse_n1.h>
121fe4a9d1SBipin Ravi#include "wa_cve_2022_23960_bhb_vector.S"
13b04ea14bSJohn Tsichritzis
14076b5f02SJohn Tsichritzis/* Hardware handled coherency */
15076b5f02SJohn Tsichritzis#if HW_ASSISTED_COHERENCY == 0
16076b5f02SJohn Tsichritzis#error "Neoverse N1 must be compiled with HW_ASSISTED_COHERENCY enabled"
17076b5f02SJohn Tsichritzis#endif
18076b5f02SJohn Tsichritzis
19629d04f5SJohn Tsichritzis/* 64-bit only core */
20629d04f5SJohn Tsichritzis#if CTX_INCLUDE_AARCH32_REGS == 1
21629d04f5SJohn Tsichritzis#error "Neoverse-N1 supports only AArch64. Compile with CTX_INCLUDE_AARCH32_REGS=0"
22629d04f5SJohn Tsichritzis#endif
23629d04f5SJohn Tsichritzis
2480942622Slaurenw-arm	.global neoverse_n1_errata_ic_trap_handler
2580942622Slaurenw-arm
261fe4a9d1SBipin Ravi#if WORKAROUND_CVE_2022_23960
271fe4a9d1SBipin Ravi	wa_cve_2022_23960_bhb_vector_table NEOVERSE_N1_BHB_LOOP_COUNT, neoverse_n1
281fe4a9d1SBipin Ravi#endif /* WORKAROUND_CVE_2022_23960 */
291fe4a9d1SBipin Ravi
30b04ea14bSJohn Tsichritzis/* --------------------------------------------------
315f5d0763SAndre Przywara * Errata Workaround for Neoverse N1 Erratum 1043202.
32da6d75a0SJohn Tsichritzis * This applies to revision r0p0 and r1p0 of Neoverse N1.
33b04ea14bSJohn Tsichritzis * Inputs:
34b04ea14bSJohn Tsichritzis * x0: variant[4:7] and revision[0:3] of current cpu.
35b04ea14bSJohn Tsichritzis * Shall clobber: x0-x17
36b04ea14bSJohn Tsichritzis * --------------------------------------------------
37b04ea14bSJohn Tsichritzis */
38da6d75a0SJohn Tsichritzisfunc errata_n1_1043202_wa
39b04ea14bSJohn Tsichritzis	/* Compare x0 against revision r1p0 */
40b04ea14bSJohn Tsichritzis	mov	x17, x30
41b04ea14bSJohn Tsichritzis	bl	check_errata_1043202
42b04ea14bSJohn Tsichritzis	cbz	x0, 1f
43b04ea14bSJohn Tsichritzis
44b04ea14bSJohn Tsichritzis	/* Apply instruction patching sequence */
45b04ea14bSJohn Tsichritzis	ldr	x0, =0x0
46b04ea14bSJohn Tsichritzis	msr	CPUPSELR_EL3, x0
47b04ea14bSJohn Tsichritzis	ldr	x0, =0xF3BF8F2F
48b04ea14bSJohn Tsichritzis	msr	CPUPOR_EL3, x0
49b04ea14bSJohn Tsichritzis	ldr	x0, =0xFFFFFFFF
50b04ea14bSJohn Tsichritzis	msr	CPUPMR_EL3, x0
51b04ea14bSJohn Tsichritzis	ldr	x0, =0x800200071
52b04ea14bSJohn Tsichritzis	msr	CPUPCR_EL3, x0
53a33ec1e7Slaurenw-arm	isb
54b04ea14bSJohn Tsichritzis1:
55b04ea14bSJohn Tsichritzis	ret	x17
56da6d75a0SJohn Tsichritzisendfunc errata_n1_1043202_wa
57b04ea14bSJohn Tsichritzis
58b04ea14bSJohn Tsichritzisfunc check_errata_1043202
59b04ea14bSJohn Tsichritzis	/* Applies to r0p0 and r1p0 */
60b04ea14bSJohn Tsichritzis	mov	x1, #0x10
61b04ea14bSJohn Tsichritzis	b	cpu_rev_var_ls
62b04ea14bSJohn Tsichritzisendfunc check_errata_1043202
63b04ea14bSJohn Tsichritzis
64eca6e453SSami Mujawar/* --------------------------------------------------
65a601afe1Slauwal01 * Errata Workaround for Neoverse N1 Errata #1073348
66a601afe1Slauwal01 * This applies to revision r0p0 and r1p0 of Neoverse N1.
67a601afe1Slauwal01 * Inputs:
68a601afe1Slauwal01 * x0: variant[4:7] and revision[0:3] of current cpu.
69a601afe1Slauwal01 * Shall clobber: x0-x17
70a601afe1Slauwal01 * --------------------------------------------------
71a601afe1Slauwal01 */
72a601afe1Slauwal01func errata_n1_1073348_wa
73a601afe1Slauwal01	/* Compare x0 against revision r1p0 */
74a601afe1Slauwal01	mov	x17, x30
75a601afe1Slauwal01	bl	check_errata_1073348
76a601afe1Slauwal01	cbz	x0, 1f
77a601afe1Slauwal01	mrs	x1, NEOVERSE_N1_CPUACTLR_EL1
78a601afe1Slauwal01	orr	x1, x1, NEOVERSE_N1_CPUACTLR_EL1_BIT_6
79a601afe1Slauwal01	msr	NEOVERSE_N1_CPUACTLR_EL1, x1
80a601afe1Slauwal011:
81a601afe1Slauwal01	ret	x17
82a601afe1Slauwal01endfunc errata_n1_1073348_wa
83a601afe1Slauwal01
84a601afe1Slauwal01func check_errata_1073348
85a601afe1Slauwal01	/* Applies to r0p0 and r1p0 */
86a601afe1Slauwal01	mov	x1, #0x10
87a601afe1Slauwal01	b	cpu_rev_var_ls
88a601afe1Slauwal01endfunc check_errata_1073348
89a601afe1Slauwal01
90a601afe1Slauwal01/* --------------------------------------------------
91e34606f2Slauwal01 * Errata Workaround for Neoverse N1 Errata #1130799
92e34606f2Slauwal01 * This applies to revision <=r2p0 of Neoverse N1.
93e34606f2Slauwal01 * Inputs:
94e34606f2Slauwal01 * x0: variant[4:7] and revision[0:3] of current cpu.
95e34606f2Slauwal01 * Shall clobber: x0-x17
96e34606f2Slauwal01 * --------------------------------------------------
97e34606f2Slauwal01 */
98e34606f2Slauwal01func errata_n1_1130799_wa
99e34606f2Slauwal01	/* Compare x0 against revision r2p0 */
100e34606f2Slauwal01	mov	x17, x30
101e34606f2Slauwal01	bl	check_errata_1130799
102e34606f2Slauwal01	cbz	x0, 1f
103e34606f2Slauwal01	mrs	x1, NEOVERSE_N1_CPUACTLR2_EL1
104e34606f2Slauwal01	orr	x1, x1, NEOVERSE_N1_CPUACTLR2_EL1_BIT_59
105e34606f2Slauwal01	msr	NEOVERSE_N1_CPUACTLR2_EL1, x1
106e34606f2Slauwal011:
107e34606f2Slauwal01	ret	x17
108e34606f2Slauwal01endfunc errata_n1_1130799_wa
109e34606f2Slauwal01
110e34606f2Slauwal01func check_errata_1130799
111e34606f2Slauwal01	/* Applies to <=r2p0 */
112e34606f2Slauwal01	mov	x1, #0x20
113e34606f2Slauwal01	b	cpu_rev_var_ls
114e34606f2Slauwal01endfunc check_errata_1130799
115e34606f2Slauwal01
116e34606f2Slauwal01/* --------------------------------------------------
1172017ab24Slauwal01 * Errata Workaround for Neoverse N1 Errata #1165347
1182017ab24Slauwal01 * This applies to revision <=r2p0 of Neoverse N1.
1192017ab24Slauwal01 * Inputs:
1202017ab24Slauwal01 * x0: variant[4:7] and revision[0:3] of current cpu.
1212017ab24Slauwal01 * Shall clobber: x0-x17
1222017ab24Slauwal01 * --------------------------------------------------
1232017ab24Slauwal01 */
1242017ab24Slauwal01func errata_n1_1165347_wa
1252017ab24Slauwal01	/* Compare x0 against revision r2p0 */
1262017ab24Slauwal01	mov	x17, x30
1272017ab24Slauwal01	bl	check_errata_1165347
1282017ab24Slauwal01	cbz	x0, 1f
1292017ab24Slauwal01	mrs	x1, NEOVERSE_N1_CPUACTLR2_EL1
1302017ab24Slauwal01	orr	x1, x1, NEOVERSE_N1_CPUACTLR2_EL1_BIT_0
1312017ab24Slauwal01	orr	x1, x1, NEOVERSE_N1_CPUACTLR2_EL1_BIT_15
1322017ab24Slauwal01	msr	NEOVERSE_N1_CPUACTLR2_EL1, x1
1332017ab24Slauwal011:
1342017ab24Slauwal01	ret	x17
1352017ab24Slauwal01endfunc errata_n1_1165347_wa
1362017ab24Slauwal01
1372017ab24Slauwal01func check_errata_1165347
1382017ab24Slauwal01	/* Applies to <=r2p0 */
1392017ab24Slauwal01	mov	x1, #0x20
1402017ab24Slauwal01	b	cpu_rev_var_ls
1412017ab24Slauwal01endfunc check_errata_1165347
1422017ab24Slauwal01
1432017ab24Slauwal01/* --------------------------------------------------
144ef5fa7d4Slauwal01 * Errata Workaround for Neoverse N1 Errata #1207823
145ef5fa7d4Slauwal01 * This applies to revision <=r2p0 of Neoverse N1.
146ef5fa7d4Slauwal01 * Inputs:
147ef5fa7d4Slauwal01 * x0: variant[4:7] and revision[0:3] of current cpu.
148ef5fa7d4Slauwal01 * Shall clobber: x0-x17
149ef5fa7d4Slauwal01 * --------------------------------------------------
150ef5fa7d4Slauwal01 */
151ef5fa7d4Slauwal01func errata_n1_1207823_wa
152ef5fa7d4Slauwal01	/* Compare x0 against revision r2p0 */
153ef5fa7d4Slauwal01	mov	x17, x30
154ef5fa7d4Slauwal01	bl	check_errata_1207823
155ef5fa7d4Slauwal01	cbz	x0, 1f
156ef5fa7d4Slauwal01	mrs	x1, NEOVERSE_N1_CPUACTLR2_EL1
157ef5fa7d4Slauwal01	orr	x1, x1, NEOVERSE_N1_CPUACTLR2_EL1_BIT_11
158ef5fa7d4Slauwal01	msr	NEOVERSE_N1_CPUACTLR2_EL1, x1
159ef5fa7d4Slauwal011:
160ef5fa7d4Slauwal01	ret	x17
161ef5fa7d4Slauwal01endfunc errata_n1_1207823_wa
162ef5fa7d4Slauwal01
163ef5fa7d4Slauwal01func check_errata_1207823
164ef5fa7d4Slauwal01	/* Applies to <=r2p0 */
165ef5fa7d4Slauwal01	mov	x1, #0x20
166ef5fa7d4Slauwal01	b	cpu_rev_var_ls
167ef5fa7d4Slauwal01endfunc check_errata_1207823
168ef5fa7d4Slauwal01
169ef5fa7d4Slauwal01/* --------------------------------------------------
1709eceb020Slauwal01 * Errata Workaround for Neoverse N1 Errata #1220197
1719eceb020Slauwal01 * This applies to revision <=r2p0 of Neoverse N1.
1729eceb020Slauwal01 * Inputs:
1739eceb020Slauwal01 * x0: variant[4:7] and revision[0:3] of current cpu.
1749eceb020Slauwal01 * Shall clobber: x0-x17
1759eceb020Slauwal01 * --------------------------------------------------
1769eceb020Slauwal01 */
1779eceb020Slauwal01func errata_n1_1220197_wa
1789eceb020Slauwal01	/* Compare x0 against revision r2p0 */
1799eceb020Slauwal01	mov	x17, x30
1809eceb020Slauwal01	bl	check_errata_1220197
1819eceb020Slauwal01	cbz	x0, 1f
1829eceb020Slauwal01	mrs	x1, NEOVERSE_N1_CPUECTLR_EL1
1839eceb020Slauwal01	orr	x1, x1, NEOVERSE_N1_WS_THR_L2_MASK
1849eceb020Slauwal01	msr	NEOVERSE_N1_CPUECTLR_EL1, x1
1859eceb020Slauwal011:
1869eceb020Slauwal01	ret	x17
1879eceb020Slauwal01endfunc errata_n1_1220197_wa
1889eceb020Slauwal01
1899eceb020Slauwal01func check_errata_1220197
1909eceb020Slauwal01	/* Applies to <=r2p0 */
1919eceb020Slauwal01	mov	x1, #0x20
1929eceb020Slauwal01	b	cpu_rev_var_ls
1939eceb020Slauwal01endfunc check_errata_1220197
1949eceb020Slauwal01
1959eceb020Slauwal01/* --------------------------------------------------
196335b3c79Slauwal01 * Errata Workaround for Neoverse N1 Errata #1257314
197335b3c79Slauwal01 * This applies to revision <=r3p0 of Neoverse N1.
198335b3c79Slauwal01 * Inputs:
199335b3c79Slauwal01 * x0: variant[4:7] and revision[0:3] of current cpu.
200335b3c79Slauwal01 * Shall clobber: x0-x17
201335b3c79Slauwal01 * --------------------------------------------------
202335b3c79Slauwal01 */
203335b3c79Slauwal01func errata_n1_1257314_wa
204335b3c79Slauwal01	/* Compare x0 against revision r3p0 */
205335b3c79Slauwal01	mov	x17, x30
206335b3c79Slauwal01	bl	check_errata_1257314
207335b3c79Slauwal01	cbz	x0, 1f
208335b3c79Slauwal01	mrs	x1, NEOVERSE_N1_CPUACTLR3_EL1
209335b3c79Slauwal01	orr	x1, x1, NEOVERSE_N1_CPUACTLR3_EL1_BIT_10
210335b3c79Slauwal01	msr	NEOVERSE_N1_CPUACTLR3_EL1, x1
211335b3c79Slauwal011:
212335b3c79Slauwal01	ret	x17
213335b3c79Slauwal01endfunc errata_n1_1257314_wa
214335b3c79Slauwal01
215335b3c79Slauwal01func check_errata_1257314
216335b3c79Slauwal01	/* Applies to <=r3p0 */
217335b3c79Slauwal01	mov	x1, #0x30
218335b3c79Slauwal01	b	cpu_rev_var_ls
219335b3c79Slauwal01endfunc check_errata_1257314
220335b3c79Slauwal01
221335b3c79Slauwal01/* --------------------------------------------------
222411f4959Slauwal01 * Errata Workaround for Neoverse N1 Errata #1262606
223411f4959Slauwal01 * This applies to revision <=r3p0 of Neoverse N1.
224411f4959Slauwal01 * Inputs:
225411f4959Slauwal01 * x0: variant[4:7] and revision[0:3] of current cpu.
226411f4959Slauwal01 * Shall clobber: x0-x17
227411f4959Slauwal01 * --------------------------------------------------
228411f4959Slauwal01 */
229411f4959Slauwal01func errata_n1_1262606_wa
230411f4959Slauwal01	/* Compare x0 against revision r3p0 */
231411f4959Slauwal01	mov	x17, x30
232411f4959Slauwal01	bl	check_errata_1262606
233411f4959Slauwal01	cbz	x0, 1f
234411f4959Slauwal01	mrs	x1, NEOVERSE_N1_CPUACTLR_EL1
235411f4959Slauwal01	orr	x1, x1, NEOVERSE_N1_CPUACTLR_EL1_BIT_13
236411f4959Slauwal01	msr	NEOVERSE_N1_CPUACTLR_EL1, x1
237411f4959Slauwal011:
238411f4959Slauwal01	ret	x17
239411f4959Slauwal01endfunc errata_n1_1262606_wa
240411f4959Slauwal01
241411f4959Slauwal01func check_errata_1262606
242411f4959Slauwal01	/* Applies to <=r3p0 */
243411f4959Slauwal01	mov	x1, #0x30
244411f4959Slauwal01	b	cpu_rev_var_ls
245411f4959Slauwal01endfunc check_errata_1262606
246411f4959Slauwal01
247411f4959Slauwal01/* --------------------------------------------------
24811c48370Slauwal01 * Errata Workaround for Neoverse N1 Errata #1262888
24911c48370Slauwal01 * This applies to revision <=r3p0 of Neoverse N1.
25011c48370Slauwal01 * Inputs:
25111c48370Slauwal01 * x0: variant[4:7] and revision[0:3] of current cpu.
25211c48370Slauwal01 * Shall clobber: x0-x17
25311c48370Slauwal01 * --------------------------------------------------
25411c48370Slauwal01 */
25511c48370Slauwal01func errata_n1_1262888_wa
25611c48370Slauwal01	/* Compare x0 against revision r3p0 */
25711c48370Slauwal01	mov	x17, x30
25811c48370Slauwal01	bl	check_errata_1262888
25911c48370Slauwal01	cbz	x0, 1f
26011c48370Slauwal01	mrs	x1, NEOVERSE_N1_CPUECTLR_EL1
26111c48370Slauwal01	orr	x1, x1, NEOVERSE_N1_CPUECTLR_EL1_MM_TLBPF_DIS_BIT
26211c48370Slauwal01	msr	NEOVERSE_N1_CPUECTLR_EL1, x1
26311c48370Slauwal011:
26411c48370Slauwal01	ret	x17
26511c48370Slauwal01endfunc errata_n1_1262888_wa
26611c48370Slauwal01
26711c48370Slauwal01func check_errata_1262888
26811c48370Slauwal01	/* Applies to <=r3p0 */
26911c48370Slauwal01	mov	x1, #0x30
27011c48370Slauwal01	b	cpu_rev_var_ls
27111c48370Slauwal01endfunc check_errata_1262888
27211c48370Slauwal01
27311c48370Slauwal01/* --------------------------------------------------
2744d8801feSlauwal01 * Errata Workaround for Neoverse N1 Errata #1275112
2754d8801feSlauwal01 * This applies to revision <=r3p0 of Neoverse N1.
2764d8801feSlauwal01 * Inputs:
2774d8801feSlauwal01 * x0: variant[4:7] and revision[0:3] of current cpu.
2784d8801feSlauwal01 * Shall clobber: x0-x17
2794d8801feSlauwal01 * --------------------------------------------------
2804d8801feSlauwal01 */
2814d8801feSlauwal01func errata_n1_1275112_wa
2824d8801feSlauwal01	/* Compare x0 against revision r3p0 */
2834d8801feSlauwal01	mov	x17, x30
2844d8801feSlauwal01	bl	check_errata_1275112
2854d8801feSlauwal01	cbz	x0, 1f
2864d8801feSlauwal01	mrs	x1, NEOVERSE_N1_CPUACTLR_EL1
2874d8801feSlauwal01	orr	x1, x1, NEOVERSE_N1_CPUACTLR_EL1_BIT_13
2884d8801feSlauwal01	msr	NEOVERSE_N1_CPUACTLR_EL1, x1
2894d8801feSlauwal011:
2904d8801feSlauwal01	ret	x17
2914d8801feSlauwal01endfunc errata_n1_1275112_wa
2924d8801feSlauwal01
2934d8801feSlauwal01func check_errata_1275112
2944d8801feSlauwal01	/* Applies to <=r3p0 */
2954d8801feSlauwal01	mov	x1, #0x30
2964d8801feSlauwal01	b	cpu_rev_var_ls
2974d8801feSlauwal01endfunc check_errata_1275112
2984d8801feSlauwal01
2994d8801feSlauwal01/* --------------------------------------------------
3005f5d0763SAndre Przywara * Errata Workaround for Neoverse N1 Erratum 1315703.
3015f5d0763SAndre Przywara * This applies to revision <= r3p0 of Neoverse N1.
3025f5d0763SAndre Przywara * Inputs:
3035f5d0763SAndre Przywara * x0: variant[4:7] and revision[0:3] of current cpu.
3045f5d0763SAndre Przywara * Shall clobber: x0-x17
3055f5d0763SAndre Przywara * --------------------------------------------------
3065f5d0763SAndre Przywara */
3075f5d0763SAndre Przywarafunc errata_n1_1315703_wa
3085f5d0763SAndre Przywara	/* Compare x0 against revision r3p1 */
3095f5d0763SAndre Przywara	mov	x17, x30
3105f5d0763SAndre Przywara	bl	check_errata_1315703
3115f5d0763SAndre Przywara	cbz	x0, 1f
3125f5d0763SAndre Przywara
3135f5d0763SAndre Przywara	mrs	x0, NEOVERSE_N1_CPUACTLR2_EL1
3145f5d0763SAndre Przywara	orr	x0, x0, #NEOVERSE_N1_CPUACTLR2_EL1_BIT_16
3155f5d0763SAndre Przywara	msr	NEOVERSE_N1_CPUACTLR2_EL1, x0
3165f5d0763SAndre Przywara
3175f5d0763SAndre Przywara1:
3185f5d0763SAndre Przywara	ret	x17
3195f5d0763SAndre Przywaraendfunc errata_n1_1315703_wa
3205f5d0763SAndre Przywara
3215f5d0763SAndre Przywarafunc check_errata_1315703
3225f5d0763SAndre Przywara	/* Applies to everything <= r3p0. */
3235f5d0763SAndre Przywara	mov	x1, #0x30
3245f5d0763SAndre Przywara	b	cpu_rev_var_ls
3255f5d0763SAndre Przywaraendfunc check_errata_1315703
3265f5d0763SAndre Przywara
32780942622Slaurenw-arm/* --------------------------------------------------
32880942622Slaurenw-arm * Errata Workaround for Neoverse N1 Erratum 1542419.
32980942622Slaurenw-arm * This applies to revisions r3p0 - r4p0 of Neoverse N1
33080942622Slaurenw-arm * Inputs:
33180942622Slaurenw-arm * x0: variant[4:7] and revision[0:3] of current cpu.
33280942622Slaurenw-arm * Shall clobber: x0-x17
33380942622Slaurenw-arm * --------------------------------------------------
33480942622Slaurenw-arm */
33580942622Slaurenw-armfunc errata_n1_1542419_wa
33680942622Slaurenw-arm	/* Compare x0 against revision r3p0 and r4p0 */
33780942622Slaurenw-arm	mov	x17, x30
33880942622Slaurenw-arm	bl	check_errata_1542419
33980942622Slaurenw-arm	cbz	x0, 1f
34080942622Slaurenw-arm
34180942622Slaurenw-arm	/* Apply instruction patching sequence */
34280942622Slaurenw-arm	ldr	x0, =0x0
34380942622Slaurenw-arm	msr	CPUPSELR_EL3, x0
34480942622Slaurenw-arm	ldr	x0, =0xEE670D35
34580942622Slaurenw-arm	msr	CPUPOR_EL3, x0
34680942622Slaurenw-arm	ldr	x0, =0xFFFF0FFF
34780942622Slaurenw-arm	msr	CPUPMR_EL3, x0
34880942622Slaurenw-arm	ldr	x0, =0x08000020007D
34980942622Slaurenw-arm	msr	CPUPCR_EL3, x0
35080942622Slaurenw-arm	isb
35180942622Slaurenw-arm1:
35280942622Slaurenw-arm	ret	x17
35380942622Slaurenw-armendfunc errata_n1_1542419_wa
35480942622Slaurenw-arm
35580942622Slaurenw-armfunc check_errata_1542419
35680942622Slaurenw-arm	/* Applies to everything r3p0 - r4p0. */
35780942622Slaurenw-arm	mov	x1, #0x30
35880942622Slaurenw-arm	mov	x2, #0x40
35980942622Slaurenw-arm	b	cpu_rev_var_range
36080942622Slaurenw-armendfunc check_errata_1542419
36180942622Slaurenw-arm
36261f0ffc4Sjohpow01	/* --------------------------------------------------
36361f0ffc4Sjohpow01	 * Errata Workaround for Neoverse N1 Errata #1868343.
36461f0ffc4Sjohpow01	 * This applies to revision <= r4p0 of Neoverse N1.
36561f0ffc4Sjohpow01	 * This workaround is the same as the workaround for
36661f0ffc4Sjohpow01	 * errata 1262606 and 1275112 but applies to a wider
36761f0ffc4Sjohpow01	 * revision range.
36861f0ffc4Sjohpow01	 * Inputs:
36961f0ffc4Sjohpow01	 * x0: variant[4:7] and revision[0:3] of current cpu.
37061f0ffc4Sjohpow01	 * Shall clobber: x0-x17
37161f0ffc4Sjohpow01	 * --------------------------------------------------
37261f0ffc4Sjohpow01	 */
37361f0ffc4Sjohpow01func errata_n1_1868343_wa
37461f0ffc4Sjohpow01	/*
37561f0ffc4Sjohpow01	 * Compare x0 against revision r4p0
37661f0ffc4Sjohpow01	 */
37761f0ffc4Sjohpow01	mov	x17, x30
37861f0ffc4Sjohpow01	bl	check_errata_1868343
37961f0ffc4Sjohpow01	cbz	x0, 1f
38061f0ffc4Sjohpow01	mrs	x1, NEOVERSE_N1_CPUACTLR_EL1
38161f0ffc4Sjohpow01	orr	x1, x1, NEOVERSE_N1_CPUACTLR_EL1_BIT_13
38261f0ffc4Sjohpow01	msr	NEOVERSE_N1_CPUACTLR_EL1, x1
38361f0ffc4Sjohpow01	isb
38461f0ffc4Sjohpow011:
38561f0ffc4Sjohpow01	ret	x17
38661f0ffc4Sjohpow01endfunc errata_n1_1868343_wa
38761f0ffc4Sjohpow01
38861f0ffc4Sjohpow01func check_errata_1868343
38961f0ffc4Sjohpow01	/* Applies to everything <= r4p0 */
39061f0ffc4Sjohpow01	mov	x1, #0x40
39161f0ffc4Sjohpow01	b	cpu_rev_var_ls
39261f0ffc4Sjohpow01endfunc check_errata_1868343
39361f0ffc4Sjohpow01
394263ee781Sjohpow01	/* --------------------------------------------------
395263ee781Sjohpow01	 * Errata Workaround for Neoverse N1 Errata #1946160.
396263ee781Sjohpow01	 * This applies to revisions r3p0, r3p1, r4p0, and
397263ee781Sjohpow01	 * r4p1 of Neoverse N1. It also exists in r0p0, r1p0,
398263ee781Sjohpow01	 * and r2p0 but there is no fix in these revisions.
399263ee781Sjohpow01	 * Inputs:
400263ee781Sjohpow01	 * x0: variant[4:7] and revision[0:3] of current cpu.
401263ee781Sjohpow01	 * Shall clobber: x0-x17
402263ee781Sjohpow01	 * --------------------------------------------------
403263ee781Sjohpow01	 */
404263ee781Sjohpow01func errata_n1_1946160_wa
405263ee781Sjohpow01	/*
406263ee781Sjohpow01	 * Compare x0 against r3p0 - r4p1
407263ee781Sjohpow01	 */
408263ee781Sjohpow01	mov	x17, x30
409263ee781Sjohpow01	bl	check_errata_1946160
410263ee781Sjohpow01	cbz	x0, 1f
411263ee781Sjohpow01
412263ee781Sjohpow01	mov	x0, #3
413263ee781Sjohpow01	msr	S3_6_C15_C8_0, x0
414263ee781Sjohpow01	ldr	x0, =0x10E3900002
415263ee781Sjohpow01	msr	S3_6_C15_C8_2, x0
416263ee781Sjohpow01	ldr	x0, =0x10FFF00083
417263ee781Sjohpow01	msr	S3_6_C15_C8_3, x0
418263ee781Sjohpow01	ldr	x0, =0x2001003FF
419263ee781Sjohpow01	msr	S3_6_C15_C8_1, x0
420263ee781Sjohpow01
421263ee781Sjohpow01	mov	x0, #4
422263ee781Sjohpow01	msr	S3_6_C15_C8_0, x0
423263ee781Sjohpow01	ldr	x0, =0x10E3800082
424263ee781Sjohpow01	msr	S3_6_C15_C8_2, x0
425263ee781Sjohpow01	ldr	x0, =0x10FFF00083
426263ee781Sjohpow01	msr	S3_6_C15_C8_3, x0
427263ee781Sjohpow01	ldr	x0, =0x2001003FF
428263ee781Sjohpow01	msr	S3_6_C15_C8_1, x0
429263ee781Sjohpow01
430263ee781Sjohpow01	mov	x0, #5
431263ee781Sjohpow01	msr	S3_6_C15_C8_0, x0
432263ee781Sjohpow01	ldr	x0, =0x10E3800200
433263ee781Sjohpow01	msr	S3_6_C15_C8_2, x0
434263ee781Sjohpow01	ldr	x0, =0x10FFF003E0
435263ee781Sjohpow01	msr	S3_6_C15_C8_3, x0
436263ee781Sjohpow01	ldr	x0, =0x2001003FF
437263ee781Sjohpow01	msr	S3_6_C15_C8_1, x0
438263ee781Sjohpow01
439263ee781Sjohpow01	isb
440263ee781Sjohpow011:
441263ee781Sjohpow01	ret	x17
442263ee781Sjohpow01endfunc errata_n1_1946160_wa
443263ee781Sjohpow01
444263ee781Sjohpow01func check_errata_1946160
445263ee781Sjohpow01	/* Applies to r3p0 - r4p1. */
446263ee781Sjohpow01	mov	x1, #0x30
447263ee781Sjohpow01	mov	x2, #0x41
448263ee781Sjohpow01	b	cpu_rev_var_range
449263ee781Sjohpow01endfunc check_errata_1946160
450263ee781Sjohpow01
4518ce40503SBipin Ravi	/* ----------------------------------------------------
4528ce40503SBipin Ravi	 * Errata Workaround for Neoverse N1 Errata #2743102
4538ce40503SBipin Ravi	 * This applies to revisions <= r4p1 and is still open.
4548ce40503SBipin Ravi	 * x0: variant[4:7] and revision[0:3] of current cpu.
4558ce40503SBipin Ravi	 * Shall clobber: x0-x17
4568ce40503SBipin Ravi	 * ----------------------------------------------------
4578ce40503SBipin Ravi	 */
4588ce40503SBipin Ravifunc errata_n1_2743102_wa
4598ce40503SBipin Ravi	mov	x17, x30
4608ce40503SBipin Ravi	bl	check_errata_2743102
4618ce40503SBipin Ravi	cbz	x0, 1f
4628ce40503SBipin Ravi
4638ce40503SBipin Ravi	/* dsb before isb of power down sequence */
4648ce40503SBipin Ravi	dsb	sy
4658ce40503SBipin Ravi1:
4668ce40503SBipin Ravi	ret	x17
4678ce40503SBipin Raviendfunc errata_n1_2743102_wa
4688ce40503SBipin Ravi
4698ce40503SBipin Ravifunc check_errata_2743102
4708ce40503SBipin Ravi	/* Applies to all revisions <= r4p1 */
4718ce40503SBipin Ravi	mov	x1, #0x41
4728ce40503SBipin Ravi	b	cpu_rev_var_ls
4738ce40503SBipin Raviendfunc check_errata_2743102
4748ce40503SBipin Ravi
4751fe4a9d1SBipin Ravifunc check_errata_cve_2022_23960
4761fe4a9d1SBipin Ravi#if WORKAROUND_CVE_2022_23960
4771fe4a9d1SBipin Ravi	mov	x0, #ERRATA_APPLIES
4781fe4a9d1SBipin Ravi#else
4791fe4a9d1SBipin Ravi	mov	x0, #ERRATA_MISSING
4801fe4a9d1SBipin Ravi#endif
4811fe4a9d1SBipin Ravi	ret
4821fe4a9d1SBipin Raviendfunc check_errata_cve_2022_23960
4831fe4a9d1SBipin Ravi
484*1ca5c887Slaurenw-arm/* --------------------------------------------------
485*1ca5c887Slaurenw-arm * Disable speculative loads if Neoverse N1 supports
486*1ca5c887Slaurenw-arm * SSBS.
487*1ca5c887Slaurenw-arm *
488*1ca5c887Slaurenw-arm * Shall clobber: x0.
489*1ca5c887Slaurenw-arm * --------------------------------------------------
490*1ca5c887Slaurenw-arm */
491*1ca5c887Slaurenw-armfunc neoverse_n1_disable_speculative_loads
492*1ca5c887Slaurenw-arm	/* Check if the PE implements SSBS */
493*1ca5c887Slaurenw-arm	mrs	x0, id_aa64pfr1_el1
494*1ca5c887Slaurenw-arm	tst	x0, #(ID_AA64PFR1_EL1_SSBS_MASK << ID_AA64PFR1_EL1_SSBS_SHIFT)
495*1ca5c887Slaurenw-arm	b.eq	1f
496*1ca5c887Slaurenw-arm
497*1ca5c887Slaurenw-arm	/* Disable speculative loads */
498*1ca5c887Slaurenw-arm	msr	SSBS, xzr
499*1ca5c887Slaurenw-arm
500*1ca5c887Slaurenw-arm1:
501*1ca5c887Slaurenw-arm	ret
502*1ca5c887Slaurenw-armendfunc neoverse_n1_disable_speculative_loads
503*1ca5c887Slaurenw-arm
504da6d75a0SJohn Tsichritzisfunc neoverse_n1_reset_func
505b04ea14bSJohn Tsichritzis	mov	x19, x30
5068074448fSJohn Tsichritzis
507eca6e453SSami Mujawar	bl neoverse_n1_disable_speculative_loads
5088074448fSJohn Tsichritzis
509632ab3ebSLouis Mayencourt	/* Forces all cacheable atomic instructions to be near */
510632ab3ebSLouis Mayencourt	mrs	x0, NEOVERSE_N1_CPUACTLR2_EL1
511632ab3ebSLouis Mayencourt	orr	x0, x0, #NEOVERSE_N1_CPUACTLR2_EL1_BIT_2
512632ab3ebSLouis Mayencourt	msr	NEOVERSE_N1_CPUACTLR2_EL1, x0
513632ab3ebSLouis Mayencourt	isb
514632ab3ebSLouis Mayencourt
515b04ea14bSJohn Tsichritzis	bl	cpu_get_rev_var
516b04ea14bSJohn Tsichritzis	mov	x18, x0
517b04ea14bSJohn Tsichritzis
518da6d75a0SJohn Tsichritzis#if ERRATA_N1_1043202
519b04ea14bSJohn Tsichritzis	mov	x0, x18
520da6d75a0SJohn Tsichritzis	bl	errata_n1_1043202_wa
521b04ea14bSJohn Tsichritzis#endif
522b04ea14bSJohn Tsichritzis
523a601afe1Slauwal01#if ERRATA_N1_1073348
524a601afe1Slauwal01	mov	x0, x18
525a601afe1Slauwal01	bl	errata_n1_1073348_wa
526a601afe1Slauwal01#endif
527a601afe1Slauwal01
528e34606f2Slauwal01#if ERRATA_N1_1130799
529e34606f2Slauwal01	mov	x0, x18
530e34606f2Slauwal01	bl	errata_n1_1130799_wa
531e34606f2Slauwal01#endif
532e34606f2Slauwal01
5332017ab24Slauwal01#if ERRATA_N1_1165347
5342017ab24Slauwal01	mov	x0, x18
5352017ab24Slauwal01	bl	errata_n1_1165347_wa
5362017ab24Slauwal01#endif
5372017ab24Slauwal01
538ef5fa7d4Slauwal01#if ERRATA_N1_1207823
539ef5fa7d4Slauwal01	mov	x0, x18
540ef5fa7d4Slauwal01	bl	errata_n1_1207823_wa
541ef5fa7d4Slauwal01#endif
542ef5fa7d4Slauwal01
5439eceb020Slauwal01#if ERRATA_N1_1220197
5449eceb020Slauwal01	mov	x0, x18
5459eceb020Slauwal01	bl	errata_n1_1220197_wa
5469eceb020Slauwal01#endif
5479eceb020Slauwal01
548335b3c79Slauwal01#if ERRATA_N1_1257314
549335b3c79Slauwal01	mov	x0, x18
550335b3c79Slauwal01	bl	errata_n1_1257314_wa
551335b3c79Slauwal01#endif
552335b3c79Slauwal01
553411f4959Slauwal01#if ERRATA_N1_1262606
554411f4959Slauwal01	mov	x0, x18
555411f4959Slauwal01	bl	errata_n1_1262606_wa
556411f4959Slauwal01#endif
557411f4959Slauwal01
55811c48370Slauwal01#if ERRATA_N1_1262888
55911c48370Slauwal01	mov	x0, x18
56011c48370Slauwal01	bl	errata_n1_1262888_wa
56111c48370Slauwal01#endif
56211c48370Slauwal01
5634d8801feSlauwal01#if ERRATA_N1_1275112
5644d8801feSlauwal01	mov	x0, x18
5654d8801feSlauwal01	bl	errata_n1_1275112_wa
5664d8801feSlauwal01#endif
5674d8801feSlauwal01
5685f5d0763SAndre Przywara#if ERRATA_N1_1315703
5695f5d0763SAndre Przywara	mov	x0, x18
5705f5d0763SAndre Przywara	bl	errata_n1_1315703_wa
5715f5d0763SAndre Przywara#endif
5725f5d0763SAndre Przywara
57380942622Slaurenw-arm#if ERRATA_N1_1542419
57480942622Slaurenw-arm	mov	x0, x18
57580942622Slaurenw-arm	bl	errata_n1_1542419_wa
57680942622Slaurenw-arm#endif
57780942622Slaurenw-arm
57861f0ffc4Sjohpow01#if ERRATA_N1_1868343
57961f0ffc4Sjohpow01	mov	x0, x18
58061f0ffc4Sjohpow01	bl	errata_n1_1868343_wa
58161f0ffc4Sjohpow01#endif
58261f0ffc4Sjohpow01
583263ee781Sjohpow01#if ERRATA_N1_1946160
584263ee781Sjohpow01	mov	x0, x18
585263ee781Sjohpow01	bl	errata_n1_1946160_wa
586263ee781Sjohpow01#endif
587263ee781Sjohpow01
588d23acc9eSAndre Przywara#if ENABLE_FEAT_AMU
589b04ea14bSJohn Tsichritzis	/* Make sure accesses from EL0/EL1 and EL2 are not trapped to EL3 */
590b04ea14bSJohn Tsichritzis	mrs	x0, actlr_el3
591da6d75a0SJohn Tsichritzis	orr	x0, x0, #NEOVERSE_N1_ACTLR_AMEN_BIT
592b04ea14bSJohn Tsichritzis	msr	actlr_el3, x0
593b04ea14bSJohn Tsichritzis
594b04ea14bSJohn Tsichritzis	/* Make sure accesses from EL0/EL1 are not trapped to EL2 */
595b04ea14bSJohn Tsichritzis	mrs	x0, actlr_el2
596da6d75a0SJohn Tsichritzis	orr	x0, x0, #NEOVERSE_N1_ACTLR_AMEN_BIT
597b04ea14bSJohn Tsichritzis	msr	actlr_el2, x0
598b04ea14bSJohn Tsichritzis
599b04ea14bSJohn Tsichritzis	/* Enable group0 counters */
600da6d75a0SJohn Tsichritzis	mov	x0, #NEOVERSE_N1_AMU_GROUP0_MASK
601b04ea14bSJohn Tsichritzis	msr	CPUAMCNTENSET_EL0, x0
602b04ea14bSJohn Tsichritzis#endif
603bb2f077aSLouis Mayencourt
60425bbbd2dSJavier Almansa Sobrino#if NEOVERSE_Nx_EXTERNAL_LLC
605f2d6b4eeSManish Pandey	/* Some system may have External LLC, core needs to be made aware */
606f2d6b4eeSManish Pandey	mrs     x0, NEOVERSE_N1_CPUECTLR_EL1
607f2d6b4eeSManish Pandey	orr     x0, x0, NEOVERSE_N1_CPUECTLR_EL1_EXTLLC_BIT
608f2d6b4eeSManish Pandey	msr     NEOVERSE_N1_CPUECTLR_EL1, x0
609f2d6b4eeSManish Pandey#endif
610f2d6b4eeSManish Pandey
611bb2f077aSLouis Mayencourt#if ERRATA_DSU_936184
612bb2f077aSLouis Mayencourt	bl	errata_dsu_936184_wa
613bb2f077aSLouis Mayencourt#endif
614bb2f077aSLouis Mayencourt
6151fe4a9d1SBipin Ravi#if IMAGE_BL31 && WORKAROUND_CVE_2022_23960
6161fe4a9d1SBipin Ravi	/*
6171fe4a9d1SBipin Ravi	 * The Neoverse-N1 generic vectors are overridden to apply errata
6181fe4a9d1SBipin Ravi         * mitigation on exception entry from lower ELs.
6191fe4a9d1SBipin Ravi	 */
6201fe4a9d1SBipin Ravi	adr	x0, wa_cve_vbar_neoverse_n1
6211fe4a9d1SBipin Ravi	msr	vbar_el3, x0
6221fe4a9d1SBipin Ravi#endif /* IMAGE_BL31 && WORKAROUND_CVE_2022_23960 */
6231fe4a9d1SBipin Ravi
6247d6f7518Slauwal01	isb
625b04ea14bSJohn Tsichritzis	ret	x19
626da6d75a0SJohn Tsichritzisendfunc neoverse_n1_reset_func
627b04ea14bSJohn Tsichritzis
628b04ea14bSJohn Tsichritzis	/* ---------------------------------------------
629b04ea14bSJohn Tsichritzis	 * HW will do the cache maintenance while powering down
630b04ea14bSJohn Tsichritzis	 * ---------------------------------------------
631b04ea14bSJohn Tsichritzis	 */
632da6d75a0SJohn Tsichritzisfunc neoverse_n1_core_pwr_dwn
633b04ea14bSJohn Tsichritzis	/* ---------------------------------------------
634b04ea14bSJohn Tsichritzis	 * Enable CPU power down bit in power control register
635b04ea14bSJohn Tsichritzis	 * ---------------------------------------------
636b04ea14bSJohn Tsichritzis	 */
637da6d75a0SJohn Tsichritzis	mrs	x0, NEOVERSE_N1_CPUPWRCTLR_EL1
638da6d75a0SJohn Tsichritzis	orr	x0, x0, #NEOVERSE_N1_CORE_PWRDN_EN_MASK
639da6d75a0SJohn Tsichritzis	msr	NEOVERSE_N1_CPUPWRCTLR_EL1, x0
6408ce40503SBipin Ravi#if ERRATA_N1_2743102
6418ce40503SBipin Ravi	mov	x15, x30
6428ce40503SBipin Ravi	bl	cpu_get_rev_var
6438ce40503SBipin Ravi	bl	errata_n1_2743102_wa
6448ce40503SBipin Ravi	mov	x30, x15
6458ce40503SBipin Ravi#endif /* ERRATA_N1_2743102 */
646b04ea14bSJohn Tsichritzis	isb
647b04ea14bSJohn Tsichritzis	ret
648da6d75a0SJohn Tsichritzisendfunc neoverse_n1_core_pwr_dwn
649b04ea14bSJohn Tsichritzis
650b04ea14bSJohn Tsichritzis#if REPORT_ERRATA
651b04ea14bSJohn Tsichritzis/*
652da6d75a0SJohn Tsichritzis * Errata printing function for Neoverse N1. Must follow AAPCS.
653b04ea14bSJohn Tsichritzis */
654da6d75a0SJohn Tsichritzisfunc neoverse_n1_errata_report
655b04ea14bSJohn Tsichritzis	stp	x8, x30, [sp, #-16]!
656b04ea14bSJohn Tsichritzis
657b04ea14bSJohn Tsichritzis	bl	cpu_get_rev_var
658b04ea14bSJohn Tsichritzis	mov	x8, x0
659b04ea14bSJohn Tsichritzis
660b04ea14bSJohn Tsichritzis	/*
661b04ea14bSJohn Tsichritzis	 * Report all errata. The revision-variant information is passed to
662b04ea14bSJohn Tsichritzis	 * checking functions of each errata.
663b04ea14bSJohn Tsichritzis	 */
664da6d75a0SJohn Tsichritzis	report_errata ERRATA_N1_1043202, neoverse_n1, 1043202
665a601afe1Slauwal01	report_errata ERRATA_N1_1073348, neoverse_n1, 1073348
666e34606f2Slauwal01	report_errata ERRATA_N1_1130799, neoverse_n1, 1130799
6672017ab24Slauwal01	report_errata ERRATA_N1_1165347, neoverse_n1, 1165347
668ef5fa7d4Slauwal01	report_errata ERRATA_N1_1207823, neoverse_n1, 1207823
6699eceb020Slauwal01	report_errata ERRATA_N1_1220197, neoverse_n1, 1220197
670335b3c79Slauwal01	report_errata ERRATA_N1_1257314, neoverse_n1, 1257314
671411f4959Slauwal01	report_errata ERRATA_N1_1262606, neoverse_n1, 1262606
67211c48370Slauwal01	report_errata ERRATA_N1_1262888, neoverse_n1, 1262888
6734d8801feSlauwal01	report_errata ERRATA_N1_1275112, neoverse_n1, 1275112
6745f5d0763SAndre Przywara	report_errata ERRATA_N1_1315703, neoverse_n1, 1315703
67580942622Slaurenw-arm	report_errata ERRATA_N1_1542419, neoverse_n1, 1542419
67661f0ffc4Sjohpow01	report_errata ERRATA_N1_1868343, neoverse_n1, 1868343
677263ee781Sjohpow01	report_errata ERRATA_N1_1946160, neoverse_n1, 1946160
6788ce40503SBipin Ravi	report_errata ERRATA_N1_2743102, neoverse_n1, 2743102
679bb2f077aSLouis Mayencourt	report_errata ERRATA_DSU_936184, neoverse_n1, dsu_936184
6801fe4a9d1SBipin Ravi	report_errata WORKAROUND_CVE_2022_23960, neoverse_n1, cve_2022_23960
681b04ea14bSJohn Tsichritzis
682b04ea14bSJohn Tsichritzis	ldp	x8, x30, [sp], #16
683b04ea14bSJohn Tsichritzis	ret
684da6d75a0SJohn Tsichritzisendfunc neoverse_n1_errata_report
685b04ea14bSJohn Tsichritzis#endif
686b04ea14bSJohn Tsichritzis
68780942622Slaurenw-arm/*
68880942622Slaurenw-arm * Handle trap of EL0 IC IVAU instructions to EL3 by executing a TLB
68980942622Slaurenw-arm * inner-shareable invalidation to an arbitrary address followed by a DSB.
69080942622Slaurenw-arm *
69180942622Slaurenw-arm * x1: Exception Syndrome
69280942622Slaurenw-arm */
69380942622Slaurenw-armfunc neoverse_n1_errata_ic_trap_handler
69480942622Slaurenw-arm	cmp	x1, #NEOVERSE_N1_EC_IC_TRAP
69580942622Slaurenw-arm	b.ne	1f
69680942622Slaurenw-arm	tlbi	vae3is, xzr
69780942622Slaurenw-arm	dsb	sy
69880942622Slaurenw-arm
69980942622Slaurenw-arm	# Skip the IC instruction itself
70080942622Slaurenw-arm	mrs     x3, elr_el3
70180942622Slaurenw-arm	add     x3, x3, #4
70280942622Slaurenw-arm	msr     elr_el3, x3
70380942622Slaurenw-arm
70480942622Slaurenw-arm	ldp	x0, x1, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X0]
70580942622Slaurenw-arm	ldp	x2, x3, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X2]
70680942622Slaurenw-arm	ldp	x4, x5, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X4]
70780942622Slaurenw-arm	ldr	x30, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_LR]
70880942622Slaurenw-arm
70980942622Slaurenw-arm	/*
71080942622Slaurenw-arm	 * Issue Error Synchronization Barrier to synchronize SErrors before
71180942622Slaurenw-arm	 * exiting EL3. We're running with EAs unmasked, so any synchronized
71280942622Slaurenw-arm	 * errors would be taken immediately; therefore no need to inspect
71380942622Slaurenw-arm	 * DISR_EL1 register.
71480942622Slaurenw-arm	 */
71580942622Slaurenw-arm	esb
716f461fe34SAnthony Steinhauser	exception_return
71780942622Slaurenw-arm1:
71880942622Slaurenw-arm	ret
71980942622Slaurenw-armendfunc neoverse_n1_errata_ic_trap_handler
72080942622Slaurenw-arm
721b04ea14bSJohn Tsichritzis	/* ---------------------------------------------
722da6d75a0SJohn Tsichritzis	 * This function provides neoverse_n1 specific
723b04ea14bSJohn Tsichritzis	 * register information for crash reporting.
724b04ea14bSJohn Tsichritzis	 * It needs to return with x6 pointing to
725b04ea14bSJohn Tsichritzis	 * a list of register names in ascii and
726b04ea14bSJohn Tsichritzis	 * x8 - x15 having values of registers to be
727b04ea14bSJohn Tsichritzis	 * reported.
728b04ea14bSJohn Tsichritzis	 * ---------------------------------------------
729b04ea14bSJohn Tsichritzis	 */
730da6d75a0SJohn Tsichritzis.section .rodata.neoverse_n1_regs, "aS"
731da6d75a0SJohn Tsichritzisneoverse_n1_regs:  /* The ascii list of register names to be reported */
732b04ea14bSJohn Tsichritzis	.asciz	"cpuectlr_el1", ""
733b04ea14bSJohn Tsichritzis
734da6d75a0SJohn Tsichritzisfunc neoverse_n1_cpu_reg_dump
735da6d75a0SJohn Tsichritzis	adr	x6, neoverse_n1_regs
736da6d75a0SJohn Tsichritzis	mrs	x8, NEOVERSE_N1_CPUECTLR_EL1
737b04ea14bSJohn Tsichritzis	ret
738da6d75a0SJohn Tsichritzisendfunc neoverse_n1_cpu_reg_dump
739b04ea14bSJohn Tsichritzis
74080942622Slaurenw-armdeclare_cpu_ops_eh neoverse_n1, NEOVERSE_N1_MIDR, \
741da6d75a0SJohn Tsichritzis	neoverse_n1_reset_func, \
74280942622Slaurenw-arm	neoverse_n1_errata_ic_trap_handler, \
743da6d75a0SJohn Tsichritzis	neoverse_n1_core_pwr_dwn
744