xref: /rk3399_ARM-atf/lib/cpus/aarch64/cortex_a77.S (revision 8a6a9560b5dcccfb68064c0c8c9b4b47981c6ac7)
1/*
2 * Copyright (c) 2018-2022, 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 <common/bl_common.h>
10#include <cortex_a77.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-A77 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 "Cortex-A77 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 CORTEX_A77_BHB_LOOP_COUNT, cortex_a77
27#endif /* WORKAROUND_CVE_2022_23960 */
28
29	/* --------------------------------------------------
30	 * Errata Workaround for Cortex A77 Errata #1508412.
31	 * This applies only to revision <= r1p0 of Cortex A77.
32	 * Inputs:
33	 * x0: variant[4:7] and revision[0:3] of current cpu.
34	 * Shall clobber: x0-x17
35	 * --------------------------------------------------
36	 */
37func errata_a77_1508412_wa
38	/*
39	 * Compare x0 against revision r1p0
40	 */
41	mov	x17, x30
42	bl	check_errata_1508412
43	cbz	x0, 3f
44	/*
45	 * Compare x0 against revision r0p0
46	 */
47	bl	check_errata_1508412_0
48	cbz	x0, 1f
49	ldr	x0, =0x0
50	msr	CORTEX_A77_CPUPSELR_EL3, x0
51	ldr 	x0, =0x00E8400000
52	msr	CORTEX_A77_CPUPOR_EL3, x0
53	ldr	x0, =0x00FFE00000
54	msr	CORTEX_A77_CPUPMR_EL3, x0
55	ldr	x0, =0x4004003FF
56	msr	CORTEX_A77_CPUPCR_EL3, x0
57	ldr	x0, =0x1
58	msr	CORTEX_A77_CPUPSELR_EL3, x0
59	ldr	x0, =0x00E8C00040
60	msr	CORTEX_A77_CPUPOR_EL3, x0
61	ldr	x0, =0x00FFE00040
62	msr	CORTEX_A77_CPUPMR_EL3, x0
63	b	2f
641:
65	ldr	x0, =0x0
66	msr	CORTEX_A77_CPUPSELR_EL3, x0
67	ldr	x0, =0x00E8400000
68	msr	CORTEX_A77_CPUPOR_EL3, x0
69	ldr	x0, =0x00FF600000
70	msr	CORTEX_A77_CPUPMR_EL3, x0
71	ldr	x0, =0x00E8E00080
72	msr	CORTEX_A77_CPUPOR2_EL3, x0
73	ldr	x0, =0x00FFE000C0
74	msr	CORTEX_A77_CPUPMR2_EL3, x0
752:
76	ldr	x0, =0x04004003FF
77	msr	CORTEX_A77_CPUPCR_EL3, x0
78	isb
793:
80	ret	x17
81endfunc errata_a77_1508412_wa
82
83func check_errata_1508412
84	mov	x1, #0x10
85	b	cpu_rev_var_ls
86endfunc check_errata_1508412
87
88func check_errata_1508412_0
89	mov	x1, #0x0
90	b	cpu_rev_var_ls
91endfunc check_errata_1508412_0
92
93	/* --------------------------------------------------
94	 * Errata Workaround for Cortex A77 Errata #1925769.
95	 * This applies to revision <= r1p1 of Cortex A77.
96	 * Inputs:
97	 * x0: variant[4:7] and revision[0:3] of current cpu.
98	 * Shall clobber: x0-x17
99	 * --------------------------------------------------
100	 */
101func errata_a77_1925769_wa
102	/* Compare x0 against revision <= r1p1 */
103	mov	x17, x30
104	bl	check_errata_1925769
105	cbz	x0, 1f
106
107	/* Set bit 8 in ECTLR_EL1 */
108	mrs	x1, CORTEX_A77_CPUECTLR_EL1
109	orr	x1, x1, #CORTEX_A77_CPUECTLR_EL1_BIT_8
110	msr	CORTEX_A77_CPUECTLR_EL1, x1
111	isb
1121:
113	ret	x17
114endfunc errata_a77_1925769_wa
115
116func check_errata_1925769
117	/* Applies to everything <= r1p1 */
118	mov	x1, #0x11
119	b	cpu_rev_var_ls
120endfunc check_errata_1925769
121
122	/* --------------------------------------------------
123	 * Errata Workaround for Cortex A77 Errata #1946167.
124	 * This applies to revision <= r1p1 of Cortex A77.
125	 * Inputs:
126	 * x0: variant[4:7] and revision[0:3] of current cpu.
127	 * Shall clobber: x0-x17
128	 * --------------------------------------------------
129	 */
130func errata_a77_1946167_wa
131	/* Compare x0 against revision <= r1p1 */
132	mov	x17, x30
133	bl	check_errata_1946167
134	cbz	x0, 1f
135
136	ldr	x0,=0x4
137	msr	CORTEX_A77_CPUPSELR_EL3,x0
138	ldr	x0,=0x10E3900002
139	msr	CORTEX_A77_CPUPOR_EL3,x0
140	ldr	x0,=0x10FFF00083
141	msr	CORTEX_A77_CPUPMR_EL3,x0
142	ldr	x0,=0x2001003FF
143	msr	CORTEX_A77_CPUPCR_EL3,x0
144
145	ldr	x0,=0x5
146	msr	CORTEX_A77_CPUPSELR_EL3,x0
147	ldr	x0,=0x10E3800082
148	msr	CORTEX_A77_CPUPOR_EL3,x0
149	ldr	x0,=0x10FFF00083
150	msr	CORTEX_A77_CPUPMR_EL3,x0
151	ldr	x0,=0x2001003FF
152	msr	CORTEX_A77_CPUPCR_EL3,x0
153
154	ldr	x0,=0x6
155	msr	CORTEX_A77_CPUPSELR_EL3,x0
156	ldr	x0,=0x10E3800200
157	msr	CORTEX_A77_CPUPOR_EL3,x0
158	ldr	x0,=0x10FFF003E0
159	msr	CORTEX_A77_CPUPMR_EL3,x0
160	ldr	x0,=0x2001003FF
161	msr	CORTEX_A77_CPUPCR_EL3,x0
162
163	isb
1641:
165	ret	x17
166endfunc errata_a77_1946167_wa
167
168func check_errata_1946167
169	/* Applies to everything <= r1p1 */
170	mov	x1, #0x11
171	b	cpu_rev_var_ls
172endfunc check_errata_1946167
173
174	/* --------------------------------------------------
175	 * Errata Workaround for Cortex A77 Errata #1791578.
176	 * This applies to revisions r0p0, r1p0, and r1p1 and is still open.
177	 * x0: variant[4:7] and revision[0:3] of current cpu.
178	 * Shall clobber: x0-x17
179	 * --------------------------------------------------
180	 */
181func errata_a77_1791578_wa
182	/* Check workaround compatibility. */
183	mov	x17, x30
184	bl	check_errata_1791578
185	cbz	x0, 1f
186
187	/* Set bit 2 in ACTLR2_EL1 */
188	mrs     x1, CORTEX_A77_ACTLR2_EL1
189	orr	x1, x1, #CORTEX_A77_ACTLR2_EL1_BIT_2
190	msr     CORTEX_A77_ACTLR2_EL1, x1
191	isb
1921:
193	ret	x17
194endfunc errata_a77_1791578_wa
195
196func check_errata_1791578
197	/* Applies to r0p0, r1p0, and r1p1 right now */
198	mov	x1, #0x11
199	b	cpu_rev_var_ls
200endfunc check_errata_1791578
201
202	/* --------------------------------------------------
203	 * Errata Workaround for Cortex A77 Errata #2356587.
204	 * This applies to revisions r0p0, r1p0, and r1p1 and is still open.
205	 * x0: variant[4:7] and revision[0:3] of current cpu.
206	 * Shall clobber: x0-x17
207	 * --------------------------------------------------
208	 */
209func errata_a77_2356587_wa
210	/* Check workaround compatibility. */
211	mov	x17, x30
212	bl	check_errata_2356587
213	cbz	x0, 1f
214
215	/* Set bit 0 in ACTLR2_EL1 */
216	mrs	x1, CORTEX_A77_ACTLR2_EL1
217	orr	x1, x1, #CORTEX_A77_ACTLR2_EL1_BIT_0
218	msr	CORTEX_A77_ACTLR2_EL1, x1
219	isb
2201:
221	ret	x17
222endfunc errata_a77_2356587_wa
223
224func check_errata_2356587
225	/* Applies to r0p0, r1p0, and r1p1 right now */
226	mov	x1, #0x11
227	b	cpu_rev_var_ls
228endfunc check_errata_2356587
229
230func check_errata_cve_2022_23960
231#if WORKAROUND_CVE_2022_23960
232	mov	x0, #ERRATA_APPLIES
233#else
234	mov	x0, #ERRATA_MISSING
235#endif
236	ret
237endfunc check_errata_cve_2022_23960
238
239	/* --------------------------------------------------
240	 * Errata Workaround for Cortex A77 Errata #1800714.
241	 * This applies to revision <= r1p1 of Cortex A77.
242	 * Inputs:
243	 * x0: variant[4:7] and revision[0:3] of current cpu.
244	 * Shall clobber: x0-x17
245	 * --------------------------------------------------
246	 */
247func errata_a77_1800714_wa
248	/* Compare x0 against revision <= r1p1 */
249	mov	x17, x30
250	bl	check_errata_1800714
251	cbz	x0, 1f
252
253	/* Disable allocation of splintered pages in the L2 TLB */
254	mrs	x1, CORTEX_A77_CPUECTLR_EL1
255	orr	x1, x1, CORTEX_A77_CPUECTLR_EL1_BIT_53
256	msr	CORTEX_A77_CPUECTLR_EL1, x1
257	isb
2581:
259	ret	x17
260endfunc errata_a77_1800714_wa
261
262func check_errata_1800714
263	/* Applies to everything <= r1p1 */
264	mov	x1, #0x11
265	b	cpu_rev_var_ls
266endfunc check_errata_1800714
267
268	/* -------------------------------------------------
269	 * The CPU Ops reset function for Cortex-A77.
270	 * Shall clobber: x0-x19
271	 * -------------------------------------------------
272	 */
273func cortex_a77_reset_func
274	mov	x19, x30
275	bl	cpu_get_rev_var
276	mov	x18, x0
277
278#if ERRATA_A77_1508412
279	mov	x0, x18
280	bl	errata_a77_1508412_wa
281#endif
282
283#if ERRATA_A77_1925769
284	mov	x0, x18
285	bl	errata_a77_1925769_wa
286#endif
287
288#if ERRATA_A77_1946167
289	mov	x0, x18
290	bl	errata_a77_1946167_wa
291#endif
292
293#if ERRATA_A77_1791578
294	mov	x0, x18
295	bl	errata_a77_1791578_wa
296#endif
297
298#if ERRATA_A77_2356587
299	mov	x0, x18
300	bl	errata_a77_2356587_wa
301#endif
302
303#if IMAGE_BL31 && WORKAROUND_CVE_2022_23960
304	/*
305	 * The Cortex-A77 generic vectors are overridden to apply errata
306         * mitigation on exception entry from lower ELs.
307	 */
308	adr	x0, wa_cve_vbar_cortex_a77
309	msr	vbar_el3, x0
310#endif /* IMAGE_BL31 && WORKAROUND_CVE_2022_23960 */
311
312#if ERRATA_A77_1800714
313	mov	x0, x18
314	bl	errata_a77_1800714_wa
315#endif
316
317	isb
318	ret	x19
319endfunc cortex_a77_reset_func
320
321	/* ---------------------------------------------
322	 * HW will do the cache maintenance while powering down
323	 * ---------------------------------------------
324	 */
325func cortex_a77_core_pwr_dwn
326	/* ---------------------------------------------
327	 * Enable CPU power down bit in power control register
328	 * ---------------------------------------------
329	 */
330	mrs	x0, CORTEX_A77_CPUPWRCTLR_EL1
331	orr	x0, x0, #CORTEX_A77_CPUPWRCTLR_EL1_CORE_PWRDN_BIT
332	msr	CORTEX_A77_CPUPWRCTLR_EL1, x0
333	isb
334	ret
335endfunc cortex_a77_core_pwr_dwn
336
337#if REPORT_ERRATA
338/*
339 * Errata printing function for Cortex-A77. Must follow AAPCS.
340 */
341func cortex_a77_errata_report
342	stp	x8, x30, [sp, #-16]!
343
344	bl	cpu_get_rev_var
345	mov	x8, x0
346
347	/*
348	 * Report all errata. The revision-variant information is passed to
349	 * checking functions of each errata.
350	 */
351	report_errata ERRATA_A77_1508412, cortex_a77, 1508412
352	report_errata ERRATA_A77_1791578, cortex_a77, 1791578
353	report_errata ERRATA_A77_1800714, cortex_a77, 1800714
354	report_errata ERRATA_A77_1925769, cortex_a77, 1925769
355	report_errata ERRATA_A77_1946167, cortex_a77, 1946167
356	report_errata ERRATA_A77_2356587, cortex_a77, 2356587
357	report_errata WORKAROUND_CVE_2022_23960, cortex_a77, cve_2022_23960
358
359	ldp	x8, x30, [sp], #16
360	ret
361endfunc cortex_a77_errata_report
362#endif
363
364
365	/* ---------------------------------------------
366	 * This function provides Cortex-A77 specific
367	 * register information for crash reporting.
368	 * It needs to return with x6 pointing to
369	 * a list of register names in ascii and
370	 * x8 - x15 having values of registers to be
371	 * reported.
372	 * ---------------------------------------------
373	 */
374.section .rodata.cortex_a77_regs, "aS"
375cortex_a77_regs:  /* The ascii list of register names to be reported */
376	.asciz	"cpuectlr_el1", ""
377
378func cortex_a77_cpu_reg_dump
379	adr	x6, cortex_a77_regs
380	mrs	x8, CORTEX_A77_CPUECTLR_EL1
381	ret
382endfunc cortex_a77_cpu_reg_dump
383
384declare_cpu_ops cortex_a77, CORTEX_A77_MIDR, \
385	cortex_a77_reset_func, \
386	cortex_a77_core_pwr_dwn
387