1*91f16700Schasinglulu/* 2*91f16700Schasinglulu * Copyright (c) 2017-2023, Arm Limited and Contributors. All rights reserved. 3*91f16700Schasinglulu * 4*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause 5*91f16700Schasinglulu */ 6*91f16700Schasinglulu 7*91f16700Schasinglulu#include <arch.h> 8*91f16700Schasinglulu#include <asm_macros.S> 9*91f16700Schasinglulu#include <assert_macros.S> 10*91f16700Schasinglulu#include <common/debug.h> 11*91f16700Schasinglulu#include <cortex_a53.h> 12*91f16700Schasinglulu#include <cpu_macros.S> 13*91f16700Schasinglulu 14*91f16700Schasinglulu#if A53_DISABLE_NON_TEMPORAL_HINT 15*91f16700Schasinglulu#undef ERRATA_A53_836870 16*91f16700Schasinglulu#define ERRATA_A53_836870 1 17*91f16700Schasinglulu#endif 18*91f16700Schasinglulu 19*91f16700Schasinglulu /* --------------------------------------------- 20*91f16700Schasinglulu * Disable intra-cluster coherency 21*91f16700Schasinglulu * --------------------------------------------- 22*91f16700Schasinglulu */ 23*91f16700Schasinglulufunc cortex_a53_disable_smp 24*91f16700Schasinglulu ldcopr16 r0, r1, CORTEX_A53_ECTLR 25*91f16700Schasinglulu bic64_imm r0, r1, CORTEX_A53_ECTLR_SMP_BIT 26*91f16700Schasinglulu stcopr16 r0, r1, CORTEX_A53_ECTLR 27*91f16700Schasinglulu isb 28*91f16700Schasinglulu dsb sy 29*91f16700Schasinglulu bx lr 30*91f16700Schasingluluendfunc cortex_a53_disable_smp 31*91f16700Schasinglulu 32*91f16700Schasinglulu /* --------------------------------------------------- 33*91f16700Schasinglulu * Errata Workaround for Cortex A53 Errata #819472. 34*91f16700Schasinglulu * This applies only to revision <= r0p1 of Cortex A53. 35*91f16700Schasinglulu * --------------------------------------------------- 36*91f16700Schasinglulu */ 37*91f16700Schasinglulufunc check_errata_819472 38*91f16700Schasinglulu /* 39*91f16700Schasinglulu * Even though this is only needed for revision <= r0p1, it 40*91f16700Schasinglulu * is always applied due to limitations of the current 41*91f16700Schasinglulu * errata framework. 42*91f16700Schasinglulu */ 43*91f16700Schasinglulu mov r0, #ERRATA_APPLIES 44*91f16700Schasinglulu bx lr 45*91f16700Schasingluluendfunc check_errata_819472 46*91f16700Schasinglulu 47*91f16700Schasingluluadd_erratum_entry cortex_a53, ERRATUM(819472), ERRATA_A53_819472 48*91f16700Schasinglulu 49*91f16700Schasinglulu /* --------------------------------------------------- 50*91f16700Schasinglulu * Errata Workaround for Cortex A53 Errata #824069. 51*91f16700Schasinglulu * This applies only to revision <= r0p2 of Cortex A53. 52*91f16700Schasinglulu * --------------------------------------------------- 53*91f16700Schasinglulu */ 54*91f16700Schasinglulufunc check_errata_824069 55*91f16700Schasinglulu /* 56*91f16700Schasinglulu * Even though this is only needed for revision <= r0p2, it 57*91f16700Schasinglulu * is always applied due to limitations of the current 58*91f16700Schasinglulu * errata framework. 59*91f16700Schasinglulu */ 60*91f16700Schasinglulu mov r0, #ERRATA_APPLIES 61*91f16700Schasinglulu bx lr 62*91f16700Schasingluluendfunc check_errata_824069 63*91f16700Schasinglulu 64*91f16700Schasingluluadd_erratum_entry cortex_a53, ERRATUM(824069), ERRATA_A53_824069 65*91f16700Schasinglulu 66*91f16700Schasinglulu /* -------------------------------------------------- 67*91f16700Schasinglulu * Errata Workaround for Cortex A53 Errata #826319. 68*91f16700Schasinglulu * This applies only to revision <= r0p2 of Cortex A53. 69*91f16700Schasinglulu * Inputs: 70*91f16700Schasinglulu * r0: variant[4:7] and revision[0:3] of current cpu. 71*91f16700Schasinglulu * Shall clobber: r0-r3 72*91f16700Schasinglulu * -------------------------------------------------- 73*91f16700Schasinglulu */ 74*91f16700Schasinglulufunc errata_a53_826319_wa 75*91f16700Schasinglulu /* 76*91f16700Schasinglulu * Compare r0 against revision r0p2 77*91f16700Schasinglulu */ 78*91f16700Schasinglulu mov r2, lr 79*91f16700Schasinglulu bl check_errata_826319 80*91f16700Schasinglulu mov lr, r2 81*91f16700Schasinglulu cmp r0, #ERRATA_NOT_APPLIES 82*91f16700Schasinglulu beq 1f 83*91f16700Schasinglulu ldcopr r0, CORTEX_A53_L2ACTLR 84*91f16700Schasinglulu bic r0, #CORTEX_A53_L2ACTLR_ENABLE_UNIQUECLEAN 85*91f16700Schasinglulu orr r0, #CORTEX_A53_L2ACTLR_DISABLE_CLEAN_PUSH 86*91f16700Schasinglulu stcopr r0, CORTEX_A53_L2ACTLR 87*91f16700Schasinglulu1: 88*91f16700Schasinglulu bx lr 89*91f16700Schasingluluendfunc errata_a53_826319_wa 90*91f16700Schasinglulu 91*91f16700Schasinglulufunc check_errata_826319 92*91f16700Schasinglulu mov r1, #0x02 93*91f16700Schasinglulu b cpu_rev_var_ls 94*91f16700Schasingluluendfunc check_errata_826319 95*91f16700Schasinglulu 96*91f16700Schasingluluadd_erratum_entry cortex_a53, ERRATUM(826319), ERRATA_A53_826319 97*91f16700Schasinglulu 98*91f16700Schasinglulu /* --------------------------------------------------- 99*91f16700Schasinglulu * Errata Workaround for Cortex A53 Errata #827319. 100*91f16700Schasinglulu * This applies only to revision <= r0p2 of Cortex A53. 101*91f16700Schasinglulu * --------------------------------------------------- 102*91f16700Schasinglulu */ 103*91f16700Schasinglulufunc check_errata_827319 104*91f16700Schasinglulu /* 105*91f16700Schasinglulu * Even though this is only needed for revision <= r0p2, it 106*91f16700Schasinglulu * is always applied due to limitations of the current 107*91f16700Schasinglulu * errata framework. 108*91f16700Schasinglulu */ 109*91f16700Schasinglulu mov r0, #ERRATA_APPLIES 110*91f16700Schasinglulu bx lr 111*91f16700Schasingluluendfunc check_errata_827319 112*91f16700Schasinglulu 113*91f16700Schasingluluadd_erratum_entry cortex_a53, ERRATUM(827319), ERRATA_A53_827319 114*91f16700Schasinglulu 115*91f16700Schasinglulu /* --------------------------------------------------------------------- 116*91f16700Schasinglulu * Disable the cache non-temporal hint. 117*91f16700Schasinglulu * 118*91f16700Schasinglulu * This ignores the Transient allocation hint in the MAIR and treats 119*91f16700Schasinglulu * allocations the same as non-transient allocation types. As a result, 120*91f16700Schasinglulu * the LDNP and STNP instructions in AArch64 behave the same as the 121*91f16700Schasinglulu * equivalent LDP and STP instructions. 122*91f16700Schasinglulu * 123*91f16700Schasinglulu * This is relevant only for revisions <= r0p3 of Cortex-A53. 124*91f16700Schasinglulu * From r0p4 and onwards, the bit to disable the hint is enabled by 125*91f16700Schasinglulu * default at reset. 126*91f16700Schasinglulu * 127*91f16700Schasinglulu * Inputs: 128*91f16700Schasinglulu * r0: variant[4:7] and revision[0:3] of current cpu. 129*91f16700Schasinglulu * Shall clobber: r0-r3 130*91f16700Schasinglulu * --------------------------------------------------------------------- 131*91f16700Schasinglulu */ 132*91f16700Schasinglulufunc a53_disable_non_temporal_hint 133*91f16700Schasinglulu /* 134*91f16700Schasinglulu * Compare r0 against revision r0p3 135*91f16700Schasinglulu */ 136*91f16700Schasinglulu mov r2, lr 137*91f16700Schasinglulu bl check_errata_disable_non_temporal_hint 138*91f16700Schasinglulu mov lr, r2 139*91f16700Schasinglulu cmp r0, #ERRATA_NOT_APPLIES 140*91f16700Schasinglulu beq 1f 141*91f16700Schasinglulu ldcopr16 r0, r1, CORTEX_A53_CPUACTLR 142*91f16700Schasinglulu orr64_imm r0, r1, CORTEX_A53_CPUACTLR_DTAH 143*91f16700Schasinglulu stcopr16 r0, r1, CORTEX_A53_CPUACTLR 144*91f16700Schasinglulu1: 145*91f16700Schasinglulu bx lr 146*91f16700Schasingluluendfunc a53_disable_non_temporal_hint 147*91f16700Schasinglulu 148*91f16700Schasinglulufunc check_errata_disable_non_temporal_hint 149*91f16700Schasinglulu mov r1, #0x03 150*91f16700Schasinglulu b cpu_rev_var_ls 151*91f16700Schasingluluendfunc check_errata_disable_non_temporal_hint 152*91f16700Schasinglulu 153*91f16700Schasingluluadd_erratum_entry cortex_a53, ERRATUM(836870), ERRATA_A53_836870 | A53_DISABLE_NON_TEMPORAL_HINT, \ 154*91f16700Schasinglulu disable_non_temporal_hint 155*91f16700Schasinglulu 156*91f16700Schasinglulu /* -------------------------------------------------- 157*91f16700Schasinglulu * Errata Workaround for Cortex A53 Errata #855873. 158*91f16700Schasinglulu * 159*91f16700Schasinglulu * This applies only to revisions >= r0p3 of Cortex A53. 160*91f16700Schasinglulu * Earlier revisions of the core are affected as well, but don't 161*91f16700Schasinglulu * have the chicken bit in the CPUACTLR register. It is expected that 162*91f16700Schasinglulu * the rich OS takes care of that, especially as the workaround is 163*91f16700Schasinglulu * shared with other erratas in those revisions of the CPU. 164*91f16700Schasinglulu * Inputs: 165*91f16700Schasinglulu * r0: variant[4:7] and revision[0:3] of current cpu. 166*91f16700Schasinglulu * Shall clobber: r0-r3 167*91f16700Schasinglulu * -------------------------------------------------- 168*91f16700Schasinglulu */ 169*91f16700Schasinglulufunc errata_a53_855873_wa 170*91f16700Schasinglulu /* 171*91f16700Schasinglulu * Compare r0 against revision r0p3 and higher 172*91f16700Schasinglulu */ 173*91f16700Schasinglulu mov r2, lr 174*91f16700Schasinglulu bl check_errata_855873 175*91f16700Schasinglulu mov lr, r2 176*91f16700Schasinglulu cmp r0, #ERRATA_NOT_APPLIES 177*91f16700Schasinglulu beq 1f 178*91f16700Schasinglulu ldcopr16 r0, r1, CORTEX_A53_CPUACTLR 179*91f16700Schasinglulu orr64_imm r0, r1, CORTEX_A53_CPUACTLR_ENDCCASCI 180*91f16700Schasinglulu stcopr16 r0, r1, CORTEX_A53_CPUACTLR 181*91f16700Schasinglulu1: 182*91f16700Schasinglulu bx lr 183*91f16700Schasingluluendfunc errata_a53_855873_wa 184*91f16700Schasinglulu 185*91f16700Schasinglulufunc check_errata_855873 186*91f16700Schasinglulu mov r1, #0x03 187*91f16700Schasinglulu b cpu_rev_var_hs 188*91f16700Schasingluluendfunc check_errata_855873 189*91f16700Schasinglulu 190*91f16700Schasingluluadd_erratum_entry cortex_a53, ERRATUM(855873), ERRATA_A53_855873 191*91f16700Schasinglulu 192*91f16700Schasinglulu /* ------------------------------------------------- 193*91f16700Schasinglulu * The CPU Ops reset function for Cortex-A53. 194*91f16700Schasinglulu * Shall clobber: r0-r6 195*91f16700Schasinglulu * ------------------------------------------------- 196*91f16700Schasinglulu */ 197*91f16700Schasinglulufunc cortex_a53_reset_func 198*91f16700Schasinglulu mov r5, lr 199*91f16700Schasinglulu bl cpu_get_rev_var 200*91f16700Schasinglulu mov r4, r0 201*91f16700Schasinglulu 202*91f16700Schasinglulu#if ERRATA_A53_826319 203*91f16700Schasinglulu mov r0, r4 204*91f16700Schasinglulu bl errata_a53_826319_wa 205*91f16700Schasinglulu#endif 206*91f16700Schasinglulu 207*91f16700Schasinglulu#if ERRATA_A53_836870 208*91f16700Schasinglulu mov r0, r4 209*91f16700Schasinglulu bl a53_disable_non_temporal_hint 210*91f16700Schasinglulu#endif 211*91f16700Schasinglulu 212*91f16700Schasinglulu#if ERRATA_A53_855873 213*91f16700Schasinglulu mov r0, r4 214*91f16700Schasinglulu bl errata_a53_855873_wa 215*91f16700Schasinglulu#endif 216*91f16700Schasinglulu 217*91f16700Schasinglulu /* --------------------------------------------- 218*91f16700Schasinglulu * Enable the SMP bit. 219*91f16700Schasinglulu * --------------------------------------------- 220*91f16700Schasinglulu */ 221*91f16700Schasinglulu ldcopr16 r0, r1, CORTEX_A53_ECTLR 222*91f16700Schasinglulu orr64_imm r0, r1, CORTEX_A53_ECTLR_SMP_BIT 223*91f16700Schasinglulu stcopr16 r0, r1, CORTEX_A53_ECTLR 224*91f16700Schasinglulu isb 225*91f16700Schasinglulu bx r5 226*91f16700Schasingluluendfunc cortex_a53_reset_func 227*91f16700Schasinglulu 228*91f16700Schasinglulu /* ---------------------------------------------------- 229*91f16700Schasinglulu * The CPU Ops core power down function for Cortex-A53. 230*91f16700Schasinglulu * ---------------------------------------------------- 231*91f16700Schasinglulu */ 232*91f16700Schasinglulufunc cortex_a53_core_pwr_dwn 233*91f16700Schasinglulu push {r12, lr} 234*91f16700Schasinglulu 235*91f16700Schasinglulu /* Assert if cache is enabled */ 236*91f16700Schasinglulu#if ENABLE_ASSERTIONS 237*91f16700Schasinglulu ldcopr r0, SCTLR 238*91f16700Schasinglulu tst r0, #SCTLR_C_BIT 239*91f16700Schasinglulu ASM_ASSERT(eq) 240*91f16700Schasinglulu#endif 241*91f16700Schasinglulu 242*91f16700Schasinglulu /* --------------------------------------------- 243*91f16700Schasinglulu * Flush L1 caches. 244*91f16700Schasinglulu * --------------------------------------------- 245*91f16700Schasinglulu */ 246*91f16700Schasinglulu mov r0, #DC_OP_CISW 247*91f16700Schasinglulu bl dcsw_op_level1 248*91f16700Schasinglulu 249*91f16700Schasinglulu /* --------------------------------------------- 250*91f16700Schasinglulu * Come out of intra cluster coherency 251*91f16700Schasinglulu * --------------------------------------------- 252*91f16700Schasinglulu */ 253*91f16700Schasinglulu pop {r12, lr} 254*91f16700Schasinglulu b cortex_a53_disable_smp 255*91f16700Schasingluluendfunc cortex_a53_core_pwr_dwn 256*91f16700Schasinglulu 257*91f16700Schasinglulu /* ------------------------------------------------------- 258*91f16700Schasinglulu * The CPU Ops cluster power down function for Cortex-A53. 259*91f16700Schasinglulu * Clobbers: r0-r3 260*91f16700Schasinglulu * ------------------------------------------------------- 261*91f16700Schasinglulu */ 262*91f16700Schasinglulufunc cortex_a53_cluster_pwr_dwn 263*91f16700Schasinglulu push {r12, lr} 264*91f16700Schasinglulu 265*91f16700Schasinglulu /* Assert if cache is enabled */ 266*91f16700Schasinglulu#if ENABLE_ASSERTIONS 267*91f16700Schasinglulu ldcopr r0, SCTLR 268*91f16700Schasinglulu tst r0, #SCTLR_C_BIT 269*91f16700Schasinglulu ASM_ASSERT(eq) 270*91f16700Schasinglulu#endif 271*91f16700Schasinglulu 272*91f16700Schasinglulu /* --------------------------------------------- 273*91f16700Schasinglulu * Flush L1 caches. 274*91f16700Schasinglulu * --------------------------------------------- 275*91f16700Schasinglulu */ 276*91f16700Schasinglulu mov r0, #DC_OP_CISW 277*91f16700Schasinglulu bl dcsw_op_level1 278*91f16700Schasinglulu 279*91f16700Schasinglulu /* --------------------------------------------- 280*91f16700Schasinglulu * Disable the optional ACP. 281*91f16700Schasinglulu * --------------------------------------------- 282*91f16700Schasinglulu */ 283*91f16700Schasinglulu bl plat_disable_acp 284*91f16700Schasinglulu 285*91f16700Schasinglulu /* --------------------------------------------- 286*91f16700Schasinglulu * Flush L2 caches. 287*91f16700Schasinglulu * --------------------------------------------- 288*91f16700Schasinglulu */ 289*91f16700Schasinglulu mov r0, #DC_OP_CISW 290*91f16700Schasinglulu bl dcsw_op_level2 291*91f16700Schasinglulu 292*91f16700Schasinglulu /* --------------------------------------------- 293*91f16700Schasinglulu * Come out of intra cluster coherency 294*91f16700Schasinglulu * --------------------------------------------- 295*91f16700Schasinglulu */ 296*91f16700Schasinglulu pop {r12, lr} 297*91f16700Schasinglulu b cortex_a53_disable_smp 298*91f16700Schasingluluendfunc cortex_a53_cluster_pwr_dwn 299*91f16700Schasinglulu 300*91f16700Schasingluluerrata_report_shim cortex_a53 301*91f16700Schasinglulu 302*91f16700Schasingluludeclare_cpu_ops cortex_a53, CORTEX_A53_MIDR, \ 303*91f16700Schasinglulu cortex_a53_reset_func, \ 304*91f16700Schasinglulu cortex_a53_core_pwr_dwn, \ 305*91f16700Schasinglulu cortex_a53_cluster_pwr_dwn 306