xref: /rk3399_ARM-atf/lib/cpus/aarch64/cortex_x3.S (revision a7da8171da8a9b40636b35522e0a8c6c23d03604)
1c58b9a8eSRupinderjit Singh/*
2b0521a16SArvind Ram Prakash * Copyright (c) 2021-2025, Arm Limited. All rights reserved.
3c58b9a8eSRupinderjit Singh *
4c58b9a8eSRupinderjit Singh * SPDX-License-Identifier: BSD-3-Clause
5c58b9a8eSRupinderjit Singh */
6c58b9a8eSRupinderjit Singh
7c58b9a8eSRupinderjit Singh#include <arch.h>
8c58b9a8eSRupinderjit Singh#include <asm_macros.S>
9c58b9a8eSRupinderjit Singh#include <common/bl_common.h>
10cf58b2d4SBoyan Karatotev#include <cortex_x3.h>
11c58b9a8eSRupinderjit Singh#include <cpu_macros.S>
12c58b9a8eSRupinderjit Singh#include <plat_macros.S>
13c58b9a8eSRupinderjit Singh#include "wa_cve_2022_23960_bhb_vector.S"
14c58b9a8eSRupinderjit Singh
15c58b9a8eSRupinderjit Singh/* Hardware handled coherency */
16c58b9a8eSRupinderjit Singh#if HW_ASSISTED_COHERENCY == 0
17cf58b2d4SBoyan Karatotev#error "Cortex-X3 must be compiled with HW_ASSISTED_COHERENCY enabled"
18c58b9a8eSRupinderjit Singh#endif
19c58b9a8eSRupinderjit Singh
20c58b9a8eSRupinderjit Singh/* 64-bit only core */
21c58b9a8eSRupinderjit Singh#if CTX_INCLUDE_AARCH32_REGS == 1
22cf58b2d4SBoyan Karatotev#error "Cortex-X3 supports only AArch64. Compile with CTX_INCLUDE_AARCH32_REGS=0"
23c58b9a8eSRupinderjit Singh#endif
24c58b9a8eSRupinderjit Singh
2577feb745SGovindraj Raja.global check_erratum_cortex_x3_3701769
2677feb745SGovindraj Raja
27c58b9a8eSRupinderjit Singh#if WORKAROUND_CVE_2022_23960
28cf58b2d4SBoyan Karatotev	wa_cve_2022_23960_bhb_vector_table CORTEX_X3_BHB_LOOP_COUNT, cortex_x3
29c58b9a8eSRupinderjit Singh#endif /* WORKAROUND_CVE_2022_23960 */
30c58b9a8eSRupinderjit Singh
3189dba82dSBoyan Karatotevcpu_reset_prologue cortex_x3
3289dba82dSBoyan Karatotev
33a65c5ba3SBipin Raviworkaround_reset_start cortex_x3, ERRATUM(2266875), ERRATA_X3_2266875
34a65c5ba3SBipin Ravi        sysreg_bit_set CORTEX_X3_CPUACTLR_EL1, BIT(22)
35a65c5ba3SBipin Raviworkaround_reset_end cortex_x3, ERRATUM(2266875)
36a65c5ba3SBipin Ravi
37a65c5ba3SBipin Ravicheck_erratum_ls cortex_x3, ERRATUM(2266875), CPU_REV(1, 0)
38a65c5ba3SBipin Ravi
395cba510eSBoyan Karatotevworkaround_reset_start cortex_x3, ERRATUM(2302506), ERRATA_X3_2302506
403f9df2c6SBipin Ravi	sysreg_bit_set	CORTEX_X3_CPUACTLR2_EL1, BIT(0)
415cba510eSBoyan Karatotevworkaround_reset_end cortex_x3, ERRATUM(2302506)
423f9df2c6SBipin Ravi
433f9df2c6SBipin Ravicheck_erratum_ls cortex_x3, ERRATUM(2302506), CPU_REV(1, 1)
443f9df2c6SBipin Ravi
45cc94e71bSBoyan Karatotev.global erratum_cortex_x3_2313909_wa
461a9d5d1eSSona Mathewworkaround_runtime_start cortex_x3, ERRATUM(2313909), ERRATA_X3_2313909
47bb801857SBoyan Karatotev	/* Set/unset bit 36 in ACTLR2_EL1. The first call will set it, applying
48bb801857SBoyan Karatotev	 * the workaround. Second call clears it to undo it. */
49bb801857SBoyan Karatotev	sysreg_bit_toggle CORTEX_X3_CPUACTLR2_EL1, CORTEX_X3_CPUACTLR2_EL1_BIT_36
501a9d5d1eSSona Mathewworkaround_runtime_end cortex_x3, ERRATUM(2313909), NO_ISB
5179544126SBoyan Karatotev
521a9d5d1eSSona Mathewcheck_erratum_ls cortex_x3, ERRATUM(2313909), CPU_REV(1, 0)
5379544126SBoyan Karatotev
547f69a406SBipin Raviworkaround_reset_start cortex_x3, ERRATUM(2372204), ERRATA_X3_2372204
557f69a406SBipin Ravi	/* Set bit 40 in CPUACTLR2_EL1 */
567f69a406SBipin Ravi	sysreg_bit_set CORTEX_X3_CPUACTLR2_EL1, BIT(40)
577f69a406SBipin Raviworkaround_reset_end cortex_x3, ERRATUM(2372204)
587f69a406SBipin Ravi
597f69a406SBipin Ravicheck_erratum_ls cortex_x3, ERRATUM(2372204), CPU_REV(1, 0)
607f69a406SBipin Ravi
611a9d5d1eSSona Mathewworkaround_reset_start cortex_x3, ERRATUM(2615812), ERRATA_X3_2615812
62c7e698cfSHarrison Mutai	/* Disable retention control for WFI and WFE. */
63c7e698cfSHarrison Mutai	mrs	x0, CORTEX_X3_CPUPWRCTLR_EL1
64c7e698cfSHarrison Mutai	bfi	x0, xzr, #CORTEX_X3_CPUPWRCTLR_EL1_WFI_RET_CTRL_BITS_SHIFT, #3
65c7e698cfSHarrison Mutai	bfi	x0, xzr, #CORTEX_X3_CPUPWRCTLR_EL1_WFE_RET_CTRL_BITS_SHIFT, #3
66c7e698cfSHarrison Mutai	msr	CORTEX_X3_CPUPWRCTLR_EL1, x0
671a9d5d1eSSona Mathewworkaround_reset_end cortex_x3, ERRATUM(2615812)
68c7e698cfSHarrison Mutai
691a9d5d1eSSona Mathewcheck_erratum_ls cortex_x3, ERRATUM(2615812), CPU_REV(1, 1)
70c7e698cfSHarrison Mutai
715cba510eSBoyan Karatotevworkaround_reset_start cortex_x3, ERRATUM(2641945), ERRATA_X3_2641945
72c1aa3fa5SBipin Ravi	sysreg_bit_set	CORTEX_X3_CPUACTLR6_EL1, BIT(41)
735cba510eSBoyan Karatotevworkaround_reset_end cortex_x3, ERRATUM(2641945)
74c1aa3fa5SBipin Ravi
75c1aa3fa5SBipin Ravicheck_erratum_ls cortex_x3, ERRATUM(2641945), CPU_REV(1, 0)
76c1aa3fa5SBipin Ravi
775b0e4438SSona Mathewworkaround_reset_start cortex_x3, ERRATUM(2742421), ERRATA_X3_2742421
785b0e4438SSona Mathew	/* Set CPUACTLR5_EL1[56:55] to 2'b01 */
795b0e4438SSona Mathew	sysreg_bit_set CORTEX_X3_CPUACTLR5_EL1, CORTEX_X3_CPUACTLR5_EL1_BIT_55
805b0e4438SSona Mathew	sysreg_bit_clear CORTEX_X3_CPUACTLR5_EL1, CORTEX_X3_CPUACTLR5_EL1_BIT_56
815b0e4438SSona Mathewworkaround_reset_end cortex_x3, ERRATUM(2742421)
825b0e4438SSona Mathew
835b0e4438SSona Mathewcheck_erratum_ls cortex_x3, ERRATUM(2742421), CPU_REV(1, 1)
845b0e4438SSona Mathew
85f43e9f57SHarrison Mutaiworkaround_runtime_start cortex_x3, ERRATUM(2743088), ERRATA_X3_2743088
86f43e9f57SHarrison Mutai	/* dsb before isb of power down sequence */
87f43e9f57SHarrison Mutai	dsb sy
88f43e9f57SHarrison Mutaiworkaround_runtime_end cortex_x3, ERRATUM(2743088), NO_ISB
89f43e9f57SHarrison Mutai
90f43e9f57SHarrison Mutaicheck_erratum_ls cortex_x3, ERRATUM(2743088), CPU_REV(1, 1)
91f43e9f57SHarrison Mutai
92355ce0a4SSona Mathewworkaround_reset_start cortex_x3, ERRATUM(2779509), ERRATA_X3_2779509
93355ce0a4SSona Mathew	/* Set CPUACTLR3_EL1 bit 47 */
94355ce0a4SSona Mathew	sysreg_bit_set CORTEX_X3_CPUACTLR3_EL1, CORTEX_X3_CPUACTLR3_EL1_BIT_47
95355ce0a4SSona Mathewworkaround_reset_end cortex_x3, ERRATUM(2779509)
96355ce0a4SSona Mathew
97355ce0a4SSona Mathewcheck_erratum_ls cortex_x3, ERRATUM(2779509), CPU_REV(1, 1)
98355ce0a4SSona Mathew
9942920aa7SArvind Ram Prakashworkaround_reset_start cortex_x3, ERRATUM(3213672), ERRATA_X3_3213672
10042920aa7SArvind Ram Prakash	sysreg_bit_set	CORTEX_X3_CPUACTLR_EL1, BIT(36)
10142920aa7SArvind Ram Prakashworkaround_reset_end cortex_x3, ERRATUM(3213672)
10242920aa7SArvind Ram Prakash
10342920aa7SArvind Ram Prakashcheck_erratum_ls cortex_x3, ERRATUM(3213672), CPU_REV(1, 2)
10442920aa7SArvind Ram Prakash
105f828efe2SArvind Ram Prakashworkaround_reset_start cortex_x3, ERRATUM(3692984), ERRATA_X3_3692984
106f828efe2SArvind Ram Prakash	sysreg_bit_set	CORTEX_X3_CPUACTLR6_EL1, BIT(41)
107f828efe2SArvind Ram Prakashworkaround_reset_end cortex_x3, ERRATUM(3692984)
108f828efe2SArvind Ram Prakash
109f828efe2SArvind Ram Prakashcheck_erratum_ls cortex_x3, ERRATUM(3692984), CPU_REV(1, 2)
110f828efe2SArvind Ram Prakash
1116b922fe0SSona Mathewadd_erratum_entry cortex_x3, ERRATUM(3701769), ERRATA_X3_3701769
1126b922fe0SSona Mathew
1136b922fe0SSona Mathewcheck_erratum_ls cortex_x3, ERRATUM(3701769), CPU_REV(1, 2)
1146b922fe0SSona Mathew
1156a464ee7SArvind Ram Prakashworkaround_reset_start cortex_x3, ERRATUM(3827463), ERRATA_X3_3827463
1166a464ee7SArvind Ram Prakash	sysreg_bit_set	CORTEX_X3_CPUACTLR_EL1, BIT(1)
1176a464ee7SArvind Ram Prakashworkaround_reset_end cortex_x3, ERRATUM(3827463)
1186a464ee7SArvind Ram Prakash
1196a464ee7SArvind Ram Prakashcheck_erratum_ls cortex_x3, ERRATUM(3827463), CPU_REV(1, 1)
1206a464ee7SArvind Ram Prakash
1211a9d5d1eSSona Mathewworkaround_reset_start cortex_x3, CVE(2022, 23960), WORKAROUND_CVE_2022_23960
1221a9d5d1eSSona Mathew#if IMAGE_BL31
123f99a4810SSona Mathew	override_vector_table wa_cve_vbar_cortex_x3
1241a9d5d1eSSona Mathew#endif /* IMAGE_BL31 */
1251a9d5d1eSSona Mathewworkaround_reset_end cortex_x3, CVE(2022, 23960)
1262975bc0cSSona Mathew
127*07df6c1cSGovindraj Rajacheck_erratum_ls cortex_x3, CVE(2022, 23960), CPU_REV(1, 0)
1282975bc0cSSona Mathew
1296b922fe0SSona Mathew/* Disable hardware page aggregation. Enables mitigation for `CVE-2024-5660` */
1306b922fe0SSona Mathewworkaround_reset_start cortex_x3, CVE(2024, 5660), WORKAROUND_CVE_2024_5660
1316b922fe0SSona Mathew	sysreg_bit_set CORTEX_X3_CPUECTLR_EL1, BIT(46)
1326b922fe0SSona Mathewworkaround_reset_end cortex_x3, CVE(2024, 5660)
1336b922fe0SSona Mathew
1346b922fe0SSona Mathewcheck_erratum_ls cortex_x3, CVE(2024, 5660), CPU_REV(1, 2)
1356b922fe0SSona Mathew
136b0521a16SArvind Ram Prakashworkaround_reset_start cortex_x3, CVE(2024, 7881), WORKAROUND_CVE_2024_7881
137b0521a16SArvind Ram Prakash	/* ---------------------------------
138b0521a16SArvind Ram Prakash	 * Sets BIT41 of CPUACTLR6_EL1 which
139b0521a16SArvind Ram Prakash	 * disables L1 Data cache prefetcher
140b0521a16SArvind Ram Prakash	 * ---------------------------------
141b0521a16SArvind Ram Prakash	 */
142b0521a16SArvind Ram Prakash	sysreg_bit_set CORTEX_X3_CPUACTLR6_EL1, BIT(41)
143b0521a16SArvind Ram Prakashworkaround_reset_end cortex_x3, CVE(2024, 7881)
144b0521a16SArvind Ram Prakash
145b0521a16SArvind Ram Prakashcheck_erratum_chosen cortex_x3, CVE(2024, 7881), WORKAROUND_CVE_2024_7881
146b0521a16SArvind Ram Prakash
1471a9d5d1eSSona Mathewcpu_reset_func_start cortex_x3
1481a9d5d1eSSona Mathew	/* Disable speculative loads */
1491a9d5d1eSSona Mathew	msr	SSBS, xzr
1502590e819SBoyan Karatotev	enable_mpmm
1511a9d5d1eSSona Mathewcpu_reset_func_end cortex_x3
1522975bc0cSSona Mathew
1532975bc0cSSona Mathew	/* ----------------------------------------------------
1542975bc0cSSona Mathew	 * HW will do the cache maintenance while powering down
1552975bc0cSSona Mathew	 * ----------------------------------------------------
1562975bc0cSSona Mathew	 */
1572975bc0cSSona Mathewfunc cortex_x3_core_pwr_dwn
158645917abSBoyan Karatotev	apply_erratum cortex_x3, ERRATUM(2313909), ERRATA_X3_2313909
1592975bc0cSSona Mathew	/* ---------------------------------------------------
1602975bc0cSSona Mathew	 * Enable CPU power down bit in power control register
1612975bc0cSSona Mathew	 * ---------------------------------------------------
1622975bc0cSSona Mathew	 */
163f99a4810SSona Mathew	sysreg_bit_set CORTEX_X3_CPUPWRCTLR_EL1, CORTEX_X3_CPUPWRCTLR_EL1_CORE_PWRDN_BIT
164db9ee834SBoyan Karatotev	apply_erratum cortex_x3, ERRATUM(2743088), ERRATA_X3_2743088, NO_GET_CPU_REV
1652975bc0cSSona Mathew	isb
1662975bc0cSSona Mathew	ret
1672975bc0cSSona Mathewendfunc cortex_x3_core_pwr_dwn
1682975bc0cSSona Mathew
169c58b9a8eSRupinderjit Singh	/* ---------------------------------------------
170cf58b2d4SBoyan Karatotev	 * This function provides Cortex-X3-
171c58b9a8eSRupinderjit Singh	 * specific register information for crash
172c58b9a8eSRupinderjit Singh	 * reporting. It needs to return with x6
173c58b9a8eSRupinderjit Singh	 * pointing to a list of register names in ascii
174c58b9a8eSRupinderjit Singh	 * and x8 - x15 having values of registers to be
175c58b9a8eSRupinderjit Singh	 * reported.
176c58b9a8eSRupinderjit Singh	 * ---------------------------------------------
177c58b9a8eSRupinderjit Singh	 */
178cf58b2d4SBoyan Karatotev.section .rodata.cortex_x3_regs, "aS"
179cf58b2d4SBoyan Karatotevcortex_x3_regs:  /* The ascii list of register names to be reported */
180c58b9a8eSRupinderjit Singh	.asciz	"cpuectlr_el1", ""
181c58b9a8eSRupinderjit Singh
182cf58b2d4SBoyan Karatotevfunc cortex_x3_cpu_reg_dump
183cf58b2d4SBoyan Karatotev	adr	x6, cortex_x3_regs
184cf58b2d4SBoyan Karatotev	mrs	x8, CORTEX_X3_CPUECTLR_EL1
185c58b9a8eSRupinderjit Singh	ret
186cf58b2d4SBoyan Karatotevendfunc cortex_x3_cpu_reg_dump
187c58b9a8eSRupinderjit Singh
188fd04156eSArvind Ram Prakashdeclare_cpu_ops cortex_x3, CORTEX_X3_MIDR, \
189cf58b2d4SBoyan Karatotev	cortex_x3_reset_func, \
190cf58b2d4SBoyan Karatotev	cortex_x3_core_pwr_dwn
191