xref: /rk3399_ARM-atf/lib/cpus/aarch64/cortex_a77.S (revision c1e5f0cf9341ff1d1cfc8498a3a8ee8bc373742c)
1f363deb6SBalint Dobszay/*
27791ce21SBoyan Karatotev * Copyright (c) 2018-2025, Arm Limited and Contributors. All rights reserved.
3f363deb6SBalint Dobszay *
4f363deb6SBalint Dobszay * SPDX-License-Identifier: BSD-3-Clause
5f363deb6SBalint Dobszay */
6f363deb6SBalint Dobszay
7f363deb6SBalint Dobszay#include <arch.h>
8f363deb6SBalint Dobszay#include <asm_macros.S>
9f363deb6SBalint Dobszay#include <common/bl_common.h>
10f363deb6SBalint Dobszay#include <cortex_a77.h>
11f363deb6SBalint Dobszay#include <cpu_macros.S>
12f363deb6SBalint Dobszay#include <plat_macros.S>
131fe4a9d1SBipin Ravi#include "wa_cve_2022_23960_bhb_vector.S"
14f363deb6SBalint Dobszay
15f363deb6SBalint Dobszay/* Hardware handled coherency */
16f363deb6SBalint Dobszay#if HW_ASSISTED_COHERENCY == 0
17f363deb6SBalint Dobszay#error "Cortex-A77 must be compiled with HW_ASSISTED_COHERENCY enabled"
18f363deb6SBalint Dobszay#endif
19f363deb6SBalint Dobszay
2089dba82dSBoyan Karatotevcpu_reset_prologue cortex_a77
2189dba82dSBoyan Karatotev
22f363deb6SBalint Dobszay/* 64-bit only core */
23f363deb6SBalint Dobszay#if CTX_INCLUDE_AARCH32_REGS == 1
24f363deb6SBalint Dobszay#error "Cortex-A77 supports only AArch64. Compile with CTX_INCLUDE_AARCH32_REGS=0"
25f363deb6SBalint Dobszay#endif
26f363deb6SBalint Dobszay
271fe4a9d1SBipin Ravi#if WORKAROUND_CVE_2022_23960
281fe4a9d1SBipin Ravi	wa_cve_2022_23960_bhb_vector_table CORTEX_A77_BHB_LOOP_COUNT, cortex_a77
291fe4a9d1SBipin Ravi#endif /* WORKAROUND_CVE_2022_23960 */
301fe4a9d1SBipin Ravi
310b3a4b5aSBoyan Karatotevworkaround_reset_start cortex_a77, ERRATUM(1508412), ERRATA_A77_1508412
320b3a4b5aSBoyan Karatotev	/* move cpu revision in again and compare against r0p0 */
330b3a4b5aSBoyan Karatotev	mov	x0, x7
347791ce21SBoyan Karatotev	cpu_rev_var_ls	CPU_REV(0, 0)
35aa3efe3dSlaurenw-arm	cbz	x0, 1f
360b3a4b5aSBoyan Karatotev
37aa3efe3dSlaurenw-arm	ldr	x0, =0x0
38aa3efe3dSlaurenw-arm	msr	CORTEX_A77_CPUPSELR_EL3, x0
39aa3efe3dSlaurenw-arm	ldr 	x0, =0x00E8400000
40aa3efe3dSlaurenw-arm	msr	CORTEX_A77_CPUPOR_EL3, x0
41aa3efe3dSlaurenw-arm	ldr	x0, =0x00FFE00000
42aa3efe3dSlaurenw-arm	msr	CORTEX_A77_CPUPMR_EL3, x0
43aa3efe3dSlaurenw-arm	ldr	x0, =0x4004003FF
44aa3efe3dSlaurenw-arm	msr	CORTEX_A77_CPUPCR_EL3, x0
45aa3efe3dSlaurenw-arm	ldr	x0, =0x1
46aa3efe3dSlaurenw-arm	msr	CORTEX_A77_CPUPSELR_EL3, x0
47aa3efe3dSlaurenw-arm	ldr	x0, =0x00E8C00040
48aa3efe3dSlaurenw-arm	msr	CORTEX_A77_CPUPOR_EL3, x0
49aa3efe3dSlaurenw-arm	ldr	x0, =0x00FFE00040
50aa3efe3dSlaurenw-arm	msr	CORTEX_A77_CPUPMR_EL3, x0
51aa3efe3dSlaurenw-arm	b	2f
52aa3efe3dSlaurenw-arm1:
53aa3efe3dSlaurenw-arm	ldr	x0, =0x0
54aa3efe3dSlaurenw-arm	msr	CORTEX_A77_CPUPSELR_EL3, x0
55aa3efe3dSlaurenw-arm	ldr	x0, =0x00E8400000
56aa3efe3dSlaurenw-arm	msr	CORTEX_A77_CPUPOR_EL3, x0
57aa3efe3dSlaurenw-arm	ldr	x0, =0x00FF600000
58aa3efe3dSlaurenw-arm	msr	CORTEX_A77_CPUPMR_EL3, x0
59aa3efe3dSlaurenw-arm	ldr	x0, =0x00E8E00080
60aa3efe3dSlaurenw-arm	msr	CORTEX_A77_CPUPOR2_EL3, x0
61aa3efe3dSlaurenw-arm	ldr	x0, =0x00FFE000C0
62aa3efe3dSlaurenw-arm	msr	CORTEX_A77_CPUPMR2_EL3, x0
63aa3efe3dSlaurenw-arm2:
64aa3efe3dSlaurenw-arm	ldr	x0, =0x04004003FF
65aa3efe3dSlaurenw-arm	msr	CORTEX_A77_CPUPCR_EL3, x0
660b3a4b5aSBoyan Karatotevworkaround_reset_end cortex_a77, ERRATUM(1508412)
67aa3efe3dSlaurenw-arm
680b3a4b5aSBoyan Karatotevcheck_erratum_ls cortex_a77, ERRATUM(1508412), CPU_REV(1, 0)
69aa3efe3dSlaurenw-arm
700b3a4b5aSBoyan Karatotevworkaround_reset_start cortex_a77, ERRATUM(1791578), ERRATA_A77_1791578
718a4a9165SBoyan Karatotev	sysreg_bit_set CORTEX_A77_ACTLR2_EL1, CORTEX_A77_ACTLR2_EL1_BIT_2
720b3a4b5aSBoyan Karatotevworkaround_reset_end cortex_a77, ERRATUM(1791578)
7399787a4cSBoyan Karatotev
740b3a4b5aSBoyan Karatotevcheck_erratum_ls cortex_a77, ERRATUM(1791578), CPU_REV(1, 1)
7599787a4cSBoyan Karatotev
760b3a4b5aSBoyan Karatotevworkaround_reset_start cortex_a77, ERRATUM(1800714), ERRATA_A77_1800714
7799787a4cSBoyan Karatotev	/* Disable allocation of splintered pages in the L2 TLB */
788a4a9165SBoyan Karatotev	sysreg_bit_set CORTEX_A77_CPUECTLR_EL1, CORTEX_A77_CPUECTLR_EL1_BIT_53
790b3a4b5aSBoyan Karatotevworkaround_reset_end cortex_a77, ERRATUM(1800714)
8099787a4cSBoyan Karatotev
810b3a4b5aSBoyan Karatotevcheck_erratum_ls cortex_a77, ERRATUM(1800714), CPU_REV(1, 1)
8299787a4cSBoyan Karatotev
830b3a4b5aSBoyan Karatotevworkaround_reset_start cortex_a77, ERRATUM(1925769), ERRATA_A77_1925769
848a4a9165SBoyan Karatotev	sysreg_bit_set CORTEX_A77_CPUECTLR_EL1, CORTEX_A77_CPUECTLR_EL1_BIT_8
850b3a4b5aSBoyan Karatotevworkaround_reset_end cortex_a77, ERRATUM(1925769)
8635c75377Sjohpow01
870b3a4b5aSBoyan Karatotevcheck_erratum_ls cortex_a77, ERRATUM(1925769), CPU_REV(1, 1)
8835c75377Sjohpow01
890b3a4b5aSBoyan Karatotevworkaround_reset_start cortex_a77, ERRATUM(1946167), ERRATA_A77_1946167
90a492edc4Slaurenw-arm	ldr	x0,=0x4
91a492edc4Slaurenw-arm	msr	CORTEX_A77_CPUPSELR_EL3,x0
92a492edc4Slaurenw-arm	ldr	x0,=0x10E3900002
93a492edc4Slaurenw-arm	msr	CORTEX_A77_CPUPOR_EL3,x0
94a492edc4Slaurenw-arm	ldr	x0,=0x10FFF00083
95a492edc4Slaurenw-arm	msr	CORTEX_A77_CPUPMR_EL3,x0
96a492edc4Slaurenw-arm	ldr	x0,=0x2001003FF
97a492edc4Slaurenw-arm	msr	CORTEX_A77_CPUPCR_EL3,x0
98a492edc4Slaurenw-arm
99a492edc4Slaurenw-arm	ldr	x0,=0x5
100a492edc4Slaurenw-arm	msr	CORTEX_A77_CPUPSELR_EL3,x0
101a492edc4Slaurenw-arm	ldr	x0,=0x10E3800082
102a492edc4Slaurenw-arm	msr	CORTEX_A77_CPUPOR_EL3,x0
103a492edc4Slaurenw-arm	ldr	x0,=0x10FFF00083
104a492edc4Slaurenw-arm	msr	CORTEX_A77_CPUPMR_EL3,x0
105a492edc4Slaurenw-arm	ldr	x0,=0x2001003FF
106a492edc4Slaurenw-arm	msr	CORTEX_A77_CPUPCR_EL3,x0
107a492edc4Slaurenw-arm
108a492edc4Slaurenw-arm	ldr	x0,=0x6
109a492edc4Slaurenw-arm	msr	CORTEX_A77_CPUPSELR_EL3,x0
110a492edc4Slaurenw-arm	ldr	x0,=0x10E3800200
111a492edc4Slaurenw-arm	msr	CORTEX_A77_CPUPOR_EL3,x0
112a492edc4Slaurenw-arm	ldr	x0,=0x10FFF003E0
113a492edc4Slaurenw-arm	msr	CORTEX_A77_CPUPMR_EL3,x0
114a492edc4Slaurenw-arm	ldr	x0,=0x2001003FF
115a492edc4Slaurenw-arm	msr	CORTEX_A77_CPUPCR_EL3,x0
1160b3a4b5aSBoyan Karatotevworkaround_reset_end cortex_a77, ERRATUM(1946167)
117a492edc4Slaurenw-arm
1180b3a4b5aSBoyan Karatotevcheck_erratum_ls cortex_a77, ERRATUM(1946167), CPU_REV(1, 1)
119a492edc4Slaurenw-arm
1200b3a4b5aSBoyan Karatotevworkaround_reset_start cortex_a77, ERRATUM(2356587), ERRATA_A77_2356587
1218a4a9165SBoyan Karatotev	sysreg_bit_set CORTEX_A77_ACTLR2_EL1, CORTEX_A77_ACTLR2_EL1_BIT_0
1220b3a4b5aSBoyan Karatotevworkaround_reset_end cortex_a77, ERRATUM(2356587)
1237bf1a7aaSBipin Ravi
1240b3a4b5aSBoyan Karatotevcheck_erratum_ls cortex_a77, ERRATUM(2356587), CPU_REV(1, 1)
1257bf1a7aaSBipin Ravi
1260b3a4b5aSBoyan Karatotevworkaround_runtime_start cortex_a77, ERRATUM(2743100), ERRATA_A77_2743100
1274fdeaffeSBoyan Karatotev	/* dsb before isb of power down sequence */
1284fdeaffeSBoyan Karatotev	dsb	sy
1290b3a4b5aSBoyan Karatotevworkaround_runtime_end cortex_a77, ERRATUM(2743100), NO_ISB
1304fdeaffeSBoyan Karatotev
1310b3a4b5aSBoyan Karatotevcheck_erratum_ls cortex_a77, ERRATUM(2743100), CPU_REV(1, 1)
1324fdeaffeSBoyan Karatotev
1330b3a4b5aSBoyan Karatotevworkaround_reset_start cortex_a77, CVE(2022, 23960), WORKAROUND_CVE_2022_23960
1340b3a4b5aSBoyan Karatotev#if IMAGE_BL31
1351fe4a9d1SBipin Ravi	/*
1361fe4a9d1SBipin Ravi	 * The Cortex-A77 generic vectors are overridden to apply errata
1371fe4a9d1SBipin Ravi         * mitigation on exception entry from lower ELs.
1381fe4a9d1SBipin Ravi	 */
1391fe4a9d1SBipin Ravi	adr	x0, wa_cve_vbar_cortex_a77
1401fe4a9d1SBipin Ravi	msr	vbar_el3, x0
1410b3a4b5aSBoyan Karatotev#endif /* IMAGE_BL31 */
1420b3a4b5aSBoyan Karatotevworkaround_reset_end cortex_a77, CVE(2022, 23960)
1431fe4a9d1SBipin Ravi
1440b3a4b5aSBoyan Karatotevcheck_erratum_chosen cortex_a77, CVE(2022, 23960), WORKAROUND_CVE_2022_23960
14508e2fdbdSBoyan Karatotev
14606f2cfb8SArvind Ram Prakash/* Disable hardware page aggregation. Enables mitigation for `CVE-2024-5660` */
14706f2cfb8SArvind Ram Prakashworkaround_reset_start cortex_a77, CVE(2024, 5660), WORKAROUND_CVE_2024_5660
14806f2cfb8SArvind Ram Prakash	sysreg_bit_set CORTEX_A77_CPUECTLR_EL1, BIT(46)
14906f2cfb8SArvind Ram Prakashworkaround_reset_end cortex_a77, CVE(2024, 5660)
15006f2cfb8SArvind Ram Prakash
15106f2cfb8SArvind Ram Prakashcheck_erratum_ls cortex_a77, CVE(2024, 5660), CPU_REV(1, 1)
15206f2cfb8SArvind Ram Prakash
1530b3a4b5aSBoyan Karatotev	/* -------------------------------------------------
1540b3a4b5aSBoyan Karatotev	 * The CPU Ops reset function for Cortex-A77. Must follow AAPCS.
1550b3a4b5aSBoyan Karatotev	 * -------------------------------------------------
1560b3a4b5aSBoyan Karatotev	 */
1570b3a4b5aSBoyan Karatotevcpu_reset_func_start cortex_a77
1580b3a4b5aSBoyan Karatotevcpu_reset_func_end cortex_a77
15962bbfe82Sjohpow01
160f363deb6SBalint Dobszay	/* ---------------------------------------------
161f363deb6SBalint Dobszay	 * HW will do the cache maintenance while powering down
162f363deb6SBalint Dobszay	 * ---------------------------------------------
163f363deb6SBalint Dobszay	 */
164f363deb6SBalint Dobszayfunc cortex_a77_core_pwr_dwn
165f363deb6SBalint Dobszay	/* ---------------------------------------------
166f363deb6SBalint Dobszay	 * Enable CPU power down bit in power control register
167f363deb6SBalint Dobszay	 * ---------------------------------------------
168f363deb6SBalint Dobszay	 */
1698a4a9165SBoyan Karatotev	sysreg_bit_set CORTEX_A77_CPUPWRCTLR_EL1, \
1708a4a9165SBoyan Karatotev		CORTEX_A77_CPUPWRCTLR_EL1_CORE_PWRDN_BIT
1718a4a9165SBoyan Karatotev
172*645917abSBoyan Karatotev	apply_erratum cortex_a77, ERRATUM(2743100), ERRATA_A77_2743100
1738a4a9165SBoyan Karatotev
174f363deb6SBalint Dobszay	isb
175f363deb6SBalint Dobszay	ret
176f363deb6SBalint Dobszayendfunc cortex_a77_core_pwr_dwn
177f363deb6SBalint Dobszay
178f363deb6SBalint Dobszay	/* ---------------------------------------------
179f363deb6SBalint Dobszay	 * This function provides Cortex-A77 specific
180f363deb6SBalint Dobszay	 * register information for crash reporting.
181f363deb6SBalint Dobszay	 * It needs to return with x6 pointing to
182f363deb6SBalint Dobszay	 * a list of register names in ascii and
183f363deb6SBalint Dobszay	 * x8 - x15 having values of registers to be
184f363deb6SBalint Dobszay	 * reported.
185f363deb6SBalint Dobszay	 * ---------------------------------------------
186f363deb6SBalint Dobszay	 */
187f363deb6SBalint Dobszay.section .rodata.cortex_a77_regs, "aS"
188f363deb6SBalint Dobszaycortex_a77_regs:  /* The ascii list of register names to be reported */
189f363deb6SBalint Dobszay	.asciz	"cpuectlr_el1", ""
190f363deb6SBalint Dobszay
191f363deb6SBalint Dobszayfunc cortex_a77_cpu_reg_dump
192f363deb6SBalint Dobszay	adr	x6, cortex_a77_regs
193f363deb6SBalint Dobszay	mrs	x8, CORTEX_A77_CPUECTLR_EL1
194f363deb6SBalint Dobszay	ret
195f363deb6SBalint Dobszayendfunc cortex_a77_cpu_reg_dump
196f363deb6SBalint Dobszay
197f363deb6SBalint Dobszaydeclare_cpu_ops cortex_a77, CORTEX_A77_MIDR, \
19862bbfe82Sjohpow01	cortex_a77_reset_func, \
199f363deb6SBalint Dobszay	cortex_a77_core_pwr_dwn
200