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