blob: 41853f864a1694d25edeaefa961d47f5eee20e54 [file] [log] [blame]
Javier Almansa Sobrino25bbbd22020-10-23 13:22:07 +01001/*
Arvind Ram Prakasha438f432023-06-23 14:47:30 -05002 * Copyright (c) 2020-2023, Arm Limited. All rights reserved.
Javier Almansa Sobrino25bbbd22020-10-23 13:22:07 +01003 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7#include <arch.h>
8#include <asm_macros.S>
9#include <cpu_macros.S>
10#include <neoverse_n2.h>
Bipin Ravi1fe4a9d2022-01-18 01:59:06 -060011#include "wa_cve_2022_23960_bhb_vector.S"
Javier Almansa Sobrino25bbbd22020-10-23 13:22:07 +010012
13/* Hardware handled coherency */
14#if HW_ASSISTED_COHERENCY == 0
15#error "Neoverse N2 must be compiled with HW_ASSISTED_COHERENCY enabled"
16#endif
17
18/* 64-bit only core */
19#if CTX_INCLUDE_AARCH32_REGS == 1
20#error "Neoverse-N2 supports only AArch64. Compile with CTX_INCLUDE_AARCH32_REGS=0"
21#endif
22
Bipin Ravi1fe4a9d2022-01-18 01:59:06 -060023#if WORKAROUND_CVE_2022_23960
24 wa_cve_2022_23960_bhb_vector_table NEOVERSE_N2_BHB_LOOP_COUNT, neoverse_n2
25#endif /* WORKAROUND_CVE_2022_23960 */
26
nayanpatel-arm9380f752021-08-06 17:46:10 -070027/* --------------------------------------------------
28 * Errata Workaround for Neoverse N2 Erratum 2002655.
29 * This applies to revision r0p0 of Neoverse N2. it is still open.
30 * Inputs:
31 * x0: variant[4:7] and revision[0:3] of current cpu.
32 * Shall clobber: x0-x17
33 * --------------------------------------------------
34 */
35func errata_n2_2002655_wa
36 /* Check revision. */
37 mov x17, x30
38 bl check_errata_2002655
39 cbz x0, 1f
40
41 /* Apply instruction patching sequence */
42 ldr x0,=0x6
43 msr S3_6_c15_c8_0,x0
44 ldr x0,=0xF3A08002
45 msr S3_6_c15_c8_2,x0
46 ldr x0,=0xFFF0F7FE
47 msr S3_6_c15_c8_3,x0
48 ldr x0,=0x40000001003ff
49 msr S3_6_c15_c8_1,x0
50 ldr x0,=0x7
51 msr S3_6_c15_c8_0,x0
52 ldr x0,=0xBF200000
53 msr S3_6_c15_c8_2,x0
54 ldr x0,=0xFFEF0000
55 msr S3_6_c15_c8_3,x0
56 ldr x0,=0x40000001003f3
57 msr S3_6_c15_c8_1,x0
58 isb
591:
60 ret x17
61endfunc errata_n2_2002655_wa
62
63func check_errata_2002655
64 /* Applies to r0p0 */
65 mov x1, #0x00
66 b cpu_rev_var_ls
67endfunc check_errata_2002655
68
Bipin Ravi65e04f22021-03-30 16:08:32 -050069/* ---------------------------------------------------------------
Bipin Ravi4618b2b2021-03-31 10:10:27 -050070 * Errata Workaround for Neoverse N2 Erratum 2025414.
71 * This applies to revision r0p0 of Neoverse N2 and is still open.
72 * Inputs:
73 * x0: variant[4:7] and revision[0:3] of current cpu.
74 * Shall clobber: x0-x17
75 * ---------------------------------------------------------------
76 */
77func errata_n2_2025414_wa
78 /* Compare x0 against revision r0p0 */
79 mov x17, x30
80 bl check_errata_2025414
81 cbz x0, 1f
82 mrs x1, NEOVERSE_N2_CPUECTLR_EL1
83 orr x1, x1, NEOVERSE_N2_CPUECTLR_EL1_PFSTIDIS_BIT
84 msr NEOVERSE_N2_CPUECTLR_EL1, x1
85
861:
87 ret x17
88endfunc errata_n2_2025414_wa
89
90func check_errata_2025414
91 /* Applies to r0p0 */
92 mov x1, #0x00
93 b cpu_rev_var_ls
94endfunc check_errata_2025414
95
Bipin Ravi7cfae932021-08-30 13:02:51 -050096/* ---------------------------------------------------------------
Arvind Ram Prakasha438f432023-06-23 14:47:30 -050097 * Errata Workaround for Neoverse N2 Erratum 2067956.
Bipin Ravi7cfae932021-08-30 13:02:51 -050098 * This applies to revision r0p0 of Neoverse N2 and is still open.
99 * Inputs:
100 * x0: variant[4:7] and revision[0:3] of current cpu.
101 * Shall clobber: x0-x17
102 * ---------------------------------------------------------------
103 */
Arvind Ram Prakasha438f432023-06-23 14:47:30 -0500104func errata_n2_2067956_wa
Bipin Ravi7cfae932021-08-30 13:02:51 -0500105 /* Compare x0 against revision r0p0 */
Arvind Ram Prakasha438f432023-06-23 14:47:30 -0500106 mov x17, x30
107 bl check_errata_2067956
108 cbz x0, 1f
109 mrs x1, NEOVERSE_N2_CPUACTLR_EL1
110 orr x1, x1, NEOVERSE_N2_CPUACTLR_EL1_BIT_46
111 msr NEOVERSE_N2_CPUACTLR_EL1, x1
Bipin Ravi7cfae932021-08-30 13:02:51 -05001121:
Arvind Ram Prakasha438f432023-06-23 14:47:30 -0500113 ret x17
114endfunc errata_n2_2067956_wa
Bipin Ravi7cfae932021-08-30 13:02:51 -0500115
Arvind Ram Prakasha438f432023-06-23 14:47:30 -0500116func check_errata_2067956
Bipin Ravi7cfae932021-08-30 13:02:51 -0500117 /* Applies to r0p0 */
Arvind Ram Prakasha438f432023-06-23 14:47:30 -0500118 mov x1, #0x00
119 b cpu_rev_var_ls
120endfunc check_errata_2067956
121
122/* --------------------------------------------------
123 * Errata Workaround for Neoverse N2 Erratum 2138953.
124 * This applies to revision r0p0 of Neoverse N2. it is still open.
125 * Inputs:
126 * x0: variant[4:7] and revision[0:3] of current cpu.
127 * Shall clobber: x0-x1, x17
128 * --------------------------------------------------
129 */
130func errata_n2_2138953_wa
131 /* Check revision. */
132 mov x17, x30
133 bl check_errata_2138953
134 cbz x0, 1f
135
136 /* Apply instruction patching sequence */
137 mrs x1, NEOVERSE_N2_CPUECTLR2_EL1
138 mov x0, #NEOVERSE_N2_CPUECTLR2_EL1_PF_MODE_CNSRV
139 bfi x1, x0, #CPUECTLR2_EL1_PF_MODE_LSB, #CPUECTLR2_EL1_PF_MODE_WIDTH
140 msr NEOVERSE_N2_CPUECTLR2_EL1, x1
1411:
142 ret x17
143endfunc errata_n2_2138953_wa
144
145func check_errata_2138953
146 /* Applies to r0p0 */
147 mov x1, #0x00
148 b cpu_rev_var_ls
149endfunc check_errata_2138953
Bipin Ravi7cfae932021-08-30 13:02:51 -0500150
Bipin Ravi1cafb082021-09-01 01:36:43 -0500151/* --------------------------------------------------
152 * Errata Workaround for Neoverse N2 Erratum 2138956.
153 * This applies to revision r0p0 of Neoverse N2. it is still open.
154 * Inputs:
155 * x0: variant[4:7] and revision[0:3] of current cpu.
156 * Shall clobber: x0-x17
157 * --------------------------------------------------
158 */
159func errata_n2_2138956_wa
160 /* Check revision. */
161 mov x17, x30
162 bl check_errata_2138956
163 cbz x0, 1f
164
165 /* Apply instruction patching sequence */
166 ldr x0,=0x3
167 msr S3_6_c15_c8_0,x0
168 ldr x0,=0xF3A08002
169 msr S3_6_c15_c8_2,x0
170 ldr x0,=0xFFF0F7FE
171 msr S3_6_c15_c8_3,x0
172 ldr x0,=0x10002001003FF
173 msr S3_6_c15_c8_1,x0
174 ldr x0,=0x4
175 msr S3_6_c15_c8_0,x0
176 ldr x0,=0xBF200000
177 msr S3_6_c15_c8_2,x0
178 ldr x0,=0xFFEF0000
179 msr S3_6_c15_c8_3,x0
180 ldr x0,=0x10002001003F3
181 msr S3_6_c15_c8_1,x0
182 isb
1831:
184 ret x17
185endfunc errata_n2_2138956_wa
186
187func check_errata_2138956
188 /* Applies to r0p0 */
189 mov x1, #0x00
190 b cpu_rev_var_ls
191endfunc check_errata_2138956
192
nayanpatel-armef8f0c52021-09-28 09:46:45 -0700193/* --------------------------------------------------
nayanpatel-armc9481852021-10-20 18:28:58 -0700194 * Errata Workaround for Neoverse N2 Erratum 2138958.
195 * This applies to revision r0p0 of Neoverse N2. it is still open.
196 * Inputs:
197 * x0: variant[4:7] and revision[0:3] of current cpu.
198 * Shall clobber: x0-x1, x17
199 * --------------------------------------------------
200 */
201func errata_n2_2138958_wa
202 /* Check revision. */
203 mov x17, x30
204 bl check_errata_2138958
205 cbz x0, 1f
206
207 /* Apply instruction patching sequence */
208 mrs x1, NEOVERSE_N2_CPUACTLR5_EL1
209 orr x1, x1, NEOVERSE_N2_CPUACTLR5_EL1_BIT_13
210 msr NEOVERSE_N2_CPUACTLR5_EL1, x1
2111:
212 ret x17
213endfunc errata_n2_2138958_wa
214
215func check_errata_2138958
216 /* Applies to r0p0 */
217 mov x1, #0x00
218 b cpu_rev_var_ls
219endfunc check_errata_2138958
220
Arvind Ram Prakasha438f432023-06-23 14:47:30 -0500221/* ---------------------------------------------------------------
222 * Errata Workaround for Neoverse N2 Erratum 2189731.
223 * This applies to revision r0p0 of Neoverse N2 and is still open.
224 * Inputs:
225 * x0: variant[4:7] and revision[0:3] of current cpu.
226 * Shall clobber: x0-x17
227 * ---------------------------------------------------------------
228 */
229func errata_n2_2189731_wa
230 /* Compare x0 against revision r0p0 */
231 mov x17, x30
232 bl check_errata_2189731
233 cbz x0, 1f
234 mrs x1, NEOVERSE_N2_CPUACTLR5_EL1
235 orr x1, x1, NEOVERSE_N2_CPUACTLR5_EL1_BIT_44
236 msr NEOVERSE_N2_CPUACTLR5_EL1, x1
237
2381:
239 ret x17
240endfunc errata_n2_2189731_wa
241
242func check_errata_2189731
243 /* Applies to r0p0 */
244 mov x1, #0x00
245 b cpu_rev_var_ls
246endfunc check_errata_2189731
247
nayanpatel-arm603806d2021-10-07 17:59:33 -0700248/* --------------------------------------------------
249 * Errata Workaround for Neoverse N2 Erratum 2242400.
250 * This applies to revision r0p0 of Neoverse N2. it is still open.
251 * Inputs:
252 * x0: variant[4:7] and revision[0:3] of current cpu.
253 * Shall clobber: x0-x1, x17
254 * --------------------------------------------------
255 */
256func errata_n2_2242400_wa
257 /* Check revision. */
258 mov x17, x30
259 bl check_errata_2242400
260 cbz x0, 1f
261
262 /* Apply instruction patching sequence */
263 mrs x1, NEOVERSE_N2_CPUACTLR5_EL1
264 orr x1, x1, NEOVERSE_N2_CPUACTLR5_EL1_BIT_17
265 msr NEOVERSE_N2_CPUACTLR5_EL1, x1
266 ldr x0, =0x2
267 msr S3_6_c15_c8_0, x0
268 ldr x0, =0x10F600E000
269 msr S3_6_c15_c8_2, x0
270 ldr x0, =0x10FF80E000
271 msr S3_6_c15_c8_3, x0
272 ldr x0, =0x80000000003FF
273 msr S3_6_c15_c8_1, x0
274 isb
2751:
276 ret x17
277endfunc errata_n2_2242400_wa
278
279func check_errata_2242400
280 /* Applies to r0p0 */
281 mov x1, #0x00
282 b cpu_rev_var_ls
283endfunc check_errata_2242400
284
nayanpatel-arm0d2d9992021-10-20 17:30:46 -0700285/* --------------------------------------------------
Arvind Ram Prakasha438f432023-06-23 14:47:30 -0500286 * Errata Workaround for Neoverse N2 Erratum 2242415.
287 * This applies to revision r0p0 of Neoverse N2. it is still open.
288 * Inputs:
289 * x0: variant[4:7] and revision[0:3] of current cpu.
290 * Shall clobber: x0-x1, x17
291 * --------------------------------------------------
292 */
293func errata_n2_2242415_wa
294 /* Check revision. */
295 mov x17, x30
296 bl check_errata_2242415
297 cbz x0, 1f
298
299 /* Apply instruction patching sequence */
300 mrs x1, NEOVERSE_N2_CPUACTLR_EL1
301 orr x1, x1, NEOVERSE_N2_CPUACTLR_EL1_BIT_22
302 msr NEOVERSE_N2_CPUACTLR_EL1, x1
3031:
304 ret x17
305endfunc errata_n2_2242415_wa
306
307func check_errata_2242415
308 /* Applies to r0p0 */
309 mov x1, #0x00
310 b cpu_rev_var_ls
311endfunc check_errata_2242415
312
313/* --------------------------------------------------
nayanpatel-arm0d2d9992021-10-20 17:30:46 -0700314 * Errata Workaround for Neoverse N2 Erratum 2280757.
315 * This applies to revision r0p0 of Neoverse N2. it is still open.
316 * Inputs:
317 * x0: variant[4:7] and revision[0:3] of current cpu.
318 * Shall clobber: x0-x1, x17
319 * --------------------------------------------------
320 */
321func errata_n2_2280757_wa
322 /* Check revision. */
323 mov x17, x30
324 bl check_errata_2280757
325 cbz x0, 1f
326
327 /* Apply instruction patching sequence */
328 mrs x1, NEOVERSE_N2_CPUACTLR_EL1
329 orr x1, x1, NEOVERSE_N2_CPUACTLR_EL1_BIT_22
330 msr NEOVERSE_N2_CPUACTLR_EL1, x1
3311:
332 ret x17
333endfunc errata_n2_2280757_wa
334
335func check_errata_2280757
336 /* Applies to r0p0 */
337 mov x1, #0x00
338 b cpu_rev_var_ls
339endfunc check_errata_2280757
340
Boyan Karatotev43438ad2022-10-03 14:07:08 +0100341/* --------------------------------------------------
342 * Errata Workaround for Neoverse N2 Erratum 2326639.
343 * This applies to revision r0p0 of Neoverse N2,
344 * fixed in r0p1.
345 * Inputs:
346 * x0: variant[4:7] and revision[0:3] of current cpu.
347 * Shall clobber: x0-x1, x17
348 * --------------------------------------------------
349 */
350func errata_n2_2326639_wa
351 /* Check revision. */
352 mov x17, x30
353 bl check_errata_2326639
354 cbz x0, 1f
355
356 /* Set bit 36 in ACTLR2_EL1 */
357 mrs x1, NEOVERSE_N2_CPUACTLR2_EL1
358 orr x1, x1, #NEOVERSE_N2_CPUACTLR2_EL1_BIT_36
359 msr NEOVERSE_N2_CPUACTLR2_EL1, x1
3601:
361 ret x17
362endfunc errata_n2_2326639_wa
363
364func check_errata_2326639
365 /* Applies to r0p0, fixed in r0p1 */
366 mov x1, #0x00
367 b cpu_rev_var_ls
368endfunc check_errata_2326639
Akram Ahmade6602d42022-07-18 12:27:29 +0100369
370/* --------------------------------------------------
371 * Errata Workaround for Neoverse N2 Erratum 2376738.
372 * This applies to revision r0p0 of Neoverse N2,
373 * fixed in r0p1.
374 * Inputs:
375 * x0: variant[4:7] and revision[0:3] of current CPU.
376 * Shall clobber: x0-x1, x17
377 * --------------------------------------------------
378 */
379func errata_n2_2376738_wa
380 mov x17, x30
381 bl check_errata_2376738
382 cbz x0, 1f
383
384 /* Set CPUACTLR2_EL1[0] to 1 to force PLDW/PFRM
385 * ST to behave like PLD/PFRM LD and not cause
386 * invalidations to other PE caches.
387 */
388 mrs x1, NEOVERSE_N2_CPUACTLR2_EL1
389 orr x1, x1, NEOVERSE_N2_CPUACTLR2_EL1_BIT_0
390 msr NEOVERSE_N2_CPUACTLR2_EL1, x1
3911:
392 ret x17
393endfunc errata_n2_2376738_wa
394
395func check_errata_2376738
396 /* Applies to r0p0, fixed in r0p1 */
397 mov x1, 0x00
398 b cpu_rev_var_ls
399endfunc check_errata_2376738
400
Daniel Boulby884d5152022-07-06 14:33:13 +0100401/* --------------------------------------------------
402 * Errata Workaround for Neoverse N2 Erratum 2388450.
403 * This applies to revision r0p0 of Neoverse N2,
404 * fixed in r0p1.
405 * Inputs:
406 * x0: variant[4:7] and revision[0:3] of current cpu.
407 * Shall clobber: x0-x1, x17
408 * --------------------------------------------------
409 */
410func errata_n2_2388450_wa
411 /* Check revision. */
412 mov x17, x30
413 bl check_errata_2388450
414 cbz x0, 1f
415
416 /*Set bit 40 in ACTLR2_EL1 */
417 mrs x1, NEOVERSE_N2_CPUACTLR2_EL1
418 orr x1, x1, #NEOVERSE_N2_CPUACTLR2_EL1_BIT_40
419 msr NEOVERSE_N2_CPUACTLR2_EL1, x1
420 isb
4211:
422 ret x17
423endfunc errata_n2_2388450_wa
424
425func check_errata_2388450
426 /* Applies to r0p0, fixed in r0p1 */
427 mov x1, #0x00
428 b cpu_rev_var_ls
429endfunc check_errata_2388450
430
Bipin Ravi1ee7c822022-12-07 17:01:26 -0600431/* -------------------------------------------------------
432 * Errata Workaround for Neoverse N2 Erratum 2743089.
433 * This applies to revisions <= r0p2 and is fixed in r0p3.
434 * x0: variant[4:7] and revision[0:3] of current cpu.
435 * Shall clobber: x0-x17
436 * -------------------------------------------------------
437 */
438func errata_n2_2743089_wa
439 mov x17, x30
440 bl check_errata_2743089
441 cbz x0, 1f
442
443 /* dsb before isb of power down sequence */
444 dsb sy
4451:
446 ret x17
447endfunc errata_n2_2743089_wa
448
449func check_errata_2743089
450 /* Applies to all revisions <= r0p2 */
451 mov x1, #0x02
452 b cpu_rev_var_ls
453endfunc check_errata_2743089
454
Bipin Ravi1fe4a9d2022-01-18 01:59:06 -0600455func check_errata_cve_2022_23960
456#if WORKAROUND_CVE_2022_23960
457 mov x0, #ERRATA_APPLIES
458#else
459 mov x0, #ERRATA_MISSING
460#endif
461 ret
462endfunc check_errata_cve_2022_23960
463
Bipin Ravi4618b2b2021-03-31 10:10:27 -0500464 /* -------------------------------------------
Javier Almansa Sobrino25bbbd22020-10-23 13:22:07 +0100465 * The CPU Ops reset function for Neoverse N2.
Bipin Ravi4618b2b2021-03-31 10:10:27 -0500466 * -------------------------------------------
Javier Almansa Sobrino25bbbd22020-10-23 13:22:07 +0100467 */
468func neoverse_n2_reset_func
nayanpatel-arm9380f752021-08-06 17:46:10 -0700469 mov x19, x30
470
Javier Almansa Sobrino25bbbd22020-10-23 13:22:07 +0100471 /* Check if the PE implements SSBS */
472 mrs x0, id_aa64pfr1_el1
473 tst x0, #(ID_AA64PFR1_EL1_SSBS_MASK << ID_AA64PFR1_EL1_SSBS_SHIFT)
474 b.eq 1f
475
476 /* Disable speculative loads */
477 msr SSBS, xzr
4781:
479 /* Force all cacheable atomic instructions to be near */
480 mrs x0, NEOVERSE_N2_CPUACTLR2_EL1
481 orr x0, x0, #NEOVERSE_N2_CPUACTLR2_EL1_BIT_2
482 msr NEOVERSE_N2_CPUACTLR2_EL1, x0
483
Bipin Ravi03ebf402022-10-19 10:29:16 -0500484 /* Get the CPU revision and stash it in x18. */
485 bl cpu_get_rev_var
486 mov x18, x0
487
Bipin Ravi7e3273e2021-12-22 14:35:21 -0600488#if ERRATA_DSU_2313941
489 bl errata_dsu_2313941_wa
490#endif
491
Bipin Ravi65e04f22021-03-30 16:08:32 -0500492#if ERRATA_N2_2067956
493 mov x0, x18
494 bl errata_n2_2067956_wa
495#endif
496
Bipin Ravi4618b2b2021-03-31 10:10:27 -0500497#if ERRATA_N2_2025414
nayanpatel-arm603806d2021-10-07 17:59:33 -0700498 mov x0, x18
499 bl errata_n2_2025414_wa
Bipin Ravi4618b2b2021-03-31 10:10:27 -0500500#endif
501
Bipin Ravi7cfae932021-08-30 13:02:51 -0500502#if ERRATA_N2_2189731
nayanpatel-arm603806d2021-10-07 17:59:33 -0700503 mov x0, x18
504 bl errata_n2_2189731_wa
Bipin Ravi7cfae932021-08-30 13:02:51 -0500505#endif
506
Bipin Ravi1cafb082021-09-01 01:36:43 -0500507#if ERRATA_N2_2138956
508 mov x0, x18
509 bl errata_n2_2138956_wa
510#endif
511
nayanpatel-armef8f0c52021-09-28 09:46:45 -0700512#if ERRATA_N2_2138953
513 mov x0, x18
514 bl errata_n2_2138953_wa
515#endif
516
nayanpatel-arm5819e232021-10-06 15:31:24 -0700517#if ERRATA_N2_2242415
518 mov x0, x18
519 bl errata_n2_2242415_wa
520#endif
521
nayanpatel-armc9481852021-10-20 18:28:58 -0700522#if ERRATA_N2_2138958
523 mov x0, x18
524 bl errata_n2_2138958_wa
525#endif
526
nayanpatel-arm603806d2021-10-07 17:59:33 -0700527#if ERRATA_N2_2242400
528 mov x0, x18
529 bl errata_n2_2242400_wa
530#endif
531
nayanpatel-arm0d2d9992021-10-20 17:30:46 -0700532#if ERRATA_N2_2280757
533 mov x0, x18
534 bl errata_n2_2280757_wa
535#endif
536
Akram Ahmade6602d42022-07-18 12:27:29 +0100537#if ERRATA_N2_2376738
538 mov x0, x18
539 bl errata_n2_2376738_wa
540#endif
541
Daniel Boulby884d5152022-07-06 14:33:13 +0100542#if ERRATA_N2_2388450
543 mov x0, x18
544 bl errata_n2_2388450_wa
545#endif
546
Andre Przywarad23acc92023-03-21 13:53:19 +0000547#if ENABLE_FEAT_AMU
Javier Almansa Sobrino25bbbd22020-10-23 13:22:07 +0100548 /* Make sure accesses from EL0/EL1 and EL2 are not trapped to EL3 */
549 mrs x0, cptr_el3
550 orr x0, x0, #TAM_BIT
551 msr cptr_el3, x0
552
553 /* Make sure accesses from EL0/EL1 are not trapped to EL2 */
554 mrs x0, cptr_el2
555 orr x0, x0, #TAM_BIT
556 msr cptr_el2, x0
557
558 /* No need to enable the counters as this would be done at el3 exit */
559#endif
560
561#if NEOVERSE_Nx_EXTERNAL_LLC
562 /* Some systems may have External LLC, core needs to be made aware */
Bipin Ravi65e04f22021-03-30 16:08:32 -0500563 mrs x0, NEOVERSE_N2_CPUECTLR_EL1
564 orr x0, x0, NEOVERSE_N2_CPUECTLR_EL1_EXTLLC_BIT
565 msr NEOVERSE_N2_CPUECTLR_EL1, x0
Javier Almansa Sobrino25bbbd22020-10-23 13:22:07 +0100566#endif
567
nayanpatel-arm9380f752021-08-06 17:46:10 -0700568#if ERRATA_N2_2002655
569 mov x0, x18
570 bl errata_n2_2002655_wa
571#endif
572
Bipin Ravi1fe4a9d2022-01-18 01:59:06 -0600573#if IMAGE_BL31 && WORKAROUND_CVE_2022_23960
574 /*
575 * The Neoverse-N2 generic vectors are overridden to apply errata
576 * mitigation on exception entry from lower ELs.
577 */
578 adr x0, wa_cve_vbar_neoverse_n2
579 msr vbar_el3, x0
580#endif /* IMAGE_BL31 && WORKAROUND_CVE_2022_23960 */
581
Javier Almansa Sobrino25bbbd22020-10-23 13:22:07 +0100582 isb
Bipin Ravi65e04f22021-03-30 16:08:32 -0500583 ret x19
Javier Almansa Sobrino25bbbd22020-10-23 13:22:07 +0100584endfunc neoverse_n2_reset_func
585
586func neoverse_n2_core_pwr_dwn
Boyan Karatotev43438ad2022-10-03 14:07:08 +0100587#if ERRATA_N2_2326639
588 mov x15, x30
589 bl cpu_get_rev_var
590 bl errata_n2_2326639_wa
591 mov x30, x15
592#endif /* ERRATA_N2_2326639 */
593
Bipin Ravi4618b2b2021-03-31 10:10:27 -0500594 /* ---------------------------------------------------
Javier Almansa Sobrino25bbbd22020-10-23 13:22:07 +0100595 * Enable CPU power down bit in power control register
596 * No need to do cache maintenance here.
Bipin Ravi4618b2b2021-03-31 10:10:27 -0500597 * ---------------------------------------------------
Javier Almansa Sobrino25bbbd22020-10-23 13:22:07 +0100598 */
599 mrs x0, NEOVERSE_N2_CPUPWRCTLR_EL1
600 orr x0, x0, #NEOVERSE_N2_CORE_PWRDN_EN_BIT
601 msr NEOVERSE_N2_CPUPWRCTLR_EL1, x0
Bipin Ravi1ee7c822022-12-07 17:01:26 -0600602#if ERRATA_N2_2743089
603 mov x15, x30
604 bl cpu_get_rev_var
605 bl errata_n2_2743089_wa
606 mov x30, x15
607#endif /* ERRATA_N2_2743089 */
Javier Almansa Sobrino25bbbd22020-10-23 13:22:07 +0100608 isb
609 ret
610endfunc neoverse_n2_core_pwr_dwn
611
612#if REPORT_ERRATA
613/*
614 * Errata printing function for Neoverse N2 cores. Must follow AAPCS.
615 */
616func neoverse_n2_errata_report
nayanpatel-arm9380f752021-08-06 17:46:10 -0700617 stp x8, x30, [sp, #-16]!
618
619 bl cpu_get_rev_var
620 mov x8, x0
621
622 /*
623 * Report all errata. The revision-variant information is passed to
624 * checking functions of each errata.
625 */
626 report_errata ERRATA_N2_2002655, neoverse_n2, 2002655
Arvind Ram Prakasha438f432023-06-23 14:47:30 -0500627 report_errata ERRATA_N2_2002655, neoverse_n2, 2025414
Bipin Ravi65e04f22021-03-30 16:08:32 -0500628 report_errata ERRATA_N2_2067956, neoverse_n2, 2067956
nayanpatel-armef8f0c52021-09-28 09:46:45 -0700629 report_errata ERRATA_N2_2138953, neoverse_n2, 2138953
Arvind Ram Prakasha438f432023-06-23 14:47:30 -0500630 report_errata ERRATA_N2_2138956, neoverse_n2, 2138956
nayanpatel-armc9481852021-10-20 18:28:58 -0700631 report_errata ERRATA_N2_2138958, neoverse_n2, 2138958
Arvind Ram Prakasha438f432023-06-23 14:47:30 -0500632 report_errata ERRATA_N2_2189731, neoverse_n2, 2189731
nayanpatel-arm603806d2021-10-07 17:59:33 -0700633 report_errata ERRATA_N2_2242400, neoverse_n2, 2242400
Arvind Ram Prakasha438f432023-06-23 14:47:30 -0500634 report_errata ERRATA_N2_2242415, neoverse_n2, 2242415
nayanpatel-arm0d2d9992021-10-20 17:30:46 -0700635 report_errata ERRATA_N2_2280757, neoverse_n2, 2280757
Boyan Karatotev43438ad2022-10-03 14:07:08 +0100636 report_errata ERRATA_N2_2326639, neoverse_n2, 2326639
Akram Ahmade6602d42022-07-18 12:27:29 +0100637 report_errata ERRATA_N2_2376738, neoverse_n2, 2376738
Daniel Boulby884d5152022-07-06 14:33:13 +0100638 report_errata ERRATA_N2_2388450, neoverse_n2, 2388450
Bipin Ravi1ee7c822022-12-07 17:01:26 -0600639 report_errata ERRATA_N2_2743089, neoverse_n2, 2743089
Bipin Ravi7e3273e2021-12-22 14:35:21 -0600640 report_errata ERRATA_DSU_2313941, neoverse_n2, dsu_2313941
Arvind Ram Prakasha438f432023-06-23 14:47:30 -0500641 report_errata WORKAROUND_CVE_2022_23960, neoverse_n2, cve_2022_23960
nayanpatel-arm9380f752021-08-06 17:46:10 -0700642
643 ldp x8, x30, [sp], #16
Javier Almansa Sobrino25bbbd22020-10-23 13:22:07 +0100644 ret
645endfunc neoverse_n2_errata_report
646#endif
647
648 /* ---------------------------------------------
649 * This function provides Neoverse N2 specific
650 * register information for crash reporting.
651 * It needs to return with x6 pointing to
652 * a list of register names in ASCII and
653 * x8 - x15 having values of registers to be
654 * reported.
655 * ---------------------------------------------
656 */
657.section .rodata.neoverse_n2_regs, "aS"
658neoverse_n2_regs: /* The ASCII list of register names to be reported */
659 .asciz "cpupwrctlr_el1", ""
660
661func neoverse_n2_cpu_reg_dump
662 adr x6, neoverse_n2_regs
663 mrs x8, NEOVERSE_N2_CPUPWRCTLR_EL1
664 ret
665endfunc neoverse_n2_cpu_reg_dump
666
667declare_cpu_ops neoverse_n2, NEOVERSE_N2_MIDR, \
668 neoverse_n2_reset_func, \
669 neoverse_n2_core_pwr_dwn