blob: a59b92c15d166fdd7b2310ea2fd9874337fcafaa [file] [log] [blame]
johpow01a3810e82021-05-18 15:23:31 -05001/*
Harrison Mutaie5249fe2022-12-09 12:14:25 +00002 * Copyright (c) 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_a510.h>
11#include <cpu_macros.S>
12#include <plat_macros.S>
13
14/* Hardware handled coherency */
15#if HW_ASSISTED_COHERENCY == 0
johpow01de7b5242022-01-04 16:15:18 -060016#error "Cortex-A510 must be compiled with HW_ASSISTED_COHERENCY enabled"
johpow01a3810e82021-05-18 15:23:31 -050017#endif
18
19/* 64-bit only core */
20#if CTX_INCLUDE_AARCH32_REGS == 1
johpow01de7b5242022-01-04 16:15:18 -060021#error "Cortex-A510 supports only AArch64. Compile with CTX_INCLUDE_AARCH32_REGS=0"
johpow01a3810e82021-05-18 15:23:31 -050022#endif
23
Jayanth Dodderi Chidanand5818c7a2023-04-11 15:15:31 +010024workaround_reset_start cortex_a510, ERRATUM(1922240), ERRATA_A510_1922240
johpow01de7b5242022-01-04 16:15:18 -060025 /* Apply the workaround by setting IMP_CMPXACTLR_EL1[11:10] = 0b11. */
Jayanth Dodderi Chidanand399472c2023-04-11 21:58:21 +010026 sysreg_bitfield_insert CORTEX_A510_CMPXACTLR_EL1, CORTEX_A510_CMPXACTLR_EL1_SNPPREFERUNIQUE_DISABLE, \
27 CORTEX_A510_CMPXACTLR_EL1_SNPPREFERUNIQUE_SHIFT, CORTEX_A510_CMPXACTLR_EL1_SNPPREFERUNIQUE_WIDTH
Jayanth Dodderi Chidanand5818c7a2023-04-11 15:15:31 +010028workaround_reset_end cortex_a510, ERRATUM(1922240)
johpow01de7b5242022-01-04 16:15:18 -060029
Jayanth Dodderi Chidanand5818c7a2023-04-11 15:15:31 +010030check_erratum_ls cortex_a510, ERRATUM(1922240), CPU_REV(0, 0)
johpow01de7b5242022-01-04 16:15:18 -060031
Jayanth Dodderi Chidanand5818c7a2023-04-11 15:15:31 +010032workaround_reset_start cortex_a510, ERRATUM(2041909), ERRATA_A510_2041909
johpow015a993002022-01-11 17:54:41 -060033 /* Apply workaround */
34 mov x0, xzr
35 msr S3_6_C15_C4_0, x0
36 isb
37
38 mov x0, #0x8500000
39 msr S3_6_C15_C4_2, x0
40
41 mov x0, #0x1F700000
42 movk x0, #0x8, lsl #32
43 msr S3_6_C15_C4_3, x0
44
45 mov x0, #0x3F1
46 movk x0, #0x110, lsl #16
47 msr S3_6_C15_C4_1, x0
Jayanth Dodderi Chidanand5818c7a2023-04-11 15:15:31 +010048workaround_reset_end cortex_a510, ERRATUM(2041909)
johpow015a993002022-01-11 17:54:41 -060049
Jayanth Dodderi Chidanand5818c7a2023-04-11 15:15:31 +010050check_erratum_range cortex_a510, ERRATUM(2041909), CPU_REV(0, 2), CPU_REV(0, 2)
johpow015a993002022-01-11 17:54:41 -060051
Jayanth Dodderi Chidanand5818c7a2023-04-11 15:15:31 +010052workaround_reset_start cortex_a510, ERRATUM(2042739), ERRATA_A510_2042739
Jayanth Dodderi Chidanand16e5ca22023-04-11 11:42:53 +010053 /* Apply the workaround by disabling ReadPreferUnique. */
Jayanth Dodderi Chidanand399472c2023-04-11 21:58:21 +010054 sysreg_bitfield_insert CORTEX_A510_CPUECTLR_EL1, CORTEX_A510_CPUECTLR_EL1_READPREFERUNIQUE_DISABLE, \
55 CORTEX_A510_CPUECTLR_EL1_READPREFERUNIQUE_SHIFT, CORTEX_A510_CPUECTLR_EL1_READPREFERUNIQUE_WIDTH
Jayanth Dodderi Chidanand5818c7a2023-04-11 15:15:31 +010056workaround_reset_end cortex_a510, ERRATUM(2042739)
Jayanth Dodderi Chidanand16e5ca22023-04-11 11:42:53 +010057
Jayanth Dodderi Chidanand5818c7a2023-04-11 15:15:31 +010058check_erratum_ls cortex_a510, ERRATUM(2042739), CPU_REV(0, 2)
Jayanth Dodderi Chidanand16e5ca22023-04-11 11:42:53 +010059
Sona Mathewd273f762023-10-12 12:04:53 -050060workaround_reset_start cortex_a510, ERRATUM(2080326), ERRATA_A510_2080326
61 /* Apply workaround */
62 mov x0, #1
63 msr S3_6_C15_C4_0, x0
64 isb
65
66 mov x0, #0x0100
67 movk x0, #0x0E08, lsl #16
68 msr S3_6_C15_C4_2, x0
69
70 mov x0, #0x0300
71 movk x0, #0x0F1F, lsl #16
72 movk x0, #0x0008, lsl #32
73 msr S3_6_C15_C4_3, x0
74
75 mov x0, #0x03F1
76 movk x0, #0x00C0, lsl #16
77 msr S3_6_C15_C4_1, x0
78
79 isb
80workaround_reset_end cortex_a510, ERRATUM(2080326)
81
82check_erratum_range cortex_a510, ERRATUM(2080326), CPU_REV(0, 2), CPU_REV(0, 2)
83
Jayanth Dodderi Chidanand5818c7a2023-04-11 15:15:31 +010084workaround_reset_start cortex_a510, ERRATUM(2172148), ERRATA_A510_2172148
Jayanth Dodderi Chidanand16e5ca22023-04-11 11:42:53 +010085 /*
86 * Force L2 allocation of transient lines by setting
87 * CPUECTLR_EL1.RSCTL=0b01 and CPUECTLR_EL1.NTCTL=0b01.
88 */
89 mrs x0, CORTEX_A510_CPUECTLR_EL1
90 mov x1, #1
91 bfi x0, x1, #CORTEX_A510_CPUECTLR_EL1_RSCTL_SHIFT, #2
92 bfi x0, x1, #CORTEX_A510_CPUECTLR_EL1_NTCTL_SHIFT, #2
93 msr CORTEX_A510_CPUECTLR_EL1, x0
Jayanth Dodderi Chidanand5818c7a2023-04-11 15:15:31 +010094workaround_reset_end cortex_a510, ERRATUM(2172148)
johpow013ba9cb22022-02-13 21:00:10 -060095
Jayanth Dodderi Chidanand5818c7a2023-04-11 15:15:31 +010096check_erratum_ls cortex_a510, ERRATUM(2172148), CPU_REV(1, 0)
johpow013ba9cb22022-02-13 21:00:10 -060097
Jayanth Dodderi Chidanand5818c7a2023-04-11 15:15:31 +010098workaround_reset_start cortex_a510, ERRATUM(2218950), ERRATA_A510_2218950
johpow013ead2952022-02-14 20:19:08 -060099 /* Set bit 18 in CPUACTLR_EL1 */
Jayanth Dodderi Chidanand399472c2023-04-11 21:58:21 +0100100 sysreg_bitfield_insert CORTEX_A510_CPUACTLR_EL1, CORTEX_A510_CPUACTLR_EL1_ALIAS_LOADSTORE_DISABLE, \
101 CORTEX_A510_CPUACTLR_EL1_ALIAS_LOADSTORE_SHIFT, CORTEX_A510_CPUACTLR_EL1_ALIAS_LOADSTORE_WIDTH
johpow013ead2952022-02-14 20:19:08 -0600102
103 /* Set bit 25 in CMPXACTLR_EL1 */
Jayanth Dodderi Chidanand399472c2023-04-11 21:58:21 +0100104 sysreg_bitfield_insert CORTEX_A510_CMPXACTLR_EL1, CORTEX_A510_CMPXACTLR_EL1_ALIAS_LOADSTORE_DISABLE, \
105 CORTEX_A510_CMPXACTLR_EL1_ALIAS_LOADSTORE_SHIFT, CORTEX_A510_CMPXACTLR_EL1_ALIAS_LOADSTORE_WIDTH
106
Jayanth Dodderi Chidanand5818c7a2023-04-11 15:15:31 +0100107workaround_reset_end cortex_a510, ERRATUM(2218950)
johpow013ead2952022-02-14 20:19:08 -0600108
Jayanth Dodderi Chidanand5818c7a2023-04-11 15:15:31 +0100109check_erratum_ls cortex_a510, ERRATUM(2218950), CPU_REV(1, 0)
johpow013ead2952022-02-14 20:19:08 -0600110
johpow01ac55c012022-02-15 22:55:22 -0600111 /* --------------------------------------------------
Jayanth Dodderi Chidanand16e5ca22023-04-11 11:42:53 +0100112 * This workaround is not a typical errata fix. MPMM
113 * is disabled here, but this conflicts with the BL31
114 * MPMM support. So in addition to simply disabling
115 * the feature, a flag is set in the MPMM library
116 * indicating that it should not be enabled even if
117 * ENABLE_MPMM=1.
johpow01ac55c012022-02-15 22:55:22 -0600118 * --------------------------------------------------
119 */
Jayanth Dodderi Chidanand5818c7a2023-04-11 15:15:31 +0100120workaround_reset_start cortex_a510, ERRATUM(2250311), ERRATA_A510_2250311
Jayanth Dodderi Chidanand16e5ca22023-04-11 11:42:53 +0100121 /* Disable MPMM */
122 mrs x0, CPUMPMMCR_EL3
123 bfm x0, xzr, #0, #0 /* bfc instruction does not work in GCC */
124 msr CPUMPMMCR_EL3, x0
125
126#if ENABLE_MPMM && IMAGE_BL31
127 /* If ENABLE_MPMM is set, tell the runtime lib to skip enabling it. */
128 bl mpmm_errata_disable
129#endif
Jayanth Dodderi Chidanand5818c7a2023-04-11 15:15:31 +0100130workaround_reset_end cortex_a510, ERRATUM(2250311)
johpow01ac55c012022-02-15 22:55:22 -0600131
Jayanth Dodderi Chidanand5818c7a2023-04-11 15:15:31 +0100132check_erratum_ls cortex_a510, ERRATUM(2250311), CPU_REV(1, 0)
Jayanth Dodderi Chidanand16e5ca22023-04-11 11:42:53 +0100133
Jayanth Dodderi Chidanand5818c7a2023-04-11 15:15:31 +0100134workaround_reset_start cortex_a510, ERRATUM(2288014), ERRATA_A510_2288014
Jayanth Dodderi Chidanand16e5ca22023-04-11 11:42:53 +0100135 /* Apply the workaround by setting IMP_CPUACTLR_EL1[18] = 0b1. */
Jayanth Dodderi Chidanand399472c2023-04-11 21:58:21 +0100136 sysreg_bitfield_insert CORTEX_A510_CPUACTLR_EL1, CORTEX_A510_CPUACTLR_EL1_DATA_CORRUPT_DISABLE, \
137 CORTEX_A510_CPUACTLR_EL1_DATA_CORRUPT_SHIFT, CORTEX_A510_CPUACTLR_EL1_DATA_CORRUPT_WIDTH
Jayanth Dodderi Chidanand5818c7a2023-04-11 15:15:31 +0100138workaround_reset_end cortex_a510, ERRATUM(2288014)
Jayanth Dodderi Chidanand16e5ca22023-04-11 11:42:53 +0100139
Jayanth Dodderi Chidanand5818c7a2023-04-11 15:15:31 +0100140check_erratum_ls cortex_a510, ERRATUM(2288014), CPU_REV(1, 0)
Akram Ahmada85254e2022-07-21 14:01:33 +0100141
Jayanth Dodderi Chidanand5818c7a2023-04-11 15:15:31 +0100142workaround_reset_start cortex_a510, ERRATUM(2347730), ERRATA_A510_2347730
Akram Ahmada85254e2022-07-21 14:01:33 +0100143 /*
144 * Set CPUACTLR_EL1[17] to 1'b1, which disables
145 * specific microarchitectural clock gating
146 * behaviour.
147 */
Jayanth Dodderi Chidanand399472c2023-04-11 21:58:21 +0100148 sysreg_bit_set CORTEX_A510_CPUACTLR_EL1, CORTEX_A510_CPUACTLR_EL1_BIT_17
Jayanth Dodderi Chidanand5818c7a2023-04-11 15:15:31 +0100149workaround_reset_end cortex_a510, ERRATUM(2347730)
Akram Ahmada85254e2022-07-21 14:01:33 +0100150
Jayanth Dodderi Chidanand5818c7a2023-04-11 15:15:31 +0100151check_erratum_ls cortex_a510, ERRATUM(2347730), CPU_REV(1, 1)
Akram Ahmad60accba2022-07-22 16:20:44 +0100152
Jayanth Dodderi Chidanand5818c7a2023-04-11 15:15:31 +0100153workaround_reset_start cortex_a510, ERRATUM(2371937), ERRATA_A510_2371937
Akram Ahmad60accba2022-07-22 16:20:44 +0100154 /*
155 * Cacheable atomic operations can be forced
156 * to be executed near by setting
157 * IMP_CPUECTLR_EL1.ATOM=0b010. ATOM is found
158 * in [40:38] of CPUECTLR_EL1.
159 */
Jayanth Dodderi Chidanand399472c2023-04-11 21:58:21 +0100160 sysreg_bitfield_insert CORTEX_A510_CPUECTLR_EL1, CORTEX_A510_CPUECTLR_EL1_ATOM_EXECALLINSTRNEAR, \
161 CORTEX_A510_CPUECTLR_EL1_ATOM_SHIFT, CORTEX_A510_CPUECTLR_EL1_ATOM_WIDTH
Jayanth Dodderi Chidanand5818c7a2023-04-11 15:15:31 +0100162workaround_reset_end cortex_a510, ERRATUM(2371937)
Akram Ahmad60accba2022-07-22 16:20:44 +0100163
Jayanth Dodderi Chidanand5818c7a2023-04-11 15:15:31 +0100164check_erratum_ls cortex_a510, ERRATUM(2371937), CPU_REV(1, 1)
Akram Ahmad60accba2022-07-22 16:20:44 +0100165
Jayanth Dodderi Chidanand5818c7a2023-04-11 15:15:31 +0100166workaround_reset_start cortex_a510, ERRATUM(2666669), ERRATA_A510_2666669
Jayanth Dodderi Chidanand399472c2023-04-11 21:58:21 +0100167 sysreg_bit_set CORTEX_A510_CPUACTLR_EL1, CORTEX_A510_CPUACTLR_EL1_BIT_38
Jayanth Dodderi Chidanand5818c7a2023-04-11 15:15:31 +0100168workaround_reset_end cortex_a510, ERRATUM(2666669)
Akram Ahmad89034d62022-09-21 13:59:56 +0100169
Jayanth Dodderi Chidanand5818c7a2023-04-11 15:15:31 +0100170check_erratum_ls cortex_a510, ERRATUM(2666669), CPU_REV(1, 1)
Akram Ahmad89034d62022-09-21 13:59:56 +0100171
Jayanth Dodderi Chidanand5818c7a2023-04-11 15:15:31 +0100172.global erratum_cortex_a510_2684597_wa
173workaround_runtime_start cortex_a510, ERRATUM(2684597), ERRATA_A510_2684597, CORTEX_A510_MIDR
Andre Przywara744043c2023-03-23 11:50:32 +0000174 /*
175 * Many assemblers do not yet understand the "tsb csync" mnemonic,
176 * so use the equivalent hint instruction.
177 */
178 hint #18 /* tsb csync */
Jayanth Dodderi Chidanand5818c7a2023-04-11 15:15:31 +0100179workaround_runtime_end cortex_a510, ERRATUM(2684597)
180
181check_erratum_ls cortex_a510, ERRATUM(2684597), CPU_REV(1, 2)
182
183/*
184 * ERRATA_DSU_2313941 :
185 * The errata is defined in dsu_helpers.S but applies to cortex_a510
186 * as well. Henceforth creating symbolic names to the already existing errata
187 * workaround functions to get them registered under the Errata Framework.
Harrison Mutaie5249fe2022-12-09 12:14:25 +0000188 */
Jayanth Dodderi Chidanand5818c7a2023-04-11 15:15:31 +0100189.equ check_erratum_cortex_a510_2313941, check_errata_dsu_2313941
190.equ erratum_cortex_a510_2313941_wa, errata_dsu_2313941_wa
191add_erratum_entry cortex_a510, ERRATUM(2313941), ERRATA_DSU_2313941, APPLY_AT_RESET
Harrison Mutaie5249fe2022-12-09 12:14:25 +0000192
johpow01a3810e82021-05-18 15:23:31 -0500193 /* ----------------------------------------------------
194 * HW will do the cache maintenance while powering down
195 * ----------------------------------------------------
196 */
197func cortex_a510_core_pwr_dwn
198 /* ---------------------------------------------------
199 * Enable CPU power down bit in power control register
200 * ---------------------------------------------------
201 */
Jayanth Dodderi Chidanand399472c2023-04-11 21:58:21 +0100202 sysreg_bit_set CORTEX_A510_CPUPWRCTLR_EL1, CORTEX_A510_CPUPWRCTLR_EL1_CORE_PWRDN_BIT
johpow01a3810e82021-05-18 15:23:31 -0500203 isb
204 ret
205endfunc cortex_a510_core_pwr_dwn
206
Jayanth Dodderi Chidanand5818c7a2023-04-11 15:15:31 +0100207errata_report_shim cortex_a510
johpow01de7b5242022-01-04 16:15:18 -0600208
Jayanth Dodderi Chidanand5818c7a2023-04-11 15:15:31 +0100209cpu_reset_func_start cortex_a510
johpow01a3810e82021-05-18 15:23:31 -0500210 /* Disable speculative loads */
211 msr SSBS, xzr
Jayanth Dodderi Chidanand5818c7a2023-04-11 15:15:31 +0100212cpu_reset_func_end cortex_a510
johpow01a3810e82021-05-18 15:23:31 -0500213
214 /* ---------------------------------------------
215 * This function provides Cortex-A510 specific
216 * register information for crash reporting.
217 * It needs to return with x6 pointing to
218 * a list of register names in ascii and
219 * x8 - x15 having values of registers to be
220 * reported.
221 * ---------------------------------------------
222 */
223.section .rodata.cortex_a510_regs, "aS"
224cortex_a510_regs: /* The ascii list of register names to be reported */
225 .asciz "cpuectlr_el1", ""
226
227func cortex_a510_cpu_reg_dump
228 adr x6, cortex_a510_regs
229 mrs x8, CORTEX_A510_CPUECTLR_EL1
230 ret
231endfunc cortex_a510_cpu_reg_dump
232
233declare_cpu_ops cortex_a510, CORTEX_A510_MIDR, \
234 cortex_a510_reset_func, \
235 cortex_a510_core_pwr_dwn