xref: /rk3399_ARM-atf/lib/cpus/aarch64/neoverse_n2.S (revision e6602d4b153b81b49b39c22e70f052f9018687b7)
125bbbd2dSJavier Almansa Sobrino/*
21fe4a9d1SBipin Ravi * Copyright (c) 2020-2022, 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>
1025bbbd2dSJavier Almansa Sobrino#include <neoverse_n2.h>
111fe4a9d1SBipin Ravi#include "wa_cve_2022_23960_bhb_vector.S"
1225bbbd2dSJavier Almansa Sobrino
1325bbbd2dSJavier Almansa Sobrino/* Hardware handled coherency */
1425bbbd2dSJavier Almansa Sobrino#if HW_ASSISTED_COHERENCY == 0
1525bbbd2dSJavier Almansa Sobrino#error "Neoverse N2 must be compiled with HW_ASSISTED_COHERENCY enabled"
1625bbbd2dSJavier Almansa Sobrino#endif
1725bbbd2dSJavier Almansa Sobrino
1825bbbd2dSJavier Almansa Sobrino/* 64-bit only core */
1925bbbd2dSJavier Almansa Sobrino#if CTX_INCLUDE_AARCH32_REGS == 1
2025bbbd2dSJavier Almansa Sobrino#error "Neoverse-N2 supports only AArch64. Compile with CTX_INCLUDE_AARCH32_REGS=0"
2125bbbd2dSJavier Almansa Sobrino#endif
2225bbbd2dSJavier Almansa Sobrino
231fe4a9d1SBipin Ravi#if WORKAROUND_CVE_2022_23960
241fe4a9d1SBipin Ravi	wa_cve_2022_23960_bhb_vector_table NEOVERSE_N2_BHB_LOOP_COUNT, neoverse_n2
251fe4a9d1SBipin Ravi#endif /* WORKAROUND_CVE_2022_23960 */
261fe4a9d1SBipin Ravi
279380f754Snayanpatel-arm/* --------------------------------------------------
289380f754Snayanpatel-arm * Errata Workaround for Neoverse N2 Erratum 2002655.
299380f754Snayanpatel-arm * This applies to revision r0p0 of Neoverse N2. it is still open.
309380f754Snayanpatel-arm * Inputs:
319380f754Snayanpatel-arm * x0: variant[4:7] and revision[0:3] of current cpu.
329380f754Snayanpatel-arm * Shall clobber: x0-x17
339380f754Snayanpatel-arm * --------------------------------------------------
349380f754Snayanpatel-arm */
359380f754Snayanpatel-armfunc errata_n2_2002655_wa
369380f754Snayanpatel-arm	/* Check revision. */
379380f754Snayanpatel-arm	mov	x17, x30
389380f754Snayanpatel-arm	bl	check_errata_2002655
399380f754Snayanpatel-arm	cbz	x0, 1f
409380f754Snayanpatel-arm
419380f754Snayanpatel-arm	/* Apply instruction patching sequence */
429380f754Snayanpatel-arm	ldr x0,=0x6
439380f754Snayanpatel-arm	msr S3_6_c15_c8_0,x0
449380f754Snayanpatel-arm	ldr x0,=0xF3A08002
459380f754Snayanpatel-arm	msr S3_6_c15_c8_2,x0
469380f754Snayanpatel-arm	ldr x0,=0xFFF0F7FE
479380f754Snayanpatel-arm	msr S3_6_c15_c8_3,x0
489380f754Snayanpatel-arm	ldr x0,=0x40000001003ff
499380f754Snayanpatel-arm	msr S3_6_c15_c8_1,x0
509380f754Snayanpatel-arm	ldr x0,=0x7
519380f754Snayanpatel-arm	msr S3_6_c15_c8_0,x0
529380f754Snayanpatel-arm	ldr x0,=0xBF200000
539380f754Snayanpatel-arm	msr S3_6_c15_c8_2,x0
549380f754Snayanpatel-arm	ldr x0,=0xFFEF0000
559380f754Snayanpatel-arm	msr S3_6_c15_c8_3,x0
569380f754Snayanpatel-arm	ldr x0,=0x40000001003f3
579380f754Snayanpatel-arm	msr S3_6_c15_c8_1,x0
589380f754Snayanpatel-arm	isb
599380f754Snayanpatel-arm1:
609380f754Snayanpatel-arm	ret	x17
619380f754Snayanpatel-armendfunc errata_n2_2002655_wa
629380f754Snayanpatel-arm
639380f754Snayanpatel-armfunc check_errata_2002655
649380f754Snayanpatel-arm	/* Applies to r0p0 */
659380f754Snayanpatel-arm	mov	x1, #0x00
669380f754Snayanpatel-arm	b	cpu_rev_var_ls
679380f754Snayanpatel-armendfunc check_errata_2002655
689380f754Snayanpatel-arm
6965e04f27SBipin Ravi/* ---------------------------------------------------------------
7065e04f27SBipin Ravi * Errata Workaround for Neoverse N2 Erratum 2067956.
7165e04f27SBipin Ravi * This applies to revision r0p0 of Neoverse N2 and is still open.
7265e04f27SBipin Ravi * Inputs:
7365e04f27SBipin Ravi * x0: variant[4:7] and revision[0:3] of current cpu.
7465e04f27SBipin Ravi * Shall clobber: x0-x17
7565e04f27SBipin Ravi * ---------------------------------------------------------------
7665e04f27SBipin Ravi */
7765e04f27SBipin Ravifunc errata_n2_2067956_wa
7865e04f27SBipin Ravi	/* Compare x0 against revision r0p0 */
7965e04f27SBipin Ravi	mov	x17, x30
8065e04f27SBipin Ravi	bl	check_errata_2067956
8165e04f27SBipin Ravi	cbz	x0, 1f
8265e04f27SBipin Ravi	mrs	x1, NEOVERSE_N2_CPUACTLR_EL1
8365e04f27SBipin Ravi	orr	x1, x1, NEOVERSE_N2_CPUACTLR_EL1_BIT_46
8465e04f27SBipin Ravi	msr	NEOVERSE_N2_CPUACTLR_EL1, x1
8565e04f27SBipin Ravi1:
8665e04f27SBipin Ravi	ret	x17
8765e04f27SBipin Raviendfunc errata_n2_2067956_wa
8865e04f27SBipin Ravi
8965e04f27SBipin Ravifunc check_errata_2067956
9065e04f27SBipin Ravi	/* Applies to r0p0 */
9165e04f27SBipin Ravi	mov	x1, #0x00
9265e04f27SBipin Ravi	b	cpu_rev_var_ls
9365e04f27SBipin Raviendfunc check_errata_2067956
9465e04f27SBipin Ravi
954618b2bfSBipin Ravi/* ---------------------------------------------------------------
964618b2bfSBipin Ravi * Errata Workaround for Neoverse N2 Erratum 2025414.
974618b2bfSBipin Ravi * This applies to revision r0p0 of Neoverse N2 and is still open.
984618b2bfSBipin Ravi * Inputs:
994618b2bfSBipin Ravi * x0: variant[4:7] and revision[0:3] of current cpu.
1004618b2bfSBipin Ravi * Shall clobber: x0-x17
1014618b2bfSBipin Ravi * ---------------------------------------------------------------
1024618b2bfSBipin Ravi */
1034618b2bfSBipin Ravifunc errata_n2_2025414_wa
1044618b2bfSBipin Ravi	/* Compare x0 against revision r0p0 */
1054618b2bfSBipin Ravi	mov     x17, x30
1064618b2bfSBipin Ravi	bl      check_errata_2025414
1074618b2bfSBipin Ravi	cbz     x0, 1f
1084618b2bfSBipin Ravi	mrs     x1, NEOVERSE_N2_CPUECTLR_EL1
1094618b2bfSBipin Ravi	orr     x1, x1, NEOVERSE_N2_CPUECTLR_EL1_PFSTIDIS_BIT
1104618b2bfSBipin Ravi	msr     NEOVERSE_N2_CPUECTLR_EL1, x1
1114618b2bfSBipin Ravi
1124618b2bfSBipin Ravi1:
1134618b2bfSBipin Ravi	ret     x17
1144618b2bfSBipin Raviendfunc errata_n2_2025414_wa
1154618b2bfSBipin Ravi
1164618b2bfSBipin Ravifunc check_errata_2025414
1174618b2bfSBipin Ravi	/* Applies to r0p0 */
1184618b2bfSBipin Ravi	mov     x1, #0x00
1194618b2bfSBipin Ravi	b       cpu_rev_var_ls
1204618b2bfSBipin Raviendfunc check_errata_2025414
1214618b2bfSBipin Ravi
1227cfae932SBipin Ravi/* ---------------------------------------------------------------
1237cfae932SBipin Ravi * Errata Workaround for Neoverse N2 Erratum 2189731.
1247cfae932SBipin Ravi * This applies to revision r0p0 of Neoverse N2 and is still open.
1257cfae932SBipin Ravi * Inputs:
1267cfae932SBipin Ravi * x0: variant[4:7] and revision[0:3] of current cpu.
1277cfae932SBipin Ravi * Shall clobber: x0-x17
1287cfae932SBipin Ravi * ---------------------------------------------------------------
1297cfae932SBipin Ravi */
1307cfae932SBipin Ravifunc errata_n2_2189731_wa
1317cfae932SBipin Ravi	/* Compare x0 against revision r0p0 */
1327cfae932SBipin Ravi	mov     x17, x30
1337cfae932SBipin Ravi	bl      check_errata_2189731
1347cfae932SBipin Ravi	cbz     x0, 1f
1357cfae932SBipin Ravi	mrs     x1, NEOVERSE_N2_CPUACTLR5_EL1
1367cfae932SBipin Ravi	orr     x1, x1, NEOVERSE_N2_CPUACTLR5_EL1_BIT_44
1377cfae932SBipin Ravi	msr     NEOVERSE_N2_CPUACTLR5_EL1, x1
1387cfae932SBipin Ravi
1397cfae932SBipin Ravi1:
1407cfae932SBipin Ravi	ret     x17
1417cfae932SBipin Raviendfunc errata_n2_2189731_wa
1427cfae932SBipin Ravi
1437cfae932SBipin Ravifunc check_errata_2189731
1447cfae932SBipin Ravi	/* Applies to r0p0 */
1457cfae932SBipin Ravi	mov     x1, #0x00
1467cfae932SBipin Ravi	b       cpu_rev_var_ls
1477cfae932SBipin Raviendfunc check_errata_2189731
1487cfae932SBipin Ravi
1491cafb08dSBipin Ravi/* --------------------------------------------------
1501cafb08dSBipin Ravi * Errata Workaround for Neoverse N2 Erratum 2138956.
1511cafb08dSBipin Ravi * This applies to revision r0p0 of Neoverse N2. it is still open.
1521cafb08dSBipin Ravi * Inputs:
1531cafb08dSBipin Ravi * x0: variant[4:7] and revision[0:3] of current cpu.
1541cafb08dSBipin Ravi * Shall clobber: x0-x17
1551cafb08dSBipin Ravi * --------------------------------------------------
1561cafb08dSBipin Ravi */
1571cafb08dSBipin Ravifunc errata_n2_2138956_wa
1581cafb08dSBipin Ravi	/* Check revision. */
1591cafb08dSBipin Ravi	mov	x17, x30
1601cafb08dSBipin Ravi	bl	check_errata_2138956
1611cafb08dSBipin Ravi	cbz	x0, 1f
1621cafb08dSBipin Ravi
1631cafb08dSBipin Ravi	/* Apply instruction patching sequence */
1641cafb08dSBipin Ravi	ldr	x0,=0x3
1651cafb08dSBipin Ravi	msr	S3_6_c15_c8_0,x0
1661cafb08dSBipin Ravi	ldr	x0,=0xF3A08002
1671cafb08dSBipin Ravi	msr	S3_6_c15_c8_2,x0
1681cafb08dSBipin Ravi	ldr	x0,=0xFFF0F7FE
1691cafb08dSBipin Ravi	msr	S3_6_c15_c8_3,x0
1701cafb08dSBipin Ravi	ldr	x0,=0x10002001003FF
1711cafb08dSBipin Ravi	msr	S3_6_c15_c8_1,x0
1721cafb08dSBipin Ravi	ldr	x0,=0x4
1731cafb08dSBipin Ravi	msr	S3_6_c15_c8_0,x0
1741cafb08dSBipin Ravi	ldr	x0,=0xBF200000
1751cafb08dSBipin Ravi	msr	S3_6_c15_c8_2,x0
1761cafb08dSBipin Ravi	ldr	x0,=0xFFEF0000
1771cafb08dSBipin Ravi	msr	S3_6_c15_c8_3,x0
1781cafb08dSBipin Ravi	ldr	x0,=0x10002001003F3
1791cafb08dSBipin Ravi	msr	S3_6_c15_c8_1,x0
1801cafb08dSBipin Ravi	isb
1811cafb08dSBipin Ravi1:
1821cafb08dSBipin Ravi	ret	x17
1831cafb08dSBipin Raviendfunc errata_n2_2138956_wa
1841cafb08dSBipin Ravi
1851cafb08dSBipin Ravifunc check_errata_2138956
1861cafb08dSBipin Ravi	/* Applies to r0p0 */
1871cafb08dSBipin Ravi	mov	x1, #0x00
1881cafb08dSBipin Ravi	b	cpu_rev_var_ls
1891cafb08dSBipin Raviendfunc check_errata_2138956
1901cafb08dSBipin Ravi
191ef8f0c52Snayanpatel-arm/* --------------------------------------------------
1925819e23bSnayanpatel-arm * Errata Workaround for Neoverse N2 Erratum 2242415.
1935819e23bSnayanpatel-arm * This applies to revision r0p0 of Neoverse N2. it is still open.
1945819e23bSnayanpatel-arm * Inputs:
1955819e23bSnayanpatel-arm * x0: variant[4:7] and revision[0:3] of current cpu.
1965819e23bSnayanpatel-arm * Shall clobber: x0-x1, x17
1975819e23bSnayanpatel-arm * --------------------------------------------------
1985819e23bSnayanpatel-arm */
1995819e23bSnayanpatel-armfunc errata_n2_2242415_wa
2005819e23bSnayanpatel-arm	/* Check revision. */
2015819e23bSnayanpatel-arm	mov	x17, x30
2025819e23bSnayanpatel-arm	bl	check_errata_2242415
2035819e23bSnayanpatel-arm	cbz	x0, 1f
2045819e23bSnayanpatel-arm
2055819e23bSnayanpatel-arm	/* Apply instruction patching sequence */
2065819e23bSnayanpatel-arm	mrs	x1, NEOVERSE_N2_CPUACTLR_EL1
2075819e23bSnayanpatel-arm	orr	x1, x1, NEOVERSE_N2_CPUACTLR_EL1_BIT_22
2085819e23bSnayanpatel-arm	msr	NEOVERSE_N2_CPUACTLR_EL1, x1
2095819e23bSnayanpatel-arm1:
2105819e23bSnayanpatel-arm	ret	x17
2115819e23bSnayanpatel-armendfunc errata_n2_2242415_wa
2125819e23bSnayanpatel-arm
2135819e23bSnayanpatel-armfunc check_errata_2242415
2145819e23bSnayanpatel-arm	/* Applies to r0p0 */
2155819e23bSnayanpatel-arm	mov	x1, #0x00
2165819e23bSnayanpatel-arm	b	cpu_rev_var_ls
2175819e23bSnayanpatel-armendfunc check_errata_2242415
2185819e23bSnayanpatel-arm
2195819e23bSnayanpatel-arm/* --------------------------------------------------
220ef8f0c52Snayanpatel-arm * Errata Workaround for Neoverse N2 Erratum 2138953.
221ef8f0c52Snayanpatel-arm * This applies to revision r0p0 of Neoverse N2. it is still open.
222ef8f0c52Snayanpatel-arm * Inputs:
223ef8f0c52Snayanpatel-arm * x0: variant[4:7] and revision[0:3] of current cpu.
224ef8f0c52Snayanpatel-arm * Shall clobber: x0-x1, x17
225ef8f0c52Snayanpatel-arm * --------------------------------------------------
226ef8f0c52Snayanpatel-arm */
227ef8f0c52Snayanpatel-armfunc errata_n2_2138953_wa
228ef8f0c52Snayanpatel-arm	/* Check revision. */
229ef8f0c52Snayanpatel-arm	mov	x17, x30
230ef8f0c52Snayanpatel-arm	bl	check_errata_2138953
231ef8f0c52Snayanpatel-arm	cbz	x0, 1f
232ef8f0c52Snayanpatel-arm
233ef8f0c52Snayanpatel-arm	/* Apply instruction patching sequence */
234ef8f0c52Snayanpatel-arm	mrs	x1, NEOVERSE_N2_CPUECTLR2_EL1
235ef8f0c52Snayanpatel-arm	mov	x0, #NEOVERSE_N2_CPUECTLR2_EL1_PF_MODE_CNSRV
236ef8f0c52Snayanpatel-arm	bfi	x1, x0, #CPUECTLR2_EL1_PF_MODE_LSB, #CPUECTLR2_EL1_PF_MODE_WIDTH
237ef8f0c52Snayanpatel-arm	msr	NEOVERSE_N2_CPUECTLR2_EL1, x1
238ef8f0c52Snayanpatel-arm1:
239ef8f0c52Snayanpatel-arm	ret	x17
240ef8f0c52Snayanpatel-armendfunc errata_n2_2138953_wa
241ef8f0c52Snayanpatel-arm
242ef8f0c52Snayanpatel-armfunc check_errata_2138953
243ef8f0c52Snayanpatel-arm	/* Applies to r0p0 */
244ef8f0c52Snayanpatel-arm	mov	x1, #0x00
245ef8f0c52Snayanpatel-arm	b	cpu_rev_var_ls
246ef8f0c52Snayanpatel-armendfunc check_errata_2138953
247ef8f0c52Snayanpatel-arm
248c948185cSnayanpatel-arm/* --------------------------------------------------
249c948185cSnayanpatel-arm * Errata Workaround for Neoverse N2 Erratum 2138958.
250c948185cSnayanpatel-arm * This applies to revision r0p0 of Neoverse N2. it is still open.
251c948185cSnayanpatel-arm * Inputs:
252c948185cSnayanpatel-arm * x0: variant[4:7] and revision[0:3] of current cpu.
253c948185cSnayanpatel-arm * Shall clobber: x0-x1, x17
254c948185cSnayanpatel-arm * --------------------------------------------------
255c948185cSnayanpatel-arm */
256c948185cSnayanpatel-armfunc errata_n2_2138958_wa
257c948185cSnayanpatel-arm	/* Check revision. */
258c948185cSnayanpatel-arm	mov	x17, x30
259c948185cSnayanpatel-arm	bl	check_errata_2138958
260c948185cSnayanpatel-arm	cbz	x0, 1f
261c948185cSnayanpatel-arm
262c948185cSnayanpatel-arm	/* Apply instruction patching sequence */
263c948185cSnayanpatel-arm	mrs	x1, NEOVERSE_N2_CPUACTLR5_EL1
264c948185cSnayanpatel-arm	orr	x1, x1, NEOVERSE_N2_CPUACTLR5_EL1_BIT_13
265c948185cSnayanpatel-arm	msr	NEOVERSE_N2_CPUACTLR5_EL1, x1
266c948185cSnayanpatel-arm1:
267c948185cSnayanpatel-arm	ret	x17
268c948185cSnayanpatel-armendfunc errata_n2_2138958_wa
269c948185cSnayanpatel-arm
270c948185cSnayanpatel-armfunc check_errata_2138958
271c948185cSnayanpatel-arm	/* Applies to r0p0 */
272c948185cSnayanpatel-arm	mov	x1, #0x00
273c948185cSnayanpatel-arm	b	cpu_rev_var_ls
274c948185cSnayanpatel-armendfunc check_errata_2138958
275c948185cSnayanpatel-arm
276603806d1Snayanpatel-arm/* --------------------------------------------------
277603806d1Snayanpatel-arm * Errata Workaround for Neoverse N2 Erratum 2242400.
278603806d1Snayanpatel-arm * This applies to revision r0p0 of Neoverse N2. it is still open.
279603806d1Snayanpatel-arm * Inputs:
280603806d1Snayanpatel-arm * x0: variant[4:7] and revision[0:3] of current cpu.
281603806d1Snayanpatel-arm * Shall clobber: x0-x1, x17
282603806d1Snayanpatel-arm * --------------------------------------------------
283603806d1Snayanpatel-arm */
284603806d1Snayanpatel-armfunc errata_n2_2242400_wa
285603806d1Snayanpatel-arm	/* Check revision. */
286603806d1Snayanpatel-arm	mov	x17, x30
287603806d1Snayanpatel-arm	bl	check_errata_2242400
288603806d1Snayanpatel-arm	cbz	x0, 1f
289603806d1Snayanpatel-arm
290603806d1Snayanpatel-arm	/* Apply instruction patching sequence */
291603806d1Snayanpatel-arm	mrs	x1, NEOVERSE_N2_CPUACTLR5_EL1
292603806d1Snayanpatel-arm	orr	x1, x1, NEOVERSE_N2_CPUACTLR5_EL1_BIT_17
293603806d1Snayanpatel-arm	msr	NEOVERSE_N2_CPUACTLR5_EL1, x1
294603806d1Snayanpatel-arm	ldr	x0, =0x2
295603806d1Snayanpatel-arm	msr	S3_6_c15_c8_0, x0
296603806d1Snayanpatel-arm	ldr	x0, =0x10F600E000
297603806d1Snayanpatel-arm	msr	S3_6_c15_c8_2, x0
298603806d1Snayanpatel-arm	ldr	x0, =0x10FF80E000
299603806d1Snayanpatel-arm	msr	S3_6_c15_c8_3, x0
300603806d1Snayanpatel-arm	ldr	x0, =0x80000000003FF
301603806d1Snayanpatel-arm	msr	S3_6_c15_c8_1, x0
302603806d1Snayanpatel-arm	isb
303603806d1Snayanpatel-arm1:
304603806d1Snayanpatel-arm	ret	x17
305603806d1Snayanpatel-armendfunc errata_n2_2242400_wa
306603806d1Snayanpatel-arm
307603806d1Snayanpatel-armfunc check_errata_2242400
308603806d1Snayanpatel-arm	/* Applies to r0p0 */
309603806d1Snayanpatel-arm	mov	x1, #0x00
310603806d1Snayanpatel-arm	b	cpu_rev_var_ls
311603806d1Snayanpatel-armendfunc check_errata_2242400
312603806d1Snayanpatel-arm
3130d2d9992Snayanpatel-arm/* --------------------------------------------------
3140d2d9992Snayanpatel-arm * Errata Workaround for Neoverse N2 Erratum 2280757.
3150d2d9992Snayanpatel-arm * This applies to revision r0p0 of Neoverse N2. it is still open.
3160d2d9992Snayanpatel-arm * Inputs:
3170d2d9992Snayanpatel-arm * x0: variant[4:7] and revision[0:3] of current cpu.
3180d2d9992Snayanpatel-arm * Shall clobber: x0-x1, x17
3190d2d9992Snayanpatel-arm * --------------------------------------------------
3200d2d9992Snayanpatel-arm */
3210d2d9992Snayanpatel-armfunc errata_n2_2280757_wa
3220d2d9992Snayanpatel-arm	/* Check revision. */
3230d2d9992Snayanpatel-arm	mov	x17, x30
3240d2d9992Snayanpatel-arm	bl	check_errata_2280757
3250d2d9992Snayanpatel-arm	cbz	x0, 1f
3260d2d9992Snayanpatel-arm
3270d2d9992Snayanpatel-arm	/* Apply instruction patching sequence */
3280d2d9992Snayanpatel-arm	mrs	x1, NEOVERSE_N2_CPUACTLR_EL1
3290d2d9992Snayanpatel-arm	orr	x1, x1, NEOVERSE_N2_CPUACTLR_EL1_BIT_22
3300d2d9992Snayanpatel-arm	msr	NEOVERSE_N2_CPUACTLR_EL1, x1
3310d2d9992Snayanpatel-arm1:
3320d2d9992Snayanpatel-arm	ret	x17
3330d2d9992Snayanpatel-armendfunc errata_n2_2280757_wa
3340d2d9992Snayanpatel-arm
3350d2d9992Snayanpatel-armfunc check_errata_2280757
3360d2d9992Snayanpatel-arm	/* Applies to r0p0 */
3370d2d9992Snayanpatel-arm	mov	x1, #0x00
3380d2d9992Snayanpatel-arm	b	cpu_rev_var_ls
3390d2d9992Snayanpatel-armendfunc check_errata_2280757
3400d2d9992Snayanpatel-arm
341*e6602d4bSAkram Ahmad
342*e6602d4bSAkram Ahmad/* --------------------------------------------------
343*e6602d4bSAkram Ahmad * Errata Workaround for Neoverse N2 Erratum 2376738.
344*e6602d4bSAkram Ahmad * This applies to revision r0p0 of Neoverse N2,
345*e6602d4bSAkram Ahmad * fixed in r0p1.
346*e6602d4bSAkram Ahmad * Inputs:
347*e6602d4bSAkram Ahmad * x0: variant[4:7] and revision[0:3] of current CPU.
348*e6602d4bSAkram Ahmad * Shall clobber: x0-x1, x17
349*e6602d4bSAkram Ahmad * --------------------------------------------------
350*e6602d4bSAkram Ahmad */
351*e6602d4bSAkram Ahmadfunc errata_n2_2376738_wa
352*e6602d4bSAkram Ahmad	mov	x17, x30
353*e6602d4bSAkram Ahmad	bl	check_errata_2376738
354*e6602d4bSAkram Ahmad	cbz	x0, 1f
355*e6602d4bSAkram Ahmad
356*e6602d4bSAkram Ahmad	/* Set CPUACTLR2_EL1[0] to 1 to force PLDW/PFRM
357*e6602d4bSAkram Ahmad	 * ST to behave like PLD/PFRM LD and not cause
358*e6602d4bSAkram Ahmad	 * invalidations to other PE caches.
359*e6602d4bSAkram Ahmad	 */
360*e6602d4bSAkram Ahmad	mrs	x1, NEOVERSE_N2_CPUACTLR2_EL1
361*e6602d4bSAkram Ahmad	orr	x1, x1,	NEOVERSE_N2_CPUACTLR2_EL1_BIT_0
362*e6602d4bSAkram Ahmad	msr	NEOVERSE_N2_CPUACTLR2_EL1, x1
363*e6602d4bSAkram Ahmad1:
364*e6602d4bSAkram Ahmad	ret x17
365*e6602d4bSAkram Ahmadendfunc errata_n2_2376738_wa
366*e6602d4bSAkram Ahmad
367*e6602d4bSAkram Ahmadfunc check_errata_2376738
368*e6602d4bSAkram Ahmad	/* Applies to r0p0, fixed in r0p1 */
369*e6602d4bSAkram Ahmad	mov	x1, 0x00
370*e6602d4bSAkram Ahmad	b	cpu_rev_var_ls
371*e6602d4bSAkram Ahmadendfunc check_errata_2376738
372*e6602d4bSAkram Ahmad
373884d5156SDaniel Boulby/* --------------------------------------------------
374884d5156SDaniel Boulby * Errata Workaround for Neoverse N2 Erratum 2388450.
375884d5156SDaniel Boulby * This applies to revision r0p0 of Neoverse N2,
376884d5156SDaniel Boulby * fixed in r0p1.
377884d5156SDaniel Boulby * Inputs:
378884d5156SDaniel Boulby * x0: variant[4:7] and revision[0:3] of current cpu.
379884d5156SDaniel Boulby * Shall clobber: x0-x1, x17
380884d5156SDaniel Boulby * --------------------------------------------------
381884d5156SDaniel Boulby */
382884d5156SDaniel Boulbyfunc errata_n2_2388450_wa
383884d5156SDaniel Boulby	/* Check revision. */
384884d5156SDaniel Boulby	mov	x17, x30
385884d5156SDaniel Boulby	bl	check_errata_2388450
386884d5156SDaniel Boulby	cbz	x0, 1f
387884d5156SDaniel Boulby
388884d5156SDaniel Boulby	/*Set bit 40 in ACTLR2_EL1 */
389884d5156SDaniel Boulby	mrs	x1, NEOVERSE_N2_CPUACTLR2_EL1
390884d5156SDaniel Boulby	orr	x1, x1, #NEOVERSE_N2_CPUACTLR2_EL1_BIT_40
391884d5156SDaniel Boulby	msr	NEOVERSE_N2_CPUACTLR2_EL1, x1
392884d5156SDaniel Boulby	isb
393884d5156SDaniel Boulby1:
394884d5156SDaniel Boulby	ret	x17
395884d5156SDaniel Boulbyendfunc errata_n2_2388450_wa
396884d5156SDaniel Boulby
397884d5156SDaniel Boulbyfunc check_errata_2388450
398884d5156SDaniel Boulby	/* Applies to r0p0, fixed in r0p1 */
399884d5156SDaniel Boulby	mov	x1, #0x00
400884d5156SDaniel Boulby	b	cpu_rev_var_ls
401884d5156SDaniel Boulbyendfunc check_errata_2388450
402884d5156SDaniel Boulby
4031fe4a9d1SBipin Ravifunc check_errata_cve_2022_23960
4041fe4a9d1SBipin Ravi#if WORKAROUND_CVE_2022_23960
4051fe4a9d1SBipin Ravi	mov	x0, #ERRATA_APPLIES
4061fe4a9d1SBipin Ravi#else
4071fe4a9d1SBipin Ravi	mov	x0, #ERRATA_MISSING
4081fe4a9d1SBipin Ravi#endif
4091fe4a9d1SBipin Ravi	ret
4101fe4a9d1SBipin Raviendfunc check_errata_cve_2022_23960
4111fe4a9d1SBipin Ravi
4124618b2bfSBipin Ravi	/* -------------------------------------------
41325bbbd2dSJavier Almansa Sobrino	 * The CPU Ops reset function for Neoverse N2.
4144618b2bfSBipin Ravi	 * -------------------------------------------
41525bbbd2dSJavier Almansa Sobrino	 */
41625bbbd2dSJavier Almansa Sobrinofunc neoverse_n2_reset_func
4179380f754Snayanpatel-arm	mov	x19, x30
4189380f754Snayanpatel-arm
41925bbbd2dSJavier Almansa Sobrino	/* Check if the PE implements SSBS */
42025bbbd2dSJavier Almansa Sobrino	mrs	x0, id_aa64pfr1_el1
42125bbbd2dSJavier Almansa Sobrino	tst	x0, #(ID_AA64PFR1_EL1_SSBS_MASK << ID_AA64PFR1_EL1_SSBS_SHIFT)
42225bbbd2dSJavier Almansa Sobrino	b.eq	1f
42325bbbd2dSJavier Almansa Sobrino
42425bbbd2dSJavier Almansa Sobrino	/* Disable speculative loads */
42525bbbd2dSJavier Almansa Sobrino	msr	SSBS, xzr
42625bbbd2dSJavier Almansa Sobrino1:
42725bbbd2dSJavier Almansa Sobrino	/* Force all cacheable atomic instructions to be near */
42825bbbd2dSJavier Almansa Sobrino	mrs	x0, NEOVERSE_N2_CPUACTLR2_EL1
42925bbbd2dSJavier Almansa Sobrino	orr	x0, x0, #NEOVERSE_N2_CPUACTLR2_EL1_BIT_2
43025bbbd2dSJavier Almansa Sobrino	msr	NEOVERSE_N2_CPUACTLR2_EL1, x0
43125bbbd2dSJavier Almansa Sobrino
4327e3273e8SBipin Ravi#if ERRATA_DSU_2313941
4337e3273e8SBipin Ravi	bl	errata_dsu_2313941_wa
4347e3273e8SBipin Ravi#endif
4357e3273e8SBipin Ravi
43665e04f27SBipin Ravi#if ERRATA_N2_2067956
43765e04f27SBipin Ravi	mov	x0, x18
43865e04f27SBipin Ravi	bl	errata_n2_2067956_wa
43965e04f27SBipin Ravi#endif
44065e04f27SBipin Ravi
4414618b2bfSBipin Ravi#if ERRATA_N2_2025414
4424618b2bfSBipin Ravi	mov	x0, x18
4434618b2bfSBipin Ravi	bl	errata_n2_2025414_wa
4444618b2bfSBipin Ravi#endif
4454618b2bfSBipin Ravi
4467cfae932SBipin Ravi#if ERRATA_N2_2189731
4477cfae932SBipin Ravi	mov	x0, x18
4487cfae932SBipin Ravi	bl	errata_n2_2189731_wa
4497cfae932SBipin Ravi#endif
4507cfae932SBipin Ravi
4511cafb08dSBipin Ravi
4521cafb08dSBipin Ravi#if ERRATA_N2_2138956
4531cafb08dSBipin Ravi	mov	x0, x18
4541cafb08dSBipin Ravi	bl	errata_n2_2138956_wa
4551cafb08dSBipin Ravi#endif
4561cafb08dSBipin Ravi
457ef8f0c52Snayanpatel-arm#if ERRATA_N2_2138953
458ef8f0c52Snayanpatel-arm	mov	x0, x18
459ef8f0c52Snayanpatel-arm	bl	errata_n2_2138953_wa
460ef8f0c52Snayanpatel-arm#endif
461ef8f0c52Snayanpatel-arm
4625819e23bSnayanpatel-arm#if ERRATA_N2_2242415
4635819e23bSnayanpatel-arm	mov	x0, x18
4645819e23bSnayanpatel-arm	bl	errata_n2_2242415_wa
4655819e23bSnayanpatel-arm#endif
4665819e23bSnayanpatel-arm
467c948185cSnayanpatel-arm#if ERRATA_N2_2138958
468c948185cSnayanpatel-arm	mov	x0, x18
469c948185cSnayanpatel-arm	bl	errata_n2_2138958_wa
470c948185cSnayanpatel-arm#endif
471c948185cSnayanpatel-arm
472603806d1Snayanpatel-arm#if ERRATA_N2_2242400
473603806d1Snayanpatel-arm	mov	x0, x18
474603806d1Snayanpatel-arm	bl	errata_n2_2242400_wa
475603806d1Snayanpatel-arm#endif
476603806d1Snayanpatel-arm
4770d2d9992Snayanpatel-arm#if ERRATA_N2_2280757
4780d2d9992Snayanpatel-arm	mov	x0, x18
4790d2d9992Snayanpatel-arm	bl	errata_n2_2280757_wa
4800d2d9992Snayanpatel-arm#endif
4810d2d9992Snayanpatel-arm
482*e6602d4bSAkram Ahmad#if ERRATA_N2_2376738
483*e6602d4bSAkram Ahmad	mov	x0, x18
484*e6602d4bSAkram Ahmad	bl	errata_n2_2376738_wa
485*e6602d4bSAkram Ahmad#endif
486*e6602d4bSAkram Ahmad
487884d5156SDaniel Boulby#if ERRATA_N2_2388450
488884d5156SDaniel Boulby	mov	x0, x18
489884d5156SDaniel Boulby	bl	errata_n2_2388450_wa
490884d5156SDaniel Boulby#endif
491884d5156SDaniel Boulby
49225bbbd2dSJavier Almansa Sobrino#if ENABLE_AMU
49325bbbd2dSJavier Almansa Sobrino	/* Make sure accesses from EL0/EL1 and EL2 are not trapped to EL3 */
49425bbbd2dSJavier Almansa Sobrino	mrs	x0, cptr_el3
49525bbbd2dSJavier Almansa Sobrino	orr	x0, x0, #TAM_BIT
49625bbbd2dSJavier Almansa Sobrino	msr	cptr_el3, x0
49725bbbd2dSJavier Almansa Sobrino
49825bbbd2dSJavier Almansa Sobrino	/* Make sure accesses from EL0/EL1 are not trapped to EL2 */
49925bbbd2dSJavier Almansa Sobrino	mrs	x0, cptr_el2
50025bbbd2dSJavier Almansa Sobrino	orr	x0, x0, #TAM_BIT
50125bbbd2dSJavier Almansa Sobrino	msr	cptr_el2, x0
50225bbbd2dSJavier Almansa Sobrino
50325bbbd2dSJavier Almansa Sobrino	/* No need to enable the counters as this would be done at el3 exit */
50425bbbd2dSJavier Almansa Sobrino#endif
50525bbbd2dSJavier Almansa Sobrino
50625bbbd2dSJavier Almansa Sobrino#if NEOVERSE_Nx_EXTERNAL_LLC
50725bbbd2dSJavier Almansa Sobrino	/* Some systems may have External LLC, core needs to be made aware */
50825bbbd2dSJavier Almansa Sobrino	mrs	x0, NEOVERSE_N2_CPUECTLR_EL1
50925bbbd2dSJavier Almansa Sobrino	orr	x0, x0, NEOVERSE_N2_CPUECTLR_EL1_EXTLLC_BIT
51025bbbd2dSJavier Almansa Sobrino	msr	NEOVERSE_N2_CPUECTLR_EL1, x0
51125bbbd2dSJavier Almansa Sobrino#endif
51225bbbd2dSJavier Almansa Sobrino
5139380f754Snayanpatel-arm	bl	cpu_get_rev_var
5149380f754Snayanpatel-arm	mov	x18, x0
5159380f754Snayanpatel-arm
5169380f754Snayanpatel-arm#if ERRATA_N2_2002655
5179380f754Snayanpatel-arm	mov	x0, x18
5189380f754Snayanpatel-arm	bl	errata_n2_2002655_wa
5199380f754Snayanpatel-arm#endif
5209380f754Snayanpatel-arm
5211fe4a9d1SBipin Ravi#if IMAGE_BL31 && WORKAROUND_CVE_2022_23960
5221fe4a9d1SBipin Ravi	/*
5231fe4a9d1SBipin Ravi	 * The Neoverse-N2 generic vectors are overridden to apply errata
5241fe4a9d1SBipin Ravi         * mitigation on exception entry from lower ELs.
5251fe4a9d1SBipin Ravi	 */
5261fe4a9d1SBipin Ravi	adr	x0, wa_cve_vbar_neoverse_n2
5271fe4a9d1SBipin Ravi	msr	vbar_el3, x0
5281fe4a9d1SBipin Ravi#endif /* IMAGE_BL31 && WORKAROUND_CVE_2022_23960 */
5291fe4a9d1SBipin Ravi
53025bbbd2dSJavier Almansa Sobrino	isb
5319380f754Snayanpatel-arm	ret	x19
53225bbbd2dSJavier Almansa Sobrinoendfunc neoverse_n2_reset_func
53325bbbd2dSJavier Almansa Sobrino
53425bbbd2dSJavier Almansa Sobrinofunc neoverse_n2_core_pwr_dwn
5354618b2bfSBipin Ravi	/* ---------------------------------------------------
53625bbbd2dSJavier Almansa Sobrino	 * Enable CPU power down bit in power control register
53725bbbd2dSJavier Almansa Sobrino	 * No need to do cache maintenance here.
5384618b2bfSBipin Ravi	 * ---------------------------------------------------
53925bbbd2dSJavier Almansa Sobrino	 */
54025bbbd2dSJavier Almansa Sobrino	mrs	x0, NEOVERSE_N2_CPUPWRCTLR_EL1
54125bbbd2dSJavier Almansa Sobrino	orr	x0, x0, #NEOVERSE_N2_CORE_PWRDN_EN_BIT
54225bbbd2dSJavier Almansa Sobrino	msr	NEOVERSE_N2_CPUPWRCTLR_EL1, x0
54325bbbd2dSJavier Almansa Sobrino	isb
54425bbbd2dSJavier Almansa Sobrino	ret
54525bbbd2dSJavier Almansa Sobrinoendfunc neoverse_n2_core_pwr_dwn
54625bbbd2dSJavier Almansa Sobrino
54725bbbd2dSJavier Almansa Sobrino#if REPORT_ERRATA
54825bbbd2dSJavier Almansa Sobrino/*
54925bbbd2dSJavier Almansa Sobrino * Errata printing function for Neoverse N2 cores. Must follow AAPCS.
55025bbbd2dSJavier Almansa Sobrino */
55125bbbd2dSJavier Almansa Sobrinofunc neoverse_n2_errata_report
5529380f754Snayanpatel-arm	stp	x8, x30, [sp, #-16]!
5539380f754Snayanpatel-arm
5549380f754Snayanpatel-arm	bl	cpu_get_rev_var
5559380f754Snayanpatel-arm	mov	x8, x0
5569380f754Snayanpatel-arm
5579380f754Snayanpatel-arm	/*
5589380f754Snayanpatel-arm	 * Report all errata. The revision-variant information is passed to
5599380f754Snayanpatel-arm	 * checking functions of each errata.
5609380f754Snayanpatel-arm	 */
5619380f754Snayanpatel-arm	report_errata ERRATA_N2_2002655, neoverse_n2, 2002655
56265e04f27SBipin Ravi	report_errata ERRATA_N2_2067956, neoverse_n2, 2067956
5634618b2bfSBipin Ravi	report_errata ERRATA_N2_2025414, neoverse_n2, 2025414
5647cfae932SBipin Ravi	report_errata ERRATA_N2_2189731, neoverse_n2, 2189731
5651cafb08dSBipin Ravi	report_errata ERRATA_N2_2138956, neoverse_n2, 2138956
566ef8f0c52Snayanpatel-arm	report_errata ERRATA_N2_2138953, neoverse_n2, 2138953
5675819e23bSnayanpatel-arm	report_errata ERRATA_N2_2242415, neoverse_n2, 2242415
568c948185cSnayanpatel-arm	report_errata ERRATA_N2_2138958, neoverse_n2, 2138958
569603806d1Snayanpatel-arm	report_errata ERRATA_N2_2242400, neoverse_n2, 2242400
5700d2d9992Snayanpatel-arm	report_errata ERRATA_N2_2280757, neoverse_n2, 2280757
571*e6602d4bSAkram Ahmad	report_errata ERRATA_N2_2376738, neoverse_n2, 2376738
572884d5156SDaniel Boulby	report_errata ERRATA_N2_2388450, neoverse_n2, 2388450
5731fe4a9d1SBipin Ravi	report_errata WORKAROUND_CVE_2022_23960, neoverse_n2, cve_2022_23960
5747e3273e8SBipin Ravi	report_errata ERRATA_DSU_2313941, neoverse_n2, dsu_2313941
5759380f754Snayanpatel-arm
5769380f754Snayanpatel-arm	ldp	x8, x30, [sp], #16
57725bbbd2dSJavier Almansa Sobrino	ret
57825bbbd2dSJavier Almansa Sobrinoendfunc neoverse_n2_errata_report
57925bbbd2dSJavier Almansa Sobrino#endif
58025bbbd2dSJavier Almansa Sobrino
58125bbbd2dSJavier Almansa Sobrino	/* ---------------------------------------------
58225bbbd2dSJavier Almansa Sobrino	 * This function provides Neoverse N2 specific
58325bbbd2dSJavier Almansa Sobrino	 * register information for crash reporting.
58425bbbd2dSJavier Almansa Sobrino	 * It needs to return with x6 pointing to
58525bbbd2dSJavier Almansa Sobrino	 * a list of register names in ASCII and
58625bbbd2dSJavier Almansa Sobrino	 * x8 - x15 having values of registers to be
58725bbbd2dSJavier Almansa Sobrino	 * reported.
58825bbbd2dSJavier Almansa Sobrino	 * ---------------------------------------------
58925bbbd2dSJavier Almansa Sobrino	 */
59025bbbd2dSJavier Almansa Sobrino.section .rodata.neoverse_n2_regs, "aS"
59125bbbd2dSJavier Almansa Sobrinoneoverse_n2_regs:  /* The ASCII list of register names to be reported */
59225bbbd2dSJavier Almansa Sobrino	.asciz	"cpupwrctlr_el1", ""
59325bbbd2dSJavier Almansa Sobrino
59425bbbd2dSJavier Almansa Sobrinofunc neoverse_n2_cpu_reg_dump
59525bbbd2dSJavier Almansa Sobrino	adr	x6, neoverse_n2_regs
59625bbbd2dSJavier Almansa Sobrino	mrs	x8, NEOVERSE_N2_CPUPWRCTLR_EL1
59725bbbd2dSJavier Almansa Sobrino	ret
59825bbbd2dSJavier Almansa Sobrinoendfunc neoverse_n2_cpu_reg_dump
59925bbbd2dSJavier Almansa Sobrino
60025bbbd2dSJavier Almansa Sobrinodeclare_cpu_ops neoverse_n2, NEOVERSE_N2_MIDR, \
60125bbbd2dSJavier Almansa Sobrino	neoverse_n2_reset_func, \
60225bbbd2dSJavier Almansa Sobrino	neoverse_n2_core_pwr_dwn
603