1/*
2 * Copyright (c) 2019-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 <common/bl_common.h>
10#include <neoverse_v1.h>
11#include <cpu_macros.S>
12#include <plat_macros.S>
13
14/* Hardware handled coherency */
15#if HW_ASSISTED_COHERENCY == 0
16#error "Neoverse V1 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-V1 supports only AArch64. Compile with CTX_INCLUDE_AARCH32_REGS=0"
22#endif
23
24	/* --------------------------------------------------
25	 * Errata Workaround for Neoverse V1 Errata #1774420.
26	 * This applies to revisions r0p0 and r1p0, fixed in r1p1.
27	 * x0: variant[4:7] and revision[0:3] of current cpu.
28	 * Shall clobber: x0-x17
29	 * --------------------------------------------------
30	 */
31func errata_neoverse_v1_1774420_wa
32	/* Check workaround compatibility. */
33	mov	x17, x30
34	bl	check_errata_1774420
35	cbz	x0, 1f
36
37	/* Set bit 53 in CPUECTLR_EL1 */
38	mrs     x1, NEOVERSE_V1_CPUECTLR_EL1
39	orr	x1, x1, #NEOVERSE_V1_CPUECTLR_EL1_BIT_53
40	msr     NEOVERSE_V1_CPUECTLR_EL1, x1
41	isb
421:
43	ret	x17
44endfunc errata_neoverse_v1_1774420_wa
45
46func check_errata_1774420
47	/* Applies to r0p0 and r1p0. */
48	mov	x1, #0x10
49	b	cpu_rev_var_ls
50endfunc check_errata_1774420
51
52	/* --------------------------------------------------
53	 * Errata Workaround for Neoverse V1 Errata #1791573.
54	 * This applies to revisions r0p0 and r1p0, fixed in r1p1.
55	 * x0: variant[4:7] and revision[0:3] of current cpu.
56	 * Shall clobber: x0-x17
57	 * --------------------------------------------------
58	 */
59func errata_neoverse_v1_1791573_wa
60	/* Check workaround compatibility. */
61	mov	x17, x30
62	bl	check_errata_1791573
63	cbz	x0, 1f
64
65	/* Set bit 2 in ACTLR2_EL1 */
66	mrs	x1, NEOVERSE_V1_ACTLR2_EL1
67	orr	x1, x1, #NEOVERSE_V1_ACTLR2_EL1_BIT_2
68	msr	NEOVERSE_V1_ACTLR2_EL1, x1
69	isb
701:
71	ret	x17
72endfunc errata_neoverse_v1_1791573_wa
73
74func check_errata_1791573
75	/* Applies to r0p0 and r1p0. */
76	mov	x1, #0x10
77	b	cpu_rev_var_ls
78endfunc check_errata_1791573
79
80	/* --------------------------------------------------
81	 * Errata Workaround for Neoverse V1 Errata #1852267.
82	 * This applies to revisions r0p0 and r1p0, fixed in r1p1.
83	 * x0: variant[4:7] and revision[0:3] of current cpu.
84	 * Shall clobber: x0-x17
85	 * --------------------------------------------------
86	 */
87func errata_neoverse_v1_1852267_wa
88	/* Check workaround compatibility. */
89	mov	x17, x30
90	bl	check_errata_1852267
91	cbz	x0, 1f
92
93	/* Set bit 28 in ACTLR2_EL1 */
94	mrs	x1, NEOVERSE_V1_ACTLR2_EL1
95	orr	x1, x1, #NEOVERSE_V1_ACTLR2_EL1_BIT_28
96	msr	NEOVERSE_V1_ACTLR2_EL1, x1
97	isb
981:
99	ret	x17
100endfunc errata_neoverse_v1_1852267_wa
101
102func check_errata_1852267
103	/* Applies to r0p0 and r1p0. */
104	mov	x1, #0x10
105	b	cpu_rev_var_ls
106endfunc check_errata_1852267
107
108	/* --------------------------------------------------
109	 * Errata Workaround for Neoverse V1 Errata #1925756.
110	 * This applies to revisions <= r1p1.
111	 * x0: variant[4:7] and revision[0:3] of current cpu.
112	 * Shall clobber: x0-x17
113	 * --------------------------------------------------
114	 */
115func errata_neoverse_v1_1925756_wa
116	/* Check workaround compatibility. */
117	mov	x17, x30
118	bl	check_errata_1925756
119	cbz	x0, 1f
120
121	/* Set bit 8 in CPUECTLR_EL1 */
122	mrs	x1, NEOVERSE_V1_CPUECTLR_EL1
123	orr	x1, x1, #NEOVERSE_V1_CPUECTLR_EL1_BIT_8
124	msr	NEOVERSE_V1_CPUECTLR_EL1, x1
125	isb
1261:
127	ret	x17
128endfunc errata_neoverse_v1_1925756_wa
129
130func check_errata_1925756
131	/* Applies to <= r1p1. */
132	mov	x1, #0x11
133	b	cpu_rev_var_ls
134endfunc check_errata_1925756
135
136	/* --------------------------------------------------
137	 * Errata Workaround for Neoverse V1 Erratum #1940577
138	 * This applies to revisions r1p0 - r1p1 and is open.
139	 * It also exists in r0p0 but there is no fix in that
140	 * revision.
141	 * Inputs:
142	 * x0: variant[4:7] and revision[0:3] of current cpu.
143	 * Shall clobber: x0-x17
144	 * --------------------------------------------------
145	 */
146func errata_neoverse_v1_1940577_wa
147	/* Compare x0 against revisions r1p0 - r1p1 */
148	mov	x17, x30
149	bl	check_errata_1940577
150	cbz	x0, 1f
151
152	mov	x0, #0
153	msr	S3_6_C15_C8_0, x0
154	ldr	x0, =0x10E3900002
155	msr	S3_6_C15_C8_2, x0
156	ldr	x0, =0x10FFF00083
157	msr	S3_6_C15_C8_3, x0
158	ldr	x0, =0x2001003FF
159	msr	S3_6_C15_C8_1, x0
160
161	mov	x0, #1
162	msr	S3_6_C15_C8_0, x0
163	ldr	x0, =0x10E3800082
164	msr	S3_6_C15_C8_2, x0
165	ldr	x0, =0x10FFF00083
166	msr	S3_6_C15_C8_3, x0
167	ldr	x0, =0x2001003FF
168	msr	S3_6_C15_C8_1, x0
169
170	mov	x0, #2
171	msr	S3_6_C15_C8_0, x0
172	ldr	x0, =0x10E3800200
173	msr	S3_6_C15_C8_2, x0
174	ldr	x0, =0x10FFF003E0
175	msr	S3_6_C15_C8_3, x0
176	ldr	x0, =0x2001003FF
177	msr	S3_6_C15_C8_1, x0
178
179	isb
1801:
181	ret	x17
182endfunc errata_neoverse_v1_1940577_wa
183
184func check_errata_1940577
185	/* Applies to revisions r1p0 - r1p1. */
186	mov	x1, #0x10
187	mov	x2, #0x11
188	b	cpu_rev_var_range
189endfunc check_errata_1940577
190
191	/* --------------------------------------------------
192	 * Errata Workaround for Neoverse V1 Errata #1966096
193	 * This applies to revisions r1p0 - r1p1 and is open.
194	 * It also exists in r0p0 but there is no workaround
195	 * for that revision.
196	 * x0: variant[4:7] and revision[0:3] of current cpu.
197	 * Shall clobber: x0-x17
198	 * --------------------------------------------------
199	 */
200func errata_neoverse_v1_1966096_wa
201	/* Check workaround compatibility. */
202	mov	x17, x30
203	bl	check_errata_1966096
204	cbz	x0, 1f
205
206	/* Apply the workaround. */
207	mov	x0, #0x3
208	msr	S3_6_C15_C8_0, x0
209	ldr	x0, =0xEE010F12
210	msr	S3_6_C15_C8_2, x0
211	ldr	x0, =0xFFFF0FFF
212	msr	S3_6_C15_C8_3, x0
213	ldr	x0, =0x80000000003FF
214	msr	S3_6_C15_C8_1, x0
215	isb
216
2171:
218	ret	x17
219endfunc errata_neoverse_v1_1966096_wa
220
221func check_errata_1966096
222	mov	x1, #0x10
223	mov	x2, #0x11
224	b	cpu_rev_var_range
225endfunc check_errata_1966096
226
227	/* --------------------------------------------------
228	 * Errata Workaround for Neoverse V1 Errata #2139242.
229	 * This applies to revisions r0p0, r1p0, and r1p1, it
230	 * is still open.
231	 * x0: variant[4:7] and revision[0:3] of current cpu.
232	 * Shall clobber: x0-x17
233	 * --------------------------------------------------
234	 */
235func errata_neoverse_v1_2139242_wa
236	/* Check workaround compatibility. */
237	mov	x17, x30
238	bl	check_errata_2139242
239	cbz	x0, 1f
240
241	/* Apply the workaround. */
242	mov	x0, #0x3
243	msr	S3_6_C15_C8_0, x0
244	ldr	x0, =0xEE720F14
245	msr	S3_6_C15_C8_2, x0
246	ldr	x0, =0xFFFF0FDF
247	msr	S3_6_C15_C8_3, x0
248	ldr	x0, =0x40000005003FF
249	msr	S3_6_C15_C8_1, x0
250	isb
251
2521:
253	ret	x17
254endfunc errata_neoverse_v1_2139242_wa
255
256func check_errata_2139242
257	/* Applies to r0p0, r1p0, r1p1 */
258	mov	x1, #0x11
259	b	cpu_rev_var_ls
260endfunc check_errata_2139242
261
262	/* ---------------------------------------------
263	 * HW will do the cache maintenance while powering down
264	 * ---------------------------------------------
265	 */
266func neoverse_v1_core_pwr_dwn
267	/* ---------------------------------------------
268	 * Enable CPU power down bit in power control register
269	 * ---------------------------------------------
270	 */
271	mrs	x0, NEOVERSE_V1_CPUPWRCTLR_EL1
272	orr	x0, x0, #NEOVERSE_V1_CPUPWRCTLR_EL1_CORE_PWRDN_BIT
273	msr	NEOVERSE_V1_CPUPWRCTLR_EL1, x0
274	isb
275	ret
276endfunc neoverse_v1_core_pwr_dwn
277
278	/*
279	 * Errata printing function for Neoverse V1. Must follow AAPCS.
280	 */
281#if REPORT_ERRATA
282func neoverse_v1_errata_report
283	stp	x8, x30, [sp, #-16]!
284
285	bl	cpu_get_rev_var
286	mov	x8, x0
287
288	/*
289	 * Report all errata. The revision-variant information is passed to
290	 * checking functions of each errata.
291	 */
292	report_errata ERRATA_V1_1774420, neoverse_v1, 1774420
293	report_errata ERRATA_V1_1791573, neoverse_v1, 1791573
294	report_errata ERRATA_V1_1852267, neoverse_v1, 1852267
295	report_errata ERRATA_V1_1925756, neoverse_v1, 1925756
296	report_errata ERRATA_V1_1940577, neoverse_v1, 1940577
297	report_errata ERRATA_V1_1966096, neoverse_v1, 1966096
298	report_errata ERRATA_V1_2139242, neoverse_v1, 2139242
299
300	ldp	x8, x30, [sp], #16
301	ret
302endfunc neoverse_v1_errata_report
303#endif
304
305func neoverse_v1_reset_func
306	mov	x19, x30
307
308	/* Disable speculative loads */
309	msr	SSBS, xzr
310	isb
311
312#if ERRATA_V1_1774420
313	mov	x0, x18
314	bl	errata_neoverse_v1_1774420_wa
315#endif
316
317#if ERRATA_V1_1791573
318	mov	x0, x18
319	bl	errata_neoverse_v1_1791573_wa
320#endif
321
322#if ERRATA_V1_1852267
323	mov	x0, x18
324	bl	errata_neoverse_v1_1852267_wa
325#endif
326
327#if ERRATA_V1_1925756
328	mov	x0, x18
329	bl	errata_neoverse_v1_1925756_wa
330#endif
331
332#if ERRATA_V1_1940577
333	mov	x0, x18
334	bl	errata_neoverse_v1_1940577_wa
335#endif
336
337#if ERRATA_V1_1966096
338	mov	x0, x18
339	bl	errata_neoverse_v1_1966096_wa
340#endif
341
342#if ERRATA_V1_2139242
343	mov	x0, x18
344	bl	errata_neoverse_v1_2139242_wa
345#endif
346
347	ret	x19
348endfunc neoverse_v1_reset_func
349
350	/* ---------------------------------------------
351	 * This function provides Neoverse-V1 specific
352	 * register information for crash reporting.
353	 * It needs to return with x6 pointing to
354	 * a list of register names in ascii and
355	 * x8 - x15 having values of registers to be
356	 * reported.
357	 * ---------------------------------------------
358	 */
359.section .rodata.neoverse_v1_regs, "aS"
360neoverse_v1_regs:  /* The ascii list of register names to be reported */
361	.asciz	"cpuectlr_el1", ""
362
363func neoverse_v1_cpu_reg_dump
364	adr	x6, neoverse_v1_regs
365	mrs	x8, NEOVERSE_V1_CPUECTLR_EL1
366	ret
367endfunc neoverse_v1_cpu_reg_dump
368
369declare_cpu_ops neoverse_v1, NEOVERSE_V1_MIDR, \
370	neoverse_v1_reset_func, \
371	neoverse_v1_core_pwr_dwn
372