1 /* 2 * Copyright (c) 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 <assert_macros.S> 9 #include <cortex_a72.h> 10 #include <cpu_macros.S> 11 #include <debug.h> 12 13 /* --------------------------------------------- 14 * Disable all types of L2 prefetches. 15 * --------------------------------------------- 16 */ 17 func cortex_a72_disable_l2_prefetch 18 ldcopr16 r0, r1, CORTEX_A72_ECTLR 19 orr64_imm r0, r1, CORTEX_A72_ECTLR_DIS_TWD_ACC_PFTCH_BIT 20 bic64_imm r0, r1, (CORTEX_A72_ECTLR_L2_IPFTCH_DIST_MASK | \ 21 CORTEX_A72_ECTLR_L2_DPFTCH_DIST_MASK) 22 stcopr16 r0, r1, CORTEX_A72_ECTLR 23 isb 24 bx lr 25 endfunc cortex_a72_disable_l2_prefetch 26 27 /* --------------------------------------------- 28 * Disable the load-store hardware prefetcher. 29 * --------------------------------------------- 30 */ 31 func cortex_a72_disable_hw_prefetcher 32 ldcopr16 r0, r1, CORTEX_A72_CPUACTLR 33 orr64_imm r0, r1, CORTEX_A72_CPUACTLR_DISABLE_L1_DCACHE_HW_PFTCH 34 stcopr16 r0, r1, CORTEX_A72_CPUACTLR 35 isb 36 dsb ish 37 bx lr 38 endfunc cortex_a72_disable_hw_prefetcher 39 40 /* --------------------------------------------- 41 * Disable intra-cluster coherency 42 * Clobbers: r0-r1 43 * --------------------------------------------- 44 */ 45 func cortex_a72_disable_smp 46 ldcopr16 r0, r1, CORTEX_A72_ECTLR 47 bic64_imm r0, r1, CORTEX_A72_ECTLR_SMP_BIT 48 stcopr16 r0, r1, CORTEX_A72_ECTLR 49 bx lr 50 endfunc cortex_a72_disable_smp 51 52 /* --------------------------------------------- 53 * Disable debug interfaces 54 * --------------------------------------------- 55 */ 56 func cortex_a72_disable_ext_debug 57 mov r0, #1 58 stcopr r0, DBGOSDLR 59 isb 60 dsb sy 61 bx lr 62 endfunc cortex_a72_disable_ext_debug 63 64 /* --------------------------------------------------- 65 * Errata Workaround for Cortex A72 Errata #859971. 66 * This applies only to revision <= r0p3 of Cortex A72. 67 * Inputs: 68 * r0: variant[4:7] and revision[0:3] of current cpu. 69 * Shall clobber: r0-r3 70 * --------------------------------------------------- 71 */ 72 func errata_a72_859971_wa 73 mov r2,lr 74 bl check_errata_859971 75 mov lr, r2 76 cmp r0, #ERRATA_NOT_APPLIES 77 beq 1f 78 ldcopr16 r0, r1, CORTEX_A72_CPUACTLR 79 orr64_imm r1, r1, CORTEX_A72_CPUACTLR_DIS_INSTR_PREFETCH 80 stcopr16 r0, r1, CORTEX_A72_CPUACTLR 81 1: 82 bx lr 83 endfunc errata_a72_859971_wa 84 85 func check_errata_859971 86 mov r1, #0x03 87 b cpu_rev_var_ls 88 endfunc check_errata_859971 89 90 91 /* ------------------------------------------------- 92 * The CPU Ops reset function for Cortex-A72. 93 * ------------------------------------------------- 94 */ 95 func cortex_a72_reset_func 96 mov r5, lr 97 bl cpu_get_rev_var 98 mov r4, r0 99 100 #if ERRATA_A72_859971 101 mov r0, r4 102 bl errata_a72_859971_wa 103 #endif 104 /* --------------------------------------------- 105 * Enable the SMP bit. 106 * --------------------------------------------- 107 */ 108 ldcopr16 r0, r1, CORTEX_A72_ECTLR 109 orr64_imm r0, r1, CORTEX_A72_ECTLR_SMP_BIT 110 stcopr16 r0, r1, CORTEX_A72_ECTLR 111 isb 112 bx lr 113 endfunc cortex_a72_reset_func 114 115 /* ---------------------------------------------------- 116 * The CPU Ops core power down function for Cortex-A72. 117 * ---------------------------------------------------- 118 */ 119 func cortex_a72_core_pwr_dwn 120 push {r12, lr} 121 122 /* Assert if cache is enabled */ 123 #if ASM_ASSERTION 124 ldcopr r0, SCTLR 125 tst r0, #SCTLR_C_BIT 126 ASM_ASSERT(eq) 127 #endif 128 129 /* --------------------------------------------- 130 * Disable the L2 prefetches. 131 * --------------------------------------------- 132 */ 133 bl cortex_a72_disable_l2_prefetch 134 135 /* --------------------------------------------- 136 * Disable the load-store hardware prefetcher. 137 * --------------------------------------------- 138 */ 139 bl cortex_a72_disable_hw_prefetcher 140 141 /* --------------------------------------------- 142 * Flush L1 caches. 143 * --------------------------------------------- 144 */ 145 mov r0, #DC_OP_CISW 146 bl dcsw_op_level1 147 148 /* --------------------------------------------- 149 * Come out of intra cluster coherency 150 * --------------------------------------------- 151 */ 152 bl cortex_a72_disable_smp 153 154 /* --------------------------------------------- 155 * Force the debug interfaces to be quiescent 156 * --------------------------------------------- 157 */ 158 pop {r12, lr} 159 b cortex_a72_disable_ext_debug 160 endfunc cortex_a72_core_pwr_dwn 161 162 /* ------------------------------------------------------- 163 * The CPU Ops cluster power down function for Cortex-A72. 164 * ------------------------------------------------------- 165 */ 166 func cortex_a72_cluster_pwr_dwn 167 push {r12, lr} 168 169 /* Assert if cache is enabled */ 170 #if ASM_ASSERTION 171 ldcopr r0, SCTLR 172 tst r0, #SCTLR_C_BIT 173 ASM_ASSERT(eq) 174 #endif 175 176 /* --------------------------------------------- 177 * Disable the L2 prefetches. 178 * --------------------------------------------- 179 */ 180 bl cortex_a72_disable_l2_prefetch 181 182 /* --------------------------------------------- 183 * Disable the load-store hardware prefetcher. 184 * --------------------------------------------- 185 */ 186 bl cortex_a72_disable_hw_prefetcher 187 188 #if !SKIP_A72_L1_FLUSH_PWR_DWN 189 /* --------------------------------------------- 190 * Flush L1 caches. 191 * --------------------------------------------- 192 */ 193 mov r0, #DC_OP_CISW 194 bl dcsw_op_level1 195 #endif 196 197 /* --------------------------------------------- 198 * Disable the optional ACP. 199 * --------------------------------------------- 200 */ 201 bl plat_disable_acp 202 203 /* ------------------------------------------------- 204 * Flush the L2 caches. 205 * ------------------------------------------------- 206 */ 207 mov r0, #DC_OP_CISW 208 bl dcsw_op_level2 209 210 /* --------------------------------------------- 211 * Come out of intra cluster coherency 212 * --------------------------------------------- 213 */ 214 bl cortex_a72_disable_smp 215 216 /* --------------------------------------------- 217 * Force the debug interfaces to be quiescent 218 * --------------------------------------------- 219 */ 220 pop {r12, lr} 221 b cortex_a72_disable_ext_debug 222 endfunc cortex_a72_cluster_pwr_dwn 223 224 #if REPORT_ERRATA 225 /* 226 * Errata printing function for Cortex A72. Must follow AAPCS. 227 */ 228 func cortex_a72_errata_report 229 push {r12, lr} 230 231 bl cpu_get_rev_var 232 mov r4, r0 233 234 /* 235 * Report all errata. The revision-variant information is passed to 236 * checking functions of each errata. 237 */ 238 report_errata ERRATA_A72_859971, cortex_a72, 859971 239 240 pop {r12, lr} 241 bx lr 242 endfunc cortex_a72_errata_report 243 #endif 244 245 declare_cpu_ops cortex_a72, CORTEX_A72_MIDR, \ 246 cortex_a72_reset_func, \ 247 cortex_a72_core_pwr_dwn, \ 248 cortex_a72_cluster_pwr_dwn 249