1/* 2 * Copyright (c) 2018-2022, ARM Limited and Contributors. All rights reserved. 3 * 4 * SPDX-License-Identifier: BSD-3-Clause 5 */ 6 7#include <arch.h> 8#include <asm_macros.S> 9#include <common/bl_common.h> 10#include <cortex_a77.h> 11#include <cpu_macros.S> 12#include <plat_macros.S> 13#include "wa_cve_2022_23960_bhb_vector.S" 14 15/* Hardware handled coherency */ 16#if HW_ASSISTED_COHERENCY == 0 17#error "Cortex-A77 must be compiled with HW_ASSISTED_COHERENCY enabled" 18#endif 19 20/* 64-bit only core */ 21#if CTX_INCLUDE_AARCH32_REGS == 1 22#error "Cortex-A77 supports only AArch64. Compile with CTX_INCLUDE_AARCH32_REGS=0" 23#endif 24 25#if WORKAROUND_CVE_2022_23960 26 wa_cve_2022_23960_bhb_vector_table CORTEX_A77_BHB_LOOP_COUNT, cortex_a77 27#endif /* WORKAROUND_CVE_2022_23960 */ 28 29 /* -------------------------------------------------- 30 * Errata Workaround for Cortex A77 Errata #1508412. 31 * This applies only to revision <= r1p0 of Cortex A77. 32 * Inputs: 33 * x0: variant[4:7] and revision[0:3] of current cpu. 34 * Shall clobber: x0-x17 35 * -------------------------------------------------- 36 */ 37func errata_a77_1508412_wa 38 /* 39 * Compare x0 against revision r1p0 40 */ 41 mov x17, x30 42 bl check_errata_1508412 43 cbz x0, 3f 44 /* 45 * Compare x0 against revision r0p0 46 */ 47 bl check_errata_1508412_0 48 cbz x0, 1f 49 ldr x0, =0x0 50 msr CORTEX_A77_CPUPSELR_EL3, x0 51 ldr x0, =0x00E8400000 52 msr CORTEX_A77_CPUPOR_EL3, x0 53 ldr x0, =0x00FFE00000 54 msr CORTEX_A77_CPUPMR_EL3, x0 55 ldr x0, =0x4004003FF 56 msr CORTEX_A77_CPUPCR_EL3, x0 57 ldr x0, =0x1 58 msr CORTEX_A77_CPUPSELR_EL3, x0 59 ldr x0, =0x00E8C00040 60 msr CORTEX_A77_CPUPOR_EL3, x0 61 ldr x0, =0x00FFE00040 62 msr CORTEX_A77_CPUPMR_EL3, x0 63 b 2f 641: 65 ldr x0, =0x0 66 msr CORTEX_A77_CPUPSELR_EL3, x0 67 ldr x0, =0x00E8400000 68 msr CORTEX_A77_CPUPOR_EL3, x0 69 ldr x0, =0x00FF600000 70 msr CORTEX_A77_CPUPMR_EL3, x0 71 ldr x0, =0x00E8E00080 72 msr CORTEX_A77_CPUPOR2_EL3, x0 73 ldr x0, =0x00FFE000C0 74 msr CORTEX_A77_CPUPMR2_EL3, x0 752: 76 ldr x0, =0x04004003FF 77 msr CORTEX_A77_CPUPCR_EL3, x0 78 isb 793: 80 ret x17 81endfunc errata_a77_1508412_wa 82 83func check_errata_1508412 84 mov x1, #0x10 85 b cpu_rev_var_ls 86endfunc check_errata_1508412 87 88func check_errata_1508412_0 89 mov x1, #0x0 90 b cpu_rev_var_ls 91endfunc check_errata_1508412_0 92 93 /* -------------------------------------------------- 94 * Errata Workaround for Cortex A77 Errata #1925769. 95 * This applies to revision <= r1p1 of Cortex A77. 96 * Inputs: 97 * x0: variant[4:7] and revision[0:3] of current cpu. 98 * Shall clobber: x0-x17 99 * -------------------------------------------------- 100 */ 101func errata_a77_1925769_wa 102 /* Compare x0 against revision <= r1p1 */ 103 mov x17, x30 104 bl check_errata_1925769 105 cbz x0, 1f 106 107 /* Set bit 8 in ECTLR_EL1 */ 108 mrs x1, CORTEX_A77_CPUECTLR_EL1 109 orr x1, x1, #CORTEX_A77_CPUECTLR_EL1_BIT_8 110 msr CORTEX_A77_CPUECTLR_EL1, x1 111 isb 1121: 113 ret x17 114endfunc errata_a77_1925769_wa 115 116func check_errata_1925769 117 /* Applies to everything <= r1p1 */ 118 mov x1, #0x11 119 b cpu_rev_var_ls 120endfunc check_errata_1925769 121 122 /* -------------------------------------------------- 123 * Errata Workaround for Cortex A77 Errata #1946167. 124 * This applies to revision <= r1p1 of Cortex A77. 125 * Inputs: 126 * x0: variant[4:7] and revision[0:3] of current cpu. 127 * Shall clobber: x0-x17 128 * -------------------------------------------------- 129 */ 130func errata_a77_1946167_wa 131 /* Compare x0 against revision <= r1p1 */ 132 mov x17, x30 133 bl check_errata_1946167 134 cbz x0, 1f 135 136 ldr x0,=0x4 137 msr CORTEX_A77_CPUPSELR_EL3,x0 138 ldr x0,=0x10E3900002 139 msr CORTEX_A77_CPUPOR_EL3,x0 140 ldr x0,=0x10FFF00083 141 msr CORTEX_A77_CPUPMR_EL3,x0 142 ldr x0,=0x2001003FF 143 msr CORTEX_A77_CPUPCR_EL3,x0 144 145 ldr x0,=0x5 146 msr CORTEX_A77_CPUPSELR_EL3,x0 147 ldr x0,=0x10E3800082 148 msr CORTEX_A77_CPUPOR_EL3,x0 149 ldr x0,=0x10FFF00083 150 msr CORTEX_A77_CPUPMR_EL3,x0 151 ldr x0,=0x2001003FF 152 msr CORTEX_A77_CPUPCR_EL3,x0 153 154 ldr x0,=0x6 155 msr CORTEX_A77_CPUPSELR_EL3,x0 156 ldr x0,=0x10E3800200 157 msr CORTEX_A77_CPUPOR_EL3,x0 158 ldr x0,=0x10FFF003E0 159 msr CORTEX_A77_CPUPMR_EL3,x0 160 ldr x0,=0x2001003FF 161 msr CORTEX_A77_CPUPCR_EL3,x0 162 163 isb 1641: 165 ret x17 166endfunc errata_a77_1946167_wa 167 168func check_errata_1946167 169 /* Applies to everything <= r1p1 */ 170 mov x1, #0x11 171 b cpu_rev_var_ls 172endfunc check_errata_1946167 173 174 /* -------------------------------------------------- 175 * Errata Workaround for Cortex A77 Errata #1791578. 176 * This applies to revisions r0p0, r1p0, and r1p1 and is still open. 177 * x0: variant[4:7] and revision[0:3] of current cpu. 178 * Shall clobber: x0-x17 179 * -------------------------------------------------- 180 */ 181func errata_a77_1791578_wa 182 /* Check workaround compatibility. */ 183 mov x17, x30 184 bl check_errata_1791578 185 cbz x0, 1f 186 187 /* Set bit 2 in ACTLR2_EL1 */ 188 mrs x1, CORTEX_A77_ACTLR2_EL1 189 orr x1, x1, #CORTEX_A77_ACTLR2_EL1_BIT_2 190 msr CORTEX_A77_ACTLR2_EL1, x1 191 isb 1921: 193 ret x17 194endfunc errata_a77_1791578_wa 195 196func check_errata_1791578 197 /* Applies to r0p0, r1p0, and r1p1 right now */ 198 mov x1, #0x11 199 b cpu_rev_var_ls 200endfunc check_errata_1791578 201 202 /* -------------------------------------------------- 203 * Errata Workaround for Cortex A77 Errata #2356587. 204 * This applies to revisions r0p0, r1p0, and r1p1 and is still open. 205 * x0: variant[4:7] and revision[0:3] of current cpu. 206 * Shall clobber: x0-x17 207 * -------------------------------------------------- 208 */ 209func errata_a77_2356587_wa 210 /* Check workaround compatibility. */ 211 mov x17, x30 212 bl check_errata_2356587 213 cbz x0, 1f 214 215 /* Set bit 0 in ACTLR2_EL1 */ 216 mrs x1, CORTEX_A77_ACTLR2_EL1 217 orr x1, x1, #CORTEX_A77_ACTLR2_EL1_BIT_0 218 msr CORTEX_A77_ACTLR2_EL1, x1 219 isb 2201: 221 ret x17 222endfunc errata_a77_2356587_wa 223 224func check_errata_2356587 225 /* Applies to r0p0, r1p0, and r1p1 right now */ 226 mov x1, #0x11 227 b cpu_rev_var_ls 228endfunc check_errata_2356587 229 230func check_errata_cve_2022_23960 231#if WORKAROUND_CVE_2022_23960 232 mov x0, #ERRATA_APPLIES 233#else 234 mov x0, #ERRATA_MISSING 235#endif 236 ret 237endfunc check_errata_cve_2022_23960 238 239 /* -------------------------------------------------- 240 * Errata Workaround for Cortex A77 Errata #1800714. 241 * This applies to revision <= r1p1 of Cortex A77. 242 * Inputs: 243 * x0: variant[4:7] and revision[0:3] of current cpu. 244 * Shall clobber: x0-x17 245 * -------------------------------------------------- 246 */ 247func errata_a77_1800714_wa 248 /* Compare x0 against revision <= r1p1 */ 249 mov x17, x30 250 bl check_errata_1800714 251 cbz x0, 1f 252 253 /* Disable allocation of splintered pages in the L2 TLB */ 254 mrs x1, CORTEX_A77_CPUECTLR_EL1 255 orr x1, x1, CORTEX_A77_CPUECTLR_EL1_BIT_53 256 msr CORTEX_A77_CPUECTLR_EL1, x1 257 isb 2581: 259 ret x17 260endfunc errata_a77_1800714_wa 261 262func check_errata_1800714 263 /* Applies to everything <= r1p1 */ 264 mov x1, #0x11 265 b cpu_rev_var_ls 266endfunc check_errata_1800714 267 268 /* ------------------------------------------------- 269 * The CPU Ops reset function for Cortex-A77. 270 * Shall clobber: x0-x19 271 * ------------------------------------------------- 272 */ 273func cortex_a77_reset_func 274 mov x19, x30 275 bl cpu_get_rev_var 276 mov x18, x0 277 278#if ERRATA_A77_1508412 279 mov x0, x18 280 bl errata_a77_1508412_wa 281#endif 282 283#if ERRATA_A77_1925769 284 mov x0, x18 285 bl errata_a77_1925769_wa 286#endif 287 288#if ERRATA_A77_1946167 289 mov x0, x18 290 bl errata_a77_1946167_wa 291#endif 292 293#if ERRATA_A77_1791578 294 mov x0, x18 295 bl errata_a77_1791578_wa 296#endif 297 298#if ERRATA_A77_2356587 299 mov x0, x18 300 bl errata_a77_2356587_wa 301#endif 302 303#if IMAGE_BL31 && WORKAROUND_CVE_2022_23960 304 /* 305 * The Cortex-A77 generic vectors are overridden to apply errata 306 * mitigation on exception entry from lower ELs. 307 */ 308 adr x0, wa_cve_vbar_cortex_a77 309 msr vbar_el3, x0 310#endif /* IMAGE_BL31 && WORKAROUND_CVE_2022_23960 */ 311 312#if ERRATA_A77_1800714 313 mov x0, x18 314 bl errata_a77_1800714_wa 315#endif 316 317 isb 318 ret x19 319endfunc cortex_a77_reset_func 320 321 /* --------------------------------------------- 322 * HW will do the cache maintenance while powering down 323 * --------------------------------------------- 324 */ 325func cortex_a77_core_pwr_dwn 326 /* --------------------------------------------- 327 * Enable CPU power down bit in power control register 328 * --------------------------------------------- 329 */ 330 mrs x0, CORTEX_A77_CPUPWRCTLR_EL1 331 orr x0, x0, #CORTEX_A77_CPUPWRCTLR_EL1_CORE_PWRDN_BIT 332 msr CORTEX_A77_CPUPWRCTLR_EL1, x0 333 isb 334 ret 335endfunc cortex_a77_core_pwr_dwn 336 337#if REPORT_ERRATA 338/* 339 * Errata printing function for Cortex-A77. Must follow AAPCS. 340 */ 341func cortex_a77_errata_report 342 stp x8, x30, [sp, #-16]! 343 344 bl cpu_get_rev_var 345 mov x8, x0 346 347 /* 348 * Report all errata. The revision-variant information is passed to 349 * checking functions of each errata. 350 */ 351 report_errata ERRATA_A77_1508412, cortex_a77, 1508412 352 report_errata ERRATA_A77_1791578, cortex_a77, 1791578 353 report_errata ERRATA_A77_1800714, cortex_a77, 1800714 354 report_errata ERRATA_A77_1925769, cortex_a77, 1925769 355 report_errata ERRATA_A77_1946167, cortex_a77, 1946167 356 report_errata ERRATA_A77_2356587, cortex_a77, 2356587 357 report_errata WORKAROUND_CVE_2022_23960, cortex_a77, cve_2022_23960 358 359 ldp x8, x30, [sp], #16 360 ret 361endfunc cortex_a77_errata_report 362#endif 363 364 365 /* --------------------------------------------- 366 * This function provides Cortex-A77 specific 367 * register information for crash reporting. 368 * It needs to return with x6 pointing to 369 * a list of register names in ascii and 370 * x8 - x15 having values of registers to be 371 * reported. 372 * --------------------------------------------- 373 */ 374.section .rodata.cortex_a77_regs, "aS" 375cortex_a77_regs: /* The ascii list of register names to be reported */ 376 .asciz "cpuectlr_el1", "" 377 378func cortex_a77_cpu_reg_dump 379 adr x6, cortex_a77_regs 380 mrs x8, CORTEX_A77_CPUECTLR_EL1 381 ret 382endfunc cortex_a77_cpu_reg_dump 383 384declare_cpu_ops cortex_a77, CORTEX_A77_MIDR, \ 385 cortex_a77_reset_func, \ 386 cortex_a77_core_pwr_dwn 387