xref: /arm-trusted-firmware/lib/cpus/aarch64/cortex_a73.S (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu/*
2*91f16700Schasinglulu * Copyright (c) 2016-2023, Arm Limited and Contributors. All rights reserved.
3*91f16700Schasinglulu *
4*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause
5*91f16700Schasinglulu */
6*91f16700Schasinglulu#include <arch.h>
7*91f16700Schasinglulu#include <asm_macros.S>
8*91f16700Schasinglulu#include <common/bl_common.h>
9*91f16700Schasinglulu#include <cortex_a73.h>
10*91f16700Schasinglulu#include <cpu_macros.S>
11*91f16700Schasinglulu#include <plat_macros.S>
12*91f16700Schasinglulu
13*91f16700Schasinglulu	/* ---------------------------------------------
14*91f16700Schasinglulu	 * Disable L1 data cache
15*91f16700Schasinglulu	 * ---------------------------------------------
16*91f16700Schasinglulu	 */
17*91f16700Schasinglulufunc cortex_a73_disable_dcache
18*91f16700Schasinglulu	sysreg_bit_clear sctlr_el3, SCTLR_C_BIT
19*91f16700Schasinglulu	isb
20*91f16700Schasinglulu	ret
21*91f16700Schasingluluendfunc cortex_a73_disable_dcache
22*91f16700Schasinglulu
23*91f16700Schasinglulu	/* ---------------------------------------------
24*91f16700Schasinglulu	 * Disable intra-cluster coherency
25*91f16700Schasinglulu	 * ---------------------------------------------
26*91f16700Schasinglulu	 */
27*91f16700Schasinglulufunc cortex_a73_disable_smp
28*91f16700Schasinglulu	sysreg_bit_clear CORTEX_A73_CPUECTLR_EL1, CORTEX_A73_CPUECTLR_SMP_BIT
29*91f16700Schasinglulu	isb
30*91f16700Schasinglulu	dsb	sy
31*91f16700Schasinglulu	ret
32*91f16700Schasingluluendfunc cortex_a73_disable_smp
33*91f16700Schasinglulu
34*91f16700Schasinglulufunc check_smccc_arch_workaround_3
35*91f16700Schasinglulu	mov	x0, #ERRATA_APPLIES
36*91f16700Schasinglulu	ret
37*91f16700Schasingluluendfunc check_smccc_arch_workaround_3
38*91f16700Schasinglulu
39*91f16700Schasingluluworkaround_reset_start cortex_a73, ERRATUM(852427), ERRATA_A73_852427
40*91f16700Schasinglulu	sysreg_bit_set CORTEX_A73_DIAGNOSTIC_REGISTER, BIT(12)
41*91f16700Schasingluluworkaround_reset_end cortex_a73, ERRATUM(852427)
42*91f16700Schasinglulu
43*91f16700Schasinglulucheck_erratum_ls cortex_a73, ERRATUM(852427), CPU_REV(0, 0)
44*91f16700Schasinglulu
45*91f16700Schasingluluworkaround_reset_start cortex_a73, ERRATUM(855423), ERRATA_A73_855423
46*91f16700Schasinglulu	sysreg_bit_set CORTEX_A73_IMP_DEF_REG2, BIT(7)
47*91f16700Schasingluluworkaround_reset_end cortex_a73, ERRATUM(855423)
48*91f16700Schasinglulu
49*91f16700Schasinglulucheck_erratum_ls cortex_a73, ERRATUM(855423), CPU_REV(0, 1)
50*91f16700Schasinglulu
51*91f16700Schasingluluworkaround_reset_start cortex_a73, CVE(2017, 5715), WORKAROUND_CVE_2017_5715
52*91f16700Schasinglulu#if IMAGE_BL31
53*91f16700Schasinglulu	override_vector_table wa_cve_2017_5715_bpiall_vbar
54*91f16700Schasinglulu#endif /* IMAGE_BL31 */
55*91f16700Schasingluluworkaround_reset_end cortex_a73, CVE(2017, 5715)
56*91f16700Schasinglulu
57*91f16700Schasinglulucheck_erratum_custom_start cortex_a73, CVE(2017, 5715)
58*91f16700Schasinglulu	cpu_check_csv2	x0, 1f
59*91f16700Schasinglulu#if WORKAROUND_CVE_2017_5715
60*91f16700Schasinglulu	mov	x0, #ERRATA_APPLIES
61*91f16700Schasinglulu#else
62*91f16700Schasinglulu	mov	x0, #ERRATA_MISSING
63*91f16700Schasinglulu#endif
64*91f16700Schasinglulu	ret
65*91f16700Schasinglulu1:
66*91f16700Schasinglulu	mov	x0, #ERRATA_NOT_APPLIES
67*91f16700Schasinglulu	ret
68*91f16700Schasinglulucheck_erratum_custom_end cortex_a73, CVE(2017, 5715)
69*91f16700Schasinglulu
70*91f16700Schasingluluworkaround_reset_start cortex_a73, CVE(2018, 3639), WORKAROUND_CVE_2018_3639
71*91f16700Schasinglulu	sysreg_bit_set CORTEX_A73_IMP_DEF_REG1, CORTEX_A73_IMP_DEF_REG1_DISABLE_LOAD_PASS_STORE
72*91f16700Schasingluluworkaround_reset_end cortex_a73, CVE(2018, 3639)
73*91f16700Schasinglulu
74*91f16700Schasinglulucheck_erratum_chosen cortex_a73, CVE(2018, 3639), WORKAROUND_CVE_2018_3639
75*91f16700Schasinglulu
76*91f16700Schasingluluworkaround_reset_start cortex_a73, CVE(2022, 23960), WORKAROUND_CVE_2022_23960
77*91f16700Schasinglulu#if IMAGE_BL31
78*91f16700Schasinglulu	/* Skip installing vector table again for CVE_2022_23960 */
79*91f16700Schasinglulu	adr	x0, wa_cve_2017_5715_bpiall_vbar
80*91f16700Schasinglulu	mrs	x1, vbar_el3
81*91f16700Schasinglulu
82*91f16700Schasinglulu	cmp	x0, x1
83*91f16700Schasinglulu	b.eq	1f
84*91f16700Schasinglulu	msr     vbar_el3, x0
85*91f16700Schasinglulu1:
86*91f16700Schasinglulu#endif /* IMAGE_BL31 */
87*91f16700Schasingluluworkaround_reset_end cortex_a73, CVE(2022, 23960)
88*91f16700Schasinglulu
89*91f16700Schasinglulucheck_erratum_custom_start cortex_a73, CVE(2022, 23960)
90*91f16700Schasinglulu#if WORKAROUND_CVE_2017_5715 || WORKAROUND_CVE_2022_23960
91*91f16700Schasinglulu	cpu_check_csv2  x0, 1f
92*91f16700Schasinglulu	mov	x0, #ERRATA_APPLIES
93*91f16700Schasinglulu	ret
94*91f16700Schasinglulu 1:
95*91f16700Schasinglulu#if WORKAROUND_CVE_2022_23960
96*91f16700Schasinglulu	mov	x0, #ERRATA_APPLIES
97*91f16700Schasinglulu#else
98*91f16700Schasinglulu	mov	x0, #ERRATA_MISSING
99*91f16700Schasinglulu#endif /* WORKAROUND_CVE_2022_23960 */
100*91f16700Schasinglulu	ret
101*91f16700Schasinglulu#endif /* WORKAROUND_CVE_2017_5715 || WORKAROUND_CVE_2022_23960 */
102*91f16700Schasinglulu	mov	x0, #ERRATA_MISSING
103*91f16700Schasinglulu	ret
104*91f16700Schasinglulucheck_erratum_custom_end cortex_a73, CVE(2022, 23960)
105*91f16700Schasinglulu
106*91f16700Schasinglulu	/* -------------------------------------------------
107*91f16700Schasinglulu	 * The CPU Ops reset function for Cortex-A73.
108*91f16700Schasinglulu	 * -------------------------------------------------
109*91f16700Schasinglulu	 */
110*91f16700Schasinglulu
111*91f16700Schasinglulucpu_reset_func_start cortex_a73
112*91f16700Schasinglulu	/* ---------------------------------------------
113*91f16700Schasinglulu	 * Enable the SMP bit.
114*91f16700Schasinglulu	 * Clobbers : x0
115*91f16700Schasinglulu	 * ---------------------------------------------
116*91f16700Schasinglulu	 */
117*91f16700Schasinglulu	sysreg_bit_set CORTEX_A73_CPUECTLR_EL1, CORTEX_A73_CPUECTLR_SMP_BIT
118*91f16700Schasinglulucpu_reset_func_end cortex_a73
119*91f16700Schasinglulu
120*91f16700Schasinglulufunc cortex_a73_core_pwr_dwn
121*91f16700Schasinglulu	mov	x18, x30
122*91f16700Schasinglulu
123*91f16700Schasinglulu	/* ---------------------------------------------
124*91f16700Schasinglulu	 * Turn off caches.
125*91f16700Schasinglulu	 * ---------------------------------------------
126*91f16700Schasinglulu	 */
127*91f16700Schasinglulu	bl	cortex_a73_disable_dcache
128*91f16700Schasinglulu
129*91f16700Schasinglulu	/* ---------------------------------------------
130*91f16700Schasinglulu	 * Flush L1 caches.
131*91f16700Schasinglulu	 * ---------------------------------------------
132*91f16700Schasinglulu	 */
133*91f16700Schasinglulu	mov	x0, #DCCISW
134*91f16700Schasinglulu	bl	dcsw_op_level1
135*91f16700Schasinglulu
136*91f16700Schasinglulu	/* ---------------------------------------------
137*91f16700Schasinglulu	 * Come out of intra cluster coherency
138*91f16700Schasinglulu	 * ---------------------------------------------
139*91f16700Schasinglulu	 */
140*91f16700Schasinglulu	mov	x30, x18
141*91f16700Schasinglulu	b	cortex_a73_disable_smp
142*91f16700Schasingluluendfunc cortex_a73_core_pwr_dwn
143*91f16700Schasinglulu
144*91f16700Schasinglulufunc cortex_a73_cluster_pwr_dwn
145*91f16700Schasinglulu	mov	x18, x30
146*91f16700Schasinglulu
147*91f16700Schasinglulu	/* ---------------------------------------------
148*91f16700Schasinglulu	 * Turn off caches.
149*91f16700Schasinglulu	 * ---------------------------------------------
150*91f16700Schasinglulu	 */
151*91f16700Schasinglulu	bl	cortex_a73_disable_dcache
152*91f16700Schasinglulu
153*91f16700Schasinglulu	/* ---------------------------------------------
154*91f16700Schasinglulu	 * Flush L1 caches.
155*91f16700Schasinglulu	 * ---------------------------------------------
156*91f16700Schasinglulu	 */
157*91f16700Schasinglulu	mov	x0, #DCCISW
158*91f16700Schasinglulu	bl	dcsw_op_level1
159*91f16700Schasinglulu
160*91f16700Schasinglulu	/* ---------------------------------------------
161*91f16700Schasinglulu	 * Disable the optional ACP.
162*91f16700Schasinglulu	 * ---------------------------------------------
163*91f16700Schasinglulu	 */
164*91f16700Schasinglulu	bl	plat_disable_acp
165*91f16700Schasinglulu
166*91f16700Schasinglulu	/* ---------------------------------------------
167*91f16700Schasinglulu	 * Flush L2 caches.
168*91f16700Schasinglulu	 * ---------------------------------------------
169*91f16700Schasinglulu	 */
170*91f16700Schasinglulu	mov	x0, #DCCISW
171*91f16700Schasinglulu	bl	dcsw_op_level2
172*91f16700Schasinglulu
173*91f16700Schasinglulu	/* ---------------------------------------------
174*91f16700Schasinglulu	 * Come out of intra cluster coherency
175*91f16700Schasinglulu	 * ---------------------------------------------
176*91f16700Schasinglulu	 */
177*91f16700Schasinglulu	mov	x30, x18
178*91f16700Schasinglulu	b	cortex_a73_disable_smp
179*91f16700Schasingluluendfunc cortex_a73_cluster_pwr_dwn
180*91f16700Schasinglulu
181*91f16700Schasinglulu
182*91f16700Schasingluluerrata_report_shim cortex_a73
183*91f16700Schasinglulu
184*91f16700Schasinglulu	/* ---------------------------------------------
185*91f16700Schasinglulu	 * This function provides cortex_a73 specific
186*91f16700Schasinglulu	 * register information for crash reporting.
187*91f16700Schasinglulu	 * It needs to return with x6 pointing to
188*91f16700Schasinglulu	 * a list of register names in ascii and
189*91f16700Schasinglulu	 * x8 - x15 having values of registers to be
190*91f16700Schasinglulu	 * reported.
191*91f16700Schasinglulu	 * ---------------------------------------------
192*91f16700Schasinglulu	 */
193*91f16700Schasinglulu.section .rodata.cortex_a73_regs, "aS"
194*91f16700Schasinglulucortex_a73_regs:  /* The ascii list of register names to be reported */
195*91f16700Schasinglulu	.asciz	"cpuectlr_el1", "l2merrsr_el1", ""
196*91f16700Schasinglulu
197*91f16700Schasinglulufunc cortex_a73_cpu_reg_dump
198*91f16700Schasinglulu	adr	x6, cortex_a73_regs
199*91f16700Schasinglulu	mrs	x8, CORTEX_A73_CPUECTLR_EL1
200*91f16700Schasinglulu	mrs	x9, CORTEX_A73_L2MERRSR_EL1
201*91f16700Schasinglulu	ret
202*91f16700Schasingluluendfunc cortex_a73_cpu_reg_dump
203*91f16700Schasinglulu
204*91f16700Schasingluludeclare_cpu_ops_wa cortex_a73, CORTEX_A73_MIDR, \
205*91f16700Schasinglulu	cortex_a73_reset_func, \
206*91f16700Schasinglulu	check_erratum_cortex_a73_5715, \
207*91f16700Schasinglulu	CPU_NO_EXTRA2_FUNC, \
208*91f16700Schasinglulu	check_smccc_arch_workaround_3, \
209*91f16700Schasinglulu	cortex_a73_core_pwr_dwn, \
210*91f16700Schasinglulu	cortex_a73_cluster_pwr_dwn
211