1*91f16700Schasinglulu/* 2*91f16700Schasinglulu * Copyright (c) 2018-2023, Arm Limited and Contributors. All rights reserved. 3*91f16700Schasinglulu * 4*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause 5*91f16700Schasinglulu */ 6*91f16700Schasinglulu 7*91f16700Schasinglulu#include <arch.h> 8*91f16700Schasinglulu#include <asm_macros.S> 9*91f16700Schasinglulu#include <common/bl_common.h> 10*91f16700Schasinglulu#include <cortex_a77.h> 11*91f16700Schasinglulu#include <cpu_macros.S> 12*91f16700Schasinglulu#include <plat_macros.S> 13*91f16700Schasinglulu#include "wa_cve_2022_23960_bhb_vector.S" 14*91f16700Schasinglulu 15*91f16700Schasinglulu/* Hardware handled coherency */ 16*91f16700Schasinglulu#if HW_ASSISTED_COHERENCY == 0 17*91f16700Schasinglulu#error "Cortex-A77 must be compiled with HW_ASSISTED_COHERENCY enabled" 18*91f16700Schasinglulu#endif 19*91f16700Schasinglulu 20*91f16700Schasinglulu/* 64-bit only core */ 21*91f16700Schasinglulu#if CTX_INCLUDE_AARCH32_REGS == 1 22*91f16700Schasinglulu#error "Cortex-A77 supports only AArch64. Compile with CTX_INCLUDE_AARCH32_REGS=0" 23*91f16700Schasinglulu#endif 24*91f16700Schasinglulu 25*91f16700Schasinglulu#if WORKAROUND_CVE_2022_23960 26*91f16700Schasinglulu wa_cve_2022_23960_bhb_vector_table CORTEX_A77_BHB_LOOP_COUNT, cortex_a77 27*91f16700Schasinglulu#endif /* WORKAROUND_CVE_2022_23960 */ 28*91f16700Schasinglulu 29*91f16700Schasingluluworkaround_reset_start cortex_a77, ERRATUM(1508412), ERRATA_A77_1508412 30*91f16700Schasinglulu /* move cpu revision in again and compare against r0p0 */ 31*91f16700Schasinglulu mov x0, x7 32*91f16700Schasinglulu mov x1, #CPU_REV(0, 0) 33*91f16700Schasinglulu bl cpu_rev_var_ls 34*91f16700Schasinglulu cbz x0, 1f 35*91f16700Schasinglulu 36*91f16700Schasinglulu ldr x0, =0x0 37*91f16700Schasinglulu msr CORTEX_A77_CPUPSELR_EL3, x0 38*91f16700Schasinglulu ldr x0, =0x00E8400000 39*91f16700Schasinglulu msr CORTEX_A77_CPUPOR_EL3, x0 40*91f16700Schasinglulu ldr x0, =0x00FFE00000 41*91f16700Schasinglulu msr CORTEX_A77_CPUPMR_EL3, x0 42*91f16700Schasinglulu ldr x0, =0x4004003FF 43*91f16700Schasinglulu msr CORTEX_A77_CPUPCR_EL3, x0 44*91f16700Schasinglulu ldr x0, =0x1 45*91f16700Schasinglulu msr CORTEX_A77_CPUPSELR_EL3, x0 46*91f16700Schasinglulu ldr x0, =0x00E8C00040 47*91f16700Schasinglulu msr CORTEX_A77_CPUPOR_EL3, x0 48*91f16700Schasinglulu ldr x0, =0x00FFE00040 49*91f16700Schasinglulu msr CORTEX_A77_CPUPMR_EL3, x0 50*91f16700Schasinglulu b 2f 51*91f16700Schasinglulu1: 52*91f16700Schasinglulu ldr x0, =0x0 53*91f16700Schasinglulu msr CORTEX_A77_CPUPSELR_EL3, x0 54*91f16700Schasinglulu ldr x0, =0x00E8400000 55*91f16700Schasinglulu msr CORTEX_A77_CPUPOR_EL3, x0 56*91f16700Schasinglulu ldr x0, =0x00FF600000 57*91f16700Schasinglulu msr CORTEX_A77_CPUPMR_EL3, x0 58*91f16700Schasinglulu ldr x0, =0x00E8E00080 59*91f16700Schasinglulu msr CORTEX_A77_CPUPOR2_EL3, x0 60*91f16700Schasinglulu ldr x0, =0x00FFE000C0 61*91f16700Schasinglulu msr CORTEX_A77_CPUPMR2_EL3, x0 62*91f16700Schasinglulu2: 63*91f16700Schasinglulu ldr x0, =0x04004003FF 64*91f16700Schasinglulu msr CORTEX_A77_CPUPCR_EL3, x0 65*91f16700Schasingluluworkaround_reset_end cortex_a77, ERRATUM(1508412) 66*91f16700Schasinglulu 67*91f16700Schasinglulucheck_erratum_ls cortex_a77, ERRATUM(1508412), CPU_REV(1, 0) 68*91f16700Schasinglulu 69*91f16700Schasingluluworkaround_reset_start cortex_a77, ERRATUM(1791578), ERRATA_A77_1791578 70*91f16700Schasinglulu sysreg_bit_set CORTEX_A77_ACTLR2_EL1, CORTEX_A77_ACTLR2_EL1_BIT_2 71*91f16700Schasingluluworkaround_reset_end cortex_a77, ERRATUM(1791578) 72*91f16700Schasinglulu 73*91f16700Schasinglulucheck_erratum_ls cortex_a77, ERRATUM(1791578), CPU_REV(1, 1) 74*91f16700Schasinglulu 75*91f16700Schasingluluworkaround_reset_start cortex_a77, ERRATUM(1800714), ERRATA_A77_1800714 76*91f16700Schasinglulu /* Disable allocation of splintered pages in the L2 TLB */ 77*91f16700Schasinglulu sysreg_bit_set CORTEX_A77_CPUECTLR_EL1, CORTEX_A77_CPUECTLR_EL1_BIT_53 78*91f16700Schasingluluworkaround_reset_end cortex_a77, ERRATUM(1800714) 79*91f16700Schasinglulu 80*91f16700Schasinglulucheck_erratum_ls cortex_a77, ERRATUM(1800714), CPU_REV(1, 1) 81*91f16700Schasinglulu 82*91f16700Schasingluluworkaround_reset_start cortex_a77, ERRATUM(1925769), ERRATA_A77_1925769 83*91f16700Schasinglulu sysreg_bit_set CORTEX_A77_CPUECTLR_EL1, CORTEX_A77_CPUECTLR_EL1_BIT_8 84*91f16700Schasingluluworkaround_reset_end cortex_a77, ERRATUM(1925769) 85*91f16700Schasinglulu 86*91f16700Schasinglulucheck_erratum_ls cortex_a77, ERRATUM(1925769), CPU_REV(1, 1) 87*91f16700Schasinglulu 88*91f16700Schasingluluworkaround_reset_start cortex_a77, ERRATUM(1946167), ERRATA_A77_1946167 89*91f16700Schasinglulu ldr x0,=0x4 90*91f16700Schasinglulu msr CORTEX_A77_CPUPSELR_EL3,x0 91*91f16700Schasinglulu ldr x0,=0x10E3900002 92*91f16700Schasinglulu msr CORTEX_A77_CPUPOR_EL3,x0 93*91f16700Schasinglulu ldr x0,=0x10FFF00083 94*91f16700Schasinglulu msr CORTEX_A77_CPUPMR_EL3,x0 95*91f16700Schasinglulu ldr x0,=0x2001003FF 96*91f16700Schasinglulu msr CORTEX_A77_CPUPCR_EL3,x0 97*91f16700Schasinglulu 98*91f16700Schasinglulu ldr x0,=0x5 99*91f16700Schasinglulu msr CORTEX_A77_CPUPSELR_EL3,x0 100*91f16700Schasinglulu ldr x0,=0x10E3800082 101*91f16700Schasinglulu msr CORTEX_A77_CPUPOR_EL3,x0 102*91f16700Schasinglulu ldr x0,=0x10FFF00083 103*91f16700Schasinglulu msr CORTEX_A77_CPUPMR_EL3,x0 104*91f16700Schasinglulu ldr x0,=0x2001003FF 105*91f16700Schasinglulu msr CORTEX_A77_CPUPCR_EL3,x0 106*91f16700Schasinglulu 107*91f16700Schasinglulu ldr x0,=0x6 108*91f16700Schasinglulu msr CORTEX_A77_CPUPSELR_EL3,x0 109*91f16700Schasinglulu ldr x0,=0x10E3800200 110*91f16700Schasinglulu msr CORTEX_A77_CPUPOR_EL3,x0 111*91f16700Schasinglulu ldr x0,=0x10FFF003E0 112*91f16700Schasinglulu msr CORTEX_A77_CPUPMR_EL3,x0 113*91f16700Schasinglulu ldr x0,=0x2001003FF 114*91f16700Schasinglulu msr CORTEX_A77_CPUPCR_EL3,x0 115*91f16700Schasingluluworkaround_reset_end cortex_a77, ERRATUM(1946167) 116*91f16700Schasinglulu 117*91f16700Schasinglulucheck_erratum_ls cortex_a77, ERRATUM(1946167), CPU_REV(1, 1) 118*91f16700Schasinglulu 119*91f16700Schasingluluworkaround_reset_start cortex_a77, ERRATUM(2356587), ERRATA_A77_2356587 120*91f16700Schasinglulu sysreg_bit_set CORTEX_A77_ACTLR2_EL1, CORTEX_A77_ACTLR2_EL1_BIT_0 121*91f16700Schasingluluworkaround_reset_end cortex_a77, ERRATUM(2356587) 122*91f16700Schasinglulu 123*91f16700Schasinglulucheck_erratum_ls cortex_a77, ERRATUM(2356587), CPU_REV(1, 1) 124*91f16700Schasinglulu 125*91f16700Schasingluluworkaround_runtime_start cortex_a77, ERRATUM(2743100), ERRATA_A77_2743100 126*91f16700Schasinglulu /* dsb before isb of power down sequence */ 127*91f16700Schasinglulu dsb sy 128*91f16700Schasingluluworkaround_runtime_end cortex_a77, ERRATUM(2743100), NO_ISB 129*91f16700Schasinglulu 130*91f16700Schasinglulucheck_erratum_ls cortex_a77, ERRATUM(2743100), CPU_REV(1, 1) 131*91f16700Schasinglulu 132*91f16700Schasingluluworkaround_reset_start cortex_a77, CVE(2022, 23960), WORKAROUND_CVE_2022_23960 133*91f16700Schasinglulu#if IMAGE_BL31 134*91f16700Schasinglulu /* 135*91f16700Schasinglulu * The Cortex-A77 generic vectors are overridden to apply errata 136*91f16700Schasinglulu * mitigation on exception entry from lower ELs. 137*91f16700Schasinglulu */ 138*91f16700Schasinglulu adr x0, wa_cve_vbar_cortex_a77 139*91f16700Schasinglulu msr vbar_el3, x0 140*91f16700Schasinglulu#endif /* IMAGE_BL31 */ 141*91f16700Schasingluluworkaround_reset_end cortex_a77, CVE(2022, 23960) 142*91f16700Schasinglulu 143*91f16700Schasinglulucheck_erratum_chosen cortex_a77, CVE(2022, 23960), WORKAROUND_CVE_2022_23960 144*91f16700Schasinglulu 145*91f16700Schasinglulu /* ------------------------------------------------- 146*91f16700Schasinglulu * The CPU Ops reset function for Cortex-A77. Must follow AAPCS. 147*91f16700Schasinglulu * ------------------------------------------------- 148*91f16700Schasinglulu */ 149*91f16700Schasinglulucpu_reset_func_start cortex_a77 150*91f16700Schasinglulucpu_reset_func_end cortex_a77 151*91f16700Schasinglulu 152*91f16700Schasinglulu /* --------------------------------------------- 153*91f16700Schasinglulu * HW will do the cache maintenance while powering down 154*91f16700Schasinglulu * --------------------------------------------- 155*91f16700Schasinglulu */ 156*91f16700Schasinglulufunc cortex_a77_core_pwr_dwn 157*91f16700Schasinglulu /* --------------------------------------------- 158*91f16700Schasinglulu * Enable CPU power down bit in power control register 159*91f16700Schasinglulu * --------------------------------------------- 160*91f16700Schasinglulu */ 161*91f16700Schasinglulu sysreg_bit_set CORTEX_A77_CPUPWRCTLR_EL1, \ 162*91f16700Schasinglulu CORTEX_A77_CPUPWRCTLR_EL1_CORE_PWRDN_BIT 163*91f16700Schasinglulu 164*91f16700Schasinglulu apply_erratum cortex_a77, ERRATUM(2743100), ERRATA_A77_2743100 165*91f16700Schasinglulu 166*91f16700Schasinglulu isb 167*91f16700Schasinglulu ret 168*91f16700Schasingluluendfunc cortex_a77_core_pwr_dwn 169*91f16700Schasinglulu 170*91f16700Schasingluluerrata_report_shim cortex_a77 171*91f16700Schasinglulu /* --------------------------------------------- 172*91f16700Schasinglulu * This function provides Cortex-A77 specific 173*91f16700Schasinglulu * register information for crash reporting. 174*91f16700Schasinglulu * It needs to return with x6 pointing to 175*91f16700Schasinglulu * a list of register names in ascii and 176*91f16700Schasinglulu * x8 - x15 having values of registers to be 177*91f16700Schasinglulu * reported. 178*91f16700Schasinglulu * --------------------------------------------- 179*91f16700Schasinglulu */ 180*91f16700Schasinglulu.section .rodata.cortex_a77_regs, "aS" 181*91f16700Schasinglulucortex_a77_regs: /* The ascii list of register names to be reported */ 182*91f16700Schasinglulu .asciz "cpuectlr_el1", "" 183*91f16700Schasinglulu 184*91f16700Schasinglulufunc cortex_a77_cpu_reg_dump 185*91f16700Schasinglulu adr x6, cortex_a77_regs 186*91f16700Schasinglulu mrs x8, CORTEX_A77_CPUECTLR_EL1 187*91f16700Schasinglulu ret 188*91f16700Schasingluluendfunc cortex_a77_cpu_reg_dump 189*91f16700Schasinglulu 190*91f16700Schasingluludeclare_cpu_ops cortex_a77, CORTEX_A77_MIDR, \ 191*91f16700Schasinglulu cortex_a77_reset_func, \ 192*91f16700Schasinglulu cortex_a77_core_pwr_dwn 193