1*54fd6939SJiyong Park/* 2*54fd6939SJiyong Park * Copyright (c) 2017-2021, Arm Limited and Contributors. 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 <cpuamu.h> 10*54fd6939SJiyong Park#include <cpu_macros.S> 11*54fd6939SJiyong Park#include <context.h> 12*54fd6939SJiyong Park#include <neoverse_n1.h> 13*54fd6939SJiyong Park 14*54fd6939SJiyong Park/* Hardware handled coherency */ 15*54fd6939SJiyong Park#if HW_ASSISTED_COHERENCY == 0 16*54fd6939SJiyong Park#error "Neoverse N1 must be compiled with HW_ASSISTED_COHERENCY enabled" 17*54fd6939SJiyong Park#endif 18*54fd6939SJiyong Park 19*54fd6939SJiyong Park/* 64-bit only core */ 20*54fd6939SJiyong Park#if CTX_INCLUDE_AARCH32_REGS == 1 21*54fd6939SJiyong Park#error "Neoverse-N1 supports only AArch64. Compile with CTX_INCLUDE_AARCH32_REGS=0" 22*54fd6939SJiyong Park#endif 23*54fd6939SJiyong Park 24*54fd6939SJiyong Park .global neoverse_n1_errata_ic_trap_handler 25*54fd6939SJiyong Park 26*54fd6939SJiyong Park/* -------------------------------------------------- 27*54fd6939SJiyong Park * Errata Workaround for Neoverse N1 Erratum 1043202. 28*54fd6939SJiyong Park * This applies to revision r0p0 and r1p0 of Neoverse N1. 29*54fd6939SJiyong Park * Inputs: 30*54fd6939SJiyong Park * x0: variant[4:7] and revision[0:3] of current cpu. 31*54fd6939SJiyong Park * Shall clobber: x0-x17 32*54fd6939SJiyong Park * -------------------------------------------------- 33*54fd6939SJiyong Park */ 34*54fd6939SJiyong Parkfunc errata_n1_1043202_wa 35*54fd6939SJiyong Park /* Compare x0 against revision r1p0 */ 36*54fd6939SJiyong Park mov x17, x30 37*54fd6939SJiyong Park bl check_errata_1043202 38*54fd6939SJiyong Park cbz x0, 1f 39*54fd6939SJiyong Park 40*54fd6939SJiyong Park /* Apply instruction patching sequence */ 41*54fd6939SJiyong Park ldr x0, =0x0 42*54fd6939SJiyong Park msr CPUPSELR_EL3, x0 43*54fd6939SJiyong Park ldr x0, =0xF3BF8F2F 44*54fd6939SJiyong Park msr CPUPOR_EL3, x0 45*54fd6939SJiyong Park ldr x0, =0xFFFFFFFF 46*54fd6939SJiyong Park msr CPUPMR_EL3, x0 47*54fd6939SJiyong Park ldr x0, =0x800200071 48*54fd6939SJiyong Park msr CPUPCR_EL3, x0 49*54fd6939SJiyong Park isb 50*54fd6939SJiyong Park1: 51*54fd6939SJiyong Park ret x17 52*54fd6939SJiyong Parkendfunc errata_n1_1043202_wa 53*54fd6939SJiyong Park 54*54fd6939SJiyong Parkfunc check_errata_1043202 55*54fd6939SJiyong Park /* Applies to r0p0 and r1p0 */ 56*54fd6939SJiyong Park mov x1, #0x10 57*54fd6939SJiyong Park b cpu_rev_var_ls 58*54fd6939SJiyong Parkendfunc check_errata_1043202 59*54fd6939SJiyong Park 60*54fd6939SJiyong Park/* -------------------------------------------------- 61*54fd6939SJiyong Park * Disable speculative loads if Neoverse N1 supports 62*54fd6939SJiyong Park * SSBS. 63*54fd6939SJiyong Park * 64*54fd6939SJiyong Park * Shall clobber: x0. 65*54fd6939SJiyong Park * -------------------------------------------------- 66*54fd6939SJiyong Park */ 67*54fd6939SJiyong Parkfunc neoverse_n1_disable_speculative_loads 68*54fd6939SJiyong Park /* Check if the PE implements SSBS */ 69*54fd6939SJiyong Park mrs x0, id_aa64pfr1_el1 70*54fd6939SJiyong Park tst x0, #(ID_AA64PFR1_EL1_SSBS_MASK << ID_AA64PFR1_EL1_SSBS_SHIFT) 71*54fd6939SJiyong Park b.eq 1f 72*54fd6939SJiyong Park 73*54fd6939SJiyong Park /* Disable speculative loads */ 74*54fd6939SJiyong Park msr SSBS, xzr 75*54fd6939SJiyong Park 76*54fd6939SJiyong Park1: 77*54fd6939SJiyong Park ret 78*54fd6939SJiyong Parkendfunc neoverse_n1_disable_speculative_loads 79*54fd6939SJiyong Park 80*54fd6939SJiyong Park/* -------------------------------------------------- 81*54fd6939SJiyong Park * Errata Workaround for Neoverse N1 Errata #1073348 82*54fd6939SJiyong Park * This applies to revision r0p0 and r1p0 of Neoverse N1. 83*54fd6939SJiyong Park * Inputs: 84*54fd6939SJiyong Park * x0: variant[4:7] and revision[0:3] of current cpu. 85*54fd6939SJiyong Park * Shall clobber: x0-x17 86*54fd6939SJiyong Park * -------------------------------------------------- 87*54fd6939SJiyong Park */ 88*54fd6939SJiyong Parkfunc errata_n1_1073348_wa 89*54fd6939SJiyong Park /* Compare x0 against revision r1p0 */ 90*54fd6939SJiyong Park mov x17, x30 91*54fd6939SJiyong Park bl check_errata_1073348 92*54fd6939SJiyong Park cbz x0, 1f 93*54fd6939SJiyong Park mrs x1, NEOVERSE_N1_CPUACTLR_EL1 94*54fd6939SJiyong Park orr x1, x1, NEOVERSE_N1_CPUACTLR_EL1_BIT_6 95*54fd6939SJiyong Park msr NEOVERSE_N1_CPUACTLR_EL1, x1 96*54fd6939SJiyong Park1: 97*54fd6939SJiyong Park ret x17 98*54fd6939SJiyong Parkendfunc errata_n1_1073348_wa 99*54fd6939SJiyong Park 100*54fd6939SJiyong Parkfunc check_errata_1073348 101*54fd6939SJiyong Park /* Applies to r0p0 and r1p0 */ 102*54fd6939SJiyong Park mov x1, #0x10 103*54fd6939SJiyong Park b cpu_rev_var_ls 104*54fd6939SJiyong Parkendfunc check_errata_1073348 105*54fd6939SJiyong Park 106*54fd6939SJiyong Park/* -------------------------------------------------- 107*54fd6939SJiyong Park * Errata Workaround for Neoverse N1 Errata #1130799 108*54fd6939SJiyong Park * This applies to revision <=r2p0 of Neoverse N1. 109*54fd6939SJiyong Park * Inputs: 110*54fd6939SJiyong Park * x0: variant[4:7] and revision[0:3] of current cpu. 111*54fd6939SJiyong Park * Shall clobber: x0-x17 112*54fd6939SJiyong Park * -------------------------------------------------- 113*54fd6939SJiyong Park */ 114*54fd6939SJiyong Parkfunc errata_n1_1130799_wa 115*54fd6939SJiyong Park /* Compare x0 against revision r2p0 */ 116*54fd6939SJiyong Park mov x17, x30 117*54fd6939SJiyong Park bl check_errata_1130799 118*54fd6939SJiyong Park cbz x0, 1f 119*54fd6939SJiyong Park mrs x1, NEOVERSE_N1_CPUACTLR2_EL1 120*54fd6939SJiyong Park orr x1, x1, NEOVERSE_N1_CPUACTLR2_EL1_BIT_59 121*54fd6939SJiyong Park msr NEOVERSE_N1_CPUACTLR2_EL1, x1 122*54fd6939SJiyong Park1: 123*54fd6939SJiyong Park ret x17 124*54fd6939SJiyong Parkendfunc errata_n1_1130799_wa 125*54fd6939SJiyong Park 126*54fd6939SJiyong Parkfunc check_errata_1130799 127*54fd6939SJiyong Park /* Applies to <=r2p0 */ 128*54fd6939SJiyong Park mov x1, #0x20 129*54fd6939SJiyong Park b cpu_rev_var_ls 130*54fd6939SJiyong Parkendfunc check_errata_1130799 131*54fd6939SJiyong Park 132*54fd6939SJiyong Park/* -------------------------------------------------- 133*54fd6939SJiyong Park * Errata Workaround for Neoverse N1 Errata #1165347 134*54fd6939SJiyong Park * This applies to revision <=r2p0 of Neoverse N1. 135*54fd6939SJiyong Park * Inputs: 136*54fd6939SJiyong Park * x0: variant[4:7] and revision[0:3] of current cpu. 137*54fd6939SJiyong Park * Shall clobber: x0-x17 138*54fd6939SJiyong Park * -------------------------------------------------- 139*54fd6939SJiyong Park */ 140*54fd6939SJiyong Parkfunc errata_n1_1165347_wa 141*54fd6939SJiyong Park /* Compare x0 against revision r2p0 */ 142*54fd6939SJiyong Park mov x17, x30 143*54fd6939SJiyong Park bl check_errata_1165347 144*54fd6939SJiyong Park cbz x0, 1f 145*54fd6939SJiyong Park mrs x1, NEOVERSE_N1_CPUACTLR2_EL1 146*54fd6939SJiyong Park orr x1, x1, NEOVERSE_N1_CPUACTLR2_EL1_BIT_0 147*54fd6939SJiyong Park orr x1, x1, NEOVERSE_N1_CPUACTLR2_EL1_BIT_15 148*54fd6939SJiyong Park msr NEOVERSE_N1_CPUACTLR2_EL1, x1 149*54fd6939SJiyong Park1: 150*54fd6939SJiyong Park ret x17 151*54fd6939SJiyong Parkendfunc errata_n1_1165347_wa 152*54fd6939SJiyong Park 153*54fd6939SJiyong Parkfunc check_errata_1165347 154*54fd6939SJiyong Park /* Applies to <=r2p0 */ 155*54fd6939SJiyong Park mov x1, #0x20 156*54fd6939SJiyong Park b cpu_rev_var_ls 157*54fd6939SJiyong Parkendfunc check_errata_1165347 158*54fd6939SJiyong Park 159*54fd6939SJiyong Park/* -------------------------------------------------- 160*54fd6939SJiyong Park * Errata Workaround for Neoverse N1 Errata #1207823 161*54fd6939SJiyong Park * This applies to revision <=r2p0 of Neoverse N1. 162*54fd6939SJiyong Park * Inputs: 163*54fd6939SJiyong Park * x0: variant[4:7] and revision[0:3] of current cpu. 164*54fd6939SJiyong Park * Shall clobber: x0-x17 165*54fd6939SJiyong Park * -------------------------------------------------- 166*54fd6939SJiyong Park */ 167*54fd6939SJiyong Parkfunc errata_n1_1207823_wa 168*54fd6939SJiyong Park /* Compare x0 against revision r2p0 */ 169*54fd6939SJiyong Park mov x17, x30 170*54fd6939SJiyong Park bl check_errata_1207823 171*54fd6939SJiyong Park cbz x0, 1f 172*54fd6939SJiyong Park mrs x1, NEOVERSE_N1_CPUACTLR2_EL1 173*54fd6939SJiyong Park orr x1, x1, NEOVERSE_N1_CPUACTLR2_EL1_BIT_11 174*54fd6939SJiyong Park msr NEOVERSE_N1_CPUACTLR2_EL1, x1 175*54fd6939SJiyong Park1: 176*54fd6939SJiyong Park ret x17 177*54fd6939SJiyong Parkendfunc errata_n1_1207823_wa 178*54fd6939SJiyong Park 179*54fd6939SJiyong Parkfunc check_errata_1207823 180*54fd6939SJiyong Park /* Applies to <=r2p0 */ 181*54fd6939SJiyong Park mov x1, #0x20 182*54fd6939SJiyong Park b cpu_rev_var_ls 183*54fd6939SJiyong Parkendfunc check_errata_1207823 184*54fd6939SJiyong Park 185*54fd6939SJiyong Park/* -------------------------------------------------- 186*54fd6939SJiyong Park * Errata Workaround for Neoverse N1 Errata #1220197 187*54fd6939SJiyong Park * This applies to revision <=r2p0 of Neoverse N1. 188*54fd6939SJiyong Park * Inputs: 189*54fd6939SJiyong Park * x0: variant[4:7] and revision[0:3] of current cpu. 190*54fd6939SJiyong Park * Shall clobber: x0-x17 191*54fd6939SJiyong Park * -------------------------------------------------- 192*54fd6939SJiyong Park */ 193*54fd6939SJiyong Parkfunc errata_n1_1220197_wa 194*54fd6939SJiyong Park /* Compare x0 against revision r2p0 */ 195*54fd6939SJiyong Park mov x17, x30 196*54fd6939SJiyong Park bl check_errata_1220197 197*54fd6939SJiyong Park cbz x0, 1f 198*54fd6939SJiyong Park mrs x1, NEOVERSE_N1_CPUECTLR_EL1 199*54fd6939SJiyong Park orr x1, x1, NEOVERSE_N1_WS_THR_L2_MASK 200*54fd6939SJiyong Park msr NEOVERSE_N1_CPUECTLR_EL1, x1 201*54fd6939SJiyong Park1: 202*54fd6939SJiyong Park ret x17 203*54fd6939SJiyong Parkendfunc errata_n1_1220197_wa 204*54fd6939SJiyong Park 205*54fd6939SJiyong Parkfunc check_errata_1220197 206*54fd6939SJiyong Park /* Applies to <=r2p0 */ 207*54fd6939SJiyong Park mov x1, #0x20 208*54fd6939SJiyong Park b cpu_rev_var_ls 209*54fd6939SJiyong Parkendfunc check_errata_1220197 210*54fd6939SJiyong Park 211*54fd6939SJiyong Park/* -------------------------------------------------- 212*54fd6939SJiyong Park * Errata Workaround for Neoverse N1 Errata #1257314 213*54fd6939SJiyong Park * This applies to revision <=r3p0 of Neoverse N1. 214*54fd6939SJiyong Park * Inputs: 215*54fd6939SJiyong Park * x0: variant[4:7] and revision[0:3] of current cpu. 216*54fd6939SJiyong Park * Shall clobber: x0-x17 217*54fd6939SJiyong Park * -------------------------------------------------- 218*54fd6939SJiyong Park */ 219*54fd6939SJiyong Parkfunc errata_n1_1257314_wa 220*54fd6939SJiyong Park /* Compare x0 against revision r3p0 */ 221*54fd6939SJiyong Park mov x17, x30 222*54fd6939SJiyong Park bl check_errata_1257314 223*54fd6939SJiyong Park cbz x0, 1f 224*54fd6939SJiyong Park mrs x1, NEOVERSE_N1_CPUACTLR3_EL1 225*54fd6939SJiyong Park orr x1, x1, NEOVERSE_N1_CPUACTLR3_EL1_BIT_10 226*54fd6939SJiyong Park msr NEOVERSE_N1_CPUACTLR3_EL1, x1 227*54fd6939SJiyong Park1: 228*54fd6939SJiyong Park ret x17 229*54fd6939SJiyong Parkendfunc errata_n1_1257314_wa 230*54fd6939SJiyong Park 231*54fd6939SJiyong Parkfunc check_errata_1257314 232*54fd6939SJiyong Park /* Applies to <=r3p0 */ 233*54fd6939SJiyong Park mov x1, #0x30 234*54fd6939SJiyong Park b cpu_rev_var_ls 235*54fd6939SJiyong Parkendfunc check_errata_1257314 236*54fd6939SJiyong Park 237*54fd6939SJiyong Park/* -------------------------------------------------- 238*54fd6939SJiyong Park * Errata Workaround for Neoverse N1 Errata #1262606 239*54fd6939SJiyong Park * This applies to revision <=r3p0 of Neoverse N1. 240*54fd6939SJiyong Park * Inputs: 241*54fd6939SJiyong Park * x0: variant[4:7] and revision[0:3] of current cpu. 242*54fd6939SJiyong Park * Shall clobber: x0-x17 243*54fd6939SJiyong Park * -------------------------------------------------- 244*54fd6939SJiyong Park */ 245*54fd6939SJiyong Parkfunc errata_n1_1262606_wa 246*54fd6939SJiyong Park /* Compare x0 against revision r3p0 */ 247*54fd6939SJiyong Park mov x17, x30 248*54fd6939SJiyong Park bl check_errata_1262606 249*54fd6939SJiyong Park cbz x0, 1f 250*54fd6939SJiyong Park mrs x1, NEOVERSE_N1_CPUACTLR_EL1 251*54fd6939SJiyong Park orr x1, x1, NEOVERSE_N1_CPUACTLR_EL1_BIT_13 252*54fd6939SJiyong Park msr NEOVERSE_N1_CPUACTLR_EL1, x1 253*54fd6939SJiyong Park1: 254*54fd6939SJiyong Park ret x17 255*54fd6939SJiyong Parkendfunc errata_n1_1262606_wa 256*54fd6939SJiyong Park 257*54fd6939SJiyong Parkfunc check_errata_1262606 258*54fd6939SJiyong Park /* Applies to <=r3p0 */ 259*54fd6939SJiyong Park mov x1, #0x30 260*54fd6939SJiyong Park b cpu_rev_var_ls 261*54fd6939SJiyong Parkendfunc check_errata_1262606 262*54fd6939SJiyong Park 263*54fd6939SJiyong Park/* -------------------------------------------------- 264*54fd6939SJiyong Park * Errata Workaround for Neoverse N1 Errata #1262888 265*54fd6939SJiyong Park * This applies to revision <=r3p0 of Neoverse N1. 266*54fd6939SJiyong Park * Inputs: 267*54fd6939SJiyong Park * x0: variant[4:7] and revision[0:3] of current cpu. 268*54fd6939SJiyong Park * Shall clobber: x0-x17 269*54fd6939SJiyong Park * -------------------------------------------------- 270*54fd6939SJiyong Park */ 271*54fd6939SJiyong Parkfunc errata_n1_1262888_wa 272*54fd6939SJiyong Park /* Compare x0 against revision r3p0 */ 273*54fd6939SJiyong Park mov x17, x30 274*54fd6939SJiyong Park bl check_errata_1262888 275*54fd6939SJiyong Park cbz x0, 1f 276*54fd6939SJiyong Park mrs x1, NEOVERSE_N1_CPUECTLR_EL1 277*54fd6939SJiyong Park orr x1, x1, NEOVERSE_N1_CPUECTLR_EL1_MM_TLBPF_DIS_BIT 278*54fd6939SJiyong Park msr NEOVERSE_N1_CPUECTLR_EL1, x1 279*54fd6939SJiyong Park1: 280*54fd6939SJiyong Park ret x17 281*54fd6939SJiyong Parkendfunc errata_n1_1262888_wa 282*54fd6939SJiyong Park 283*54fd6939SJiyong Parkfunc check_errata_1262888 284*54fd6939SJiyong Park /* Applies to <=r3p0 */ 285*54fd6939SJiyong Park mov x1, #0x30 286*54fd6939SJiyong Park b cpu_rev_var_ls 287*54fd6939SJiyong Parkendfunc check_errata_1262888 288*54fd6939SJiyong Park 289*54fd6939SJiyong Park/* -------------------------------------------------- 290*54fd6939SJiyong Park * Errata Workaround for Neoverse N1 Errata #1275112 291*54fd6939SJiyong Park * This applies to revision <=r3p0 of Neoverse N1. 292*54fd6939SJiyong Park * Inputs: 293*54fd6939SJiyong Park * x0: variant[4:7] and revision[0:3] of current cpu. 294*54fd6939SJiyong Park * Shall clobber: x0-x17 295*54fd6939SJiyong Park * -------------------------------------------------- 296*54fd6939SJiyong Park */ 297*54fd6939SJiyong Parkfunc errata_n1_1275112_wa 298*54fd6939SJiyong Park /* Compare x0 against revision r3p0 */ 299*54fd6939SJiyong Park mov x17, x30 300*54fd6939SJiyong Park bl check_errata_1275112 301*54fd6939SJiyong Park cbz x0, 1f 302*54fd6939SJiyong Park mrs x1, NEOVERSE_N1_CPUACTLR_EL1 303*54fd6939SJiyong Park orr x1, x1, NEOVERSE_N1_CPUACTLR_EL1_BIT_13 304*54fd6939SJiyong Park msr NEOVERSE_N1_CPUACTLR_EL1, x1 305*54fd6939SJiyong Park1: 306*54fd6939SJiyong Park ret x17 307*54fd6939SJiyong Parkendfunc errata_n1_1275112_wa 308*54fd6939SJiyong Park 309*54fd6939SJiyong Parkfunc check_errata_1275112 310*54fd6939SJiyong Park /* Applies to <=r3p0 */ 311*54fd6939SJiyong Park mov x1, #0x30 312*54fd6939SJiyong Park b cpu_rev_var_ls 313*54fd6939SJiyong Parkendfunc check_errata_1275112 314*54fd6939SJiyong Park 315*54fd6939SJiyong Park/* -------------------------------------------------- 316*54fd6939SJiyong Park * Errata Workaround for Neoverse N1 Erratum 1315703. 317*54fd6939SJiyong Park * This applies to revision <= r3p0 of Neoverse N1. 318*54fd6939SJiyong Park * Inputs: 319*54fd6939SJiyong Park * x0: variant[4:7] and revision[0:3] of current cpu. 320*54fd6939SJiyong Park * Shall clobber: x0-x17 321*54fd6939SJiyong Park * -------------------------------------------------- 322*54fd6939SJiyong Park */ 323*54fd6939SJiyong Parkfunc errata_n1_1315703_wa 324*54fd6939SJiyong Park /* Compare x0 against revision r3p1 */ 325*54fd6939SJiyong Park mov x17, x30 326*54fd6939SJiyong Park bl check_errata_1315703 327*54fd6939SJiyong Park cbz x0, 1f 328*54fd6939SJiyong Park 329*54fd6939SJiyong Park mrs x0, NEOVERSE_N1_CPUACTLR2_EL1 330*54fd6939SJiyong Park orr x0, x0, #NEOVERSE_N1_CPUACTLR2_EL1_BIT_16 331*54fd6939SJiyong Park msr NEOVERSE_N1_CPUACTLR2_EL1, x0 332*54fd6939SJiyong Park 333*54fd6939SJiyong Park1: 334*54fd6939SJiyong Park ret x17 335*54fd6939SJiyong Parkendfunc errata_n1_1315703_wa 336*54fd6939SJiyong Park 337*54fd6939SJiyong Parkfunc check_errata_1315703 338*54fd6939SJiyong Park /* Applies to everything <= r3p0. */ 339*54fd6939SJiyong Park mov x1, #0x30 340*54fd6939SJiyong Park b cpu_rev_var_ls 341*54fd6939SJiyong Parkendfunc check_errata_1315703 342*54fd6939SJiyong Park 343*54fd6939SJiyong Park/* -------------------------------------------------- 344*54fd6939SJiyong Park * Errata Workaround for Neoverse N1 Erratum 1542419. 345*54fd6939SJiyong Park * This applies to revisions r3p0 - r4p0 of Neoverse N1 346*54fd6939SJiyong Park * Inputs: 347*54fd6939SJiyong Park * x0: variant[4:7] and revision[0:3] of current cpu. 348*54fd6939SJiyong Park * Shall clobber: x0-x17 349*54fd6939SJiyong Park * -------------------------------------------------- 350*54fd6939SJiyong Park */ 351*54fd6939SJiyong Parkfunc errata_n1_1542419_wa 352*54fd6939SJiyong Park /* Compare x0 against revision r3p0 and r4p0 */ 353*54fd6939SJiyong Park mov x17, x30 354*54fd6939SJiyong Park bl check_errata_1542419 355*54fd6939SJiyong Park cbz x0, 1f 356*54fd6939SJiyong Park 357*54fd6939SJiyong Park /* Apply instruction patching sequence */ 358*54fd6939SJiyong Park ldr x0, =0x0 359*54fd6939SJiyong Park msr CPUPSELR_EL3, x0 360*54fd6939SJiyong Park ldr x0, =0xEE670D35 361*54fd6939SJiyong Park msr CPUPOR_EL3, x0 362*54fd6939SJiyong Park ldr x0, =0xFFFF0FFF 363*54fd6939SJiyong Park msr CPUPMR_EL3, x0 364*54fd6939SJiyong Park ldr x0, =0x08000020007D 365*54fd6939SJiyong Park msr CPUPCR_EL3, x0 366*54fd6939SJiyong Park isb 367*54fd6939SJiyong Park1: 368*54fd6939SJiyong Park ret x17 369*54fd6939SJiyong Parkendfunc errata_n1_1542419_wa 370*54fd6939SJiyong Park 371*54fd6939SJiyong Parkfunc check_errata_1542419 372*54fd6939SJiyong Park /* Applies to everything r3p0 - r4p0. */ 373*54fd6939SJiyong Park mov x1, #0x30 374*54fd6939SJiyong Park mov x2, #0x40 375*54fd6939SJiyong Park b cpu_rev_var_range 376*54fd6939SJiyong Parkendfunc check_errata_1542419 377*54fd6939SJiyong Park 378*54fd6939SJiyong Park /* -------------------------------------------------- 379*54fd6939SJiyong Park * Errata Workaround for Neoverse N1 Errata #1868343. 380*54fd6939SJiyong Park * This applies to revision <= r4p0 of Neoverse N1. 381*54fd6939SJiyong Park * This workaround is the same as the workaround for 382*54fd6939SJiyong Park * errata 1262606 and 1275112 but applies to a wider 383*54fd6939SJiyong Park * revision range. 384*54fd6939SJiyong Park * Inputs: 385*54fd6939SJiyong Park * x0: variant[4:7] and revision[0:3] of current cpu. 386*54fd6939SJiyong Park * Shall clobber: x0-x17 387*54fd6939SJiyong Park * -------------------------------------------------- 388*54fd6939SJiyong Park */ 389*54fd6939SJiyong Parkfunc errata_n1_1868343_wa 390*54fd6939SJiyong Park /* 391*54fd6939SJiyong Park * Compare x0 against revision r4p0 392*54fd6939SJiyong Park */ 393*54fd6939SJiyong Park mov x17, x30 394*54fd6939SJiyong Park bl check_errata_1868343 395*54fd6939SJiyong Park cbz x0, 1f 396*54fd6939SJiyong Park mrs x1, NEOVERSE_N1_CPUACTLR_EL1 397*54fd6939SJiyong Park orr x1, x1, NEOVERSE_N1_CPUACTLR_EL1_BIT_13 398*54fd6939SJiyong Park msr NEOVERSE_N1_CPUACTLR_EL1, x1 399*54fd6939SJiyong Park isb 400*54fd6939SJiyong Park1: 401*54fd6939SJiyong Park ret x17 402*54fd6939SJiyong Parkendfunc errata_n1_1868343_wa 403*54fd6939SJiyong Park 404*54fd6939SJiyong Parkfunc check_errata_1868343 405*54fd6939SJiyong Park /* Applies to everything <= r4p0 */ 406*54fd6939SJiyong Park mov x1, #0x40 407*54fd6939SJiyong Park b cpu_rev_var_ls 408*54fd6939SJiyong Parkendfunc check_errata_1868343 409*54fd6939SJiyong Park 410*54fd6939SJiyong Park /* -------------------------------------------------- 411*54fd6939SJiyong Park * Errata Workaround for Neoverse N1 Errata #1946160. 412*54fd6939SJiyong Park * This applies to revisions r3p0, r3p1, r4p0, and 413*54fd6939SJiyong Park * r4p1 of Neoverse N1. It also exists in r0p0, r1p0, 414*54fd6939SJiyong Park * and r2p0 but there is no fix in these revisions. 415*54fd6939SJiyong Park * Inputs: 416*54fd6939SJiyong Park * x0: variant[4:7] and revision[0:3] of current cpu. 417*54fd6939SJiyong Park * Shall clobber: x0-x17 418*54fd6939SJiyong Park * -------------------------------------------------- 419*54fd6939SJiyong Park */ 420*54fd6939SJiyong Parkfunc errata_n1_1946160_wa 421*54fd6939SJiyong Park /* 422*54fd6939SJiyong Park * Compare x0 against r3p0 - r4p1 423*54fd6939SJiyong Park */ 424*54fd6939SJiyong Park mov x17, x30 425*54fd6939SJiyong Park bl check_errata_1946160 426*54fd6939SJiyong Park cbz x0, 1f 427*54fd6939SJiyong Park 428*54fd6939SJiyong Park mov x0, #3 429*54fd6939SJiyong Park msr S3_6_C15_C8_0, x0 430*54fd6939SJiyong Park ldr x0, =0x10E3900002 431*54fd6939SJiyong Park msr S3_6_C15_C8_2, x0 432*54fd6939SJiyong Park ldr x0, =0x10FFF00083 433*54fd6939SJiyong Park msr S3_6_C15_C8_3, x0 434*54fd6939SJiyong Park ldr x0, =0x2001003FF 435*54fd6939SJiyong Park msr S3_6_C15_C8_1, x0 436*54fd6939SJiyong Park 437*54fd6939SJiyong Park mov x0, #4 438*54fd6939SJiyong Park msr S3_6_C15_C8_0, x0 439*54fd6939SJiyong Park ldr x0, =0x10E3800082 440*54fd6939SJiyong Park msr S3_6_C15_C8_2, x0 441*54fd6939SJiyong Park ldr x0, =0x10FFF00083 442*54fd6939SJiyong Park msr S3_6_C15_C8_3, x0 443*54fd6939SJiyong Park ldr x0, =0x2001003FF 444*54fd6939SJiyong Park msr S3_6_C15_C8_1, x0 445*54fd6939SJiyong Park 446*54fd6939SJiyong Park mov x0, #5 447*54fd6939SJiyong Park msr S3_6_C15_C8_0, x0 448*54fd6939SJiyong Park ldr x0, =0x10E3800200 449*54fd6939SJiyong Park msr S3_6_C15_C8_2, x0 450*54fd6939SJiyong Park ldr x0, =0x10FFF003E0 451*54fd6939SJiyong Park msr S3_6_C15_C8_3, x0 452*54fd6939SJiyong Park ldr x0, =0x2001003FF 453*54fd6939SJiyong Park msr S3_6_C15_C8_1, x0 454*54fd6939SJiyong Park 455*54fd6939SJiyong Park isb 456*54fd6939SJiyong Park1: 457*54fd6939SJiyong Park ret x17 458*54fd6939SJiyong Parkendfunc errata_n1_1946160_wa 459*54fd6939SJiyong Park 460*54fd6939SJiyong Parkfunc check_errata_1946160 461*54fd6939SJiyong Park /* Applies to r3p0 - r4p1. */ 462*54fd6939SJiyong Park mov x1, #0x30 463*54fd6939SJiyong Park mov x2, #0x41 464*54fd6939SJiyong Park b cpu_rev_var_range 465*54fd6939SJiyong Parkendfunc check_errata_1946160 466*54fd6939SJiyong Park 467*54fd6939SJiyong Parkfunc neoverse_n1_reset_func 468*54fd6939SJiyong Park mov x19, x30 469*54fd6939SJiyong Park 470*54fd6939SJiyong Park bl neoverse_n1_disable_speculative_loads 471*54fd6939SJiyong Park 472*54fd6939SJiyong Park /* Forces all cacheable atomic instructions to be near */ 473*54fd6939SJiyong Park mrs x0, NEOVERSE_N1_CPUACTLR2_EL1 474*54fd6939SJiyong Park orr x0, x0, #NEOVERSE_N1_CPUACTLR2_EL1_BIT_2 475*54fd6939SJiyong Park msr NEOVERSE_N1_CPUACTLR2_EL1, x0 476*54fd6939SJiyong Park isb 477*54fd6939SJiyong Park 478*54fd6939SJiyong Park bl cpu_get_rev_var 479*54fd6939SJiyong Park mov x18, x0 480*54fd6939SJiyong Park 481*54fd6939SJiyong Park#if ERRATA_N1_1043202 482*54fd6939SJiyong Park mov x0, x18 483*54fd6939SJiyong Park bl errata_n1_1043202_wa 484*54fd6939SJiyong Park#endif 485*54fd6939SJiyong Park 486*54fd6939SJiyong Park#if ERRATA_N1_1073348 487*54fd6939SJiyong Park mov x0, x18 488*54fd6939SJiyong Park bl errata_n1_1073348_wa 489*54fd6939SJiyong Park#endif 490*54fd6939SJiyong Park 491*54fd6939SJiyong Park#if ERRATA_N1_1130799 492*54fd6939SJiyong Park mov x0, x18 493*54fd6939SJiyong Park bl errata_n1_1130799_wa 494*54fd6939SJiyong Park#endif 495*54fd6939SJiyong Park 496*54fd6939SJiyong Park#if ERRATA_N1_1165347 497*54fd6939SJiyong Park mov x0, x18 498*54fd6939SJiyong Park bl errata_n1_1165347_wa 499*54fd6939SJiyong Park#endif 500*54fd6939SJiyong Park 501*54fd6939SJiyong Park#if ERRATA_N1_1207823 502*54fd6939SJiyong Park mov x0, x18 503*54fd6939SJiyong Park bl errata_n1_1207823_wa 504*54fd6939SJiyong Park#endif 505*54fd6939SJiyong Park 506*54fd6939SJiyong Park#if ERRATA_N1_1220197 507*54fd6939SJiyong Park mov x0, x18 508*54fd6939SJiyong Park bl errata_n1_1220197_wa 509*54fd6939SJiyong Park#endif 510*54fd6939SJiyong Park 511*54fd6939SJiyong Park#if ERRATA_N1_1257314 512*54fd6939SJiyong Park mov x0, x18 513*54fd6939SJiyong Park bl errata_n1_1257314_wa 514*54fd6939SJiyong Park#endif 515*54fd6939SJiyong Park 516*54fd6939SJiyong Park#if ERRATA_N1_1262606 517*54fd6939SJiyong Park mov x0, x18 518*54fd6939SJiyong Park bl errata_n1_1262606_wa 519*54fd6939SJiyong Park#endif 520*54fd6939SJiyong Park 521*54fd6939SJiyong Park#if ERRATA_N1_1262888 522*54fd6939SJiyong Park mov x0, x18 523*54fd6939SJiyong Park bl errata_n1_1262888_wa 524*54fd6939SJiyong Park#endif 525*54fd6939SJiyong Park 526*54fd6939SJiyong Park#if ERRATA_N1_1275112 527*54fd6939SJiyong Park mov x0, x18 528*54fd6939SJiyong Park bl errata_n1_1275112_wa 529*54fd6939SJiyong Park#endif 530*54fd6939SJiyong Park 531*54fd6939SJiyong Park#if ERRATA_N1_1315703 532*54fd6939SJiyong Park mov x0, x18 533*54fd6939SJiyong Park bl errata_n1_1315703_wa 534*54fd6939SJiyong Park#endif 535*54fd6939SJiyong Park 536*54fd6939SJiyong Park#if ERRATA_N1_1542419 537*54fd6939SJiyong Park mov x0, x18 538*54fd6939SJiyong Park bl errata_n1_1542419_wa 539*54fd6939SJiyong Park#endif 540*54fd6939SJiyong Park 541*54fd6939SJiyong Park#if ERRATA_N1_1868343 542*54fd6939SJiyong Park mov x0, x18 543*54fd6939SJiyong Park bl errata_n1_1868343_wa 544*54fd6939SJiyong Park#endif 545*54fd6939SJiyong Park 546*54fd6939SJiyong Park#if ERRATA_N1_1946160 547*54fd6939SJiyong Park mov x0, x18 548*54fd6939SJiyong Park bl errata_n1_1946160_wa 549*54fd6939SJiyong Park#endif 550*54fd6939SJiyong Park 551*54fd6939SJiyong Park#if ENABLE_AMU 552*54fd6939SJiyong Park /* Make sure accesses from EL0/EL1 and EL2 are not trapped to EL3 */ 553*54fd6939SJiyong Park mrs x0, actlr_el3 554*54fd6939SJiyong Park orr x0, x0, #NEOVERSE_N1_ACTLR_AMEN_BIT 555*54fd6939SJiyong Park msr actlr_el3, x0 556*54fd6939SJiyong Park 557*54fd6939SJiyong Park /* Make sure accesses from EL0/EL1 are not trapped to EL2 */ 558*54fd6939SJiyong Park mrs x0, actlr_el2 559*54fd6939SJiyong Park orr x0, x0, #NEOVERSE_N1_ACTLR_AMEN_BIT 560*54fd6939SJiyong Park msr actlr_el2, x0 561*54fd6939SJiyong Park 562*54fd6939SJiyong Park /* Enable group0 counters */ 563*54fd6939SJiyong Park mov x0, #NEOVERSE_N1_AMU_GROUP0_MASK 564*54fd6939SJiyong Park msr CPUAMCNTENSET_EL0, x0 565*54fd6939SJiyong Park#endif 566*54fd6939SJiyong Park 567*54fd6939SJiyong Park#if NEOVERSE_Nx_EXTERNAL_LLC 568*54fd6939SJiyong Park /* Some system may have External LLC, core needs to be made aware */ 569*54fd6939SJiyong Park mrs x0, NEOVERSE_N1_CPUECTLR_EL1 570*54fd6939SJiyong Park orr x0, x0, NEOVERSE_N1_CPUECTLR_EL1_EXTLLC_BIT 571*54fd6939SJiyong Park msr NEOVERSE_N1_CPUECTLR_EL1, x0 572*54fd6939SJiyong Park#endif 573*54fd6939SJiyong Park 574*54fd6939SJiyong Park#if ERRATA_DSU_936184 575*54fd6939SJiyong Park bl errata_dsu_936184_wa 576*54fd6939SJiyong Park#endif 577*54fd6939SJiyong Park 578*54fd6939SJiyong Park isb 579*54fd6939SJiyong Park ret x19 580*54fd6939SJiyong Parkendfunc neoverse_n1_reset_func 581*54fd6939SJiyong Park 582*54fd6939SJiyong Park /* --------------------------------------------- 583*54fd6939SJiyong Park * HW will do the cache maintenance while powering down 584*54fd6939SJiyong Park * --------------------------------------------- 585*54fd6939SJiyong Park */ 586*54fd6939SJiyong Parkfunc neoverse_n1_core_pwr_dwn 587*54fd6939SJiyong Park /* --------------------------------------------- 588*54fd6939SJiyong Park * Enable CPU power down bit in power control register 589*54fd6939SJiyong Park * --------------------------------------------- 590*54fd6939SJiyong Park */ 591*54fd6939SJiyong Park mrs x0, NEOVERSE_N1_CPUPWRCTLR_EL1 592*54fd6939SJiyong Park orr x0, x0, #NEOVERSE_N1_CORE_PWRDN_EN_MASK 593*54fd6939SJiyong Park msr NEOVERSE_N1_CPUPWRCTLR_EL1, x0 594*54fd6939SJiyong Park isb 595*54fd6939SJiyong Park ret 596*54fd6939SJiyong Parkendfunc neoverse_n1_core_pwr_dwn 597*54fd6939SJiyong Park 598*54fd6939SJiyong Park#if REPORT_ERRATA 599*54fd6939SJiyong Park/* 600*54fd6939SJiyong Park * Errata printing function for Neoverse N1. Must follow AAPCS. 601*54fd6939SJiyong Park */ 602*54fd6939SJiyong Parkfunc neoverse_n1_errata_report 603*54fd6939SJiyong Park stp x8, x30, [sp, #-16]! 604*54fd6939SJiyong Park 605*54fd6939SJiyong Park bl cpu_get_rev_var 606*54fd6939SJiyong Park mov x8, x0 607*54fd6939SJiyong Park 608*54fd6939SJiyong Park /* 609*54fd6939SJiyong Park * Report all errata. The revision-variant information is passed to 610*54fd6939SJiyong Park * checking functions of each errata. 611*54fd6939SJiyong Park */ 612*54fd6939SJiyong Park report_errata ERRATA_N1_1043202, neoverse_n1, 1043202 613*54fd6939SJiyong Park report_errata ERRATA_N1_1073348, neoverse_n1, 1073348 614*54fd6939SJiyong Park report_errata ERRATA_N1_1130799, neoverse_n1, 1130799 615*54fd6939SJiyong Park report_errata ERRATA_N1_1165347, neoverse_n1, 1165347 616*54fd6939SJiyong Park report_errata ERRATA_N1_1207823, neoverse_n1, 1207823 617*54fd6939SJiyong Park report_errata ERRATA_N1_1220197, neoverse_n1, 1220197 618*54fd6939SJiyong Park report_errata ERRATA_N1_1257314, neoverse_n1, 1257314 619*54fd6939SJiyong Park report_errata ERRATA_N1_1262606, neoverse_n1, 1262606 620*54fd6939SJiyong Park report_errata ERRATA_N1_1262888, neoverse_n1, 1262888 621*54fd6939SJiyong Park report_errata ERRATA_N1_1275112, neoverse_n1, 1275112 622*54fd6939SJiyong Park report_errata ERRATA_N1_1315703, neoverse_n1, 1315703 623*54fd6939SJiyong Park report_errata ERRATA_N1_1542419, neoverse_n1, 1542419 624*54fd6939SJiyong Park report_errata ERRATA_N1_1868343, neoverse_n1, 1868343 625*54fd6939SJiyong Park report_errata ERRATA_N1_1946160, neoverse_n1, 1946160 626*54fd6939SJiyong Park report_errata ERRATA_DSU_936184, neoverse_n1, dsu_936184 627*54fd6939SJiyong Park 628*54fd6939SJiyong Park ldp x8, x30, [sp], #16 629*54fd6939SJiyong Park ret 630*54fd6939SJiyong Parkendfunc neoverse_n1_errata_report 631*54fd6939SJiyong Park#endif 632*54fd6939SJiyong Park 633*54fd6939SJiyong Park/* 634*54fd6939SJiyong Park * Handle trap of EL0 IC IVAU instructions to EL3 by executing a TLB 635*54fd6939SJiyong Park * inner-shareable invalidation to an arbitrary address followed by a DSB. 636*54fd6939SJiyong Park * 637*54fd6939SJiyong Park * x1: Exception Syndrome 638*54fd6939SJiyong Park */ 639*54fd6939SJiyong Parkfunc neoverse_n1_errata_ic_trap_handler 640*54fd6939SJiyong Park cmp x1, #NEOVERSE_N1_EC_IC_TRAP 641*54fd6939SJiyong Park b.ne 1f 642*54fd6939SJiyong Park tlbi vae3is, xzr 643*54fd6939SJiyong Park dsb sy 644*54fd6939SJiyong Park 645*54fd6939SJiyong Park # Skip the IC instruction itself 646*54fd6939SJiyong Park mrs x3, elr_el3 647*54fd6939SJiyong Park add x3, x3, #4 648*54fd6939SJiyong Park msr elr_el3, x3 649*54fd6939SJiyong Park 650*54fd6939SJiyong Park ldp x0, x1, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X0] 651*54fd6939SJiyong Park ldp x2, x3, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X2] 652*54fd6939SJiyong Park ldp x4, x5, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X4] 653*54fd6939SJiyong Park ldr x30, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_LR] 654*54fd6939SJiyong Park 655*54fd6939SJiyong Park#if IMAGE_BL31 && RAS_EXTENSION 656*54fd6939SJiyong Park /* 657*54fd6939SJiyong Park * Issue Error Synchronization Barrier to synchronize SErrors before 658*54fd6939SJiyong Park * exiting EL3. We're running with EAs unmasked, so any synchronized 659*54fd6939SJiyong Park * errors would be taken immediately; therefore no need to inspect 660*54fd6939SJiyong Park * DISR_EL1 register. 661*54fd6939SJiyong Park */ 662*54fd6939SJiyong Park esb 663*54fd6939SJiyong Park#endif 664*54fd6939SJiyong Park exception_return 665*54fd6939SJiyong Park1: 666*54fd6939SJiyong Park ret 667*54fd6939SJiyong Parkendfunc neoverse_n1_errata_ic_trap_handler 668*54fd6939SJiyong Park 669*54fd6939SJiyong Park /* --------------------------------------------- 670*54fd6939SJiyong Park * This function provides neoverse_n1 specific 671*54fd6939SJiyong Park * register information for crash reporting. 672*54fd6939SJiyong Park * It needs to return with x6 pointing to 673*54fd6939SJiyong Park * a list of register names in ascii and 674*54fd6939SJiyong Park * x8 - x15 having values of registers to be 675*54fd6939SJiyong Park * reported. 676*54fd6939SJiyong Park * --------------------------------------------- 677*54fd6939SJiyong Park */ 678*54fd6939SJiyong Park.section .rodata.neoverse_n1_regs, "aS" 679*54fd6939SJiyong Parkneoverse_n1_regs: /* The ascii list of register names to be reported */ 680*54fd6939SJiyong Park .asciz "cpuectlr_el1", "" 681*54fd6939SJiyong Park 682*54fd6939SJiyong Parkfunc neoverse_n1_cpu_reg_dump 683*54fd6939SJiyong Park adr x6, neoverse_n1_regs 684*54fd6939SJiyong Park mrs x8, NEOVERSE_N1_CPUECTLR_EL1 685*54fd6939SJiyong Park ret 686*54fd6939SJiyong Parkendfunc neoverse_n1_cpu_reg_dump 687*54fd6939SJiyong Park 688*54fd6939SJiyong Parkdeclare_cpu_ops_eh neoverse_n1, NEOVERSE_N1_MIDR, \ 689*54fd6939SJiyong Park neoverse_n1_reset_func, \ 690*54fd6939SJiyong Park neoverse_n1_errata_ic_trap_handler, \ 691*54fd6939SJiyong Park neoverse_n1_core_pwr_dwn 692