blob: dd3487ab6c9f312e9f2d243025def12e69cf74d1 [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
Saurabh Gorechab8493012022-04-05 00:11:52 +053020.globl cortex_a78_reset_func
21.globl cortex_a78_core_pwr_dwn
22
Bipin Ravi86499742022-01-18 01:59:06 -060023#if WORKAROUND_CVE_2022_23960
24 wa_cve_2022_23960_bhb_vector_table CORTEX_A78_BHB_LOOP_COUNT, cortex_a78
25#endif /* WORKAROUND_CVE_2022_23960 */
Madhukar Pappireddy4efede72019-12-18 15:56:27 -060026
27/* --------------------------------------------------
Jimmy Brisson3571fb92020-06-01 10:18:22 -050028 * Errata Workaround for A78 Erratum 1688305.
29 * This applies to revision r0p0 and r1p0 of A78.
Madhukar Pappireddy4efede72019-12-18 15:56:27 -060030 * Inputs:
31 * x0: variant[4:7] and revision[0:3] of current cpu.
32 * Shall clobber: x0-x17
33 * --------------------------------------------------
34 */
Jimmy Brisson3571fb92020-06-01 10:18:22 -050035func errata_a78_1688305_wa
Madhukar Pappireddy4efede72019-12-18 15:56:27 -060036 /* Compare x0 against revision r1p0 */
37 mov x17, x30
38 bl check_errata_1688305
39 cbz x0, 1f
Jimmy Brisson3571fb92020-06-01 10:18:22 -050040 mrs x1, CORTEX_A78_ACTLR2_EL1
johpow019131eb82020-10-06 17:55:25 -050041 orr x1, x1, #CORTEX_A78_ACTLR2_EL1_BIT_1
Jimmy Brisson3571fb92020-06-01 10:18:22 -050042 msr CORTEX_A78_ACTLR2_EL1, x1
Madhukar Pappireddy4efede72019-12-18 15:56:27 -060043 isb
441:
45 ret x17
Jimmy Brisson3571fb92020-06-01 10:18:22 -050046endfunc errata_a78_1688305_wa
Madhukar Pappireddy4efede72019-12-18 15:56:27 -060047
48func check_errata_1688305
49 /* Applies to r0p0 and r1p0 */
50 mov x1, #0x10
51 b cpu_rev_var_ls
52endfunc check_errata_1688305
53
johpow01b3e82942021-04-30 18:08:52 -050054/* --------------------------------------------------
55 * Errata Workaround for Cortex A78 Errata #1941498.
56 * This applies to revisions r0p0, r1p0, and r1p1.
57 * x0: variant[4:7] and revision[0:3] of current cpu.
58 * Shall clobber: x0-x17
59 * --------------------------------------------------
60 */
johpow019131eb82020-10-06 17:55:25 -050061func errata_a78_1941498_wa
62 /* Compare x0 against revision <= r1p1 */
63 mov x17, x30
64 bl check_errata_1941498
65 cbz x0, 1f
66
67 /* Set bit 8 in ECTLR_EL1 */
68 mrs x1, CORTEX_A78_CPUECTLR_EL1
69 orr x1, x1, #CORTEX_A78_CPUECTLR_EL1_BIT_8
70 msr CORTEX_A78_CPUECTLR_EL1, x1
71 isb
721:
73 ret x17
74endfunc errata_a78_1941498_wa
75
76func check_errata_1941498
77 /* Check for revision <= r1p1, might need to be updated later. */
78 mov x1, #0x11
79 b cpu_rev_var_ls
80endfunc check_errata_1941498
81
johpow01b3e82942021-04-30 18:08:52 -050082/* --------------------------------------------------
83 * Errata Workaround for A78 Erratum 1951500.
84 * This applies to revisions r1p0 and r1p1 of A78.
85 * The issue also exists in r0p0 but there is no fix
86 * in that revision.
87 * Inputs:
88 * x0: variant[4:7] and revision[0:3] of current cpu.
89 * Shall clobber: x0-x17
90 * --------------------------------------------------
91 */
johpow0185ea43d2020-10-07 15:08:01 -050092func errata_a78_1951500_wa
93 /* Compare x0 against revisions r1p0 - r1p1 */
94 mov x17, x30
95 bl check_errata_1951500
96 cbz x0, 1f
97
98 msr S3_6_c15_c8_0, xzr
99 ldr x0, =0x10E3900002
100 msr S3_6_c15_c8_2, x0
101 ldr x0, =0x10FFF00083
102 msr S3_6_c15_c8_3, x0
103 ldr x0, =0x2001003FF
104 msr S3_6_c15_c8_1, x0
105
106 mov x0, #1
107 msr S3_6_c15_c8_0, x0
108 ldr x0, =0x10E3800082
109 msr S3_6_c15_c8_2, x0
110 ldr x0, =0x10FFF00083
111 msr S3_6_c15_c8_3, x0
112 ldr x0, =0x2001003FF
113 msr S3_6_c15_c8_1, x0
114
115 mov x0, #2
116 msr S3_6_c15_c8_0, x0
117 ldr x0, =0x10E3800200
118 msr S3_6_c15_c8_2, x0
119 ldr x0, =0x10FFF003E0
120 msr S3_6_c15_c8_3, x0
121 ldr x0, =0x2001003FF
122 msr S3_6_c15_c8_1, x0
123
124 isb
1251:
126 ret x17
127endfunc errata_a78_1951500_wa
128
129func check_errata_1951500
130 /* Applies to revisions r1p0 and r1p1. */
131 mov x1, #CPU_REV(1, 0)
132 mov x2, #CPU_REV(1, 1)
133 b cpu_rev_var_range
134endfunc check_errata_1951500
135
johpow01b3e82942021-04-30 18:08:52 -0500136/* --------------------------------------------------
137 * Errata Workaround for Cortex A78 Errata #1821534.
138 * This applies to revisions r0p0 and r1p0.
139 * x0: variant[4:7] and revision[0:3] of current cpu.
140 * Shall clobber: x0-x17
141 * --------------------------------------------------
142 */
143func errata_a78_1821534_wa
144 /* Check revision. */
145 mov x17, x30
146 bl check_errata_1821534
147 cbz x0, 1f
148
149 /* Set bit 2 in ACTLR2_EL1 */
150 mrs x1, CORTEX_A78_ACTLR2_EL1
151 orr x1, x1, #CORTEX_A78_ACTLR2_EL1_BIT_2
152 msr CORTEX_A78_ACTLR2_EL1, x1
153 isb
1541:
155 ret x17
156endfunc errata_a78_1821534_wa
157
158func check_errata_1821534
159 /* Applies to r0p0 and r1p0 */
160 mov x1, #0x10
161 b cpu_rev_var_ls
162endfunc check_errata_1821534
163
nayanpatel-arm80bf7a52021-08-11 13:33:00 -0700164/* --------------------------------------------------
165 * Errata Workaround for Cortex A78 Errata 1952683.
166 * This applies to revision r0p0.
167 * x0: variant[4:7] and revision[0:3] of current cpu.
168 * Shall clobber: x0-x17
169 * --------------------------------------------------
170 */
171func errata_a78_1952683_wa
172 /* Check revision. */
173 mov x17, x30
174 bl check_errata_1952683
175 cbz x0, 1f
176
177 ldr x0,=0x5
178 msr S3_6_c15_c8_0,x0
179 ldr x0,=0xEEE10A10
180 msr S3_6_c15_c8_2,x0
181 ldr x0,=0xFFEF0FFF
182 msr S3_6_c15_c8_3,x0
183 ldr x0,=0x0010F000
184 msr S3_6_c15_c8_4,x0
185 ldr x0,=0x0010F000
186 msr S3_6_c15_c8_5,x0
187 ldr x0,=0x40000080023ff
188 msr S3_6_c15_c8_1,x0
189 ldr x0,=0x6
190 msr S3_6_c15_c8_0,x0
191 ldr x0,=0xEE640F34
192 msr S3_6_c15_c8_2,x0
193 ldr x0,=0xFFEF0FFF
194 msr S3_6_c15_c8_3,x0
195 ldr x0,=0x40000080023ff
196 msr S3_6_c15_c8_1,x0
197 isb
1981:
199 ret x17
200endfunc errata_a78_1952683_wa
201
202func check_errata_1952683
203 /* Applies to r0p0 only */
204 mov x1, #0x00
205 b cpu_rev_var_ls
206endfunc check_errata_1952683
207
nayanpatel-arm39e08652021-09-28 17:31:50 -0700208/* --------------------------------------------------
209 * Errata Workaround for Cortex A78 Errata 2132060.
210 * This applies to revisions r0p0, r1p0, r1p1, and r1p2.
211 * It is still open.
212 * x0: variant[4:7] and revision[0:3] of current cpu.
213 * Shall clobber: x0-x1, x17
214 * --------------------------------------------------
215 */
216func errata_a78_2132060_wa
217 /* Check revision. */
218 mov x17, x30
219 bl check_errata_2132060
220 cbz x0, 1f
221
222 /* Apply the workaround. */
223 mrs x1, CORTEX_A78_CPUECTLR_EL1
224 mov x0, #CORTEX_A78_CPUECTLR_EL1_PF_MODE_CNSRV
225 bfi x1, x0, #CPUECTLR_EL1_PF_MODE_LSB, #CPUECTLR_EL1_PF_MODE_WIDTH
226 msr CORTEX_A78_CPUECTLR_EL1, x1
2271:
228 ret x17
229endfunc errata_a78_2132060_wa
230
231func check_errata_2132060
232 /* Applies to r0p0, r0p1, r1p1, and r1p2 */
233 mov x1, #0x12
234 b cpu_rev_var_ls
235endfunc check_errata_2132060
236
johpow0145c17242021-09-02 17:53:30 -0500237/* --------------------------------------------------------------------
238 * Errata Workaround for A78 Erratum 2242635.
239 * This applies to revisions r1p0, r1p1, and r1p2 of the Cortex A78
240 * processor and is still open.
241 * The issue also exists in r0p0 but there is no fix in that revision.
242 * x0: variant[4:7] and revision[0:3] of current cpu.
243 * Shall clobber: x0-x17
244 * --------------------------------------------------------------------
245 */
246func errata_a78_2242635_wa
247 /* Compare x0 against revisions r1p0 - r1p2 */
248 mov x17, x30
249 bl check_errata_2242635
250 cbz x0, 1f
251
252 ldr x0, =0x5
253 msr S3_6_c15_c8_0, x0 /* CPUPSELR_EL3 */
254 ldr x0, =0x10F600E000
255 msr S3_6_c15_c8_2, x0 /* CPUPOR_EL3 */
256 ldr x0, =0x10FF80E000
257 msr S3_6_c15_c8_3, x0 /* CPUPMR_EL3 */
258 ldr x0, =0x80000000003FF
259 msr S3_6_c15_c8_1, x0 /* CPUPCR_EL3 */
260
261 isb
2621:
263 ret x17
264endfunc errata_a78_2242635_wa
265
266func check_errata_2242635
267 /* Applies to revisions r1p0 through r1p2. */
268 mov x1, #CPU_REV(1, 0)
269 mov x2, #CPU_REV(1, 2)
270 b cpu_rev_var_range
271endfunc check_errata_2242635
272
John Powell12bc0de2022-05-03 15:22:57 -0500273/* --------------------------------------------------
274 * Errata Workaround for Cortex A78 Errata 2376745.
275 * This applies to revisions r0p0, r1p0, r1p1, and r1p2.
276 * It is still open.
277 * x0: variant[4:7] and revision[0:3] of current cpu.
278 * Shall clobber: x0-x1, x17
279 * --------------------------------------------------
280 */
281func errata_a78_2376745_wa
282 /* Check revision. */
283 mov x17, x30
284 bl check_errata_2376745
285 cbz x0, 1f
286
287 /* Apply the workaround. */
288 mrs x1, CORTEX_A78_ACTLR2_EL1
289 orr x1, x1, #BIT(0)
290 msr CORTEX_A78_ACTLR2_EL1, x1
2911:
292 ret x17
293endfunc errata_a78_2376745_wa
294
295func check_errata_2376745
296 /* Applies to r0p0, r0p1, r1p1, and r1p2 */
297 mov x1, #CPU_REV(1, 2)
298 b cpu_rev_var_ls
299endfunc check_errata_2376745
300
John Powella93b7e52022-05-03 15:52:11 -0500301/* --------------------------------------------------
302 * Errata Workaround for Cortex A78 Errata 2395406.
303 * This applies to revisions r0p0, r1p0, r1p1, and r1p2.
304 * It is still open.
305 * x0: variant[4:7] and revision[0:3] of current cpu.
306 * Shall clobber: x0-x1, x17
307 * --------------------------------------------------
308 */
309func errata_a78_2395406_wa
310 /* Check revision. */
311 mov x17, x30
312 bl check_errata_2395406
313 cbz x0, 1f
314
315 /* Apply the workaround. */
316 mrs x1, CORTEX_A78_ACTLR2_EL1
317 orr x1, x1, #BIT(40)
318 msr CORTEX_A78_ACTLR2_EL1, x1
3191:
320 ret x17
321endfunc errata_a78_2395406_wa
322
323func check_errata_2395406
324 /* Applies to r0p0, r0p1, r1p1, and r1p2 */
325 mov x1, #CPU_REV(1, 2)
326 b cpu_rev_var_ls
327endfunc check_errata_2395406
328
Bipin Ravi86499742022-01-18 01:59:06 -0600329func check_errata_cve_2022_23960
330#if WORKAROUND_CVE_2022_23960
331 mov x0, #ERRATA_APPLIES
332#else
333 mov x0, #ERRATA_MISSING
334#endif
335 ret
336endfunc check_errata_cve_2022_23960
337
Balint Dobszaydb2ec852019-07-15 11:46:20 +0200338 /* -------------------------------------------------
Jimmy Brisson3571fb92020-06-01 10:18:22 -0500339 * The CPU Ops reset function for Cortex-A78
Balint Dobszaydb2ec852019-07-15 11:46:20 +0200340 * -------------------------------------------------
341 */
Jimmy Brisson3571fb92020-06-01 10:18:22 -0500342func cortex_a78_reset_func
Madhukar Pappireddy4efede72019-12-18 15:56:27 -0600343 mov x19, x30
344 bl cpu_get_rev_var
345 mov x18, x0
346
Jimmy Brisson3571fb92020-06-01 10:18:22 -0500347#if ERRATA_A78_1688305
Madhukar Pappireddy4efede72019-12-18 15:56:27 -0600348 mov x0, x18
Jimmy Brisson3571fb92020-06-01 10:18:22 -0500349 bl errata_a78_1688305_wa
Madhukar Pappireddy4efede72019-12-18 15:56:27 -0600350#endif
351
johpow019131eb82020-10-06 17:55:25 -0500352#if ERRATA_A78_1941498
353 mov x0, x18
354 bl errata_a78_1941498_wa
355#endif
356
johpow0185ea43d2020-10-07 15:08:01 -0500357#if ERRATA_A78_1951500
358 mov x0, x18
359 bl errata_a78_1951500_wa
360#endif
361
johpow01b3e82942021-04-30 18:08:52 -0500362#if ERRATA_A78_1821534
363 mov x0, x18
364 bl errata_a78_1821534_wa
365#endif
366
nayanpatel-arm80bf7a52021-08-11 13:33:00 -0700367#if ERRATA_A78_1952683
368 mov x0, x18
369 bl errata_a78_1952683_wa
370#endif
371
nayanpatel-arm39e08652021-09-28 17:31:50 -0700372#if ERRATA_A78_2132060
373 mov x0, x18
374 bl errata_a78_2132060_wa
375#endif
376
johpow0145c17242021-09-02 17:53:30 -0500377#if ERRATA_A78_2242635
378 mov x0, x18
379 bl errata_a78_2242635_wa
380#endif
381
John Powell12bc0de2022-05-03 15:22:57 -0500382#if ERRATA_A78_2376745
383 mov x0, x18
384 bl errata_a78_2376745_wa
385#endif
386
John Powella93b7e52022-05-03 15:52:11 -0500387#if ERRATA_A78_2395406
388 mov x0, x18
389 bl errata_a78_2395406_wa
390#endif
391
Madhukar Pappireddy4efede72019-12-18 15:56:27 -0600392#if ENABLE_AMU
Balint Dobszaydb2ec852019-07-15 11:46:20 +0200393 /* Make sure accesses from EL0/EL1 and EL2 are not trapped to EL3 */
394 mrs x0, actlr_el3
Jimmy Brisson3571fb92020-06-01 10:18:22 -0500395 bic x0, x0, #CORTEX_A78_ACTLR_TAM_BIT
Balint Dobszaydb2ec852019-07-15 11:46:20 +0200396 msr actlr_el3, x0
397
398 /* Make sure accesses from non-secure EL0/EL1 are not trapped to EL2 */
399 mrs x0, actlr_el2
Jimmy Brisson3571fb92020-06-01 10:18:22 -0500400 bic x0, x0, #CORTEX_A78_ACTLR_TAM_BIT
Balint Dobszaydb2ec852019-07-15 11:46:20 +0200401 msr actlr_el2, x0
402
403 /* Enable group0 counters */
Jimmy Brisson3571fb92020-06-01 10:18:22 -0500404 mov x0, #CORTEX_A78_AMU_GROUP0_MASK
Balint Dobszaydb2ec852019-07-15 11:46:20 +0200405 msr CPUAMCNTENSET0_EL0, x0
406
407 /* Enable group1 counters */
Jimmy Brisson3571fb92020-06-01 10:18:22 -0500408 mov x0, #CORTEX_A78_AMU_GROUP1_MASK
Balint Dobszaydb2ec852019-07-15 11:46:20 +0200409 msr CPUAMCNTENSET1_EL0, x0
Madhukar Pappireddy4efede72019-12-18 15:56:27 -0600410#endif
Balint Dobszaydb2ec852019-07-15 11:46:20 +0200411
Bipin Ravi86499742022-01-18 01:59:06 -0600412#if IMAGE_BL31 && WORKAROUND_CVE_2022_23960
413 /*
414 * The Cortex-A78 generic vectors are overridden to apply errata
415 * mitigation on exception entry from lower ELs.
416 */
417 adr x0, wa_cve_vbar_cortex_a78
418 msr vbar_el3, x0
419#endif /* IMAGE_BL31 && WORKAROUND_CVE_2022_23960 */
420
Madhukar Pappireddy4efede72019-12-18 15:56:27 -0600421 isb
422 ret x19
Jimmy Brisson3571fb92020-06-01 10:18:22 -0500423endfunc cortex_a78_reset_func
Balint Dobszaydb2ec852019-07-15 11:46:20 +0200424
Louis Mayencourtf57f1082019-05-14 11:00:45 +0100425 /* ---------------------------------------------
426 * HW will do the cache maintenance while powering down
427 * ---------------------------------------------
428 */
Jimmy Brisson3571fb92020-06-01 10:18:22 -0500429func cortex_a78_core_pwr_dwn
Louis Mayencourtf57f1082019-05-14 11:00:45 +0100430 /* ---------------------------------------------
431 * Enable CPU power down bit in power control register
432 * ---------------------------------------------
433 */
Jimmy Brisson3571fb92020-06-01 10:18:22 -0500434 mrs x0, CORTEX_A78_CPUPWRCTLR_EL1
435 orr x0, x0, #CORTEX_A78_CPUPWRCTLR_EL1_CORE_PWRDN_EN_BIT
436 msr CORTEX_A78_CPUPWRCTLR_EL1, x0
Louis Mayencourtf57f1082019-05-14 11:00:45 +0100437 isb
438 ret
Jimmy Brisson3571fb92020-06-01 10:18:22 -0500439endfunc cortex_a78_core_pwr_dwn
Louis Mayencourtf57f1082019-05-14 11:00:45 +0100440
441 /*
Jimmy Brisson3571fb92020-06-01 10:18:22 -0500442 * Errata printing function for cortex_a78. Must follow AAPCS.
Louis Mayencourtf57f1082019-05-14 11:00:45 +0100443 */
444#if REPORT_ERRATA
Jimmy Brisson3571fb92020-06-01 10:18:22 -0500445func cortex_a78_errata_report
Madhukar Pappireddy4efede72019-12-18 15:56:27 -0600446 stp x8, x30, [sp, #-16]!
447
448 bl cpu_get_rev_var
449 mov x8, x0
450
451 /*
452 * Report all errata. The revision-variant information is passed to
453 * checking functions of each errata.
454 */
Jimmy Brisson3571fb92020-06-01 10:18:22 -0500455 report_errata ERRATA_A78_1688305, cortex_a78, 1688305
johpow019131eb82020-10-06 17:55:25 -0500456 report_errata ERRATA_A78_1941498, cortex_a78, 1941498
johpow0185ea43d2020-10-07 15:08:01 -0500457 report_errata ERRATA_A78_1951500, cortex_a78, 1951500
johpow01b3e82942021-04-30 18:08:52 -0500458 report_errata ERRATA_A78_1821534, cortex_a78, 1821534
nayanpatel-arm80bf7a52021-08-11 13:33:00 -0700459 report_errata ERRATA_A78_1952683, cortex_a78, 1952683
nayanpatel-arm39e08652021-09-28 17:31:50 -0700460 report_errata ERRATA_A78_2132060, cortex_a78, 2132060
johpow0145c17242021-09-02 17:53:30 -0500461 report_errata ERRATA_A78_2242635, cortex_a78, 2242635
John Powell12bc0de2022-05-03 15:22:57 -0500462 report_errata ERRATA_A78_2376745, cortex_a78, 2376745
John Powella93b7e52022-05-03 15:52:11 -0500463 report_errata ERRATA_A78_2395406, cortex_a78, 2395406
Bipin Ravi86499742022-01-18 01:59:06 -0600464 report_errata WORKAROUND_CVE_2022_23960, cortex_a78, cve_2022_23960
Madhukar Pappireddy4efede72019-12-18 15:56:27 -0600465
466 ldp x8, x30, [sp], #16
Louis Mayencourtf57f1082019-05-14 11:00:45 +0100467 ret
Jimmy Brisson3571fb92020-06-01 10:18:22 -0500468endfunc cortex_a78_errata_report
Louis Mayencourtf57f1082019-05-14 11:00:45 +0100469#endif
470
471 /* ---------------------------------------------
Jimmy Brisson3571fb92020-06-01 10:18:22 -0500472 * This function provides cortex_a78 specific
Louis Mayencourtf57f1082019-05-14 11:00:45 +0100473 * register information for crash reporting.
474 * It needs to return with x6 pointing to
475 * a list of register names in ascii and
476 * x8 - x15 having values of registers to be
477 * reported.
478 * ---------------------------------------------
479 */
Jimmy Brisson3571fb92020-06-01 10:18:22 -0500480.section .rodata.cortex_a78_regs, "aS"
481cortex_a78_regs: /* The ascii list of register names to be reported */
Louis Mayencourtf57f1082019-05-14 11:00:45 +0100482 .asciz "cpuectlr_el1", ""
483
Jimmy Brisson3571fb92020-06-01 10:18:22 -0500484func cortex_a78_cpu_reg_dump
485 adr x6, cortex_a78_regs
486 mrs x8, CORTEX_A78_CPUECTLR_EL1
Louis Mayencourtf57f1082019-05-14 11:00:45 +0100487 ret
Jimmy Brisson3571fb92020-06-01 10:18:22 -0500488endfunc cortex_a78_cpu_reg_dump
Louis Mayencourtf57f1082019-05-14 11:00:45 +0100489
Jimmy Brisson3571fb92020-06-01 10:18:22 -0500490declare_cpu_ops cortex_a78, CORTEX_A78_MIDR, \
491 cortex_a78_reset_func, \
492 cortex_a78_core_pwr_dwn