xref: /rk3399_ARM-atf/lib/cpus/aarch32/cortex_a57.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 */
6dc787588SYatharth Kochar#include <arch.h>
7dc787588SYatharth Kochar#include <asm_macros.S>
8dc787588SYatharth Kochar#include <assert_macros.S>
909d40e0eSAntonio Nino Diaz#include <common/debug.h>
10dc787588SYatharth Kochar#include <cortex_a57.h>
11dc787588SYatharth Kochar#include <cpu_macros.S>
12dc787588SYatharth Kochar
13dc787588SYatharth Kochar	/* ---------------------------------------------
14dc787588SYatharth Kochar	 * Disable intra-cluster coherency
15dc787588SYatharth Kochar	 * Clobbers: r0-r1
16dc787588SYatharth Kochar	 * ---------------------------------------------
17dc787588SYatharth Kochar	 */
18dc787588SYatharth Kocharfunc cortex_a57_disable_smp
19fb7d32e5SVarun Wadekar	ldcopr16	r0, r1, CORTEX_A57_ECTLR
20fb7d32e5SVarun Wadekar	bic64_imm	r0, r1, CORTEX_A57_ECTLR_SMP_BIT
21fb7d32e5SVarun Wadekar	stcopr16	r0, r1, CORTEX_A57_ECTLR
22dc787588SYatharth Kochar	bx	lr
23dc787588SYatharth Kocharendfunc cortex_a57_disable_smp
24dc787588SYatharth Kochar
25dc787588SYatharth Kochar	/* ---------------------------------------------
26dc787588SYatharth Kochar	 * Disable all types of L2 prefetches.
27dc787588SYatharth Kochar	 * Clobbers: r0-r2
28dc787588SYatharth Kochar	 * ---------------------------------------------
29dc787588SYatharth Kochar	 */
30dc787588SYatharth Kocharfunc cortex_a57_disable_l2_prefetch
31fb7d32e5SVarun Wadekar	ldcopr16	r0, r1, CORTEX_A57_ECTLR
32fb7d32e5SVarun Wadekar	orr64_imm	r0, r1, CORTEX_A57_ECTLR_DIS_TWD_ACC_PFTCH_BIT
33fb7d32e5SVarun Wadekar	bic64_imm	r0, r1, (CORTEX_A57_ECTLR_L2_IPFTCH_DIST_MASK | \
34fb7d32e5SVarun Wadekar				 CORTEX_A57_ECTLR_L2_DPFTCH_DIST_MASK)
35fb7d32e5SVarun Wadekar	stcopr16	r0, r1, CORTEX_A57_ECTLR
36dc787588SYatharth Kochar	isb
37dc787588SYatharth Kochar	dsb	ish
38dc787588SYatharth Kochar	bx	lr
39dc787588SYatharth Kocharendfunc cortex_a57_disable_l2_prefetch
40dc787588SYatharth Kochar
41dc787588SYatharth Kochar	/* ---------------------------------------------
42dc787588SYatharth Kochar	 * Disable debug interfaces
43dc787588SYatharth Kochar	 * ---------------------------------------------
44dc787588SYatharth Kochar	 */
45dc787588SYatharth Kocharfunc cortex_a57_disable_ext_debug
46dc787588SYatharth Kochar	mov	r0, #1
47dc787588SYatharth Kochar	stcopr	r0, DBGOSDLR
48dc787588SYatharth Kochar	isb
495bd2c24fSAmbroise Vincent#if ERRATA_A57_817169
505bd2c24fSAmbroise Vincent	/*
515bd2c24fSAmbroise Vincent	 * Invalidate any TLB address
525bd2c24fSAmbroise Vincent	 */
535bd2c24fSAmbroise Vincent	mov	r0, #0
545bd2c24fSAmbroise Vincent	stcopr	r0, TLBIMVA
555bd2c24fSAmbroise Vincent#endif
56dc787588SYatharth Kochar	dsb	sy
57dc787588SYatharth Kochar	bx	lr
58dc787588SYatharth Kocharendfunc cortex_a57_disable_ext_debug
59dc787588SYatharth Kochar
6094f7d1e2SDimitris Papastamos	/* --------------------------------------------------
6194f7d1e2SDimitris Papastamos	 * Errata Workaround for Cortex A57 Errata #806969.
6294f7d1e2SDimitris Papastamos	 * This applies only to revision r0p0 of Cortex A57.
6394f7d1e2SDimitris Papastamos	 * Inputs:
6494f7d1e2SDimitris Papastamos	 * r0: variant[4:7] and revision[0:3] of current cpu.
6594f7d1e2SDimitris Papastamos	 * Shall clobber: r0-r3
6694f7d1e2SDimitris Papastamos	 * --------------------------------------------------
6794f7d1e2SDimitris Papastamos	 */
6894f7d1e2SDimitris Papastamosfunc errata_a57_806969_wa
6994f7d1e2SDimitris Papastamos	/*
7094f7d1e2SDimitris Papastamos	 * Compare r0 against revision r0p0
7194f7d1e2SDimitris Papastamos	 */
7294f7d1e2SDimitris Papastamos	mov		r2, lr
7394f7d1e2SDimitris Papastamos	bl		check_errata_806969
7494f7d1e2SDimitris Papastamos	mov		lr, r2
7594f7d1e2SDimitris Papastamos	cmp		r0, #ERRATA_NOT_APPLIES
7694f7d1e2SDimitris Papastamos	beq		1f
7780bcf981SEleanor Bonnici	ldcopr16	r0, r1, CORTEX_A57_CPUACTLR
7880bcf981SEleanor Bonnici	orr64_imm	r0, r1, CORTEX_A57_CPUACTLR_NO_ALLOC_WBWA
7980bcf981SEleanor Bonnici	stcopr16	r0, r1, CORTEX_A57_CPUACTLR
8094f7d1e2SDimitris Papastamos1:
8194f7d1e2SDimitris Papastamos	bx	lr
8294f7d1e2SDimitris Papastamosendfunc errata_a57_806969_wa
8394f7d1e2SDimitris Papastamos
8494f7d1e2SDimitris Papastamosfunc check_errata_806969
8594f7d1e2SDimitris Papastamos	mov	r1, #0x00
8694f7d1e2SDimitris Papastamos	b	cpu_rev_var_ls
8794f7d1e2SDimitris Papastamosendfunc check_errata_806969
8894f7d1e2SDimitris Papastamos
89285861d0SBoyan Karatotevadd_erratum_entry cortex_a57, ERRATUM(806969), ERRATA_A57_806969
90285861d0SBoyan Karatotev
9194f7d1e2SDimitris Papastamos	/* ---------------------------------------------------
9294f7d1e2SDimitris Papastamos	 * Errata Workaround for Cortex A57 Errata #813419.
9394f7d1e2SDimitris Papastamos	 * This applies only to revision r0p0 of Cortex A57.
9494f7d1e2SDimitris Papastamos	 * ---------------------------------------------------
9594f7d1e2SDimitris Papastamos	 */
9694f7d1e2SDimitris Papastamosfunc check_errata_813419
9794f7d1e2SDimitris Papastamos	/*
9894f7d1e2SDimitris Papastamos	 * Even though this is only needed for revision r0p0, it
9994f7d1e2SDimitris Papastamos	 * is always applied due to limitations of the current
10094f7d1e2SDimitris Papastamos	 * errata framework.
10194f7d1e2SDimitris Papastamos	 */
10294f7d1e2SDimitris Papastamos	mov	r0, #ERRATA_APPLIES
10394f7d1e2SDimitris Papastamos	bx	lr
10494f7d1e2SDimitris Papastamosendfunc check_errata_813419
10594f7d1e2SDimitris Papastamos
106285861d0SBoyan Karatotevadd_erratum_entry cortex_a57, ERRATUM(813419), ERRATA_A57_813419
107285861d0SBoyan Karatotev
10894f7d1e2SDimitris Papastamos	/* ---------------------------------------------------
10994f7d1e2SDimitris Papastamos	 * Errata Workaround for Cortex A57 Errata #813420.
11094f7d1e2SDimitris Papastamos	 * This applies only to revision r0p0 of Cortex A57.
11194f7d1e2SDimitris Papastamos	 * Inputs:
11294f7d1e2SDimitris Papastamos	 * r0: variant[4:7] and revision[0:3] of current cpu.
11394f7d1e2SDimitris Papastamos	 * Shall clobber: r0-r3
11494f7d1e2SDimitris Papastamos	 * ---------------------------------------------------
11594f7d1e2SDimitris Papastamos	 */
11694f7d1e2SDimitris Papastamosfunc errata_a57_813420_wa
11794f7d1e2SDimitris Papastamos	/*
11894f7d1e2SDimitris Papastamos	 * Compare r0 against revision r0p0
11994f7d1e2SDimitris Papastamos	 */
12094f7d1e2SDimitris Papastamos	mov		r2, lr
12194f7d1e2SDimitris Papastamos	bl		check_errata_813420
12294f7d1e2SDimitris Papastamos	mov		lr, r2
12394f7d1e2SDimitris Papastamos	cmp		r0, #ERRATA_NOT_APPLIES
12494f7d1e2SDimitris Papastamos	beq		1f
12580bcf981SEleanor Bonnici	ldcopr16	r0, r1, CORTEX_A57_CPUACTLR
12680bcf981SEleanor Bonnici	orr64_imm	r0, r1, CORTEX_A57_CPUACTLR_DCC_AS_DCCI
12780bcf981SEleanor Bonnici	stcopr16	r0, r1, CORTEX_A57_CPUACTLR
12894f7d1e2SDimitris Papastamos1:
12994f7d1e2SDimitris Papastamos	bx		lr
13094f7d1e2SDimitris Papastamosendfunc errata_a57_813420_wa
13194f7d1e2SDimitris Papastamos
13294f7d1e2SDimitris Papastamosfunc check_errata_813420
13394f7d1e2SDimitris Papastamos	mov	r1, #0x00
13494f7d1e2SDimitris Papastamos	b	cpu_rev_var_ls
13594f7d1e2SDimitris Papastamosendfunc check_errata_813420
13694f7d1e2SDimitris Papastamos
137285861d0SBoyan Karatotevadd_erratum_entry cortex_a57, ERRATUM(813420), ERRATA_A57_813420
138285861d0SBoyan Karatotev
1390f6fbbd2SAmbroise Vincent	/* ---------------------------------------------------
1400f6fbbd2SAmbroise Vincent	 * Errata Workaround for Cortex A57 Errata #814670.
1410f6fbbd2SAmbroise Vincent	 * This applies only to revision r0p0 of Cortex A57.
1420f6fbbd2SAmbroise Vincent	 * Inputs:
1430f6fbbd2SAmbroise Vincent	 * r0: variant[4:7] and revision[0:3] of current cpu.
1440f6fbbd2SAmbroise Vincent	 * Shall clobber: r0-r3
1450f6fbbd2SAmbroise Vincent	 * ---------------------------------------------------
1460f6fbbd2SAmbroise Vincent	 */
1470f6fbbd2SAmbroise Vincentfunc errata_a57_814670_wa
1480f6fbbd2SAmbroise Vincent	/*
1490f6fbbd2SAmbroise Vincent	 * Compare r0 against revision r0p0
1500f6fbbd2SAmbroise Vincent	 */
1510f6fbbd2SAmbroise Vincent	mov		r2, lr
1520f6fbbd2SAmbroise Vincent	bl		check_errata_814670
1530f6fbbd2SAmbroise Vincent	cmp		r0, #ERRATA_NOT_APPLIES
1540f6fbbd2SAmbroise Vincent	beq		1f
1550f6fbbd2SAmbroise Vincent	ldcopr16	r0, r1, CORTEX_A57_CPUACTLR
1560f6fbbd2SAmbroise Vincent	orr64_imm	r0, r1, CORTEX_A57_CPUACTLR_DIS_DMB_NULLIFICATION
1570f6fbbd2SAmbroise Vincent	stcopr16	r0, r1, CORTEX_A57_CPUACTLR
1580f6fbbd2SAmbroise Vincent	isb
1590f6fbbd2SAmbroise Vincent1:
1600f6fbbd2SAmbroise Vincent	bx		r2
1610f6fbbd2SAmbroise Vincentendfunc errata_a57_814670_wa
1620f6fbbd2SAmbroise Vincent
1630f6fbbd2SAmbroise Vincentfunc check_errata_814670
1640f6fbbd2SAmbroise Vincent	mov	r1, #0x00
1650f6fbbd2SAmbroise Vincent	b	cpu_rev_var_ls
1660f6fbbd2SAmbroise Vincentendfunc check_errata_814670
1670f6fbbd2SAmbroise Vincent
168285861d0SBoyan Karatotevadd_erratum_entry cortex_a57, ERRATUM(814670), ERRATA_A57_814670
169285861d0SBoyan Karatotev
1705bd2c24fSAmbroise Vincent	/* ----------------------------------------------------
1715bd2c24fSAmbroise Vincent	 * Errata Workaround for Cortex A57 Errata #817169.
1725bd2c24fSAmbroise Vincent	 * This applies only to revision <= r0p1 of Cortex A57.
1735bd2c24fSAmbroise Vincent	 * ----------------------------------------------------
1745bd2c24fSAmbroise Vincent	 */
1755bd2c24fSAmbroise Vincentfunc check_errata_817169
1765bd2c24fSAmbroise Vincent	/*
1775bd2c24fSAmbroise Vincent	 * Even though this is only needed for revision <= r0p1, it
1785bd2c24fSAmbroise Vincent	 * is always applied because of the low cost of the workaround.
1795bd2c24fSAmbroise Vincent	 */
1805bd2c24fSAmbroise Vincent	mov	r0, #ERRATA_APPLIES
1815bd2c24fSAmbroise Vincent	bx	lr
1825bd2c24fSAmbroise Vincentendfunc check_errata_817169
1835bd2c24fSAmbroise Vincent
184285861d0SBoyan Karatotevadd_erratum_entry cortex_a57, ERRATUM(817169), ERRATA_A57_817169
185285861d0SBoyan Karatotev
18694f7d1e2SDimitris Papastamos	/* --------------------------------------------------------------------
18794f7d1e2SDimitris Papastamos	 * Disable the over-read from the LDNP instruction.
18894f7d1e2SDimitris Papastamos	 *
18994f7d1e2SDimitris Papastamos	 * This applies to all revisions <= r1p2. The performance degradation
19094f7d1e2SDimitris Papastamos	 * observed with LDNP/STNP has been fixed on r1p3 and onwards.
19194f7d1e2SDimitris Papastamos	 *
19294f7d1e2SDimitris Papastamos	 * Inputs:
19394f7d1e2SDimitris Papastamos	 * r0: variant[4:7] and revision[0:3] of current cpu.
19494f7d1e2SDimitris Papastamos	 * Shall clobber: r0-r3
19594f7d1e2SDimitris Papastamos	 * ---------------------------------------------------------------------
19694f7d1e2SDimitris Papastamos	 */
19794f7d1e2SDimitris Papastamosfunc a57_disable_ldnp_overread
19894f7d1e2SDimitris Papastamos	/*
19994f7d1e2SDimitris Papastamos	 * Compare r0 against revision r1p2
20094f7d1e2SDimitris Papastamos	 */
20194f7d1e2SDimitris Papastamos	mov		r2, lr
20294f7d1e2SDimitris Papastamos	bl		check_errata_disable_ldnp_overread
20394f7d1e2SDimitris Papastamos	mov		lr, r2
20494f7d1e2SDimitris Papastamos	cmp		r0, #ERRATA_NOT_APPLIES
20594f7d1e2SDimitris Papastamos	beq		1f
20680bcf981SEleanor Bonnici	ldcopr16	r0, r1, CORTEX_A57_CPUACTLR
20780bcf981SEleanor Bonnici	orr64_imm	r0, r1, CORTEX_A57_CPUACTLR_DIS_OVERREAD
20880bcf981SEleanor Bonnici	stcopr16	r0, r1, CORTEX_A57_CPUACTLR
20994f7d1e2SDimitris Papastamos1:
21094f7d1e2SDimitris Papastamos	bx		lr
21194f7d1e2SDimitris Papastamosendfunc a57_disable_ldnp_overread
21294f7d1e2SDimitris Papastamos
21394f7d1e2SDimitris Papastamosfunc check_errata_disable_ldnp_overread
21494f7d1e2SDimitris Papastamos	mov	r1, #0x12
21594f7d1e2SDimitris Papastamos	b	cpu_rev_var_ls
21694f7d1e2SDimitris Papastamosendfunc check_errata_disable_ldnp_overread
21794f7d1e2SDimitris Papastamos
218285861d0SBoyan Karatotevadd_erratum_entry cortex_a57, ERRATUM(1), A57_DISABLE_NON_TEMPORAL_HINT, disable_ldnp_overread
219285861d0SBoyan Karatotev
22094f7d1e2SDimitris Papastamos	/* ---------------------------------------------------
22194f7d1e2SDimitris Papastamos	 * Errata Workaround for Cortex A57 Errata #826974.
22294f7d1e2SDimitris Papastamos	 * This applies only to revision <= r1p1 of Cortex A57.
22394f7d1e2SDimitris Papastamos	 * Inputs:
22494f7d1e2SDimitris Papastamos	 * r0: variant[4:7] and revision[0:3] of current cpu.
22594f7d1e2SDimitris Papastamos	 * Shall clobber: r0-r3
22694f7d1e2SDimitris Papastamos	 * ---------------------------------------------------
22794f7d1e2SDimitris Papastamos	 */
22894f7d1e2SDimitris Papastamosfunc errata_a57_826974_wa
22994f7d1e2SDimitris Papastamos	/*
23094f7d1e2SDimitris Papastamos	 * Compare r0 against revision r1p1
23194f7d1e2SDimitris Papastamos	 */
23294f7d1e2SDimitris Papastamos	mov		r2, lr
23394f7d1e2SDimitris Papastamos	bl		check_errata_826974
23494f7d1e2SDimitris Papastamos	mov		lr, r2
23594f7d1e2SDimitris Papastamos	cmp		r0, #ERRATA_NOT_APPLIES
23694f7d1e2SDimitris Papastamos	beq		1f
23780bcf981SEleanor Bonnici	ldcopr16	r0, r1, CORTEX_A57_CPUACTLR
23880bcf981SEleanor Bonnici	orr64_imm	r0, r1, CORTEX_A57_CPUACTLR_DIS_LOAD_PASS_DMB
23980bcf981SEleanor Bonnici	stcopr16	r0, r1, CORTEX_A57_CPUACTLR
24094f7d1e2SDimitris Papastamos1:
24194f7d1e2SDimitris Papastamos	bx		lr
24294f7d1e2SDimitris Papastamosendfunc errata_a57_826974_wa
24394f7d1e2SDimitris Papastamos
24494f7d1e2SDimitris Papastamosfunc check_errata_826974
24594f7d1e2SDimitris Papastamos	mov	r1, #0x11
24694f7d1e2SDimitris Papastamos	b	cpu_rev_var_ls
24794f7d1e2SDimitris Papastamosendfunc check_errata_826974
24894f7d1e2SDimitris Papastamos
249285861d0SBoyan Karatotevadd_erratum_entry cortex_a57, ERRATUM(826974), ERRATA_A57_826974
250285861d0SBoyan Karatotev
25194f7d1e2SDimitris Papastamos	/* ---------------------------------------------------
25294f7d1e2SDimitris Papastamos	 * Errata Workaround for Cortex A57 Errata #826977.
25394f7d1e2SDimitris Papastamos	 * This applies only to revision <= r1p1 of Cortex A57.
25494f7d1e2SDimitris Papastamos	 * Inputs:
25594f7d1e2SDimitris Papastamos	 * r0: variant[4:7] and revision[0:3] of current cpu.
25694f7d1e2SDimitris Papastamos	 * Shall clobber: r0-r3
25794f7d1e2SDimitris Papastamos	 * ---------------------------------------------------
25894f7d1e2SDimitris Papastamos	 */
25994f7d1e2SDimitris Papastamosfunc errata_a57_826977_wa
26094f7d1e2SDimitris Papastamos	/*
26194f7d1e2SDimitris Papastamos	 * Compare r0 against revision r1p1
26294f7d1e2SDimitris Papastamos	 */
26394f7d1e2SDimitris Papastamos	mov		r2, lr
26494f7d1e2SDimitris Papastamos	bl		check_errata_826977
26594f7d1e2SDimitris Papastamos	mov		lr, r2
26694f7d1e2SDimitris Papastamos	cmp		r0, #ERRATA_NOT_APPLIES
26794f7d1e2SDimitris Papastamos	beq		1f
26880bcf981SEleanor Bonnici	ldcopr16	r0, r1, CORTEX_A57_CPUACTLR
26980bcf981SEleanor Bonnici	orr64_imm	r0, r1, CORTEX_A57_CPUACTLR_GRE_NGRE_AS_NGNRE
27080bcf981SEleanor Bonnici	stcopr16	r0, r1, CORTEX_A57_CPUACTLR
27194f7d1e2SDimitris Papastamos1:
27294f7d1e2SDimitris Papastamos	bx		lr
27394f7d1e2SDimitris Papastamosendfunc errata_a57_826977_wa
27494f7d1e2SDimitris Papastamos
27594f7d1e2SDimitris Papastamosfunc check_errata_826977
27694f7d1e2SDimitris Papastamos	mov	r1, #0x11
27794f7d1e2SDimitris Papastamos	b	cpu_rev_var_ls
27894f7d1e2SDimitris Papastamosendfunc check_errata_826977
27994f7d1e2SDimitris Papastamos
280285861d0SBoyan Karatotevadd_erratum_entry cortex_a57, ERRATUM(826977), ERRATA_A57_826977
281285861d0SBoyan Karatotev
28294f7d1e2SDimitris Papastamos	/* ---------------------------------------------------
28394f7d1e2SDimitris Papastamos	 * Errata Workaround for Cortex A57 Errata #828024.
28494f7d1e2SDimitris Papastamos	 * This applies only to revision <= r1p1 of Cortex A57.
28594f7d1e2SDimitris Papastamos	 * Inputs:
28694f7d1e2SDimitris Papastamos	 * r0: variant[4:7] and revision[0:3] of current cpu.
28794f7d1e2SDimitris Papastamos	 * Shall clobber: r0-r3
28894f7d1e2SDimitris Papastamos	 * ---------------------------------------------------
28994f7d1e2SDimitris Papastamos	 */
29094f7d1e2SDimitris Papastamosfunc errata_a57_828024_wa
29194f7d1e2SDimitris Papastamos	/*
29294f7d1e2SDimitris Papastamos	 * Compare r0 against revision r1p1
29394f7d1e2SDimitris Papastamos	 */
29494f7d1e2SDimitris Papastamos	mov		r2, lr
29594f7d1e2SDimitris Papastamos	bl		check_errata_828024
29694f7d1e2SDimitris Papastamos	mov		lr, r2
29794f7d1e2SDimitris Papastamos	cmp		r0, #ERRATA_NOT_APPLIES
29894f7d1e2SDimitris Papastamos	beq		1f
29980bcf981SEleanor Bonnici	ldcopr16	r0, r1, CORTEX_A57_CPUACTLR
30094f7d1e2SDimitris Papastamos	/*
30180bcf981SEleanor Bonnici	 * Setting the relevant bits in CORTEX_A57_CPUACTLR has to be done in 2
30294f7d1e2SDimitris Papastamos	 * instructions here because the resulting bitmask doesn't fit in a
30394f7d1e2SDimitris Papastamos	 * 16-bit value so it cannot be encoded in a single instruction.
30494f7d1e2SDimitris Papastamos	 */
30580bcf981SEleanor Bonnici	orr64_imm	r0, r1, CORTEX_A57_CPUACTLR_NO_ALLOC_WBWA
30680bcf981SEleanor Bonnici	orr64_imm	r0, r1, (CORTEX_A57_CPUACTLR_DIS_L1_STREAMING | CORTEX_A57_CPUACTLR_DIS_STREAMING)
30780bcf981SEleanor Bonnici	stcopr16	r0, r1, CORTEX_A57_CPUACTLR
30894f7d1e2SDimitris Papastamos1:
30994f7d1e2SDimitris Papastamos	bx		lr
31094f7d1e2SDimitris Papastamosendfunc errata_a57_828024_wa
31194f7d1e2SDimitris Papastamos
31294f7d1e2SDimitris Papastamosfunc check_errata_828024
31394f7d1e2SDimitris Papastamos	mov	r1, #0x11
31494f7d1e2SDimitris Papastamos	b	cpu_rev_var_ls
31594f7d1e2SDimitris Papastamosendfunc check_errata_828024
31694f7d1e2SDimitris Papastamos
317285861d0SBoyan Karatotevadd_erratum_entry cortex_a57, ERRATUM(828024), ERRATA_A57_828024
318285861d0SBoyan Karatotev
31994f7d1e2SDimitris Papastamos	/* ---------------------------------------------------
32094f7d1e2SDimitris Papastamos	 * Errata Workaround for Cortex A57 Errata #829520.
32194f7d1e2SDimitris Papastamos	 * This applies only to revision <= r1p2 of Cortex A57.
32294f7d1e2SDimitris Papastamos	 * Inputs:
32394f7d1e2SDimitris Papastamos	 * r0: variant[4:7] and revision[0:3] of current cpu.
32494f7d1e2SDimitris Papastamos	 * Shall clobber: r0-r3
32594f7d1e2SDimitris Papastamos	 * ---------------------------------------------------
32694f7d1e2SDimitris Papastamos	 */
32794f7d1e2SDimitris Papastamosfunc errata_a57_829520_wa
32894f7d1e2SDimitris Papastamos	/*
32994f7d1e2SDimitris Papastamos	 * Compare r0 against revision r1p2
33094f7d1e2SDimitris Papastamos	 */
33194f7d1e2SDimitris Papastamos	mov		r2, lr
33294f7d1e2SDimitris Papastamos	bl		check_errata_829520
33394f7d1e2SDimitris Papastamos	mov		lr, r2
33494f7d1e2SDimitris Papastamos	cmp		r0, #ERRATA_NOT_APPLIES
33594f7d1e2SDimitris Papastamos	beq		1f
33680bcf981SEleanor Bonnici	ldcopr16	r0, r1, CORTEX_A57_CPUACTLR
33780bcf981SEleanor Bonnici	orr64_imm	r0, r1, CORTEX_A57_CPUACTLR_DIS_INDIRECT_PREDICTOR
33880bcf981SEleanor Bonnici	stcopr16	r0, r1, CORTEX_A57_CPUACTLR
33994f7d1e2SDimitris Papastamos1:
34094f7d1e2SDimitris Papastamos	bx		lr
34194f7d1e2SDimitris Papastamosendfunc errata_a57_829520_wa
34294f7d1e2SDimitris Papastamos
34394f7d1e2SDimitris Papastamosfunc check_errata_829520
34494f7d1e2SDimitris Papastamos	mov	r1, #0x12
34594f7d1e2SDimitris Papastamos	b	cpu_rev_var_ls
34694f7d1e2SDimitris Papastamosendfunc check_errata_829520
34794f7d1e2SDimitris Papastamos
348285861d0SBoyan Karatotevadd_erratum_entry cortex_a57, ERRATUM(829520), ERRATA_A57_829520
349285861d0SBoyan Karatotev
35094f7d1e2SDimitris Papastamos	/* ---------------------------------------------------
35194f7d1e2SDimitris Papastamos	 * Errata Workaround for Cortex A57 Errata #833471.
35294f7d1e2SDimitris Papastamos	 * This applies only to revision <= r1p2 of Cortex A57.
35394f7d1e2SDimitris Papastamos	 * Inputs:
35494f7d1e2SDimitris Papastamos	 * r0: variant[4:7] and revision[0:3] of current cpu.
35594f7d1e2SDimitris Papastamos	 * Shall clobber: r0-r3
35694f7d1e2SDimitris Papastamos	 * ---------------------------------------------------
35794f7d1e2SDimitris Papastamos	 */
35894f7d1e2SDimitris Papastamosfunc errata_a57_833471_wa
35994f7d1e2SDimitris Papastamos	/*
36094f7d1e2SDimitris Papastamos	 * Compare r0 against revision r1p2
36194f7d1e2SDimitris Papastamos	 */
36294f7d1e2SDimitris Papastamos	mov		r2, lr
36394f7d1e2SDimitris Papastamos	bl		check_errata_833471
36494f7d1e2SDimitris Papastamos	mov		lr, r2
36594f7d1e2SDimitris Papastamos	cmp		r0, #ERRATA_NOT_APPLIES
36694f7d1e2SDimitris Papastamos	beq		1f
36780bcf981SEleanor Bonnici	ldcopr16	r0, r1, CORTEX_A57_CPUACTLR
36880bcf981SEleanor Bonnici	orr64_imm	r1, r1, CORTEX_A57_CPUACTLR_FORCE_FPSCR_FLUSH
36980bcf981SEleanor Bonnici	stcopr16	r0, r1, CORTEX_A57_CPUACTLR
37094f7d1e2SDimitris Papastamos1:
37194f7d1e2SDimitris Papastamos	bx		lr
37294f7d1e2SDimitris Papastamosendfunc errata_a57_833471_wa
37394f7d1e2SDimitris Papastamos
37494f7d1e2SDimitris Papastamosfunc check_errata_833471
37594f7d1e2SDimitris Papastamos	mov	r1, #0x12
37694f7d1e2SDimitris Papastamos	b	cpu_rev_var_ls
37794f7d1e2SDimitris Papastamosendfunc check_errata_833471
37894f7d1e2SDimitris Papastamos
379285861d0SBoyan Karatotevadd_erratum_entry cortex_a57, ERRATUM(833471), ERRATA_A57_833471
380285861d0SBoyan Karatotev
38145b52c20SEleanor Bonnici	/* ---------------------------------------------------
38245b52c20SEleanor Bonnici	 * Errata Workaround for Cortex A57 Errata #859972.
38345b52c20SEleanor Bonnici	 * This applies only to revision <= r1p3 of Cortex A57.
38445b52c20SEleanor Bonnici	 * Inputs:
38545b52c20SEleanor Bonnici	 * r0: variant[4:7] and revision[0:3] of current cpu.
38645b52c20SEleanor Bonnici	 * Shall clobber: r0-r3
38745b52c20SEleanor Bonnici	 * ---------------------------------------------------
38845b52c20SEleanor Bonnici	 */
38945b52c20SEleanor Bonnicifunc errata_a57_859972_wa
39045b52c20SEleanor Bonnici	mov		r2, lr
39145b52c20SEleanor Bonnici	bl		check_errata_859972
39245b52c20SEleanor Bonnici	mov		lr, r2
39345b52c20SEleanor Bonnici	cmp		r0, #ERRATA_NOT_APPLIES
39445b52c20SEleanor Bonnici	beq		1f
39545b52c20SEleanor Bonnici	ldcopr16	r0, r1, CORTEX_A57_CPUACTLR
39645b52c20SEleanor Bonnici	orr64_imm	r1, r1, CORTEX_A57_CPUACTLR_DIS_INSTR_PREFETCH
39745b52c20SEleanor Bonnici	stcopr16	r0, r1, CORTEX_A57_CPUACTLR
39845b52c20SEleanor Bonnici1:
39945b52c20SEleanor Bonnici	bx		lr
40045b52c20SEleanor Bonniciendfunc errata_a57_859972_wa
40145b52c20SEleanor Bonnici
40245b52c20SEleanor Bonnicifunc check_errata_859972
40345b52c20SEleanor Bonnici	mov	r1, #0x13
40445b52c20SEleanor Bonnici	b	cpu_rev_var_ls
40545b52c20SEleanor Bonniciendfunc check_errata_859972
40645b52c20SEleanor Bonnici
407285861d0SBoyan Karatotevadd_erratum_entry cortex_a57, ERRATUM(859972), ERRATA_A57_859972
408285861d0SBoyan Karatotev
409e4b34efaSDimitris Papastamosfunc check_errata_cve_2017_5715
410e4b34efaSDimitris Papastamos	mov	r0, #ERRATA_MISSING
411e4b34efaSDimitris Papastamos	bx	lr
412e4b34efaSDimitris Papastamosendfunc check_errata_cve_2017_5715
413e4b34efaSDimitris Papastamos
414285861d0SBoyan Karatotevadd_erratum_entry cortex_a57, CVE(2017, 5715), WORKAROUND_CVE_2017_5715
415285861d0SBoyan Karatotev
416e0865708SDimitris Papastamosfunc check_errata_cve_2018_3639
417e0865708SDimitris Papastamos#if WORKAROUND_CVE_2018_3639
418e0865708SDimitris Papastamos	mov	r0, #ERRATA_APPLIES
419e0865708SDimitris Papastamos#else
420e0865708SDimitris Papastamos	mov	r0, #ERRATA_MISSING
421e0865708SDimitris Papastamos#endif
422e0865708SDimitris Papastamos	bx	lr
423e0865708SDimitris Papastamosendfunc check_errata_cve_2018_3639
424e0865708SDimitris Papastamos
425285861d0SBoyan Karatotevadd_erratum_entry cortex_a57, CVE(2018, 3639), WORKAROUND_CVE_2018_3639
426285861d0SBoyan Karatotev
4272e5d7a4bSJohn Powellfunc check_errata_cve_2022_23960
4282e5d7a4bSJohn Powell	mov	r0, #ERRATA_MISSING
4292e5d7a4bSJohn Powell	bx	lr
4302e5d7a4bSJohn Powellendfunc check_errata_cve_2022_23960
4312e5d7a4bSJohn Powell
432285861d0SBoyan Karatotevadd_erratum_entry cortex_a57, CVE(2022, 23960), WORKAROUND_CVE_2022_23960
433285861d0SBoyan Karatotev
434dc787588SYatharth Kochar	/* -------------------------------------------------
435dc787588SYatharth Kochar	 * The CPU Ops reset function for Cortex-A57.
43694f7d1e2SDimitris Papastamos	 * Shall clobber: r0-r6
437dc787588SYatharth Kochar	 * -------------------------------------------------
438dc787588SYatharth Kochar	 */
439dc787588SYatharth Kocharfunc cortex_a57_reset_func
44094f7d1e2SDimitris Papastamos	mov	r5, lr
44194f7d1e2SDimitris Papastamos	bl	cpu_get_rev_var
44294f7d1e2SDimitris Papastamos	mov	r4, r0
44394f7d1e2SDimitris Papastamos
44494f7d1e2SDimitris Papastamos#if ERRATA_A57_806969
44594f7d1e2SDimitris Papastamos	mov	r0, r4
44694f7d1e2SDimitris Papastamos	bl	errata_a57_806969_wa
44794f7d1e2SDimitris Papastamos#endif
44894f7d1e2SDimitris Papastamos
44994f7d1e2SDimitris Papastamos#if ERRATA_A57_813420
45094f7d1e2SDimitris Papastamos	mov	r0, r4
45194f7d1e2SDimitris Papastamos	bl	errata_a57_813420_wa
45294f7d1e2SDimitris Papastamos#endif
45394f7d1e2SDimitris Papastamos
4540f6fbbd2SAmbroise Vincent#if ERRATA_A57_814670
4550f6fbbd2SAmbroise Vincent	mov	r0, r4
4560f6fbbd2SAmbroise Vincent	bl	errata_a57_814670_wa
4570f6fbbd2SAmbroise Vincent#endif
4580f6fbbd2SAmbroise Vincent
45994f7d1e2SDimitris Papastamos#if A57_DISABLE_NON_TEMPORAL_HINT
46094f7d1e2SDimitris Papastamos	mov	r0, r4
46194f7d1e2SDimitris Papastamos	bl	a57_disable_ldnp_overread
46294f7d1e2SDimitris Papastamos#endif
46394f7d1e2SDimitris Papastamos
46494f7d1e2SDimitris Papastamos#if ERRATA_A57_826974
46594f7d1e2SDimitris Papastamos	mov	r0, r4
46694f7d1e2SDimitris Papastamos	bl	errata_a57_826974_wa
46794f7d1e2SDimitris Papastamos#endif
46894f7d1e2SDimitris Papastamos
46994f7d1e2SDimitris Papastamos#if ERRATA_A57_826977
47094f7d1e2SDimitris Papastamos	mov	r0, r4
47194f7d1e2SDimitris Papastamos	bl	errata_a57_826977_wa
47294f7d1e2SDimitris Papastamos#endif
47394f7d1e2SDimitris Papastamos
47494f7d1e2SDimitris Papastamos#if ERRATA_A57_828024
47594f7d1e2SDimitris Papastamos	mov	r0, r4
47694f7d1e2SDimitris Papastamos	bl	errata_a57_828024_wa
47794f7d1e2SDimitris Papastamos#endif
47894f7d1e2SDimitris Papastamos
47994f7d1e2SDimitris Papastamos#if ERRATA_A57_829520
48094f7d1e2SDimitris Papastamos	mov	r0, r4
48194f7d1e2SDimitris Papastamos	bl	errata_a57_829520_wa
48294f7d1e2SDimitris Papastamos#endif
48394f7d1e2SDimitris Papastamos
48494f7d1e2SDimitris Papastamos#if ERRATA_A57_833471
48594f7d1e2SDimitris Papastamos	mov	r0, r4
48694f7d1e2SDimitris Papastamos	bl	errata_a57_833471_wa
48794f7d1e2SDimitris Papastamos#endif
48894f7d1e2SDimitris Papastamos
48945b52c20SEleanor Bonnici#if ERRATA_A57_859972
49045b52c20SEleanor Bonnici	mov	r0, r4
49145b52c20SEleanor Bonnici	bl	errata_a57_859972_wa
49245b52c20SEleanor Bonnici#endif
49345b52c20SEleanor Bonnici
494e0865708SDimitris Papastamos#if WORKAROUND_CVE_2018_3639
495e0865708SDimitris Papastamos	ldcopr16	r0, r1, CORTEX_A57_CPUACTLR
496e0865708SDimitris Papastamos	orr64_imm	r0, r1, CORTEX_A57_CPUACTLR_DIS_LOAD_PASS_STORE
497e0865708SDimitris Papastamos	stcopr16	r0, r1, CORTEX_A57_CPUACTLR
498e0865708SDimitris Papastamos	isb
499e0865708SDimitris Papastamos	dsb	sy
500e0865708SDimitris Papastamos#endif
501e0865708SDimitris Papastamos
502dc787588SYatharth Kochar	/* ---------------------------------------------
503dc787588SYatharth Kochar	 * Enable the SMP bit.
504dc787588SYatharth Kochar	 * ---------------------------------------------
505dc787588SYatharth Kochar	 */
506fb7d32e5SVarun Wadekar	ldcopr16	r0, r1, CORTEX_A57_ECTLR
507fb7d32e5SVarun Wadekar	orr64_imm	r0, r1, CORTEX_A57_ECTLR_SMP_BIT
508fb7d32e5SVarun Wadekar	stcopr16	r0, r1,	CORTEX_A57_ECTLR
509dc787588SYatharth Kochar	isb
51094f7d1e2SDimitris Papastamos	bx	r5
511dc787588SYatharth Kocharendfunc cortex_a57_reset_func
512dc787588SYatharth Kochar
513dc787588SYatharth Kochar	/* ----------------------------------------------------
514dc787588SYatharth Kochar	 * The CPU Ops core power down function for Cortex-A57.
515dc787588SYatharth Kochar	 * ----------------------------------------------------
516dc787588SYatharth Kochar	 */
517dc787588SYatharth Kocharfunc cortex_a57_core_pwr_dwn
518dc787588SYatharth Kochar	push	{r12, lr}
519dc787588SYatharth Kochar
520dc787588SYatharth Kochar	/* Assert if cache is enabled */
5215f70d8deSMatt Ma#if ENABLE_ASSERTIONS
522dc787588SYatharth Kochar	ldcopr	r0, SCTLR
523dc787588SYatharth Kochar	tst	r0, #SCTLR_C_BIT
524dc787588SYatharth Kochar	ASM_ASSERT(eq)
525dc787588SYatharth Kochar#endif
526dc787588SYatharth Kochar
527dc787588SYatharth Kochar	/* ---------------------------------------------
528dc787588SYatharth Kochar	 * Disable the L2 prefetches.
529dc787588SYatharth Kochar	 * ---------------------------------------------
530dc787588SYatharth Kochar	 */
531dc787588SYatharth Kochar	bl	cortex_a57_disable_l2_prefetch
532dc787588SYatharth Kochar
533dc787588SYatharth Kochar	/* ---------------------------------------------
534dc787588SYatharth Kochar	 * Flush L1 caches.
535dc787588SYatharth Kochar	 * ---------------------------------------------
536dc787588SYatharth Kochar	 */
537dc787588SYatharth Kochar	mov	r0, #DC_OP_CISW
538dc787588SYatharth Kochar	bl	dcsw_op_level1
539dc787588SYatharth Kochar
540dc787588SYatharth Kochar	/* ---------------------------------------------
541dc787588SYatharth Kochar	 * Come out of intra cluster coherency
542dc787588SYatharth Kochar	 * ---------------------------------------------
543dc787588SYatharth Kochar	 */
544dc787588SYatharth Kochar	bl	cortex_a57_disable_smp
545dc787588SYatharth Kochar
546dc787588SYatharth Kochar	/* ---------------------------------------------
547dc787588SYatharth Kochar	 * Force the debug interfaces to be quiescent
548dc787588SYatharth Kochar	 * ---------------------------------------------
549dc787588SYatharth Kochar	 */
550dc787588SYatharth Kochar	pop	{r12, lr}
551dc787588SYatharth Kochar	b	cortex_a57_disable_ext_debug
552dc787588SYatharth Kocharendfunc cortex_a57_core_pwr_dwn
553dc787588SYatharth Kochar
554dc787588SYatharth Kochar	/* -------------------------------------------------------
555dc787588SYatharth Kochar	 * The CPU Ops cluster power down function for Cortex-A57.
556dc787588SYatharth Kochar	 * Clobbers: r0-r3
557dc787588SYatharth Kochar	 * -------------------------------------------------------
558dc787588SYatharth Kochar	 */
559dc787588SYatharth Kocharfunc cortex_a57_cluster_pwr_dwn
560dc787588SYatharth Kochar	push	{r12, lr}
561dc787588SYatharth Kochar
562dc787588SYatharth Kochar	/* Assert if cache is enabled */
5635f70d8deSMatt Ma#if ENABLE_ASSERTIONS
564dc787588SYatharth Kochar	ldcopr	r0, SCTLR
565dc787588SYatharth Kochar	tst	r0, #SCTLR_C_BIT
566dc787588SYatharth Kochar	ASM_ASSERT(eq)
567dc787588SYatharth Kochar#endif
568dc787588SYatharth Kochar
569dc787588SYatharth Kochar	/* ---------------------------------------------
570dc787588SYatharth Kochar	 * Disable the L2 prefetches.
571dc787588SYatharth Kochar	 * ---------------------------------------------
572dc787588SYatharth Kochar	 */
573dc787588SYatharth Kochar	bl	cortex_a57_disable_l2_prefetch
574dc787588SYatharth Kochar
575dc787588SYatharth Kochar	/* ---------------------------------------------
576dc787588SYatharth Kochar	 * Flush L1 caches.
577dc787588SYatharth Kochar	 * ---------------------------------------------
578dc787588SYatharth Kochar	 */
579dc787588SYatharth Kochar	mov	r0, #DC_OP_CISW
580dc787588SYatharth Kochar	bl	dcsw_op_level1
581dc787588SYatharth Kochar
582dc787588SYatharth Kochar	/* ---------------------------------------------
583dc787588SYatharth Kochar	 * Disable the optional ACP.
584dc787588SYatharth Kochar	 * ---------------------------------------------
585dc787588SYatharth Kochar	 */
586dc787588SYatharth Kochar	bl	plat_disable_acp
587dc787588SYatharth Kochar
588dc787588SYatharth Kochar	/* ---------------------------------------------
589dc787588SYatharth Kochar	 * Flush L2 caches.
590dc787588SYatharth Kochar	 * ---------------------------------------------
591dc787588SYatharth Kochar	 */
592dc787588SYatharth Kochar	mov	r0, #DC_OP_CISW
593dc787588SYatharth Kochar	bl	dcsw_op_level2
594dc787588SYatharth Kochar
595dc787588SYatharth Kochar	/* ---------------------------------------------
596dc787588SYatharth Kochar	 * Come out of intra cluster coherency
597dc787588SYatharth Kochar	 * ---------------------------------------------
598dc787588SYatharth Kochar	 */
599dc787588SYatharth Kochar	bl	cortex_a57_disable_smp
600dc787588SYatharth Kochar
601dc787588SYatharth Kochar	/* ---------------------------------------------
602dc787588SYatharth Kochar	 * Force the debug interfaces to be quiescent
603dc787588SYatharth Kochar	 * ---------------------------------------------
604dc787588SYatharth Kochar	 */
605dc787588SYatharth Kochar	pop	{r12, lr}
606dc787588SYatharth Kochar	b	cortex_a57_disable_ext_debug
607dc787588SYatharth Kocharendfunc cortex_a57_cluster_pwr_dwn
608dc787588SYatharth Kochar
609dc787588SYatharth Kochardeclare_cpu_ops cortex_a57, CORTEX_A57_MIDR, \
610dc787588SYatharth Kochar	cortex_a57_reset_func, \
611dc787588SYatharth Kochar	cortex_a57_core_pwr_dwn, \
612dc787588SYatharth Kochar	cortex_a57_cluster_pwr_dwn
613