1*54fd6939SJiyong Park/* 2*54fd6939SJiyong Park * Copyright (c) 2020-2021, Arm Limited. All rights reserved. 3*54fd6939SJiyong Park * 4*54fd6939SJiyong Park * SPDX-License-Identifier: BSD-3-Clause 5*54fd6939SJiyong Park */ 6*54fd6939SJiyong Park 7*54fd6939SJiyong Park#include <arch.h> 8*54fd6939SJiyong Park#include <asm_macros.S> 9*54fd6939SJiyong Park#include <cpu_macros.S> 10*54fd6939SJiyong Park#include <neoverse_n2.h> 11*54fd6939SJiyong Park 12*54fd6939SJiyong Park/* Hardware handled coherency */ 13*54fd6939SJiyong Park#if HW_ASSISTED_COHERENCY == 0 14*54fd6939SJiyong Park#error "Neoverse N2 must be compiled with HW_ASSISTED_COHERENCY enabled" 15*54fd6939SJiyong Park#endif 16*54fd6939SJiyong Park 17*54fd6939SJiyong Park/* 64-bit only core */ 18*54fd6939SJiyong Park#if CTX_INCLUDE_AARCH32_REGS == 1 19*54fd6939SJiyong Park#error "Neoverse-N2 supports only AArch64. Compile with CTX_INCLUDE_AARCH32_REGS=0" 20*54fd6939SJiyong Park#endif 21*54fd6939SJiyong Park 22*54fd6939SJiyong Park/* -------------------------------------------------- 23*54fd6939SJiyong Park * Errata Workaround for Neoverse N2 Erratum 2002655. 24*54fd6939SJiyong Park * This applies to revision r0p0 of Neoverse N2. it is still open. 25*54fd6939SJiyong Park * Inputs: 26*54fd6939SJiyong Park * x0: variant[4:7] and revision[0:3] of current cpu. 27*54fd6939SJiyong Park * Shall clobber: x0-x17 28*54fd6939SJiyong Park * -------------------------------------------------- 29*54fd6939SJiyong Park */ 30*54fd6939SJiyong Parkfunc errata_n2_2002655_wa 31*54fd6939SJiyong Park /* Check revision. */ 32*54fd6939SJiyong Park mov x17, x30 33*54fd6939SJiyong Park bl check_errata_2002655 34*54fd6939SJiyong Park cbz x0, 1f 35*54fd6939SJiyong Park 36*54fd6939SJiyong Park /* Apply instruction patching sequence */ 37*54fd6939SJiyong Park ldr x0,=0x6 38*54fd6939SJiyong Park msr S3_6_c15_c8_0,x0 39*54fd6939SJiyong Park ldr x0,=0xF3A08002 40*54fd6939SJiyong Park msr S3_6_c15_c8_2,x0 41*54fd6939SJiyong Park ldr x0,=0xFFF0F7FE 42*54fd6939SJiyong Park msr S3_6_c15_c8_3,x0 43*54fd6939SJiyong Park ldr x0,=0x40000001003ff 44*54fd6939SJiyong Park msr S3_6_c15_c8_1,x0 45*54fd6939SJiyong Park ldr x0,=0x7 46*54fd6939SJiyong Park msr S3_6_c15_c8_0,x0 47*54fd6939SJiyong Park ldr x0,=0xBF200000 48*54fd6939SJiyong Park msr S3_6_c15_c8_2,x0 49*54fd6939SJiyong Park ldr x0,=0xFFEF0000 50*54fd6939SJiyong Park msr S3_6_c15_c8_3,x0 51*54fd6939SJiyong Park ldr x0,=0x40000001003f3 52*54fd6939SJiyong Park msr S3_6_c15_c8_1,x0 53*54fd6939SJiyong Park isb 54*54fd6939SJiyong Park1: 55*54fd6939SJiyong Park ret x17 56*54fd6939SJiyong Parkendfunc errata_n2_2002655_wa 57*54fd6939SJiyong Park 58*54fd6939SJiyong Parkfunc check_errata_2002655 59*54fd6939SJiyong Park /* Applies to r0p0 */ 60*54fd6939SJiyong Park mov x1, #0x00 61*54fd6939SJiyong Park b cpu_rev_var_ls 62*54fd6939SJiyong Parkendfunc check_errata_2002655 63*54fd6939SJiyong Park 64*54fd6939SJiyong Park/* --------------------------------------------------------------- 65*54fd6939SJiyong Park * Errata Workaround for Neoverse N2 Erratum 2067956. 66*54fd6939SJiyong Park * This applies to revision r0p0 of Neoverse N2 and is still open. 67*54fd6939SJiyong Park * Inputs: 68*54fd6939SJiyong Park * x0: variant[4:7] and revision[0:3] of current cpu. 69*54fd6939SJiyong Park * Shall clobber: x0-x17 70*54fd6939SJiyong Park * --------------------------------------------------------------- 71*54fd6939SJiyong Park */ 72*54fd6939SJiyong Parkfunc errata_n2_2067956_wa 73*54fd6939SJiyong Park /* Compare x0 against revision r0p0 */ 74*54fd6939SJiyong Park mov x17, x30 75*54fd6939SJiyong Park bl check_errata_2067956 76*54fd6939SJiyong Park cbz x0, 1f 77*54fd6939SJiyong Park mrs x1, NEOVERSE_N2_CPUACTLR_EL1 78*54fd6939SJiyong Park orr x1, x1, NEOVERSE_N2_CPUACTLR_EL1_BIT_46 79*54fd6939SJiyong Park msr NEOVERSE_N2_CPUACTLR_EL1, x1 80*54fd6939SJiyong Park1: 81*54fd6939SJiyong Park ret x17 82*54fd6939SJiyong Parkendfunc errata_n2_2067956_wa 83*54fd6939SJiyong Park 84*54fd6939SJiyong Parkfunc check_errata_2067956 85*54fd6939SJiyong Park /* Applies to r0p0 */ 86*54fd6939SJiyong Park mov x1, #0x00 87*54fd6939SJiyong Park b cpu_rev_var_ls 88*54fd6939SJiyong Parkendfunc check_errata_2067956 89*54fd6939SJiyong Park 90*54fd6939SJiyong Park/* --------------------------------------------------------------- 91*54fd6939SJiyong Park * Errata Workaround for Neoverse N2 Erratum 2025414. 92*54fd6939SJiyong Park * This applies to revision r0p0 of Neoverse N2 and is still open. 93*54fd6939SJiyong Park * Inputs: 94*54fd6939SJiyong Park * x0: variant[4:7] and revision[0:3] of current cpu. 95*54fd6939SJiyong Park * Shall clobber: x0-x17 96*54fd6939SJiyong Park * --------------------------------------------------------------- 97*54fd6939SJiyong Park */ 98*54fd6939SJiyong Parkfunc errata_n2_2025414_wa 99*54fd6939SJiyong Park /* Compare x0 against revision r0p0 */ 100*54fd6939SJiyong Park mov x17, x30 101*54fd6939SJiyong Park bl check_errata_2025414 102*54fd6939SJiyong Park cbz x0, 1f 103*54fd6939SJiyong Park mrs x1, NEOVERSE_N2_CPUECTLR_EL1 104*54fd6939SJiyong Park orr x1, x1, NEOVERSE_N2_CPUECTLR_EL1_PFSTIDIS_BIT 105*54fd6939SJiyong Park msr NEOVERSE_N2_CPUECTLR_EL1, x1 106*54fd6939SJiyong Park 107*54fd6939SJiyong Park1: 108*54fd6939SJiyong Park ret x17 109*54fd6939SJiyong Parkendfunc errata_n2_2025414_wa 110*54fd6939SJiyong Park 111*54fd6939SJiyong Parkfunc check_errata_2025414 112*54fd6939SJiyong Park /* Applies to r0p0 */ 113*54fd6939SJiyong Park mov x1, #0x00 114*54fd6939SJiyong Park b cpu_rev_var_ls 115*54fd6939SJiyong Parkendfunc check_errata_2025414 116*54fd6939SJiyong Park 117*54fd6939SJiyong Park/* --------------------------------------------------------------- 118*54fd6939SJiyong Park * Errata Workaround for Neoverse N2 Erratum 2189731. 119*54fd6939SJiyong Park * This applies to revision r0p0 of Neoverse N2 and is still open. 120*54fd6939SJiyong Park * Inputs: 121*54fd6939SJiyong Park * x0: variant[4:7] and revision[0:3] of current cpu. 122*54fd6939SJiyong Park * Shall clobber: x0-x17 123*54fd6939SJiyong Park * --------------------------------------------------------------- 124*54fd6939SJiyong Park */ 125*54fd6939SJiyong Parkfunc errata_n2_2189731_wa 126*54fd6939SJiyong Park /* Compare x0 against revision r0p0 */ 127*54fd6939SJiyong Park mov x17, x30 128*54fd6939SJiyong Park bl check_errata_2189731 129*54fd6939SJiyong Park cbz x0, 1f 130*54fd6939SJiyong Park mrs x1, NEOVERSE_N2_CPUACTLR5_EL1 131*54fd6939SJiyong Park orr x1, x1, NEOVERSE_N2_CPUACTLR5_EL1_BIT_44 132*54fd6939SJiyong Park msr NEOVERSE_N2_CPUACTLR5_EL1, x1 133*54fd6939SJiyong Park 134*54fd6939SJiyong Park1: 135*54fd6939SJiyong Park ret x17 136*54fd6939SJiyong Parkendfunc errata_n2_2189731_wa 137*54fd6939SJiyong Park 138*54fd6939SJiyong Parkfunc check_errata_2189731 139*54fd6939SJiyong Park /* Applies to r0p0 */ 140*54fd6939SJiyong Park mov x1, #0x00 141*54fd6939SJiyong Park b cpu_rev_var_ls 142*54fd6939SJiyong Parkendfunc check_errata_2189731 143*54fd6939SJiyong Park 144*54fd6939SJiyong Park/* -------------------------------------------------- 145*54fd6939SJiyong Park * Errata Workaround for Neoverse N2 Erratum 2138956. 146*54fd6939SJiyong Park * This applies to revision r0p0 of Neoverse N2. it is still open. 147*54fd6939SJiyong Park * Inputs: 148*54fd6939SJiyong Park * x0: variant[4:7] and revision[0:3] of current cpu. 149*54fd6939SJiyong Park * Shall clobber: x0-x17 150*54fd6939SJiyong Park * -------------------------------------------------- 151*54fd6939SJiyong Park */ 152*54fd6939SJiyong Parkfunc errata_n2_2138956_wa 153*54fd6939SJiyong Park /* Check revision. */ 154*54fd6939SJiyong Park mov x17, x30 155*54fd6939SJiyong Park bl check_errata_2138956 156*54fd6939SJiyong Park cbz x0, 1f 157*54fd6939SJiyong Park 158*54fd6939SJiyong Park /* Apply instruction patching sequence */ 159*54fd6939SJiyong Park ldr x0,=0x3 160*54fd6939SJiyong Park msr S3_6_c15_c8_0,x0 161*54fd6939SJiyong Park ldr x0,=0xF3A08002 162*54fd6939SJiyong Park msr S3_6_c15_c8_2,x0 163*54fd6939SJiyong Park ldr x0,=0xFFF0F7FE 164*54fd6939SJiyong Park msr S3_6_c15_c8_3,x0 165*54fd6939SJiyong Park ldr x0,=0x10002001003FF 166*54fd6939SJiyong Park msr S3_6_c15_c8_1,x0 167*54fd6939SJiyong Park ldr x0,=0x4 168*54fd6939SJiyong Park msr S3_6_c15_c8_0,x0 169*54fd6939SJiyong Park ldr x0,=0xBF200000 170*54fd6939SJiyong Park msr S3_6_c15_c8_2,x0 171*54fd6939SJiyong Park ldr x0,=0xFFEF0000 172*54fd6939SJiyong Park msr S3_6_c15_c8_3,x0 173*54fd6939SJiyong Park ldr x0,=0x10002001003F3 174*54fd6939SJiyong Park msr S3_6_c15_c8_1,x0 175*54fd6939SJiyong Park isb 176*54fd6939SJiyong Park1: 177*54fd6939SJiyong Park ret x17 178*54fd6939SJiyong Parkendfunc errata_n2_2138956_wa 179*54fd6939SJiyong Park 180*54fd6939SJiyong Parkfunc check_errata_2138956 181*54fd6939SJiyong Park /* Applies to r0p0 */ 182*54fd6939SJiyong Park mov x1, #0x00 183*54fd6939SJiyong Park b cpu_rev_var_ls 184*54fd6939SJiyong Parkendfunc check_errata_2138956 185*54fd6939SJiyong Park 186*54fd6939SJiyong Park/* -------------------------------------------------- 187*54fd6939SJiyong Park * Errata Workaround for Neoverse N2 Erratum 2242415. 188*54fd6939SJiyong Park * This applies to revision r0p0 of Neoverse N2. it is still open. 189*54fd6939SJiyong Park * Inputs: 190*54fd6939SJiyong Park * x0: variant[4:7] and revision[0:3] of current cpu. 191*54fd6939SJiyong Park * Shall clobber: x0-x1, x17 192*54fd6939SJiyong Park * -------------------------------------------------- 193*54fd6939SJiyong Park */ 194*54fd6939SJiyong Parkfunc errata_n2_2242415_wa 195*54fd6939SJiyong Park /* Check revision. */ 196*54fd6939SJiyong Park mov x17, x30 197*54fd6939SJiyong Park bl check_errata_2242415 198*54fd6939SJiyong Park cbz x0, 1f 199*54fd6939SJiyong Park 200*54fd6939SJiyong Park /* Apply instruction patching sequence */ 201*54fd6939SJiyong Park mrs x1, NEOVERSE_N2_CPUACTLR_EL1 202*54fd6939SJiyong Park orr x1, x1, NEOVERSE_N2_CPUACTLR_EL1_BIT_22 203*54fd6939SJiyong Park msr NEOVERSE_N2_CPUACTLR_EL1, x1 204*54fd6939SJiyong Park1: 205*54fd6939SJiyong Park ret x17 206*54fd6939SJiyong Parkendfunc errata_n2_2242415_wa 207*54fd6939SJiyong Park 208*54fd6939SJiyong Parkfunc check_errata_2242415 209*54fd6939SJiyong Park /* Applies to r0p0 */ 210*54fd6939SJiyong Park mov x1, #0x00 211*54fd6939SJiyong Park b cpu_rev_var_ls 212*54fd6939SJiyong Parkendfunc check_errata_2242415 213*54fd6939SJiyong Park 214*54fd6939SJiyong Park/* -------------------------------------------------- 215*54fd6939SJiyong Park * Errata Workaround for Neoverse N2 Erratum 2138953. 216*54fd6939SJiyong Park * This applies to revision r0p0 of Neoverse N2. it is still open. 217*54fd6939SJiyong Park * Inputs: 218*54fd6939SJiyong Park * x0: variant[4:7] and revision[0:3] of current cpu. 219*54fd6939SJiyong Park * Shall clobber: x0-x1, x17 220*54fd6939SJiyong Park * -------------------------------------------------- 221*54fd6939SJiyong Park */ 222*54fd6939SJiyong Parkfunc errata_n2_2138953_wa 223*54fd6939SJiyong Park /* Check revision. */ 224*54fd6939SJiyong Park mov x17, x30 225*54fd6939SJiyong Park bl check_errata_2138953 226*54fd6939SJiyong Park cbz x0, 1f 227*54fd6939SJiyong Park 228*54fd6939SJiyong Park /* Apply instruction patching sequence */ 229*54fd6939SJiyong Park mrs x1, NEOVERSE_N2_CPUECTLR2_EL1 230*54fd6939SJiyong Park mov x0, #NEOVERSE_N2_CPUECTLR2_EL1_PF_MODE_CNSRV 231*54fd6939SJiyong Park bfi x1, x0, #CPUECTLR2_EL1_PF_MODE_LSB, #CPUECTLR2_EL1_PF_MODE_WIDTH 232*54fd6939SJiyong Park msr NEOVERSE_N2_CPUECTLR2_EL1, x1 233*54fd6939SJiyong Park1: 234*54fd6939SJiyong Park ret x17 235*54fd6939SJiyong Parkendfunc errata_n2_2138953_wa 236*54fd6939SJiyong Park 237*54fd6939SJiyong Parkfunc check_errata_2138953 238*54fd6939SJiyong Park /* Applies to r0p0 */ 239*54fd6939SJiyong Park mov x1, #0x00 240*54fd6939SJiyong Park b cpu_rev_var_ls 241*54fd6939SJiyong Parkendfunc check_errata_2138953 242*54fd6939SJiyong Park 243*54fd6939SJiyong Park/* -------------------------------------------------- 244*54fd6939SJiyong Park * Errata Workaround for Neoverse N2 Erratum 2138958. 245*54fd6939SJiyong Park * This applies to revision r0p0 of Neoverse N2. it is still open. 246*54fd6939SJiyong Park * Inputs: 247*54fd6939SJiyong Park * x0: variant[4:7] and revision[0:3] of current cpu. 248*54fd6939SJiyong Park * Shall clobber: x0-x1, x17 249*54fd6939SJiyong Park * -------------------------------------------------- 250*54fd6939SJiyong Park */ 251*54fd6939SJiyong Parkfunc errata_n2_2138958_wa 252*54fd6939SJiyong Park /* Check revision. */ 253*54fd6939SJiyong Park mov x17, x30 254*54fd6939SJiyong Park bl check_errata_2138958 255*54fd6939SJiyong Park cbz x0, 1f 256*54fd6939SJiyong Park 257*54fd6939SJiyong Park /* Apply instruction patching sequence */ 258*54fd6939SJiyong Park mrs x1, NEOVERSE_N2_CPUACTLR5_EL1 259*54fd6939SJiyong Park orr x1, x1, NEOVERSE_N2_CPUACTLR5_EL1_BIT_13 260*54fd6939SJiyong Park msr NEOVERSE_N2_CPUACTLR5_EL1, x1 261*54fd6939SJiyong Park1: 262*54fd6939SJiyong Park ret x17 263*54fd6939SJiyong Parkendfunc errata_n2_2138958_wa 264*54fd6939SJiyong Park 265*54fd6939SJiyong Parkfunc check_errata_2138958 266*54fd6939SJiyong Park /* Applies to r0p0 */ 267*54fd6939SJiyong Park mov x1, #0x00 268*54fd6939SJiyong Park b cpu_rev_var_ls 269*54fd6939SJiyong Parkendfunc check_errata_2138958 270*54fd6939SJiyong Park 271*54fd6939SJiyong Park/* -------------------------------------------------- 272*54fd6939SJiyong Park * Errata Workaround for Neoverse N2 Erratum 2242400. 273*54fd6939SJiyong Park * This applies to revision r0p0 of Neoverse N2. it is still open. 274*54fd6939SJiyong Park * Inputs: 275*54fd6939SJiyong Park * x0: variant[4:7] and revision[0:3] of current cpu. 276*54fd6939SJiyong Park * Shall clobber: x0-x1, x17 277*54fd6939SJiyong Park * -------------------------------------------------- 278*54fd6939SJiyong Park */ 279*54fd6939SJiyong Parkfunc errata_n2_2242400_wa 280*54fd6939SJiyong Park /* Check revision. */ 281*54fd6939SJiyong Park mov x17, x30 282*54fd6939SJiyong Park bl check_errata_2242400 283*54fd6939SJiyong Park cbz x0, 1f 284*54fd6939SJiyong Park 285*54fd6939SJiyong Park /* Apply instruction patching sequence */ 286*54fd6939SJiyong Park mrs x1, NEOVERSE_N2_CPUACTLR5_EL1 287*54fd6939SJiyong Park orr x1, x1, NEOVERSE_N2_CPUACTLR5_EL1_BIT_17 288*54fd6939SJiyong Park msr NEOVERSE_N2_CPUACTLR5_EL1, x1 289*54fd6939SJiyong Park ldr x0, =0x2 290*54fd6939SJiyong Park msr S3_6_c15_c8_0, x0 291*54fd6939SJiyong Park ldr x0, =0x10F600E000 292*54fd6939SJiyong Park msr S3_6_c15_c8_2, x0 293*54fd6939SJiyong Park ldr x0, =0x10FF80E000 294*54fd6939SJiyong Park msr S3_6_c15_c8_3, x0 295*54fd6939SJiyong Park ldr x0, =0x80000000003FF 296*54fd6939SJiyong Park msr S3_6_c15_c8_1, x0 297*54fd6939SJiyong Park isb 298*54fd6939SJiyong Park1: 299*54fd6939SJiyong Park ret x17 300*54fd6939SJiyong Parkendfunc errata_n2_2242400_wa 301*54fd6939SJiyong Park 302*54fd6939SJiyong Parkfunc check_errata_2242400 303*54fd6939SJiyong Park /* Applies to r0p0 */ 304*54fd6939SJiyong Park mov x1, #0x00 305*54fd6939SJiyong Park b cpu_rev_var_ls 306*54fd6939SJiyong Parkendfunc check_errata_2242400 307*54fd6939SJiyong Park 308*54fd6939SJiyong Park/* -------------------------------------------------- 309*54fd6939SJiyong Park * Errata Workaround for Neoverse N2 Erratum 2280757. 310*54fd6939SJiyong Park * This applies to revision r0p0 of Neoverse N2. it is still open. 311*54fd6939SJiyong Park * Inputs: 312*54fd6939SJiyong Park * x0: variant[4:7] and revision[0:3] of current cpu. 313*54fd6939SJiyong Park * Shall clobber: x0-x1, x17 314*54fd6939SJiyong Park * -------------------------------------------------- 315*54fd6939SJiyong Park */ 316*54fd6939SJiyong Parkfunc errata_n2_2280757_wa 317*54fd6939SJiyong Park /* Check revision. */ 318*54fd6939SJiyong Park mov x17, x30 319*54fd6939SJiyong Park bl check_errata_2280757 320*54fd6939SJiyong Park cbz x0, 1f 321*54fd6939SJiyong Park 322*54fd6939SJiyong Park /* Apply instruction patching sequence */ 323*54fd6939SJiyong Park mrs x1, NEOVERSE_N2_CPUACTLR_EL1 324*54fd6939SJiyong Park orr x1, x1, NEOVERSE_N2_CPUACTLR_EL1_BIT_22 325*54fd6939SJiyong Park msr NEOVERSE_N2_CPUACTLR_EL1, x1 326*54fd6939SJiyong Park1: 327*54fd6939SJiyong Park ret x17 328*54fd6939SJiyong Parkendfunc errata_n2_2280757_wa 329*54fd6939SJiyong Park 330*54fd6939SJiyong Parkfunc check_errata_2280757 331*54fd6939SJiyong Park /* Applies to r0p0 */ 332*54fd6939SJiyong Park mov x1, #0x00 333*54fd6939SJiyong Park b cpu_rev_var_ls 334*54fd6939SJiyong Parkendfunc check_errata_2280757 335*54fd6939SJiyong Park 336*54fd6939SJiyong Park /* ------------------------------------------- 337*54fd6939SJiyong Park * The CPU Ops reset function for Neoverse N2. 338*54fd6939SJiyong Park * ------------------------------------------- 339*54fd6939SJiyong Park */ 340*54fd6939SJiyong Parkfunc neoverse_n2_reset_func 341*54fd6939SJiyong Park mov x19, x30 342*54fd6939SJiyong Park 343*54fd6939SJiyong Park /* Check if the PE implements SSBS */ 344*54fd6939SJiyong Park mrs x0, id_aa64pfr1_el1 345*54fd6939SJiyong Park tst x0, #(ID_AA64PFR1_EL1_SSBS_MASK << ID_AA64PFR1_EL1_SSBS_SHIFT) 346*54fd6939SJiyong Park b.eq 1f 347*54fd6939SJiyong Park 348*54fd6939SJiyong Park /* Disable speculative loads */ 349*54fd6939SJiyong Park msr SSBS, xzr 350*54fd6939SJiyong Park1: 351*54fd6939SJiyong Park /* Force all cacheable atomic instructions to be near */ 352*54fd6939SJiyong Park mrs x0, NEOVERSE_N2_CPUACTLR2_EL1 353*54fd6939SJiyong Park orr x0, x0, #NEOVERSE_N2_CPUACTLR2_EL1_BIT_2 354*54fd6939SJiyong Park msr NEOVERSE_N2_CPUACTLR2_EL1, x0 355*54fd6939SJiyong Park 356*54fd6939SJiyong Park#if ERRATA_N2_2067956 357*54fd6939SJiyong Park mov x0, x18 358*54fd6939SJiyong Park bl errata_n2_2067956_wa 359*54fd6939SJiyong Park#endif 360*54fd6939SJiyong Park 361*54fd6939SJiyong Park#if ERRATA_N2_2025414 362*54fd6939SJiyong Park mov x0, x18 363*54fd6939SJiyong Park bl errata_n2_2025414_wa 364*54fd6939SJiyong Park#endif 365*54fd6939SJiyong Park 366*54fd6939SJiyong Park#if ERRATA_N2_2189731 367*54fd6939SJiyong Park mov x0, x18 368*54fd6939SJiyong Park bl errata_n2_2189731_wa 369*54fd6939SJiyong Park#endif 370*54fd6939SJiyong Park 371*54fd6939SJiyong Park 372*54fd6939SJiyong Park#if ERRATA_N2_2138956 373*54fd6939SJiyong Park mov x0, x18 374*54fd6939SJiyong Park bl errata_n2_2138956_wa 375*54fd6939SJiyong Park#endif 376*54fd6939SJiyong Park 377*54fd6939SJiyong Park#if ERRATA_N2_2138953 378*54fd6939SJiyong Park mov x0, x18 379*54fd6939SJiyong Park bl errata_n2_2138953_wa 380*54fd6939SJiyong Park#endif 381*54fd6939SJiyong Park 382*54fd6939SJiyong Park#if ERRATA_N2_2242415 383*54fd6939SJiyong Park mov x0, x18 384*54fd6939SJiyong Park bl errata_n2_2242415_wa 385*54fd6939SJiyong Park#endif 386*54fd6939SJiyong Park 387*54fd6939SJiyong Park#if ERRATA_N2_2138958 388*54fd6939SJiyong Park mov x0, x18 389*54fd6939SJiyong Park bl errata_n2_2138958_wa 390*54fd6939SJiyong Park#endif 391*54fd6939SJiyong Park 392*54fd6939SJiyong Park#if ERRATA_N2_2242400 393*54fd6939SJiyong Park mov x0, x18 394*54fd6939SJiyong Park bl errata_n2_2242400_wa 395*54fd6939SJiyong Park#endif 396*54fd6939SJiyong Park 397*54fd6939SJiyong Park#if ERRATA_N2_2280757 398*54fd6939SJiyong Park mov x0, x18 399*54fd6939SJiyong Park bl errata_n2_2280757_wa 400*54fd6939SJiyong Park#endif 401*54fd6939SJiyong Park 402*54fd6939SJiyong Park#if ENABLE_AMU 403*54fd6939SJiyong Park /* Make sure accesses from EL0/EL1 and EL2 are not trapped to EL3 */ 404*54fd6939SJiyong Park mrs x0, cptr_el3 405*54fd6939SJiyong Park orr x0, x0, #TAM_BIT 406*54fd6939SJiyong Park msr cptr_el3, x0 407*54fd6939SJiyong Park 408*54fd6939SJiyong Park /* Make sure accesses from EL0/EL1 are not trapped to EL2 */ 409*54fd6939SJiyong Park mrs x0, cptr_el2 410*54fd6939SJiyong Park orr x0, x0, #TAM_BIT 411*54fd6939SJiyong Park msr cptr_el2, x0 412*54fd6939SJiyong Park 413*54fd6939SJiyong Park /* No need to enable the counters as this would be done at el3 exit */ 414*54fd6939SJiyong Park#endif 415*54fd6939SJiyong Park 416*54fd6939SJiyong Park#if NEOVERSE_Nx_EXTERNAL_LLC 417*54fd6939SJiyong Park /* Some systems may have External LLC, core needs to be made aware */ 418*54fd6939SJiyong Park mrs x0, NEOVERSE_N2_CPUECTLR_EL1 419*54fd6939SJiyong Park orr x0, x0, NEOVERSE_N2_CPUECTLR_EL1_EXTLLC_BIT 420*54fd6939SJiyong Park msr NEOVERSE_N2_CPUECTLR_EL1, x0 421*54fd6939SJiyong Park#endif 422*54fd6939SJiyong Park 423*54fd6939SJiyong Park bl cpu_get_rev_var 424*54fd6939SJiyong Park mov x18, x0 425*54fd6939SJiyong Park 426*54fd6939SJiyong Park#if ERRATA_N2_2002655 427*54fd6939SJiyong Park mov x0, x18 428*54fd6939SJiyong Park bl errata_n2_2002655_wa 429*54fd6939SJiyong Park#endif 430*54fd6939SJiyong Park 431*54fd6939SJiyong Park isb 432*54fd6939SJiyong Park ret x19 433*54fd6939SJiyong Parkendfunc neoverse_n2_reset_func 434*54fd6939SJiyong Park 435*54fd6939SJiyong Parkfunc neoverse_n2_core_pwr_dwn 436*54fd6939SJiyong Park /* --------------------------------------------------- 437*54fd6939SJiyong Park * Enable CPU power down bit in power control register 438*54fd6939SJiyong Park * No need to do cache maintenance here. 439*54fd6939SJiyong Park * --------------------------------------------------- 440*54fd6939SJiyong Park */ 441*54fd6939SJiyong Park mrs x0, NEOVERSE_N2_CPUPWRCTLR_EL1 442*54fd6939SJiyong Park orr x0, x0, #NEOVERSE_N2_CORE_PWRDN_EN_BIT 443*54fd6939SJiyong Park msr NEOVERSE_N2_CPUPWRCTLR_EL1, x0 444*54fd6939SJiyong Park isb 445*54fd6939SJiyong Park ret 446*54fd6939SJiyong Parkendfunc neoverse_n2_core_pwr_dwn 447*54fd6939SJiyong Park 448*54fd6939SJiyong Park#if REPORT_ERRATA 449*54fd6939SJiyong Park/* 450*54fd6939SJiyong Park * Errata printing function for Neoverse N2 cores. Must follow AAPCS. 451*54fd6939SJiyong Park */ 452*54fd6939SJiyong Parkfunc neoverse_n2_errata_report 453*54fd6939SJiyong Park stp x8, x30, [sp, #-16]! 454*54fd6939SJiyong Park 455*54fd6939SJiyong Park bl cpu_get_rev_var 456*54fd6939SJiyong Park mov x8, x0 457*54fd6939SJiyong Park 458*54fd6939SJiyong Park /* 459*54fd6939SJiyong Park * Report all errata. The revision-variant information is passed to 460*54fd6939SJiyong Park * checking functions of each errata. 461*54fd6939SJiyong Park */ 462*54fd6939SJiyong Park report_errata ERRATA_N2_2002655, neoverse_n2, 2002655 463*54fd6939SJiyong Park report_errata ERRATA_N2_2067956, neoverse_n2, 2067956 464*54fd6939SJiyong Park report_errata ERRATA_N2_2025414, neoverse_n2, 2025414 465*54fd6939SJiyong Park report_errata ERRATA_N2_2189731, neoverse_n2, 2189731 466*54fd6939SJiyong Park report_errata ERRATA_N2_2138956, neoverse_n2, 2138956 467*54fd6939SJiyong Park report_errata ERRATA_N2_2138953, neoverse_n2, 2138953 468*54fd6939SJiyong Park report_errata ERRATA_N2_2242415, neoverse_n2, 2242415 469*54fd6939SJiyong Park report_errata ERRATA_N2_2138958, neoverse_n2, 2138958 470*54fd6939SJiyong Park report_errata ERRATA_N2_2242400, neoverse_n2, 2242400 471*54fd6939SJiyong Park report_errata ERRATA_N2_2280757, neoverse_n2, 2280757 472*54fd6939SJiyong Park 473*54fd6939SJiyong Park ldp x8, x30, [sp], #16 474*54fd6939SJiyong Park ret 475*54fd6939SJiyong Parkendfunc neoverse_n2_errata_report 476*54fd6939SJiyong Park#endif 477*54fd6939SJiyong Park 478*54fd6939SJiyong Park /* --------------------------------------------- 479*54fd6939SJiyong Park * This function provides Neoverse N2 specific 480*54fd6939SJiyong Park * register information for crash reporting. 481*54fd6939SJiyong Park * It needs to return with x6 pointing to 482*54fd6939SJiyong Park * a list of register names in ASCII and 483*54fd6939SJiyong Park * x8 - x15 having values of registers to be 484*54fd6939SJiyong Park * reported. 485*54fd6939SJiyong Park * --------------------------------------------- 486*54fd6939SJiyong Park */ 487*54fd6939SJiyong Park.section .rodata.neoverse_n2_regs, "aS" 488*54fd6939SJiyong Parkneoverse_n2_regs: /* The ASCII list of register names to be reported */ 489*54fd6939SJiyong Park .asciz "cpupwrctlr_el1", "" 490*54fd6939SJiyong Park 491*54fd6939SJiyong Parkfunc neoverse_n2_cpu_reg_dump 492*54fd6939SJiyong Park adr x6, neoverse_n2_regs 493*54fd6939SJiyong Park mrs x8, NEOVERSE_N2_CPUPWRCTLR_EL1 494*54fd6939SJiyong Park ret 495*54fd6939SJiyong Parkendfunc neoverse_n2_cpu_reg_dump 496*54fd6939SJiyong Park 497*54fd6939SJiyong Parkdeclare_cpu_ops neoverse_n2, NEOVERSE_N2_MIDR, \ 498*54fd6939SJiyong Park neoverse_n2_reset_func, \ 499*54fd6939SJiyong Park neoverse_n2_core_pwr_dwn 500