15effe0beSJimmy Brisson/* 289dba82dSBoyan Karatotev * Copyright (c) 2019-2025, Arm Limited. All rights reserved. 367a2ad17SVarun Wadekar * Copyright (c) 2021-2023, NVIDIA Corporation. All rights reserved. 45effe0beSJimmy Brisson * 55effe0beSJimmy Brisson * SPDX-License-Identifier: BSD-3-Clause 65effe0beSJimmy Brisson */ 75effe0beSJimmy Brisson 85effe0beSJimmy Brisson#include <arch.h> 95effe0beSJimmy Brisson#include <asm_macros.S> 105effe0beSJimmy Brisson#include <common/bl_common.h> 115effe0beSJimmy Brisson#include <cortex_a78_ae.h> 125effe0beSJimmy Brisson#include <cpu_macros.S> 135effe0beSJimmy Brisson#include <plat_macros.S> 145f802c88SBipin Ravi#include "wa_cve_2022_23960_bhb_vector.S" 155effe0beSJimmy Brisson 165effe0beSJimmy Brisson/* Hardware handled coherency */ 175effe0beSJimmy Brisson#if HW_ASSISTED_COHERENCY == 0 185effe0beSJimmy Brisson#error "cortex_a78_ae must be compiled with HW_ASSISTED_COHERENCY enabled" 195effe0beSJimmy Brisson#endif 205effe0beSJimmy Brisson 215f802c88SBipin Ravi#if WORKAROUND_CVE_2022_23960 225f802c88SBipin Ravi wa_cve_2022_23960_bhb_vector_table CORTEX_A78_AE_BHB_LOOP_COUNT, cortex_a78_ae 235f802c88SBipin Ravi#endif /* WORKAROUND_CVE_2022_23960 */ 245f802c88SBipin Ravi 2589dba82dSBoyan Karatotevcpu_reset_prologue cortex_a78_ae 2689dba82dSBoyan Karatotev 2727a8bcdcSBoyan Karatotevworkaround_reset_start cortex_a78_ae, ERRATUM(1941500), ERRATA_A78_AE_1941500 2867a2ad17SVarun Wadekar sysreg_bit_set CORTEX_A78_AE_CPUECTLR_EL1, CORTEX_A78_AE_CPUECTLR_EL1_BIT_8 2927a8bcdcSBoyan Karatotevworkaround_reset_end cortex_a78_ae, ERRATUM(1941500) 3047d6f5ffSVarun Wadekar 3165a53848SBoyan Karatotevcheck_erratum_ls cortex_a78_ae, ERRATUM(1941500), CPU_REV(0, 1) 3247d6f5ffSVarun Wadekar 3327a8bcdcSBoyan Karatotevworkaround_reset_start cortex_a78_ae, ERRATUM(1951502), ERRATA_A78_AE_1951502 348913047aSVarun Wadekar msr S3_6_c15_c8_0, xzr 358913047aSVarun Wadekar ldr x0, =0x10E3900002 368913047aSVarun Wadekar msr S3_6_c15_c8_2, x0 378913047aSVarun Wadekar ldr x0, =0x10FFF00083 388913047aSVarun Wadekar msr S3_6_c15_c8_3, x0 398913047aSVarun Wadekar ldr x0, =0x2001003FF 408913047aSVarun Wadekar msr S3_6_c15_c8_1, x0 418913047aSVarun Wadekar 428913047aSVarun Wadekar mov x0, #1 438913047aSVarun Wadekar msr S3_6_c15_c8_0, x0 448913047aSVarun Wadekar ldr x0, =0x10E3800082 458913047aSVarun Wadekar msr S3_6_c15_c8_2, x0 468913047aSVarun Wadekar ldr x0, =0x10FFF00083 478913047aSVarun Wadekar msr S3_6_c15_c8_3, x0 488913047aSVarun Wadekar ldr x0, =0x2001003FF 498913047aSVarun Wadekar msr S3_6_c15_c8_1, x0 508913047aSVarun Wadekar 518913047aSVarun Wadekar mov x0, #2 528913047aSVarun Wadekar msr S3_6_c15_c8_0, x0 538913047aSVarun Wadekar ldr x0, =0x10E3800200 548913047aSVarun Wadekar msr S3_6_c15_c8_2, x0 558913047aSVarun Wadekar ldr x0, =0x10FFF003E0 568913047aSVarun Wadekar msr S3_6_c15_c8_3, x0 578913047aSVarun Wadekar ldr x0, =0x2001003FF 588913047aSVarun Wadekar msr S3_6_c15_c8_1, x0 5927a8bcdcSBoyan Karatotevworkaround_reset_end cortex_a78_ae, ERRATUM(1951502) 608913047aSVarun Wadekar 6165a53848SBoyan Karatotevcheck_erratum_ls cortex_a78_ae, ERRATUM(1951502), CPU_REV(0, 1) 628913047aSVarun Wadekar 6327a8bcdcSBoyan Karatotevworkaround_reset_start cortex_a78_ae, ERRATUM(2376748), ERRATA_A78_AE_2376748 6492e87084SVarun Wadekar /* ------------------------------------------------------- 6592e87084SVarun Wadekar * Set CPUACTLR2_EL1[0] to 1 to force PLDW/PFRM ST to 6692e87084SVarun Wadekar * behave like PLD/PRFM LD and not cause invalidations to 6792e87084SVarun Wadekar * other PE caches. There might be a small performance 6892e87084SVarun Wadekar * degradation to this workaround for certain workloads 6992e87084SVarun Wadekar * that share data. 7092e87084SVarun Wadekar * ------------------------------------------------------- 7192e87084SVarun Wadekar */ 7265a53848SBoyan Karatotev sysreg_bit_set CORTEX_A78_AE_ACTLR2_EL1, CORTEX_A78_AE_ACTLR2_EL1_BIT_0 7327a8bcdcSBoyan Karatotevworkaround_reset_end cortex_a78_ae, ERRATUM(2376748) 7492e87084SVarun Wadekar 75c814619aSSona Mathewcheck_erratum_ls cortex_a78_ae, ERRATUM(2376748), CPU_REV(0, 2) 7692e87084SVarun Wadekar 7727a8bcdcSBoyan Karatotevworkaround_reset_start cortex_a78_ae, ERRATUM(2395408), ERRATA_A78_AE_2395408 783f4d81dfSVarun Wadekar /* -------------------------------------------------------- 793f4d81dfSVarun Wadekar * Disable folding of demand requests into older prefetches 803f4d81dfSVarun Wadekar * with L2 miss requests outstanding by setting the 813f4d81dfSVarun Wadekar * CPUACTLR2_EL1[40] to 1. 823f4d81dfSVarun Wadekar * -------------------------------------------------------- 833f4d81dfSVarun Wadekar */ 8465a53848SBoyan Karatotev sysreg_bit_set CORTEX_A78_AE_ACTLR2_EL1, CORTEX_A78_AE_ACTLR2_EL1_BIT_40 8527a8bcdcSBoyan Karatotevworkaround_reset_end cortex_a78_ae, ERRATUM(2395408) 863f4d81dfSVarun Wadekar 8765a53848SBoyan Karatotevcheck_erratum_ls cortex_a78_ae, ERRATUM(2395408), CPU_REV(0, 1) 883f4d81dfSVarun Wadekar 8927a8bcdcSBoyan Karatotevworkaround_reset_start cortex_a78_ae, CVE(2022, 23960), WORKAROUND_CVE_2022_23960 9027a8bcdcSBoyan Karatotev#if IMAGE_BL31 9127a8bcdcSBoyan Karatotev /* 9227a8bcdcSBoyan Karatotev * The Cortex-A78AE generic vectors are overridden to apply errata 9327a8bcdcSBoyan Karatotev * mitigation on exception entry from lower ELs. 945effe0beSJimmy Brisson */ 9527a8bcdcSBoyan Karatotev override_vector_table wa_cve_vbar_cortex_a78_ae 9627a8bcdcSBoyan Karatotev#endif /* IMAGE_BL31 */ 9727a8bcdcSBoyan Karatotevworkaround_reset_end cortex_a78_ae, CVE(2022, 23960) 988913047aSVarun Wadekar 9927a8bcdcSBoyan Karatotevcheck_erratum_chosen cortex_a78_ae, CVE(2022, 23960), WORKAROUND_CVE_2022_23960 10047d6f5ffSVarun Wadekar 101*85526d4bSArvind Ram Prakash/* Disable hardware page aggregation. Enables mitigation for `CVE-2024-5660` */ 102*85526d4bSArvind Ram Prakashworkaround_reset_start cortex_a78_ae, CVE(2024, 5660), WORKAROUND_CVE_2024_5660 103*85526d4bSArvind Ram Prakash sysreg_bit_set CORTEX_A78_AE_CPUECTLR_EL1, BIT(46) 104*85526d4bSArvind Ram Prakashworkaround_reset_end cortex_a78_ae, CVE(2024, 5660) 105*85526d4bSArvind Ram Prakash 106*85526d4bSArvind Ram Prakashcheck_erratum_ls cortex_a78_ae, CVE(2024, 5660), CPU_REV(0, 3) 107*85526d4bSArvind Ram Prakash 10827a8bcdcSBoyan Karatotevcpu_reset_func_start cortex_a78_ae 109d23acc9eSAndre Przywara#if ENABLE_FEAT_AMU 1105effe0beSJimmy Brisson /* Make sure accesses from EL0/EL1 and EL2 are not trapped to EL3 */ 11165a53848SBoyan Karatotev sysreg_bit_clear actlr_el3, CORTEX_A78_ACTLR_TAM_BIT 1125effe0beSJimmy Brisson 1135effe0beSJimmy Brisson /* Make sure accesses from non-secure EL0/EL1 are not trapped to EL2 */ 11465a53848SBoyan Karatotev sysreg_bit_clear actlr_el2, CORTEX_A78_ACTLR_TAM_BIT 1155effe0beSJimmy Brisson 1165effe0beSJimmy Brisson /* Enable group0 counters */ 1175effe0beSJimmy Brisson mov x0, #CORTEX_A78_AMU_GROUP0_MASK 1185effe0beSJimmy Brisson msr CPUAMCNTENSET0_EL0, x0 1195effe0beSJimmy Brisson 1205effe0beSJimmy Brisson /* Enable group1 counters */ 1215effe0beSJimmy Brisson mov x0, #CORTEX_A78_AMU_GROUP1_MASK 1225effe0beSJimmy Brisson msr CPUAMCNTENSET1_EL0, x0 1238913047aSVarun Wadekar#endif 12427a8bcdcSBoyan Karatotevcpu_reset_func_end cortex_a78_ae 1255effe0beSJimmy Brisson 1265effe0beSJimmy Brisson /* ------------------------------------------------------- 1275effe0beSJimmy Brisson * HW will do the cache maintenance while powering down 1285effe0beSJimmy Brisson * ------------------------------------------------------- 1295effe0beSJimmy Brisson */ 1305effe0beSJimmy Brissonfunc cortex_a78_ae_core_pwr_dwn 1315effe0beSJimmy Brisson /* ------------------------------------------------------- 1325effe0beSJimmy Brisson * Enable CPU power down bit in power control register 1335effe0beSJimmy Brisson * ------------------------------------------------------- 1345effe0beSJimmy Brisson */ 13565a53848SBoyan Karatotev sysreg_bit_set CORTEX_A78_CPUPWRCTLR_EL1, CORTEX_A78_CPUPWRCTLR_EL1_CORE_PWRDN_EN_BIT 1365effe0beSJimmy Brisson isb 1375effe0beSJimmy Brisson ret 1385effe0beSJimmy Brissonendfunc cortex_a78_ae_core_pwr_dwn 1395effe0beSJimmy Brisson 1405effe0beSJimmy Brisson /* ------------------------------------------------------- 1415effe0beSJimmy Brisson * This function provides cortex_a78_ae specific 1425effe0beSJimmy Brisson * register information for crash reporting. 1435effe0beSJimmy Brisson * It needs to return with x6 pointing to 1445effe0beSJimmy Brisson * a list of register names in ascii and 1455effe0beSJimmy Brisson * x8 - x15 having values of registers to be 1465effe0beSJimmy Brisson * reported. 1475effe0beSJimmy Brisson * ------------------------------------------------------- 1485effe0beSJimmy Brisson */ 1495effe0beSJimmy Brisson.section .rodata.cortex_a78_ae_regs, "aS" 1505effe0beSJimmy Brissoncortex_a78_ae_regs: /* The ascii list of register names to be reported */ 1515effe0beSJimmy Brisson .asciz "cpuectlr_el1", "" 1525effe0beSJimmy Brisson 1535effe0beSJimmy Brissonfunc cortex_a78_ae_cpu_reg_dump 1545effe0beSJimmy Brisson adr x6, cortex_a78_ae_regs 1555effe0beSJimmy Brisson mrs x8, CORTEX_A78_CPUECTLR_EL1 1565effe0beSJimmy Brisson ret 1575effe0beSJimmy Brissonendfunc cortex_a78_ae_cpu_reg_dump 1585effe0beSJimmy Brisson 1595effe0beSJimmy Brissondeclare_cpu_ops cortex_a78_ae, CORTEX_A78_AE_MIDR, \ 1608913047aSVarun Wadekar cortex_a78_ae_reset_func, \ 1615effe0beSJimmy Brisson cortex_a78_ae_core_pwr_dwn 162