fix(errata): workaround for Cortex X2 erratum 2083908

Cortex X2 erratum 2083908 is a Cat B erratum present in the Cortex
X2 core. It applies to revision r2p0 and is still open.

SDEN can be found here:
https://developer.arm.com/documentation/SDEN1775100

Signed-off-by: John Powell <john.powell@arm.com>
Change-Id: Id9dca2b042bf48e75fb3013ab37d1c5925824728
This commit is contained in:
johpow01 2021-12-01 17:40:39 -06:00 committed by John
parent e6b1a9abb6
commit 1db6cd6027
5 changed files with 74 additions and 2 deletions

View File

@ -441,6 +441,11 @@ For Neoverse N2, the following errata build flags are defined :
- ``ERRATA_N2_2280757``: This applies errata 2280757 workaround to Neoverse-N2 - ``ERRATA_N2_2280757``: This applies errata 2280757 workaround to Neoverse-N2
CPU. This needs to be enabled for revision r0p0 of the CPU and is still open. CPU. This needs to be enabled for revision r0p0 of the CPU and is still open.
For Cortex-X2, the following errata build flags are defined :
- ``ERRATA_X2_2083908``: This applies errata 2083908 workaround to Cortex-X2
CPU. This needs to be enabled for revision r2p0 of the CPU, it is still open.
DSU Errata Workarounds DSU Errata Workarounds
---------------------- ----------------------

View File

@ -20,4 +20,9 @@
#define CORTEX_X2_CPUPWRCTLR_EL1 S3_0_C15_C2_7 #define CORTEX_X2_CPUPWRCTLR_EL1 S3_0_C15_C2_7
#define CORTEX_X2_CPUPWRCTLR_EL1_CORE_PWRDN_BIT U(1) #define CORTEX_X2_CPUPWRCTLR_EL1_CORE_PWRDN_BIT U(1)
/*******************************************************************************
* CPU Auxiliary Control Register 5 definitions
******************************************************************************/
#define CORTEX_X2_CPUACTLR5_EL1 S3_0_C15_C8_0
#endif /* CORTEX_X2_H */ #endif /* CORTEX_X2_H */

View File

@ -21,6 +21,35 @@
#error "Cortex X2 supports only AArch64. Compile with CTX_INCLUDE_AARCH32_REGS=0" #error "Cortex X2 supports only AArch64. Compile with CTX_INCLUDE_AARCH32_REGS=0"
#endif #endif
/* --------------------------------------------------
* Errata Workaround for Cortex X2 Errata #2083908.
* This applies to revision r2p0 and is open.
* x0: variant[4:7] and revision[0:3] of current cpu.
* Shall clobber: x0-x2, x17
* --------------------------------------------------
*/
func errata_cortex_x2_2083908_wa
/* Check workaround compatibility. */
mov x17, x30
bl check_errata_2083908
cbz x0, 1f
/* Apply the workaround by setting bit 13 in CPUACTLR5_EL1. */
mrs x1, CORTEX_X2_CPUACTLR5_EL1
orr x1, x1, #BIT(13)
msr CORTEX_X2_CPUACTLR5_EL1, x1
1:
ret x17
endfunc errata_cortex_x2_2083908_wa
func check_errata_2083908
/* Applies to r2p0 */
mov x1, #0x20
mov x2, #0x20
b cpu_rev_var_range
endfunc check_errata_2083908
/* ---------------------------------------------------- /* ----------------------------------------------------
* HW will do the cache maintenance while powering down * HW will do the cache maintenance while powering down
* ---------------------------------------------------- * ----------------------------------------------------
@ -42,15 +71,39 @@ endfunc cortex_x2_core_pwr_dwn
*/ */
#if REPORT_ERRATA #if REPORT_ERRATA
func cortex_x2_errata_report func cortex_x2_errata_report
stp x8, x30, [sp, #-16]!
bl cpu_get_rev_var
mov x8, x0
/*
* Report all errata. The revision-variant information is passed to
* checking functions of each errata.
*/
report_errata ERRATA_X2_2083908, cortex_x2, 2083908
ldp x8, x30, [sp], #16
ret ret
endfunc cortex_x2_errata_report endfunc cortex_x2_errata_report
#endif #endif
func cortex_x2_reset_func func cortex_x2_reset_func
mov x19, x30
/* Disable speculative loads */ /* Disable speculative loads */
msr SSBS, xzr msr SSBS, xzr
isb isb
ret
/* Get the CPU revision and stash it in x18. */
bl cpu_get_rev_var
mov x18, x0
#if ERRATA_X2_2083908
mov x0, x18
bl errata_cortex_x2_2083908_wa
#endif
ret x19
endfunc cortex_x2_reset_func endfunc cortex_x2_reset_func
/* --------------------------------------------- /* ---------------------------------------------

View File

@ -495,6 +495,10 @@ ERRATA_A710_2055002 ?=0
# to revision r0p0, r1p0 and r2p0 of the Cortex-A710 cpu and is still open. # to revision r0p0, r1p0 and r2p0 of the Cortex-A710 cpu and is still open.
ERRATA_A710_2017096 ?=0 ERRATA_A710_2017096 ?=0
# Flag to apply erratum 2083908 workaround during reset. This erratum applies
# to revision r2p0 of the Cortex-X2 cpu and is still open.
ERRATA_X2_2083908 ?=0
# Flag to apply DSU erratum 798953. This erratum applies to DSUs revision r0p0. # Flag to apply DSU erratum 798953. This erratum applies to DSUs revision r0p0.
# Applying the workaround results in higher DSU power consumption on idle. # Applying the workaround results in higher DSU power consumption on idle.
ERRATA_DSU_798953 ?=0 ERRATA_DSU_798953 ?=0
@ -920,6 +924,10 @@ $(eval $(call add_define,ERRATA_A710_2055002))
$(eval $(call assert_boolean,ERRATA_A710_2017096)) $(eval $(call assert_boolean,ERRATA_A710_2017096))
$(eval $(call add_define,ERRATA_A710_2017096)) $(eval $(call add_define,ERRATA_A710_2017096))
# Process ERRATA_X2_2083908 flag
$(eval $(call assert_boolean,ERRATA_X2_2083908))
$(eval $(call add_define,ERRATA_X2_2083908))
# Process ERRATA_DSU_798953 flag # Process ERRATA_DSU_798953 flag
$(eval $(call assert_boolean,ERRATA_DSU_798953)) $(eval $(call assert_boolean,ERRATA_DSU_798953))
$(eval $(call add_define,ERRATA_DSU_798953)) $(eval $(call add_define,ERRATA_DSU_798953))

View File

@ -142,7 +142,8 @@ else
lib/cpus/aarch64/cortex_a65ae.S \ lib/cpus/aarch64/cortex_a65ae.S \
lib/cpus/aarch64/cortex_a78c.S \ lib/cpus/aarch64/cortex_a78c.S \
lib/cpus/aarch64/cortex_hayes.S \ lib/cpus/aarch64/cortex_hayes.S \
lib/cpus/aarch64/cortex_hunter.S lib/cpus/aarch64/cortex_hunter.S \
lib/cpus/aarch64/cortex_x2.S
endif endif
# AArch64/AArch32 cores # AArch64/AArch32 cores
FVP_CPU_LIBS += lib/cpus/aarch64/cortex_a55.S \ FVP_CPU_LIBS += lib/cpus/aarch64/cortex_a55.S \