xref: /rk3399_ARM-atf/lib/cpus/aarch64/neoverse_n1.S (revision ebff1072681c5ed09bb70d9c4f617476822db757)
1/*
2 * Copyright (c) 2017-2019, ARM Limited and Contributors. All rights reserved.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7#include <arch.h>
8#include <asm_macros.S>
9#include <neoverse_n1.h>
10#include <cpuamu.h>
11#include <cpu_macros.S>
12#include <context.h>
13
14/* Hardware handled coherency */
15#if HW_ASSISTED_COHERENCY == 0
16#error "Neoverse N1 must be compiled with HW_ASSISTED_COHERENCY enabled"
17#endif
18
19/* 64-bit only core */
20#if CTX_INCLUDE_AARCH32_REGS == 1
21#error "Neoverse-N1 supports only AArch64. Compile with CTX_INCLUDE_AARCH32_REGS=0"
22#endif
23
24	.global neoverse_n1_errata_ic_trap_handler
25
26/* --------------------------------------------------
27 * Errata Workaround for Neoverse N1 Erratum 1043202.
28 * This applies to revision r0p0 and r1p0 of Neoverse N1.
29 * Inputs:
30 * x0: variant[4:7] and revision[0:3] of current cpu.
31 * Shall clobber: x0-x17
32 * --------------------------------------------------
33 */
34func errata_n1_1043202_wa
35	/* Compare x0 against revision r1p0 */
36	mov	x17, x30
37	bl	check_errata_1043202
38	cbz	x0, 1f
39
40	/* Apply instruction patching sequence */
41	ldr	x0, =0x0
42	msr	CPUPSELR_EL3, x0
43	ldr	x0, =0xF3BF8F2F
44	msr	CPUPOR_EL3, x0
45	ldr	x0, =0xFFFFFFFF
46	msr	CPUPMR_EL3, x0
47	ldr	x0, =0x800200071
48	msr	CPUPCR_EL3, x0
49	isb
501:
51	ret	x17
52endfunc errata_n1_1043202_wa
53
54func check_errata_1043202
55	/* Applies to r0p0 and r1p0 */
56	mov	x1, #0x10
57	b	cpu_rev_var_ls
58endfunc check_errata_1043202
59
60/* --------------------------------------------------
61 * Disable speculative loads if Neoverse N1 supports
62 * SSBS.
63 *
64 * Shall clobber: x0.
65 * --------------------------------------------------
66 */
67func neoverse_n1_disable_speculative_loads
68	/* Check if the PE implements SSBS */
69	mrs	x0, id_aa64pfr1_el1
70	tst	x0, #(ID_AA64PFR1_EL1_SSBS_MASK << ID_AA64PFR1_EL1_SSBS_SHIFT)
71	b.eq	1f
72
73	/* Disable speculative loads */
74	msr	SSBS, xzr
75
761:
77	ret
78endfunc neoverse_n1_disable_speculative_loads
79
80/* --------------------------------------------------
81 * Errata Workaround for Neoverse N1 Errata #1073348
82 * This applies to revision r0p0 and r1p0 of Neoverse N1.
83 * Inputs:
84 * x0: variant[4:7] and revision[0:3] of current cpu.
85 * Shall clobber: x0-x17
86 * --------------------------------------------------
87 */
88func errata_n1_1073348_wa
89	/* Compare x0 against revision r1p0 */
90	mov	x17, x30
91	bl	check_errata_1073348
92	cbz	x0, 1f
93	mrs	x1, NEOVERSE_N1_CPUACTLR_EL1
94	orr	x1, x1, NEOVERSE_N1_CPUACTLR_EL1_BIT_6
95	msr	NEOVERSE_N1_CPUACTLR_EL1, x1
961:
97	ret	x17
98endfunc errata_n1_1073348_wa
99
100func check_errata_1073348
101	/* Applies to r0p0 and r1p0 */
102	mov	x1, #0x10
103	b	cpu_rev_var_ls
104endfunc check_errata_1073348
105
106/* --------------------------------------------------
107 * Errata Workaround for Neoverse N1 Errata #1130799
108 * This applies to revision <=r2p0 of Neoverse N1.
109 * Inputs:
110 * x0: variant[4:7] and revision[0:3] of current cpu.
111 * Shall clobber: x0-x17
112 * --------------------------------------------------
113 */
114func errata_n1_1130799_wa
115	/* Compare x0 against revision r2p0 */
116	mov	x17, x30
117	bl	check_errata_1130799
118	cbz	x0, 1f
119	mrs	x1, NEOVERSE_N1_CPUACTLR2_EL1
120	orr	x1, x1, NEOVERSE_N1_CPUACTLR2_EL1_BIT_59
121	msr	NEOVERSE_N1_CPUACTLR2_EL1, x1
1221:
123	ret	x17
124endfunc errata_n1_1130799_wa
125
126func check_errata_1130799
127	/* Applies to <=r2p0 */
128	mov	x1, #0x20
129	b	cpu_rev_var_ls
130endfunc check_errata_1130799
131
132/* --------------------------------------------------
133 * Errata Workaround for Neoverse N1 Errata #1165347
134 * This applies to revision <=r2p0 of Neoverse N1.
135 * Inputs:
136 * x0: variant[4:7] and revision[0:3] of current cpu.
137 * Shall clobber: x0-x17
138 * --------------------------------------------------
139 */
140func errata_n1_1165347_wa
141	/* Compare x0 against revision r2p0 */
142	mov	x17, x30
143	bl	check_errata_1165347
144	cbz	x0, 1f
145	mrs	x1, NEOVERSE_N1_CPUACTLR2_EL1
146	orr	x1, x1, NEOVERSE_N1_CPUACTLR2_EL1_BIT_0
147	orr	x1, x1, NEOVERSE_N1_CPUACTLR2_EL1_BIT_15
148	msr	NEOVERSE_N1_CPUACTLR2_EL1, x1
1491:
150	ret	x17
151endfunc errata_n1_1165347_wa
152
153func check_errata_1165347
154	/* Applies to <=r2p0 */
155	mov	x1, #0x20
156	b	cpu_rev_var_ls
157endfunc check_errata_1165347
158
159/* --------------------------------------------------
160 * Errata Workaround for Neoverse N1 Errata #1207823
161 * This applies to revision <=r2p0 of Neoverse N1.
162 * Inputs:
163 * x0: variant[4:7] and revision[0:3] of current cpu.
164 * Shall clobber: x0-x17
165 * --------------------------------------------------
166 */
167func errata_n1_1207823_wa
168	/* Compare x0 against revision r2p0 */
169	mov	x17, x30
170	bl	check_errata_1207823
171	cbz	x0, 1f
172	mrs	x1, NEOVERSE_N1_CPUACTLR2_EL1
173	orr	x1, x1, NEOVERSE_N1_CPUACTLR2_EL1_BIT_11
174	msr	NEOVERSE_N1_CPUACTLR2_EL1, x1
1751:
176	ret	x17
177endfunc errata_n1_1207823_wa
178
179func check_errata_1207823
180	/* Applies to <=r2p0 */
181	mov	x1, #0x20
182	b	cpu_rev_var_ls
183endfunc check_errata_1207823
184
185/* --------------------------------------------------
186 * Errata Workaround for Neoverse N1 Errata #1220197
187 * This applies to revision <=r2p0 of Neoverse N1.
188 * Inputs:
189 * x0: variant[4:7] and revision[0:3] of current cpu.
190 * Shall clobber: x0-x17
191 * --------------------------------------------------
192 */
193func errata_n1_1220197_wa
194	/* Compare x0 against revision r2p0 */
195	mov	x17, x30
196	bl	check_errata_1220197
197	cbz	x0, 1f
198	mrs	x1, NEOVERSE_N1_CPUECTLR_EL1
199	orr	x1, x1, NEOVERSE_N1_WS_THR_L2_MASK
200	msr	NEOVERSE_N1_CPUECTLR_EL1, x1
2011:
202	ret	x17
203endfunc errata_n1_1220197_wa
204
205func check_errata_1220197
206	/* Applies to <=r2p0 */
207	mov	x1, #0x20
208	b	cpu_rev_var_ls
209endfunc check_errata_1220197
210
211/* --------------------------------------------------
212 * Errata Workaround for Neoverse N1 Errata #1257314
213 * This applies to revision <=r3p0 of Neoverse N1.
214 * Inputs:
215 * x0: variant[4:7] and revision[0:3] of current cpu.
216 * Shall clobber: x0-x17
217 * --------------------------------------------------
218 */
219func errata_n1_1257314_wa
220	/* Compare x0 against revision r3p0 */
221	mov	x17, x30
222	bl	check_errata_1257314
223	cbz	x0, 1f
224	mrs	x1, NEOVERSE_N1_CPUACTLR3_EL1
225	orr	x1, x1, NEOVERSE_N1_CPUACTLR3_EL1_BIT_10
226	msr	NEOVERSE_N1_CPUACTLR3_EL1, x1
2271:
228	ret	x17
229endfunc errata_n1_1257314_wa
230
231func check_errata_1257314
232	/* Applies to <=r3p0 */
233	mov	x1, #0x30
234	b	cpu_rev_var_ls
235endfunc check_errata_1257314
236
237/* --------------------------------------------------
238 * Errata Workaround for Neoverse N1 Errata #1262606
239 * This applies to revision <=r3p0 of Neoverse N1.
240 * Inputs:
241 * x0: variant[4:7] and revision[0:3] of current cpu.
242 * Shall clobber: x0-x17
243 * --------------------------------------------------
244 */
245func errata_n1_1262606_wa
246	/* Compare x0 against revision r3p0 */
247	mov	x17, x30
248	bl	check_errata_1262606
249	cbz	x0, 1f
250	mrs	x1, NEOVERSE_N1_CPUACTLR_EL1
251	orr	x1, x1, NEOVERSE_N1_CPUACTLR_EL1_BIT_13
252	msr	NEOVERSE_N1_CPUACTLR_EL1, x1
2531:
254	ret	x17
255endfunc errata_n1_1262606_wa
256
257func check_errata_1262606
258	/* Applies to <=r3p0 */
259	mov	x1, #0x30
260	b	cpu_rev_var_ls
261endfunc check_errata_1262606
262
263/* --------------------------------------------------
264 * Errata Workaround for Neoverse N1 Errata #1262888
265 * This applies to revision <=r3p0 of Neoverse N1.
266 * Inputs:
267 * x0: variant[4:7] and revision[0:3] of current cpu.
268 * Shall clobber: x0-x17
269 * --------------------------------------------------
270 */
271func errata_n1_1262888_wa
272	/* Compare x0 against revision r3p0 */
273	mov	x17, x30
274	bl	check_errata_1262888
275	cbz	x0, 1f
276	mrs	x1, NEOVERSE_N1_CPUECTLR_EL1
277	orr	x1, x1, NEOVERSE_N1_CPUECTLR_EL1_MM_TLBPF_DIS_BIT
278	msr	NEOVERSE_N1_CPUECTLR_EL1, x1
2791:
280	ret	x17
281endfunc errata_n1_1262888_wa
282
283func check_errata_1262888
284	/* Applies to <=r3p0 */
285	mov	x1, #0x30
286	b	cpu_rev_var_ls
287endfunc check_errata_1262888
288
289/* --------------------------------------------------
290 * Errata Workaround for Neoverse N1 Errata #1275112
291 * This applies to revision <=r3p0 of Neoverse N1.
292 * Inputs:
293 * x0: variant[4:7] and revision[0:3] of current cpu.
294 * Shall clobber: x0-x17
295 * --------------------------------------------------
296 */
297func errata_n1_1275112_wa
298	/* Compare x0 against revision r3p0 */
299	mov	x17, x30
300	bl	check_errata_1275112
301	cbz	x0, 1f
302	mrs	x1, NEOVERSE_N1_CPUACTLR_EL1
303	orr	x1, x1, NEOVERSE_N1_CPUACTLR_EL1_BIT_13
304	msr	NEOVERSE_N1_CPUACTLR_EL1, x1
3051:
306	ret	x17
307endfunc errata_n1_1275112_wa
308
309func check_errata_1275112
310	/* Applies to <=r3p0 */
311	mov	x1, #0x30
312	b	cpu_rev_var_ls
313endfunc check_errata_1275112
314
315/* --------------------------------------------------
316 * Errata Workaround for Neoverse N1 Erratum 1315703.
317 * This applies to revision <= r3p0 of Neoverse N1.
318 * Inputs:
319 * x0: variant[4:7] and revision[0:3] of current cpu.
320 * Shall clobber: x0-x17
321 * --------------------------------------------------
322 */
323func errata_n1_1315703_wa
324	/* Compare x0 against revision r3p1 */
325	mov	x17, x30
326	bl	check_errata_1315703
327	cbz	x0, 1f
328
329	mrs	x0, NEOVERSE_N1_CPUACTLR2_EL1
330	orr	x0, x0, #NEOVERSE_N1_CPUACTLR2_EL1_BIT_16
331	msr	NEOVERSE_N1_CPUACTLR2_EL1, x0
332
3331:
334	ret	x17
335endfunc errata_n1_1315703_wa
336
337func check_errata_1315703
338	/* Applies to everything <= r3p0. */
339	mov	x1, #0x30
340	b	cpu_rev_var_ls
341endfunc check_errata_1315703
342
343/* --------------------------------------------------
344 * Errata Workaround for Neoverse N1 Erratum 1542419.
345 * This applies to revisions r3p0 - r4p0 of Neoverse N1
346 * Inputs:
347 * x0: variant[4:7] and revision[0:3] of current cpu.
348 * Shall clobber: x0-x17
349 * --------------------------------------------------
350 */
351func errata_n1_1542419_wa
352	/* Compare x0 against revision r3p0 and r4p0 */
353	mov	x17, x30
354	bl	check_errata_1542419
355	cbz	x0, 1f
356
357	/* Apply instruction patching sequence */
358	ldr	x0, =0x0
359	msr	CPUPSELR_EL3, x0
360	ldr	x0, =0xEE670D35
361	msr	CPUPOR_EL3, x0
362	ldr	x0, =0xFFFF0FFF
363	msr	CPUPMR_EL3, x0
364	ldr	x0, =0x08000020007D
365	msr	CPUPCR_EL3, x0
366	isb
3671:
368	ret	x17
369endfunc errata_n1_1542419_wa
370
371func check_errata_1542419
372	/* Applies to everything r3p0 - r4p0. */
373	mov	x1, #0x30
374	mov	x2, #0x40
375	b	cpu_rev_var_range
376endfunc check_errata_1542419
377
378func neoverse_n1_reset_func
379	mov	x19, x30
380
381	bl neoverse_n1_disable_speculative_loads
382
383	/* Forces all cacheable atomic instructions to be near */
384	mrs	x0, NEOVERSE_N1_CPUACTLR2_EL1
385	orr	x0, x0, #NEOVERSE_N1_CPUACTLR2_EL1_BIT_2
386	msr	NEOVERSE_N1_CPUACTLR2_EL1, x0
387	isb
388
389	bl	cpu_get_rev_var
390	mov	x18, x0
391
392#if ERRATA_N1_1043202
393	mov	x0, x18
394	bl	errata_n1_1043202_wa
395#endif
396
397#if ERRATA_N1_1073348
398	mov	x0, x18
399	bl	errata_n1_1073348_wa
400#endif
401
402#if ERRATA_N1_1130799
403	mov	x0, x18
404	bl	errata_n1_1130799_wa
405#endif
406
407#if ERRATA_N1_1165347
408	mov	x0, x18
409	bl	errata_n1_1165347_wa
410#endif
411
412#if ERRATA_N1_1207823
413	mov	x0, x18
414	bl	errata_n1_1207823_wa
415#endif
416
417#if ERRATA_N1_1220197
418	mov	x0, x18
419	bl	errata_n1_1220197_wa
420#endif
421
422#if ERRATA_N1_1257314
423	mov	x0, x18
424	bl	errata_n1_1257314_wa
425#endif
426
427#if ERRATA_N1_1262606
428	mov	x0, x18
429	bl	errata_n1_1262606_wa
430#endif
431
432#if ERRATA_N1_1262888
433	mov	x0, x18
434	bl	errata_n1_1262888_wa
435#endif
436
437#if ERRATA_N1_1275112
438	mov	x0, x18
439	bl	errata_n1_1275112_wa
440#endif
441
442#if ERRATA_N1_1315703
443	mov	x0, x18
444	bl	errata_n1_1315703_wa
445#endif
446
447#if ERRATA_N1_1542419
448	mov	x0, x18
449	bl	errata_n1_1542419_wa
450#endif
451
452#if ENABLE_AMU
453	/* Make sure accesses from EL0/EL1 and EL2 are not trapped to EL3 */
454	mrs	x0, actlr_el3
455	orr	x0, x0, #NEOVERSE_N1_ACTLR_AMEN_BIT
456	msr	actlr_el3, x0
457
458	/* Make sure accesses from EL0/EL1 are not trapped to EL2 */
459	mrs	x0, actlr_el2
460	orr	x0, x0, #NEOVERSE_N1_ACTLR_AMEN_BIT
461	msr	actlr_el2, x0
462
463	/* Enable group0 counters */
464	mov	x0, #NEOVERSE_N1_AMU_GROUP0_MASK
465	msr	CPUAMCNTENSET_EL0, x0
466#endif
467
468#if ERRATA_DSU_936184
469	bl	errata_dsu_936184_wa
470#endif
471
472	isb
473	ret	x19
474endfunc neoverse_n1_reset_func
475
476	/* ---------------------------------------------
477	 * HW will do the cache maintenance while powering down
478	 * ---------------------------------------------
479	 */
480func neoverse_n1_core_pwr_dwn
481	/* ---------------------------------------------
482	 * Enable CPU power down bit in power control register
483	 * ---------------------------------------------
484	 */
485	mrs	x0, NEOVERSE_N1_CPUPWRCTLR_EL1
486	orr	x0, x0, #NEOVERSE_N1_CORE_PWRDN_EN_MASK
487	msr	NEOVERSE_N1_CPUPWRCTLR_EL1, x0
488	isb
489	ret
490endfunc neoverse_n1_core_pwr_dwn
491
492#if REPORT_ERRATA
493/*
494 * Errata printing function for Neoverse N1. Must follow AAPCS.
495 */
496func neoverse_n1_errata_report
497	stp	x8, x30, [sp, #-16]!
498
499	bl	cpu_get_rev_var
500	mov	x8, x0
501
502	/*
503	 * Report all errata. The revision-variant information is passed to
504	 * checking functions of each errata.
505	 */
506	report_errata ERRATA_N1_1043202, neoverse_n1, 1043202
507	report_errata ERRATA_N1_1073348, neoverse_n1, 1073348
508	report_errata ERRATA_N1_1130799, neoverse_n1, 1130799
509	report_errata ERRATA_N1_1165347, neoverse_n1, 1165347
510	report_errata ERRATA_N1_1207823, neoverse_n1, 1207823
511	report_errata ERRATA_N1_1220197, neoverse_n1, 1220197
512	report_errata ERRATA_N1_1257314, neoverse_n1, 1257314
513	report_errata ERRATA_N1_1262606, neoverse_n1, 1262606
514	report_errata ERRATA_N1_1262888, neoverse_n1, 1262888
515	report_errata ERRATA_N1_1275112, neoverse_n1, 1275112
516	report_errata ERRATA_N1_1315703, neoverse_n1, 1315703
517	report_errata ERRATA_N1_1542419, neoverse_n1, 1542419
518	report_errata ERRATA_DSU_936184, neoverse_n1, dsu_936184
519
520	ldp	x8, x30, [sp], #16
521	ret
522endfunc neoverse_n1_errata_report
523#endif
524
525/*
526 * Handle trap of EL0 IC IVAU instructions to EL3 by executing a TLB
527 * inner-shareable invalidation to an arbitrary address followed by a DSB.
528 *
529 * x1: Exception Syndrome
530 */
531func neoverse_n1_errata_ic_trap_handler
532	cmp	x1, #NEOVERSE_N1_EC_IC_TRAP
533	b.ne	1f
534	tlbi	vae3is, xzr
535	dsb	sy
536
537	# Skip the IC instruction itself
538	mrs     x3, elr_el3
539	add     x3, x3, #4
540	msr     elr_el3, x3
541
542	ldp	x0, x1, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X0]
543	ldp	x2, x3, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X2]
544	ldp	x4, x5, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X4]
545	ldr	x30, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_LR]
546
547#if IMAGE_BL31 && RAS_EXTENSION
548	/*
549	 * Issue Error Synchronization Barrier to synchronize SErrors before
550	 * exiting EL3. We're running with EAs unmasked, so any synchronized
551	 * errors would be taken immediately; therefore no need to inspect
552	 * DISR_EL1 register.
553	 */
554	esb
555#endif
556	eret
5571:
558	ret
559endfunc neoverse_n1_errata_ic_trap_handler
560
561	/* ---------------------------------------------
562	 * This function provides neoverse_n1 specific
563	 * register information for crash reporting.
564	 * It needs to return with x6 pointing to
565	 * a list of register names in ascii and
566	 * x8 - x15 having values of registers to be
567	 * reported.
568	 * ---------------------------------------------
569	 */
570.section .rodata.neoverse_n1_regs, "aS"
571neoverse_n1_regs:  /* The ascii list of register names to be reported */
572	.asciz	"cpuectlr_el1", ""
573
574func neoverse_n1_cpu_reg_dump
575	adr	x6, neoverse_n1_regs
576	mrs	x8, NEOVERSE_N1_CPUECTLR_EL1
577	ret
578endfunc neoverse_n1_cpu_reg_dump
579
580declare_cpu_ops_eh neoverse_n1, NEOVERSE_N1_MIDR, \
581	neoverse_n1_reset_func, \
582	neoverse_n1_errata_ic_trap_handler, \
583	neoverse_n1_core_pwr_dwn
584