1f363deb6SBalint Dobszay/* 27791ce21SBoyan Karatotev * Copyright (c) 2018-2025, Arm Limited and Contributors. All rights reserved. 3f363deb6SBalint Dobszay * 4f363deb6SBalint Dobszay * SPDX-License-Identifier: BSD-3-Clause 5f363deb6SBalint Dobszay */ 6f363deb6SBalint Dobszay 7f363deb6SBalint Dobszay#include <arch.h> 8f363deb6SBalint Dobszay#include <asm_macros.S> 9f363deb6SBalint Dobszay#include <common/bl_common.h> 10f363deb6SBalint Dobszay#include <cortex_a77.h> 11f363deb6SBalint Dobszay#include <cpu_macros.S> 12f363deb6SBalint Dobszay#include <plat_macros.S> 131fe4a9d1SBipin Ravi#include "wa_cve_2022_23960_bhb_vector.S" 14f363deb6SBalint Dobszay 15f363deb6SBalint Dobszay/* Hardware handled coherency */ 16f363deb6SBalint Dobszay#if HW_ASSISTED_COHERENCY == 0 17f363deb6SBalint Dobszay#error "Cortex-A77 must be compiled with HW_ASSISTED_COHERENCY enabled" 18f363deb6SBalint Dobszay#endif 19f363deb6SBalint Dobszay 2089dba82dSBoyan Karatotevcpu_reset_prologue cortex_a77 2189dba82dSBoyan Karatotev 22f363deb6SBalint Dobszay/* 64-bit only core */ 23f363deb6SBalint Dobszay#if CTX_INCLUDE_AARCH32_REGS == 1 24f363deb6SBalint Dobszay#error "Cortex-A77 supports only AArch64. Compile with CTX_INCLUDE_AARCH32_REGS=0" 25f363deb6SBalint Dobszay#endif 26f363deb6SBalint Dobszay 271fe4a9d1SBipin Ravi#if WORKAROUND_CVE_2022_23960 281fe4a9d1SBipin Ravi wa_cve_2022_23960_bhb_vector_table CORTEX_A77_BHB_LOOP_COUNT, cortex_a77 291fe4a9d1SBipin Ravi#endif /* WORKAROUND_CVE_2022_23960 */ 301fe4a9d1SBipin Ravi 310b3a4b5aSBoyan Karatotevworkaround_reset_start cortex_a77, ERRATUM(1508412), ERRATA_A77_1508412 320b3a4b5aSBoyan Karatotev /* move cpu revision in again and compare against r0p0 */ 330b3a4b5aSBoyan Karatotev mov x0, x7 347791ce21SBoyan Karatotev cpu_rev_var_ls CPU_REV(0, 0) 35aa3efe3dSlaurenw-arm cbz x0, 1f 360b3a4b5aSBoyan Karatotev 37aa3efe3dSlaurenw-arm ldr x0, =0x0 38aa3efe3dSlaurenw-arm msr CORTEX_A77_CPUPSELR_EL3, x0 39aa3efe3dSlaurenw-arm ldr x0, =0x00E8400000 40aa3efe3dSlaurenw-arm msr CORTEX_A77_CPUPOR_EL3, x0 41aa3efe3dSlaurenw-arm ldr x0, =0x00FFE00000 42aa3efe3dSlaurenw-arm msr CORTEX_A77_CPUPMR_EL3, x0 43aa3efe3dSlaurenw-arm ldr x0, =0x4004003FF 44aa3efe3dSlaurenw-arm msr CORTEX_A77_CPUPCR_EL3, x0 45aa3efe3dSlaurenw-arm ldr x0, =0x1 46aa3efe3dSlaurenw-arm msr CORTEX_A77_CPUPSELR_EL3, x0 47aa3efe3dSlaurenw-arm ldr x0, =0x00E8C00040 48aa3efe3dSlaurenw-arm msr CORTEX_A77_CPUPOR_EL3, x0 49aa3efe3dSlaurenw-arm ldr x0, =0x00FFE00040 50aa3efe3dSlaurenw-arm msr CORTEX_A77_CPUPMR_EL3, x0 51aa3efe3dSlaurenw-arm b 2f 52aa3efe3dSlaurenw-arm1: 53aa3efe3dSlaurenw-arm ldr x0, =0x0 54aa3efe3dSlaurenw-arm msr CORTEX_A77_CPUPSELR_EL3, x0 55aa3efe3dSlaurenw-arm ldr x0, =0x00E8400000 56aa3efe3dSlaurenw-arm msr CORTEX_A77_CPUPOR_EL3, x0 57aa3efe3dSlaurenw-arm ldr x0, =0x00FF600000 58aa3efe3dSlaurenw-arm msr CORTEX_A77_CPUPMR_EL3, x0 59aa3efe3dSlaurenw-arm ldr x0, =0x00E8E00080 60aa3efe3dSlaurenw-arm msr CORTEX_A77_CPUPOR2_EL3, x0 61aa3efe3dSlaurenw-arm ldr x0, =0x00FFE000C0 62aa3efe3dSlaurenw-arm msr CORTEX_A77_CPUPMR2_EL3, x0 63aa3efe3dSlaurenw-arm2: 64aa3efe3dSlaurenw-arm ldr x0, =0x04004003FF 65aa3efe3dSlaurenw-arm msr CORTEX_A77_CPUPCR_EL3, x0 660b3a4b5aSBoyan Karatotevworkaround_reset_end cortex_a77, ERRATUM(1508412) 67aa3efe3dSlaurenw-arm 680b3a4b5aSBoyan Karatotevcheck_erratum_ls cortex_a77, ERRATUM(1508412), CPU_REV(1, 0) 69aa3efe3dSlaurenw-arm 700b3a4b5aSBoyan Karatotevworkaround_reset_start cortex_a77, ERRATUM(1791578), ERRATA_A77_1791578 718a4a9165SBoyan Karatotev sysreg_bit_set CORTEX_A77_ACTLR2_EL1, CORTEX_A77_ACTLR2_EL1_BIT_2 720b3a4b5aSBoyan Karatotevworkaround_reset_end cortex_a77, ERRATUM(1791578) 7399787a4cSBoyan Karatotev 740b3a4b5aSBoyan Karatotevcheck_erratum_ls cortex_a77, ERRATUM(1791578), CPU_REV(1, 1) 7599787a4cSBoyan Karatotev 760b3a4b5aSBoyan Karatotevworkaround_reset_start cortex_a77, ERRATUM(1800714), ERRATA_A77_1800714 7799787a4cSBoyan Karatotev /* Disable allocation of splintered pages in the L2 TLB */ 788a4a9165SBoyan Karatotev sysreg_bit_set CORTEX_A77_CPUECTLR_EL1, CORTEX_A77_CPUECTLR_EL1_BIT_53 790b3a4b5aSBoyan Karatotevworkaround_reset_end cortex_a77, ERRATUM(1800714) 8099787a4cSBoyan Karatotev 810b3a4b5aSBoyan Karatotevcheck_erratum_ls cortex_a77, ERRATUM(1800714), CPU_REV(1, 1) 8299787a4cSBoyan Karatotev 830b3a4b5aSBoyan Karatotevworkaround_reset_start cortex_a77, ERRATUM(1925769), ERRATA_A77_1925769 848a4a9165SBoyan Karatotev sysreg_bit_set CORTEX_A77_CPUECTLR_EL1, CORTEX_A77_CPUECTLR_EL1_BIT_8 850b3a4b5aSBoyan Karatotevworkaround_reset_end cortex_a77, ERRATUM(1925769) 8635c75377Sjohpow01 870b3a4b5aSBoyan Karatotevcheck_erratum_ls cortex_a77, ERRATUM(1925769), CPU_REV(1, 1) 8835c75377Sjohpow01 890b3a4b5aSBoyan Karatotevworkaround_reset_start cortex_a77, ERRATUM(1946167), ERRATA_A77_1946167 90a492edc4Slaurenw-arm ldr x0,=0x4 91a492edc4Slaurenw-arm msr CORTEX_A77_CPUPSELR_EL3,x0 92a492edc4Slaurenw-arm ldr x0,=0x10E3900002 93a492edc4Slaurenw-arm msr CORTEX_A77_CPUPOR_EL3,x0 94a492edc4Slaurenw-arm ldr x0,=0x10FFF00083 95a492edc4Slaurenw-arm msr CORTEX_A77_CPUPMR_EL3,x0 96a492edc4Slaurenw-arm ldr x0,=0x2001003FF 97a492edc4Slaurenw-arm msr CORTEX_A77_CPUPCR_EL3,x0 98a492edc4Slaurenw-arm 99a492edc4Slaurenw-arm ldr x0,=0x5 100a492edc4Slaurenw-arm msr CORTEX_A77_CPUPSELR_EL3,x0 101a492edc4Slaurenw-arm ldr x0,=0x10E3800082 102a492edc4Slaurenw-arm msr CORTEX_A77_CPUPOR_EL3,x0 103a492edc4Slaurenw-arm ldr x0,=0x10FFF00083 104a492edc4Slaurenw-arm msr CORTEX_A77_CPUPMR_EL3,x0 105a492edc4Slaurenw-arm ldr x0,=0x2001003FF 106a492edc4Slaurenw-arm msr CORTEX_A77_CPUPCR_EL3,x0 107a492edc4Slaurenw-arm 108a492edc4Slaurenw-arm ldr x0,=0x6 109a492edc4Slaurenw-arm msr CORTEX_A77_CPUPSELR_EL3,x0 110a492edc4Slaurenw-arm ldr x0,=0x10E3800200 111a492edc4Slaurenw-arm msr CORTEX_A77_CPUPOR_EL3,x0 112a492edc4Slaurenw-arm ldr x0,=0x10FFF003E0 113a492edc4Slaurenw-arm msr CORTEX_A77_CPUPMR_EL3,x0 114a492edc4Slaurenw-arm ldr x0,=0x2001003FF 115a492edc4Slaurenw-arm msr CORTEX_A77_CPUPCR_EL3,x0 1160b3a4b5aSBoyan Karatotevworkaround_reset_end cortex_a77, ERRATUM(1946167) 117a492edc4Slaurenw-arm 1180b3a4b5aSBoyan Karatotevcheck_erratum_ls cortex_a77, ERRATUM(1946167), CPU_REV(1, 1) 119a492edc4Slaurenw-arm 1200b3a4b5aSBoyan Karatotevworkaround_reset_start cortex_a77, ERRATUM(2356587), ERRATA_A77_2356587 1218a4a9165SBoyan Karatotev sysreg_bit_set CORTEX_A77_ACTLR2_EL1, CORTEX_A77_ACTLR2_EL1_BIT_0 1220b3a4b5aSBoyan Karatotevworkaround_reset_end cortex_a77, ERRATUM(2356587) 1237bf1a7aaSBipin Ravi 1240b3a4b5aSBoyan Karatotevcheck_erratum_ls cortex_a77, ERRATUM(2356587), CPU_REV(1, 1) 1257bf1a7aaSBipin Ravi 1260b3a4b5aSBoyan Karatotevworkaround_runtime_start cortex_a77, ERRATUM(2743100), ERRATA_A77_2743100 1274fdeaffeSBoyan Karatotev /* dsb before isb of power down sequence */ 1284fdeaffeSBoyan Karatotev dsb sy 1290b3a4b5aSBoyan Karatotevworkaround_runtime_end cortex_a77, ERRATUM(2743100), NO_ISB 1304fdeaffeSBoyan Karatotev 1310b3a4b5aSBoyan Karatotevcheck_erratum_ls cortex_a77, ERRATUM(2743100), CPU_REV(1, 1) 1324fdeaffeSBoyan Karatotev 1330b3a4b5aSBoyan Karatotevworkaround_reset_start cortex_a77, CVE(2022, 23960), WORKAROUND_CVE_2022_23960 1340b3a4b5aSBoyan Karatotev#if IMAGE_BL31 1351fe4a9d1SBipin Ravi /* 1361fe4a9d1SBipin Ravi * The Cortex-A77 generic vectors are overridden to apply errata 1371fe4a9d1SBipin Ravi * mitigation on exception entry from lower ELs. 1381fe4a9d1SBipin Ravi */ 1391fe4a9d1SBipin Ravi adr x0, wa_cve_vbar_cortex_a77 1401fe4a9d1SBipin Ravi msr vbar_el3, x0 1410b3a4b5aSBoyan Karatotev#endif /* IMAGE_BL31 */ 1420b3a4b5aSBoyan Karatotevworkaround_reset_end cortex_a77, CVE(2022, 23960) 1431fe4a9d1SBipin Ravi 1440b3a4b5aSBoyan Karatotevcheck_erratum_chosen cortex_a77, CVE(2022, 23960), WORKAROUND_CVE_2022_23960 14508e2fdbdSBoyan Karatotev 14606f2cfb8SArvind Ram Prakash/* Disable hardware page aggregation. Enables mitigation for `CVE-2024-5660` */ 14706f2cfb8SArvind Ram Prakashworkaround_reset_start cortex_a77, CVE(2024, 5660), WORKAROUND_CVE_2024_5660 14806f2cfb8SArvind Ram Prakash sysreg_bit_set CORTEX_A77_CPUECTLR_EL1, BIT(46) 14906f2cfb8SArvind Ram Prakashworkaround_reset_end cortex_a77, CVE(2024, 5660) 15006f2cfb8SArvind Ram Prakash 15106f2cfb8SArvind Ram Prakashcheck_erratum_ls cortex_a77, CVE(2024, 5660), CPU_REV(1, 1) 15206f2cfb8SArvind Ram Prakash 1530b3a4b5aSBoyan Karatotev /* ------------------------------------------------- 1540b3a4b5aSBoyan Karatotev * The CPU Ops reset function for Cortex-A77. Must follow AAPCS. 1550b3a4b5aSBoyan Karatotev * ------------------------------------------------- 1560b3a4b5aSBoyan Karatotev */ 1570b3a4b5aSBoyan Karatotevcpu_reset_func_start cortex_a77 1580b3a4b5aSBoyan Karatotevcpu_reset_func_end cortex_a77 15962bbfe82Sjohpow01 160f363deb6SBalint Dobszay /* --------------------------------------------- 161f363deb6SBalint Dobszay * HW will do the cache maintenance while powering down 162f363deb6SBalint Dobszay * --------------------------------------------- 163f363deb6SBalint Dobszay */ 164f363deb6SBalint Dobszayfunc cortex_a77_core_pwr_dwn 165f363deb6SBalint Dobszay /* --------------------------------------------- 166f363deb6SBalint Dobszay * Enable CPU power down bit in power control register 167f363deb6SBalint Dobszay * --------------------------------------------- 168f363deb6SBalint Dobszay */ 1698a4a9165SBoyan Karatotev sysreg_bit_set CORTEX_A77_CPUPWRCTLR_EL1, \ 1708a4a9165SBoyan Karatotev CORTEX_A77_CPUPWRCTLR_EL1_CORE_PWRDN_BIT 1718a4a9165SBoyan Karatotev 172*645917abSBoyan Karatotev apply_erratum cortex_a77, ERRATUM(2743100), ERRATA_A77_2743100 1738a4a9165SBoyan Karatotev 174f363deb6SBalint Dobszay isb 175f363deb6SBalint Dobszay ret 176f363deb6SBalint Dobszayendfunc cortex_a77_core_pwr_dwn 177f363deb6SBalint Dobszay 178f363deb6SBalint Dobszay /* --------------------------------------------- 179f363deb6SBalint Dobszay * This function provides Cortex-A77 specific 180f363deb6SBalint Dobszay * register information for crash reporting. 181f363deb6SBalint Dobszay * It needs to return with x6 pointing to 182f363deb6SBalint Dobszay * a list of register names in ascii and 183f363deb6SBalint Dobszay * x8 - x15 having values of registers to be 184f363deb6SBalint Dobszay * reported. 185f363deb6SBalint Dobszay * --------------------------------------------- 186f363deb6SBalint Dobszay */ 187f363deb6SBalint Dobszay.section .rodata.cortex_a77_regs, "aS" 188f363deb6SBalint Dobszaycortex_a77_regs: /* The ascii list of register names to be reported */ 189f363deb6SBalint Dobszay .asciz "cpuectlr_el1", "" 190f363deb6SBalint Dobszay 191f363deb6SBalint Dobszayfunc cortex_a77_cpu_reg_dump 192f363deb6SBalint Dobszay adr x6, cortex_a77_regs 193f363deb6SBalint Dobszay mrs x8, CORTEX_A77_CPUECTLR_EL1 194f363deb6SBalint Dobszay ret 195f363deb6SBalint Dobszayendfunc cortex_a77_cpu_reg_dump 196f363deb6SBalint Dobszay 197f363deb6SBalint Dobszaydeclare_cpu_ops cortex_a77, CORTEX_A77_MIDR, \ 19862bbfe82Sjohpow01 cortex_a77_reset_func, \ 199f363deb6SBalint Dobszay cortex_a77_core_pwr_dwn 200