xref: /rk3399_ARM-atf/lib/cpus/aarch32/cortex_a53.S (revision cc4f3838633e8faab00323228140c025d173ae00)
1dc787588SYatharth Kochar/*
2*3fb52e41SRyan Everett * Copyright (c) 2017-2024, Arm Limited and Contributors. All rights reserved.
3dc787588SYatharth Kochar *
482cb2c1aSdp-arm * SPDX-License-Identifier: BSD-3-Clause
5dc787588SYatharth Kochar */
609d40e0eSAntonio Nino Diaz
7dc787588SYatharth Kochar#include <arch.h>
8dc787588SYatharth Kochar#include <asm_macros.S>
9dc787588SYatharth Kochar#include <assert_macros.S>
1009d40e0eSAntonio Nino Diaz#include <common/debug.h>
11dc787588SYatharth Kochar#include <cortex_a53.h>
12dc787588SYatharth Kochar#include <cpu_macros.S>
13dc787588SYatharth Kochar
143749d853SDimitris Papastamos#if A53_DISABLE_NON_TEMPORAL_HINT
153749d853SDimitris Papastamos#undef ERRATA_A53_836870
163749d853SDimitris Papastamos#define ERRATA_A53_836870	1
173749d853SDimitris Papastamos#endif
183749d853SDimitris Papastamos
19dc787588SYatharth Kochar	/* ---------------------------------------------
20dc787588SYatharth Kochar	 * Disable intra-cluster coherency
21dc787588SYatharth Kochar	 * ---------------------------------------------
22dc787588SYatharth Kochar	 */
23dc787588SYatharth Kocharfunc cortex_a53_disable_smp
24fb7d32e5SVarun Wadekar	ldcopr16	r0, r1, CORTEX_A53_ECTLR
25fb7d32e5SVarun Wadekar	bic64_imm	r0, r1, CORTEX_A53_ECTLR_SMP_BIT
26fb7d32e5SVarun Wadekar	stcopr16	r0, r1, CORTEX_A53_ECTLR
27dc787588SYatharth Kochar	isb
28dc787588SYatharth Kochar	dsb	sy
29dc787588SYatharth Kochar	bx	lr
30dc787588SYatharth Kocharendfunc cortex_a53_disable_smp
31dc787588SYatharth Kochar
32bd393704SAmbroise Vincent	/* ---------------------------------------------------
33bd393704SAmbroise Vincent	 * Errata Workaround for Cortex A53 Errata #819472.
34bd393704SAmbroise Vincent	 * This applies only to revision <= r0p1 of Cortex A53.
35bd393704SAmbroise Vincent	 * ---------------------------------------------------
36bd393704SAmbroise Vincent	 */
37bd393704SAmbroise Vincentfunc check_errata_819472
38bd393704SAmbroise Vincent	/*
39bd393704SAmbroise Vincent	 * Even though this is only needed for revision <= r0p1, it
40bd393704SAmbroise Vincent	 * is always applied due to limitations of the current
41bd393704SAmbroise Vincent	 * errata framework.
42bd393704SAmbroise Vincent	 */
43bd393704SAmbroise Vincent	mov	r0, #ERRATA_APPLIES
44bd393704SAmbroise Vincent	bx	lr
45bd393704SAmbroise Vincentendfunc check_errata_819472
46bd393704SAmbroise Vincent
4797b12ae7SJayanth Dodderi Chidanandadd_erratum_entry cortex_a53, ERRATUM(819472), ERRATA_A53_819472
4897b12ae7SJayanth Dodderi Chidanand
49bd393704SAmbroise Vincent	/* ---------------------------------------------------
50bd393704SAmbroise Vincent	 * Errata Workaround for Cortex A53 Errata #824069.
51bd393704SAmbroise Vincent	 * This applies only to revision <= r0p2 of Cortex A53.
52bd393704SAmbroise Vincent	 * ---------------------------------------------------
53bd393704SAmbroise Vincent	 */
54bd393704SAmbroise Vincentfunc check_errata_824069
55bd393704SAmbroise Vincent	/*
56bd393704SAmbroise Vincent	 * Even though this is only needed for revision <= r0p2, it
57bd393704SAmbroise Vincent	 * is always applied due to limitations of the current
58bd393704SAmbroise Vincent	 * errata framework.
59bd393704SAmbroise Vincent	 */
60bd393704SAmbroise Vincent	mov	r0, #ERRATA_APPLIES
61bd393704SAmbroise Vincent	bx	lr
62bd393704SAmbroise Vincentendfunc check_errata_824069
63bd393704SAmbroise Vincent
6497b12ae7SJayanth Dodderi Chidanandadd_erratum_entry cortex_a53, ERRATUM(824069), ERRATA_A53_824069
6597b12ae7SJayanth Dodderi Chidanand
663749d853SDimitris Papastamos	/* --------------------------------------------------
673749d853SDimitris Papastamos	 * Errata Workaround for Cortex A53 Errata #826319.
683749d853SDimitris Papastamos	 * This applies only to revision <= r0p2 of Cortex A53.
693749d853SDimitris Papastamos	 * Inputs:
703749d853SDimitris Papastamos	 * r0: variant[4:7] and revision[0:3] of current cpu.
713749d853SDimitris Papastamos	 * Shall clobber: r0-r3
723749d853SDimitris Papastamos	 * --------------------------------------------------
733749d853SDimitris Papastamos	 */
743749d853SDimitris Papastamosfunc errata_a53_826319_wa
753749d853SDimitris Papastamos	/*
763749d853SDimitris Papastamos	 * Compare r0 against revision r0p2
773749d853SDimitris Papastamos	 */
783749d853SDimitris Papastamos	mov	r2, lr
793749d853SDimitris Papastamos	bl	check_errata_826319
803749d853SDimitris Papastamos	mov	lr, r2
813749d853SDimitris Papastamos	cmp	r0, #ERRATA_NOT_APPLIES
823749d853SDimitris Papastamos	beq	1f
833749d853SDimitris Papastamos	ldcopr	r0, CORTEX_A53_L2ACTLR
843749d853SDimitris Papastamos	bic	r0, #CORTEX_A53_L2ACTLR_ENABLE_UNIQUECLEAN
853749d853SDimitris Papastamos	orr	r0, #CORTEX_A53_L2ACTLR_DISABLE_CLEAN_PUSH
863749d853SDimitris Papastamos	stcopr	r0, CORTEX_A53_L2ACTLR
873749d853SDimitris Papastamos1:
883749d853SDimitris Papastamos	bx	lr
893749d853SDimitris Papastamosendfunc errata_a53_826319_wa
903749d853SDimitris Papastamos
913749d853SDimitris Papastamosfunc check_errata_826319
923749d853SDimitris Papastamos	mov	r1, #0x02
933749d853SDimitris Papastamos	b	cpu_rev_var_ls
943749d853SDimitris Papastamosendfunc check_errata_826319
953749d853SDimitris Papastamos
9697b12ae7SJayanth Dodderi Chidanandadd_erratum_entry cortex_a53, ERRATUM(826319), ERRATA_A53_826319
9797b12ae7SJayanth Dodderi Chidanand
98bd393704SAmbroise Vincent	/* ---------------------------------------------------
99bd393704SAmbroise Vincent	 * Errata Workaround for Cortex A53 Errata #827319.
100bd393704SAmbroise Vincent	 * This applies only to revision <= r0p2 of Cortex A53.
101bd393704SAmbroise Vincent	 * ---------------------------------------------------
102bd393704SAmbroise Vincent	 */
103bd393704SAmbroise Vincentfunc check_errata_827319
104bd393704SAmbroise Vincent	/*
105bd393704SAmbroise Vincent	 * Even though this is only needed for revision <= r0p2, it
106bd393704SAmbroise Vincent	 * is always applied due to limitations of the current
107bd393704SAmbroise Vincent	 * errata framework.
108bd393704SAmbroise Vincent	 */
109bd393704SAmbroise Vincent	mov	r0, #ERRATA_APPLIES
110bd393704SAmbroise Vincent	bx	lr
111bd393704SAmbroise Vincentendfunc check_errata_827319
112bd393704SAmbroise Vincent
11397b12ae7SJayanth Dodderi Chidanandadd_erratum_entry cortex_a53, ERRATUM(827319), ERRATA_A53_827319
11497b12ae7SJayanth Dodderi Chidanand
1153749d853SDimitris Papastamos	/* ---------------------------------------------------------------------
1163749d853SDimitris Papastamos	 * Disable the cache non-temporal hint.
1173749d853SDimitris Papastamos	 *
1183749d853SDimitris Papastamos	 * This ignores the Transient allocation hint in the MAIR and treats
1193749d853SDimitris Papastamos	 * allocations the same as non-transient allocation types. As a result,
1203749d853SDimitris Papastamos	 * the LDNP and STNP instructions in AArch64 behave the same as the
1213749d853SDimitris Papastamos	 * equivalent LDP and STP instructions.
1223749d853SDimitris Papastamos	 *
1233749d853SDimitris Papastamos	 * This is relevant only for revisions <= r0p3 of Cortex-A53.
1243749d853SDimitris Papastamos	 * From r0p4 and onwards, the bit to disable the hint is enabled by
1253749d853SDimitris Papastamos	 * default at reset.
1263749d853SDimitris Papastamos	 *
1273749d853SDimitris Papastamos	 * Inputs:
1283749d853SDimitris Papastamos	 * r0: variant[4:7] and revision[0:3] of current cpu.
1293749d853SDimitris Papastamos	 * Shall clobber: r0-r3
1303749d853SDimitris Papastamos	 * ---------------------------------------------------------------------
1313749d853SDimitris Papastamos	 */
1323749d853SDimitris Papastamosfunc a53_disable_non_temporal_hint
1333749d853SDimitris Papastamos	/*
1343749d853SDimitris Papastamos	 * Compare r0 against revision r0p3
1353749d853SDimitris Papastamos	 */
1363749d853SDimitris Papastamos	mov		r2, lr
1373749d853SDimitris Papastamos	bl		check_errata_disable_non_temporal_hint
1383749d853SDimitris Papastamos	mov		lr, r2
1393749d853SDimitris Papastamos	cmp		r0, #ERRATA_NOT_APPLIES
1403749d853SDimitris Papastamos	beq		1f
14180bcf981SEleanor Bonnici	ldcopr16	r0, r1, CORTEX_A53_CPUACTLR
14280bcf981SEleanor Bonnici	orr64_imm	r0, r1, CORTEX_A53_CPUACTLR_DTAH
14380bcf981SEleanor Bonnici	stcopr16	r0, r1, CORTEX_A53_CPUACTLR
1443749d853SDimitris Papastamos1:
1453749d853SDimitris Papastamos	bx		lr
1463749d853SDimitris Papastamosendfunc a53_disable_non_temporal_hint
1473749d853SDimitris Papastamos
1483749d853SDimitris Papastamosfunc check_errata_disable_non_temporal_hint
1493749d853SDimitris Papastamos	mov	r1, #0x03
1503749d853SDimitris Papastamos	b	cpu_rev_var_ls
1513749d853SDimitris Papastamosendfunc check_errata_disable_non_temporal_hint
1523749d853SDimitris Papastamos
15397b12ae7SJayanth Dodderi Chidanandadd_erratum_entry cortex_a53, ERRATUM(836870), ERRATA_A53_836870 | A53_DISABLE_NON_TEMPORAL_HINT, \
15497b12ae7SJayanth Dodderi Chidanand	disable_non_temporal_hint
15597b12ae7SJayanth Dodderi Chidanand
1563749d853SDimitris Papastamos	/* --------------------------------------------------
1573749d853SDimitris Papastamos	 * Errata Workaround for Cortex A53 Errata #855873.
1583749d853SDimitris Papastamos	 *
1593749d853SDimitris Papastamos	 * This applies only to revisions >= r0p3 of Cortex A53.
1603749d853SDimitris Papastamos	 * Earlier revisions of the core are affected as well, but don't
1613749d853SDimitris Papastamos	 * have the chicken bit in the CPUACTLR register. It is expected that
1623749d853SDimitris Papastamos	 * the rich OS takes care of that, especially as the workaround is
1633749d853SDimitris Papastamos	 * shared with other erratas in those revisions of the CPU.
1643749d853SDimitris Papastamos	 * Inputs:
1653749d853SDimitris Papastamos	 * r0: variant[4:7] and revision[0:3] of current cpu.
1663749d853SDimitris Papastamos	 * Shall clobber: r0-r3
1673749d853SDimitris Papastamos	 * --------------------------------------------------
1683749d853SDimitris Papastamos	 */
1693749d853SDimitris Papastamosfunc errata_a53_855873_wa
1703749d853SDimitris Papastamos	/*
1713749d853SDimitris Papastamos	 * Compare r0 against revision r0p3 and higher
1723749d853SDimitris Papastamos	 */
1733749d853SDimitris Papastamos	mov		r2, lr
1743749d853SDimitris Papastamos	bl		check_errata_855873
1753749d853SDimitris Papastamos	mov		lr, r2
1763749d853SDimitris Papastamos	cmp		r0, #ERRATA_NOT_APPLIES
1773749d853SDimitris Papastamos	beq		1f
17880bcf981SEleanor Bonnici	ldcopr16	r0, r1, CORTEX_A53_CPUACTLR
17980bcf981SEleanor Bonnici	orr64_imm	r0, r1, CORTEX_A53_CPUACTLR_ENDCCASCI
18080bcf981SEleanor Bonnici	stcopr16	r0, r1, CORTEX_A53_CPUACTLR
1813749d853SDimitris Papastamos1:
1823749d853SDimitris Papastamos	bx		lr
1833749d853SDimitris Papastamosendfunc errata_a53_855873_wa
1843749d853SDimitris Papastamos
1853749d853SDimitris Papastamosfunc check_errata_855873
1863749d853SDimitris Papastamos	mov	r1, #0x03
1873749d853SDimitris Papastamos	b	cpu_rev_var_hs
1883749d853SDimitris Papastamosendfunc check_errata_855873
1893749d853SDimitris Papastamos
19097b12ae7SJayanth Dodderi Chidanandadd_erratum_entry cortex_a53, ERRATUM(855873), ERRATA_A53_855873
19197b12ae7SJayanth Dodderi Chidanand
192dc787588SYatharth Kochar	/* -------------------------------------------------
193dc787588SYatharth Kochar	 * The CPU Ops reset function for Cortex-A53.
1943749d853SDimitris Papastamos	 * Shall clobber: r0-r6
195dc787588SYatharth Kochar	 * -------------------------------------------------
196dc787588SYatharth Kochar	 */
197dc787588SYatharth Kocharfunc cortex_a53_reset_func
1983749d853SDimitris Papastamos	mov	r5, lr
1993749d853SDimitris Papastamos	bl	cpu_get_rev_var
2003749d853SDimitris Papastamos	mov	r4, r0
2013749d853SDimitris Papastamos
2023749d853SDimitris Papastamos#if ERRATA_A53_826319
2033749d853SDimitris Papastamos	mov	r0, r4
2043749d853SDimitris Papastamos	bl	errata_a53_826319_wa
2053749d853SDimitris Papastamos#endif
2063749d853SDimitris Papastamos
2073749d853SDimitris Papastamos#if ERRATA_A53_836870
2083749d853SDimitris Papastamos	mov	r0, r4
2093749d853SDimitris Papastamos	bl	a53_disable_non_temporal_hint
2103749d853SDimitris Papastamos#endif
2113749d853SDimitris Papastamos
2123749d853SDimitris Papastamos#if ERRATA_A53_855873
2133749d853SDimitris Papastamos	mov	r0, r4
2143749d853SDimitris Papastamos	bl	errata_a53_855873_wa
2153749d853SDimitris Papastamos#endif
2163749d853SDimitris Papastamos
217dc787588SYatharth Kochar	/* ---------------------------------------------
218dc787588SYatharth Kochar	 * Enable the SMP bit.
219dc787588SYatharth Kochar	 * ---------------------------------------------
220dc787588SYatharth Kochar	 */
221fb7d32e5SVarun Wadekar	ldcopr16	r0, r1, CORTEX_A53_ECTLR
222fb7d32e5SVarun Wadekar	orr64_imm	r0, r1, CORTEX_A53_ECTLR_SMP_BIT
223fb7d32e5SVarun Wadekar	stcopr16	r0, r1,	CORTEX_A53_ECTLR
224dc787588SYatharth Kochar	isb
2253749d853SDimitris Papastamos	bx	r5
226dc787588SYatharth Kocharendfunc cortex_a53_reset_func
227dc787588SYatharth Kochar
228dc787588SYatharth Kochar	/* ----------------------------------------------------
229dc787588SYatharth Kochar	 * The CPU Ops core power down function for Cortex-A53.
230dc787588SYatharth Kochar	 * ----------------------------------------------------
231dc787588SYatharth Kochar	 */
232dc787588SYatharth Kocharfunc cortex_a53_core_pwr_dwn
233dc787588SYatharth Kochar	push	{r12, lr}
234dc787588SYatharth Kochar
235dc787588SYatharth Kochar	/* Assert if cache is enabled */
2365f70d8deSMatt Ma#if ENABLE_ASSERTIONS
237dc787588SYatharth Kochar	ldcopr	r0, SCTLR
238dc787588SYatharth Kochar	tst	r0, #SCTLR_C_BIT
239dc787588SYatharth Kochar	ASM_ASSERT(eq)
240dc787588SYatharth Kochar#endif
241dc787588SYatharth Kochar
242dc787588SYatharth Kochar	/* ---------------------------------------------
243dc787588SYatharth Kochar	 * Flush L1 caches.
244dc787588SYatharth Kochar	 * ---------------------------------------------
245dc787588SYatharth Kochar	 */
246dc787588SYatharth Kochar	mov	r0, #DC_OP_CISW
247dc787588SYatharth Kochar	bl	dcsw_op_level1
248dc787588SYatharth Kochar
249dc787588SYatharth Kochar	/* ---------------------------------------------
250dc787588SYatharth Kochar	 * Come out of intra cluster coherency
251dc787588SYatharth Kochar	 * ---------------------------------------------
252dc787588SYatharth Kochar	 */
253dc787588SYatharth Kochar	pop	{r12, lr}
254dc787588SYatharth Kochar	b	cortex_a53_disable_smp
255dc787588SYatharth Kocharendfunc cortex_a53_core_pwr_dwn
256dc787588SYatharth Kochar
257dc787588SYatharth Kochar	/* -------------------------------------------------------
258dc787588SYatharth Kochar	 * The CPU Ops cluster power down function for Cortex-A53.
259dc787588SYatharth Kochar	 * Clobbers: r0-r3
260dc787588SYatharth Kochar	 * -------------------------------------------------------
261dc787588SYatharth Kochar	 */
262dc787588SYatharth Kocharfunc cortex_a53_cluster_pwr_dwn
263dc787588SYatharth Kochar	push	{r12, lr}
264dc787588SYatharth Kochar
265dc787588SYatharth Kochar	/* Assert if cache is enabled */
2665f70d8deSMatt Ma#if ENABLE_ASSERTIONS
267dc787588SYatharth Kochar	ldcopr	r0, SCTLR
268dc787588SYatharth Kochar	tst	r0, #SCTLR_C_BIT
269dc787588SYatharth Kochar	ASM_ASSERT(eq)
270dc787588SYatharth Kochar#endif
271dc787588SYatharth Kochar
272dc787588SYatharth Kochar	/* ---------------------------------------------
273dc787588SYatharth Kochar	 * Flush L1 caches.
274dc787588SYatharth Kochar	 * ---------------------------------------------
275dc787588SYatharth Kochar	 */
276dc787588SYatharth Kochar	mov	r0, #DC_OP_CISW
277dc787588SYatharth Kochar	bl	dcsw_op_level1
278dc787588SYatharth Kochar
279dc787588SYatharth Kochar	/* ---------------------------------------------
280dc787588SYatharth Kochar	 * Disable the optional ACP.
281dc787588SYatharth Kochar	 * ---------------------------------------------
282dc787588SYatharth Kochar	 */
283dc787588SYatharth Kochar	bl	plat_disable_acp
284dc787588SYatharth Kochar
285dc787588SYatharth Kochar	/* ---------------------------------------------
286dc787588SYatharth Kochar	 * Flush L2 caches.
287dc787588SYatharth Kochar	 * ---------------------------------------------
288dc787588SYatharth Kochar	 */
289dc787588SYatharth Kochar	mov	r0, #DC_OP_CISW
290dc787588SYatharth Kochar	bl	dcsw_op_level2
291dc787588SYatharth Kochar
292dc787588SYatharth Kochar	/* ---------------------------------------------
293dc787588SYatharth Kochar	 * Come out of intra cluster coherency
294dc787588SYatharth Kochar	 * ---------------------------------------------
295dc787588SYatharth Kochar	 */
296dc787588SYatharth Kochar	pop	{r12, lr}
297dc787588SYatharth Kochar	b	cortex_a53_disable_smp
298dc787588SYatharth Kocharendfunc cortex_a53_cluster_pwr_dwn
299dc787588SYatharth Kochar
300dc787588SYatharth Kochardeclare_cpu_ops cortex_a53, CORTEX_A53_MIDR, \
301dc787588SYatharth Kochar	cortex_a53_reset_func, \
302dc787588SYatharth Kochar	cortex_a53_core_pwr_dwn, \
303dc787588SYatharth Kochar	cortex_a53_cluster_pwr_dwn
304