blob: be94e911f246500f4c83d82be54c32fbbba60607 [file] [log] [blame]
Louis Mayencourtf57f1082019-05-14 11:00:45 +01001/*
Bipin Ravi86499742022-01-18 01:59:06 -06002 * Copyright (c) 2019-2022, ARM Limited. All rights reserved.
Louis Mayencourtf57f1082019-05-14 11:00:45 +01003 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7#include <arch.h>
8#include <asm_macros.S>
9#include <common/bl_common.h>
Jimmy Brisson7ec175e2020-06-01 16:49:34 -050010#include <cortex_a78.h>
Louis Mayencourtf57f1082019-05-14 11:00:45 +010011#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"
Louis Mayencourtf57f1082019-05-14 11:00:45 +010014
15/* Hardware handled coherency */
16#if HW_ASSISTED_COHERENCY == 0
Jimmy Brisson3571fb92020-06-01 10:18:22 -050017#error "cortex_a78 must be compiled with HW_ASSISTED_COHERENCY enabled"
Louis Mayencourtf57f1082019-05-14 11:00:45 +010018#endif
19
Bipin Ravi86499742022-01-18 01:59:06 -060020#if WORKAROUND_CVE_2022_23960
21 wa_cve_2022_23960_bhb_vector_table CORTEX_A78_BHB_LOOP_COUNT, cortex_a78
22#endif /* WORKAROUND_CVE_2022_23960 */
Madhukar Pappireddy4efede72019-12-18 15:56:27 -060023
24/* --------------------------------------------------
Jimmy Brisson3571fb92020-06-01 10:18:22 -050025 * Errata Workaround for A78 Erratum 1688305.
26 * This applies to revision r0p0 and r1p0 of A78.
Madhukar Pappireddy4efede72019-12-18 15:56:27 -060027 * Inputs:
28 * x0: variant[4:7] and revision[0:3] of current cpu.
29 * Shall clobber: x0-x17
30 * --------------------------------------------------
31 */
Jimmy Brisson3571fb92020-06-01 10:18:22 -050032func errata_a78_1688305_wa
Madhukar Pappireddy4efede72019-12-18 15:56:27 -060033 /* Compare x0 against revision r1p0 */
34 mov x17, x30
35 bl check_errata_1688305
36 cbz x0, 1f
Jimmy Brisson3571fb92020-06-01 10:18:22 -050037 mrs x1, CORTEX_A78_ACTLR2_EL1
johpow019131eb82020-10-06 17:55:25 -050038 orr x1, x1, #CORTEX_A78_ACTLR2_EL1_BIT_1
Jimmy Brisson3571fb92020-06-01 10:18:22 -050039 msr CORTEX_A78_ACTLR2_EL1, x1
Madhukar Pappireddy4efede72019-12-18 15:56:27 -060040 isb
411:
42 ret x17
Jimmy Brisson3571fb92020-06-01 10:18:22 -050043endfunc errata_a78_1688305_wa
Madhukar Pappireddy4efede72019-12-18 15:56:27 -060044
45func check_errata_1688305
46 /* Applies to r0p0 and r1p0 */
47 mov x1, #0x10
48 b cpu_rev_var_ls
49endfunc check_errata_1688305
50
johpow01b3e82942021-04-30 18:08:52 -050051/* --------------------------------------------------
52 * Errata Workaround for Cortex A78 Errata #1941498.
53 * This applies to revisions r0p0, r1p0, and r1p1.
54 * x0: variant[4:7] and revision[0:3] of current cpu.
55 * Shall clobber: x0-x17
56 * --------------------------------------------------
57 */
johpow019131eb82020-10-06 17:55:25 -050058func errata_a78_1941498_wa
59 /* Compare x0 against revision <= r1p1 */
60 mov x17, x30
61 bl check_errata_1941498
62 cbz x0, 1f
63
64 /* Set bit 8 in ECTLR_EL1 */
65 mrs x1, CORTEX_A78_CPUECTLR_EL1
66 orr x1, x1, #CORTEX_A78_CPUECTLR_EL1_BIT_8
67 msr CORTEX_A78_CPUECTLR_EL1, x1
68 isb
691:
70 ret x17
71endfunc errata_a78_1941498_wa
72
73func check_errata_1941498
74 /* Check for revision <= r1p1, might need to be updated later. */
75 mov x1, #0x11
76 b cpu_rev_var_ls
77endfunc check_errata_1941498
78
johpow01b3e82942021-04-30 18:08:52 -050079/* --------------------------------------------------
80 * Errata Workaround for A78 Erratum 1951500.
81 * This applies to revisions r1p0 and r1p1 of A78.
82 * The issue also exists in r0p0 but there is no fix
83 * in that revision.
84 * Inputs:
85 * x0: variant[4:7] and revision[0:3] of current cpu.
86 * Shall clobber: x0-x17
87 * --------------------------------------------------
88 */
johpow0185ea43d2020-10-07 15:08:01 -050089func errata_a78_1951500_wa
90 /* Compare x0 against revisions r1p0 - r1p1 */
91 mov x17, x30
92 bl check_errata_1951500
93 cbz x0, 1f
94
95 msr S3_6_c15_c8_0, xzr
96 ldr x0, =0x10E3900002
97 msr S3_6_c15_c8_2, x0
98 ldr x0, =0x10FFF00083
99 msr S3_6_c15_c8_3, x0
100 ldr x0, =0x2001003FF
101 msr S3_6_c15_c8_1, x0
102
103 mov x0, #1
104 msr S3_6_c15_c8_0, x0
105 ldr x0, =0x10E3800082
106 msr S3_6_c15_c8_2, x0
107 ldr x0, =0x10FFF00083
108 msr S3_6_c15_c8_3, x0
109 ldr x0, =0x2001003FF
110 msr S3_6_c15_c8_1, x0
111
112 mov x0, #2
113 msr S3_6_c15_c8_0, x0
114 ldr x0, =0x10E3800200
115 msr S3_6_c15_c8_2, x0
116 ldr x0, =0x10FFF003E0
117 msr S3_6_c15_c8_3, x0
118 ldr x0, =0x2001003FF
119 msr S3_6_c15_c8_1, x0
120
121 isb
1221:
123 ret x17
124endfunc errata_a78_1951500_wa
125
126func check_errata_1951500
127 /* Applies to revisions r1p0 and r1p1. */
128 mov x1, #CPU_REV(1, 0)
129 mov x2, #CPU_REV(1, 1)
130 b cpu_rev_var_range
131endfunc check_errata_1951500
132
johpow01b3e82942021-04-30 18:08:52 -0500133/* --------------------------------------------------
134 * Errata Workaround for Cortex A78 Errata #1821534.
135 * This applies to revisions r0p0 and r1p0.
136 * x0: variant[4:7] and revision[0:3] of current cpu.
137 * Shall clobber: x0-x17
138 * --------------------------------------------------
139 */
140func errata_a78_1821534_wa
141 /* Check revision. */
142 mov x17, x30
143 bl check_errata_1821534
144 cbz x0, 1f
145
146 /* Set bit 2 in ACTLR2_EL1 */
147 mrs x1, CORTEX_A78_ACTLR2_EL1
148 orr x1, x1, #CORTEX_A78_ACTLR2_EL1_BIT_2
149 msr CORTEX_A78_ACTLR2_EL1, x1
150 isb
1511:
152 ret x17
153endfunc errata_a78_1821534_wa
154
155func check_errata_1821534
156 /* Applies to r0p0 and r1p0 */
157 mov x1, #0x10
158 b cpu_rev_var_ls
159endfunc check_errata_1821534
160
nayanpatel-arm80bf7a52021-08-11 13:33:00 -0700161/* --------------------------------------------------
162 * Errata Workaround for Cortex A78 Errata 1952683.
163 * This applies to revision r0p0.
164 * x0: variant[4:7] and revision[0:3] of current cpu.
165 * Shall clobber: x0-x17
166 * --------------------------------------------------
167 */
168func errata_a78_1952683_wa
169 /* Check revision. */
170 mov x17, x30
171 bl check_errata_1952683
172 cbz x0, 1f
173
174 ldr x0,=0x5
175 msr S3_6_c15_c8_0,x0
176 ldr x0,=0xEEE10A10
177 msr S3_6_c15_c8_2,x0
178 ldr x0,=0xFFEF0FFF
179 msr S3_6_c15_c8_3,x0
180 ldr x0,=0x0010F000
181 msr S3_6_c15_c8_4,x0
182 ldr x0,=0x0010F000
183 msr S3_6_c15_c8_5,x0
184 ldr x0,=0x40000080023ff
185 msr S3_6_c15_c8_1,x0
186 ldr x0,=0x6
187 msr S3_6_c15_c8_0,x0
188 ldr x0,=0xEE640F34
189 msr S3_6_c15_c8_2,x0
190 ldr x0,=0xFFEF0FFF
191 msr S3_6_c15_c8_3,x0
192 ldr x0,=0x40000080023ff
193 msr S3_6_c15_c8_1,x0
194 isb
1951:
196 ret x17
197endfunc errata_a78_1952683_wa
198
199func check_errata_1952683
200 /* Applies to r0p0 only */
201 mov x1, #0x00
202 b cpu_rev_var_ls
203endfunc check_errata_1952683
204
nayanpatel-arm39e08652021-09-28 17:31:50 -0700205/* --------------------------------------------------
206 * Errata Workaround for Cortex A78 Errata 2132060.
207 * This applies to revisions r0p0, r1p0, r1p1, and r1p2.
208 * It is still open.
209 * x0: variant[4:7] and revision[0:3] of current cpu.
210 * Shall clobber: x0-x1, x17
211 * --------------------------------------------------
212 */
213func errata_a78_2132060_wa
214 /* Check revision. */
215 mov x17, x30
216 bl check_errata_2132060
217 cbz x0, 1f
218
219 /* Apply the workaround. */
220 mrs x1, CORTEX_A78_CPUECTLR_EL1
221 mov x0, #CORTEX_A78_CPUECTLR_EL1_PF_MODE_CNSRV
222 bfi x1, x0, #CPUECTLR_EL1_PF_MODE_LSB, #CPUECTLR_EL1_PF_MODE_WIDTH
223 msr CORTEX_A78_CPUECTLR_EL1, x1
2241:
225 ret x17
226endfunc errata_a78_2132060_wa
227
228func check_errata_2132060
229 /* Applies to r0p0, r0p1, r1p1, and r1p2 */
230 mov x1, #0x12
231 b cpu_rev_var_ls
232endfunc check_errata_2132060
233
johpow0145c17242021-09-02 17:53:30 -0500234/* --------------------------------------------------------------------
235 * Errata Workaround for A78 Erratum 2242635.
236 * This applies to revisions r1p0, r1p1, and r1p2 of the Cortex A78
237 * processor and is still open.
238 * The issue also exists in r0p0 but there is no fix in that revision.
239 * x0: variant[4:7] and revision[0:3] of current cpu.
240 * Shall clobber: x0-x17
241 * --------------------------------------------------------------------
242 */
243func errata_a78_2242635_wa
244 /* Compare x0 against revisions r1p0 - r1p2 */
245 mov x17, x30
246 bl check_errata_2242635
247 cbz x0, 1f
248
249 ldr x0, =0x5
250 msr S3_6_c15_c8_0, x0 /* CPUPSELR_EL3 */
251 ldr x0, =0x10F600E000
252 msr S3_6_c15_c8_2, x0 /* CPUPOR_EL3 */
253 ldr x0, =0x10FF80E000
254 msr S3_6_c15_c8_3, x0 /* CPUPMR_EL3 */
255 ldr x0, =0x80000000003FF
256 msr S3_6_c15_c8_1, x0 /* CPUPCR_EL3 */
257
258 isb
2591:
260 ret x17
261endfunc errata_a78_2242635_wa
262
263func check_errata_2242635
264 /* Applies to revisions r1p0 through r1p2. */
265 mov x1, #CPU_REV(1, 0)
266 mov x2, #CPU_REV(1, 2)
267 b cpu_rev_var_range
268endfunc check_errata_2242635
269
John Powell12bc0de2022-05-03 15:22:57 -0500270/* --------------------------------------------------
271 * Errata Workaround for Cortex A78 Errata 2376745.
272 * This applies to revisions r0p0, r1p0, r1p1, and r1p2.
273 * It is still open.
274 * x0: variant[4:7] and revision[0:3] of current cpu.
275 * Shall clobber: x0-x1, x17
276 * --------------------------------------------------
277 */
278func errata_a78_2376745_wa
279 /* Check revision. */
280 mov x17, x30
281 bl check_errata_2376745
282 cbz x0, 1f
283
284 /* Apply the workaround. */
285 mrs x1, CORTEX_A78_ACTLR2_EL1
286 orr x1, x1, #BIT(0)
287 msr CORTEX_A78_ACTLR2_EL1, x1
2881:
289 ret x17
290endfunc errata_a78_2376745_wa
291
292func check_errata_2376745
293 /* Applies to r0p0, r0p1, r1p1, and r1p2 */
294 mov x1, #CPU_REV(1, 2)
295 b cpu_rev_var_ls
296endfunc check_errata_2376745
297
John Powella93b7e52022-05-03 15:52:11 -0500298/* --------------------------------------------------
299 * Errata Workaround for Cortex A78 Errata 2395406.
300 * This applies to revisions r0p0, r1p0, r1p1, and r1p2.
301 * It is still open.
302 * x0: variant[4:7] and revision[0:3] of current cpu.
303 * Shall clobber: x0-x1, x17
304 * --------------------------------------------------
305 */
306func errata_a78_2395406_wa
307 /* Check revision. */
308 mov x17, x30
309 bl check_errata_2395406
310 cbz x0, 1f
311
312 /* Apply the workaround. */
313 mrs x1, CORTEX_A78_ACTLR2_EL1
314 orr x1, x1, #BIT(40)
315 msr CORTEX_A78_ACTLR2_EL1, x1
3161:
317 ret x17
318endfunc errata_a78_2395406_wa
319
320func check_errata_2395406
321 /* Applies to r0p0, r0p1, r1p1, and r1p2 */
322 mov x1, #CPU_REV(1, 2)
323 b cpu_rev_var_ls
324endfunc check_errata_2395406
325
Bipin Ravi86499742022-01-18 01:59:06 -0600326func check_errata_cve_2022_23960
327#if WORKAROUND_CVE_2022_23960
328 mov x0, #ERRATA_APPLIES
329#else
330 mov x0, #ERRATA_MISSING
331#endif
332 ret
333endfunc check_errata_cve_2022_23960
334
Balint Dobszaydb2ec852019-07-15 11:46:20 +0200335 /* -------------------------------------------------
Jimmy Brisson3571fb92020-06-01 10:18:22 -0500336 * The CPU Ops reset function for Cortex-A78
Balint Dobszaydb2ec852019-07-15 11:46:20 +0200337 * -------------------------------------------------
338 */
Jimmy Brisson3571fb92020-06-01 10:18:22 -0500339func cortex_a78_reset_func
Madhukar Pappireddy4efede72019-12-18 15:56:27 -0600340 mov x19, x30
341 bl cpu_get_rev_var
342 mov x18, x0
343
Jimmy Brisson3571fb92020-06-01 10:18:22 -0500344#if ERRATA_A78_1688305
Madhukar Pappireddy4efede72019-12-18 15:56:27 -0600345 mov x0, x18
Jimmy Brisson3571fb92020-06-01 10:18:22 -0500346 bl errata_a78_1688305_wa
Madhukar Pappireddy4efede72019-12-18 15:56:27 -0600347#endif
348
johpow019131eb82020-10-06 17:55:25 -0500349#if ERRATA_A78_1941498
350 mov x0, x18
351 bl errata_a78_1941498_wa
352#endif
353
johpow0185ea43d2020-10-07 15:08:01 -0500354#if ERRATA_A78_1951500
355 mov x0, x18
356 bl errata_a78_1951500_wa
357#endif
358
johpow01b3e82942021-04-30 18:08:52 -0500359#if ERRATA_A78_1821534
360 mov x0, x18
361 bl errata_a78_1821534_wa
362#endif
363
nayanpatel-arm80bf7a52021-08-11 13:33:00 -0700364#if ERRATA_A78_1952683
365 mov x0, x18
366 bl errata_a78_1952683_wa
367#endif
368
nayanpatel-arm39e08652021-09-28 17:31:50 -0700369#if ERRATA_A78_2132060
370 mov x0, x18
371 bl errata_a78_2132060_wa
372#endif
373
johpow0145c17242021-09-02 17:53:30 -0500374#if ERRATA_A78_2242635
375 mov x0, x18
376 bl errata_a78_2242635_wa
377#endif
378
John Powell12bc0de2022-05-03 15:22:57 -0500379#if ERRATA_A78_2376745
380 mov x0, x18
381 bl errata_a78_2376745_wa
382#endif
383
John Powella93b7e52022-05-03 15:52:11 -0500384#if ERRATA_A78_2395406
385 mov x0, x18
386 bl errata_a78_2395406_wa
387#endif
388
Madhukar Pappireddy4efede72019-12-18 15:56:27 -0600389#if ENABLE_AMU
Balint Dobszaydb2ec852019-07-15 11:46:20 +0200390 /* Make sure accesses from EL0/EL1 and EL2 are not trapped to EL3 */
391 mrs x0, actlr_el3
Jimmy Brisson3571fb92020-06-01 10:18:22 -0500392 bic x0, x0, #CORTEX_A78_ACTLR_TAM_BIT
Balint Dobszaydb2ec852019-07-15 11:46:20 +0200393 msr actlr_el3, x0
394
395 /* Make sure accesses from non-secure EL0/EL1 are not trapped to EL2 */
396 mrs x0, actlr_el2
Jimmy Brisson3571fb92020-06-01 10:18:22 -0500397 bic x0, x0, #CORTEX_A78_ACTLR_TAM_BIT
Balint Dobszaydb2ec852019-07-15 11:46:20 +0200398 msr actlr_el2, x0
399
400 /* Enable group0 counters */
Jimmy Brisson3571fb92020-06-01 10:18:22 -0500401 mov x0, #CORTEX_A78_AMU_GROUP0_MASK
Balint Dobszaydb2ec852019-07-15 11:46:20 +0200402 msr CPUAMCNTENSET0_EL0, x0
403
404 /* Enable group1 counters */
Jimmy Brisson3571fb92020-06-01 10:18:22 -0500405 mov x0, #CORTEX_A78_AMU_GROUP1_MASK
Balint Dobszaydb2ec852019-07-15 11:46:20 +0200406 msr CPUAMCNTENSET1_EL0, x0
Madhukar Pappireddy4efede72019-12-18 15:56:27 -0600407#endif
Balint Dobszaydb2ec852019-07-15 11:46:20 +0200408
Bipin Ravi86499742022-01-18 01:59:06 -0600409#if IMAGE_BL31 && WORKAROUND_CVE_2022_23960
410 /*
411 * The Cortex-A78 generic vectors are overridden to apply errata
412 * mitigation on exception entry from lower ELs.
413 */
414 adr x0, wa_cve_vbar_cortex_a78
415 msr vbar_el3, x0
416#endif /* IMAGE_BL31 && WORKAROUND_CVE_2022_23960 */
417
Madhukar Pappireddy4efede72019-12-18 15:56:27 -0600418 isb
419 ret x19
Jimmy Brisson3571fb92020-06-01 10:18:22 -0500420endfunc cortex_a78_reset_func
Balint Dobszaydb2ec852019-07-15 11:46:20 +0200421
Louis Mayencourtf57f1082019-05-14 11:00:45 +0100422 /* ---------------------------------------------
423 * HW will do the cache maintenance while powering down
424 * ---------------------------------------------
425 */
Jimmy Brisson3571fb92020-06-01 10:18:22 -0500426func cortex_a78_core_pwr_dwn
Louis Mayencourtf57f1082019-05-14 11:00:45 +0100427 /* ---------------------------------------------
428 * Enable CPU power down bit in power control register
429 * ---------------------------------------------
430 */
Jimmy Brisson3571fb92020-06-01 10:18:22 -0500431 mrs x0, CORTEX_A78_CPUPWRCTLR_EL1
432 orr x0, x0, #CORTEX_A78_CPUPWRCTLR_EL1_CORE_PWRDN_EN_BIT
433 msr CORTEX_A78_CPUPWRCTLR_EL1, x0
Louis Mayencourtf57f1082019-05-14 11:00:45 +0100434 isb
435 ret
Jimmy Brisson3571fb92020-06-01 10:18:22 -0500436endfunc cortex_a78_core_pwr_dwn
Louis Mayencourtf57f1082019-05-14 11:00:45 +0100437
438 /*
Jimmy Brisson3571fb92020-06-01 10:18:22 -0500439 * Errata printing function for cortex_a78. Must follow AAPCS.
Louis Mayencourtf57f1082019-05-14 11:00:45 +0100440 */
441#if REPORT_ERRATA
Jimmy Brisson3571fb92020-06-01 10:18:22 -0500442func cortex_a78_errata_report
Madhukar Pappireddy4efede72019-12-18 15:56:27 -0600443 stp x8, x30, [sp, #-16]!
444
445 bl cpu_get_rev_var
446 mov x8, x0
447
448 /*
449 * Report all errata. The revision-variant information is passed to
450 * checking functions of each errata.
451 */
Jimmy Brisson3571fb92020-06-01 10:18:22 -0500452 report_errata ERRATA_A78_1688305, cortex_a78, 1688305
johpow019131eb82020-10-06 17:55:25 -0500453 report_errata ERRATA_A78_1941498, cortex_a78, 1941498
johpow0185ea43d2020-10-07 15:08:01 -0500454 report_errata ERRATA_A78_1951500, cortex_a78, 1951500
johpow01b3e82942021-04-30 18:08:52 -0500455 report_errata ERRATA_A78_1821534, cortex_a78, 1821534
nayanpatel-arm80bf7a52021-08-11 13:33:00 -0700456 report_errata ERRATA_A78_1952683, cortex_a78, 1952683
nayanpatel-arm39e08652021-09-28 17:31:50 -0700457 report_errata ERRATA_A78_2132060, cortex_a78, 2132060
johpow0145c17242021-09-02 17:53:30 -0500458 report_errata ERRATA_A78_2242635, cortex_a78, 2242635
John Powell12bc0de2022-05-03 15:22:57 -0500459 report_errata ERRATA_A78_2376745, cortex_a78, 2376745
John Powella93b7e52022-05-03 15:52:11 -0500460 report_errata ERRATA_A78_2395406, cortex_a78, 2395406
Bipin Ravi86499742022-01-18 01:59:06 -0600461 report_errata WORKAROUND_CVE_2022_23960, cortex_a78, cve_2022_23960
Madhukar Pappireddy4efede72019-12-18 15:56:27 -0600462
463 ldp x8, x30, [sp], #16
Louis Mayencourtf57f1082019-05-14 11:00:45 +0100464 ret
Jimmy Brisson3571fb92020-06-01 10:18:22 -0500465endfunc cortex_a78_errata_report
Louis Mayencourtf57f1082019-05-14 11:00:45 +0100466#endif
467
468 /* ---------------------------------------------
Jimmy Brisson3571fb92020-06-01 10:18:22 -0500469 * This function provides cortex_a78 specific
Louis Mayencourtf57f1082019-05-14 11:00:45 +0100470 * register information for crash reporting.
471 * It needs to return with x6 pointing to
472 * a list of register names in ascii and
473 * x8 - x15 having values of registers to be
474 * reported.
475 * ---------------------------------------------
476 */
Jimmy Brisson3571fb92020-06-01 10:18:22 -0500477.section .rodata.cortex_a78_regs, "aS"
478cortex_a78_regs: /* The ascii list of register names to be reported */
Louis Mayencourtf57f1082019-05-14 11:00:45 +0100479 .asciz "cpuectlr_el1", ""
480
Jimmy Brisson3571fb92020-06-01 10:18:22 -0500481func cortex_a78_cpu_reg_dump
482 adr x6, cortex_a78_regs
483 mrs x8, CORTEX_A78_CPUECTLR_EL1
Louis Mayencourtf57f1082019-05-14 11:00:45 +0100484 ret
Jimmy Brisson3571fb92020-06-01 10:18:22 -0500485endfunc cortex_a78_cpu_reg_dump
Louis Mayencourtf57f1082019-05-14 11:00:45 +0100486
Jimmy Brisson3571fb92020-06-01 10:18:22 -0500487declare_cpu_ops cortex_a78, CORTEX_A78_MIDR, \
488 cortex_a78_reset_func, \
489 cortex_a78_core_pwr_dwn