xref: /rk3399_ARM-atf/lib/cpus/aarch32/cortex_a57.S (revision 6eabbb07d7ee2aac3a8e8e734649c8eaa8385af6)
1/*
2 * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6#include <arch.h>
7#include <asm_macros.S>
8#include <assert_macros.S>
9#include <cortex_a57.h>
10#include <cpu_macros.S>
11#include <debug.h>
12
13	/* ---------------------------------------------
14	 * Disable intra-cluster coherency
15	 * Clobbers: r0-r1
16	 * ---------------------------------------------
17	 */
18func cortex_a57_disable_smp
19	ldcopr16	r0, r1, CORTEX_A57_ECTLR
20	bic64_imm	r0, r1, CORTEX_A57_ECTLR_SMP_BIT
21	stcopr16	r0, r1, CORTEX_A57_ECTLR
22	bx	lr
23endfunc cortex_a57_disable_smp
24
25	/* ---------------------------------------------
26	 * Disable all types of L2 prefetches.
27	 * Clobbers: r0-r2
28	 * ---------------------------------------------
29	 */
30func cortex_a57_disable_l2_prefetch
31	ldcopr16	r0, r1, CORTEX_A57_ECTLR
32	orr64_imm	r0, r1, CORTEX_A57_ECTLR_DIS_TWD_ACC_PFTCH_BIT
33	bic64_imm	r0, r1, (CORTEX_A57_ECTLR_L2_IPFTCH_DIST_MASK | \
34				 CORTEX_A57_ECTLR_L2_DPFTCH_DIST_MASK)
35	stcopr16	r0, r1, CORTEX_A57_ECTLR
36	isb
37	dsb	ish
38	bx	lr
39endfunc cortex_a57_disable_l2_prefetch
40
41	/* ---------------------------------------------
42	 * Disable debug interfaces
43	 * ---------------------------------------------
44	 */
45func cortex_a57_disable_ext_debug
46	mov	r0, #1
47	stcopr	r0, DBGOSDLR
48	isb
49	dsb	sy
50	bx	lr
51endfunc cortex_a57_disable_ext_debug
52
53	/* --------------------------------------------------
54	 * Errata Workaround for Cortex A57 Errata #806969.
55	 * This applies only to revision r0p0 of Cortex A57.
56	 * Inputs:
57	 * r0: variant[4:7] and revision[0:3] of current cpu.
58	 * Shall clobber: r0-r3
59	 * --------------------------------------------------
60	 */
61func errata_a57_806969_wa
62	/*
63	 * Compare r0 against revision r0p0
64	 */
65	mov		r2, lr
66	bl		check_errata_806969
67	mov		lr, r2
68	cmp		r0, #ERRATA_NOT_APPLIES
69	beq		1f
70	ldcopr16	r0, r1, CORTEX_A57_CPUACTLR
71	orr64_imm	r0, r1, CORTEX_A57_CPUACTLR_NO_ALLOC_WBWA
72	stcopr16	r0, r1, CORTEX_A57_CPUACTLR
731:
74	bx	lr
75endfunc errata_a57_806969_wa
76
77func check_errata_806969
78	mov	r1, #0x00
79	b	cpu_rev_var_ls
80endfunc check_errata_806969
81
82	/* ---------------------------------------------------
83	 * Errata Workaround for Cortex A57 Errata #813419.
84	 * This applies only to revision r0p0 of Cortex A57.
85	 * ---------------------------------------------------
86	 */
87func check_errata_813419
88	/*
89	 * Even though this is only needed for revision r0p0, it
90	 * is always applied due to limitations of the current
91	 * errata framework.
92	 */
93	mov	r0, #ERRATA_APPLIES
94	bx	lr
95endfunc check_errata_813419
96
97	/* ---------------------------------------------------
98	 * Errata Workaround for Cortex A57 Errata #813420.
99	 * This applies only to revision r0p0 of Cortex A57.
100	 * Inputs:
101	 * r0: variant[4:7] and revision[0:3] of current cpu.
102	 * Shall clobber: r0-r3
103	 * ---------------------------------------------------
104	 */
105func errata_a57_813420_wa
106	/*
107	 * Compare r0 against revision r0p0
108	 */
109	mov		r2, lr
110	bl		check_errata_813420
111	mov		lr, r2
112	cmp		r0, #ERRATA_NOT_APPLIES
113	beq		1f
114	ldcopr16	r0, r1, CORTEX_A57_CPUACTLR
115	orr64_imm	r0, r1, CORTEX_A57_CPUACTLR_DCC_AS_DCCI
116	stcopr16	r0, r1, CORTEX_A57_CPUACTLR
1171:
118	bx		lr
119endfunc errata_a57_813420_wa
120
121func check_errata_813420
122	mov	r1, #0x00
123	b	cpu_rev_var_ls
124endfunc check_errata_813420
125
126	/* --------------------------------------------------------------------
127	 * Disable the over-read from the LDNP instruction.
128	 *
129	 * This applies to all revisions <= r1p2. The performance degradation
130	 * observed with LDNP/STNP has been fixed on r1p3 and onwards.
131	 *
132	 * Inputs:
133	 * r0: variant[4:7] and revision[0:3] of current cpu.
134	 * Shall clobber: r0-r3
135	 * ---------------------------------------------------------------------
136	 */
137func a57_disable_ldnp_overread
138	/*
139	 * Compare r0 against revision r1p2
140	 */
141	mov		r2, lr
142	bl		check_errata_disable_ldnp_overread
143	mov		lr, r2
144	cmp		r0, #ERRATA_NOT_APPLIES
145	beq		1f
146	ldcopr16	r0, r1, CORTEX_A57_CPUACTLR
147	orr64_imm	r0, r1, CORTEX_A57_CPUACTLR_DIS_OVERREAD
148	stcopr16	r0, r1, CORTEX_A57_CPUACTLR
1491:
150	bx		lr
151endfunc a57_disable_ldnp_overread
152
153func check_errata_disable_ldnp_overread
154	mov	r1, #0x12
155	b	cpu_rev_var_ls
156endfunc check_errata_disable_ldnp_overread
157
158	/* ---------------------------------------------------
159	 * Errata Workaround for Cortex A57 Errata #826974.
160	 * This applies only to revision <= r1p1 of Cortex A57.
161	 * Inputs:
162	 * r0: variant[4:7] and revision[0:3] of current cpu.
163	 * Shall clobber: r0-r3
164	 * ---------------------------------------------------
165	 */
166func errata_a57_826974_wa
167	/*
168	 * Compare r0 against revision r1p1
169	 */
170	mov		r2, lr
171	bl		check_errata_826974
172	mov		lr, r2
173	cmp		r0, #ERRATA_NOT_APPLIES
174	beq		1f
175	ldcopr16	r0, r1, CORTEX_A57_CPUACTLR
176	orr64_imm	r0, r1, CORTEX_A57_CPUACTLR_DIS_LOAD_PASS_DMB
177	stcopr16	r0, r1, CORTEX_A57_CPUACTLR
1781:
179	bx		lr
180endfunc errata_a57_826974_wa
181
182func check_errata_826974
183	mov	r1, #0x11
184	b	cpu_rev_var_ls
185endfunc check_errata_826974
186
187	/* ---------------------------------------------------
188	 * Errata Workaround for Cortex A57 Errata #826977.
189	 * This applies only to revision <= r1p1 of Cortex A57.
190	 * Inputs:
191	 * r0: variant[4:7] and revision[0:3] of current cpu.
192	 * Shall clobber: r0-r3
193	 * ---------------------------------------------------
194	 */
195func errata_a57_826977_wa
196	/*
197	 * Compare r0 against revision r1p1
198	 */
199	mov		r2, lr
200	bl		check_errata_826977
201	mov		lr, r2
202	cmp		r0, #ERRATA_NOT_APPLIES
203	beq		1f
204	ldcopr16	r0, r1, CORTEX_A57_CPUACTLR
205	orr64_imm	r0, r1, CORTEX_A57_CPUACTLR_GRE_NGRE_AS_NGNRE
206	stcopr16	r0, r1, CORTEX_A57_CPUACTLR
2071:
208	bx		lr
209endfunc errata_a57_826977_wa
210
211func check_errata_826977
212	mov	r1, #0x11
213	b	cpu_rev_var_ls
214endfunc check_errata_826977
215
216	/* ---------------------------------------------------
217	 * Errata Workaround for Cortex A57 Errata #828024.
218	 * This applies only to revision <= r1p1 of Cortex A57.
219	 * Inputs:
220	 * r0: variant[4:7] and revision[0:3] of current cpu.
221	 * Shall clobber: r0-r3
222	 * ---------------------------------------------------
223	 */
224func errata_a57_828024_wa
225	/*
226	 * Compare r0 against revision r1p1
227	 */
228	mov		r2, lr
229	bl		check_errata_828024
230	mov		lr, r2
231	cmp		r0, #ERRATA_NOT_APPLIES
232	beq		1f
233	ldcopr16	r0, r1, CORTEX_A57_CPUACTLR
234	/*
235	 * Setting the relevant bits in CORTEX_A57_CPUACTLR has to be done in 2
236	 * instructions here because the resulting bitmask doesn't fit in a
237	 * 16-bit value so it cannot be encoded in a single instruction.
238	 */
239	orr64_imm	r0, r1, CORTEX_A57_CPUACTLR_NO_ALLOC_WBWA
240	orr64_imm	r0, r1, (CORTEX_A57_CPUACTLR_DIS_L1_STREAMING | CORTEX_A57_CPUACTLR_DIS_STREAMING)
241	stcopr16	r0, r1, CORTEX_A57_CPUACTLR
2421:
243	bx		lr
244endfunc errata_a57_828024_wa
245
246func check_errata_828024
247	mov	r1, #0x11
248	b	cpu_rev_var_ls
249endfunc check_errata_828024
250
251	/* ---------------------------------------------------
252	 * Errata Workaround for Cortex A57 Errata #829520.
253	 * This applies only to revision <= r1p2 of Cortex A57.
254	 * Inputs:
255	 * r0: variant[4:7] and revision[0:3] of current cpu.
256	 * Shall clobber: r0-r3
257	 * ---------------------------------------------------
258	 */
259func errata_a57_829520_wa
260	/*
261	 * Compare r0 against revision r1p2
262	 */
263	mov		r2, lr
264	bl		check_errata_829520
265	mov		lr, r2
266	cmp		r0, #ERRATA_NOT_APPLIES
267	beq		1f
268	ldcopr16	r0, r1, CORTEX_A57_CPUACTLR
269	orr64_imm	r0, r1, CORTEX_A57_CPUACTLR_DIS_INDIRECT_PREDICTOR
270	stcopr16	r0, r1, CORTEX_A57_CPUACTLR
2711:
272	bx		lr
273endfunc errata_a57_829520_wa
274
275func check_errata_829520
276	mov	r1, #0x12
277	b	cpu_rev_var_ls
278endfunc check_errata_829520
279
280	/* ---------------------------------------------------
281	 * Errata Workaround for Cortex A57 Errata #833471.
282	 * This applies only to revision <= r1p2 of Cortex A57.
283	 * Inputs:
284	 * r0: variant[4:7] and revision[0:3] of current cpu.
285	 * Shall clobber: r0-r3
286	 * ---------------------------------------------------
287	 */
288func errata_a57_833471_wa
289	/*
290	 * Compare r0 against revision r1p2
291	 */
292	mov		r2, lr
293	bl		check_errata_833471
294	mov		lr, r2
295	cmp		r0, #ERRATA_NOT_APPLIES
296	beq		1f
297	ldcopr16	r0, r1, CORTEX_A57_CPUACTLR
298	orr64_imm	r1, r1, CORTEX_A57_CPUACTLR_FORCE_FPSCR_FLUSH
299	stcopr16	r0, r1, CORTEX_A57_CPUACTLR
3001:
301	bx		lr
302endfunc errata_a57_833471_wa
303
304func check_errata_833471
305	mov	r1, #0x12
306	b	cpu_rev_var_ls
307endfunc check_errata_833471
308
309	/* ---------------------------------------------------
310	 * Errata Workaround for Cortex A57 Errata #859972.
311	 * This applies only to revision <= r1p3 of Cortex A57.
312	 * Inputs:
313	 * r0: variant[4:7] and revision[0:3] of current cpu.
314	 * Shall clobber: r0-r3
315	 * ---------------------------------------------------
316	 */
317func errata_a57_859972_wa
318	mov		r2, lr
319	bl		check_errata_859972
320	mov		lr, r2
321	cmp		r0, #ERRATA_NOT_APPLIES
322	beq		1f
323	ldcopr16	r0, r1, CORTEX_A57_CPUACTLR
324	orr64_imm	r1, r1, CORTEX_A57_CPUACTLR_DIS_INSTR_PREFETCH
325	stcopr16	r0, r1, CORTEX_A57_CPUACTLR
3261:
327	bx		lr
328endfunc errata_a57_859972_wa
329
330func check_errata_859972
331	mov	r1, #0x13
332	b	cpu_rev_var_ls
333endfunc check_errata_859972
334
335func check_errata_cve_2017_5715
336	mov	r0, #ERRATA_MISSING
337	bx	lr
338endfunc check_errata_cve_2017_5715
339
340	/* -------------------------------------------------
341	 * The CPU Ops reset function for Cortex-A57.
342	 * Shall clobber: r0-r6
343	 * -------------------------------------------------
344	 */
345func cortex_a57_reset_func
346	mov	r5, lr
347	bl	cpu_get_rev_var
348	mov	r4, r0
349
350#if ERRATA_A57_806969
351	mov	r0, r4
352	bl	errata_a57_806969_wa
353#endif
354
355#if ERRATA_A57_813420
356	mov	r0, r4
357	bl	errata_a57_813420_wa
358#endif
359
360#if A57_DISABLE_NON_TEMPORAL_HINT
361	mov	r0, r4
362	bl	a57_disable_ldnp_overread
363#endif
364
365#if ERRATA_A57_826974
366	mov	r0, r4
367	bl	errata_a57_826974_wa
368#endif
369
370#if ERRATA_A57_826977
371	mov	r0, r4
372	bl	errata_a57_826977_wa
373#endif
374
375#if ERRATA_A57_828024
376	mov	r0, r4
377	bl	errata_a57_828024_wa
378#endif
379
380#if ERRATA_A57_829520
381	mov	r0, r4
382	bl	errata_a57_829520_wa
383#endif
384
385#if ERRATA_A57_833471
386	mov	r0, r4
387	bl	errata_a57_833471_wa
388#endif
389
390#if ERRATA_A57_859972
391	mov	r0, r4
392	bl	errata_a57_859972_wa
393#endif
394
395	/* ---------------------------------------------
396	 * Enable the SMP bit.
397	 * ---------------------------------------------
398	 */
399	ldcopr16	r0, r1, CORTEX_A57_ECTLR
400	orr64_imm	r0, r1, CORTEX_A57_ECTLR_SMP_BIT
401	stcopr16	r0, r1,	CORTEX_A57_ECTLR
402	isb
403	bx	r5
404endfunc cortex_a57_reset_func
405
406	/* ----------------------------------------------------
407	 * The CPU Ops core power down function for Cortex-A57.
408	 * ----------------------------------------------------
409	 */
410func cortex_a57_core_pwr_dwn
411	push	{r12, lr}
412
413	/* Assert if cache is enabled */
414#if ENABLE_ASSERTIONS
415	ldcopr	r0, SCTLR
416	tst	r0, #SCTLR_C_BIT
417	ASM_ASSERT(eq)
418#endif
419
420	/* ---------------------------------------------
421	 * Disable the L2 prefetches.
422	 * ---------------------------------------------
423	 */
424	bl	cortex_a57_disable_l2_prefetch
425
426	/* ---------------------------------------------
427	 * Flush L1 caches.
428	 * ---------------------------------------------
429	 */
430	mov	r0, #DC_OP_CISW
431	bl	dcsw_op_level1
432
433	/* ---------------------------------------------
434	 * Come out of intra cluster coherency
435	 * ---------------------------------------------
436	 */
437	bl	cortex_a57_disable_smp
438
439	/* ---------------------------------------------
440	 * Force the debug interfaces to be quiescent
441	 * ---------------------------------------------
442	 */
443	pop	{r12, lr}
444	b	cortex_a57_disable_ext_debug
445endfunc cortex_a57_core_pwr_dwn
446
447	/* -------------------------------------------------------
448	 * The CPU Ops cluster power down function for Cortex-A57.
449	 * Clobbers: r0-r3
450	 * -------------------------------------------------------
451	 */
452func cortex_a57_cluster_pwr_dwn
453	push	{r12, lr}
454
455	/* Assert if cache is enabled */
456#if ENABLE_ASSERTIONS
457	ldcopr	r0, SCTLR
458	tst	r0, #SCTLR_C_BIT
459	ASM_ASSERT(eq)
460#endif
461
462	/* ---------------------------------------------
463	 * Disable the L2 prefetches.
464	 * ---------------------------------------------
465	 */
466	bl	cortex_a57_disable_l2_prefetch
467
468	/* ---------------------------------------------
469	 * Flush L1 caches.
470	 * ---------------------------------------------
471	 */
472	mov	r0, #DC_OP_CISW
473	bl	dcsw_op_level1
474
475	/* ---------------------------------------------
476	 * Disable the optional ACP.
477	 * ---------------------------------------------
478	 */
479	bl	plat_disable_acp
480
481	/* ---------------------------------------------
482	 * Flush L2 caches.
483	 * ---------------------------------------------
484	 */
485	mov	r0, #DC_OP_CISW
486	bl	dcsw_op_level2
487
488	/* ---------------------------------------------
489	 * Come out of intra cluster coherency
490	 * ---------------------------------------------
491	 */
492	bl	cortex_a57_disable_smp
493
494	/* ---------------------------------------------
495	 * Force the debug interfaces to be quiescent
496	 * ---------------------------------------------
497	 */
498	pop	{r12, lr}
499	b	cortex_a57_disable_ext_debug
500endfunc cortex_a57_cluster_pwr_dwn
501
502#if REPORT_ERRATA
503/*
504 * Errata printing function for Cortex A57. Must follow AAPCS.
505 */
506func cortex_a57_errata_report
507	push	{r12, lr}
508
509	bl	cpu_get_rev_var
510	mov	r4, r0
511
512	/*
513	 * Report all errata. The revision-variant information is passed to
514	 * checking functions of each errata.
515	 */
516	report_errata ERRATA_A57_806969, cortex_a57, 806969
517	report_errata ERRATA_A57_813419, cortex_a57, 813419
518	report_errata ERRATA_A57_813420, cortex_a57, 813420
519	report_errata A57_DISABLE_NON_TEMPORAL_HINT, cortex_a57, \
520		disable_ldnp_overread
521	report_errata ERRATA_A57_826974, cortex_a57, 826974
522	report_errata ERRATA_A57_826977, cortex_a57, 826977
523	report_errata ERRATA_A57_828024, cortex_a57, 828024
524	report_errata ERRATA_A57_829520, cortex_a57, 829520
525	report_errata ERRATA_A57_833471, cortex_a57, 833471
526	report_errata ERRATA_A57_859972, cortex_a57, 859972
527	report_errata WORKAROUND_CVE_2017_5715, cortex_a57, cve_2017_5715
528
529	pop	{r12, lr}
530	bx	lr
531endfunc cortex_a57_errata_report
532#endif
533
534declare_cpu_ops cortex_a57, CORTEX_A57_MIDR, \
535	cortex_a57_reset_func, \
536	cortex_a57_core_pwr_dwn, \
537	cortex_a57_cluster_pwr_dwn
538