blob: c810be6b0d27c5ac2d545e95d73ec50d3a0a175a [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
Bipin Ravic6b65212022-03-08 10:37:43 -0600240 /* ---------------------------------------------------------
241 * Errata Workaround for Cortex-X2 Errata 2147715.
242 * This applies only to revisions r2p0 and is fixed in r2p1.
243 * Inputs:
244 * x0: variant[4:7] and revision[0:3] of current cpu.
245 * Shall clobber: x0, x1, x17
246 * ---------------------------------------------------------
247 */
248func errata_x2_2147715_wa
249 /* Compare x0 against revision r2p0 */
250 mov x17, x30
251 bl check_errata_2147715
252 cbz x0, 1f
253
254 /* Apply the workaround by setting bit 22 in CPUACTLR_EL1. */
255 mrs x1, CORTEX_X2_CPUACTLR_EL1
256 orr x1, x1, CORTEX_X2_CPUACTLR_EL1_BIT_22
257 msr CORTEX_X2_CPUACTLR_EL1, x1
258
2591:
260 ret x17
261endfunc errata_x2_2147715_wa
262
263func check_errata_2147715
264 /* Applies to r2p0 */
265 mov x1, #0x20
266 mov x2, #0x20
267 b cpu_rev_var_range
268endfunc check_errata_2147715
269
Bipin Ravi4e315c32022-07-12 17:13:01 -0500270/* -------------------------------------------------------
271 * Errata Workaround for Cortex-X2 Erratum 2371105.
272 * This applies to revisions <= r2p0 and is fixed in r2p1.
273 * x0: variant[4:7] and revision[0:3] of current cpu.
274 * Shall clobber: x0-x17
275 * -------------------------------------------------------
276 */
277func errata_x2_2371105_wa
278 /* Check workaround compatibility. */
279 mov x17, x30
280 bl check_errata_2371105
281 cbz x0, 1f
282
283 /* Set bit 40 in CPUACTLR2_EL1 */
284 mrs x1, CORTEX_X2_CPUACTLR2_EL1
285 orr x1, x1, #CORTEX_X2_CPUACTLR2_EL1_BIT_40
286 msr CORTEX_X2_CPUACTLR2_EL1, x1
287 isb
2881:
289 ret x17
290endfunc errata_x2_2371105_wa
291
292func check_errata_2371105
293 /* Applies to <= r2p0. */
294 mov x1, #0x20
295 b cpu_rev_var_ls
296endfunc check_errata_2371105
297
johpow01a3810e82021-05-18 15:23:31 -0500298 /* ----------------------------------------------------
299 * HW will do the cache maintenance while powering down
300 * ----------------------------------------------------
301 */
302func cortex_x2_core_pwr_dwn
303 /* ---------------------------------------------------
304 * Enable CPU power down bit in power control register
305 * ---------------------------------------------------
306 */
307 mrs x0, CORTEX_X2_CPUPWRCTLR_EL1
308 orr x0, x0, #CORTEX_X2_CPUPWRCTLR_EL1_CORE_PWRDN_BIT
309 msr CORTEX_X2_CPUPWRCTLR_EL1, x0
310 isb
311 ret
312endfunc cortex_x2_core_pwr_dwn
313
314 /*
315 * Errata printing function for Cortex X2. Must follow AAPCS.
316 */
317#if REPORT_ERRATA
318func cortex_x2_errata_report
johpow0115f10bd2021-12-01 17:40:39 -0600319 stp x8, x30, [sp, #-16]!
320
321 bl cpu_get_rev_var
322 mov x8, x0
323
324 /*
325 * Report all errata. The revision-variant information is passed to
326 * checking functions of each errata.
327 */
johpow010afef362021-12-02 13:25:50 -0600328 report_errata ERRATA_X2_2002765, cortex_x2, 2002765
Bipin Ravi2f73d972022-01-20 00:01:04 -0600329 report_errata ERRATA_X2_2017096, cortex_x2, 2017096
Bipin Ravic6b65212022-03-08 10:37:43 -0600330 report_errata ERRATA_X2_2058056, cortex_x2, 2058056
Bipin Ravi9ad54782022-01-20 00:42:05 -0600331 report_errata ERRATA_X2_2081180, cortex_x2, 2081180
Bipin Ravic6b65212022-03-08 10:37:43 -0600332 report_errata ERRATA_X2_2083908, cortex_x2, 2083908
333 report_errata ERRATA_X2_2147715, cortex_x2, 2147715
Bipin Ravi78b72082022-02-06 01:29:31 -0600334 report_errata ERRATA_X2_2216384, cortex_x2, 2216384
Bipin Ravi4e315c32022-07-12 17:13:01 -0500335 report_errata ERRATA_X2_2371105, cortex_x2, 2371105
Bipin Ravi86499742022-01-18 01:59:06 -0600336 report_errata WORKAROUND_CVE_2022_23960, cortex_x2, cve_2022_23960
Bipin Raviaf40d692021-12-22 14:35:21 -0600337 report_errata ERRATA_DSU_2313941, cortex_x2, dsu_2313941
johpow0115f10bd2021-12-01 17:40:39 -0600338
339 ldp x8, x30, [sp], #16
johpow01a3810e82021-05-18 15:23:31 -0500340 ret
341endfunc cortex_x2_errata_report
342#endif
343
344func cortex_x2_reset_func
johpow0115f10bd2021-12-01 17:40:39 -0600345 mov x19, x30
346
johpow01a3810e82021-05-18 15:23:31 -0500347 /* Disable speculative loads */
348 msr SSBS, xzr
johpow0115f10bd2021-12-01 17:40:39 -0600349
350 /* Get the CPU revision and stash it in x18. */
351 bl cpu_get_rev_var
352 mov x18, x0
353
Bipin Raviaf40d692021-12-22 14:35:21 -0600354#if ERRATA_DSU_2313941
355 bl errata_dsu_2313941_wa
356#endif
357
johpow010afef362021-12-02 13:25:50 -0600358#if ERRATA_X2_2002765
359 mov x0, x18
360 bl errata_cortex_x2_2002765_wa
361#endif
362
johpow01f6c37de2021-12-03 11:27:33 -0600363#if ERRATA_X2_2058056
364 mov x0, x18
365 bl errata_cortex_x2_2058056_wa
366#endif
367
johpow0115f10bd2021-12-01 17:40:39 -0600368#if ERRATA_X2_2083908
369 mov x0, x18
370 bl errata_cortex_x2_2083908_wa
371#endif
372
Bipin Ravi2f73d972022-01-20 00:01:04 -0600373#if ERRATA_X2_2017096
374 mov x0, x18
375 bl errata_x2_2017096_wa
376#endif
377
Bipin Ravi9ad54782022-01-20 00:42:05 -0600378#if ERRATA_X2_2081180
379 mov x0, x18
380 bl errata_x2_2081180_wa
381#endif
382
Bipin Ravi78b72082022-02-06 01:29:31 -0600383#if ERRATA_X2_2216384
384 mov x0, x18
385 bl errata_x2_2216384_wa
386#endif
387
Bipin Ravic6b65212022-03-08 10:37:43 -0600388#if ERRATA_X2_2147715
389 mov x0, x18
390 bl errata_x2_2147715_wa
391#endif
392
Bipin Ravi4e315c32022-07-12 17:13:01 -0500393#if ERRATA_X2_2371105
394 mov x0, x18
395 bl errata_x2_2371105_wa
396#endif
397
Bipin Ravi86499742022-01-18 01:59:06 -0600398#if IMAGE_BL31 && WORKAROUND_CVE_2022_23960
399 /*
400 * The Cortex-X2 generic vectors are overridden to apply errata
401 * mitigation on exception entry from lower ELs.
402 */
403 adr x0, wa_cve_vbar_cortex_x2
404 msr vbar_el3, x0
405#endif /* IMAGE_BL31 && WORKAROUND_CVE_2022_23960 */
406
407 isb
Bipin Raviaf40d692021-12-22 14:35:21 -0600408 ret x19
johpow01a3810e82021-05-18 15:23:31 -0500409endfunc cortex_x2_reset_func
410
411 /* ---------------------------------------------
412 * This function provides Cortex X2 specific
413 * register information for crash reporting.
414 * It needs to return with x6 pointing to
415 * a list of register names in ascii and
416 * x8 - x15 having values of registers to be
417 * reported.
418 * ---------------------------------------------
419 */
420.section .rodata.cortex_x2_regs, "aS"
421cortex_x2_regs: /* The ascii list of register names to be reported */
422 .asciz "cpuectlr_el1", ""
423
424func cortex_x2_cpu_reg_dump
425 adr x6, cortex_x2_regs
426 mrs x8, CORTEX_X2_CPUECTLR_EL1
427 ret
428endfunc cortex_x2_cpu_reg_dump
429
430declare_cpu_ops cortex_x2, CORTEX_X2_MIDR, \
431 cortex_x2_reset_func, \
432 cortex_x2_core_pwr_dwn