xref: /rk3399_ARM-atf/lib/cpus/aarch64/neoverse_v1.S (revision c71793c6476fa2828f866b8d7b272289f0d9a15c)
1/*
2 * Copyright (c) 2019-2022, Arm Limited. All rights reserved.
3 *
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 <neoverse_v1.h>
11#include <cpu_macros.S>
12#include <plat_macros.S>
13#include "wa_cve_2022_23960_bhb_vector.S"
14
15/* Hardware handled coherency */
16#if HW_ASSISTED_COHERENCY == 0
17#error "Neoverse V1 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 "Neoverse-V1 supports only AArch64. Compile with CTX_INCLUDE_AARCH32_REGS=0"
23#endif
24
25#if WORKAROUND_CVE_2022_23960
26	wa_cve_2022_23960_bhb_vector_table NEOVERSE_V1_BHB_LOOP_COUNT, neoverse_v1
27#endif /* WORKAROUND_CVE_2022_23960 */
28
29	/* --------------------------------------------------
30	 * Errata Workaround for Neoverse V1 Errata #1774420.
31	 * This applies to revisions r0p0 and r1p0, fixed in r1p1.
32	 * x0: variant[4:7] and revision[0:3] of current cpu.
33	 * Shall clobber: x0-x17
34	 * --------------------------------------------------
35	 */
36func errata_neoverse_v1_1774420_wa
37	/* Check workaround compatibility. */
38	mov	x17, x30
39	bl	check_errata_1774420
40	cbz	x0, 1f
41
42	/* Set bit 53 in CPUECTLR_EL1 */
43	mrs     x1, NEOVERSE_V1_CPUECTLR_EL1
44	orr	x1, x1, #NEOVERSE_V1_CPUECTLR_EL1_BIT_53
45	msr     NEOVERSE_V1_CPUECTLR_EL1, x1
46	isb
471:
48	ret	x17
49endfunc errata_neoverse_v1_1774420_wa
50
51func check_errata_1774420
52	/* Applies to r0p0 and r1p0. */
53	mov	x1, #0x10
54	b	cpu_rev_var_ls
55endfunc check_errata_1774420
56
57	/* --------------------------------------------------
58	 * Errata Workaround for Neoverse V1 Errata #1791573.
59	 * This applies to revisions r0p0 and r1p0, fixed in r1p1.
60	 * x0: variant[4:7] and revision[0:3] of current cpu.
61	 * Shall clobber: x0-x17
62	 * --------------------------------------------------
63	 */
64func errata_neoverse_v1_1791573_wa
65	/* Check workaround compatibility. */
66	mov	x17, x30
67	bl	check_errata_1791573
68	cbz	x0, 1f
69
70	/* Set bit 2 in ACTLR2_EL1 */
71	mrs	x1, NEOVERSE_V1_ACTLR2_EL1
72	orr	x1, x1, #NEOVERSE_V1_ACTLR2_EL1_BIT_2
73	msr	NEOVERSE_V1_ACTLR2_EL1, x1
74	isb
751:
76	ret	x17
77endfunc errata_neoverse_v1_1791573_wa
78
79func check_errata_1791573
80	/* Applies to r0p0 and r1p0. */
81	mov	x1, #0x10
82	b	cpu_rev_var_ls
83endfunc check_errata_1791573
84
85	/* --------------------------------------------------
86	 * Errata Workaround for Neoverse V1 Errata #1852267.
87	 * This applies to revisions r0p0 and r1p0, fixed in r1p1.
88	 * x0: variant[4:7] and revision[0:3] of current cpu.
89	 * Shall clobber: x0-x17
90	 * --------------------------------------------------
91	 */
92func errata_neoverse_v1_1852267_wa
93	/* Check workaround compatibility. */
94	mov	x17, x30
95	bl	check_errata_1852267
96	cbz	x0, 1f
97
98	/* Set bit 28 in ACTLR2_EL1 */
99	mrs	x1, NEOVERSE_V1_ACTLR2_EL1
100	orr	x1, x1, #NEOVERSE_V1_ACTLR2_EL1_BIT_28
101	msr	NEOVERSE_V1_ACTLR2_EL1, x1
102	isb
1031:
104	ret	x17
105endfunc errata_neoverse_v1_1852267_wa
106
107func check_errata_1852267
108	/* Applies to r0p0 and r1p0. */
109	mov	x1, #0x10
110	b	cpu_rev_var_ls
111endfunc check_errata_1852267
112
113	/* --------------------------------------------------
114	 * Errata Workaround for Neoverse V1 Errata #1925756.
115	 * This applies to revisions <= r1p1.
116	 * x0: variant[4:7] and revision[0:3] of current cpu.
117	 * Shall clobber: x0-x17
118	 * --------------------------------------------------
119	 */
120func errata_neoverse_v1_1925756_wa
121	/* Check workaround compatibility. */
122	mov	x17, x30
123	bl	check_errata_1925756
124	cbz	x0, 1f
125
126	/* Set bit 8 in CPUECTLR_EL1 */
127	mrs	x1, NEOVERSE_V1_CPUECTLR_EL1
128	orr	x1, x1, #NEOVERSE_V1_CPUECTLR_EL1_BIT_8
129	msr	NEOVERSE_V1_CPUECTLR_EL1, x1
130	isb
1311:
132	ret	x17
133endfunc errata_neoverse_v1_1925756_wa
134
135func check_errata_1925756
136	/* Applies to <= r1p1. */
137	mov	x1, #0x11
138	b	cpu_rev_var_ls
139endfunc check_errata_1925756
140
141	/* --------------------------------------------------
142	 * Errata Workaround for Neoverse V1 Erratum #1940577
143	 * This applies to revisions r1p0 - r1p1 and is open.
144	 * It also exists in r0p0 but there is no fix in that
145	 * revision.
146	 * Inputs:
147	 * x0: variant[4:7] and revision[0:3] of current cpu.
148	 * Shall clobber: x0-x17
149	 * --------------------------------------------------
150	 */
151func errata_neoverse_v1_1940577_wa
152	/* Compare x0 against revisions r1p0 - r1p1 */
153	mov	x17, x30
154	bl	check_errata_1940577
155	cbz	x0, 1f
156
157	mov	x0, #0
158	msr	S3_6_C15_C8_0, x0
159	ldr	x0, =0x10E3900002
160	msr	S3_6_C15_C8_2, x0
161	ldr	x0, =0x10FFF00083
162	msr	S3_6_C15_C8_3, x0
163	ldr	x0, =0x2001003FF
164	msr	S3_6_C15_C8_1, x0
165
166	mov	x0, #1
167	msr	S3_6_C15_C8_0, x0
168	ldr	x0, =0x10E3800082
169	msr	S3_6_C15_C8_2, x0
170	ldr	x0, =0x10FFF00083
171	msr	S3_6_C15_C8_3, x0
172	ldr	x0, =0x2001003FF
173	msr	S3_6_C15_C8_1, x0
174
175	mov	x0, #2
176	msr	S3_6_C15_C8_0, x0
177	ldr	x0, =0x10E3800200
178	msr	S3_6_C15_C8_2, x0
179	ldr	x0, =0x10FFF003E0
180	msr	S3_6_C15_C8_3, x0
181	ldr	x0, =0x2001003FF
182	msr	S3_6_C15_C8_1, x0
183
184	isb
1851:
186	ret	x17
187endfunc errata_neoverse_v1_1940577_wa
188
189func check_errata_1940577
190	/* Applies to revisions r1p0 - r1p1. */
191	mov	x1, #0x10
192	mov	x2, #0x11
193	b	cpu_rev_var_range
194endfunc check_errata_1940577
195
196	/* --------------------------------------------------
197	 * Errata Workaround for Neoverse V1 Errata #1966096
198	 * This applies to revisions r1p0 - r1p1 and is open.
199	 * It also exists in r0p0 but there is no workaround
200	 * for that revision.
201	 * x0: variant[4:7] and revision[0:3] of current cpu.
202	 * Shall clobber: x0-x17
203	 * --------------------------------------------------
204	 */
205func errata_neoverse_v1_1966096_wa
206	/* Check workaround compatibility. */
207	mov	x17, x30
208	bl	check_errata_1966096
209	cbz	x0, 1f
210
211	/* Apply the workaround. */
212	mov	x0, #0x3
213	msr	S3_6_C15_C8_0, x0
214	ldr	x0, =0xEE010F12
215	msr	S3_6_C15_C8_2, x0
216	ldr	x0, =0xFFFF0FFF
217	msr	S3_6_C15_C8_3, x0
218	ldr	x0, =0x80000000003FF
219	msr	S3_6_C15_C8_1, x0
220	isb
221
2221:
223	ret	x17
224endfunc errata_neoverse_v1_1966096_wa
225
226func check_errata_1966096
227	mov	x1, #0x10
228	mov	x2, #0x11
229	b	cpu_rev_var_range
230endfunc check_errata_1966096
231
232	/* --------------------------------------------------
233	 * Errata Workaround for Neoverse V1 Errata #2139242.
234	 * This applies to revisions r0p0, r1p0, and r1p1, it
235	 * is still open.
236	 * x0: variant[4:7] and revision[0:3] of current cpu.
237	 * Shall clobber: x0-x17
238	 * --------------------------------------------------
239	 */
240func errata_neoverse_v1_2139242_wa
241	/* Check workaround compatibility. */
242	mov	x17, x30
243	bl	check_errata_2139242
244	cbz	x0, 1f
245
246	/* Apply the workaround. */
247	mov	x0, #0x3
248	msr	S3_6_C15_C8_0, x0
249	ldr	x0, =0xEE720F14
250	msr	S3_6_C15_C8_2, x0
251	ldr	x0, =0xFFFF0FDF
252	msr	S3_6_C15_C8_3, x0
253	ldr	x0, =0x40000005003FF
254	msr	S3_6_C15_C8_1, x0
255	isb
256
2571:
258	ret	x17
259endfunc errata_neoverse_v1_2139242_wa
260
261func check_errata_2139242
262	/* Applies to r0p0, r1p0, r1p1 */
263	mov	x1, #0x11
264	b	cpu_rev_var_ls
265endfunc check_errata_2139242
266
267	/* --------------------------------------------------
268	 * Errata Workaround for Neoverse V1 Errata #2108267.
269	 * This applies to revisions r0p0, r1p0, and r1p1, it
270	 * is still open.
271	 * x0: variant[4:7] and revision[0:3] of current cpu.
272	 * Shall clobber: x0-x1, x17
273	 * --------------------------------------------------
274	 */
275func errata_neoverse_v1_2108267_wa
276	/* Check workaround compatibility. */
277	mov	x17, x30
278	bl	check_errata_2108267
279	cbz	x0, 1f
280
281	/* Apply the workaround. */
282	mrs	x1, NEOVERSE_V1_CPUECTLR_EL1
283	mov	x0, #NEOVERSE_V1_CPUECTLR_EL1_PF_MODE_CNSRV
284	bfi	x1, x0, #CPUECTLR_EL1_PF_MODE_LSB, #CPUECTLR_EL1_PF_MODE_WIDTH
285	msr	NEOVERSE_V1_CPUECTLR_EL1, x1
2861:
287	ret	x17
288endfunc errata_neoverse_v1_2108267_wa
289
290func check_errata_2108267
291	/* Applies to r0p0, r1p0, r1p1 */
292	mov	x1, #0x11
293	b	cpu_rev_var_ls
294endfunc check_errata_2108267
295
296	/* --------------------------------------------------
297	 * Errata Workaround for Neoverse V1 Errata #2216392.
298	 * This applies to revisions r1p0 and r1p1 and is
299	 * still open.
300	 * This issue is also present in r0p0 but there is no
301	 * workaround in that revision.
302	 * x0: variant[4:7] and revision[0:3] of current cpu.
303	 * Shall clobber: x0-x17
304	 * --------------------------------------------------
305	 */
306func errata_neoverse_v1_2216392_wa
307	/* Check workaround compatibility. */
308	mov	x17, x30
309	bl	check_errata_2216392
310	cbz	x0, 1f
311
312	ldr	x0, =0x5
313	msr	S3_6_c15_c8_0, x0 /* CPUPSELR_EL3 */
314	ldr	x0, =0x10F600E000
315	msr	S3_6_c15_c8_2, x0 /* CPUPOR_EL3 */
316	ldr	x0, =0x10FF80E000
317	msr	S3_6_c15_c8_3, x0 /* CPUPMR_EL3 */
318	ldr	x0, =0x80000000003FF
319	msr	S3_6_c15_c8_1, x0 /* CPUPCR_EL3 */
320
321	isb
3221:
323	ret	x17
324endfunc errata_neoverse_v1_2216392_wa
325
326func check_errata_2216392
327	/* Applies to revisions r1p0 and r1p1. */
328	mov	x1, #CPU_REV(1, 0)
329	mov	x2, #CPU_REV(1, 1)
330	b	cpu_rev_var_range
331endfunc check_errata_2216392
332
333	/* -----------------------------------------------------------------
334	 * Errata Workaround for Neoverse V1 Errata #2294912.
335	 * This applies to revisions r0p0, r1p0, and r1p1 and is still open.
336	 * x0: variant[4:7] and revision[0:3] of current cpu.
337	 * Shall clobber: x0-x17
338	 * -----------------------------------------------------------------
339	 */
340func errata_neoverse_v1_2294912_wa
341	/* Check workaround compatibility. */
342	mov	x17, x30
343	bl	check_errata_2294912
344	cbz	x0, 1f
345
346	/* Set bit 0 in ACTLR2_EL1 */
347	mrs     x1, NEOVERSE_V1_ACTLR2_EL1
348	orr	x1, x1, #NEOVERSE_V1_ACTLR2_EL1_BIT_0
349	msr     NEOVERSE_V1_ACTLR2_EL1, x1
350	isb
3511:
352	ret	x17
353endfunc errata_neoverse_v1_2294912_wa
354
355func check_errata_2294912
356	/* Applies to r0p0, r1p0, and r1p1 right now */
357	mov	x1, #0x11
358	b	cpu_rev_var_ls
359endfunc check_errata_2294912
360
361	/* ---------------------------------------------------
362	 * Errata Workaround for Neoverse V1 Errata #2372203.
363	 * This applies to revisions <= r1p1 and is still open.
364	 * x0: variant[4:7] and revision[0:3] of current cpu.
365	 * Shall clobber: x0-x17
366	 * ----------------------------------------------------
367	 */
368func errata_neoverse_v1_2372203_wa
369	/* Check workaround compatibility. */
370	mov	x17, x30
371	bl	check_errata_2372203
372	cbz	x0, 1f
373
374	/* Set bit 40 in ACTLR2_EL1 */
375	mrs	x1, NEOVERSE_V1_ACTLR2_EL1
376	orr	x1, x1, #NEOVERSE_V1_ACTLR2_EL1_BIT_40
377	msr	NEOVERSE_V1_ACTLR2_EL1, x1
378	isb
3791:
380	ret	x17
381endfunc errata_neoverse_v1_2372203_wa
382
383func check_errata_2372203
384	/* Applies to <= r1p1. */
385	mov	x1, #0x11
386	b	cpu_rev_var_ls
387endfunc check_errata_2372203
388
389func check_errata_cve_2022_23960
390#if WORKAROUND_CVE_2022_23960
391	mov	x0, #ERRATA_APPLIES
392#else
393	mov	x0, #ERRATA_MISSING
394#endif
395	ret
396endfunc check_errata_cve_2022_23960
397
398	/* ---------------------------------------------
399	 * HW will do the cache maintenance while powering down
400	 * ---------------------------------------------
401	 */
402func neoverse_v1_core_pwr_dwn
403	/* ---------------------------------------------
404	 * Enable CPU power down bit in power control register
405	 * ---------------------------------------------
406	 */
407	mrs	x0, NEOVERSE_V1_CPUPWRCTLR_EL1
408	orr	x0, x0, #NEOVERSE_V1_CPUPWRCTLR_EL1_CORE_PWRDN_BIT
409	msr	NEOVERSE_V1_CPUPWRCTLR_EL1, x0
410	isb
411	ret
412endfunc neoverse_v1_core_pwr_dwn
413
414	/*
415	 * Errata printing function for Neoverse V1. Must follow AAPCS.
416	 */
417#if REPORT_ERRATA
418func neoverse_v1_errata_report
419	stp	x8, x30, [sp, #-16]!
420
421	bl	cpu_get_rev_var
422	mov	x8, x0
423
424	/*
425	 * Report all errata. The revision-variant information is passed to
426	 * checking functions of each errata.
427	 */
428	report_errata ERRATA_V1_1774420, neoverse_v1, 1774420
429	report_errata ERRATA_V1_1791573, neoverse_v1, 1791573
430	report_errata ERRATA_V1_1852267, neoverse_v1, 1852267
431	report_errata ERRATA_V1_1925756, neoverse_v1, 1925756
432	report_errata ERRATA_V1_1940577, neoverse_v1, 1940577
433	report_errata ERRATA_V1_1966096, neoverse_v1, 1966096
434	report_errata ERRATA_V1_2139242, neoverse_v1, 2139242
435	report_errata ERRATA_V1_2108267, neoverse_v1, 2108267
436	report_errata ERRATA_V1_2216392, neoverse_v1, 2216392
437	report_errata ERRATA_V1_2294912, neoverse_v1, 2294912
438	report_errata ERRATA_V1_2372203, neoverse_v1, 2372203
439	report_errata WORKAROUND_CVE_2022_23960, neoverse_v1, cve_2022_23960
440
441	ldp	x8, x30, [sp], #16
442	ret
443endfunc neoverse_v1_errata_report
444#endif
445
446func neoverse_v1_reset_func
447	mov	x19, x30
448
449	/* Disable speculative loads */
450	msr	SSBS, xzr
451	isb
452
453#if ERRATA_V1_1774420
454	mov	x0, x18
455	bl	errata_neoverse_v1_1774420_wa
456#endif
457
458#if ERRATA_V1_1791573
459	mov	x0, x18
460	bl	errata_neoverse_v1_1791573_wa
461#endif
462
463#if ERRATA_V1_1852267
464	mov	x0, x18
465	bl	errata_neoverse_v1_1852267_wa
466#endif
467
468#if ERRATA_V1_1925756
469	mov	x0, x18
470	bl	errata_neoverse_v1_1925756_wa
471#endif
472
473#if ERRATA_V1_1940577
474	mov	x0, x18
475	bl	errata_neoverse_v1_1940577_wa
476#endif
477
478#if ERRATA_V1_1966096
479	mov	x0, x18
480	bl	errata_neoverse_v1_1966096_wa
481#endif
482
483#if ERRATA_V1_2139242
484	mov	x0, x18
485	bl	errata_neoverse_v1_2139242_wa
486#endif
487
488#if ERRATA_V1_2108267
489	mov	x0, x18
490	bl	errata_neoverse_v1_2108267_wa
491#endif
492
493#if ERRATA_V1_2216392
494	mov	x0, x18
495	bl	errata_neoverse_v1_2216392_wa
496#endif
497
498#if ERRATA_V1_2294912
499	mov	x0, x18
500	bl	errata_neoverse_v1_2294912_wa
501#endif
502
503#if ERRATA_V1_2372203
504	mov	x0, x18
505	bl	errata_neoverse_v1_2372203_wa
506#endif
507
508#if IMAGE_BL31 && WORKAROUND_CVE_2022_23960
509	/*
510	 * The Neoverse-V1 generic vectors are overridden to apply errata
511         * mitigation on exception entry from lower ELs.
512	 */
513	adr	x0, wa_cve_vbar_neoverse_v1
514	msr	vbar_el3, x0
515#endif /* IMAGE_BL31 && WORKAROUND_CVE_2022_23960 */
516
517	isb
518	ret	x19
519endfunc neoverse_v1_reset_func
520
521	/* ---------------------------------------------
522	 * This function provides Neoverse-V1 specific
523	 * register information for crash reporting.
524	 * It needs to return with x6 pointing to
525	 * a list of register names in ascii and
526	 * x8 - x15 having values of registers to be
527	 * reported.
528	 * ---------------------------------------------
529	 */
530.section .rodata.neoverse_v1_regs, "aS"
531neoverse_v1_regs:  /* The ascii list of register names to be reported */
532	.asciz	"cpuectlr_el1", ""
533
534func neoverse_v1_cpu_reg_dump
535	adr	x6, neoverse_v1_regs
536	mrs	x8, NEOVERSE_V1_CPUECTLR_EL1
537	ret
538endfunc neoverse_v1_cpu_reg_dump
539
540declare_cpu_ops neoverse_v1, NEOVERSE_V1_MIDR, \
541	neoverse_v1_reset_func, \
542	neoverse_v1_core_pwr_dwn
543