xref: /arm-trusted-firmware/lib/cpus/aarch64/cortex_a75.S (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu/*
2*91f16700Schasinglulu * Copyright (c) 2017-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 <cortex_a75.h>
10*91f16700Schasinglulu#include <cpuamu.h>
11*91f16700Schasinglulu#include <cpu_macros.S>
12*91f16700Schasinglulu
13*91f16700Schasinglulu/* Hardware handled coherency */
14*91f16700Schasinglulu#if HW_ASSISTED_COHERENCY == 0
15*91f16700Schasinglulu#error "Cortex-A75 must be compiled with HW_ASSISTED_COHERENCY enabled"
16*91f16700Schasinglulu#endif
17*91f16700Schasinglulu
18*91f16700Schasingluluworkaround_reset_start cortex_a75, ERRATUM(764081), ERRATA_A75_764081
19*91f16700Schasinglulu	sysreg_bit_set sctlr_el3, SCTLR_IESB_BIT
20*91f16700Schasingluluworkaround_reset_end cortex_a75, ERRATUM(764081)
21*91f16700Schasinglulu
22*91f16700Schasinglulucheck_erratum_ls cortex_a75, ERRATUM(764081), CPU_REV(0, 0)
23*91f16700Schasinglulu
24*91f16700Schasingluluworkaround_reset_start cortex_a75, ERRATUM(790748), ERRATA_A75_790748
25*91f16700Schasinglulu	sysreg_bit_set CORTEX_A75_CPUACTLR_EL1, (1 << 13)
26*91f16700Schasingluluworkaround_reset_end cortex_a75, ERRATUM(790748)
27*91f16700Schasinglulu
28*91f16700Schasinglulucheck_erratum_ls cortex_a75, ERRATUM(790748), CPU_REV(0, 0)
29*91f16700Schasinglulu
30*91f16700Schasinglulu/* ERRATA_DSU_798953 :
31*91f16700Schasinglulu * The errata is defined in dsu_helpers.S but applies to cortex_a75
32*91f16700Schasinglulu * as well. Henceforth creating symbolic names to the already existing errata
33*91f16700Schasinglulu * workaround functions to get them registered under the Errata Framework.
34*91f16700Schasinglulu */
35*91f16700Schasinglulu.equ check_erratum_cortex_a75_798953, check_errata_dsu_798953
36*91f16700Schasinglulu.equ erratum_cortex_a75_798953_wa, errata_dsu_798953_wa
37*91f16700Schasingluluadd_erratum_entry cortex_a75, ERRATUM(798953), ERRATA_DSU_798953, APPLY_AT_RESET
38*91f16700Schasinglulu
39*91f16700Schasinglulu/* ERRATA_DSU_936184 :
40*91f16700Schasinglulu * The errata is defined in dsu_helpers.S but applies to cortex_a75
41*91f16700Schasinglulu * as well. Henceforth creating symbolic names to the already existing errata
42*91f16700Schasinglulu * workaround functions to get them registered under the Errata Framework.
43*91f16700Schasinglulu */
44*91f16700Schasinglulu.equ check_erratum_cortex_a75_936184, check_errata_dsu_936184
45*91f16700Schasinglulu.equ erratum_cortex_a75_936184_wa, errata_dsu_936184_wa
46*91f16700Schasingluluadd_erratum_entry cortex_a75, ERRATUM(936184), ERRATA_DSU_936184, APPLY_AT_RESET
47*91f16700Schasinglulu
48*91f16700Schasingluluworkaround_reset_start cortex_a75, CVE(2017, 5715), WORKAROUND_CVE_2017_5715
49*91f16700Schasinglulu#if IMAGE_BL31
50*91f16700Schasinglulu	override_vector_table wa_cve_2017_5715_bpiall_vbar
51*91f16700Schasinglulu#endif /* IMAGE_BL31 */
52*91f16700Schasingluluworkaround_reset_end cortex_a75, CVE(2017, 5715)
53*91f16700Schasinglulu
54*91f16700Schasinglulucheck_erratum_custom_start cortex_a75, CVE(2017, 5715)
55*91f16700Schasinglulu	cpu_check_csv2	x0, 1f
56*91f16700Schasinglulu#if WORKAROUND_CVE_2017_5715
57*91f16700Schasinglulu	mov	x0, #ERRATA_APPLIES
58*91f16700Schasinglulu#else
59*91f16700Schasinglulu	mov	x0, #ERRATA_MISSING
60*91f16700Schasinglulu#endif
61*91f16700Schasinglulu	ret
62*91f16700Schasinglulu1:
63*91f16700Schasinglulu	mov	x0, #ERRATA_NOT_APPLIES
64*91f16700Schasinglulu	ret
65*91f16700Schasinglulucheck_erratum_custom_end cortex_a75, CVE(2017, 5715)
66*91f16700Schasinglulu
67*91f16700Schasingluluworkaround_reset_start cortex_a75, CVE(2018, 3639), WORKAROUND_CVE_2018_3639
68*91f16700Schasinglulu	sysreg_bit_set CORTEX_A75_CPUACTLR_EL1, CORTEX_A75_CPUACTLR_EL1_DISABLE_LOAD_PASS_STORE
69*91f16700Schasingluluworkaround_reset_end cortex_a75, CVE(2018, 3639)
70*91f16700Schasinglulu
71*91f16700Schasinglulucheck_erratum_chosen cortex_a75, CVE(2018, 3639), WORKAROUND_CVE_2018_3639
72*91f16700Schasinglulu
73*91f16700Schasingluluworkaround_reset_start cortex_a75, CVE(2022, 23960), WORKAROUND_CVE_2022_23960
74*91f16700Schasinglulu#if IMAGE_BL31
75*91f16700Schasinglulu	/* Skip installing vector table again if already done for CVE(2017, 5715) */
76*91f16700Schasinglulu	adr	x0, wa_cve_2017_5715_bpiall_vbar
77*91f16700Schasinglulu	mrs	x1, vbar_el3
78*91f16700Schasinglulu	cmp	x0, x1
79*91f16700Schasinglulu	b.eq	1f
80*91f16700Schasinglulu	msr	vbar_el3, x0
81*91f16700Schasinglulu1:
82*91f16700Schasinglulu#endif /* IMAGE_BL31 */
83*91f16700Schasingluluworkaround_reset_end cortex_a75, CVE(2022, 23960)
84*91f16700Schasinglulu
85*91f16700Schasinglulucheck_erratum_custom_start cortex_a75, CVE(2022, 23960)
86*91f16700Schasinglulu#if WORKAROUND_CVE_2017_5715 || WORKAROUND_CVE_2022_23960
87*91f16700Schasinglulu	cpu_check_csv2	x0, 1f
88*91f16700Schasinglulu	mov	x0, #ERRATA_APPLIES
89*91f16700Schasinglulu	ret
90*91f16700Schasinglulu1:
91*91f16700Schasinglulu# if WORKAROUND_CVE_2022_23960
92*91f16700Schasinglulu	mov	x0, #ERRATA_APPLIES
93*91f16700Schasinglulu# else
94*91f16700Schasinglulu	mov	x0, #ERRATA_MISSING
95*91f16700Schasinglulu# endif /* WORKAROUND_CVE_2022_23960 */
96*91f16700Schasinglulu	ret
97*91f16700Schasinglulu#endif /* WORKAROUND_CVE_2017_5715 || WORKAROUND_CVE_2022_23960 */
98*91f16700Schasinglulu	mov	x0, #ERRATA_MISSING
99*91f16700Schasinglulu	ret
100*91f16700Schasinglulucheck_erratum_custom_end cortex_a75, CVE(2022, 23960)
101*91f16700Schasinglulu
102*91f16700Schasinglulu	/* -------------------------------------------------
103*91f16700Schasinglulu	 * The CPU Ops reset function for Cortex-A75.
104*91f16700Schasinglulu	 * -------------------------------------------------
105*91f16700Schasinglulu	 */
106*91f16700Schasinglulu
107*91f16700Schasinglulucpu_reset_func_start cortex_a75
108*91f16700Schasinglulu#if ENABLE_FEAT_AMU
109*91f16700Schasinglulu	/* Make sure accesses from EL0/EL1 and EL2 are not trapped to EL3 */
110*91f16700Schasinglulu	sysreg_bit_set actlr_el3, CORTEX_A75_ACTLR_AMEN_BIT
111*91f16700Schasinglulu	isb
112*91f16700Schasinglulu
113*91f16700Schasinglulu	/* Make sure accesses from EL0/EL1 are not trapped to EL2 */
114*91f16700Schasinglulu	sysreg_bit_set actlr_el2, CORTEX_A75_ACTLR_AMEN_BIT
115*91f16700Schasinglulu	isb
116*91f16700Schasinglulu
117*91f16700Schasinglulu	/* Enable group0 counters */
118*91f16700Schasinglulu	mov	x0, #CORTEX_A75_AMU_GROUP0_MASK
119*91f16700Schasinglulu	msr	CPUAMCNTENSET_EL0, x0
120*91f16700Schasinglulu	isb
121*91f16700Schasinglulu
122*91f16700Schasinglulu	/* Enable group1 counters */
123*91f16700Schasinglulu	mov	x0, #CORTEX_A75_AMU_GROUP1_MASK
124*91f16700Schasinglulu	msr	CPUAMCNTENSET_EL0, x0
125*91f16700Schasinglulu	/* isb included in cpu_reset_func_end macro */
126*91f16700Schasinglulu#endif
127*91f16700Schasinglulucpu_reset_func_end cortex_a75
128*91f16700Schasinglulu
129*91f16700Schasinglulufunc check_smccc_arch_workaround_3
130*91f16700Schasinglulu	mov	x0, #ERRATA_APPLIES
131*91f16700Schasinglulu	ret
132*91f16700Schasingluluendfunc check_smccc_arch_workaround_3
133*91f16700Schasinglulu
134*91f16700Schasinglulu	/* ---------------------------------------------
135*91f16700Schasinglulu	 * HW will do the cache maintenance while powering down
136*91f16700Schasinglulu	 * ---------------------------------------------
137*91f16700Schasinglulu	 */
138*91f16700Schasinglulufunc cortex_a75_core_pwr_dwn
139*91f16700Schasinglulu	/* ---------------------------------------------
140*91f16700Schasinglulu	 * Enable CPU power down bit in power control register
141*91f16700Schasinglulu	 * ---------------------------------------------
142*91f16700Schasinglulu	 */
143*91f16700Schasinglulu	sysreg_bit_set CORTEX_A75_CPUPWRCTLR_EL1, \
144*91f16700Schasinglulu		CORTEX_A75_CORE_PWRDN_EN_MASK
145*91f16700Schasinglulu	isb
146*91f16700Schasinglulu	ret
147*91f16700Schasingluluendfunc cortex_a75_core_pwr_dwn
148*91f16700Schasinglulu
149*91f16700Schasingluluerrata_report_shim cortex_a75
150*91f16700Schasinglulu
151*91f16700Schasinglulu	/* ---------------------------------------------
152*91f16700Schasinglulu	 * This function provides cortex_a75 specific
153*91f16700Schasinglulu	 * register information for crash reporting.
154*91f16700Schasinglulu	 * It needs to return with x6 pointing to
155*91f16700Schasinglulu	 * a list of register names in ascii and
156*91f16700Schasinglulu	 * x8 - x15 having values of registers to be
157*91f16700Schasinglulu	 * reported.
158*91f16700Schasinglulu	 * ---------------------------------------------
159*91f16700Schasinglulu	 */
160*91f16700Schasinglulu.section .rodata.cortex_a75_regs, "aS"
161*91f16700Schasinglulucortex_a75_regs:  /* The ascii list of register names to be reported */
162*91f16700Schasinglulu	.asciz	"cpuectlr_el1", ""
163*91f16700Schasinglulu
164*91f16700Schasinglulufunc cortex_a75_cpu_reg_dump
165*91f16700Schasinglulu	adr	x6, cortex_a75_regs
166*91f16700Schasinglulu	mrs	x8, CORTEX_A75_CPUECTLR_EL1
167*91f16700Schasinglulu	ret
168*91f16700Schasingluluendfunc cortex_a75_cpu_reg_dump
169*91f16700Schasinglulu
170*91f16700Schasingluludeclare_cpu_ops_wa cortex_a75, CORTEX_A75_MIDR, \
171*91f16700Schasinglulu	cortex_a75_reset_func, \
172*91f16700Schasinglulu	check_erratum_cortex_a75_5715, \
173*91f16700Schasinglulu	CPU_NO_EXTRA2_FUNC, \
174*91f16700Schasinglulu	check_smccc_arch_workaround_3, \
175*91f16700Schasinglulu	cortex_a75_core_pwr_dwn
176