1/*
2 * Copyright (c) 2020-2021, 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 <cpu_macros.S>
10#include <neoverse_n2.h>
11
12/* Hardware handled coherency */
13#if HW_ASSISTED_COHERENCY == 0
14#error "Neoverse N2 must be compiled with HW_ASSISTED_COHERENCY enabled"
15#endif
16
17/* 64-bit only core */
18#if CTX_INCLUDE_AARCH32_REGS == 1
19#error "Neoverse-N2 supports only AArch64. Compile with CTX_INCLUDE_AARCH32_REGS=0"
20#endif
21
22/* --------------------------------------------------
23 * Errata Workaround for Neoverse N2 Erratum 2002655.
24 * This applies to revision r0p0 of Neoverse N2. it is still open.
25 * Inputs:
26 * x0: variant[4:7] and revision[0:3] of current cpu.
27 * Shall clobber: x0-x17
28 * --------------------------------------------------
29 */
30func errata_n2_2002655_wa
31	/* Check revision. */
32	mov	x17, x30
33	bl	check_errata_2002655
34	cbz	x0, 1f
35
36	/* Apply instruction patching sequence */
37	ldr x0,=0x6
38	msr S3_6_c15_c8_0,x0
39	ldr x0,=0xF3A08002
40	msr S3_6_c15_c8_2,x0
41	ldr x0,=0xFFF0F7FE
42	msr S3_6_c15_c8_3,x0
43	ldr x0,=0x40000001003ff
44	msr S3_6_c15_c8_1,x0
45	ldr x0,=0x7
46	msr S3_6_c15_c8_0,x0
47	ldr x0,=0xBF200000
48	msr S3_6_c15_c8_2,x0
49	ldr x0,=0xFFEF0000
50	msr S3_6_c15_c8_3,x0
51	ldr x0,=0x40000001003f3
52	msr S3_6_c15_c8_1,x0
53	isb
541:
55	ret	x17
56endfunc errata_n2_2002655_wa
57
58func check_errata_2002655
59	/* Applies to r0p0 */
60	mov	x1, #0x00
61	b	cpu_rev_var_ls
62endfunc check_errata_2002655
63
64/* ---------------------------------------------------------------
65 * Errata Workaround for Neoverse N2 Erratum 2067956.
66 * This applies to revision r0p0 of Neoverse N2 and is still open.
67 * Inputs:
68 * x0: variant[4:7] and revision[0:3] of current cpu.
69 * Shall clobber: x0-x17
70 * ---------------------------------------------------------------
71 */
72func errata_n2_2067956_wa
73	/* Compare x0 against revision r0p0 */
74	mov	x17, x30
75	bl	check_errata_2067956
76	cbz	x0, 1f
77	mrs	x1, NEOVERSE_N2_CPUACTLR_EL1
78	orr	x1, x1, NEOVERSE_N2_CPUACTLR_EL1_BIT_46
79	msr	NEOVERSE_N2_CPUACTLR_EL1, x1
801:
81	ret	x17
82endfunc errata_n2_2067956_wa
83
84func check_errata_2067956
85	/* Applies to r0p0 */
86	mov	x1, #0x00
87	b	cpu_rev_var_ls
88endfunc check_errata_2067956
89
90/* ---------------------------------------------------------------
91 * Errata Workaround for Neoverse N2 Erratum 2025414.
92 * This applies to revision r0p0 of Neoverse N2 and is still open.
93 * Inputs:
94 * x0: variant[4:7] and revision[0:3] of current cpu.
95 * Shall clobber: x0-x17
96 * ---------------------------------------------------------------
97 */
98func errata_n2_2025414_wa
99	/* Compare x0 against revision r0p0 */
100	mov     x17, x30
101	bl      check_errata_2025414
102	cbz     x0, 1f
103	mrs     x1, NEOVERSE_N2_CPUECTLR_EL1
104	orr     x1, x1, NEOVERSE_N2_CPUECTLR_EL1_PFSTIDIS_BIT
105	msr     NEOVERSE_N2_CPUECTLR_EL1, x1
106
1071:
108	ret     x17
109endfunc errata_n2_2025414_wa
110
111func check_errata_2025414
112	/* Applies to r0p0 */
113	mov     x1, #0x00
114	b       cpu_rev_var_ls
115endfunc check_errata_2025414
116
117/* ---------------------------------------------------------------
118 * Errata Workaround for Neoverse N2 Erratum 2189731.
119 * This applies to revision r0p0 of Neoverse N2 and is still open.
120 * Inputs:
121 * x0: variant[4:7] and revision[0:3] of current cpu.
122 * Shall clobber: x0-x17
123 * ---------------------------------------------------------------
124 */
125func errata_n2_2189731_wa
126	/* Compare x0 against revision r0p0 */
127	mov     x17, x30
128	bl      check_errata_2189731
129	cbz     x0, 1f
130	mrs     x1, NEOVERSE_N2_CPUACTLR5_EL1
131	orr     x1, x1, NEOVERSE_N2_CPUACTLR5_EL1_BIT_44
132	msr     NEOVERSE_N2_CPUACTLR5_EL1, x1
133
1341:
135	ret     x17
136endfunc errata_n2_2189731_wa
137
138func check_errata_2189731
139	/* Applies to r0p0 */
140	mov     x1, #0x00
141	b       cpu_rev_var_ls
142endfunc check_errata_2189731
143
144/* --------------------------------------------------
145 * Errata Workaround for Neoverse N2 Erratum 2138956.
146 * This applies to revision r0p0 of Neoverse N2. it is still open.
147 * Inputs:
148 * x0: variant[4:7] and revision[0:3] of current cpu.
149 * Shall clobber: x0-x17
150 * --------------------------------------------------
151 */
152func errata_n2_2138956_wa
153	/* Check revision. */
154	mov	x17, x30
155	bl	check_errata_2138956
156	cbz	x0, 1f
157
158	/* Apply instruction patching sequence */
159	ldr	x0,=0x3
160	msr	S3_6_c15_c8_0,x0
161	ldr	x0,=0xF3A08002
162	msr	S3_6_c15_c8_2,x0
163	ldr	x0,=0xFFF0F7FE
164	msr	S3_6_c15_c8_3,x0
165	ldr	x0,=0x10002001003FF
166	msr	S3_6_c15_c8_1,x0
167	ldr	x0,=0x4
168	msr	S3_6_c15_c8_0,x0
169	ldr	x0,=0xBF200000
170	msr	S3_6_c15_c8_2,x0
171	ldr	x0,=0xFFEF0000
172	msr	S3_6_c15_c8_3,x0
173	ldr	x0,=0x10002001003F3
174	msr	S3_6_c15_c8_1,x0
175	isb
1761:
177	ret	x17
178endfunc errata_n2_2138956_wa
179
180func check_errata_2138956
181	/* Applies to r0p0 */
182	mov	x1, #0x00
183	b	cpu_rev_var_ls
184endfunc check_errata_2138956
185
186/* --------------------------------------------------
187 * Errata Workaround for Neoverse N2 Erratum 2242415.
188 * This applies to revision r0p0 of Neoverse N2. it is still open.
189 * Inputs:
190 * x0: variant[4:7] and revision[0:3] of current cpu.
191 * Shall clobber: x0-x1, x17
192 * --------------------------------------------------
193 */
194func errata_n2_2242415_wa
195	/* Check revision. */
196	mov	x17, x30
197	bl	check_errata_2242415
198	cbz	x0, 1f
199
200	/* Apply instruction patching sequence */
201	mrs	x1, NEOVERSE_N2_CPUACTLR_EL1
202	orr	x1, x1, NEOVERSE_N2_CPUACTLR_EL1_BIT_22
203	msr	NEOVERSE_N2_CPUACTLR_EL1, x1
2041:
205	ret	x17
206endfunc errata_n2_2242415_wa
207
208func check_errata_2242415
209	/* Applies to r0p0 */
210	mov	x1, #0x00
211	b	cpu_rev_var_ls
212endfunc check_errata_2242415
213
214/* --------------------------------------------------
215 * Errata Workaround for Neoverse N2 Erratum 2138953.
216 * This applies to revision r0p0 of Neoverse N2. it is still open.
217 * Inputs:
218 * x0: variant[4:7] and revision[0:3] of current cpu.
219 * Shall clobber: x0-x1, x17
220 * --------------------------------------------------
221 */
222func errata_n2_2138953_wa
223	/* Check revision. */
224	mov	x17, x30
225	bl	check_errata_2138953
226	cbz	x0, 1f
227
228	/* Apply instruction patching sequence */
229	mrs	x1, NEOVERSE_N2_CPUECTLR2_EL1
230	mov	x0, #NEOVERSE_N2_CPUECTLR2_EL1_PF_MODE_CNSRV
231	bfi	x1, x0, #CPUECTLR2_EL1_PF_MODE_LSB, #CPUECTLR2_EL1_PF_MODE_WIDTH
232	msr	NEOVERSE_N2_CPUECTLR2_EL1, x1
2331:
234	ret	x17
235endfunc errata_n2_2138953_wa
236
237func check_errata_2138953
238	/* Applies to r0p0 */
239	mov	x1, #0x00
240	b	cpu_rev_var_ls
241endfunc check_errata_2138953
242
243/* --------------------------------------------------
244 * Errata Workaround for Neoverse N2 Erratum 2138958.
245 * This applies to revision r0p0 of Neoverse N2. it is still open.
246 * Inputs:
247 * x0: variant[4:7] and revision[0:3] of current cpu.
248 * Shall clobber: x0-x1, x17
249 * --------------------------------------------------
250 */
251func errata_n2_2138958_wa
252	/* Check revision. */
253	mov	x17, x30
254	bl	check_errata_2138958
255	cbz	x0, 1f
256
257	/* Apply instruction patching sequence */
258	mrs	x1, NEOVERSE_N2_CPUACTLR5_EL1
259	orr	x1, x1, NEOVERSE_N2_CPUACTLR5_EL1_BIT_13
260	msr	NEOVERSE_N2_CPUACTLR5_EL1, x1
2611:
262	ret	x17
263endfunc errata_n2_2138958_wa
264
265func check_errata_2138958
266	/* Applies to r0p0 */
267	mov	x1, #0x00
268	b	cpu_rev_var_ls
269endfunc check_errata_2138958
270
271/* --------------------------------------------------
272 * Errata Workaround for Neoverse N2 Erratum 2242400.
273 * This applies to revision r0p0 of Neoverse N2. it is still open.
274 * Inputs:
275 * x0: variant[4:7] and revision[0:3] of current cpu.
276 * Shall clobber: x0-x1, x17
277 * --------------------------------------------------
278 */
279func errata_n2_2242400_wa
280	/* Check revision. */
281	mov	x17, x30
282	bl	check_errata_2242400
283	cbz	x0, 1f
284
285	/* Apply instruction patching sequence */
286	mrs	x1, NEOVERSE_N2_CPUACTLR5_EL1
287	orr	x1, x1, NEOVERSE_N2_CPUACTLR5_EL1_BIT_17
288	msr	NEOVERSE_N2_CPUACTLR5_EL1, x1
289	ldr	x0, =0x2
290	msr	S3_6_c15_c8_0, x0
291	ldr	x0, =0x10F600E000
292	msr	S3_6_c15_c8_2, x0
293	ldr	x0, =0x10FF80E000
294	msr	S3_6_c15_c8_3, x0
295	ldr	x0, =0x80000000003FF
296	msr	S3_6_c15_c8_1, x0
297	isb
2981:
299	ret	x17
300endfunc errata_n2_2242400_wa
301
302func check_errata_2242400
303	/* Applies to r0p0 */
304	mov	x1, #0x00
305	b	cpu_rev_var_ls
306endfunc check_errata_2242400
307
308/* --------------------------------------------------
309 * Errata Workaround for Neoverse N2 Erratum 2280757.
310 * This applies to revision r0p0 of Neoverse N2. it is still open.
311 * Inputs:
312 * x0: variant[4:7] and revision[0:3] of current cpu.
313 * Shall clobber: x0-x1, x17
314 * --------------------------------------------------
315 */
316func errata_n2_2280757_wa
317	/* Check revision. */
318	mov	x17, x30
319	bl	check_errata_2280757
320	cbz	x0, 1f
321
322	/* Apply instruction patching sequence */
323	mrs	x1, NEOVERSE_N2_CPUACTLR_EL1
324	orr	x1, x1, NEOVERSE_N2_CPUACTLR_EL1_BIT_22
325	msr	NEOVERSE_N2_CPUACTLR_EL1, x1
3261:
327	ret	x17
328endfunc errata_n2_2280757_wa
329
330func check_errata_2280757
331	/* Applies to r0p0 */
332	mov	x1, #0x00
333	b	cpu_rev_var_ls
334endfunc check_errata_2280757
335
336	/* -------------------------------------------
337	 * The CPU Ops reset function for Neoverse N2.
338	 * -------------------------------------------
339	 */
340func neoverse_n2_reset_func
341	mov	x19, x30
342
343	/* Check if the PE implements SSBS */
344	mrs	x0, id_aa64pfr1_el1
345	tst	x0, #(ID_AA64PFR1_EL1_SSBS_MASK << ID_AA64PFR1_EL1_SSBS_SHIFT)
346	b.eq	1f
347
348	/* Disable speculative loads */
349	msr	SSBS, xzr
3501:
351	/* Force all cacheable atomic instructions to be near */
352	mrs	x0, NEOVERSE_N2_CPUACTLR2_EL1
353	orr	x0, x0, #NEOVERSE_N2_CPUACTLR2_EL1_BIT_2
354	msr	NEOVERSE_N2_CPUACTLR2_EL1, x0
355
356#if ERRATA_N2_2067956
357	mov	x0, x18
358	bl	errata_n2_2067956_wa
359#endif
360
361#if ERRATA_N2_2025414
362	mov	x0, x18
363	bl	errata_n2_2025414_wa
364#endif
365
366#if ERRATA_N2_2189731
367	mov	x0, x18
368	bl	errata_n2_2189731_wa
369#endif
370
371
372#if ERRATA_N2_2138956
373	mov	x0, x18
374	bl	errata_n2_2138956_wa
375#endif
376
377#if ERRATA_N2_2138953
378	mov	x0, x18
379	bl	errata_n2_2138953_wa
380#endif
381
382#if ERRATA_N2_2242415
383	mov	x0, x18
384	bl	errata_n2_2242415_wa
385#endif
386
387#if ERRATA_N2_2138958
388	mov	x0, x18
389	bl	errata_n2_2138958_wa
390#endif
391
392#if ERRATA_N2_2242400
393	mov	x0, x18
394	bl	errata_n2_2242400_wa
395#endif
396
397#if ERRATA_N2_2280757
398	mov	x0, x18
399	bl	errata_n2_2280757_wa
400#endif
401
402#if ENABLE_AMU
403	/* Make sure accesses from EL0/EL1 and EL2 are not trapped to EL3 */
404	mrs	x0, cptr_el3
405	orr	x0, x0, #TAM_BIT
406	msr	cptr_el3, x0
407
408	/* Make sure accesses from EL0/EL1 are not trapped to EL2 */
409	mrs	x0, cptr_el2
410	orr	x0, x0, #TAM_BIT
411	msr	cptr_el2, x0
412
413	/* No need to enable the counters as this would be done at el3 exit */
414#endif
415
416#if NEOVERSE_Nx_EXTERNAL_LLC
417	/* Some systems may have External LLC, core needs to be made aware */
418	mrs	x0, NEOVERSE_N2_CPUECTLR_EL1
419	orr	x0, x0, NEOVERSE_N2_CPUECTLR_EL1_EXTLLC_BIT
420	msr	NEOVERSE_N2_CPUECTLR_EL1, x0
421#endif
422
423	bl	cpu_get_rev_var
424	mov	x18, x0
425
426#if ERRATA_N2_2002655
427	mov	x0, x18
428	bl	errata_n2_2002655_wa
429#endif
430
431	isb
432	ret	x19
433endfunc neoverse_n2_reset_func
434
435func neoverse_n2_core_pwr_dwn
436	/* ---------------------------------------------------
437	 * Enable CPU power down bit in power control register
438	 * No need to do cache maintenance here.
439	 * ---------------------------------------------------
440	 */
441	mrs	x0, NEOVERSE_N2_CPUPWRCTLR_EL1
442	orr	x0, x0, #NEOVERSE_N2_CORE_PWRDN_EN_BIT
443	msr	NEOVERSE_N2_CPUPWRCTLR_EL1, x0
444	isb
445	ret
446endfunc neoverse_n2_core_pwr_dwn
447
448#if REPORT_ERRATA
449/*
450 * Errata printing function for Neoverse N2 cores. Must follow AAPCS.
451 */
452func neoverse_n2_errata_report
453	stp	x8, x30, [sp, #-16]!
454
455	bl	cpu_get_rev_var
456	mov	x8, x0
457
458	/*
459	 * Report all errata. The revision-variant information is passed to
460	 * checking functions of each errata.
461	 */
462	report_errata ERRATA_N2_2002655, neoverse_n2, 2002655
463	report_errata ERRATA_N2_2067956, neoverse_n2, 2067956
464	report_errata ERRATA_N2_2025414, neoverse_n2, 2025414
465	report_errata ERRATA_N2_2189731, neoverse_n2, 2189731
466	report_errata ERRATA_N2_2138956, neoverse_n2, 2138956
467	report_errata ERRATA_N2_2138953, neoverse_n2, 2138953
468	report_errata ERRATA_N2_2242415, neoverse_n2, 2242415
469	report_errata ERRATA_N2_2138958, neoverse_n2, 2138958
470	report_errata ERRATA_N2_2242400, neoverse_n2, 2242400
471	report_errata ERRATA_N2_2280757, neoverse_n2, 2280757
472
473	ldp	x8, x30, [sp], #16
474	ret
475endfunc neoverse_n2_errata_report
476#endif
477
478	/* ---------------------------------------------
479	 * This function provides Neoverse N2 specific
480	 * register information for crash reporting.
481	 * It needs to return with x6 pointing to
482	 * a list of register names in ASCII and
483	 * x8 - x15 having values of registers to be
484	 * reported.
485	 * ---------------------------------------------
486	 */
487.section .rodata.neoverse_n2_regs, "aS"
488neoverse_n2_regs:  /* The ASCII list of register names to be reported */
489	.asciz	"cpupwrctlr_el1", ""
490
491func neoverse_n2_cpu_reg_dump
492	adr	x6, neoverse_n2_regs
493	mrs	x8, NEOVERSE_N2_CPUPWRCTLR_EL1
494	ret
495endfunc neoverse_n2_cpu_reg_dump
496
497declare_cpu_ops neoverse_n2, NEOVERSE_N2_MIDR, \
498	neoverse_n2_reset_func, \
499	neoverse_n2_core_pwr_dwn
500