1dc787588SYatharth Kochar/* 2*3fb52e41SRyan Everett * Copyright (c) 2017-2024, Arm Limited and Contributors. All rights reserved. 3dc787588SYatharth Kochar * 482cb2c1aSdp-arm * SPDX-License-Identifier: BSD-3-Clause 5dc787588SYatharth Kochar */ 609d40e0eSAntonio Nino Diaz 7dc787588SYatharth Kochar#include <arch.h> 8dc787588SYatharth Kochar#include <asm_macros.S> 9dc787588SYatharth Kochar#include <assert_macros.S> 1009d40e0eSAntonio Nino Diaz#include <common/debug.h> 11dc787588SYatharth Kochar#include <cortex_a53.h> 12dc787588SYatharth Kochar#include <cpu_macros.S> 13dc787588SYatharth Kochar 143749d853SDimitris Papastamos#if A53_DISABLE_NON_TEMPORAL_HINT 153749d853SDimitris Papastamos#undef ERRATA_A53_836870 163749d853SDimitris Papastamos#define ERRATA_A53_836870 1 173749d853SDimitris Papastamos#endif 183749d853SDimitris Papastamos 19dc787588SYatharth Kochar /* --------------------------------------------- 20dc787588SYatharth Kochar * Disable intra-cluster coherency 21dc787588SYatharth Kochar * --------------------------------------------- 22dc787588SYatharth Kochar */ 23dc787588SYatharth Kocharfunc cortex_a53_disable_smp 24fb7d32e5SVarun Wadekar ldcopr16 r0, r1, CORTEX_A53_ECTLR 25fb7d32e5SVarun Wadekar bic64_imm r0, r1, CORTEX_A53_ECTLR_SMP_BIT 26fb7d32e5SVarun Wadekar stcopr16 r0, r1, CORTEX_A53_ECTLR 27dc787588SYatharth Kochar isb 28dc787588SYatharth Kochar dsb sy 29dc787588SYatharth Kochar bx lr 30dc787588SYatharth Kocharendfunc cortex_a53_disable_smp 31dc787588SYatharth Kochar 32bd393704SAmbroise Vincent /* --------------------------------------------------- 33bd393704SAmbroise Vincent * Errata Workaround for Cortex A53 Errata #819472. 34bd393704SAmbroise Vincent * This applies only to revision <= r0p1 of Cortex A53. 35bd393704SAmbroise Vincent * --------------------------------------------------- 36bd393704SAmbroise Vincent */ 37bd393704SAmbroise Vincentfunc check_errata_819472 38bd393704SAmbroise Vincent /* 39bd393704SAmbroise Vincent * Even though this is only needed for revision <= r0p1, it 40bd393704SAmbroise Vincent * is always applied due to limitations of the current 41bd393704SAmbroise Vincent * errata framework. 42bd393704SAmbroise Vincent */ 43bd393704SAmbroise Vincent mov r0, #ERRATA_APPLIES 44bd393704SAmbroise Vincent bx lr 45bd393704SAmbroise Vincentendfunc check_errata_819472 46bd393704SAmbroise Vincent 4797b12ae7SJayanth Dodderi Chidanandadd_erratum_entry cortex_a53, ERRATUM(819472), ERRATA_A53_819472 4897b12ae7SJayanth Dodderi Chidanand 49bd393704SAmbroise Vincent /* --------------------------------------------------- 50bd393704SAmbroise Vincent * Errata Workaround for Cortex A53 Errata #824069. 51bd393704SAmbroise Vincent * This applies only to revision <= r0p2 of Cortex A53. 52bd393704SAmbroise Vincent * --------------------------------------------------- 53bd393704SAmbroise Vincent */ 54bd393704SAmbroise Vincentfunc check_errata_824069 55bd393704SAmbroise Vincent /* 56bd393704SAmbroise Vincent * Even though this is only needed for revision <= r0p2, it 57bd393704SAmbroise Vincent * is always applied due to limitations of the current 58bd393704SAmbroise Vincent * errata framework. 59bd393704SAmbroise Vincent */ 60bd393704SAmbroise Vincent mov r0, #ERRATA_APPLIES 61bd393704SAmbroise Vincent bx lr 62bd393704SAmbroise Vincentendfunc check_errata_824069 63bd393704SAmbroise Vincent 6497b12ae7SJayanth Dodderi Chidanandadd_erratum_entry cortex_a53, ERRATUM(824069), ERRATA_A53_824069 6597b12ae7SJayanth Dodderi Chidanand 663749d853SDimitris Papastamos /* -------------------------------------------------- 673749d853SDimitris Papastamos * Errata Workaround for Cortex A53 Errata #826319. 683749d853SDimitris Papastamos * This applies only to revision <= r0p2 of Cortex A53. 693749d853SDimitris Papastamos * Inputs: 703749d853SDimitris Papastamos * r0: variant[4:7] and revision[0:3] of current cpu. 713749d853SDimitris Papastamos * Shall clobber: r0-r3 723749d853SDimitris Papastamos * -------------------------------------------------- 733749d853SDimitris Papastamos */ 743749d853SDimitris Papastamosfunc errata_a53_826319_wa 753749d853SDimitris Papastamos /* 763749d853SDimitris Papastamos * Compare r0 against revision r0p2 773749d853SDimitris Papastamos */ 783749d853SDimitris Papastamos mov r2, lr 793749d853SDimitris Papastamos bl check_errata_826319 803749d853SDimitris Papastamos mov lr, r2 813749d853SDimitris Papastamos cmp r0, #ERRATA_NOT_APPLIES 823749d853SDimitris Papastamos beq 1f 833749d853SDimitris Papastamos ldcopr r0, CORTEX_A53_L2ACTLR 843749d853SDimitris Papastamos bic r0, #CORTEX_A53_L2ACTLR_ENABLE_UNIQUECLEAN 853749d853SDimitris Papastamos orr r0, #CORTEX_A53_L2ACTLR_DISABLE_CLEAN_PUSH 863749d853SDimitris Papastamos stcopr r0, CORTEX_A53_L2ACTLR 873749d853SDimitris Papastamos1: 883749d853SDimitris Papastamos bx lr 893749d853SDimitris Papastamosendfunc errata_a53_826319_wa 903749d853SDimitris Papastamos 913749d853SDimitris Papastamosfunc check_errata_826319 923749d853SDimitris Papastamos mov r1, #0x02 933749d853SDimitris Papastamos b cpu_rev_var_ls 943749d853SDimitris Papastamosendfunc check_errata_826319 953749d853SDimitris Papastamos 9697b12ae7SJayanth Dodderi Chidanandadd_erratum_entry cortex_a53, ERRATUM(826319), ERRATA_A53_826319 9797b12ae7SJayanth Dodderi Chidanand 98bd393704SAmbroise Vincent /* --------------------------------------------------- 99bd393704SAmbroise Vincent * Errata Workaround for Cortex A53 Errata #827319. 100bd393704SAmbroise Vincent * This applies only to revision <= r0p2 of Cortex A53. 101bd393704SAmbroise Vincent * --------------------------------------------------- 102bd393704SAmbroise Vincent */ 103bd393704SAmbroise Vincentfunc check_errata_827319 104bd393704SAmbroise Vincent /* 105bd393704SAmbroise Vincent * Even though this is only needed for revision <= r0p2, it 106bd393704SAmbroise Vincent * is always applied due to limitations of the current 107bd393704SAmbroise Vincent * errata framework. 108bd393704SAmbroise Vincent */ 109bd393704SAmbroise Vincent mov r0, #ERRATA_APPLIES 110bd393704SAmbroise Vincent bx lr 111bd393704SAmbroise Vincentendfunc check_errata_827319 112bd393704SAmbroise Vincent 11397b12ae7SJayanth Dodderi Chidanandadd_erratum_entry cortex_a53, ERRATUM(827319), ERRATA_A53_827319 11497b12ae7SJayanth Dodderi Chidanand 1153749d853SDimitris Papastamos /* --------------------------------------------------------------------- 1163749d853SDimitris Papastamos * Disable the cache non-temporal hint. 1173749d853SDimitris Papastamos * 1183749d853SDimitris Papastamos * This ignores the Transient allocation hint in the MAIR and treats 1193749d853SDimitris Papastamos * allocations the same as non-transient allocation types. As a result, 1203749d853SDimitris Papastamos * the LDNP and STNP instructions in AArch64 behave the same as the 1213749d853SDimitris Papastamos * equivalent LDP and STP instructions. 1223749d853SDimitris Papastamos * 1233749d853SDimitris Papastamos * This is relevant only for revisions <= r0p3 of Cortex-A53. 1243749d853SDimitris Papastamos * From r0p4 and onwards, the bit to disable the hint is enabled by 1253749d853SDimitris Papastamos * default at reset. 1263749d853SDimitris Papastamos * 1273749d853SDimitris Papastamos * Inputs: 1283749d853SDimitris Papastamos * r0: variant[4:7] and revision[0:3] of current cpu. 1293749d853SDimitris Papastamos * Shall clobber: r0-r3 1303749d853SDimitris Papastamos * --------------------------------------------------------------------- 1313749d853SDimitris Papastamos */ 1323749d853SDimitris Papastamosfunc a53_disable_non_temporal_hint 1333749d853SDimitris Papastamos /* 1343749d853SDimitris Papastamos * Compare r0 against revision r0p3 1353749d853SDimitris Papastamos */ 1363749d853SDimitris Papastamos mov r2, lr 1373749d853SDimitris Papastamos bl check_errata_disable_non_temporal_hint 1383749d853SDimitris Papastamos mov lr, r2 1393749d853SDimitris Papastamos cmp r0, #ERRATA_NOT_APPLIES 1403749d853SDimitris Papastamos beq 1f 14180bcf981SEleanor Bonnici ldcopr16 r0, r1, CORTEX_A53_CPUACTLR 14280bcf981SEleanor Bonnici orr64_imm r0, r1, CORTEX_A53_CPUACTLR_DTAH 14380bcf981SEleanor Bonnici stcopr16 r0, r1, CORTEX_A53_CPUACTLR 1443749d853SDimitris Papastamos1: 1453749d853SDimitris Papastamos bx lr 1463749d853SDimitris Papastamosendfunc a53_disable_non_temporal_hint 1473749d853SDimitris Papastamos 1483749d853SDimitris Papastamosfunc check_errata_disable_non_temporal_hint 1493749d853SDimitris Papastamos mov r1, #0x03 1503749d853SDimitris Papastamos b cpu_rev_var_ls 1513749d853SDimitris Papastamosendfunc check_errata_disable_non_temporal_hint 1523749d853SDimitris Papastamos 15397b12ae7SJayanth Dodderi Chidanandadd_erratum_entry cortex_a53, ERRATUM(836870), ERRATA_A53_836870 | A53_DISABLE_NON_TEMPORAL_HINT, \ 15497b12ae7SJayanth Dodderi Chidanand disable_non_temporal_hint 15597b12ae7SJayanth Dodderi Chidanand 1563749d853SDimitris Papastamos /* -------------------------------------------------- 1573749d853SDimitris Papastamos * Errata Workaround for Cortex A53 Errata #855873. 1583749d853SDimitris Papastamos * 1593749d853SDimitris Papastamos * This applies only to revisions >= r0p3 of Cortex A53. 1603749d853SDimitris Papastamos * Earlier revisions of the core are affected as well, but don't 1613749d853SDimitris Papastamos * have the chicken bit in the CPUACTLR register. It is expected that 1623749d853SDimitris Papastamos * the rich OS takes care of that, especially as the workaround is 1633749d853SDimitris Papastamos * shared with other erratas in those revisions of the CPU. 1643749d853SDimitris Papastamos * Inputs: 1653749d853SDimitris Papastamos * r0: variant[4:7] and revision[0:3] of current cpu. 1663749d853SDimitris Papastamos * Shall clobber: r0-r3 1673749d853SDimitris Papastamos * -------------------------------------------------- 1683749d853SDimitris Papastamos */ 1693749d853SDimitris Papastamosfunc errata_a53_855873_wa 1703749d853SDimitris Papastamos /* 1713749d853SDimitris Papastamos * Compare r0 against revision r0p3 and higher 1723749d853SDimitris Papastamos */ 1733749d853SDimitris Papastamos mov r2, lr 1743749d853SDimitris Papastamos bl check_errata_855873 1753749d853SDimitris Papastamos mov lr, r2 1763749d853SDimitris Papastamos cmp r0, #ERRATA_NOT_APPLIES 1773749d853SDimitris Papastamos beq 1f 17880bcf981SEleanor Bonnici ldcopr16 r0, r1, CORTEX_A53_CPUACTLR 17980bcf981SEleanor Bonnici orr64_imm r0, r1, CORTEX_A53_CPUACTLR_ENDCCASCI 18080bcf981SEleanor Bonnici stcopr16 r0, r1, CORTEX_A53_CPUACTLR 1813749d853SDimitris Papastamos1: 1823749d853SDimitris Papastamos bx lr 1833749d853SDimitris Papastamosendfunc errata_a53_855873_wa 1843749d853SDimitris Papastamos 1853749d853SDimitris Papastamosfunc check_errata_855873 1863749d853SDimitris Papastamos mov r1, #0x03 1873749d853SDimitris Papastamos b cpu_rev_var_hs 1883749d853SDimitris Papastamosendfunc check_errata_855873 1893749d853SDimitris Papastamos 19097b12ae7SJayanth Dodderi Chidanandadd_erratum_entry cortex_a53, ERRATUM(855873), ERRATA_A53_855873 19197b12ae7SJayanth Dodderi Chidanand 192dc787588SYatharth Kochar /* ------------------------------------------------- 193dc787588SYatharth Kochar * The CPU Ops reset function for Cortex-A53. 1943749d853SDimitris Papastamos * Shall clobber: r0-r6 195dc787588SYatharth Kochar * ------------------------------------------------- 196dc787588SYatharth Kochar */ 197dc787588SYatharth Kocharfunc cortex_a53_reset_func 1983749d853SDimitris Papastamos mov r5, lr 1993749d853SDimitris Papastamos bl cpu_get_rev_var 2003749d853SDimitris Papastamos mov r4, r0 2013749d853SDimitris Papastamos 2023749d853SDimitris Papastamos#if ERRATA_A53_826319 2033749d853SDimitris Papastamos mov r0, r4 2043749d853SDimitris Papastamos bl errata_a53_826319_wa 2053749d853SDimitris Papastamos#endif 2063749d853SDimitris Papastamos 2073749d853SDimitris Papastamos#if ERRATA_A53_836870 2083749d853SDimitris Papastamos mov r0, r4 2093749d853SDimitris Papastamos bl a53_disable_non_temporal_hint 2103749d853SDimitris Papastamos#endif 2113749d853SDimitris Papastamos 2123749d853SDimitris Papastamos#if ERRATA_A53_855873 2133749d853SDimitris Papastamos mov r0, r4 2143749d853SDimitris Papastamos bl errata_a53_855873_wa 2153749d853SDimitris Papastamos#endif 2163749d853SDimitris Papastamos 217dc787588SYatharth Kochar /* --------------------------------------------- 218dc787588SYatharth Kochar * Enable the SMP bit. 219dc787588SYatharth Kochar * --------------------------------------------- 220dc787588SYatharth Kochar */ 221fb7d32e5SVarun Wadekar ldcopr16 r0, r1, CORTEX_A53_ECTLR 222fb7d32e5SVarun Wadekar orr64_imm r0, r1, CORTEX_A53_ECTLR_SMP_BIT 223fb7d32e5SVarun Wadekar stcopr16 r0, r1, CORTEX_A53_ECTLR 224dc787588SYatharth Kochar isb 2253749d853SDimitris Papastamos bx r5 226dc787588SYatharth Kocharendfunc cortex_a53_reset_func 227dc787588SYatharth Kochar 228dc787588SYatharth Kochar /* ---------------------------------------------------- 229dc787588SYatharth Kochar * The CPU Ops core power down function for Cortex-A53. 230dc787588SYatharth Kochar * ---------------------------------------------------- 231dc787588SYatharth Kochar */ 232dc787588SYatharth Kocharfunc cortex_a53_core_pwr_dwn 233dc787588SYatharth Kochar push {r12, lr} 234dc787588SYatharth Kochar 235dc787588SYatharth Kochar /* Assert if cache is enabled */ 2365f70d8deSMatt Ma#if ENABLE_ASSERTIONS 237dc787588SYatharth Kochar ldcopr r0, SCTLR 238dc787588SYatharth Kochar tst r0, #SCTLR_C_BIT 239dc787588SYatharth Kochar ASM_ASSERT(eq) 240dc787588SYatharth Kochar#endif 241dc787588SYatharth Kochar 242dc787588SYatharth Kochar /* --------------------------------------------- 243dc787588SYatharth Kochar * Flush L1 caches. 244dc787588SYatharth Kochar * --------------------------------------------- 245dc787588SYatharth Kochar */ 246dc787588SYatharth Kochar mov r0, #DC_OP_CISW 247dc787588SYatharth Kochar bl dcsw_op_level1 248dc787588SYatharth Kochar 249dc787588SYatharth Kochar /* --------------------------------------------- 250dc787588SYatharth Kochar * Come out of intra cluster coherency 251dc787588SYatharth Kochar * --------------------------------------------- 252dc787588SYatharth Kochar */ 253dc787588SYatharth Kochar pop {r12, lr} 254dc787588SYatharth Kochar b cortex_a53_disable_smp 255dc787588SYatharth Kocharendfunc cortex_a53_core_pwr_dwn 256dc787588SYatharth Kochar 257dc787588SYatharth Kochar /* ------------------------------------------------------- 258dc787588SYatharth Kochar * The CPU Ops cluster power down function for Cortex-A53. 259dc787588SYatharth Kochar * Clobbers: r0-r3 260dc787588SYatharth Kochar * ------------------------------------------------------- 261dc787588SYatharth Kochar */ 262dc787588SYatharth Kocharfunc cortex_a53_cluster_pwr_dwn 263dc787588SYatharth Kochar push {r12, lr} 264dc787588SYatharth Kochar 265dc787588SYatharth Kochar /* Assert if cache is enabled */ 2665f70d8deSMatt Ma#if ENABLE_ASSERTIONS 267dc787588SYatharth Kochar ldcopr r0, SCTLR 268dc787588SYatharth Kochar tst r0, #SCTLR_C_BIT 269dc787588SYatharth Kochar ASM_ASSERT(eq) 270dc787588SYatharth Kochar#endif 271dc787588SYatharth Kochar 272dc787588SYatharth Kochar /* --------------------------------------------- 273dc787588SYatharth Kochar * Flush L1 caches. 274dc787588SYatharth Kochar * --------------------------------------------- 275dc787588SYatharth Kochar */ 276dc787588SYatharth Kochar mov r0, #DC_OP_CISW 277dc787588SYatharth Kochar bl dcsw_op_level1 278dc787588SYatharth Kochar 279dc787588SYatharth Kochar /* --------------------------------------------- 280dc787588SYatharth Kochar * Disable the optional ACP. 281dc787588SYatharth Kochar * --------------------------------------------- 282dc787588SYatharth Kochar */ 283dc787588SYatharth Kochar bl plat_disable_acp 284dc787588SYatharth Kochar 285dc787588SYatharth Kochar /* --------------------------------------------- 286dc787588SYatharth Kochar * Flush L2 caches. 287dc787588SYatharth Kochar * --------------------------------------------- 288dc787588SYatharth Kochar */ 289dc787588SYatharth Kochar mov r0, #DC_OP_CISW 290dc787588SYatharth Kochar bl dcsw_op_level2 291dc787588SYatharth Kochar 292dc787588SYatharth Kochar /* --------------------------------------------- 293dc787588SYatharth Kochar * Come out of intra cluster coherency 294dc787588SYatharth Kochar * --------------------------------------------- 295dc787588SYatharth Kochar */ 296dc787588SYatharth Kochar pop {r12, lr} 297dc787588SYatharth Kochar b cortex_a53_disable_smp 298dc787588SYatharth Kocharendfunc cortex_a53_cluster_pwr_dwn 299dc787588SYatharth Kochar 300dc787588SYatharth Kochardeclare_cpu_ops cortex_a53, CORTEX_A53_MIDR, \ 301dc787588SYatharth Kochar cortex_a53_reset_func, \ 302dc787588SYatharth Kochar cortex_a53_core_pwr_dwn, \ 303dc787588SYatharth Kochar cortex_a53_cluster_pwr_dwn 304