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