xref: /arm-trusted-firmware/lib/cpus/aarch64/cortex_a78_ae.S (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
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