blob: 6fce24e02416e2a0408feea151cefd8cf87c4ce0 [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
Jayanth Dodderi Chidanand5818c7a2023-04-11 15:15:31 +010060workaround_reset_start cortex_a510, ERRATUM(2172148), ERRATA_A510_2172148
Jayanth Dodderi Chidanand16e5ca22023-04-11 11:42:53 +010061 /*
62 * Force L2 allocation of transient lines by setting
63 * CPUECTLR_EL1.RSCTL=0b01 and CPUECTLR_EL1.NTCTL=0b01.
64 */
65 mrs x0, CORTEX_A510_CPUECTLR_EL1
66 mov x1, #1
67 bfi x0, x1, #CORTEX_A510_CPUECTLR_EL1_RSCTL_SHIFT, #2
68 bfi x0, x1, #CORTEX_A510_CPUECTLR_EL1_NTCTL_SHIFT, #2
69 msr CORTEX_A510_CPUECTLR_EL1, x0
Jayanth Dodderi Chidanand5818c7a2023-04-11 15:15:31 +010070workaround_reset_end cortex_a510, ERRATUM(2172148)
johpow013ba9cb22022-02-13 21:00:10 -060071
Jayanth Dodderi Chidanand5818c7a2023-04-11 15:15:31 +010072check_erratum_ls cortex_a510, ERRATUM(2172148), CPU_REV(1, 0)
johpow013ba9cb22022-02-13 21:00:10 -060073
Jayanth Dodderi Chidanand5818c7a2023-04-11 15:15:31 +010074workaround_reset_start cortex_a510, ERRATUM(2218950), ERRATA_A510_2218950
johpow013ead2952022-02-14 20:19:08 -060075 /* Set bit 18 in CPUACTLR_EL1 */
Jayanth Dodderi Chidanand399472c2023-04-11 21:58:21 +010076 sysreg_bitfield_insert CORTEX_A510_CPUACTLR_EL1, CORTEX_A510_CPUACTLR_EL1_ALIAS_LOADSTORE_DISABLE, \
77 CORTEX_A510_CPUACTLR_EL1_ALIAS_LOADSTORE_SHIFT, CORTEX_A510_CPUACTLR_EL1_ALIAS_LOADSTORE_WIDTH
johpow013ead2952022-02-14 20:19:08 -060078
79 /* Set bit 25 in CMPXACTLR_EL1 */
Jayanth Dodderi Chidanand399472c2023-04-11 21:58:21 +010080 sysreg_bitfield_insert CORTEX_A510_CMPXACTLR_EL1, CORTEX_A510_CMPXACTLR_EL1_ALIAS_LOADSTORE_DISABLE, \
81 CORTEX_A510_CMPXACTLR_EL1_ALIAS_LOADSTORE_SHIFT, CORTEX_A510_CMPXACTLR_EL1_ALIAS_LOADSTORE_WIDTH
82
Jayanth Dodderi Chidanand5818c7a2023-04-11 15:15:31 +010083workaround_reset_end cortex_a510, ERRATUM(2218950)
johpow013ead2952022-02-14 20:19:08 -060084
Jayanth Dodderi Chidanand5818c7a2023-04-11 15:15:31 +010085check_erratum_ls cortex_a510, ERRATUM(2218950), CPU_REV(1, 0)
johpow013ead2952022-02-14 20:19:08 -060086
johpow01ac55c012022-02-15 22:55:22 -060087 /* --------------------------------------------------
Jayanth Dodderi Chidanand16e5ca22023-04-11 11:42:53 +010088 * This workaround is not a typical errata fix. MPMM
89 * is disabled here, but this conflicts with the BL31
90 * MPMM support. So in addition to simply disabling
91 * the feature, a flag is set in the MPMM library
92 * indicating that it should not be enabled even if
93 * ENABLE_MPMM=1.
johpow01ac55c012022-02-15 22:55:22 -060094 * --------------------------------------------------
95 */
Jayanth Dodderi Chidanand5818c7a2023-04-11 15:15:31 +010096workaround_reset_start cortex_a510, ERRATUM(2250311), ERRATA_A510_2250311
Jayanth Dodderi Chidanand16e5ca22023-04-11 11:42:53 +010097 /* Disable MPMM */
98 mrs x0, CPUMPMMCR_EL3
99 bfm x0, xzr, #0, #0 /* bfc instruction does not work in GCC */
100 msr CPUMPMMCR_EL3, x0
101
102#if ENABLE_MPMM && IMAGE_BL31
103 /* If ENABLE_MPMM is set, tell the runtime lib to skip enabling it. */
104 bl mpmm_errata_disable
105#endif
Jayanth Dodderi Chidanand5818c7a2023-04-11 15:15:31 +0100106workaround_reset_end cortex_a510, ERRATUM(2250311)
johpow01ac55c012022-02-15 22:55:22 -0600107
Jayanth Dodderi Chidanand5818c7a2023-04-11 15:15:31 +0100108check_erratum_ls cortex_a510, ERRATUM(2250311), CPU_REV(1, 0)
Jayanth Dodderi Chidanand16e5ca22023-04-11 11:42:53 +0100109
Jayanth Dodderi Chidanand5818c7a2023-04-11 15:15:31 +0100110workaround_reset_start cortex_a510, ERRATUM(2288014), ERRATA_A510_2288014
Jayanth Dodderi Chidanand16e5ca22023-04-11 11:42:53 +0100111 /* Apply the workaround by setting IMP_CPUACTLR_EL1[18] = 0b1. */
Jayanth Dodderi Chidanand399472c2023-04-11 21:58:21 +0100112 sysreg_bitfield_insert CORTEX_A510_CPUACTLR_EL1, CORTEX_A510_CPUACTLR_EL1_DATA_CORRUPT_DISABLE, \
113 CORTEX_A510_CPUACTLR_EL1_DATA_CORRUPT_SHIFT, CORTEX_A510_CPUACTLR_EL1_DATA_CORRUPT_WIDTH
Jayanth Dodderi Chidanand5818c7a2023-04-11 15:15:31 +0100114workaround_reset_end cortex_a510, ERRATUM(2288014)
Jayanth Dodderi Chidanand16e5ca22023-04-11 11:42:53 +0100115
Jayanth Dodderi Chidanand5818c7a2023-04-11 15:15:31 +0100116check_erratum_ls cortex_a510, ERRATUM(2288014), CPU_REV(1, 0)
Akram Ahmada85254e2022-07-21 14:01:33 +0100117
Jayanth Dodderi Chidanand5818c7a2023-04-11 15:15:31 +0100118workaround_reset_start cortex_a510, ERRATUM(2347730), ERRATA_A510_2347730
Akram Ahmada85254e2022-07-21 14:01:33 +0100119 /*
120 * Set CPUACTLR_EL1[17] to 1'b1, which disables
121 * specific microarchitectural clock gating
122 * behaviour.
123 */
Jayanth Dodderi Chidanand399472c2023-04-11 21:58:21 +0100124 sysreg_bit_set CORTEX_A510_CPUACTLR_EL1, CORTEX_A510_CPUACTLR_EL1_BIT_17
Jayanth Dodderi Chidanand5818c7a2023-04-11 15:15:31 +0100125workaround_reset_end cortex_a510, ERRATUM(2347730)
Akram Ahmada85254e2022-07-21 14:01:33 +0100126
Jayanth Dodderi Chidanand5818c7a2023-04-11 15:15:31 +0100127check_erratum_ls cortex_a510, ERRATUM(2347730), CPU_REV(1, 1)
Akram Ahmad60accba2022-07-22 16:20:44 +0100128
Jayanth Dodderi Chidanand5818c7a2023-04-11 15:15:31 +0100129workaround_reset_start cortex_a510, ERRATUM(2371937), ERRATA_A510_2371937
Akram Ahmad60accba2022-07-22 16:20:44 +0100130 /*
131 * Cacheable atomic operations can be forced
132 * to be executed near by setting
133 * IMP_CPUECTLR_EL1.ATOM=0b010. ATOM is found
134 * in [40:38] of CPUECTLR_EL1.
135 */
Jayanth Dodderi Chidanand399472c2023-04-11 21:58:21 +0100136 sysreg_bitfield_insert CORTEX_A510_CPUECTLR_EL1, CORTEX_A510_CPUECTLR_EL1_ATOM_EXECALLINSTRNEAR, \
137 CORTEX_A510_CPUECTLR_EL1_ATOM_SHIFT, CORTEX_A510_CPUECTLR_EL1_ATOM_WIDTH
Jayanth Dodderi Chidanand5818c7a2023-04-11 15:15:31 +0100138workaround_reset_end cortex_a510, ERRATUM(2371937)
Akram Ahmad60accba2022-07-22 16:20:44 +0100139
Jayanth Dodderi Chidanand5818c7a2023-04-11 15:15:31 +0100140check_erratum_ls cortex_a510, ERRATUM(2371937), CPU_REV(1, 1)
Akram Ahmad60accba2022-07-22 16:20:44 +0100141
Jayanth Dodderi Chidanand5818c7a2023-04-11 15:15:31 +0100142workaround_reset_start cortex_a510, ERRATUM(2666669), ERRATA_A510_2666669
Jayanth Dodderi Chidanand399472c2023-04-11 21:58:21 +0100143 sysreg_bit_set CORTEX_A510_CPUACTLR_EL1, CORTEX_A510_CPUACTLR_EL1_BIT_38
Jayanth Dodderi Chidanand5818c7a2023-04-11 15:15:31 +0100144workaround_reset_end cortex_a510, ERRATUM(2666669)
Akram Ahmad89034d62022-09-21 13:59:56 +0100145
Jayanth Dodderi Chidanand5818c7a2023-04-11 15:15:31 +0100146check_erratum_ls cortex_a510, ERRATUM(2666669), CPU_REV(1, 1)
Akram Ahmad89034d62022-09-21 13:59:56 +0100147
Jayanth Dodderi Chidanand5818c7a2023-04-11 15:15:31 +0100148.global erratum_cortex_a510_2684597_wa
149workaround_runtime_start cortex_a510, ERRATUM(2684597), ERRATA_A510_2684597, CORTEX_A510_MIDR
Andre Przywara744043c2023-03-23 11:50:32 +0000150 /*
151 * Many assemblers do not yet understand the "tsb csync" mnemonic,
152 * so use the equivalent hint instruction.
153 */
154 hint #18 /* tsb csync */
Jayanth Dodderi Chidanand5818c7a2023-04-11 15:15:31 +0100155workaround_runtime_end cortex_a510, ERRATUM(2684597)
156
157check_erratum_ls cortex_a510, ERRATUM(2684597), CPU_REV(1, 2)
158
159/*
160 * ERRATA_DSU_2313941 :
161 * The errata is defined in dsu_helpers.S but applies to cortex_a510
162 * as well. Henceforth creating symbolic names to the already existing errata
163 * workaround functions to get them registered under the Errata Framework.
Harrison Mutaie5249fe2022-12-09 12:14:25 +0000164 */
Jayanth Dodderi Chidanand5818c7a2023-04-11 15:15:31 +0100165.equ check_erratum_cortex_a510_2313941, check_errata_dsu_2313941
166.equ erratum_cortex_a510_2313941_wa, errata_dsu_2313941_wa
167add_erratum_entry cortex_a510, ERRATUM(2313941), ERRATA_DSU_2313941, APPLY_AT_RESET
Harrison Mutaie5249fe2022-12-09 12:14:25 +0000168
johpow01a3810e82021-05-18 15:23:31 -0500169 /* ----------------------------------------------------
170 * HW will do the cache maintenance while powering down
171 * ----------------------------------------------------
172 */
173func cortex_a510_core_pwr_dwn
174 /* ---------------------------------------------------
175 * Enable CPU power down bit in power control register
176 * ---------------------------------------------------
177 */
Jayanth Dodderi Chidanand399472c2023-04-11 21:58:21 +0100178 sysreg_bit_set CORTEX_A510_CPUPWRCTLR_EL1, CORTEX_A510_CPUPWRCTLR_EL1_CORE_PWRDN_BIT
johpow01a3810e82021-05-18 15:23:31 -0500179 isb
180 ret
181endfunc cortex_a510_core_pwr_dwn
182
Jayanth Dodderi Chidanand5818c7a2023-04-11 15:15:31 +0100183errata_report_shim cortex_a510
johpow01de7b5242022-01-04 16:15:18 -0600184
Jayanth Dodderi Chidanand5818c7a2023-04-11 15:15:31 +0100185cpu_reset_func_start cortex_a510
johpow01a3810e82021-05-18 15:23:31 -0500186 /* Disable speculative loads */
187 msr SSBS, xzr
Jayanth Dodderi Chidanand5818c7a2023-04-11 15:15:31 +0100188cpu_reset_func_end cortex_a510
johpow01a3810e82021-05-18 15:23:31 -0500189
190 /* ---------------------------------------------
191 * This function provides Cortex-A510 specific
192 * register information for crash reporting.
193 * It needs to return with x6 pointing to
194 * a list of register names in ascii and
195 * x8 - x15 having values of registers to be
196 * reported.
197 * ---------------------------------------------
198 */
199.section .rodata.cortex_a510_regs, "aS"
200cortex_a510_regs: /* The ascii list of register names to be reported */
201 .asciz "cpuectlr_el1", ""
202
203func cortex_a510_cpu_reg_dump
204 adr x6, cortex_a510_regs
205 mrs x8, CORTEX_A510_CPUECTLR_EL1
206 ret
207endfunc cortex_a510_cpu_reg_dump
208
209declare_cpu_ops cortex_a510, CORTEX_A510_MIDR, \
210 cortex_a510_reset_func, \
211 cortex_a510_core_pwr_dwn