xref: /rk3399_ARM-atf/lib/cpus/aarch64/neoverse_n2.S (revision 89dba82dfa85fea03e7b2f6ad6a90fcd0aecce55)
125bbbd2dSJavier Almansa Sobrino/*
2adea6e52SGovindraj Raja * Copyright (c) 2020-2025, Arm Limited. All rights reserved.
325bbbd2dSJavier Almansa Sobrino *
425bbbd2dSJavier Almansa Sobrino * SPDX-License-Identifier: BSD-3-Clause
525bbbd2dSJavier Almansa Sobrino */
625bbbd2dSJavier Almansa Sobrino
725bbbd2dSJavier Almansa Sobrino#include <arch.h>
825bbbd2dSJavier Almansa Sobrino#include <asm_macros.S>
925bbbd2dSJavier Almansa Sobrino#include <cpu_macros.S>
10b62673c6SBoyan Karatotev#include <dsu_macros.S>
1125bbbd2dSJavier Almansa Sobrino#include <neoverse_n2.h>
121fe4a9d1SBipin Ravi#include "wa_cve_2022_23960_bhb_vector.S"
1325bbbd2dSJavier Almansa Sobrino
1425bbbd2dSJavier Almansa Sobrino/* Hardware handled coherency */
1525bbbd2dSJavier Almansa Sobrino#if HW_ASSISTED_COHERENCY == 0
1625bbbd2dSJavier Almansa Sobrino#error "Neoverse N2 must be compiled with HW_ASSISTED_COHERENCY enabled"
1725bbbd2dSJavier Almansa Sobrino#endif
1825bbbd2dSJavier Almansa Sobrino
1925bbbd2dSJavier Almansa Sobrino/* 64-bit only core */
2025bbbd2dSJavier Almansa Sobrino#if CTX_INCLUDE_AARCH32_REGS == 1
2125bbbd2dSJavier Almansa Sobrino#error "Neoverse-N2 supports only AArch64. Compile with CTX_INCLUDE_AARCH32_REGS=0"
2225bbbd2dSJavier Almansa Sobrino#endif
2325bbbd2dSJavier Almansa Sobrino
24adea6e52SGovindraj Raja.global check_erratum_neoverse_n2_3701773
25adea6e52SGovindraj Raja
26*89dba82dSBoyan Karatotevadd_erratum_entry neoverse_n2, ERRATUM(3701773), ERRATA_N2_3701773
27adea6e52SGovindraj Raja
28adea6e52SGovindraj Rajacheck_erratum_ls neoverse_n2, ERRATUM(3701773), CPU_REV(0, 3)
29adea6e52SGovindraj Raja
301fe4a9d1SBipin Ravi#if WORKAROUND_CVE_2022_23960
311fe4a9d1SBipin Ravi	wa_cve_2022_23960_bhb_vector_table NEOVERSE_N2_BHB_LOOP_COUNT, neoverse_n2
321fe4a9d1SBipin Ravi#endif /* WORKAROUND_CVE_2022_23960 */
331fe4a9d1SBipin Ravi
34*89dba82dSBoyan Karatotevcpu_reset_prologue neoverse_n2
35*89dba82dSBoyan Karatotev
36b62673c6SBoyan Karatotevworkaround_reset_start neoverse_n2, ERRATUM(2313941), ERRATA_DSU_2313941
37b62673c6SBoyan Karatotev	errata_dsu_2313941_wa_impl
38b62673c6SBoyan Karatotevworkaround_reset_end neoverse_n2, ERRATUM(2313941)
39b62673c6SBoyan Karatotev
40b62673c6SBoyan Karatotevcheck_erratum_custom_start neoverse_n2, ERRATUM(2313941)
41b62673c6SBoyan Karatotev	branch_if_scu_not_present 2f /* label 1 is used in the macro */
42b62673c6SBoyan Karatotev	check_errata_dsu_2313941_impl
43b62673c6SBoyan Karatotev	2:
44b62673c6SBoyan Karatotev	ret
45b62673c6SBoyan Karatotevcheck_erratum_custom_end neoverse_n2, ERRATUM(2313941)
469380f754Snayanpatel-arm
4726e0ff9dSSona Mathew/* Disable hardware page aggregation. Enables mitigation for `CVE-2024-5660` */
4826e0ff9dSSona Mathewworkaround_reset_start neoverse_n2, CVE(2024, 5660), WORKAROUND_CVE_2024_5660
4926e0ff9dSSona Mathew	sysreg_bit_set NEOVERSE_N2_CPUECTLR_EL1, BIT(46)
5026e0ff9dSSona Mathewworkaround_reset_end neoverse_n2, CVE(2024, 5660)
5126e0ff9dSSona Mathew
5226e0ff9dSSona Mathewcheck_erratum_ls neoverse_n2, CVE(2024, 5660), CPU_REV(0, 3)
5326e0ff9dSSona Mathew
54ccb56162SArvind Ram Prakashworkaround_reset_start neoverse_n2, ERRATUM(2002655), ERRATA_N2_2002655
559380f754Snayanpatel-arm	/* Apply instruction patching sequence */
569380f754Snayanpatel-arm	ldr x0,=0x6
579380f754Snayanpatel-arm	msr S3_6_c15_c8_0,x0
589380f754Snayanpatel-arm	ldr x0,=0xF3A08002
599380f754Snayanpatel-arm	msr S3_6_c15_c8_2,x0
609380f754Snayanpatel-arm	ldr x0,=0xFFF0F7FE
619380f754Snayanpatel-arm	msr S3_6_c15_c8_3,x0
629380f754Snayanpatel-arm	ldr x0,=0x40000001003ff
639380f754Snayanpatel-arm	msr S3_6_c15_c8_1,x0
649380f754Snayanpatel-arm	ldr x0,=0x7
659380f754Snayanpatel-arm	msr S3_6_c15_c8_0,x0
669380f754Snayanpatel-arm	ldr x0,=0xBF200000
679380f754Snayanpatel-arm	msr S3_6_c15_c8_2,x0
689380f754Snayanpatel-arm	ldr x0,=0xFFEF0000
699380f754Snayanpatel-arm	msr S3_6_c15_c8_3,x0
709380f754Snayanpatel-arm	ldr x0,=0x40000001003f3
719380f754Snayanpatel-arm	msr S3_6_c15_c8_1,x0
72ccb56162SArvind Ram Prakashworkaround_reset_end neoverse_n2, ERRATUM(2002655)
739380f754Snayanpatel-arm
74ccb56162SArvind Ram Prakashcheck_erratum_ls neoverse_n2, ERRATUM(2002655), CPU_REV(0, 0)
759380f754Snayanpatel-arm
76ccb56162SArvind Ram Prakashworkaround_reset_start neoverse_n2, ERRATUM(2025414), ERRATA_N2_2025414
77b41792caSArvind Ram Prakash	sysreg_bit_set NEOVERSE_N2_CPUECTLR_EL1, NEOVERSE_N2_CPUECTLR_EL1_PFSTIDIS_BIT
78ccb56162SArvind Ram Prakashworkaround_reset_end neoverse_n2, ERRATUM(2025414)
794618b2bfSBipin Ravi
80ccb56162SArvind Ram Prakashcheck_erratum_ls neoverse_n2, ERRATUM(2025414), CPU_REV(0, 0)
814618b2bfSBipin Ravi
82ccb56162SArvind Ram Prakashworkaround_reset_start neoverse_n2, ERRATUM(2067956), ERRATA_N2_2067956
83b41792caSArvind Ram Prakash	sysreg_bit_set NEOVERSE_N2_CPUACTLR_EL1, NEOVERSE_N2_CPUACTLR_EL1_BIT_46
84ccb56162SArvind Ram Prakashworkaround_reset_end neoverse_n2, ERRATUM(2067956)
857cfae932SBipin Ravi
86ccb56162SArvind Ram Prakashcheck_erratum_ls neoverse_n2, ERRATUM(2067956), CPU_REV(0, 0)
87a438f434SArvind Ram Prakash
8874bfe31fSBipin Raviworkaround_runtime_start neoverse_n2, ERRATUM(2009478), ERRATA_N2_2009478
8974bfe31fSBipin Ravi	/* Stash ERRSELR_EL1 in x2 */
9074bfe31fSBipin Ravi	mrs     x2, ERRSELR_EL1
9174bfe31fSBipin Ravi
9274bfe31fSBipin Ravi	/* Select error record 0 and clear ED bit */
9374bfe31fSBipin Ravi	msr     ERRSELR_EL1, xzr
9474bfe31fSBipin Ravi	mrs     x1, ERXCTLR_EL1
9574bfe31fSBipin Ravi	bfi     x1, xzr, #ERXCTLR_ED_SHIFT, #1
9674bfe31fSBipin Ravi	msr     ERXCTLR_EL1, x1
9774bfe31fSBipin Ravi
9874bfe31fSBipin Ravi	/* Restore ERRSELR_EL1 from x2 */
9974bfe31fSBipin Ravi	msr     ERRSELR_EL1, x2
10074bfe31fSBipin Raviworkaround_runtime_end neoverse_n2, ERRATUM(2009478), NO_ISB
10174bfe31fSBipin Ravi
10274bfe31fSBipin Ravicheck_erratum_ls neoverse_n2, ERRATUM(2009478), CPU_REV(0, 0)
10374bfe31fSBipin Ravi
104ccb56162SArvind Ram Prakashworkaround_reset_start neoverse_n2, ERRATUM(2138953), ERRATA_N2_2138953
105a438f434SArvind Ram Prakash	/* Apply instruction patching sequence */
106a438f434SArvind Ram Prakash	mrs	x1, NEOVERSE_N2_CPUECTLR2_EL1
107a438f434SArvind Ram Prakash	mov	x0, #NEOVERSE_N2_CPUECTLR2_EL1_PF_MODE_CNSRV
108a438f434SArvind Ram Prakash	bfi	x1, x0, #CPUECTLR2_EL1_PF_MODE_LSB, #CPUECTLR2_EL1_PF_MODE_WIDTH
109a438f434SArvind Ram Prakash	msr	NEOVERSE_N2_CPUECTLR2_EL1, x1
110ccb56162SArvind Ram Prakashworkaround_reset_end neoverse_n2, ERRATUM(2138953)
111a438f434SArvind Ram Prakash
112d6d34b39SArvind Ram Prakashcheck_erratum_ls neoverse_n2, ERRATUM(2138953), CPU_REV(0, 3)
1137cfae932SBipin Ravi
114ccb56162SArvind Ram Prakashworkaround_reset_start neoverse_n2, ERRATUM(2138956), ERRATA_N2_2138956
1151cafb08dSBipin Ravi	/* Apply instruction patching sequence */
1161cafb08dSBipin Ravi	ldr	x0,=0x3
1171cafb08dSBipin Ravi	msr	S3_6_c15_c8_0,x0
1181cafb08dSBipin Ravi	ldr	x0,=0xF3A08002
1191cafb08dSBipin Ravi	msr	S3_6_c15_c8_2,x0
1201cafb08dSBipin Ravi	ldr	x0,=0xFFF0F7FE
1211cafb08dSBipin Ravi	msr	S3_6_c15_c8_3,x0
1221cafb08dSBipin Ravi	ldr	x0,=0x10002001003FF
1231cafb08dSBipin Ravi	msr	S3_6_c15_c8_1,x0
1241cafb08dSBipin Ravi	ldr	x0,=0x4
1251cafb08dSBipin Ravi	msr	S3_6_c15_c8_0,x0
1261cafb08dSBipin Ravi	ldr	x0,=0xBF200000
1271cafb08dSBipin Ravi	msr	S3_6_c15_c8_2,x0
1281cafb08dSBipin Ravi	ldr	x0,=0xFFEF0000
1291cafb08dSBipin Ravi	msr	S3_6_c15_c8_3,x0
1301cafb08dSBipin Ravi	ldr	x0,=0x10002001003F3
1311cafb08dSBipin Ravi	msr	S3_6_c15_c8_1,x0
132ccb56162SArvind Ram Prakashworkaround_reset_end neoverse_n2, ERRATUM(2138956)
1331cafb08dSBipin Ravi
134ccb56162SArvind Ram Prakashcheck_erratum_ls neoverse_n2, ERRATUM(2138956), CPU_REV(0, 0)
1351cafb08dSBipin Ravi
136c948185cSnayanpatel-arm
137ccb56162SArvind Ram Prakashworkaround_reset_start neoverse_n2, ERRATUM(2138958), ERRATA_N2_2138958
138c948185cSnayanpatel-arm	/* Apply instruction patching sequence */
139b41792caSArvind Ram Prakash	sysreg_bit_set NEOVERSE_N2_CPUACTLR5_EL1, NEOVERSE_N2_CPUACTLR5_EL1_BIT_13
140ccb56162SArvind Ram Prakashworkaround_reset_end neoverse_n2, ERRATUM(2138958)
141c948185cSnayanpatel-arm
142ccb56162SArvind Ram Prakashcheck_erratum_ls neoverse_n2, ERRATUM(2138958), CPU_REV(0, 0)
143c948185cSnayanpatel-arm
144ccb56162SArvind Ram Prakashworkaround_reset_start neoverse_n2, ERRATUM(2189731), ERRATA_N2_2189731
145b41792caSArvind Ram Prakash	sysreg_bit_set NEOVERSE_N2_CPUACTLR5_EL1, NEOVERSE_N2_CPUACTLR5_EL1_BIT_44
146ccb56162SArvind Ram Prakashworkaround_reset_end neoverse_n2, ERRATUM(2189731)
147a438f434SArvind Ram Prakash
148ccb56162SArvind Ram Prakashcheck_erratum_ls neoverse_n2, ERRATUM(2189731), CPU_REV(0, 0)
149a438f434SArvind Ram Prakash
150ccb56162SArvind Ram Prakashworkaround_reset_start neoverse_n2, ERRATUM(2242400), ERRATA_N2_2242400
151603806d1Snayanpatel-arm	/* Apply instruction patching sequence */
152b41792caSArvind Ram Prakash	sysreg_bit_set NEOVERSE_N2_CPUACTLR5_EL1, NEOVERSE_N2_CPUACTLR5_EL1_BIT_17
153603806d1Snayanpatel-arm	ldr	x0, =0x2
154603806d1Snayanpatel-arm	msr	S3_6_c15_c8_0, x0
155603806d1Snayanpatel-arm	ldr	x0, =0x10F600E000
156603806d1Snayanpatel-arm	msr	S3_6_c15_c8_2, x0
157603806d1Snayanpatel-arm	ldr	x0, =0x10FF80E000
158603806d1Snayanpatel-arm	msr	S3_6_c15_c8_3, x0
159603806d1Snayanpatel-arm	ldr	x0, =0x80000000003FF
160603806d1Snayanpatel-arm	msr	S3_6_c15_c8_1, x0
161ccb56162SArvind Ram Prakashworkaround_reset_end neoverse_n2, ERRATUM(2242400)
162603806d1Snayanpatel-arm
163ccb56162SArvind Ram Prakashcheck_erratum_ls neoverse_n2, ERRATUM(2242400), CPU_REV(0, 0)
164603806d1Snayanpatel-arm
165ccb56162SArvind Ram Prakashworkaround_reset_start neoverse_n2, ERRATUM(2242415), ERRATA_N2_2242415
166b41792caSArvind Ram Prakash	sysreg_bit_set NEOVERSE_N2_CPUACTLR_EL1, NEOVERSE_N2_CPUACTLR_EL1_BIT_22
167ccb56162SArvind Ram Prakashworkaround_reset_end neoverse_n2, ERRATUM(2242415)
168a438f434SArvind Ram Prakash
169ccb56162SArvind Ram Prakashcheck_erratum_ls neoverse_n2, ERRATUM(2242415), CPU_REV(0, 0)
170a438f434SArvind Ram Prakash
171ccb56162SArvind Ram Prakashworkaround_reset_start neoverse_n2, ERRATUM(2280757), ERRATA_N2_2280757
1720d2d9992Snayanpatel-arm	/* Apply instruction patching sequence */
173b41792caSArvind Ram Prakash	sysreg_bit_set NEOVERSE_N2_CPUACTLR_EL1, NEOVERSE_N2_CPUACTLR_EL1_BIT_22
174ccb56162SArvind Ram Prakashworkaround_reset_end neoverse_n2, ERRATUM(2280757)
1750d2d9992Snayanpatel-arm
176ccb56162SArvind Ram Prakashcheck_erratum_ls neoverse_n2, ERRATUM(2280757), CPU_REV(0, 0)
1770d2d9992Snayanpatel-arm
178cc94e71bSBoyan Karatotev.global erratum_neoverse_n2_2326639_wa
179ccb56162SArvind Ram Prakashworkaround_runtime_start neoverse_n2, ERRATUM(2326639), ERRATA_N2_2326639
180bb801857SBoyan Karatotev	/* Set/unset bit 36 in ACTLR2_EL1. The first call will set it, applying
181bb801857SBoyan Karatotev	 * the workaround. Second call clears it to undo it. */
182bb801857SBoyan Karatotev	sysreg_bit_toggle NEOVERSE_N2_CPUACTLR2_EL1, NEOVERSE_N2_CPUACTLR2_EL1_BIT_36
183ccb56162SArvind Ram Prakashworkaround_runtime_end neoverse_n2, ERRATUM(2326639)
18443438ad1SBoyan Karatotev
185ccb56162SArvind Ram Prakashcheck_erratum_ls neoverse_n2, ERRATUM(2326639), CPU_REV(0, 0)
186e6602d4bSAkram Ahmad
1875cba510eSBoyan Karatotevworkaround_reset_start neoverse_n2, ERRATUM(2340933), ERRATA_N2_2340933
18868085ad4SBipin Ravi	/* Set bit 61 in CPUACTLR5_EL1 */
18968085ad4SBipin Ravi	sysreg_bit_set NEOVERSE_N2_CPUACTLR5_EL1, BIT(61)
1905cba510eSBoyan Karatotevworkaround_reset_end neoverse_n2, ERRATUM(2340933)
19168085ad4SBipin Ravi
19268085ad4SBipin Ravicheck_erratum_ls neoverse_n2, ERRATUM(2340933), CPU_REV(0, 0)
19368085ad4SBipin Ravi
1945cba510eSBoyan Karatotevworkaround_reset_start neoverse_n2, ERRATUM(2346952), ERRATA_N2_2346952
1956cb8be17SBipin Ravi	/* Set TXREQ to STATIC and full L2 TQ size */
1966cb8be17SBipin Ravi	mrs	x1, NEOVERSE_N2_CPUECTLR2_EL1
1976cb8be17SBipin Ravi	mov	x0, #CPUECTLR2_EL1_TXREQ_STATIC_FULL
1986cb8be17SBipin Ravi	bfi	x1, x0, #CPUECTLR2_EL1_TXREQ_LSB, #CPUECTLR2_EL1_TXREQ_WIDTH
1996cb8be17SBipin Ravi	msr	NEOVERSE_N2_CPUECTLR2_EL1, x1
2005cba510eSBoyan Karatotevworkaround_reset_end neoverse_n2, ERRATUM(2346952)
2016cb8be17SBipin Ravi
2026cb8be17SBipin Ravicheck_erratum_ls neoverse_n2, ERRATUM(2346952), CPU_REV(0, 2)
2036cb8be17SBipin Ravi
204ccb56162SArvind Ram Prakashworkaround_reset_start neoverse_n2, ERRATUM(2376738), ERRATA_N2_2376738
205e6602d4bSAkram Ahmad	/* Set CPUACTLR2_EL1[0] to 1 to force PLDW/PFRM
206e6602d4bSAkram Ahmad	 * ST to behave like PLD/PFRM LD and not cause
207e6602d4bSAkram Ahmad	 * invalidations to other PE caches.
208e6602d4bSAkram Ahmad	 */
209b41792caSArvind Ram Prakash	sysreg_bit_set NEOVERSE_N2_CPUACTLR2_EL1, NEOVERSE_N2_CPUACTLR2_EL1_BIT_0
210ccb56162SArvind Ram Prakashworkaround_reset_end neoverse_n2, ERRATUM(2376738)
211e6602d4bSAkram Ahmad
212d6d34b39SArvind Ram Prakashcheck_erratum_ls neoverse_n2, ERRATUM(2376738), CPU_REV(0, 3)
213e6602d4bSAkram Ahmad
214ccb56162SArvind Ram Prakashworkaround_reset_start neoverse_n2, ERRATUM(2388450), ERRATA_N2_2388450
215884d5156SDaniel Boulby	/*Set bit 40 in ACTLR2_EL1 */
216b41792caSArvind Ram Prakash	sysreg_bit_set NEOVERSE_N2_CPUACTLR2_EL1, NEOVERSE_N2_CPUACTLR2_EL1_BIT_40
217ccb56162SArvind Ram Prakashworkaround_reset_end neoverse_n2, ERRATUM(2388450)
218884d5156SDaniel Boulby
219ccb56162SArvind Ram Prakashcheck_erratum_ls neoverse_n2, ERRATUM(2388450), CPU_REV(0, 0)
220884d5156SDaniel Boulby
221eb44035cSArvind Ram Prakashworkaround_reset_start neoverse_n2, ERRATUM(2743014), ERRATA_N2_2743014
222eb44035cSArvind Ram Prakash	/* Set CPUACTLR5_EL1[56:55] to 2'b01 */
223eb44035cSArvind Ram Prakash	sysreg_bit_set NEOVERSE_N2_CPUACTLR5_EL1, NEOVERSE_N2_CPUACTLR5_EL1_BIT_55
224eb44035cSArvind Ram Prakash	sysreg_bit_clear NEOVERSE_N2_CPUACTLR5_EL1, NEOVERSE_N2_CPUACTLR5_EL1_BIT_56
225eb44035cSArvind Ram Prakashworkaround_reset_end neoverse_n2, ERRATUM(2743014)
226eb44035cSArvind Ram Prakash
227eb44035cSArvind Ram Prakashcheck_erratum_ls neoverse_n2, ERRATUM(2743014), CPU_REV(0, 2)
228eb44035cSArvind Ram Prakash
229ccb56162SArvind Ram Prakashworkaround_runtime_start neoverse_n2, ERRATUM(2743089), ERRATA_N2_2743089
2301ee7c823SBipin Ravi	/* dsb before isb of power down sequence */
2311ee7c823SBipin Ravi	dsb	sy
232ccb56162SArvind Ram Prakashworkaround_runtime_end neoverse_n2, ERRATUM(2743089)
2331ee7c823SBipin Ravi
234ccb56162SArvind Ram Prakashcheck_erratum_ls neoverse_n2, ERRATUM(2743089), CPU_REV(0, 2)
2351ee7c823SBipin Ravi
23612d28067SArvind Ram Prakashworkaround_reset_start neoverse_n2, ERRATUM(2779511), ERRATA_N2_2779511
23712d28067SArvind Ram Prakash	/* Set bit 47 in ACTLR3_EL1 */
23812d28067SArvind Ram Prakash	sysreg_bit_set NEOVERSE_N2_CPUACTLR3_EL1, NEOVERSE_N2_CPUACTLR3_EL1_BIT_47
23912d28067SArvind Ram Prakashworkaround_reset_end neoverse_n2, ERRATUM(2779511)
24012d28067SArvind Ram Prakash
24112d28067SArvind Ram Prakashcheck_erratum_ls neoverse_n2, ERRATUM(2779511), CPU_REV(0, 2)
24212d28067SArvind Ram Prakash
243ccb56162SArvind Ram Prakashworkaround_reset_start neoverse_n2, CVE(2022,23960), WORKAROUND_CVE_2022_23960
244ccb56162SArvind Ram Prakash#if IMAGE_BL31
245ccb56162SArvind Ram Prakash	/*
246ccb56162SArvind Ram Prakash	 * The Neoverse-N2 generic vectors are overridden to apply errata
247ccb56162SArvind Ram Prakash         * mitigation on exception entry from lower ELs.
248ccb56162SArvind Ram Prakash	 */
249b41792caSArvind Ram Prakash	override_vector_table wa_cve_vbar_neoverse_n2
250ccb56162SArvind Ram Prakash#endif /* IMAGE_BL31 */
251ccb56162SArvind Ram Prakashworkaround_reset_end neoverse_n2, CVE(2022,23960)
252ccb56162SArvind Ram Prakash
253ccb56162SArvind Ram Prakashcheck_erratum_chosen neoverse_n2, CVE(2022, 23960), WORKAROUND_CVE_2022_23960
2541fe4a9d1SBipin Ravi
2554618b2bfSBipin Ravi	/* -------------------------------------------
25625bbbd2dSJavier Almansa Sobrino	 * The CPU Ops reset function for Neoverse N2.
2574618b2bfSBipin Ravi	 * -------------------------------------------
25825bbbd2dSJavier Almansa Sobrino	 */
259ccb56162SArvind Ram Prakashcpu_reset_func_start neoverse_n2
2609380f754Snayanpatel-arm
26125bbbd2dSJavier Almansa Sobrino	/* Check if the PE implements SSBS */
26225bbbd2dSJavier Almansa Sobrino	mrs	x0, id_aa64pfr1_el1
26325bbbd2dSJavier Almansa Sobrino	tst	x0, #(ID_AA64PFR1_EL1_SSBS_MASK << ID_AA64PFR1_EL1_SSBS_SHIFT)
26425bbbd2dSJavier Almansa Sobrino	b.eq	1f
26525bbbd2dSJavier Almansa Sobrino
26625bbbd2dSJavier Almansa Sobrino	/* Disable speculative loads */
26725bbbd2dSJavier Almansa Sobrino	msr	SSBS, xzr
26825bbbd2dSJavier Almansa Sobrino1:
26925bbbd2dSJavier Almansa Sobrino	/* Force all cacheable atomic instructions to be near */
270b41792caSArvind Ram Prakash	sysreg_bit_set NEOVERSE_N2_CPUACTLR2_EL1, NEOVERSE_N2_CPUACTLR2_EL1_BIT_2
27125bbbd2dSJavier Almansa Sobrino
272d23acc9eSAndre Przywara#if ENABLE_FEAT_AMU
27325bbbd2dSJavier Almansa Sobrino	/* Make sure accesses from EL0/EL1 and EL2 are not trapped to EL3 */
27454b86d47SThomas Abraham	sysreg_bit_clear cptr_el3, TAM_BIT
27525bbbd2dSJavier Almansa Sobrino	/* Make sure accesses from EL0/EL1 are not trapped to EL2 */
27654b86d47SThomas Abraham	sysreg_bit_clear cptr_el2, TAM_BIT
27725bbbd2dSJavier Almansa Sobrino	/* No need to enable the counters as this would be done at el3 exit */
27825bbbd2dSJavier Almansa Sobrino#endif
27925bbbd2dSJavier Almansa Sobrino
28025bbbd2dSJavier Almansa Sobrino#if NEOVERSE_Nx_EXTERNAL_LLC
28125bbbd2dSJavier Almansa Sobrino	/* Some systems may have External LLC, core needs to be made aware */
282b41792caSArvind Ram Prakash	sysreg_bit_set NEOVERSE_N2_CPUECTLR_EL1, NEOVERSE_N2_CPUECTLR_EL1_EXTLLC_BIT
28325bbbd2dSJavier Almansa Sobrino#endif
284ccb56162SArvind Ram Prakashcpu_reset_func_end neoverse_n2
28525bbbd2dSJavier Almansa Sobrino
28625bbbd2dSJavier Almansa Sobrinofunc neoverse_n2_core_pwr_dwn
287db9ee834SBoyan Karatotev	apply_erratum neoverse_n2, ERRATUM(2009478), ERRATA_N2_2009478, NO_GET_CPU_REV
28874bfe31fSBipin Ravi	apply_erratum neoverse_n2, ERRATUM(2326639), ERRATA_N2_2326639, NO_GET_CPU_REV
28974bfe31fSBipin Ravi
2904618b2bfSBipin Ravi	/* ---------------------------------------------------
29125bbbd2dSJavier Almansa Sobrino	 * Enable CPU power down bit in power control register
29225bbbd2dSJavier Almansa Sobrino	 * No need to do cache maintenance here.
2934618b2bfSBipin Ravi	 * ---------------------------------------------------
29425bbbd2dSJavier Almansa Sobrino	 */
295b41792caSArvind Ram Prakash	sysreg_bit_set NEOVERSE_N2_CPUPWRCTLR_EL1, NEOVERSE_N2_CORE_PWRDN_EN_BIT
296b41792caSArvind Ram Prakash
297db9ee834SBoyan Karatotev	apply_erratum neoverse_n2, ERRATUM(2743089), ERRATA_N2_2743089, NO_GET_CPU_REV
298b41792caSArvind Ram Prakash
29925bbbd2dSJavier Almansa Sobrino	isb
30025bbbd2dSJavier Almansa Sobrino	ret
30125bbbd2dSJavier Almansa Sobrinoendfunc neoverse_n2_core_pwr_dwn
30225bbbd2dSJavier Almansa Sobrino
30325bbbd2dSJavier Almansa Sobrino	/* ---------------------------------------------
30425bbbd2dSJavier Almansa Sobrino	 * This function provides Neoverse N2 specific
30525bbbd2dSJavier Almansa Sobrino	 * register information for crash reporting.
30625bbbd2dSJavier Almansa Sobrino	 * It needs to return with x6 pointing to
30725bbbd2dSJavier Almansa Sobrino	 * a list of register names in ASCII and
30825bbbd2dSJavier Almansa Sobrino	 * x8 - x15 having values of registers to be
30925bbbd2dSJavier Almansa Sobrino	 * reported.
31025bbbd2dSJavier Almansa Sobrino	 * ---------------------------------------------
31125bbbd2dSJavier Almansa Sobrino	 */
31225bbbd2dSJavier Almansa Sobrino.section .rodata.neoverse_n2_regs, "aS"
31325bbbd2dSJavier Almansa Sobrinoneoverse_n2_regs:  /* The ASCII list of register names to be reported */
31425bbbd2dSJavier Almansa Sobrino	.asciz	"cpupwrctlr_el1", ""
31525bbbd2dSJavier Almansa Sobrino
31625bbbd2dSJavier Almansa Sobrinofunc neoverse_n2_cpu_reg_dump
31725bbbd2dSJavier Almansa Sobrino	adr	x6, neoverse_n2_regs
31825bbbd2dSJavier Almansa Sobrino	mrs	x8, NEOVERSE_N2_CPUPWRCTLR_EL1
31925bbbd2dSJavier Almansa Sobrino	ret
32025bbbd2dSJavier Almansa Sobrinoendfunc neoverse_n2_cpu_reg_dump
32125bbbd2dSJavier Almansa Sobrino
32225bbbd2dSJavier Almansa Sobrinodeclare_cpu_ops neoverse_n2, NEOVERSE_N2_MIDR, \
32325bbbd2dSJavier Almansa Sobrino	neoverse_n2_reset_func, \
32425bbbd2dSJavier Almansa Sobrino	neoverse_n2_core_pwr_dwn
325