1*91f16700Schasinglulu/* 2*91f16700Schasinglulu * Copyright (c) 2019-2023, Arm Limited. All rights reserved. 3*91f16700Schasinglulu * Copyright (c) 2021-2023, NVIDIA Corporation. All rights reserved. 4*91f16700Schasinglulu * 5*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause 6*91f16700Schasinglulu */ 7*91f16700Schasinglulu 8*91f16700Schasinglulu#include <arch.h> 9*91f16700Schasinglulu#include <asm_macros.S> 10*91f16700Schasinglulu#include <common/bl_common.h> 11*91f16700Schasinglulu#include <cortex_a78_ae.h> 12*91f16700Schasinglulu#include <cpu_macros.S> 13*91f16700Schasinglulu#include <plat_macros.S> 14*91f16700Schasinglulu#include "wa_cve_2022_23960_bhb_vector.S" 15*91f16700Schasinglulu 16*91f16700Schasinglulu/* Hardware handled coherency */ 17*91f16700Schasinglulu#if HW_ASSISTED_COHERENCY == 0 18*91f16700Schasinglulu#error "cortex_a78_ae must be compiled with HW_ASSISTED_COHERENCY enabled" 19*91f16700Schasinglulu#endif 20*91f16700Schasinglulu 21*91f16700Schasinglulu#if WORKAROUND_CVE_2022_23960 22*91f16700Schasinglulu wa_cve_2022_23960_bhb_vector_table CORTEX_A78_AE_BHB_LOOP_COUNT, cortex_a78_ae 23*91f16700Schasinglulu#endif /* WORKAROUND_CVE_2022_23960 */ 24*91f16700Schasinglulu 25*91f16700Schasingluluworkaround_reset_start cortex_a78_ae, ERRATUM(1941500), ERRATA_A78_AE_1941500 26*91f16700Schasinglulu sysreg_bit_set CORTEX_A78_AE_CPUECTLR_EL1, CORTEX_A78_AE_CPUECTLR_EL1_BIT_8 27*91f16700Schasingluluworkaround_reset_end cortex_a78_ae, ERRATUM(1941500) 28*91f16700Schasinglulu 29*91f16700Schasinglulucheck_erratum_ls cortex_a78_ae, ERRATUM(1941500), CPU_REV(0, 1) 30*91f16700Schasinglulu 31*91f16700Schasingluluworkaround_reset_start cortex_a78_ae, ERRATUM(1951502), ERRATA_A78_AE_1951502 32*91f16700Schasinglulu msr S3_6_c15_c8_0, xzr 33*91f16700Schasinglulu ldr x0, =0x10E3900002 34*91f16700Schasinglulu msr S3_6_c15_c8_2, x0 35*91f16700Schasinglulu ldr x0, =0x10FFF00083 36*91f16700Schasinglulu msr S3_6_c15_c8_3, x0 37*91f16700Schasinglulu ldr x0, =0x2001003FF 38*91f16700Schasinglulu msr S3_6_c15_c8_1, x0 39*91f16700Schasinglulu 40*91f16700Schasinglulu mov x0, #1 41*91f16700Schasinglulu msr S3_6_c15_c8_0, x0 42*91f16700Schasinglulu ldr x0, =0x10E3800082 43*91f16700Schasinglulu msr S3_6_c15_c8_2, x0 44*91f16700Schasinglulu ldr x0, =0x10FFF00083 45*91f16700Schasinglulu msr S3_6_c15_c8_3, x0 46*91f16700Schasinglulu ldr x0, =0x2001003FF 47*91f16700Schasinglulu msr S3_6_c15_c8_1, x0 48*91f16700Schasinglulu 49*91f16700Schasinglulu mov x0, #2 50*91f16700Schasinglulu msr S3_6_c15_c8_0, x0 51*91f16700Schasinglulu ldr x0, =0x10E3800200 52*91f16700Schasinglulu msr S3_6_c15_c8_2, x0 53*91f16700Schasinglulu ldr x0, =0x10FFF003E0 54*91f16700Schasinglulu msr S3_6_c15_c8_3, x0 55*91f16700Schasinglulu ldr x0, =0x2001003FF 56*91f16700Schasinglulu msr S3_6_c15_c8_1, x0 57*91f16700Schasingluluworkaround_reset_end cortex_a78_ae, ERRATUM(1951502) 58*91f16700Schasinglulu 59*91f16700Schasinglulucheck_erratum_ls cortex_a78_ae, ERRATUM(1951502), CPU_REV(0, 1) 60*91f16700Schasinglulu 61*91f16700Schasingluluworkaround_reset_start cortex_a78_ae, ERRATUM(2376748), ERRATA_A78_AE_2376748 62*91f16700Schasinglulu /* ------------------------------------------------------- 63*91f16700Schasinglulu * Set CPUACTLR2_EL1[0] to 1 to force PLDW/PFRM ST to 64*91f16700Schasinglulu * behave like PLD/PRFM LD and not cause invalidations to 65*91f16700Schasinglulu * other PE caches. There might be a small performance 66*91f16700Schasinglulu * degradation to this workaround for certain workloads 67*91f16700Schasinglulu * that share data. 68*91f16700Schasinglulu * ------------------------------------------------------- 69*91f16700Schasinglulu */ 70*91f16700Schasinglulu sysreg_bit_set CORTEX_A78_AE_ACTLR2_EL1, CORTEX_A78_AE_ACTLR2_EL1_BIT_0 71*91f16700Schasingluluworkaround_reset_end cortex_a78_ae, ERRATUM(2376748) 72*91f16700Schasinglulu 73*91f16700Schasinglulucheck_erratum_ls cortex_a78_ae, ERRATUM(2376748), CPU_REV(0, 2) 74*91f16700Schasinglulu 75*91f16700Schasingluluworkaround_reset_start cortex_a78_ae, ERRATUM(2395408), ERRATA_A78_AE_2395408 76*91f16700Schasinglulu /* -------------------------------------------------------- 77*91f16700Schasinglulu * Disable folding of demand requests into older prefetches 78*91f16700Schasinglulu * with L2 miss requests outstanding by setting the 79*91f16700Schasinglulu * CPUACTLR2_EL1[40] to 1. 80*91f16700Schasinglulu * -------------------------------------------------------- 81*91f16700Schasinglulu */ 82*91f16700Schasinglulu sysreg_bit_set CORTEX_A78_AE_ACTLR2_EL1, CORTEX_A78_AE_ACTLR2_EL1_BIT_40 83*91f16700Schasingluluworkaround_reset_end cortex_a78_ae, ERRATUM(2395408) 84*91f16700Schasinglulu 85*91f16700Schasinglulucheck_erratum_ls cortex_a78_ae, ERRATUM(2395408), CPU_REV(0, 1) 86*91f16700Schasinglulu 87*91f16700Schasingluluworkaround_reset_start cortex_a78_ae, CVE(2022, 23960), WORKAROUND_CVE_2022_23960 88*91f16700Schasinglulu#if IMAGE_BL31 89*91f16700Schasinglulu /* 90*91f16700Schasinglulu * The Cortex-A78AE generic vectors are overridden to apply errata 91*91f16700Schasinglulu * mitigation on exception entry from lower ELs. 92*91f16700Schasinglulu */ 93*91f16700Schasinglulu override_vector_table wa_cve_vbar_cortex_a78_ae 94*91f16700Schasinglulu#endif /* IMAGE_BL31 */ 95*91f16700Schasingluluworkaround_reset_end cortex_a78_ae, CVE(2022, 23960) 96*91f16700Schasinglulu 97*91f16700Schasinglulucheck_erratum_chosen cortex_a78_ae, CVE(2022, 23960), WORKAROUND_CVE_2022_23960 98*91f16700Schasinglulu 99*91f16700Schasinglulucpu_reset_func_start cortex_a78_ae 100*91f16700Schasinglulu#if ENABLE_FEAT_AMU 101*91f16700Schasinglulu /* Make sure accesses from EL0/EL1 and EL2 are not trapped to EL3 */ 102*91f16700Schasinglulu sysreg_bit_clear actlr_el3, CORTEX_A78_ACTLR_TAM_BIT 103*91f16700Schasinglulu 104*91f16700Schasinglulu /* Make sure accesses from non-secure EL0/EL1 are not trapped to EL2 */ 105*91f16700Schasinglulu sysreg_bit_clear actlr_el2, CORTEX_A78_ACTLR_TAM_BIT 106*91f16700Schasinglulu 107*91f16700Schasinglulu /* Enable group0 counters */ 108*91f16700Schasinglulu mov x0, #CORTEX_A78_AMU_GROUP0_MASK 109*91f16700Schasinglulu msr CPUAMCNTENSET0_EL0, x0 110*91f16700Schasinglulu 111*91f16700Schasinglulu /* Enable group1 counters */ 112*91f16700Schasinglulu mov x0, #CORTEX_A78_AMU_GROUP1_MASK 113*91f16700Schasinglulu msr CPUAMCNTENSET1_EL0, x0 114*91f16700Schasinglulu#endif 115*91f16700Schasinglulucpu_reset_func_end cortex_a78_ae 116*91f16700Schasinglulu 117*91f16700Schasinglulu /* ------------------------------------------------------- 118*91f16700Schasinglulu * HW will do the cache maintenance while powering down 119*91f16700Schasinglulu * ------------------------------------------------------- 120*91f16700Schasinglulu */ 121*91f16700Schasinglulufunc cortex_a78_ae_core_pwr_dwn 122*91f16700Schasinglulu /* ------------------------------------------------------- 123*91f16700Schasinglulu * Enable CPU power down bit in power control register 124*91f16700Schasinglulu * ------------------------------------------------------- 125*91f16700Schasinglulu */ 126*91f16700Schasinglulu sysreg_bit_set CORTEX_A78_CPUPWRCTLR_EL1, CORTEX_A78_CPUPWRCTLR_EL1_CORE_PWRDN_EN_BIT 127*91f16700Schasinglulu isb 128*91f16700Schasinglulu ret 129*91f16700Schasingluluendfunc cortex_a78_ae_core_pwr_dwn 130*91f16700Schasinglulu 131*91f16700Schasingluluerrata_report_shim cortex_a78_ae 132*91f16700Schasinglulu 133*91f16700Schasinglulu /* ------------------------------------------------------- 134*91f16700Schasinglulu * This function provides cortex_a78_ae specific 135*91f16700Schasinglulu * register information for crash reporting. 136*91f16700Schasinglulu * It needs to return with x6 pointing to 137*91f16700Schasinglulu * a list of register names in ascii and 138*91f16700Schasinglulu * x8 - x15 having values of registers to be 139*91f16700Schasinglulu * reported. 140*91f16700Schasinglulu * ------------------------------------------------------- 141*91f16700Schasinglulu */ 142*91f16700Schasinglulu.section .rodata.cortex_a78_ae_regs, "aS" 143*91f16700Schasinglulucortex_a78_ae_regs: /* The ascii list of register names to be reported */ 144*91f16700Schasinglulu .asciz "cpuectlr_el1", "" 145*91f16700Schasinglulu 146*91f16700Schasinglulufunc cortex_a78_ae_cpu_reg_dump 147*91f16700Schasinglulu adr x6, cortex_a78_ae_regs 148*91f16700Schasinglulu mrs x8, CORTEX_A78_CPUECTLR_EL1 149*91f16700Schasinglulu ret 150*91f16700Schasingluluendfunc cortex_a78_ae_cpu_reg_dump 151*91f16700Schasinglulu 152*91f16700Schasingluludeclare_cpu_ops cortex_a78_ae, CORTEX_A78_AE_MIDR, \ 153*91f16700Schasinglulu cortex_a78_ae_reset_func, \ 154*91f16700Schasinglulu cortex_a78_ae_core_pwr_dwn 155