11ba93aebSVikram Kanigiri/* 289dba82dSBoyan Karatotev * Copyright (c) 2015-2025, Arm Limited and Contributors. All rights reserved. 31ba93aebSVikram Kanigiri * 482cb2c1aSdp-arm * SPDX-License-Identifier: BSD-3-Clause 51ba93aebSVikram Kanigiri */ 61ba93aebSVikram Kanigiri#include <arch.h> 71ba93aebSVikram Kanigiri#include <asm_macros.S> 81ba93aebSVikram Kanigiri#include <assert_macros.S> 91ba93aebSVikram Kanigiri#include <cortex_a72.h> 101ba93aebSVikram Kanigiri#include <cpu_macros.S> 111ba93aebSVikram Kanigiri#include <plat_macros.S> 12be9121fdSBipin Ravi#include "wa_cve_2022_23960_bhb_vector.S" 13be9121fdSBipin Ravi 14be9121fdSBipin Ravi#if WORKAROUND_CVE_2022_23960 15be9121fdSBipin Ravi wa_cve_2022_23960_bhb_vector_table CORTEX_A72_BHB_LOOP_COUNT, cortex_a72 16be9121fdSBipin Ravi#endif /* WORKAROUND_CVE_2022_23960 */ 171ba93aebSVikram Kanigiri 1889dba82dSBoyan Karatotevcpu_reset_prologue cortex_a72 1989dba82dSBoyan Karatotev 201ba93aebSVikram Kanigiri /* --------------------------------------------- 211ba93aebSVikram Kanigiri * Disable all types of L2 prefetches. 221ba93aebSVikram Kanigiri * --------------------------------------------- 231ba93aebSVikram Kanigiri */ 241ba93aebSVikram Kanigirifunc cortex_a72_disable_l2_prefetch 25fb7d32e5SVarun Wadekar mrs x0, CORTEX_A72_ECTLR_EL1 26fb7d32e5SVarun Wadekar orr x0, x0, #CORTEX_A72_ECTLR_DIS_TWD_ACC_PFTCH_BIT 27fb7d32e5SVarun Wadekar mov x1, #CORTEX_A72_ECTLR_L2_IPFTCH_DIST_MASK 28fb7d32e5SVarun Wadekar orr x1, x1, #CORTEX_A72_ECTLR_L2_DPFTCH_DIST_MASK 291ba93aebSVikram Kanigiri bic x0, x0, x1 30fb7d32e5SVarun Wadekar msr CORTEX_A72_ECTLR_EL1, x0 311ba93aebSVikram Kanigiri isb 321ba93aebSVikram Kanigiri ret 338b779620SKévin Petitendfunc cortex_a72_disable_l2_prefetch 341ba93aebSVikram Kanigiri 351ba93aebSVikram Kanigiri /* --------------------------------------------- 361ba93aebSVikram Kanigiri * Disable the load-store hardware prefetcher. 371ba93aebSVikram Kanigiri * --------------------------------------------- 381ba93aebSVikram Kanigiri */ 391ba93aebSVikram Kanigirifunc cortex_a72_disable_hw_prefetcher 4064ea532dSJayanth Dodderi Chidanand sysreg_bit_set CORTEX_A72_CPUACTLR_EL1, CORTEX_A72_CPUACTLR_EL1_DISABLE_L1_DCACHE_HW_PFTCH 411ba93aebSVikram Kanigiri isb 421ba93aebSVikram Kanigiri dsb ish 431ba93aebSVikram Kanigiri ret 448b779620SKévin Petitendfunc cortex_a72_disable_hw_prefetcher 451ba93aebSVikram Kanigiri 461ba93aebSVikram Kanigiri /* --------------------------------------------- 471ba93aebSVikram Kanigiri * Disable intra-cluster coherency 481ba93aebSVikram Kanigiri * --------------------------------------------- 491ba93aebSVikram Kanigiri */ 501ba93aebSVikram Kanigirifunc cortex_a72_disable_smp 5164ea532dSJayanth Dodderi Chidanand sysreg_bit_clear CORTEX_A72_ECTLR_EL1, CORTEX_A72_ECTLR_SMP_BIT 521ba93aebSVikram Kanigiri ret 538b779620SKévin Petitendfunc cortex_a72_disable_smp 541ba93aebSVikram Kanigiri 551ba93aebSVikram Kanigiri /* --------------------------------------------- 561ba93aebSVikram Kanigiri * Disable debug interfaces 571ba93aebSVikram Kanigiri * --------------------------------------------- 581ba93aebSVikram Kanigiri */ 591ba93aebSVikram Kanigirifunc cortex_a72_disable_ext_debug 601ba93aebSVikram Kanigiri mov x0, #1 611ba93aebSVikram Kanigiri msr osdlr_el1, x0 621ba93aebSVikram Kanigiri isb 631ba93aebSVikram Kanigiri dsb sy 641ba93aebSVikram Kanigiri ret 658b779620SKévin Petitendfunc cortex_a72_disable_ext_debug 661ba93aebSVikram Kanigiri 67*fd04156eSArvind Ram Prakashcheck_erratum_custom_start cortex_a72, ERRATUM(ARCH_WORKAROUND_3) 6814197f8eSJayanth Dodderi Chidanand cpu_check_csv2 x0, 1f 6914197f8eSJayanth Dodderi Chidanand mov x0, #ERRATA_APPLIES 7014197f8eSJayanth Dodderi Chidanand ret 7114197f8eSJayanth Dodderi Chidanand1: 7214197f8eSJayanth Dodderi Chidanand mov x0, #ERRATA_NOT_APPLIES 7314197f8eSJayanth Dodderi Chidanand ret 74*fd04156eSArvind Ram Prakashcheck_erratum_custom_end cortex_a72, ERRATUM(ARCH_WORKAROUND_3) 75*fd04156eSArvind Ram Prakash 76*fd04156eSArvind Ram Prakash/* Erratum entry and check function for SMCCC_ARCH_WORKAROUND_3 */ 77*fd04156eSArvind Ram Prakashadd_erratum_entry cortex_a72, ERRATUM(ARCH_WORKAROUND_3), WORKAROUND_CVE_2022_23960 7814197f8eSJayanth Dodderi Chidanand 79989960cfSJayanth Dodderi Chidanandworkaround_reset_start cortex_a72, ERRATUM(859971), ERRATA_A72_859971 8064ea532dSJayanth Dodderi Chidanand sysreg_bit_set CORTEX_A72_CPUACTLR_EL1, CORTEX_A72_CPUACTLR_EL1_DIS_INSTR_PREFETCH 81989960cfSJayanth Dodderi Chidanandworkaround_reset_end cortex_a72, ERRATUM(859971) 826de9b336SEleanor Bonnici 83989960cfSJayanth Dodderi Chidanandcheck_erratum_ls cortex_a72, ERRATUM(859971), CPU_REV(0, 3) 846de9b336SEleanor Bonnici 85989960cfSJayanth Dodderi Chidanand/* Due to the nature of the errata it is applied unconditionally when chosen */ 86989960cfSJayanth Dodderi Chidanandcheck_erratum_chosen cortex_a72, ERRATUM(1319367), ERRATA_A72_1319367 87989960cfSJayanth Dodderi Chidanand/* erratum workaround is interleaved with generic code */ 8889dba82dSBoyan Karatotevadd_erratum_entry cortex_a72, ERRATUM(1319367), ERRATA_A72_1319367 89989960cfSJayanth Dodderi Chidanand 90989960cfSJayanth Dodderi Chidanandworkaround_reset_start cortex_a72, CVE(2017, 5715), WORKAROUND_CVE_2017_5715 91989960cfSJayanth Dodderi Chidanand#if IMAGE_BL31 9264ea532dSJayanth Dodderi Chidanand override_vector_table wa_cve_2017_5715_mmu_vbar 9314197f8eSJayanth Dodderi Chidanand#endif 94989960cfSJayanth Dodderi Chidanandworkaround_reset_end cortex_a72, CVE(2017, 5715) 9514197f8eSJayanth Dodderi Chidanand 96989960cfSJayanth Dodderi Chidanandcheck_erratum_custom_start cortex_a72, CVE(2017, 5715) 973991a6a4SDimitris Papastamos cpu_check_csv2 x0, 1f 98eec9e7d1SDimitris Papastamos#if WORKAROUND_CVE_2017_5715 99eec9e7d1SDimitris Papastamos mov x0, #ERRATA_APPLIES 100eec9e7d1SDimitris Papastamos#else 101eec9e7d1SDimitris Papastamos mov x0, #ERRATA_MISSING 102eec9e7d1SDimitris Papastamos#endif 103eec9e7d1SDimitris Papastamos ret 1043991a6a4SDimitris Papastamos1: 1053991a6a4SDimitris Papastamos mov x0, #ERRATA_NOT_APPLIES 1063991a6a4SDimitris Papastamos ret 107989960cfSJayanth Dodderi Chidanandcheck_erratum_custom_end cortex_a72, CVE(2017, 5715) 108eec9e7d1SDimitris Papastamos 109989960cfSJayanth Dodderi Chidanandworkaround_reset_start cortex_a72, CVE(2018, 3639), WORKAROUND_CVE_2018_3639 11064ea532dSJayanth Dodderi Chidanand sysreg_bit_set CORTEX_A72_CPUACTLR_EL1, CORTEX_A72_CPUACTLR_EL1_DIS_LOAD_PASS_STORE 111989960cfSJayanth Dodderi Chidanand isb 112989960cfSJayanth Dodderi Chidanand dsb sy 113989960cfSJayanth Dodderi Chidanandworkaround_reset_end cortex_a72, CVE(2018, 3639) 114989960cfSJayanth Dodderi Chidanandcheck_erratum_chosen cortex_a72, CVE(2018, 3639), WORKAROUND_CVE_2018_3639 115b8a25bbbSDimitris Papastamos 116989960cfSJayanth Dodderi Chidanandworkaround_reset_start cortex_a72, CVE(2022, 23960), WORKAROUND_CVE_2022_23960 117989960cfSJayanth Dodderi Chidanand#if IMAGE_BL31 118989960cfSJayanth Dodderi Chidanand /* Skip installing vector table again if already done for CVE(2017, 5715) */ 119be9121fdSBipin Ravi /* 120be9121fdSBipin Ravi * The Cortex-A72 generic vectors are overridden to apply the 121be9121fdSBipin Ravi * mitigation on exception entry from lower ELs for revisions >= r1p0 122be9121fdSBipin Ravi * which has CSV2 implemented. 123be9121fdSBipin Ravi */ 124be9121fdSBipin Ravi adr x0, wa_cve_vbar_cortex_a72 125989960cfSJayanth Dodderi Chidanand mrs x1, vbar_el3 126989960cfSJayanth Dodderi Chidanand cmp x0, x1 127989960cfSJayanth Dodderi Chidanand b.eq 1f 128be9121fdSBipin Ravi msr vbar_el3, x0 129989960cfSJayanth Dodderi Chidanand1: 130989960cfSJayanth Dodderi Chidanand#endif /* IMAGE_BL31 */ 131989960cfSJayanth Dodderi Chidanandworkaround_reset_end cortex_a72, CVE(2022, 23960) 132be9121fdSBipin Ravi 133989960cfSJayanth Dodderi Chidanandcheck_erratum_custom_start cortex_a72, CVE(2022, 23960) 134989960cfSJayanth Dodderi Chidanand#if WORKAROUND_CVE_2017_5715 || WORKAROUND_CVE_2022_23960 135989960cfSJayanth Dodderi Chidanand cpu_check_csv2 x0, 1f 136989960cfSJayanth Dodderi Chidanand mov x0, #ERRATA_APPLIES 137989960cfSJayanth Dodderi Chidanand ret 138989960cfSJayanth Dodderi Chidanand1: 139989960cfSJayanth Dodderi Chidanand#if WORKAROUND_CVE_2022_23960 140989960cfSJayanth Dodderi Chidanand mov x0, #ERRATA_APPLIES 141989960cfSJayanth Dodderi Chidanand#else 142989960cfSJayanth Dodderi Chidanand mov x0, #ERRATA_MISSING 143be9121fdSBipin Ravi#endif /* WORKAROUND_CVE_2022_23960 */ 144989960cfSJayanth Dodderi Chidanand ret 145989960cfSJayanth Dodderi Chidanand#endif /* WORKAROUND_CVE_2017_5715 || WORKAROUND_CVE_2022_23960 */ 146989960cfSJayanth Dodderi Chidanand mov x0, #ERRATA_MISSING 147989960cfSJayanth Dodderi Chidanand ret 148989960cfSJayanth Dodderi Chidanandcheck_erratum_custom_end cortex_a72, CVE(2022, 23960) 149f62ad322SDimitris Papastamos 150989960cfSJayanth Dodderi Chidanandcpu_reset_func_start cortex_a72 151b8a25bbbSDimitris Papastamos 1521ba93aebSVikram Kanigiri /* --------------------------------------------- 1536de9b336SEleanor Bonnici * Enable the SMP bit. 1541ba93aebSVikram Kanigiri * --------------------------------------------- 1551ba93aebSVikram Kanigiri */ 15664ea532dSJayanth Dodderi Chidanand sysreg_bit_set CORTEX_A72_ECTLR_EL1, CORTEX_A72_ECTLR_SMP_BIT 157989960cfSJayanth Dodderi Chidanand 158989960cfSJayanth Dodderi Chidanandcpu_reset_func_end cortex_a72 1591ba93aebSVikram Kanigiri 1601ba93aebSVikram Kanigiri /* ---------------------------------------------------- 1611ba93aebSVikram Kanigiri * The CPU Ops core power down function for Cortex-A72. 1621ba93aebSVikram Kanigiri * ---------------------------------------------------- 1631ba93aebSVikram Kanigiri */ 1641ba93aebSVikram Kanigirifunc cortex_a72_core_pwr_dwn 1651ba93aebSVikram Kanigiri mov x18, x30 1661ba93aebSVikram Kanigiri 1671ba93aebSVikram Kanigiri /* --------------------------------------------- 1681ba93aebSVikram Kanigiri * Disable the L2 prefetches. 1691ba93aebSVikram Kanigiri * --------------------------------------------- 1701ba93aebSVikram Kanigiri */ 1711ba93aebSVikram Kanigiri bl cortex_a72_disable_l2_prefetch 1721ba93aebSVikram Kanigiri 1731ba93aebSVikram Kanigiri /* --------------------------------------------- 1741ba93aebSVikram Kanigiri * Disable the load-store hardware prefetcher. 1751ba93aebSVikram Kanigiri * --------------------------------------------- 1761ba93aebSVikram Kanigiri */ 1771ba93aebSVikram Kanigiri bl cortex_a72_disable_hw_prefetcher 1781ba93aebSVikram Kanigiri 1791ba93aebSVikram Kanigiri /* --------------------------------------------- 1801ba93aebSVikram Kanigiri * Flush L1 caches. 1811ba93aebSVikram Kanigiri * --------------------------------------------- 1821ba93aebSVikram Kanigiri */ 1831ba93aebSVikram Kanigiri mov x0, #DCCISW 1841ba93aebSVikram Kanigiri bl dcsw_op_level1 1851ba93aebSVikram Kanigiri 1861ba93aebSVikram Kanigiri /* --------------------------------------------- 1871ba93aebSVikram Kanigiri * Come out of intra cluster coherency 1881ba93aebSVikram Kanigiri * --------------------------------------------- 1891ba93aebSVikram Kanigiri */ 1901ba93aebSVikram Kanigiri bl cortex_a72_disable_smp 1911ba93aebSVikram Kanigiri 1921ba93aebSVikram Kanigiri /* --------------------------------------------- 1931ba93aebSVikram Kanigiri * Force the debug interfaces to be quiescent 1941ba93aebSVikram Kanigiri * --------------------------------------------- 1951ba93aebSVikram Kanigiri */ 1961ba93aebSVikram Kanigiri mov x30, x18 1971ba93aebSVikram Kanigiri b cortex_a72_disable_ext_debug 1988b779620SKévin Petitendfunc cortex_a72_core_pwr_dwn 1991ba93aebSVikram Kanigiri 2001ba93aebSVikram Kanigiri /* ------------------------------------------------------- 2011ba93aebSVikram Kanigiri * The CPU Ops cluster power down function for Cortex-A72. 2021ba93aebSVikram Kanigiri * ------------------------------------------------------- 2031ba93aebSVikram Kanigiri */ 2041ba93aebSVikram Kanigirifunc cortex_a72_cluster_pwr_dwn 2051ba93aebSVikram Kanigiri mov x18, x30 2061ba93aebSVikram Kanigiri 2071ba93aebSVikram Kanigiri /* --------------------------------------------- 2081ba93aebSVikram Kanigiri * Disable the L2 prefetches. 2091ba93aebSVikram Kanigiri * --------------------------------------------- 2101ba93aebSVikram Kanigiri */ 2111ba93aebSVikram Kanigiri bl cortex_a72_disable_l2_prefetch 2121ba93aebSVikram Kanigiri 2131ba93aebSVikram Kanigiri /* --------------------------------------------- 2141ba93aebSVikram Kanigiri * Disable the load-store hardware prefetcher. 2151ba93aebSVikram Kanigiri * --------------------------------------------- 2161ba93aebSVikram Kanigiri */ 2171ba93aebSVikram Kanigiri bl cortex_a72_disable_hw_prefetcher 2181ba93aebSVikram Kanigiri 2191ba93aebSVikram Kanigiri#if !SKIP_A72_L1_FLUSH_PWR_DWN 2201ba93aebSVikram Kanigiri /* --------------------------------------------- 2211ba93aebSVikram Kanigiri * Flush L1 caches. 2221ba93aebSVikram Kanigiri * --------------------------------------------- 2231ba93aebSVikram Kanigiri */ 2241ba93aebSVikram Kanigiri mov x0, #DCCISW 2251ba93aebSVikram Kanigiri bl dcsw_op_level1 2261ba93aebSVikram Kanigiri#endif 2271ba93aebSVikram Kanigiri 2281ba93aebSVikram Kanigiri /* --------------------------------------------- 2291ba93aebSVikram Kanigiri * Disable the optional ACP. 2301ba93aebSVikram Kanigiri * --------------------------------------------- 2311ba93aebSVikram Kanigiri */ 2321ba93aebSVikram Kanigiri bl plat_disable_acp 2331ba93aebSVikram Kanigiri 2341ba93aebSVikram Kanigiri /* ------------------------------------------------- 2351ba93aebSVikram Kanigiri * Flush the L2 caches. 2361ba93aebSVikram Kanigiri * ------------------------------------------------- 2371ba93aebSVikram Kanigiri */ 2381ba93aebSVikram Kanigiri mov x0, #DCCISW 2391ba93aebSVikram Kanigiri bl dcsw_op_level2 2401ba93aebSVikram Kanigiri 2411ba93aebSVikram Kanigiri /* --------------------------------------------- 2421ba93aebSVikram Kanigiri * Come out of intra cluster coherency 2431ba93aebSVikram Kanigiri * --------------------------------------------- 2441ba93aebSVikram Kanigiri */ 2451ba93aebSVikram Kanigiri bl cortex_a72_disable_smp 2461ba93aebSVikram Kanigiri 2471ba93aebSVikram Kanigiri /* --------------------------------------------- 2481ba93aebSVikram Kanigiri * Force the debug interfaces to be quiescent 2491ba93aebSVikram Kanigiri * --------------------------------------------- 2501ba93aebSVikram Kanigiri */ 2511ba93aebSVikram Kanigiri mov x30, x18 2521ba93aebSVikram Kanigiri b cortex_a72_disable_ext_debug 2538b779620SKévin Petitendfunc cortex_a72_cluster_pwr_dwn 2541ba93aebSVikram Kanigiri 2551ba93aebSVikram Kanigiri /* --------------------------------------------- 2561ba93aebSVikram Kanigiri * This function provides cortex_a72 specific 2571ba93aebSVikram Kanigiri * register information for crash reporting. 2581ba93aebSVikram Kanigiri * It needs to return with x6 pointing to 2591ba93aebSVikram Kanigiri * a list of register names in ascii and 2601ba93aebSVikram Kanigiri * x8 - x15 having values of registers to be 2611ba93aebSVikram Kanigiri * reported. 2621ba93aebSVikram Kanigiri * --------------------------------------------- 2631ba93aebSVikram Kanigiri */ 2641ba93aebSVikram Kanigiri.section .rodata.cortex_a72_regs, "aS" 2651ba93aebSVikram Kanigiricortex_a72_regs: /* The ascii list of register names to be reported */ 26684629f2fSNaga Sureshkumar Relli .asciz "cpuectlr_el1", "cpumerrsr_el1", "l2merrsr_el1", "" 2671ba93aebSVikram Kanigiri 2681ba93aebSVikram Kanigirifunc cortex_a72_cpu_reg_dump 2691ba93aebSVikram Kanigiri adr x6, cortex_a72_regs 270fb7d32e5SVarun Wadekar mrs x8, CORTEX_A72_ECTLR_EL1 271fb7d32e5SVarun Wadekar mrs x9, CORTEX_A72_MERRSR_EL1 272fb7d32e5SVarun Wadekar mrs x10, CORTEX_A72_L2MERRSR_EL1 2731ba93aebSVikram Kanigiri ret 2748b779620SKévin Petitendfunc cortex_a72_cpu_reg_dump 2751ba93aebSVikram Kanigiri 276*fd04156eSArvind Ram Prakashdeclare_cpu_ops cortex_a72, CORTEX_A72_MIDR, \ 2775dd9dbb5SJeenu Viswambharan cortex_a72_reset_func, \ 2785dd9dbb5SJeenu Viswambharan cortex_a72_core_pwr_dwn, \ 2795dd9dbb5SJeenu Viswambharan cortex_a72_cluster_pwr_dwn 280