blob: 9586a5b34e6e50f0a1f0aa7dabf4884a121bfd8b [file] [log] [blame]
johpow01a3810e82021-05-18 15:23:31 -05001/*
Bipin Ravi2f73d972022-01-20 00:01:04 -06002 * Copyright (c) 2021-2022, 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_x2.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 X2 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 X2 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_X2_BHB_LOOP_COUNT, cortex_x2
27#endif /* WORKAROUND_CVE_2022_23960 */
28
johpow0115f10bd2021-12-01 17:40:39 -060029 /* --------------------------------------------------
johpow010afef362021-12-02 13:25:50 -060030 * Errata Workaround for Cortex X2 Errata #2002765.
31 * This applies to revisions r0p0, r1p0, and r2p0 and
32 * is open.
33 * x0: variant[4:7] and revision[0:3] of current cpu.
34 * Shall clobber: x0, x1, x17
35 * --------------------------------------------------
36 */
37func errata_cortex_x2_2002765_wa
38 /* Check workaround compatibility. */
39 mov x17, x30
40 bl check_errata_2002765
41 cbz x0, 1f
42
43 ldr x0, =0x6
44 msr S3_6_C15_C8_0, x0 /* CPUPSELR_EL3 */
45 ldr x0, =0xF3A08002
46 msr S3_6_C15_C8_2, x0 /* CPUPOR_EL3 */
47 ldr x0, =0xFFF0F7FE
48 msr S3_6_C15_C8_3, x0 /* CPUPMR_EL3 */
49 ldr x0, =0x40000001003ff
50 msr S3_6_C15_C8_1, x0 /* CPUPCR_EL3 */
51 isb
52
531:
54 ret x17
55endfunc errata_cortex_x2_2002765_wa
56
57func check_errata_2002765
58 /* Applies to r0p0 - r2p0 */
59 mov x1, #0x20
60 b cpu_rev_var_ls
61endfunc check_errata_2002765
62
63 /* --------------------------------------------------
johpow01f6c37de2021-12-03 11:27:33 -060064 * Errata Workaround for Cortex X2 Errata #2058056.
65 * This applies to revisions r0p0, r1p0, and r2p0 and
66 * is open.
67 * x0: variant[4:7] and revision[0:3] of current cpu.
68 * Shall clobber: x0, x1, x17
69 * --------------------------------------------------
70 */
71func errata_cortex_x2_2058056_wa
72 /* Check workaround compatibility. */
73 mov x17, x30
74 bl check_errata_2058056
75 cbz x0, 1f
76
77 mrs x1, CORTEX_X2_CPUECTLR2_EL1
78 mov x0, #CORTEX_X2_CPUECTLR2_EL1_PF_MODE_CNSRV
79 bfi x1, x0, #CORTEX_X2_CPUECTLR2_EL1_PF_MODE_SHIFT, #CORTEX_X2_CPUECTLR2_EL1_PF_MODE_WIDTH
80 msr CORTEX_X2_CPUECTLR2_EL1, x1
81
821:
83 ret x17
84endfunc errata_cortex_x2_2058056_wa
85
86func check_errata_2058056
87 /* Applies to r0p0 - r2p0 */
88 mov x1, #0x20
89 b cpu_rev_var_ls
90endfunc check_errata_2058056
91
92 /* --------------------------------------------------
johpow0115f10bd2021-12-01 17:40:39 -060093 * Errata Workaround for Cortex X2 Errata #2083908.
94 * This applies to revision r2p0 and is open.
95 * x0: variant[4:7] and revision[0:3] of current cpu.
96 * Shall clobber: x0-x2, x17
97 * --------------------------------------------------
98 */
99func errata_cortex_x2_2083908_wa
100 /* Check workaround compatibility. */
101 mov x17, x30
102 bl check_errata_2083908
103 cbz x0, 1f
104
105 /* Apply the workaround by setting bit 13 in CPUACTLR5_EL1. */
106 mrs x1, CORTEX_X2_CPUACTLR5_EL1
107 orr x1, x1, #BIT(13)
108 msr CORTEX_X2_CPUACTLR5_EL1, x1
109
1101:
111 ret x17
112endfunc errata_cortex_x2_2083908_wa
113
114func check_errata_2083908
115 /* Applies to r2p0 */
116 mov x1, #0x20
117 mov x2, #0x20
118 b cpu_rev_var_range
119endfunc check_errata_2083908
120
Bipin Ravi2f73d972022-01-20 00:01:04 -0600121 /* --------------------------------------------------
122 * Errata Workaround for Cortex-X2 Errata 2017096.
123 * This applies only to revisions r0p0, r1p0 and r2p0
124 * and is fixed in r2p1.
125 * Inputs:
126 * x0: variant[4:7] and revision[0:3] of current cpu.
127 * Shall clobber: x0, x1, x17
128 * --------------------------------------------------
129 */
130func errata_x2_2017096_wa
131 /* Compare x0 against revision r0p0 to r2p0 */
132 mov x17, x30
133 bl check_errata_2017096
134 cbz x0, 1f
135 mrs x1, CORTEX_X2_CPUECTLR_EL1
136 orr x1, x1, CORTEX_X2_CPUECTLR_EL1_PFSTIDIS_BIT
137 msr CORTEX_X2_CPUECTLR_EL1, x1
138
1391:
140 ret x17
141endfunc errata_x2_2017096_wa
142
143func check_errata_2017096
144 /* Applies to r0p0, r1p0, r2p0 */
145 mov x1, #0x20
146 b cpu_rev_var_ls
147endfunc check_errata_2017096
148
Bipin Ravi9ad54782022-01-20 00:42:05 -0600149 /* --------------------------------------------------
150 * Errata Workaround for Cortex-X2 Errata 2081180.
151 * This applies to revision r0p0, r1p0 and r2p0
152 * and is fixed in r2p1.
153 * Inputs:
154 * x0: variant[4:7] and revision[0:3] of current cpu.
155 * Shall clobber: x0, x1, x17
156 * --------------------------------------------------
157 */
158func errata_x2_2081180_wa
159 /* Check revision. */
160 mov x17, x30
161 bl check_errata_2081180
162 cbz x0, 1f
163
164 /* Apply instruction patching sequence */
165 ldr x0, =0x3
166 msr CORTEX_X2_IMP_CPUPSELR_EL3, x0
167 ldr x0, =0xF3A08002
168 msr CORTEX_X2_IMP_CPUPOR_EL3, x0
169 ldr x0, =0xFFF0F7FE
170 msr CORTEX_X2_IMP_CPUPMR_EL3, x0
171 ldr x0, =0x10002001003FF
172 msr CORTEX_X2_IMP_CPUPCR_EL3, x0
173 ldr x0, =0x4
174 msr CORTEX_X2_IMP_CPUPSELR_EL3, x0
175 ldr x0, =0xBF200000
176 msr CORTEX_X2_IMP_CPUPOR_EL3, x0
177 ldr x0, =0xFFEF0000
178 msr CORTEX_X2_IMP_CPUPMR_EL3, x0
179 ldr x0, =0x10002001003F3
180 msr CORTEX_X2_IMP_CPUPCR_EL3, x0
181 isb
1821:
183 ret x17
184endfunc errata_x2_2081180_wa
185
186func check_errata_2081180
187 /* Applies to r0p0, r1p0 and r2p0 */
188 mov x1, #0x20
189 b cpu_rev_var_ls
190endfunc check_errata_2081180
191
Bipin Ravi78b72082022-02-06 01:29:31 -0600192 /* --------------------------------------------------
193 * Errata Workaround for Cortex X2 Errata 2216384.
194 * This applies to revisions r0p0, r1p0, and r2p0
195 * and is fixed in r2p1.
196 * x0: variant[4:7] and revision[0:3] of current cpu.
197 * Shall clobber: x0, x1, x17
198 * --------------------------------------------------
199 */
200func errata_x2_2216384_wa
201 /* Check workaround compatibility. */
202 mov x17, x30
203 bl check_errata_2216384
204 cbz x0, 1f
205
206 mrs x1, CORTEX_X2_CPUACTLR5_EL1
207 orr x1, x1, CORTEX_X2_CPUACTLR5_EL1_BIT_17
208 msr CORTEX_X2_CPUACTLR5_EL1, x1
209
210 /* Apply instruction patching sequence */
211 ldr x0, =0x5
212 msr CORTEX_X2_IMP_CPUPSELR_EL3, x0
213 ldr x0, =0x10F600E000
214 msr CORTEX_X2_IMP_CPUPOR_EL3, x0
215 ldr x0, =0x10FF80E000
216 msr CORTEX_X2_IMP_CPUPMR_EL3, x0
217 ldr x0, =0x80000000003FF
218 msr CORTEX_X2_IMP_CPUPCR_EL3, x0
219 isb
220
2211:
222 ret x17
223endfunc errata_x2_2216384_wa
224
225func check_errata_2216384
226 /* Applies to r0p0 - r2p0 */
227 mov x1, #0x20
228 b cpu_rev_var_ls
229endfunc check_errata_2216384
Bipin Ravi86499742022-01-18 01:59:06 -0600230
231func check_errata_cve_2022_23960
232#if WORKAROUND_CVE_2022_23960
233 mov x0, #ERRATA_APPLIES
234#else
235 mov x0, #ERRATA_MISSING
236#endif
237 ret
238endfunc check_errata_cve_2022_23960
239
johpow01a3810e82021-05-18 15:23:31 -0500240 /* ----------------------------------------------------
241 * HW will do the cache maintenance while powering down
242 * ----------------------------------------------------
243 */
244func cortex_x2_core_pwr_dwn
245 /* ---------------------------------------------------
246 * Enable CPU power down bit in power control register
247 * ---------------------------------------------------
248 */
249 mrs x0, CORTEX_X2_CPUPWRCTLR_EL1
250 orr x0, x0, #CORTEX_X2_CPUPWRCTLR_EL1_CORE_PWRDN_BIT
251 msr CORTEX_X2_CPUPWRCTLR_EL1, x0
252 isb
253 ret
254endfunc cortex_x2_core_pwr_dwn
255
256 /*
257 * Errata printing function for Cortex X2. Must follow AAPCS.
258 */
259#if REPORT_ERRATA
260func cortex_x2_errata_report
johpow0115f10bd2021-12-01 17:40:39 -0600261 stp x8, x30, [sp, #-16]!
262
263 bl cpu_get_rev_var
264 mov x8, x0
265
266 /*
267 * Report all errata. The revision-variant information is passed to
268 * checking functions of each errata.
269 */
johpow010afef362021-12-02 13:25:50 -0600270 report_errata ERRATA_X2_2002765, cortex_x2, 2002765
johpow01f6c37de2021-12-03 11:27:33 -0600271 report_errata ERRATA_X2_2058056, cortex_x2, 2058056
johpow0115f10bd2021-12-01 17:40:39 -0600272 report_errata ERRATA_X2_2083908, cortex_x2, 2083908
Bipin Ravi2f73d972022-01-20 00:01:04 -0600273 report_errata ERRATA_X2_2017096, cortex_x2, 2017096
Bipin Ravi9ad54782022-01-20 00:42:05 -0600274 report_errata ERRATA_X2_2081180, cortex_x2, 2081180
Bipin Ravi78b72082022-02-06 01:29:31 -0600275 report_errata ERRATA_X2_2216384, cortex_x2, 2216384
Bipin Ravi86499742022-01-18 01:59:06 -0600276 report_errata WORKAROUND_CVE_2022_23960, cortex_x2, cve_2022_23960
johpow0115f10bd2021-12-01 17:40:39 -0600277
278 ldp x8, x30, [sp], #16
johpow01a3810e82021-05-18 15:23:31 -0500279 ret
280endfunc cortex_x2_errata_report
281#endif
282
283func cortex_x2_reset_func
johpow0115f10bd2021-12-01 17:40:39 -0600284 mov x19, x30
285
johpow01a3810e82021-05-18 15:23:31 -0500286 /* Disable speculative loads */
287 msr SSBS, xzr
288 isb
johpow0115f10bd2021-12-01 17:40:39 -0600289
290 /* Get the CPU revision and stash it in x18. */
291 bl cpu_get_rev_var
292 mov x18, x0
293
johpow010afef362021-12-02 13:25:50 -0600294#if ERRATA_X2_2002765
295 mov x0, x18
296 bl errata_cortex_x2_2002765_wa
297#endif
298
johpow01f6c37de2021-12-03 11:27:33 -0600299#if ERRATA_X2_2058056
300 mov x0, x18
301 bl errata_cortex_x2_2058056_wa
302#endif
303
johpow0115f10bd2021-12-01 17:40:39 -0600304#if ERRATA_X2_2083908
305 mov x0, x18
306 bl errata_cortex_x2_2083908_wa
307#endif
308
Bipin Ravi2f73d972022-01-20 00:01:04 -0600309#if ERRATA_X2_2017096
310 mov x0, x18
311 bl errata_x2_2017096_wa
312#endif
313
Bipin Ravi9ad54782022-01-20 00:42:05 -0600314#if ERRATA_X2_2081180
315 mov x0, x18
316 bl errata_x2_2081180_wa
317#endif
318
Bipin Ravi78b72082022-02-06 01:29:31 -0600319#if ERRATA_X2_2216384
320 mov x0, x18
321 bl errata_x2_2216384_wa
322#endif
323
Bipin Ravi86499742022-01-18 01:59:06 -0600324#if IMAGE_BL31 && WORKAROUND_CVE_2022_23960
325 /*
326 * The Cortex-X2 generic vectors are overridden to apply errata
327 * mitigation on exception entry from lower ELs.
328 */
329 adr x0, wa_cve_vbar_cortex_x2
330 msr vbar_el3, x0
331#endif /* IMAGE_BL31 && WORKAROUND_CVE_2022_23960 */
332
333 isb
johpow0115f10bd2021-12-01 17:40:39 -0600334 ret x19
johpow01a3810e82021-05-18 15:23:31 -0500335endfunc cortex_x2_reset_func
336
337 /* ---------------------------------------------
338 * This function provides Cortex X2 specific
339 * register information for crash reporting.
340 * It needs to return with x6 pointing to
341 * a list of register names in ascii and
342 * x8 - x15 having values of registers to be
343 * reported.
344 * ---------------------------------------------
345 */
346.section .rodata.cortex_x2_regs, "aS"
347cortex_x2_regs: /* The ascii list of register names to be reported */
348 .asciz "cpuectlr_el1", ""
349
350func cortex_x2_cpu_reg_dump
351 adr x6, cortex_x2_regs
352 mrs x8, CORTEX_X2_CPUECTLR_EL1
353 ret
354endfunc cortex_x2_cpu_reg_dump
355
356declare_cpu_ops cortex_x2, CORTEX_X2_MIDR, \
357 cortex_x2_reset_func, \
358 cortex_x2_core_pwr_dwn