1/* 2 * Copyright (c) 2014-2017, ARM Limited and Contributors. All rights reserved. 3 * 4 * SPDX-License-Identifier: BSD-3-Clause 5 */ 6#include <arch.h> 7#include <asm_macros.S> 8#include <bl_common.h> 9#include <cortex_a53.h> 10#include <cpu_macros.S> 11#include <debug.h> 12#include <plat_macros.S> 13 14#if A53_DISABLE_NON_TEMPORAL_HINT 15#undef ERRATA_A53_836870 16#define ERRATA_A53_836870 1 17#endif 18 19 /* --------------------------------------------- 20 * Disable L1 data cache and unified L2 cache 21 * --------------------------------------------- 22 */ 23func cortex_a53_disable_dcache 24 mrs x1, sctlr_el3 25 bic x1, x1, #SCTLR_C_BIT 26 msr sctlr_el3, x1 27 isb 28 ret 29endfunc cortex_a53_disable_dcache 30 31 /* --------------------------------------------- 32 * Disable intra-cluster coherency 33 * --------------------------------------------- 34 */ 35func cortex_a53_disable_smp 36 mrs x0, CORTEX_A53_ECTLR_EL1 37 bic x0, x0, #CORTEX_A53_ECTLR_SMP_BIT 38 msr CORTEX_A53_ECTLR_EL1, x0 39 isb 40 dsb sy 41 ret 42endfunc cortex_a53_disable_smp 43 44 /* -------------------------------------------------- 45 * Errata Workaround for Cortex A53 Errata #826319. 46 * This applies only to revision <= r0p2 of Cortex A53. 47 * Inputs: 48 * x0: variant[4:7] and revision[0:3] of current cpu. 49 * Shall clobber: x0-x17 50 * -------------------------------------------------- 51 */ 52func errata_a53_826319_wa 53 /* 54 * Compare x0 against revision r0p2 55 */ 56 mov x17, x30 57 bl check_errata_826319 58 cbz x0, 1f 59 mrs x1, CORTEX_A53_L2ACTLR_EL1 60 bic x1, x1, #CORTEX_A53_L2ACTLR_ENABLE_UNIQUECLEAN 61 orr x1, x1, #CORTEX_A53_L2ACTLR_DISABLE_CLEAN_PUSH 62 msr CORTEX_A53_L2ACTLR_EL1, x1 631: 64 ret x17 65endfunc errata_a53_826319_wa 66 67func check_errata_826319 68 mov x1, #0x02 69 b cpu_rev_var_ls 70endfunc check_errata_826319 71 72 /* --------------------------------------------------------------------- 73 * Disable the cache non-temporal hint. 74 * 75 * This ignores the Transient allocation hint in the MAIR and treats 76 * allocations the same as non-transient allocation types. As a result, 77 * the LDNP and STNP instructions in AArch64 behave the same as the 78 * equivalent LDP and STP instructions. 79 * 80 * This is relevant only for revisions <= r0p3 of Cortex-A53. 81 * From r0p4 and onwards, the bit to disable the hint is enabled by 82 * default at reset. 83 * 84 * Inputs: 85 * x0: variant[4:7] and revision[0:3] of current cpu. 86 * Shall clobber: x0-x17 87 * --------------------------------------------------------------------- 88 */ 89func a53_disable_non_temporal_hint 90 /* 91 * Compare x0 against revision r0p3 92 */ 93 mov x17, x30 94 bl check_errata_disable_non_temporal_hint 95 cbz x0, 1f 96 mrs x1, CORTEX_A53_CPUACTLR_EL1 97 orr x1, x1, #CORTEX_A53_CPUACTLR_EL1_DTAH 98 msr CORTEX_A53_CPUACTLR_EL1, x1 991: 100 ret x17 101endfunc a53_disable_non_temporal_hint 102 103func check_errata_disable_non_temporal_hint 104 mov x1, #0x03 105 b cpu_rev_var_ls 106endfunc check_errata_disable_non_temporal_hint 107 108 /* -------------------------------------------------- 109 * Errata Workaround for Cortex A53 Errata #855873. 110 * 111 * This applies only to revisions >= r0p3 of Cortex A53. 112 * Earlier revisions of the core are affected as well, but don't 113 * have the chicken bit in the CPUACTLR register. It is expected that 114 * the rich OS takes care of that, especially as the workaround is 115 * shared with other erratas in those revisions of the CPU. 116 * Inputs: 117 * x0: variant[4:7] and revision[0:3] of current cpu. 118 * Shall clobber: x0-x17 119 * -------------------------------------------------- 120 */ 121func errata_a53_855873_wa 122 /* 123 * Compare x0 against revision r0p3 and higher 124 */ 125 mov x17, x30 126 bl check_errata_855873 127 cbz x0, 1f 128 129 mrs x1, CORTEX_A53_CPUACTLR_EL1 130 orr x1, x1, #CORTEX_A53_CPUACTLR_EL1_ENDCCASCI 131 msr CORTEX_A53_CPUACTLR_EL1, x1 1321: 133 ret x17 134endfunc errata_a53_855873_wa 135 136func check_errata_855873 137 mov x1, #0x03 138 b cpu_rev_var_hs 139endfunc check_errata_855873 140 141/* 142 * Errata workaround for Cortex A53 Errata #835769. 143 * This applies to revisions <= r0p4 of Cortex A53. 144 * This workaround is statically enabled at build time. 145 */ 146func check_errata_835769 147 mov x1, #0x04 148 b cpu_rev_var_ls 149endfunc check_errata_835769 150 151/* 152 * Errata workaround for Cortex A53 Errata #843419. 153 * This applies to revisions <= r0p4 of Cortex A53. 154 * This workaround is statically enabled at build time. 155 */ 156func check_errata_843419 157 mov x1, #0x04 158 b cpu_rev_var_ls 159endfunc check_errata_843419 160 161 /* ------------------------------------------------- 162 * The CPU Ops reset function for Cortex-A53. 163 * Shall clobber: x0-x19 164 * ------------------------------------------------- 165 */ 166func cortex_a53_reset_func 167 mov x19, x30 168 bl cpu_get_rev_var 169 mov x18, x0 170 171 172#if ERRATA_A53_826319 173 mov x0, x18 174 bl errata_a53_826319_wa 175#endif 176 177#if ERRATA_A53_836870 178 mov x0, x18 179 bl a53_disable_non_temporal_hint 180#endif 181 182#if ERRATA_A53_855873 183 mov x0, x18 184 bl errata_a53_855873_wa 185#endif 186 187 /* --------------------------------------------- 188 * Enable the SMP bit. 189 * --------------------------------------------- 190 */ 191 mrs x0, CORTEX_A53_ECTLR_EL1 192 orr x0, x0, #CORTEX_A53_ECTLR_SMP_BIT 193 msr CORTEX_A53_ECTLR_EL1, x0 194 isb 195 ret x19 196endfunc cortex_a53_reset_func 197 198func cortex_a53_core_pwr_dwn 199 mov x18, x30 200 201 /* --------------------------------------------- 202 * Turn off caches. 203 * --------------------------------------------- 204 */ 205 bl cortex_a53_disable_dcache 206 207 /* --------------------------------------------- 208 * Flush L1 caches. 209 * --------------------------------------------- 210 */ 211 mov x0, #DCCISW 212 bl dcsw_op_level1 213 214 /* --------------------------------------------- 215 * Come out of intra cluster coherency 216 * --------------------------------------------- 217 */ 218 mov x30, x18 219 b cortex_a53_disable_smp 220endfunc cortex_a53_core_pwr_dwn 221 222func cortex_a53_cluster_pwr_dwn 223 mov x18, x30 224 225 /* --------------------------------------------- 226 * Turn off caches. 227 * --------------------------------------------- 228 */ 229 bl cortex_a53_disable_dcache 230 231 /* --------------------------------------------- 232 * Flush L1 caches. 233 * --------------------------------------------- 234 */ 235 mov x0, #DCCISW 236 bl dcsw_op_level1 237 238 /* --------------------------------------------- 239 * Disable the optional ACP. 240 * --------------------------------------------- 241 */ 242 bl plat_disable_acp 243 244 /* --------------------------------------------- 245 * Flush L2 caches. 246 * --------------------------------------------- 247 */ 248 mov x0, #DCCISW 249 bl dcsw_op_level2 250 251 /* --------------------------------------------- 252 * Come out of intra cluster coherency 253 * --------------------------------------------- 254 */ 255 mov x30, x18 256 b cortex_a53_disable_smp 257endfunc cortex_a53_cluster_pwr_dwn 258 259#if REPORT_ERRATA 260/* 261 * Errata printing function for Cortex A53. Must follow AAPCS. 262 */ 263func cortex_a53_errata_report 264 stp x8, x30, [sp, #-16]! 265 266 bl cpu_get_rev_var 267 mov x8, x0 268 269 /* 270 * Report all errata. The revision-variant information is passed to 271 * checking functions of each errata. 272 */ 273 report_errata ERRATA_A53_826319, cortex_a53, 826319 274 report_errata ERRATA_A53_835769, cortex_a53, 835769 275 report_errata ERRATA_A53_836870, cortex_a53, disable_non_temporal_hint 276 report_errata ERRATA_A53_843419, cortex_a53, 843419 277 report_errata ERRATA_A53_855873, cortex_a53, 855873 278 279 ldp x8, x30, [sp], #16 280 ret 281endfunc cortex_a53_errata_report 282#endif 283 284 /* --------------------------------------------- 285 * This function provides cortex_a53 specific 286 * register information for crash reporting. 287 * It needs to return with x6 pointing to 288 * a list of register names in ascii and 289 * x8 - x15 having values of registers to be 290 * reported. 291 * --------------------------------------------- 292 */ 293.section .rodata.cortex_a53_regs, "aS" 294cortex_a53_regs: /* The ascii list of register names to be reported */ 295 .asciz "cpuectlr_el1", "cpumerrsr_el1", "l2merrsr_el1", \ 296 "cpuactlr_el1", "" 297 298func cortex_a53_cpu_reg_dump 299 adr x6, cortex_a53_regs 300 mrs x8, CORTEX_A53_ECTLR_EL1 301 mrs x9, CORTEX_A53_MERRSR_EL1 302 mrs x10, CORTEX_A53_L2MERRSR_EL1 303 mrs x11, CORTEX_A53_CPUACTLR_EL1 304 ret 305endfunc cortex_a53_cpu_reg_dump 306 307declare_cpu_ops cortex_a53, CORTEX_A53_MIDR, \ 308 cortex_a53_reset_func, \ 309 cortex_a53_core_pwr_dwn, \ 310 cortex_a53_cluster_pwr_dwn 311