xref: /rk3399_ARM-atf/lib/cpus/aarch64/cortex_a72.S (revision 35b2bbf4942689fd52fa741ac7d93bc7f1d4c230)
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