blob: eab5ada7f781f80b7fbe9fd675ca012b79222d4a [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
Harrison Mutai14b1c122023-04-26 12:18:46 +010083check_erratum_ls cortex_a710, ERRATUM(2055002), 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
Harrison Mutai14b1c122023-04-26 12:18:46 +010090check_erratum_ls cortex_a710, ERRATUM(2058056), CPU_REV(2, 0)
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
Harrison Mutai14b1c122023-04-26 12:18:46 +0100181workaround_runtime_start cortex_a710, ERRATUM(2768515), ERRATA_A710_2768515
Bipin Ravief9a1552022-12-07 13:32:35 -0600182 /* dsb before isb of power down sequence */
183 dsb sy
Harrison Mutai14b1c122023-04-26 12:18:46 +0100184workaround_runtime_end cortex_a710, ERRATUM(2768515), NO_ISB
Bipin Ravief9a1552022-12-07 13:32:35 -0600185
Harrison Mutai14b1c122023-04-26 12:18:46 +0100186check_erratum_ls cortex_a710, ERRATUM(2768515), CPU_REV(2, 1)
Bipin Ravief9a1552022-12-07 13:32:35 -0600187
Harrison Mutai14b1c122023-04-26 12:18:46 +0100188workaround_reset_start cortex_a710, CVE(2022, 23960), WORKAROUND_CVE_2022_23960
189#if IMAGE_BL31
190 /*
191 * The Cortex-A710 generic vectors are overridden to apply errata
192 * mitigation on exception entry from lower ELs.
193 */
Harrison Mutai1eb30382023-05-04 13:57:33 +0100194 override_vector_table wa_cve_vbar_cortex_a710
Harrison Mutai14b1c122023-04-26 12:18:46 +0100195#endif /* IMAGE_BL31 */
196workaround_reset_end cortex_a710, CVE(2022, 23960)
197
198check_erratum_chosen cortex_a710, CVE(2022, 23960), WORKAROUND_CVE_2022_23960
Bipin Ravi86499742022-01-18 01:59:06 -0600199
johpow01a3810e82021-05-18 15:23:31 -0500200 /* ----------------------------------------------------
201 * HW will do the cache maintenance while powering down
202 * ----------------------------------------------------
203 */
204func cortex_a710_core_pwr_dwn
Harrison Mutai14b1c122023-04-26 12:18:46 +0100205 apply_erratum cortex_a710, ERRATUM(2008768), ERRATA_A710_2008768
206 apply_erratum cortex_a710, ERRATUM(2291219), ERRATA_A710_2291219, NO_GET_CPU_REV
Boyan Karatotevf8de5352022-10-03 14:21:28 +0100207
johpow01a3810e82021-05-18 15:23:31 -0500208 /* ---------------------------------------------------
209 * Enable CPU power down bit in power control register
210 * ---------------------------------------------------
211 */
Harrison Mutai14b1c122023-04-26 12:18:46 +0100212 sysreg_bit_set CORTEX_A710_CPUPWRCTLR_EL1, CORTEX_A710_CPUPWRCTLR_EL1_CORE_PWRDN_BIT
213 apply_erratum cortex_a710, ERRATUM(2768515), ERRATA_A710_2768515, NO_GET_CPU_REV
johpow01a3810e82021-05-18 15:23:31 -0500214 isb
215 ret
216endfunc cortex_a710_core_pwr_dwn
217
Harrison Mutai14b1c122023-04-26 12:18:46 +0100218errata_report_shim cortex_a710
nayanpatel-arme55d3252021-08-06 16:39:48 -0700219
Harrison Mutai14b1c122023-04-26 12:18:46 +0100220cpu_reset_func_start cortex_a710
johpow01a3810e82021-05-18 15:23:31 -0500221 /* Disable speculative loads */
222 msr SSBS, xzr
Harrison Mutai14b1c122023-04-26 12:18:46 +0100223cpu_reset_func_end cortex_a710
johpow01a3810e82021-05-18 15:23:31 -0500224
225 /* ---------------------------------------------
226 * This function provides Cortex-A710 specific
227 * register information for crash reporting.
228 * It needs to return with x6 pointing to
229 * a list of register names in ascii and
230 * x8 - x15 having values of registers to be
231 * reported.
232 * ---------------------------------------------
233 */
234.section .rodata.cortex_a710_regs, "aS"
235cortex_a710_regs: /* The ascii list of register names to be reported */
236 .asciz "cpuectlr_el1", ""
237
238func cortex_a710_cpu_reg_dump
239 adr x6, cortex_a710_regs
240 mrs x8, CORTEX_A710_CPUECTLR_EL1
241 ret
242endfunc cortex_a710_cpu_reg_dump
243
244declare_cpu_ops cortex_a710, CORTEX_A710_MIDR, \
245 cortex_a710_reset_func, \
246 cortex_a710_core_pwr_dwn