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