125bbbd2dSJavier Almansa Sobrino/* 2*a438f434SArvind Ram Prakash * Copyright (c) 2020-2023, 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/* --------------------------------------------------------------- 704618b2bfSBipin Ravi * Errata Workaround for Neoverse N2 Erratum 2025414. 714618b2bfSBipin Ravi * This applies to revision r0p0 of Neoverse N2 and is still open. 724618b2bfSBipin Ravi * Inputs: 734618b2bfSBipin Ravi * x0: variant[4:7] and revision[0:3] of current cpu. 744618b2bfSBipin Ravi * Shall clobber: x0-x17 754618b2bfSBipin Ravi * --------------------------------------------------------------- 764618b2bfSBipin Ravi */ 774618b2bfSBipin Ravifunc errata_n2_2025414_wa 784618b2bfSBipin Ravi /* Compare x0 against revision r0p0 */ 794618b2bfSBipin Ravi mov x17, x30 804618b2bfSBipin Ravi bl check_errata_2025414 814618b2bfSBipin Ravi cbz x0, 1f 824618b2bfSBipin Ravi mrs x1, NEOVERSE_N2_CPUECTLR_EL1 834618b2bfSBipin Ravi orr x1, x1, NEOVERSE_N2_CPUECTLR_EL1_PFSTIDIS_BIT 844618b2bfSBipin Ravi msr NEOVERSE_N2_CPUECTLR_EL1, x1 854618b2bfSBipin Ravi 864618b2bfSBipin Ravi1: 874618b2bfSBipin Ravi ret x17 884618b2bfSBipin Raviendfunc errata_n2_2025414_wa 894618b2bfSBipin Ravi 904618b2bfSBipin Ravifunc check_errata_2025414 914618b2bfSBipin Ravi /* Applies to r0p0 */ 924618b2bfSBipin Ravi mov x1, #0x00 934618b2bfSBipin Ravi b cpu_rev_var_ls 944618b2bfSBipin Raviendfunc check_errata_2025414 954618b2bfSBipin Ravi 967cfae932SBipin Ravi/* --------------------------------------------------------------- 97*a438f434SArvind Ram Prakash * Errata Workaround for Neoverse N2 Erratum 2067956. 987cfae932SBipin Ravi * This applies to revision r0p0 of Neoverse N2 and is still open. 997cfae932SBipin Ravi * Inputs: 1007cfae932SBipin Ravi * x0: variant[4:7] and revision[0:3] of current cpu. 1017cfae932SBipin Ravi * Shall clobber: x0-x17 1027cfae932SBipin Ravi * --------------------------------------------------------------- 1037cfae932SBipin Ravi */ 104*a438f434SArvind Ram Prakashfunc errata_n2_2067956_wa 1057cfae932SBipin Ravi /* Compare x0 against revision r0p0 */ 1067cfae932SBipin Ravi mov x17, x30 107*a438f434SArvind Ram Prakash bl check_errata_2067956 1087cfae932SBipin Ravi cbz x0, 1f 109*a438f434SArvind Ram Prakash mrs x1, NEOVERSE_N2_CPUACTLR_EL1 110*a438f434SArvind Ram Prakash orr x1, x1, NEOVERSE_N2_CPUACTLR_EL1_BIT_46 111*a438f434SArvind Ram Prakash msr NEOVERSE_N2_CPUACTLR_EL1, x1 1127cfae932SBipin Ravi1: 1137cfae932SBipin Ravi ret x17 114*a438f434SArvind Ram Prakashendfunc errata_n2_2067956_wa 1157cfae932SBipin Ravi 116*a438f434SArvind Ram Prakashfunc check_errata_2067956 1177cfae932SBipin Ravi /* Applies to r0p0 */ 1187cfae932SBipin Ravi mov x1, #0x00 1197cfae932SBipin Ravi b cpu_rev_var_ls 120*a438f434SArvind Ram Prakashendfunc check_errata_2067956 121*a438f434SArvind Ram Prakash 122*a438f434SArvind Ram Prakash/* -------------------------------------------------- 123*a438f434SArvind Ram Prakash * Errata Workaround for Neoverse N2 Erratum 2138953. 124*a438f434SArvind Ram Prakash * This applies to revision r0p0 of Neoverse N2. it is still open. 125*a438f434SArvind Ram Prakash * Inputs: 126*a438f434SArvind Ram Prakash * x0: variant[4:7] and revision[0:3] of current cpu. 127*a438f434SArvind Ram Prakash * Shall clobber: x0-x1, x17 128*a438f434SArvind Ram Prakash * -------------------------------------------------- 129*a438f434SArvind Ram Prakash */ 130*a438f434SArvind Ram Prakashfunc errata_n2_2138953_wa 131*a438f434SArvind Ram Prakash /* Check revision. */ 132*a438f434SArvind Ram Prakash mov x17, x30 133*a438f434SArvind Ram Prakash bl check_errata_2138953 134*a438f434SArvind Ram Prakash cbz x0, 1f 135*a438f434SArvind Ram Prakash 136*a438f434SArvind Ram Prakash /* Apply instruction patching sequence */ 137*a438f434SArvind Ram Prakash mrs x1, NEOVERSE_N2_CPUECTLR2_EL1 138*a438f434SArvind Ram Prakash mov x0, #NEOVERSE_N2_CPUECTLR2_EL1_PF_MODE_CNSRV 139*a438f434SArvind Ram Prakash bfi x1, x0, #CPUECTLR2_EL1_PF_MODE_LSB, #CPUECTLR2_EL1_PF_MODE_WIDTH 140*a438f434SArvind Ram Prakash msr NEOVERSE_N2_CPUECTLR2_EL1, x1 141*a438f434SArvind Ram Prakash1: 142*a438f434SArvind Ram Prakash ret x17 143*a438f434SArvind Ram Prakashendfunc errata_n2_2138953_wa 144*a438f434SArvind Ram Prakash 145*a438f434SArvind Ram Prakashfunc check_errata_2138953 146*a438f434SArvind Ram Prakash /* Applies to r0p0 */ 147*a438f434SArvind Ram Prakash mov x1, #0x00 148*a438f434SArvind Ram Prakash b cpu_rev_var_ls 149*a438f434SArvind Ram Prakashendfunc check_errata_2138953 1507cfae932SBipin Ravi 1511cafb08dSBipin Ravi/* -------------------------------------------------- 1521cafb08dSBipin Ravi * Errata Workaround for Neoverse N2 Erratum 2138956. 1531cafb08dSBipin Ravi * This applies to revision r0p0 of Neoverse N2. it is still open. 1541cafb08dSBipin Ravi * Inputs: 1551cafb08dSBipin Ravi * x0: variant[4:7] and revision[0:3] of current cpu. 1561cafb08dSBipin Ravi * Shall clobber: x0-x17 1571cafb08dSBipin Ravi * -------------------------------------------------- 1581cafb08dSBipin Ravi */ 1591cafb08dSBipin Ravifunc errata_n2_2138956_wa 1601cafb08dSBipin Ravi /* Check revision. */ 1611cafb08dSBipin Ravi mov x17, x30 1621cafb08dSBipin Ravi bl check_errata_2138956 1631cafb08dSBipin Ravi cbz x0, 1f 1641cafb08dSBipin Ravi 1651cafb08dSBipin Ravi /* Apply instruction patching sequence */ 1661cafb08dSBipin Ravi ldr x0,=0x3 1671cafb08dSBipin Ravi msr S3_6_c15_c8_0,x0 1681cafb08dSBipin Ravi ldr x0,=0xF3A08002 1691cafb08dSBipin Ravi msr S3_6_c15_c8_2,x0 1701cafb08dSBipin Ravi ldr x0,=0xFFF0F7FE 1711cafb08dSBipin Ravi msr S3_6_c15_c8_3,x0 1721cafb08dSBipin Ravi ldr x0,=0x10002001003FF 1731cafb08dSBipin Ravi msr S3_6_c15_c8_1,x0 1741cafb08dSBipin Ravi ldr x0,=0x4 1751cafb08dSBipin Ravi msr S3_6_c15_c8_0,x0 1761cafb08dSBipin Ravi ldr x0,=0xBF200000 1771cafb08dSBipin Ravi msr S3_6_c15_c8_2,x0 1781cafb08dSBipin Ravi ldr x0,=0xFFEF0000 1791cafb08dSBipin Ravi msr S3_6_c15_c8_3,x0 1801cafb08dSBipin Ravi ldr x0,=0x10002001003F3 1811cafb08dSBipin Ravi msr S3_6_c15_c8_1,x0 1821cafb08dSBipin Ravi isb 1831cafb08dSBipin Ravi1: 1841cafb08dSBipin Ravi ret x17 1851cafb08dSBipin Raviendfunc errata_n2_2138956_wa 1861cafb08dSBipin Ravi 1871cafb08dSBipin Ravifunc check_errata_2138956 1881cafb08dSBipin Ravi /* Applies to r0p0 */ 1891cafb08dSBipin Ravi mov x1, #0x00 1901cafb08dSBipin Ravi b cpu_rev_var_ls 1911cafb08dSBipin Raviendfunc check_errata_2138956 1921cafb08dSBipin Ravi 193ef8f0c52Snayanpatel-arm/* -------------------------------------------------- 194c948185cSnayanpatel-arm * Errata Workaround for Neoverse N2 Erratum 2138958. 195c948185cSnayanpatel-arm * This applies to revision r0p0 of Neoverse N2. it is still open. 196c948185cSnayanpatel-arm * Inputs: 197c948185cSnayanpatel-arm * x0: variant[4:7] and revision[0:3] of current cpu. 198c948185cSnayanpatel-arm * Shall clobber: x0-x1, x17 199c948185cSnayanpatel-arm * -------------------------------------------------- 200c948185cSnayanpatel-arm */ 201c948185cSnayanpatel-armfunc errata_n2_2138958_wa 202c948185cSnayanpatel-arm /* Check revision. */ 203c948185cSnayanpatel-arm mov x17, x30 204c948185cSnayanpatel-arm bl check_errata_2138958 205c948185cSnayanpatel-arm cbz x0, 1f 206c948185cSnayanpatel-arm 207c948185cSnayanpatel-arm /* Apply instruction patching sequence */ 208c948185cSnayanpatel-arm mrs x1, NEOVERSE_N2_CPUACTLR5_EL1 209c948185cSnayanpatel-arm orr x1, x1, NEOVERSE_N2_CPUACTLR5_EL1_BIT_13 210c948185cSnayanpatel-arm msr NEOVERSE_N2_CPUACTLR5_EL1, x1 211c948185cSnayanpatel-arm1: 212c948185cSnayanpatel-arm ret x17 213c948185cSnayanpatel-armendfunc errata_n2_2138958_wa 214c948185cSnayanpatel-arm 215c948185cSnayanpatel-armfunc check_errata_2138958 216c948185cSnayanpatel-arm /* Applies to r0p0 */ 217c948185cSnayanpatel-arm mov x1, #0x00 218c948185cSnayanpatel-arm b cpu_rev_var_ls 219c948185cSnayanpatel-armendfunc check_errata_2138958 220c948185cSnayanpatel-arm 221*a438f434SArvind Ram Prakash/* --------------------------------------------------------------- 222*a438f434SArvind Ram Prakash * Errata Workaround for Neoverse N2 Erratum 2189731. 223*a438f434SArvind Ram Prakash * This applies to revision r0p0 of Neoverse N2 and is still open. 224*a438f434SArvind Ram Prakash * Inputs: 225*a438f434SArvind Ram Prakash * x0: variant[4:7] and revision[0:3] of current cpu. 226*a438f434SArvind Ram Prakash * Shall clobber: x0-x17 227*a438f434SArvind Ram Prakash * --------------------------------------------------------------- 228*a438f434SArvind Ram Prakash */ 229*a438f434SArvind Ram Prakashfunc errata_n2_2189731_wa 230*a438f434SArvind Ram Prakash /* Compare x0 against revision r0p0 */ 231*a438f434SArvind Ram Prakash mov x17, x30 232*a438f434SArvind Ram Prakash bl check_errata_2189731 233*a438f434SArvind Ram Prakash cbz x0, 1f 234*a438f434SArvind Ram Prakash mrs x1, NEOVERSE_N2_CPUACTLR5_EL1 235*a438f434SArvind Ram Prakash orr x1, x1, NEOVERSE_N2_CPUACTLR5_EL1_BIT_44 236*a438f434SArvind Ram Prakash msr NEOVERSE_N2_CPUACTLR5_EL1, x1 237*a438f434SArvind Ram Prakash 238*a438f434SArvind Ram Prakash1: 239*a438f434SArvind Ram Prakash ret x17 240*a438f434SArvind Ram Prakashendfunc errata_n2_2189731_wa 241*a438f434SArvind Ram Prakash 242*a438f434SArvind Ram Prakashfunc check_errata_2189731 243*a438f434SArvind Ram Prakash /* Applies to r0p0 */ 244*a438f434SArvind Ram Prakash mov x1, #0x00 245*a438f434SArvind Ram Prakash b cpu_rev_var_ls 246*a438f434SArvind Ram Prakashendfunc check_errata_2189731 247*a438f434SArvind Ram Prakash 248603806d1Snayanpatel-arm/* -------------------------------------------------- 249603806d1Snayanpatel-arm * Errata Workaround for Neoverse N2 Erratum 2242400. 250603806d1Snayanpatel-arm * This applies to revision r0p0 of Neoverse N2. it is still open. 251603806d1Snayanpatel-arm * Inputs: 252603806d1Snayanpatel-arm * x0: variant[4:7] and revision[0:3] of current cpu. 253603806d1Snayanpatel-arm * Shall clobber: x0-x1, x17 254603806d1Snayanpatel-arm * -------------------------------------------------- 255603806d1Snayanpatel-arm */ 256603806d1Snayanpatel-armfunc errata_n2_2242400_wa 257603806d1Snayanpatel-arm /* Check revision. */ 258603806d1Snayanpatel-arm mov x17, x30 259603806d1Snayanpatel-arm bl check_errata_2242400 260603806d1Snayanpatel-arm cbz x0, 1f 261603806d1Snayanpatel-arm 262603806d1Snayanpatel-arm /* Apply instruction patching sequence */ 263603806d1Snayanpatel-arm mrs x1, NEOVERSE_N2_CPUACTLR5_EL1 264603806d1Snayanpatel-arm orr x1, x1, NEOVERSE_N2_CPUACTLR5_EL1_BIT_17 265603806d1Snayanpatel-arm msr NEOVERSE_N2_CPUACTLR5_EL1, x1 266603806d1Snayanpatel-arm ldr x0, =0x2 267603806d1Snayanpatel-arm msr S3_6_c15_c8_0, x0 268603806d1Snayanpatel-arm ldr x0, =0x10F600E000 269603806d1Snayanpatel-arm msr S3_6_c15_c8_2, x0 270603806d1Snayanpatel-arm ldr x0, =0x10FF80E000 271603806d1Snayanpatel-arm msr S3_6_c15_c8_3, x0 272603806d1Snayanpatel-arm ldr x0, =0x80000000003FF 273603806d1Snayanpatel-arm msr S3_6_c15_c8_1, x0 274603806d1Snayanpatel-arm isb 275603806d1Snayanpatel-arm1: 276603806d1Snayanpatel-arm ret x17 277603806d1Snayanpatel-armendfunc errata_n2_2242400_wa 278603806d1Snayanpatel-arm 279603806d1Snayanpatel-armfunc check_errata_2242400 280603806d1Snayanpatel-arm /* Applies to r0p0 */ 281603806d1Snayanpatel-arm mov x1, #0x00 282603806d1Snayanpatel-arm b cpu_rev_var_ls 283603806d1Snayanpatel-armendfunc check_errata_2242400 284603806d1Snayanpatel-arm 2850d2d9992Snayanpatel-arm/* -------------------------------------------------- 286*a438f434SArvind Ram Prakash * Errata Workaround for Neoverse N2 Erratum 2242415. 287*a438f434SArvind Ram Prakash * This applies to revision r0p0 of Neoverse N2. it is still open. 288*a438f434SArvind Ram Prakash * Inputs: 289*a438f434SArvind Ram Prakash * x0: variant[4:7] and revision[0:3] of current cpu. 290*a438f434SArvind Ram Prakash * Shall clobber: x0-x1, x17 291*a438f434SArvind Ram Prakash * -------------------------------------------------- 292*a438f434SArvind Ram Prakash */ 293*a438f434SArvind Ram Prakashfunc errata_n2_2242415_wa 294*a438f434SArvind Ram Prakash /* Check revision. */ 295*a438f434SArvind Ram Prakash mov x17, x30 296*a438f434SArvind Ram Prakash bl check_errata_2242415 297*a438f434SArvind Ram Prakash cbz x0, 1f 298*a438f434SArvind Ram Prakash 299*a438f434SArvind Ram Prakash /* Apply instruction patching sequence */ 300*a438f434SArvind Ram Prakash mrs x1, NEOVERSE_N2_CPUACTLR_EL1 301*a438f434SArvind Ram Prakash orr x1, x1, NEOVERSE_N2_CPUACTLR_EL1_BIT_22 302*a438f434SArvind Ram Prakash msr NEOVERSE_N2_CPUACTLR_EL1, x1 303*a438f434SArvind Ram Prakash1: 304*a438f434SArvind Ram Prakash ret x17 305*a438f434SArvind Ram Prakashendfunc errata_n2_2242415_wa 306*a438f434SArvind Ram Prakash 307*a438f434SArvind Ram Prakashfunc check_errata_2242415 308*a438f434SArvind Ram Prakash /* Applies to r0p0 */ 309*a438f434SArvind Ram Prakash mov x1, #0x00 310*a438f434SArvind Ram Prakash b cpu_rev_var_ls 311*a438f434SArvind Ram Prakashendfunc check_errata_2242415 312*a438f434SArvind Ram Prakash 313*a438f434SArvind Ram Prakash/* -------------------------------------------------- 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 34143438ad1SBoyan Karatotev/* -------------------------------------------------- 34243438ad1SBoyan Karatotev * Errata Workaround for Neoverse N2 Erratum 2326639. 34343438ad1SBoyan Karatotev * This applies to revision r0p0 of Neoverse N2, 34443438ad1SBoyan Karatotev * fixed in r0p1. 34543438ad1SBoyan Karatotev * Inputs: 34643438ad1SBoyan Karatotev * x0: variant[4:7] and revision[0:3] of current cpu. 34743438ad1SBoyan Karatotev * Shall clobber: x0-x1, x17 34843438ad1SBoyan Karatotev * -------------------------------------------------- 34943438ad1SBoyan Karatotev */ 35043438ad1SBoyan Karatotevfunc errata_n2_2326639_wa 35143438ad1SBoyan Karatotev /* Check revision. */ 35243438ad1SBoyan Karatotev mov x17, x30 35343438ad1SBoyan Karatotev bl check_errata_2326639 35443438ad1SBoyan Karatotev cbz x0, 1f 35543438ad1SBoyan Karatotev 35643438ad1SBoyan Karatotev /* Set bit 36 in ACTLR2_EL1 */ 35743438ad1SBoyan Karatotev mrs x1, NEOVERSE_N2_CPUACTLR2_EL1 35843438ad1SBoyan Karatotev orr x1, x1, #NEOVERSE_N2_CPUACTLR2_EL1_BIT_36 35943438ad1SBoyan Karatotev msr NEOVERSE_N2_CPUACTLR2_EL1, x1 36043438ad1SBoyan Karatotev1: 36143438ad1SBoyan Karatotev ret x17 36243438ad1SBoyan Karatotevendfunc errata_n2_2326639_wa 36343438ad1SBoyan Karatotev 36443438ad1SBoyan Karatotevfunc check_errata_2326639 36543438ad1SBoyan Karatotev /* Applies to r0p0, fixed in r0p1 */ 36643438ad1SBoyan Karatotev mov x1, #0x00 36743438ad1SBoyan Karatotev b cpu_rev_var_ls 36843438ad1SBoyan Karatotevendfunc check_errata_2326639 369e6602d4bSAkram Ahmad 370e6602d4bSAkram Ahmad/* -------------------------------------------------- 371e6602d4bSAkram Ahmad * Errata Workaround for Neoverse N2 Erratum 2376738. 372e6602d4bSAkram Ahmad * This applies to revision r0p0 of Neoverse N2, 373e6602d4bSAkram Ahmad * fixed in r0p1. 374e6602d4bSAkram Ahmad * Inputs: 375e6602d4bSAkram Ahmad * x0: variant[4:7] and revision[0:3] of current CPU. 376e6602d4bSAkram Ahmad * Shall clobber: x0-x1, x17 377e6602d4bSAkram Ahmad * -------------------------------------------------- 378e6602d4bSAkram Ahmad */ 379e6602d4bSAkram Ahmadfunc errata_n2_2376738_wa 380e6602d4bSAkram Ahmad mov x17, x30 381e6602d4bSAkram Ahmad bl check_errata_2376738 382e6602d4bSAkram Ahmad cbz x0, 1f 383e6602d4bSAkram Ahmad 384e6602d4bSAkram Ahmad /* Set CPUACTLR2_EL1[0] to 1 to force PLDW/PFRM 385e6602d4bSAkram Ahmad * ST to behave like PLD/PFRM LD and not cause 386e6602d4bSAkram Ahmad * invalidations to other PE caches. 387e6602d4bSAkram Ahmad */ 388e6602d4bSAkram Ahmad mrs x1, NEOVERSE_N2_CPUACTLR2_EL1 389e6602d4bSAkram Ahmad orr x1, x1, NEOVERSE_N2_CPUACTLR2_EL1_BIT_0 390e6602d4bSAkram Ahmad msr NEOVERSE_N2_CPUACTLR2_EL1, x1 391e6602d4bSAkram Ahmad1: 392e6602d4bSAkram Ahmad ret x17 393e6602d4bSAkram Ahmadendfunc errata_n2_2376738_wa 394e6602d4bSAkram Ahmad 395e6602d4bSAkram Ahmadfunc check_errata_2376738 396e6602d4bSAkram Ahmad /* Applies to r0p0, fixed in r0p1 */ 397e6602d4bSAkram Ahmad mov x1, 0x00 398e6602d4bSAkram Ahmad b cpu_rev_var_ls 399e6602d4bSAkram Ahmadendfunc check_errata_2376738 400e6602d4bSAkram Ahmad 401884d5156SDaniel Boulby/* -------------------------------------------------- 402884d5156SDaniel Boulby * Errata Workaround for Neoverse N2 Erratum 2388450. 403884d5156SDaniel Boulby * This applies to revision r0p0 of Neoverse N2, 404884d5156SDaniel Boulby * fixed in r0p1. 405884d5156SDaniel Boulby * Inputs: 406884d5156SDaniel Boulby * x0: variant[4:7] and revision[0:3] of current cpu. 407884d5156SDaniel Boulby * Shall clobber: x0-x1, x17 408884d5156SDaniel Boulby * -------------------------------------------------- 409884d5156SDaniel Boulby */ 410884d5156SDaniel Boulbyfunc errata_n2_2388450_wa 411884d5156SDaniel Boulby /* Check revision. */ 412884d5156SDaniel Boulby mov x17, x30 413884d5156SDaniel Boulby bl check_errata_2388450 414884d5156SDaniel Boulby cbz x0, 1f 415884d5156SDaniel Boulby 416884d5156SDaniel Boulby /*Set bit 40 in ACTLR2_EL1 */ 417884d5156SDaniel Boulby mrs x1, NEOVERSE_N2_CPUACTLR2_EL1 418884d5156SDaniel Boulby orr x1, x1, #NEOVERSE_N2_CPUACTLR2_EL1_BIT_40 419884d5156SDaniel Boulby msr NEOVERSE_N2_CPUACTLR2_EL1, x1 420884d5156SDaniel Boulby isb 421884d5156SDaniel Boulby1: 422884d5156SDaniel Boulby ret x17 423884d5156SDaniel Boulbyendfunc errata_n2_2388450_wa 424884d5156SDaniel Boulby 425884d5156SDaniel Boulbyfunc check_errata_2388450 426884d5156SDaniel Boulby /* Applies to r0p0, fixed in r0p1 */ 427884d5156SDaniel Boulby mov x1, #0x00 428884d5156SDaniel Boulby b cpu_rev_var_ls 429884d5156SDaniel Boulbyendfunc check_errata_2388450 430884d5156SDaniel Boulby 4311ee7c823SBipin Ravi/* ------------------------------------------------------- 4321ee7c823SBipin Ravi * Errata Workaround for Neoverse N2 Erratum 2743089. 4331ee7c823SBipin Ravi * This applies to revisions <= r0p2 and is fixed in r0p3. 4341ee7c823SBipin Ravi * x0: variant[4:7] and revision[0:3] of current cpu. 4351ee7c823SBipin Ravi * Shall clobber: x0-x17 4361ee7c823SBipin Ravi * ------------------------------------------------------- 4371ee7c823SBipin Ravi */ 4381ee7c823SBipin Ravifunc errata_n2_2743089_wa 4391ee7c823SBipin Ravi mov x17, x30 4401ee7c823SBipin Ravi bl check_errata_2743089 4411ee7c823SBipin Ravi cbz x0, 1f 4421ee7c823SBipin Ravi 4431ee7c823SBipin Ravi /* dsb before isb of power down sequence */ 4441ee7c823SBipin Ravi dsb sy 4451ee7c823SBipin Ravi1: 4461ee7c823SBipin Ravi ret x17 4471ee7c823SBipin Raviendfunc errata_n2_2743089_wa 4481ee7c823SBipin Ravi 4491ee7c823SBipin Ravifunc check_errata_2743089 4501ee7c823SBipin Ravi /* Applies to all revisions <= r0p2 */ 4511ee7c823SBipin Ravi mov x1, #0x02 4521ee7c823SBipin Ravi b cpu_rev_var_ls 4531ee7c823SBipin Raviendfunc check_errata_2743089 4541ee7c823SBipin Ravi 4551fe4a9d1SBipin Ravifunc check_errata_cve_2022_23960 4561fe4a9d1SBipin Ravi#if WORKAROUND_CVE_2022_23960 4571fe4a9d1SBipin Ravi mov x0, #ERRATA_APPLIES 4581fe4a9d1SBipin Ravi#else 4591fe4a9d1SBipin Ravi mov x0, #ERRATA_MISSING 4601fe4a9d1SBipin Ravi#endif 4611fe4a9d1SBipin Ravi ret 4621fe4a9d1SBipin Raviendfunc check_errata_cve_2022_23960 4631fe4a9d1SBipin Ravi 4644618b2bfSBipin Ravi /* ------------------------------------------- 46525bbbd2dSJavier Almansa Sobrino * The CPU Ops reset function for Neoverse N2. 4664618b2bfSBipin Ravi * ------------------------------------------- 46725bbbd2dSJavier Almansa Sobrino */ 46825bbbd2dSJavier Almansa Sobrinofunc neoverse_n2_reset_func 4699380f754Snayanpatel-arm mov x19, x30 4709380f754Snayanpatel-arm 47125bbbd2dSJavier Almansa Sobrino /* Check if the PE implements SSBS */ 47225bbbd2dSJavier Almansa Sobrino mrs x0, id_aa64pfr1_el1 47325bbbd2dSJavier Almansa Sobrino tst x0, #(ID_AA64PFR1_EL1_SSBS_MASK << ID_AA64PFR1_EL1_SSBS_SHIFT) 47425bbbd2dSJavier Almansa Sobrino b.eq 1f 47525bbbd2dSJavier Almansa Sobrino 47625bbbd2dSJavier Almansa Sobrino /* Disable speculative loads */ 47725bbbd2dSJavier Almansa Sobrino msr SSBS, xzr 47825bbbd2dSJavier Almansa Sobrino1: 47925bbbd2dSJavier Almansa Sobrino /* Force all cacheable atomic instructions to be near */ 48025bbbd2dSJavier Almansa Sobrino mrs x0, NEOVERSE_N2_CPUACTLR2_EL1 48125bbbd2dSJavier Almansa Sobrino orr x0, x0, #NEOVERSE_N2_CPUACTLR2_EL1_BIT_2 48225bbbd2dSJavier Almansa Sobrino msr NEOVERSE_N2_CPUACTLR2_EL1, x0 48325bbbd2dSJavier Almansa Sobrino 48403ebf409SBipin Ravi /* Get the CPU revision and stash it in x18. */ 48503ebf409SBipin Ravi bl cpu_get_rev_var 48603ebf409SBipin Ravi mov x18, x0 48703ebf409SBipin Ravi 4887e3273e8SBipin Ravi#if ERRATA_DSU_2313941 4897e3273e8SBipin Ravi bl errata_dsu_2313941_wa 4907e3273e8SBipin Ravi#endif 4917e3273e8SBipin Ravi 49265e04f27SBipin Ravi#if ERRATA_N2_2067956 49365e04f27SBipin Ravi mov x0, x18 49465e04f27SBipin Ravi bl errata_n2_2067956_wa 49565e04f27SBipin Ravi#endif 49665e04f27SBipin Ravi 4974618b2bfSBipin Ravi#if ERRATA_N2_2025414 4984618b2bfSBipin Ravi mov x0, x18 4994618b2bfSBipin Ravi bl errata_n2_2025414_wa 5004618b2bfSBipin Ravi#endif 5014618b2bfSBipin Ravi 5027cfae932SBipin Ravi#if ERRATA_N2_2189731 5037cfae932SBipin Ravi mov x0, x18 5047cfae932SBipin Ravi bl errata_n2_2189731_wa 5057cfae932SBipin Ravi#endif 5067cfae932SBipin Ravi 5071cafb08dSBipin Ravi#if ERRATA_N2_2138956 5081cafb08dSBipin Ravi mov x0, x18 5091cafb08dSBipin Ravi bl errata_n2_2138956_wa 5101cafb08dSBipin Ravi#endif 5111cafb08dSBipin Ravi 512ef8f0c52Snayanpatel-arm#if ERRATA_N2_2138953 513ef8f0c52Snayanpatel-arm mov x0, x18 514ef8f0c52Snayanpatel-arm bl errata_n2_2138953_wa 515ef8f0c52Snayanpatel-arm#endif 516ef8f0c52Snayanpatel-arm 5175819e23bSnayanpatel-arm#if ERRATA_N2_2242415 5185819e23bSnayanpatel-arm mov x0, x18 5195819e23bSnayanpatel-arm bl errata_n2_2242415_wa 5205819e23bSnayanpatel-arm#endif 5215819e23bSnayanpatel-arm 522c948185cSnayanpatel-arm#if ERRATA_N2_2138958 523c948185cSnayanpatel-arm mov x0, x18 524c948185cSnayanpatel-arm bl errata_n2_2138958_wa 525c948185cSnayanpatel-arm#endif 526c948185cSnayanpatel-arm 527603806d1Snayanpatel-arm#if ERRATA_N2_2242400 528603806d1Snayanpatel-arm mov x0, x18 529603806d1Snayanpatel-arm bl errata_n2_2242400_wa 530603806d1Snayanpatel-arm#endif 531603806d1Snayanpatel-arm 5320d2d9992Snayanpatel-arm#if ERRATA_N2_2280757 5330d2d9992Snayanpatel-arm mov x0, x18 5340d2d9992Snayanpatel-arm bl errata_n2_2280757_wa 5350d2d9992Snayanpatel-arm#endif 5360d2d9992Snayanpatel-arm 537e6602d4bSAkram Ahmad#if ERRATA_N2_2376738 538e6602d4bSAkram Ahmad mov x0, x18 539e6602d4bSAkram Ahmad bl errata_n2_2376738_wa 540e6602d4bSAkram Ahmad#endif 541e6602d4bSAkram Ahmad 542884d5156SDaniel Boulby#if ERRATA_N2_2388450 543884d5156SDaniel Boulby mov x0, x18 544884d5156SDaniel Boulby bl errata_n2_2388450_wa 545884d5156SDaniel Boulby#endif 546884d5156SDaniel Boulby 547d23acc9eSAndre Przywara#if ENABLE_FEAT_AMU 54825bbbd2dSJavier Almansa Sobrino /* Make sure accesses from EL0/EL1 and EL2 are not trapped to EL3 */ 54925bbbd2dSJavier Almansa Sobrino mrs x0, cptr_el3 55025bbbd2dSJavier Almansa Sobrino orr x0, x0, #TAM_BIT 55125bbbd2dSJavier Almansa Sobrino msr cptr_el3, x0 55225bbbd2dSJavier Almansa Sobrino 55325bbbd2dSJavier Almansa Sobrino /* Make sure accesses from EL0/EL1 are not trapped to EL2 */ 55425bbbd2dSJavier Almansa Sobrino mrs x0, cptr_el2 55525bbbd2dSJavier Almansa Sobrino orr x0, x0, #TAM_BIT 55625bbbd2dSJavier Almansa Sobrino msr cptr_el2, x0 55725bbbd2dSJavier Almansa Sobrino 55825bbbd2dSJavier Almansa Sobrino /* No need to enable the counters as this would be done at el3 exit */ 55925bbbd2dSJavier Almansa Sobrino#endif 56025bbbd2dSJavier Almansa Sobrino 56125bbbd2dSJavier Almansa Sobrino#if NEOVERSE_Nx_EXTERNAL_LLC 56225bbbd2dSJavier Almansa Sobrino /* Some systems may have External LLC, core needs to be made aware */ 56325bbbd2dSJavier Almansa Sobrino mrs x0, NEOVERSE_N2_CPUECTLR_EL1 56425bbbd2dSJavier Almansa Sobrino orr x0, x0, NEOVERSE_N2_CPUECTLR_EL1_EXTLLC_BIT 56525bbbd2dSJavier Almansa Sobrino msr NEOVERSE_N2_CPUECTLR_EL1, x0 56625bbbd2dSJavier Almansa Sobrino#endif 56725bbbd2dSJavier Almansa Sobrino 5689380f754Snayanpatel-arm#if ERRATA_N2_2002655 5699380f754Snayanpatel-arm mov x0, x18 5709380f754Snayanpatel-arm bl errata_n2_2002655_wa 5719380f754Snayanpatel-arm#endif 5729380f754Snayanpatel-arm 5731fe4a9d1SBipin Ravi#if IMAGE_BL31 && WORKAROUND_CVE_2022_23960 5741fe4a9d1SBipin Ravi /* 5751fe4a9d1SBipin Ravi * The Neoverse-N2 generic vectors are overridden to apply errata 5761fe4a9d1SBipin Ravi * mitigation on exception entry from lower ELs. 5771fe4a9d1SBipin Ravi */ 5781fe4a9d1SBipin Ravi adr x0, wa_cve_vbar_neoverse_n2 5791fe4a9d1SBipin Ravi msr vbar_el3, x0 5801fe4a9d1SBipin Ravi#endif /* IMAGE_BL31 && WORKAROUND_CVE_2022_23960 */ 5811fe4a9d1SBipin Ravi 58225bbbd2dSJavier Almansa Sobrino isb 5839380f754Snayanpatel-arm ret x19 58425bbbd2dSJavier Almansa Sobrinoendfunc neoverse_n2_reset_func 58525bbbd2dSJavier Almansa Sobrino 58625bbbd2dSJavier Almansa Sobrinofunc neoverse_n2_core_pwr_dwn 58743438ad1SBoyan Karatotev#if ERRATA_N2_2326639 58843438ad1SBoyan Karatotev mov x15, x30 58943438ad1SBoyan Karatotev bl cpu_get_rev_var 59043438ad1SBoyan Karatotev bl errata_n2_2326639_wa 59143438ad1SBoyan Karatotev mov x30, x15 59243438ad1SBoyan Karatotev#endif /* ERRATA_N2_2326639 */ 59343438ad1SBoyan Karatotev 5944618b2bfSBipin Ravi /* --------------------------------------------------- 59525bbbd2dSJavier Almansa Sobrino * Enable CPU power down bit in power control register 59625bbbd2dSJavier Almansa Sobrino * No need to do cache maintenance here. 5974618b2bfSBipin Ravi * --------------------------------------------------- 59825bbbd2dSJavier Almansa Sobrino */ 59925bbbd2dSJavier Almansa Sobrino mrs x0, NEOVERSE_N2_CPUPWRCTLR_EL1 60025bbbd2dSJavier Almansa Sobrino orr x0, x0, #NEOVERSE_N2_CORE_PWRDN_EN_BIT 60125bbbd2dSJavier Almansa Sobrino msr NEOVERSE_N2_CPUPWRCTLR_EL1, x0 6021ee7c823SBipin Ravi#if ERRATA_N2_2743089 6031ee7c823SBipin Ravi mov x15, x30 6041ee7c823SBipin Ravi bl cpu_get_rev_var 6051ee7c823SBipin Ravi bl errata_n2_2743089_wa 6061ee7c823SBipin Ravi mov x30, x15 6071ee7c823SBipin Ravi#endif /* ERRATA_N2_2743089 */ 60825bbbd2dSJavier Almansa Sobrino isb 60925bbbd2dSJavier Almansa Sobrino ret 61025bbbd2dSJavier Almansa Sobrinoendfunc neoverse_n2_core_pwr_dwn 61125bbbd2dSJavier Almansa Sobrino 61225bbbd2dSJavier Almansa Sobrino#if REPORT_ERRATA 61325bbbd2dSJavier Almansa Sobrino/* 61425bbbd2dSJavier Almansa Sobrino * Errata printing function for Neoverse N2 cores. Must follow AAPCS. 61525bbbd2dSJavier Almansa Sobrino */ 61625bbbd2dSJavier Almansa Sobrinofunc neoverse_n2_errata_report 6179380f754Snayanpatel-arm stp x8, x30, [sp, #-16]! 6189380f754Snayanpatel-arm 6199380f754Snayanpatel-arm bl cpu_get_rev_var 6209380f754Snayanpatel-arm mov x8, x0 6219380f754Snayanpatel-arm 6229380f754Snayanpatel-arm /* 6239380f754Snayanpatel-arm * Report all errata. The revision-variant information is passed to 6249380f754Snayanpatel-arm * checking functions of each errata. 6259380f754Snayanpatel-arm */ 6269380f754Snayanpatel-arm report_errata ERRATA_N2_2002655, neoverse_n2, 2002655 627*a438f434SArvind Ram Prakash report_errata ERRATA_N2_2002655, neoverse_n2, 2025414 62865e04f27SBipin Ravi report_errata ERRATA_N2_2067956, neoverse_n2, 2067956 629ef8f0c52Snayanpatel-arm report_errata ERRATA_N2_2138953, neoverse_n2, 2138953 630*a438f434SArvind Ram Prakash report_errata ERRATA_N2_2138956, neoverse_n2, 2138956 631c948185cSnayanpatel-arm report_errata ERRATA_N2_2138958, neoverse_n2, 2138958 632*a438f434SArvind Ram Prakash report_errata ERRATA_N2_2189731, neoverse_n2, 2189731 633603806d1Snayanpatel-arm report_errata ERRATA_N2_2242400, neoverse_n2, 2242400 634*a438f434SArvind Ram Prakash report_errata ERRATA_N2_2242415, neoverse_n2, 2242415 6350d2d9992Snayanpatel-arm report_errata ERRATA_N2_2280757, neoverse_n2, 2280757 63643438ad1SBoyan Karatotev report_errata ERRATA_N2_2326639, neoverse_n2, 2326639 637e6602d4bSAkram Ahmad report_errata ERRATA_N2_2376738, neoverse_n2, 2376738 638884d5156SDaniel Boulby report_errata ERRATA_N2_2388450, neoverse_n2, 2388450 6391ee7c823SBipin Ravi report_errata ERRATA_N2_2743089, neoverse_n2, 2743089 6407e3273e8SBipin Ravi report_errata ERRATA_DSU_2313941, neoverse_n2, dsu_2313941 641*a438f434SArvind Ram Prakash report_errata WORKAROUND_CVE_2022_23960, neoverse_n2, cve_2022_23960 6429380f754Snayanpatel-arm 6439380f754Snayanpatel-arm ldp x8, x30, [sp], #16 64425bbbd2dSJavier Almansa Sobrino ret 64525bbbd2dSJavier Almansa Sobrinoendfunc neoverse_n2_errata_report 64625bbbd2dSJavier Almansa Sobrino#endif 64725bbbd2dSJavier Almansa Sobrino 64825bbbd2dSJavier Almansa Sobrino /* --------------------------------------------- 64925bbbd2dSJavier Almansa Sobrino * This function provides Neoverse N2 specific 65025bbbd2dSJavier Almansa Sobrino * register information for crash reporting. 65125bbbd2dSJavier Almansa Sobrino * It needs to return with x6 pointing to 65225bbbd2dSJavier Almansa Sobrino * a list of register names in ASCII and 65325bbbd2dSJavier Almansa Sobrino * x8 - x15 having values of registers to be 65425bbbd2dSJavier Almansa Sobrino * reported. 65525bbbd2dSJavier Almansa Sobrino * --------------------------------------------- 65625bbbd2dSJavier Almansa Sobrino */ 65725bbbd2dSJavier Almansa Sobrino.section .rodata.neoverse_n2_regs, "aS" 65825bbbd2dSJavier Almansa Sobrinoneoverse_n2_regs: /* The ASCII list of register names to be reported */ 65925bbbd2dSJavier Almansa Sobrino .asciz "cpupwrctlr_el1", "" 66025bbbd2dSJavier Almansa Sobrino 66125bbbd2dSJavier Almansa Sobrinofunc neoverse_n2_cpu_reg_dump 66225bbbd2dSJavier Almansa Sobrino adr x6, neoverse_n2_regs 66325bbbd2dSJavier Almansa Sobrino mrs x8, NEOVERSE_N2_CPUPWRCTLR_EL1 66425bbbd2dSJavier Almansa Sobrino ret 66525bbbd2dSJavier Almansa Sobrinoendfunc neoverse_n2_cpu_reg_dump 66625bbbd2dSJavier Almansa Sobrino 66725bbbd2dSJavier Almansa Sobrinodeclare_cpu_ops neoverse_n2, NEOVERSE_N2_MIDR, \ 66825bbbd2dSJavier Almansa Sobrino neoverse_n2_reset_func, \ 66925bbbd2dSJavier Almansa Sobrino neoverse_n2_core_pwr_dwn 670