xref: /rk3399_ARM-atf/lib/cpus/aarch64/cortex_a78.S (revision 742c23aab79a21803472c5b4314b43057f1d3e84)
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 <cortex_a78.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 "cortex_a78 must be compiled with HW_ASSISTED_COHERENCY enabled"
18#endif
19
20#if WORKAROUND_CVE_2022_23960
21	wa_cve_2022_23960_bhb_vector_table CORTEX_A78_BHB_LOOP_COUNT, cortex_a78
22#endif /* WORKAROUND_CVE_2022_23960 */
23
24/* --------------------------------------------------
25 * Errata Workaround for A78 Erratum 1688305.
26 * This applies to revision r0p0 and r1p0 of A78.
27 * Inputs:
28 * x0: variant[4:7] and revision[0:3] of current cpu.
29 * Shall clobber: x0-x17
30 * --------------------------------------------------
31 */
32func errata_a78_1688305_wa
33	/* Compare x0 against revision r1p0 */
34	mov	x17, x30
35	bl	check_errata_1688305
36	cbz	x0, 1f
37	mrs     x1, CORTEX_A78_ACTLR2_EL1
38	orr	x1, x1, #CORTEX_A78_ACTLR2_EL1_BIT_1
39	msr     CORTEX_A78_ACTLR2_EL1, x1
40	isb
411:
42	ret	x17
43endfunc errata_a78_1688305_wa
44
45func check_errata_1688305
46	/* Applies to r0p0 and r1p0 */
47	mov	x1, #0x10
48	b	cpu_rev_var_ls
49endfunc check_errata_1688305
50
51/* --------------------------------------------------
52 * Errata Workaround for Cortex A78 Errata #1941498.
53 * This applies to revisions r0p0, r1p0, and r1p1.
54 * x0: variant[4:7] and revision[0:3] of current cpu.
55 * Shall clobber: x0-x17
56 * --------------------------------------------------
57 */
58func errata_a78_1941498_wa
59	/* Compare x0 against revision <= r1p1 */
60	mov	x17, x30
61	bl	check_errata_1941498
62	cbz	x0, 1f
63
64	/* Set bit 8 in ECTLR_EL1 */
65	mrs	x1, CORTEX_A78_CPUECTLR_EL1
66	orr	x1, x1, #CORTEX_A78_CPUECTLR_EL1_BIT_8
67	msr	CORTEX_A78_CPUECTLR_EL1, x1
68	isb
691:
70	ret	x17
71endfunc errata_a78_1941498_wa
72
73func check_errata_1941498
74	/* Check for revision <= r1p1, might need to be updated later. */
75	mov	x1, #0x11
76	b	cpu_rev_var_ls
77endfunc check_errata_1941498
78
79/* --------------------------------------------------
80 * Errata Workaround for A78 Erratum 1951500.
81 * This applies to revisions r1p0 and r1p1 of A78.
82 * The issue also exists in r0p0 but there is no fix
83 * in that revision.
84 * Inputs:
85 * x0: variant[4:7] and revision[0:3] of current cpu.
86 * Shall clobber: x0-x17
87 * --------------------------------------------------
88 */
89func errata_a78_1951500_wa
90	/* Compare x0 against revisions r1p0 - r1p1 */
91	mov	x17, x30
92	bl	check_errata_1951500
93	cbz	x0, 1f
94
95	msr	S3_6_c15_c8_0, xzr
96	ldr	x0, =0x10E3900002
97	msr	S3_6_c15_c8_2, x0
98	ldr	x0, =0x10FFF00083
99	msr	S3_6_c15_c8_3, x0
100	ldr	x0, =0x2001003FF
101	msr	S3_6_c15_c8_1, x0
102
103	mov	x0, #1
104	msr	S3_6_c15_c8_0, x0
105	ldr	x0, =0x10E3800082
106	msr	S3_6_c15_c8_2, x0
107	ldr	x0, =0x10FFF00083
108	msr	S3_6_c15_c8_3, x0
109	ldr	x0, =0x2001003FF
110	msr	S3_6_c15_c8_1, x0
111
112	mov	x0, #2
113	msr	S3_6_c15_c8_0, x0
114	ldr	x0, =0x10E3800200
115	msr	S3_6_c15_c8_2, x0
116	ldr	x0, =0x10FFF003E0
117	msr	S3_6_c15_c8_3, x0
118	ldr	x0, =0x2001003FF
119	msr	S3_6_c15_c8_1, x0
120
121	isb
1221:
123	ret	x17
124endfunc errata_a78_1951500_wa
125
126func check_errata_1951500
127	/* Applies to revisions r1p0 and r1p1. */
128	mov	x1, #CPU_REV(1, 0)
129	mov	x2, #CPU_REV(1, 1)
130	b	cpu_rev_var_range
131endfunc check_errata_1951500
132
133/* --------------------------------------------------
134 * Errata Workaround for Cortex A78 Errata #1821534.
135 * This applies to revisions r0p0 and r1p0.
136 * x0: variant[4:7] and revision[0:3] of current cpu.
137 * Shall clobber: x0-x17
138 * --------------------------------------------------
139 */
140func errata_a78_1821534_wa
141	/* Check revision. */
142	mov	x17, x30
143	bl	check_errata_1821534
144	cbz	x0, 1f
145
146	/* Set bit 2 in ACTLR2_EL1 */
147	mrs     x1, CORTEX_A78_ACTLR2_EL1
148	orr	x1, x1, #CORTEX_A78_ACTLR2_EL1_BIT_2
149	msr     CORTEX_A78_ACTLR2_EL1, x1
150	isb
1511:
152	ret	x17
153endfunc errata_a78_1821534_wa
154
155func check_errata_1821534
156	/* Applies to r0p0 and r1p0 */
157	mov	x1, #0x10
158	b	cpu_rev_var_ls
159endfunc check_errata_1821534
160
161/* --------------------------------------------------
162 * Errata Workaround for Cortex A78 Errata 1952683.
163 * This applies to revision r0p0.
164 * x0: variant[4:7] and revision[0:3] of current cpu.
165 * Shall clobber: x0-x17
166 * --------------------------------------------------
167 */
168func errata_a78_1952683_wa
169	/* Check revision. */
170	mov	x17, x30
171	bl	check_errata_1952683
172	cbz	x0, 1f
173
174	ldr	x0,=0x5
175	msr	S3_6_c15_c8_0,x0
176	ldr	x0,=0xEEE10A10
177	msr	S3_6_c15_c8_2,x0
178	ldr	x0,=0xFFEF0FFF
179	msr	S3_6_c15_c8_3,x0
180	ldr	x0,=0x0010F000
181	msr	S3_6_c15_c8_4,x0
182	ldr	x0,=0x0010F000
183	msr	S3_6_c15_c8_5,x0
184	ldr	x0,=0x40000080023ff
185	msr	S3_6_c15_c8_1,x0
186	ldr	x0,=0x6
187	msr	S3_6_c15_c8_0,x0
188	ldr	x0,=0xEE640F34
189	msr	S3_6_c15_c8_2,x0
190	ldr	x0,=0xFFEF0FFF
191	msr	S3_6_c15_c8_3,x0
192	ldr	x0,=0x40000080023ff
193	msr	S3_6_c15_c8_1,x0
194	isb
1951:
196	ret	x17
197endfunc errata_a78_1952683_wa
198
199func check_errata_1952683
200	/* Applies to r0p0 only */
201	mov	x1, #0x00
202	b	cpu_rev_var_ls
203endfunc check_errata_1952683
204
205/* --------------------------------------------------
206 * Errata Workaround for Cortex A78 Errata 2132060.
207 * This applies to revisions r0p0, r1p0, r1p1, and r1p2.
208 * It is still open.
209 * x0: variant[4:7] and revision[0:3] of current cpu.
210 * Shall clobber: x0-x1, x17
211 * --------------------------------------------------
212 */
213func errata_a78_2132060_wa
214	/* Check revision. */
215	mov	x17, x30
216	bl	check_errata_2132060
217	cbz	x0, 1f
218
219	/* Apply the workaround. */
220	mrs	x1, CORTEX_A78_CPUECTLR_EL1
221	mov	x0, #CORTEX_A78_CPUECTLR_EL1_PF_MODE_CNSRV
222	bfi	x1, x0, #CPUECTLR_EL1_PF_MODE_LSB, #CPUECTLR_EL1_PF_MODE_WIDTH
223	msr	CORTEX_A78_CPUECTLR_EL1, x1
2241:
225	ret	x17
226endfunc errata_a78_2132060_wa
227
228func check_errata_2132060
229	/* Applies to r0p0, r0p1, r1p1, and r1p2 */
230	mov	x1, #0x12
231	b	cpu_rev_var_ls
232endfunc check_errata_2132060
233
234/* --------------------------------------------------------------------
235 * Errata Workaround for A78 Erratum 2242635.
236 * This applies to revisions r1p0, r1p1, and r1p2 of the Cortex A78
237 * processor and is still open.
238 * The issue also exists in r0p0 but there is no fix in that revision.
239 * x0: variant[4:7] and revision[0:3] of current cpu.
240 * Shall clobber: x0-x17
241 * --------------------------------------------------------------------
242 */
243func errata_a78_2242635_wa
244	/* Compare x0 against revisions r1p0 - r1p2 */
245	mov	x17, x30
246	bl	check_errata_2242635
247	cbz	x0, 1f
248
249	ldr	x0, =0x5
250	msr	S3_6_c15_c8_0, x0 /* CPUPSELR_EL3 */
251	ldr	x0, =0x10F600E000
252	msr	S3_6_c15_c8_2, x0 /* CPUPOR_EL3 */
253	ldr	x0, =0x10FF80E000
254	msr	S3_6_c15_c8_3, x0 /* CPUPMR_EL3 */
255	ldr	x0, =0x80000000003FF
256	msr	S3_6_c15_c8_1, x0 /* CPUPCR_EL3 */
257
258	isb
2591:
260	ret	x17
261endfunc errata_a78_2242635_wa
262
263func check_errata_2242635
264	/* Applies to revisions r1p0 through r1p2. */
265	mov	x1, #CPU_REV(1, 0)
266	mov	x2, #CPU_REV(1, 2)
267	b	cpu_rev_var_range
268endfunc check_errata_2242635
269
270/* --------------------------------------------------
271 * Errata Workaround for Cortex A78 Errata 2376745.
272 * This applies to revisions r0p0, r1p0, r1p1, and r1p2.
273 * It is still open.
274 * x0: variant[4:7] and revision[0:3] of current cpu.
275 * Shall clobber: x0-x1, x17
276 * --------------------------------------------------
277 */
278func errata_a78_2376745_wa
279	/* Check revision. */
280	mov	x17, x30
281	bl	check_errata_2376745
282	cbz	x0, 1f
283
284	/* Apply the workaround. */
285	mrs	x1, CORTEX_A78_ACTLR2_EL1
286	orr	x1, x1, #BIT(0)
287	msr	CORTEX_A78_ACTLR2_EL1, x1
2881:
289	ret	x17
290endfunc errata_a78_2376745_wa
291
292func check_errata_2376745
293	/* Applies to r0p0, r0p1, r1p1, and r1p2 */
294	mov	x1, #CPU_REV(1, 2)
295	b	cpu_rev_var_ls
296endfunc check_errata_2376745
297
298/* --------------------------------------------------
299 * Errata Workaround for Cortex A78 Errata 2395406.
300 * This applies to revisions r0p0, r1p0, r1p1, and r1p2.
301 * It is still open.
302 * x0: variant[4:7] and revision[0:3] of current cpu.
303 * Shall clobber: x0-x1, x17
304 * --------------------------------------------------
305 */
306func errata_a78_2395406_wa
307	/* Check revision. */
308	mov	x17, x30
309	bl	check_errata_2395406
310	cbz	x0, 1f
311
312	/* Apply the workaround. */
313	mrs	x1, CORTEX_A78_ACTLR2_EL1
314	orr	x1, x1, #BIT(40)
315	msr	CORTEX_A78_ACTLR2_EL1, x1
3161:
317	ret	x17
318endfunc errata_a78_2395406_wa
319
320func check_errata_2395406
321	/* Applies to r0p0, r0p1, r1p1, and r1p2 */
322	mov	x1, #CPU_REV(1, 2)
323	b	cpu_rev_var_ls
324endfunc check_errata_2395406
325
326func check_errata_cve_2022_23960
327#if WORKAROUND_CVE_2022_23960
328	mov	x0, #ERRATA_APPLIES
329#else
330	mov	x0, #ERRATA_MISSING
331#endif
332	ret
333endfunc check_errata_cve_2022_23960
334
335	/* -------------------------------------------------
336	 * The CPU Ops reset function for Cortex-A78
337	 * -------------------------------------------------
338	 */
339func cortex_a78_reset_func
340	mov	x19, x30
341	bl	cpu_get_rev_var
342	mov	x18, x0
343
344#if ERRATA_A78_1688305
345	mov     x0, x18
346	bl	errata_a78_1688305_wa
347#endif
348
349#if ERRATA_A78_1941498
350	mov     x0, x18
351	bl	errata_a78_1941498_wa
352#endif
353
354#if ERRATA_A78_1951500
355	mov	x0, x18
356	bl	errata_a78_1951500_wa
357#endif
358
359#if ERRATA_A78_1821534
360	mov	x0, x18
361	bl	errata_a78_1821534_wa
362#endif
363
364#if ERRATA_A78_1952683
365	mov	x0, x18
366	bl	errata_a78_1952683_wa
367#endif
368
369#if ERRATA_A78_2132060
370	mov	x0, x18
371	bl	errata_a78_2132060_wa
372#endif
373
374#if ERRATA_A78_2242635
375	mov	x0, x18
376	bl	errata_a78_2242635_wa
377#endif
378
379#if ERRATA_A78_2376745
380	mov	x0, x18
381	bl	errata_a78_2376745_wa
382#endif
383
384#if ERRATA_A78_2395406
385	mov	x0, x18
386	bl	errata_a78_2395406_wa
387#endif
388
389#if ENABLE_AMU
390	/* Make sure accesses from EL0/EL1 and EL2 are not trapped to EL3 */
391	mrs	x0, actlr_el3
392	bic	x0, x0, #CORTEX_A78_ACTLR_TAM_BIT
393	msr	actlr_el3, x0
394
395	/* Make sure accesses from non-secure EL0/EL1 are not trapped to EL2 */
396	mrs	x0, actlr_el2
397	bic	x0, x0, #CORTEX_A78_ACTLR_TAM_BIT
398	msr	actlr_el2, x0
399
400	/* Enable group0 counters */
401	mov	x0, #CORTEX_A78_AMU_GROUP0_MASK
402	msr	CPUAMCNTENSET0_EL0, x0
403
404	/* Enable group1 counters */
405	mov	x0, #CORTEX_A78_AMU_GROUP1_MASK
406	msr	CPUAMCNTENSET1_EL0, x0
407#endif
408
409#if IMAGE_BL31 && WORKAROUND_CVE_2022_23960
410	/*
411	 * The Cortex-A78 generic vectors are overridden to apply errata
412	 * mitigation on exception entry from lower ELs.
413	 */
414	adr	x0, wa_cve_vbar_cortex_a78
415	msr	vbar_el3, x0
416#endif /* IMAGE_BL31 && WORKAROUND_CVE_2022_23960 */
417
418	isb
419	ret	x19
420endfunc cortex_a78_reset_func
421
422	/* ---------------------------------------------
423	 * HW will do the cache maintenance while powering down
424	 * ---------------------------------------------
425	 */
426func cortex_a78_core_pwr_dwn
427	/* ---------------------------------------------
428	 * Enable CPU power down bit in power control register
429	 * ---------------------------------------------
430	 */
431	mrs	x0, CORTEX_A78_CPUPWRCTLR_EL1
432	orr	x0, x0, #CORTEX_A78_CPUPWRCTLR_EL1_CORE_PWRDN_EN_BIT
433	msr	CORTEX_A78_CPUPWRCTLR_EL1, x0
434	isb
435	ret
436endfunc cortex_a78_core_pwr_dwn
437
438	/*
439	 * Errata printing function for cortex_a78. Must follow AAPCS.
440	 */
441#if REPORT_ERRATA
442func cortex_a78_errata_report
443	stp	x8, x30, [sp, #-16]!
444
445	bl	cpu_get_rev_var
446	mov	x8, x0
447
448	/*
449	 * Report all errata. The revision-variant information is passed to
450	 * checking functions of each errata.
451	 */
452	report_errata ERRATA_A78_1688305, cortex_a78, 1688305
453	report_errata ERRATA_A78_1941498, cortex_a78, 1941498
454	report_errata ERRATA_A78_1951500, cortex_a78, 1951500
455	report_errata ERRATA_A78_1821534, cortex_a78, 1821534
456	report_errata ERRATA_A78_1952683, cortex_a78, 1952683
457	report_errata ERRATA_A78_2132060, cortex_a78, 2132060
458	report_errata ERRATA_A78_2242635, cortex_a78, 2242635
459	report_errata ERRATA_A78_2376745, cortex_a78, 2376745
460	report_errata ERRATA_A78_2395406, cortex_a78, 2395406
461	report_errata WORKAROUND_CVE_2022_23960, cortex_a78, cve_2022_23960
462
463	ldp	x8, x30, [sp], #16
464	ret
465endfunc cortex_a78_errata_report
466#endif
467
468	/* ---------------------------------------------
469	 * This function provides cortex_a78 specific
470	 * register information for crash reporting.
471	 * It needs to return with x6 pointing to
472	 * a list of register names in ascii and
473	 * x8 - x15 having values of registers to be
474	 * reported.
475	 * ---------------------------------------------
476	 */
477.section .rodata.cortex_a78_regs, "aS"
478cortex_a78_regs:  /* The ascii list of register names to be reported */
479	.asciz	"cpuectlr_el1", ""
480
481func cortex_a78_cpu_reg_dump
482	adr	x6, cortex_a78_regs
483	mrs	x8, CORTEX_A78_CPUECTLR_EL1
484	ret
485endfunc cortex_a78_cpu_reg_dump
486
487declare_cpu_ops cortex_a78, CORTEX_A78_MIDR, \
488	cortex_a78_reset_func, \
489	cortex_a78_core_pwr_dwn
490