xref: /rk3399_ARM-atf/lib/cpus/aarch64/neoverse_n2.S (revision 0d2d99924e1be548e75c46cfd536f7503cf863e0)
125bbbd2dSJavier Almansa Sobrino/*
24618b2bfSBipin Ravi * Copyright (c) 2020-2021, 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>
1125bbbd2dSJavier Almansa Sobrino
1225bbbd2dSJavier Almansa Sobrino/* Hardware handled coherency */
1325bbbd2dSJavier Almansa Sobrino#if HW_ASSISTED_COHERENCY == 0
1425bbbd2dSJavier Almansa Sobrino#error "Neoverse N2 must be compiled with HW_ASSISTED_COHERENCY enabled"
1525bbbd2dSJavier Almansa Sobrino#endif
1625bbbd2dSJavier Almansa Sobrino
1725bbbd2dSJavier Almansa Sobrino/* 64-bit only core */
1825bbbd2dSJavier Almansa Sobrino#if CTX_INCLUDE_AARCH32_REGS == 1
1925bbbd2dSJavier Almansa Sobrino#error "Neoverse-N2 supports only AArch64. Compile with CTX_INCLUDE_AARCH32_REGS=0"
2025bbbd2dSJavier Almansa Sobrino#endif
2125bbbd2dSJavier Almansa Sobrino
229380f754Snayanpatel-arm/* --------------------------------------------------
239380f754Snayanpatel-arm * Errata Workaround for Neoverse N2 Erratum 2002655.
249380f754Snayanpatel-arm * This applies to revision r0p0 of Neoverse N2. it is still open.
259380f754Snayanpatel-arm * Inputs:
269380f754Snayanpatel-arm * x0: variant[4:7] and revision[0:3] of current cpu.
279380f754Snayanpatel-arm * Shall clobber: x0-x17
289380f754Snayanpatel-arm * --------------------------------------------------
299380f754Snayanpatel-arm */
309380f754Snayanpatel-armfunc errata_n2_2002655_wa
319380f754Snayanpatel-arm	/* Check revision. */
329380f754Snayanpatel-arm	mov	x17, x30
339380f754Snayanpatel-arm	bl	check_errata_2002655
349380f754Snayanpatel-arm	cbz	x0, 1f
359380f754Snayanpatel-arm
369380f754Snayanpatel-arm	/* Apply instruction patching sequence */
379380f754Snayanpatel-arm	ldr x0,=0x6
389380f754Snayanpatel-arm	msr S3_6_c15_c8_0,x0
399380f754Snayanpatel-arm	ldr x0,=0xF3A08002
409380f754Snayanpatel-arm	msr S3_6_c15_c8_2,x0
419380f754Snayanpatel-arm	ldr x0,=0xFFF0F7FE
429380f754Snayanpatel-arm	msr S3_6_c15_c8_3,x0
439380f754Snayanpatel-arm	ldr x0,=0x40000001003ff
449380f754Snayanpatel-arm	msr S3_6_c15_c8_1,x0
459380f754Snayanpatel-arm	ldr x0,=0x7
469380f754Snayanpatel-arm	msr S3_6_c15_c8_0,x0
479380f754Snayanpatel-arm	ldr x0,=0xBF200000
489380f754Snayanpatel-arm	msr S3_6_c15_c8_2,x0
499380f754Snayanpatel-arm	ldr x0,=0xFFEF0000
509380f754Snayanpatel-arm	msr S3_6_c15_c8_3,x0
519380f754Snayanpatel-arm	ldr x0,=0x40000001003f3
529380f754Snayanpatel-arm	msr S3_6_c15_c8_1,x0
539380f754Snayanpatel-arm	isb
549380f754Snayanpatel-arm1:
559380f754Snayanpatel-arm	ret	x17
569380f754Snayanpatel-armendfunc errata_n2_2002655_wa
579380f754Snayanpatel-arm
589380f754Snayanpatel-armfunc check_errata_2002655
599380f754Snayanpatel-arm	/* Applies to r0p0 */
609380f754Snayanpatel-arm	mov	x1, #0x00
619380f754Snayanpatel-arm	b	cpu_rev_var_ls
629380f754Snayanpatel-armendfunc check_errata_2002655
639380f754Snayanpatel-arm
6465e04f27SBipin Ravi/* ---------------------------------------------------------------
6565e04f27SBipin Ravi * Errata Workaround for Neoverse N2 Erratum 2067956.
6665e04f27SBipin Ravi * This applies to revision r0p0 of Neoverse N2 and is still open.
6765e04f27SBipin Ravi * Inputs:
6865e04f27SBipin Ravi * x0: variant[4:7] and revision[0:3] of current cpu.
6965e04f27SBipin Ravi * Shall clobber: x0-x17
7065e04f27SBipin Ravi * ---------------------------------------------------------------
7165e04f27SBipin Ravi */
7265e04f27SBipin Ravifunc errata_n2_2067956_wa
7365e04f27SBipin Ravi	/* Compare x0 against revision r0p0 */
7465e04f27SBipin Ravi	mov	x17, x30
7565e04f27SBipin Ravi	bl	check_errata_2067956
7665e04f27SBipin Ravi	cbz	x0, 1f
7765e04f27SBipin Ravi	mrs	x1, NEOVERSE_N2_CPUACTLR_EL1
7865e04f27SBipin Ravi	orr	x1, x1, NEOVERSE_N2_CPUACTLR_EL1_BIT_46
7965e04f27SBipin Ravi	msr	NEOVERSE_N2_CPUACTLR_EL1, x1
8065e04f27SBipin Ravi1:
8165e04f27SBipin Ravi	ret	x17
8265e04f27SBipin Raviendfunc errata_n2_2067956_wa
8365e04f27SBipin Ravi
8465e04f27SBipin Ravifunc check_errata_2067956
8565e04f27SBipin Ravi	/* Applies to r0p0 */
8665e04f27SBipin Ravi	mov	x1, #0x00
8765e04f27SBipin Ravi	b	cpu_rev_var_ls
8865e04f27SBipin Raviendfunc check_errata_2067956
8965e04f27SBipin Ravi
904618b2bfSBipin Ravi/* ---------------------------------------------------------------
914618b2bfSBipin Ravi * Errata Workaround for Neoverse N2 Erratum 2025414.
924618b2bfSBipin Ravi * This applies to revision r0p0 of Neoverse N2 and is still open.
934618b2bfSBipin Ravi * Inputs:
944618b2bfSBipin Ravi * x0: variant[4:7] and revision[0:3] of current cpu.
954618b2bfSBipin Ravi * Shall clobber: x0-x17
964618b2bfSBipin Ravi * ---------------------------------------------------------------
974618b2bfSBipin Ravi */
984618b2bfSBipin Ravifunc errata_n2_2025414_wa
994618b2bfSBipin Ravi	/* Compare x0 against revision r0p0 */
1004618b2bfSBipin Ravi	mov     x17, x30
1014618b2bfSBipin Ravi	bl      check_errata_2025414
1024618b2bfSBipin Ravi	cbz     x0, 1f
1034618b2bfSBipin Ravi	mrs     x1, NEOVERSE_N2_CPUECTLR_EL1
1044618b2bfSBipin Ravi	orr     x1, x1, NEOVERSE_N2_CPUECTLR_EL1_PFSTIDIS_BIT
1054618b2bfSBipin Ravi	msr     NEOVERSE_N2_CPUECTLR_EL1, x1
1064618b2bfSBipin Ravi
1074618b2bfSBipin Ravi1:
1084618b2bfSBipin Ravi	ret     x17
1094618b2bfSBipin Raviendfunc errata_n2_2025414_wa
1104618b2bfSBipin Ravi
1114618b2bfSBipin Ravifunc check_errata_2025414
1124618b2bfSBipin Ravi	/* Applies to r0p0 */
1134618b2bfSBipin Ravi	mov     x1, #0x00
1144618b2bfSBipin Ravi	b       cpu_rev_var_ls
1154618b2bfSBipin Raviendfunc check_errata_2025414
1164618b2bfSBipin Ravi
1177cfae932SBipin Ravi/* ---------------------------------------------------------------
1187cfae932SBipin Ravi * Errata Workaround for Neoverse N2 Erratum 2189731.
1197cfae932SBipin Ravi * This applies to revision r0p0 of Neoverse N2 and is still open.
1207cfae932SBipin Ravi * Inputs:
1217cfae932SBipin Ravi * x0: variant[4:7] and revision[0:3] of current cpu.
1227cfae932SBipin Ravi * Shall clobber: x0-x17
1237cfae932SBipin Ravi * ---------------------------------------------------------------
1247cfae932SBipin Ravi */
1257cfae932SBipin Ravifunc errata_n2_2189731_wa
1267cfae932SBipin Ravi	/* Compare x0 against revision r0p0 */
1277cfae932SBipin Ravi	mov     x17, x30
1287cfae932SBipin Ravi	bl      check_errata_2189731
1297cfae932SBipin Ravi	cbz     x0, 1f
1307cfae932SBipin Ravi	mrs     x1, NEOVERSE_N2_CPUACTLR5_EL1
1317cfae932SBipin Ravi	orr     x1, x1, NEOVERSE_N2_CPUACTLR5_EL1_BIT_44
1327cfae932SBipin Ravi	msr     NEOVERSE_N2_CPUACTLR5_EL1, x1
1337cfae932SBipin Ravi
1347cfae932SBipin Ravi1:
1357cfae932SBipin Ravi	ret     x17
1367cfae932SBipin Raviendfunc errata_n2_2189731_wa
1377cfae932SBipin Ravi
1387cfae932SBipin Ravifunc check_errata_2189731
1397cfae932SBipin Ravi	/* Applies to r0p0 */
1407cfae932SBipin Ravi	mov     x1, #0x00
1417cfae932SBipin Ravi	b       cpu_rev_var_ls
1427cfae932SBipin Raviendfunc check_errata_2189731
1437cfae932SBipin Ravi
1441cafb08dSBipin Ravi/* --------------------------------------------------
1451cafb08dSBipin Ravi * Errata Workaround for Neoverse N2 Erratum 2138956.
1461cafb08dSBipin Ravi * This applies to revision r0p0 of Neoverse N2. it is still open.
1471cafb08dSBipin Ravi * Inputs:
1481cafb08dSBipin Ravi * x0: variant[4:7] and revision[0:3] of current cpu.
1491cafb08dSBipin Ravi * Shall clobber: x0-x17
1501cafb08dSBipin Ravi * --------------------------------------------------
1511cafb08dSBipin Ravi */
1521cafb08dSBipin Ravifunc errata_n2_2138956_wa
1531cafb08dSBipin Ravi	/* Check revision. */
1541cafb08dSBipin Ravi	mov	x17, x30
1551cafb08dSBipin Ravi	bl	check_errata_2138956
1561cafb08dSBipin Ravi	cbz	x0, 1f
1571cafb08dSBipin Ravi
1581cafb08dSBipin Ravi	/* Apply instruction patching sequence */
1591cafb08dSBipin Ravi	ldr	x0,=0x3
1601cafb08dSBipin Ravi	msr	S3_6_c15_c8_0,x0
1611cafb08dSBipin Ravi	ldr	x0,=0xF3A08002
1621cafb08dSBipin Ravi	msr	S3_6_c15_c8_2,x0
1631cafb08dSBipin Ravi	ldr	x0,=0xFFF0F7FE
1641cafb08dSBipin Ravi	msr	S3_6_c15_c8_3,x0
1651cafb08dSBipin Ravi	ldr	x0,=0x10002001003FF
1661cafb08dSBipin Ravi	msr	S3_6_c15_c8_1,x0
1671cafb08dSBipin Ravi	ldr	x0,=0x4
1681cafb08dSBipin Ravi	msr	S3_6_c15_c8_0,x0
1691cafb08dSBipin Ravi	ldr	x0,=0xBF200000
1701cafb08dSBipin Ravi	msr	S3_6_c15_c8_2,x0
1711cafb08dSBipin Ravi	ldr	x0,=0xFFEF0000
1721cafb08dSBipin Ravi	msr	S3_6_c15_c8_3,x0
1731cafb08dSBipin Ravi	ldr	x0,=0x10002001003F3
1741cafb08dSBipin Ravi	msr	S3_6_c15_c8_1,x0
1751cafb08dSBipin Ravi	isb
1761cafb08dSBipin Ravi1:
1771cafb08dSBipin Ravi	ret	x17
1781cafb08dSBipin Raviendfunc errata_n2_2138956_wa
1791cafb08dSBipin Ravi
1801cafb08dSBipin Ravifunc check_errata_2138956
1811cafb08dSBipin Ravi	/* Applies to r0p0 */
1821cafb08dSBipin Ravi	mov	x1, #0x00
1831cafb08dSBipin Ravi	b	cpu_rev_var_ls
1841cafb08dSBipin Raviendfunc check_errata_2138956
1851cafb08dSBipin Ravi
186ef8f0c52Snayanpatel-arm/* --------------------------------------------------
1875819e23bSnayanpatel-arm * Errata Workaround for Neoverse N2 Erratum 2242415.
1885819e23bSnayanpatel-arm * This applies to revision r0p0 of Neoverse N2. it is still open.
1895819e23bSnayanpatel-arm * Inputs:
1905819e23bSnayanpatel-arm * x0: variant[4:7] and revision[0:3] of current cpu.
1915819e23bSnayanpatel-arm * Shall clobber: x0-x1, x17
1925819e23bSnayanpatel-arm * --------------------------------------------------
1935819e23bSnayanpatel-arm */
1945819e23bSnayanpatel-armfunc errata_n2_2242415_wa
1955819e23bSnayanpatel-arm	/* Check revision. */
1965819e23bSnayanpatel-arm	mov	x17, x30
1975819e23bSnayanpatel-arm	bl	check_errata_2242415
1985819e23bSnayanpatel-arm	cbz	x0, 1f
1995819e23bSnayanpatel-arm
2005819e23bSnayanpatel-arm	/* Apply instruction patching sequence */
2015819e23bSnayanpatel-arm	mrs	x1, NEOVERSE_N2_CPUACTLR_EL1
2025819e23bSnayanpatel-arm	orr	x1, x1, NEOVERSE_N2_CPUACTLR_EL1_BIT_22
2035819e23bSnayanpatel-arm	msr	NEOVERSE_N2_CPUACTLR_EL1, x1
2045819e23bSnayanpatel-arm1:
2055819e23bSnayanpatel-arm	ret	x17
2065819e23bSnayanpatel-armendfunc errata_n2_2242415_wa
2075819e23bSnayanpatel-arm
2085819e23bSnayanpatel-armfunc check_errata_2242415
2095819e23bSnayanpatel-arm	/* Applies to r0p0 */
2105819e23bSnayanpatel-arm	mov	x1, #0x00
2115819e23bSnayanpatel-arm	b	cpu_rev_var_ls
2125819e23bSnayanpatel-armendfunc check_errata_2242415
2135819e23bSnayanpatel-arm
2145819e23bSnayanpatel-arm/* --------------------------------------------------
215ef8f0c52Snayanpatel-arm * Errata Workaround for Neoverse N2 Erratum 2138953.
216ef8f0c52Snayanpatel-arm * This applies to revision r0p0 of Neoverse N2. it is still open.
217ef8f0c52Snayanpatel-arm * Inputs:
218ef8f0c52Snayanpatel-arm * x0: variant[4:7] and revision[0:3] of current cpu.
219ef8f0c52Snayanpatel-arm * Shall clobber: x0-x1, x17
220ef8f0c52Snayanpatel-arm * --------------------------------------------------
221ef8f0c52Snayanpatel-arm */
222ef8f0c52Snayanpatel-armfunc errata_n2_2138953_wa
223ef8f0c52Snayanpatel-arm	/* Check revision. */
224ef8f0c52Snayanpatel-arm	mov	x17, x30
225ef8f0c52Snayanpatel-arm	bl	check_errata_2138953
226ef8f0c52Snayanpatel-arm	cbz	x0, 1f
227ef8f0c52Snayanpatel-arm
228ef8f0c52Snayanpatel-arm	/* Apply instruction patching sequence */
229ef8f0c52Snayanpatel-arm	mrs	x1, NEOVERSE_N2_CPUECTLR2_EL1
230ef8f0c52Snayanpatel-arm	mov	x0, #NEOVERSE_N2_CPUECTLR2_EL1_PF_MODE_CNSRV
231ef8f0c52Snayanpatel-arm	bfi	x1, x0, #CPUECTLR2_EL1_PF_MODE_LSB, #CPUECTLR2_EL1_PF_MODE_WIDTH
232ef8f0c52Snayanpatel-arm	msr	NEOVERSE_N2_CPUECTLR2_EL1, x1
233ef8f0c52Snayanpatel-arm1:
234ef8f0c52Snayanpatel-arm	ret	x17
235ef8f0c52Snayanpatel-armendfunc errata_n2_2138953_wa
236ef8f0c52Snayanpatel-arm
237ef8f0c52Snayanpatel-armfunc check_errata_2138953
238ef8f0c52Snayanpatel-arm	/* Applies to r0p0 */
239ef8f0c52Snayanpatel-arm	mov	x1, #0x00
240ef8f0c52Snayanpatel-arm	b	cpu_rev_var_ls
241ef8f0c52Snayanpatel-armendfunc check_errata_2138953
242ef8f0c52Snayanpatel-arm
243c948185cSnayanpatel-arm/* --------------------------------------------------
244c948185cSnayanpatel-arm * Errata Workaround for Neoverse N2 Erratum 2138958.
245c948185cSnayanpatel-arm * This applies to revision r0p0 of Neoverse N2. it is still open.
246c948185cSnayanpatel-arm * Inputs:
247c948185cSnayanpatel-arm * x0: variant[4:7] and revision[0:3] of current cpu.
248c948185cSnayanpatel-arm * Shall clobber: x0-x1, x17
249c948185cSnayanpatel-arm * --------------------------------------------------
250c948185cSnayanpatel-arm */
251c948185cSnayanpatel-armfunc errata_n2_2138958_wa
252c948185cSnayanpatel-arm	/* Check revision. */
253c948185cSnayanpatel-arm	mov	x17, x30
254c948185cSnayanpatel-arm	bl	check_errata_2138958
255c948185cSnayanpatel-arm	cbz	x0, 1f
256c948185cSnayanpatel-arm
257c948185cSnayanpatel-arm	/* Apply instruction patching sequence */
258c948185cSnayanpatel-arm	mrs	x1, NEOVERSE_N2_CPUACTLR5_EL1
259c948185cSnayanpatel-arm	orr	x1, x1, NEOVERSE_N2_CPUACTLR5_EL1_BIT_13
260c948185cSnayanpatel-arm	msr	NEOVERSE_N2_CPUACTLR5_EL1, x1
261c948185cSnayanpatel-arm1:
262c948185cSnayanpatel-arm	ret	x17
263c948185cSnayanpatel-armendfunc errata_n2_2138958_wa
264c948185cSnayanpatel-arm
265c948185cSnayanpatel-armfunc check_errata_2138958
266c948185cSnayanpatel-arm	/* Applies to r0p0 */
267c948185cSnayanpatel-arm	mov	x1, #0x00
268c948185cSnayanpatel-arm	b	cpu_rev_var_ls
269c948185cSnayanpatel-armendfunc check_errata_2138958
270c948185cSnayanpatel-arm
271603806d1Snayanpatel-arm/* --------------------------------------------------
272603806d1Snayanpatel-arm * Errata Workaround for Neoverse N2 Erratum 2242400.
273603806d1Snayanpatel-arm * This applies to revision r0p0 of Neoverse N2. it is still open.
274603806d1Snayanpatel-arm * Inputs:
275603806d1Snayanpatel-arm * x0: variant[4:7] and revision[0:3] of current cpu.
276603806d1Snayanpatel-arm * Shall clobber: x0-x1, x17
277603806d1Snayanpatel-arm * --------------------------------------------------
278603806d1Snayanpatel-arm */
279603806d1Snayanpatel-armfunc errata_n2_2242400_wa
280603806d1Snayanpatel-arm	/* Check revision. */
281603806d1Snayanpatel-arm	mov	x17, x30
282603806d1Snayanpatel-arm	bl	check_errata_2242400
283603806d1Snayanpatel-arm	cbz	x0, 1f
284603806d1Snayanpatel-arm
285603806d1Snayanpatel-arm	/* Apply instruction patching sequence */
286603806d1Snayanpatel-arm	mrs	x1, NEOVERSE_N2_CPUACTLR5_EL1
287603806d1Snayanpatel-arm	orr	x1, x1, NEOVERSE_N2_CPUACTLR5_EL1_BIT_17
288603806d1Snayanpatel-arm	msr	NEOVERSE_N2_CPUACTLR5_EL1, x1
289603806d1Snayanpatel-arm	ldr	x0, =0x2
290603806d1Snayanpatel-arm	msr	S3_6_c15_c8_0, x0
291603806d1Snayanpatel-arm	ldr	x0, =0x10F600E000
292603806d1Snayanpatel-arm	msr	S3_6_c15_c8_2, x0
293603806d1Snayanpatel-arm	ldr	x0, =0x10FF80E000
294603806d1Snayanpatel-arm	msr	S3_6_c15_c8_3, x0
295603806d1Snayanpatel-arm	ldr	x0, =0x80000000003FF
296603806d1Snayanpatel-arm	msr	S3_6_c15_c8_1, x0
297603806d1Snayanpatel-arm	isb
298603806d1Snayanpatel-arm1:
299603806d1Snayanpatel-arm	ret	x17
300603806d1Snayanpatel-armendfunc errata_n2_2242400_wa
301603806d1Snayanpatel-arm
302603806d1Snayanpatel-armfunc check_errata_2242400
303603806d1Snayanpatel-arm	/* Applies to r0p0 */
304603806d1Snayanpatel-arm	mov	x1, #0x00
305603806d1Snayanpatel-arm	b	cpu_rev_var_ls
306603806d1Snayanpatel-armendfunc check_errata_2242400
307603806d1Snayanpatel-arm
308*0d2d9992Snayanpatel-arm/* --------------------------------------------------
309*0d2d9992Snayanpatel-arm * Errata Workaround for Neoverse N2 Erratum 2280757.
310*0d2d9992Snayanpatel-arm * This applies to revision r0p0 of Neoverse N2. it is still open.
311*0d2d9992Snayanpatel-arm * Inputs:
312*0d2d9992Snayanpatel-arm * x0: variant[4:7] and revision[0:3] of current cpu.
313*0d2d9992Snayanpatel-arm * Shall clobber: x0-x1, x17
314*0d2d9992Snayanpatel-arm * --------------------------------------------------
315*0d2d9992Snayanpatel-arm */
316*0d2d9992Snayanpatel-armfunc errata_n2_2280757_wa
317*0d2d9992Snayanpatel-arm	/* Check revision. */
318*0d2d9992Snayanpatel-arm	mov	x17, x30
319*0d2d9992Snayanpatel-arm	bl	check_errata_2280757
320*0d2d9992Snayanpatel-arm	cbz	x0, 1f
321*0d2d9992Snayanpatel-arm
322*0d2d9992Snayanpatel-arm	/* Apply instruction patching sequence */
323*0d2d9992Snayanpatel-arm	mrs	x1, NEOVERSE_N2_CPUACTLR_EL1
324*0d2d9992Snayanpatel-arm	orr	x1, x1, NEOVERSE_N2_CPUACTLR_EL1_BIT_22
325*0d2d9992Snayanpatel-arm	msr	NEOVERSE_N2_CPUACTLR_EL1, x1
326*0d2d9992Snayanpatel-arm1:
327*0d2d9992Snayanpatel-arm	ret	x17
328*0d2d9992Snayanpatel-armendfunc errata_n2_2280757_wa
329*0d2d9992Snayanpatel-arm
330*0d2d9992Snayanpatel-armfunc check_errata_2280757
331*0d2d9992Snayanpatel-arm	/* Applies to r0p0 */
332*0d2d9992Snayanpatel-arm	mov	x1, #0x00
333*0d2d9992Snayanpatel-arm	b	cpu_rev_var_ls
334*0d2d9992Snayanpatel-armendfunc check_errata_2280757
335*0d2d9992Snayanpatel-arm
3364618b2bfSBipin Ravi	/* -------------------------------------------
33725bbbd2dSJavier Almansa Sobrino	 * The CPU Ops reset function for Neoverse N2.
3384618b2bfSBipin Ravi	 * -------------------------------------------
33925bbbd2dSJavier Almansa Sobrino	 */
34025bbbd2dSJavier Almansa Sobrinofunc neoverse_n2_reset_func
3419380f754Snayanpatel-arm	mov	x19, x30
3429380f754Snayanpatel-arm
34325bbbd2dSJavier Almansa Sobrino	/* Check if the PE implements SSBS */
34425bbbd2dSJavier Almansa Sobrino	mrs	x0, id_aa64pfr1_el1
34525bbbd2dSJavier Almansa Sobrino	tst	x0, #(ID_AA64PFR1_EL1_SSBS_MASK << ID_AA64PFR1_EL1_SSBS_SHIFT)
34625bbbd2dSJavier Almansa Sobrino	b.eq	1f
34725bbbd2dSJavier Almansa Sobrino
34825bbbd2dSJavier Almansa Sobrino	/* Disable speculative loads */
34925bbbd2dSJavier Almansa Sobrino	msr	SSBS, xzr
35025bbbd2dSJavier Almansa Sobrino1:
35125bbbd2dSJavier Almansa Sobrino	/* Force all cacheable atomic instructions to be near */
35225bbbd2dSJavier Almansa Sobrino	mrs	x0, NEOVERSE_N2_CPUACTLR2_EL1
35325bbbd2dSJavier Almansa Sobrino	orr	x0, x0, #NEOVERSE_N2_CPUACTLR2_EL1_BIT_2
35425bbbd2dSJavier Almansa Sobrino	msr	NEOVERSE_N2_CPUACTLR2_EL1, x0
35525bbbd2dSJavier Almansa Sobrino
35665e04f27SBipin Ravi#if ERRATA_N2_2067956
35765e04f27SBipin Ravi	mov	x0, x18
35865e04f27SBipin Ravi	bl	errata_n2_2067956_wa
35965e04f27SBipin Ravi#endif
36065e04f27SBipin Ravi
3614618b2bfSBipin Ravi#if ERRATA_N2_2025414
3624618b2bfSBipin Ravi	mov	x0, x18
3634618b2bfSBipin Ravi	bl	errata_n2_2025414_wa
3644618b2bfSBipin Ravi#endif
3654618b2bfSBipin Ravi
3667cfae932SBipin Ravi#if ERRATA_N2_2189731
3677cfae932SBipin Ravi	mov	x0, x18
3687cfae932SBipin Ravi	bl	errata_n2_2189731_wa
3697cfae932SBipin Ravi#endif
3707cfae932SBipin Ravi
3711cafb08dSBipin Ravi
3721cafb08dSBipin Ravi#if ERRATA_N2_2138956
3731cafb08dSBipin Ravi	mov	x0, x18
3741cafb08dSBipin Ravi	bl	errata_n2_2138956_wa
3751cafb08dSBipin Ravi#endif
3761cafb08dSBipin Ravi
377ef8f0c52Snayanpatel-arm#if ERRATA_N2_2138953
378ef8f0c52Snayanpatel-arm	mov	x0, x18
379ef8f0c52Snayanpatel-arm	bl	errata_n2_2138953_wa
380ef8f0c52Snayanpatel-arm#endif
381ef8f0c52Snayanpatel-arm
3825819e23bSnayanpatel-arm#if ERRATA_N2_2242415
3835819e23bSnayanpatel-arm	mov	x0, x18
3845819e23bSnayanpatel-arm	bl	errata_n2_2242415_wa
3855819e23bSnayanpatel-arm#endif
3865819e23bSnayanpatel-arm
387c948185cSnayanpatel-arm#if ERRATA_N2_2138958
388c948185cSnayanpatel-arm	mov	x0, x18
389c948185cSnayanpatel-arm	bl	errata_n2_2138958_wa
390c948185cSnayanpatel-arm#endif
391c948185cSnayanpatel-arm
392603806d1Snayanpatel-arm#if ERRATA_N2_2242400
393603806d1Snayanpatel-arm	mov	x0, x18
394603806d1Snayanpatel-arm	bl	errata_n2_2242400_wa
395603806d1Snayanpatel-arm#endif
396603806d1Snayanpatel-arm
397*0d2d9992Snayanpatel-arm#if ERRATA_N2_2280757
398*0d2d9992Snayanpatel-arm	mov	x0, x18
399*0d2d9992Snayanpatel-arm	bl	errata_n2_2280757_wa
400*0d2d9992Snayanpatel-arm#endif
401*0d2d9992Snayanpatel-arm
40225bbbd2dSJavier Almansa Sobrino#if ENABLE_AMU
40325bbbd2dSJavier Almansa Sobrino	/* Make sure accesses from EL0/EL1 and EL2 are not trapped to EL3 */
40425bbbd2dSJavier Almansa Sobrino	mrs	x0, cptr_el3
40525bbbd2dSJavier Almansa Sobrino	orr	x0, x0, #TAM_BIT
40625bbbd2dSJavier Almansa Sobrino	msr	cptr_el3, x0
40725bbbd2dSJavier Almansa Sobrino
40825bbbd2dSJavier Almansa Sobrino	/* Make sure accesses from EL0/EL1 are not trapped to EL2 */
40925bbbd2dSJavier Almansa Sobrino	mrs	x0, cptr_el2
41025bbbd2dSJavier Almansa Sobrino	orr	x0, x0, #TAM_BIT
41125bbbd2dSJavier Almansa Sobrino	msr	cptr_el2, x0
41225bbbd2dSJavier Almansa Sobrino
41325bbbd2dSJavier Almansa Sobrino	/* No need to enable the counters as this would be done at el3 exit */
41425bbbd2dSJavier Almansa Sobrino#endif
41525bbbd2dSJavier Almansa Sobrino
41625bbbd2dSJavier Almansa Sobrino#if NEOVERSE_Nx_EXTERNAL_LLC
41725bbbd2dSJavier Almansa Sobrino	/* Some systems may have External LLC, core needs to be made aware */
41825bbbd2dSJavier Almansa Sobrino	mrs	x0, NEOVERSE_N2_CPUECTLR_EL1
41925bbbd2dSJavier Almansa Sobrino	orr	x0, x0, NEOVERSE_N2_CPUECTLR_EL1_EXTLLC_BIT
42025bbbd2dSJavier Almansa Sobrino	msr	NEOVERSE_N2_CPUECTLR_EL1, x0
42125bbbd2dSJavier Almansa Sobrino#endif
42225bbbd2dSJavier Almansa Sobrino
4239380f754Snayanpatel-arm	bl	cpu_get_rev_var
4249380f754Snayanpatel-arm	mov	x18, x0
4259380f754Snayanpatel-arm
4269380f754Snayanpatel-arm#if ERRATA_N2_2002655
4279380f754Snayanpatel-arm	mov	x0, x18
4289380f754Snayanpatel-arm	bl	errata_n2_2002655_wa
4299380f754Snayanpatel-arm#endif
4309380f754Snayanpatel-arm
43125bbbd2dSJavier Almansa Sobrino	isb
4329380f754Snayanpatel-arm	ret	x19
43325bbbd2dSJavier Almansa Sobrinoendfunc neoverse_n2_reset_func
43425bbbd2dSJavier Almansa Sobrino
43525bbbd2dSJavier Almansa Sobrinofunc neoverse_n2_core_pwr_dwn
4364618b2bfSBipin Ravi	/* ---------------------------------------------------
43725bbbd2dSJavier Almansa Sobrino	 * Enable CPU power down bit in power control register
43825bbbd2dSJavier Almansa Sobrino	 * No need to do cache maintenance here.
4394618b2bfSBipin Ravi	 * ---------------------------------------------------
44025bbbd2dSJavier Almansa Sobrino	 */
44125bbbd2dSJavier Almansa Sobrino	mrs	x0, NEOVERSE_N2_CPUPWRCTLR_EL1
44225bbbd2dSJavier Almansa Sobrino	orr	x0, x0, #NEOVERSE_N2_CORE_PWRDN_EN_BIT
44325bbbd2dSJavier Almansa Sobrino	msr	NEOVERSE_N2_CPUPWRCTLR_EL1, x0
44425bbbd2dSJavier Almansa Sobrino	isb
44525bbbd2dSJavier Almansa Sobrino	ret
44625bbbd2dSJavier Almansa Sobrinoendfunc neoverse_n2_core_pwr_dwn
44725bbbd2dSJavier Almansa Sobrino
44825bbbd2dSJavier Almansa Sobrino#if REPORT_ERRATA
44925bbbd2dSJavier Almansa Sobrino/*
45025bbbd2dSJavier Almansa Sobrino * Errata printing function for Neoverse N2 cores. Must follow AAPCS.
45125bbbd2dSJavier Almansa Sobrino */
45225bbbd2dSJavier Almansa Sobrinofunc neoverse_n2_errata_report
4539380f754Snayanpatel-arm	stp	x8, x30, [sp, #-16]!
4549380f754Snayanpatel-arm
4559380f754Snayanpatel-arm	bl	cpu_get_rev_var
4569380f754Snayanpatel-arm	mov	x8, x0
4579380f754Snayanpatel-arm
4589380f754Snayanpatel-arm	/*
4599380f754Snayanpatel-arm	 * Report all errata. The revision-variant information is passed to
4609380f754Snayanpatel-arm	 * checking functions of each errata.
4619380f754Snayanpatel-arm	 */
4629380f754Snayanpatel-arm	report_errata ERRATA_N2_2002655, neoverse_n2, 2002655
46365e04f27SBipin Ravi	report_errata ERRATA_N2_2067956, neoverse_n2, 2067956
4644618b2bfSBipin Ravi	report_errata ERRATA_N2_2025414, neoverse_n2, 2025414
4657cfae932SBipin Ravi	report_errata ERRATA_N2_2189731, neoverse_n2, 2189731
4661cafb08dSBipin Ravi	report_errata ERRATA_N2_2138956, neoverse_n2, 2138956
467ef8f0c52Snayanpatel-arm	report_errata ERRATA_N2_2138953, neoverse_n2, 2138953
4685819e23bSnayanpatel-arm	report_errata ERRATA_N2_2242415, neoverse_n2, 2242415
469c948185cSnayanpatel-arm	report_errata ERRATA_N2_2138958, neoverse_n2, 2138958
470603806d1Snayanpatel-arm	report_errata ERRATA_N2_2242400, neoverse_n2, 2242400
471*0d2d9992Snayanpatel-arm	report_errata ERRATA_N2_2280757, neoverse_n2, 2280757
4729380f754Snayanpatel-arm
4739380f754Snayanpatel-arm	ldp	x8, x30, [sp], #16
47425bbbd2dSJavier Almansa Sobrino	ret
47525bbbd2dSJavier Almansa Sobrinoendfunc neoverse_n2_errata_report
47625bbbd2dSJavier Almansa Sobrino#endif
47725bbbd2dSJavier Almansa Sobrino
47825bbbd2dSJavier Almansa Sobrino	/* ---------------------------------------------
47925bbbd2dSJavier Almansa Sobrino	 * This function provides Neoverse N2 specific
48025bbbd2dSJavier Almansa Sobrino	 * register information for crash reporting.
48125bbbd2dSJavier Almansa Sobrino	 * It needs to return with x6 pointing to
48225bbbd2dSJavier Almansa Sobrino	 * a list of register names in ASCII and
48325bbbd2dSJavier Almansa Sobrino	 * x8 - x15 having values of registers to be
48425bbbd2dSJavier Almansa Sobrino	 * reported.
48525bbbd2dSJavier Almansa Sobrino	 * ---------------------------------------------
48625bbbd2dSJavier Almansa Sobrino	 */
48725bbbd2dSJavier Almansa Sobrino.section .rodata.neoverse_n2_regs, "aS"
48825bbbd2dSJavier Almansa Sobrinoneoverse_n2_regs:  /* The ASCII list of register names to be reported */
48925bbbd2dSJavier Almansa Sobrino	.asciz	"cpupwrctlr_el1", ""
49025bbbd2dSJavier Almansa Sobrino
49125bbbd2dSJavier Almansa Sobrinofunc neoverse_n2_cpu_reg_dump
49225bbbd2dSJavier Almansa Sobrino	adr	x6, neoverse_n2_regs
49325bbbd2dSJavier Almansa Sobrino	mrs	x8, NEOVERSE_N2_CPUPWRCTLR_EL1
49425bbbd2dSJavier Almansa Sobrino	ret
49525bbbd2dSJavier Almansa Sobrinoendfunc neoverse_n2_cpu_reg_dump
49625bbbd2dSJavier Almansa Sobrino
49725bbbd2dSJavier Almansa Sobrinodeclare_cpu_ops neoverse_n2, NEOVERSE_N2_MIDR, \
49825bbbd2dSJavier Almansa Sobrino	neoverse_n2_reset_func, \
49925bbbd2dSJavier Almansa Sobrino	neoverse_n2_core_pwr_dwn
500