blob: b99fbb3c10881f4404e807c78d589f717bf77b67 [file] [log] [blame]
johpow01a3810e82021-05-18 15:23:31 -05001/*
Harrison Mutaiac05cb42023-04-25 11:47:49 +01002 * Copyright (c) 2021-2023, Arm Limited. All rights reserved.
johpow01a3810e82021-05-18 15:23:31 -05003 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7#include <arch.h>
8#include <asm_macros.S>
9#include <common/bl_common.h>
10#include <cortex_a710.h>
11#include <cpu_macros.S>
12#include <plat_macros.S>
Bipin Ravi86499742022-01-18 01:59:06 -060013#include "wa_cve_2022_23960_bhb_vector.S"
johpow01a3810e82021-05-18 15:23:31 -050014
15/* Hardware handled coherency */
16#if HW_ASSISTED_COHERENCY == 0
17#error "Cortex A710 must be compiled with HW_ASSISTED_COHERENCY enabled"
18#endif
19
20/* 64-bit only core */
21#if CTX_INCLUDE_AARCH32_REGS == 1
22#error "Cortex A710 supports only AArch64. Compile with CTX_INCLUDE_AARCH32_REGS=0"
23#endif
24
Bipin Ravi86499742022-01-18 01:59:06 -060025#if WORKAROUND_CVE_2022_23960
26 wa_cve_2022_23960_bhb_vector_table CORTEX_A710_BHB_LOOP_COUNT, cortex_a710
27#endif /* WORKAROUND_CVE_2022_23960 */
28
Harrison Mutai14b1c122023-04-26 12:18:46 +010029workaround_reset_start cortex_a710, ERRATUM(1987031), ERRATA_A710_1987031
nayanpatel-arme55d3252021-08-06 16:39:48 -070030 ldr x0,=0x6
31 msr S3_6_c15_c8_0,x0
32 ldr x0,=0xF3A08002
33 msr S3_6_c15_c8_2,x0
34 ldr x0,=0xFFF0F7FE
35 msr S3_6_c15_c8_3,x0
36 ldr x0,=0x40000001003ff
37 msr S3_6_c15_c8_1,x0
38 ldr x0,=0x7
39 msr S3_6_c15_c8_0,x0
40 ldr x0,=0xBF200000
41 msr S3_6_c15_c8_2,x0
42 ldr x0,=0xFFEF0000
43 msr S3_6_c15_c8_3,x0
44 ldr x0,=0x40000001003f3
45 msr S3_6_c15_c8_1,x0
Harrison Mutai14b1c122023-04-26 12:18:46 +010046workaround_reset_end cortex_a710, ERRATUM(1987031)
nayanpatel-arme55d3252021-08-06 16:39:48 -070047
Harrison Mutai14b1c122023-04-26 12:18:46 +010048check_erratum_ls cortex_a710, ERRATUM(1987031), CPU_REV(2, 0)
nayanpatel-arm7597d082021-08-25 17:35:15 -070049
Harrison Mutai14b1c122023-04-26 12:18:46 +010050workaround_runtime_start cortex_a710, ERRATUM(2008768), ERRATA_A710_2008768
Harrison Mutaiac05cb42023-04-25 11:47:49 +010051 /* Stash ERRSELR_EL1 in x2 */
52 mrs x2, ERRSELR_EL1
nayanpatel-arm7597d082021-08-25 17:35:15 -070053
Harrison Mutaiac05cb42023-04-25 11:47:49 +010054 /* Select error record 0 and clear ED bit */
55 msr ERRSELR_EL1, xzr
56 mrs x1, ERXCTLR_EL1
57 bfi x1, xzr, #ERXCTLR_ED_SHIFT, #1
58 msr ERXCTLR_EL1, x1
nayanpatel-arm7597d082021-08-25 17:35:15 -070059
Harrison Mutaiac05cb42023-04-25 11:47:49 +010060 /* Select error record 1 and clear ED bit */
61 mov x0, #1
62 msr ERRSELR_EL1, x0
63 mrs x1, ERXCTLR_EL1
64 bfi x1, xzr, #ERXCTLR_ED_SHIFT, #1
65 msr ERXCTLR_EL1, x1
66
67 /* Restore ERRSELR_EL1 from x2 */
68 msr ERRSELR_EL1, x2
Harrison Mutai14b1c122023-04-26 12:18:46 +010069workaround_runtime_end cortex_a710, ERRATUM(2008768), NO_ISB
Harrison Mutaiac05cb42023-04-25 11:47:49 +010070
Harrison Mutai14b1c122023-04-26 12:18:46 +010071check_erratum_ls cortex_a710, ERRATUM(2008768), CPU_REV(2, 0)
Bipin Ravicd39b142021-03-31 16:45:40 -050072
Harrison Mutai14b1c122023-04-26 12:18:46 +010073workaround_reset_start cortex_a710, ERRATUM(2017096), ERRATA_A710_2017096
Harrison Mutai1eb30382023-05-04 13:57:33 +010074 sysreg_bit_set CORTEX_A710_CPUECTLR_EL1, CORTEX_A710_CPUECTLR_EL1_PFSTIDIS_BIT
Harrison Mutai14b1c122023-04-26 12:18:46 +010075workaround_reset_end cortex_a710, ERRATUM(2017096)
Bipin Ravi87e1d282021-03-31 18:45:55 -050076
Harrison Mutai14b1c122023-04-26 12:18:46 +010077check_erratum_ls cortex_a710, ERRATUM(2017096), CPU_REV(2, 0)
Bipin Ravi87e1d282021-03-31 18:45:55 -050078
Harrison Mutai14b1c122023-04-26 12:18:46 +010079workaround_reset_start cortex_a710, ERRATUM(2055002), ERRATA_A710_2055002
Harrison Mutai1eb30382023-05-04 13:57:33 +010080 sysreg_bit_set CORTEX_A710_CPUACTLR_EL1, CORTEX_A710_CPUACTLR_EL1_BIT_46
Harrison Mutai14b1c122023-04-26 12:18:46 +010081workaround_reset_end cortex_a710, ERRATUM(2055002)
nayanpatel-arm0b338b42021-09-16 15:27:53 -070082
Sona Mathew6d691c52023-10-10 13:51:45 -050083check_erratum_range cortex_a710, ERRATUM(2055002), CPU_REV(1, 0), CPU_REV(2, 0)
nayanpatel-arm0b338b42021-09-16 15:27:53 -070084
Harrison Mutai14b1c122023-04-26 12:18:46 +010085workaround_reset_start cortex_a710, ERRATUM(2058056), ERRATA_A710_2058056
Harrison Mutai1eb30382023-05-04 13:57:33 +010086 sysreg_bitfield_insert CORTEX_A710_CPUECTLR2_EL1, CORTEX_A710_CPUECTLR2_EL1_PF_MODE_CNSRV, \
87 CPUECTLR2_EL1_PF_MODE_LSB, CPUECTLR2_EL1_PF_MODE_WIDTH
Harrison Mutai14b1c122023-04-26 12:18:46 +010088workaround_reset_end cortex_a710, ERRATUM(2058056)
nayanpatel-armf2dce0e2021-09-22 12:35:03 -070089
Sona Mathew6d691c52023-10-10 13:51:45 -050090check_erratum_ls cortex_a710, ERRATUM(2058056), CPU_REV(2, 1)
nayanpatel-armf2dce0e2021-09-22 12:35:03 -070091
Harrison Mutai14b1c122023-04-26 12:18:46 +010092workaround_reset_start cortex_a710, ERRATUM(2081180), ERRATA_A710_2081180
Harrison Mutaiac05cb42023-04-25 11:47:49 +010093 ldr x0,=0x3
94 msr S3_6_c15_c8_0,x0
95 ldr x0,=0xF3A08002
96 msr S3_6_c15_c8_2,x0
97 ldr x0,=0xFFF0F7FE
98 msr S3_6_c15_c8_3,x0
99 ldr x0,=0x10002001003FF
100 msr S3_6_c15_c8_1,x0
101 ldr x0,=0x4
102 msr S3_6_c15_c8_0,x0
103 ldr x0,=0xBF200000
104 msr S3_6_c15_c8_2,x0
105 ldr x0,=0xFFEF0000
106 msr S3_6_c15_c8_3,x0
107 ldr x0,=0x10002001003F3
108 msr S3_6_c15_c8_1,x0
Harrison Mutai14b1c122023-04-26 12:18:46 +0100109workaround_reset_end cortex_a710, ERRATUM(2081180)
Bipin Ravi32705b12022-02-06 02:32:54 -0600110
Harrison Mutai14b1c122023-04-26 12:18:46 +0100111check_erratum_ls cortex_a710, ERRATUM(2081180), CPU_REV(2, 0)
Harrison Mutaiac05cb42023-04-25 11:47:49 +0100112
Harrison Mutai14b1c122023-04-26 12:18:46 +0100113workaround_reset_start cortex_a710, ERRATUM(2083908), ERRATA_A710_2083908
Harrison Mutai1eb30382023-05-04 13:57:33 +0100114 sysreg_bit_set CORTEX_A710_CPUACTLR5_EL1, CORTEX_A710_CPUACTLR5_EL1_BIT_13
Harrison Mutai14b1c122023-04-26 12:18:46 +0100115workaround_reset_end cortex_a710, ERRATUM(2083908)
Harrison Mutaiac05cb42023-04-25 11:47:49 +0100116
Harrison Mutai14b1c122023-04-26 12:18:46 +0100117check_erratum_range cortex_a710, ERRATUM(2083908), CPU_REV(2, 0), CPU_REV(2, 0)
Bipin Ravi32705b12022-02-06 02:32:54 -0600118
Harrison Mutai14b1c122023-04-26 12:18:46 +0100119workaround_reset_start cortex_a710, ERRATUM(2136059), ERRATA_A710_2136059
Harrison Mutai1eb30382023-05-04 13:57:33 +0100120 sysreg_bit_set CORTEX_A710_CPUACTLR5_EL1, CORTEX_A710_CPUACTLR5_EL1_BIT_44
Harrison Mutai14b1c122023-04-26 12:18:46 +0100121workaround_reset_end cortex_a710, ERRATUM(2136059)
Bipin Ravid53069b2022-02-06 03:11:44 -0600122
Harrison Mutai14b1c122023-04-26 12:18:46 +0100123check_erratum_ls cortex_a710, ERRATUM(2136059), CPU_REV(2, 0)
Bipin Ravid53069b2022-02-06 03:11:44 -0600124
Harrison Mutai14b1c122023-04-26 12:18:46 +0100125workaround_reset_start cortex_a710, ERRATUM(2147715), ERRATA_A710_2147715
Harrison Mutai1eb30382023-05-04 13:57:33 +0100126 sysreg_bit_set CORTEX_A710_CPUACTLR_EL1, CORTEX_A710_CPUACTLR_EL1_BIT_22
Harrison Mutai14b1c122023-04-26 12:18:46 +0100127workaround_reset_end cortex_a710, ERRATUM(2147715)
Akram Ahmad1714c1d2022-07-21 15:25:08 +0100128
Harrison Mutai14b1c122023-04-26 12:18:46 +0100129check_erratum_range cortex_a710, ERRATUM(2147715), CPU_REV(2, 0), CPU_REV(2, 0)
Jayanth Dodderi Chidanandde4f5892022-09-01 22:09:54 +0100130
Harrison Mutai14b1c122023-04-26 12:18:46 +0100131workaround_reset_start cortex_a710, ERRATUM(2216384), ERRATA_A710_2216384
Harrison Mutai1eb30382023-05-04 13:57:33 +0100132 sysreg_bit_set CORTEX_A710_CPUACTLR5_EL1, CORTEX_A710_CPUACTLR5_EL1_BIT_17
Jayanth Dodderi Chidanandde4f5892022-09-01 22:09:54 +0100133
134 ldr x0,=0x5
135 msr CORTEX_A710_CPUPSELR_EL3, x0
136 ldr x0,=0x10F600E000
137 msr CORTEX_A710_CPUPOR_EL3, x0
138 ldr x0,=0x10FF80E000
139 msr CORTEX_A710_CPUPMR_EL3, x0
140 ldr x0,=0x80000000003FF
141 msr CORTEX_A710_CPUPCR_EL3, x0
Harrison Mutai14b1c122023-04-26 12:18:46 +0100142workaround_reset_end cortex_a710, ERRATUM(2216384)
Jayanth Dodderi Chidanandde4f5892022-09-01 22:09:54 +0100143
Harrison Mutai14b1c122023-04-26 12:18:46 +0100144check_erratum_ls cortex_a710, ERRATUM(2216384), CPU_REV(2, 0)
Jayanth Dodderi Chidanandde4f5892022-09-01 22:09:54 +0100145
Harrison Mutai14b1c122023-04-26 12:18:46 +0100146workaround_reset_start cortex_a710, ERRATUM(2267065), ERRATA_A710_2267065
Harrison Mutai1eb30382023-05-04 13:57:33 +0100147 sysreg_bit_set CORTEX_A710_CPUACTLR_EL1, CORTEX_A710_CPUACTLR_EL1_BIT_22
Harrison Mutai14b1c122023-04-26 12:18:46 +0100148workaround_reset_end cortex_a710, ERRATUM(2267065)
Harrison Mutaiac05cb42023-04-25 11:47:49 +0100149
Harrison Mutai14b1c122023-04-26 12:18:46 +0100150check_erratum_ls cortex_a710, ERRATUM(2267065), CPU_REV(2, 0)
Harrison Mutaiac05cb42023-04-25 11:47:49 +0100151
Harrison Mutai14b1c122023-04-26 12:18:46 +0100152workaround_reset_start cortex_a710, ERRATUM(2282622), ERRATA_A710_2282622
Harrison Mutai1eb30382023-05-04 13:57:33 +0100153 sysreg_bit_set CORTEX_A710_CPUACTLR2_EL1, BIT(0)
Harrison Mutai14b1c122023-04-26 12:18:46 +0100154workaround_reset_end cortex_a710, ERRATUM(2282622)
johpow017249fd02022-02-28 18:34:04 -0600155
Harrison Mutai14b1c122023-04-26 12:18:46 +0100156check_erratum_ls cortex_a710, ERRATUM(2282622), CPU_REV(2, 1)
johpow017249fd02022-02-28 18:34:04 -0600157
Harrison Mutai14b1c122023-04-26 12:18:46 +0100158workaround_runtime_start cortex_a710, ERRATUM(2291219), ERRATA_A710_2291219
Boyan Karatotevf8de5352022-10-03 14:21:28 +0100159 /* Set bit 36 in ACTLR2_EL1 */
Harrison Mutai1eb30382023-05-04 13:57:33 +0100160 sysreg_bit_set CORTEX_A710_CPUACTLR2_EL1, CORTEX_A710_CPUACTLR2_EL1_BIT_36
Harrison Mutai14b1c122023-04-26 12:18:46 +0100161workaround_runtime_end cortex_a710, ERRATUM(2291219), NO_ISB
Boyan Karatotevf8de5352022-10-03 14:21:28 +0100162
Harrison Mutai14b1c122023-04-26 12:18:46 +0100163check_erratum_ls cortex_a710, ERRATUM(2291219), CPU_REV(2, 0)
Boyan Karatotevf8de5352022-10-03 14:21:28 +0100164
Harrison Mutai14b1c122023-04-26 12:18:46 +0100165/*
166 * ERRATA_DSU_2313941 is defined in dsu_helpers.S but applies to Cortex-A710 as
167 * well. Create a symbollic link to existing errata workaround to get them
168 * registered under the Errata Framework.
Bipin Ravi77eab292022-07-12 15:53:21 -0500169 */
Harrison Mutai14b1c122023-04-26 12:18:46 +0100170.equ check_erratum_cortex_a710_2313941, check_errata_dsu_2313941
171.equ erratum_cortex_a710_2313941_wa, errata_dsu_2313941_wa
172add_erratum_entry cortex_a710, ERRATUM(2313941), ERRATA_DSU_2313941, APPLY_AT_RESET
Bipin Ravi77eab292022-07-12 15:53:21 -0500173
Harrison Mutai14b1c122023-04-26 12:18:46 +0100174workaround_reset_start cortex_a710, ERRATUM(2371105), ERRATA_A710_2371105
Bipin Ravi77eab292022-07-12 15:53:21 -0500175 /* Set bit 40 in CPUACTLR2_EL1 */
Harrison Mutai1eb30382023-05-04 13:57:33 +0100176 sysreg_bit_set CORTEX_A710_CPUACTLR2_EL1, CORTEX_A710_CPUACTLR2_EL1_BIT_40
Harrison Mutai14b1c122023-04-26 12:18:46 +0100177workaround_reset_end cortex_a710, ERRATUM(2371105)
Bipin Ravi77eab292022-07-12 15:53:21 -0500178
Harrison Mutai14b1c122023-04-26 12:18:46 +0100179check_erratum_ls cortex_a710, ERRATUM(2371105), CPU_REV(2, 0)
Bipin Ravi77eab292022-07-12 15:53:21 -0500180
Bipin Ravibfa14682023-10-17 07:55:55 -0500181workaround_reset_start cortex_a710, ERRATUM(2742423), ERRATA_A710_2742423
182 /* Set CPUACTLR5_EL1[56:55] to 2'b01 */
183 sysreg_bit_set CORTEX_A710_CPUACTLR5_EL1, BIT(55)
184 sysreg_bit_clear CORTEX_A710_CPUACTLR5_EL1, BIT(56)
185workaround_reset_end cortex_a710, ERRATUM(2742423)
186
187check_erratum_ls cortex_a710, ERRATUM(2742423), CPU_REV(2, 1)
188
Harrison Mutai14b1c122023-04-26 12:18:46 +0100189workaround_runtime_start cortex_a710, ERRATUM(2768515), ERRATA_A710_2768515
Bipin Ravief9a1552022-12-07 13:32:35 -0600190 /* dsb before isb of power down sequence */
191 dsb sy
Harrison Mutai14b1c122023-04-26 12:18:46 +0100192workaround_runtime_end cortex_a710, ERRATUM(2768515), NO_ISB
Bipin Ravief9a1552022-12-07 13:32:35 -0600193
Harrison Mutai14b1c122023-04-26 12:18:46 +0100194check_erratum_ls cortex_a710, ERRATUM(2768515), CPU_REV(2, 1)
Bipin Ravief9a1552022-12-07 13:32:35 -0600195
Sona Mathewe2fea182023-12-08 20:52:17 -0600196workaround_reset_start cortex_a710, ERRATUM(2778471), ERRATA_A710_2778471
197 sysreg_bit_set CORTEX_A710_CPUACTLR3_EL1, BIT(47)
198workaround_reset_end cortex_a710, ERRATUM(2778471)
199
200check_erratum_ls cortex_a710, ERRATUM(2778471), CPU_REV(2, 1)
201
Harrison Mutai14b1c122023-04-26 12:18:46 +0100202workaround_reset_start cortex_a710, CVE(2022, 23960), WORKAROUND_CVE_2022_23960
203#if IMAGE_BL31
204 /*
205 * The Cortex-A710 generic vectors are overridden to apply errata
206 * mitigation on exception entry from lower ELs.
207 */
Harrison Mutai1eb30382023-05-04 13:57:33 +0100208 override_vector_table wa_cve_vbar_cortex_a710
Harrison Mutai14b1c122023-04-26 12:18:46 +0100209#endif /* IMAGE_BL31 */
210workaround_reset_end cortex_a710, CVE(2022, 23960)
211
212check_erratum_chosen cortex_a710, CVE(2022, 23960), WORKAROUND_CVE_2022_23960
Bipin Ravi86499742022-01-18 01:59:06 -0600213
johpow01a3810e82021-05-18 15:23:31 -0500214 /* ----------------------------------------------------
215 * HW will do the cache maintenance while powering down
216 * ----------------------------------------------------
217 */
218func cortex_a710_core_pwr_dwn
Harrison Mutai14b1c122023-04-26 12:18:46 +0100219 apply_erratum cortex_a710, ERRATUM(2008768), ERRATA_A710_2008768
220 apply_erratum cortex_a710, ERRATUM(2291219), ERRATA_A710_2291219, NO_GET_CPU_REV
Boyan Karatotevf8de5352022-10-03 14:21:28 +0100221
johpow01a3810e82021-05-18 15:23:31 -0500222 /* ---------------------------------------------------
223 * Enable CPU power down bit in power control register
224 * ---------------------------------------------------
225 */
Harrison Mutai14b1c122023-04-26 12:18:46 +0100226 sysreg_bit_set CORTEX_A710_CPUPWRCTLR_EL1, CORTEX_A710_CPUPWRCTLR_EL1_CORE_PWRDN_BIT
227 apply_erratum cortex_a710, ERRATUM(2768515), ERRATA_A710_2768515, NO_GET_CPU_REV
johpow01a3810e82021-05-18 15:23:31 -0500228 isb
229 ret
230endfunc cortex_a710_core_pwr_dwn
231
Harrison Mutai14b1c122023-04-26 12:18:46 +0100232errata_report_shim cortex_a710
nayanpatel-arme55d3252021-08-06 16:39:48 -0700233
Harrison Mutai14b1c122023-04-26 12:18:46 +0100234cpu_reset_func_start cortex_a710
johpow01a3810e82021-05-18 15:23:31 -0500235 /* Disable speculative loads */
236 msr SSBS, xzr
Harrison Mutai14b1c122023-04-26 12:18:46 +0100237cpu_reset_func_end cortex_a710
johpow01a3810e82021-05-18 15:23:31 -0500238
239 /* ---------------------------------------------
240 * This function provides Cortex-A710 specific
241 * register information for crash reporting.
242 * It needs to return with x6 pointing to
243 * a list of register names in ascii and
244 * x8 - x15 having values of registers to be
245 * reported.
246 * ---------------------------------------------
247 */
248.section .rodata.cortex_a710_regs, "aS"
249cortex_a710_regs: /* The ascii list of register names to be reported */
250 .asciz "cpuectlr_el1", ""
251
252func cortex_a710_cpu_reg_dump
253 adr x6, cortex_a710_regs
254 mrs x8, CORTEX_A710_CPUECTLR_EL1
255 ret
256endfunc cortex_a710_cpu_reg_dump
257
258declare_cpu_ops cortex_a710, CORTEX_A710_MIDR, \
259 cortex_a710_reset_func, \
260 cortex_a710_core_pwr_dwn