fix(errata): workaround for Neoverse-N2 erratum 2138958

Neoverse-N2 erratum 2138958 is a Cat B erratum that applies to
revision r0p0 of CPU. It is still open. The workaround
is to set CPUACTLR5_EL1[13] to 1'b1.

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

Signed-off-by: nayanpatel-arm <nayankumar.patel@arm.com>
Change-Id: I5247f8f8eef08d38c169aad6d2c5501ac387c720
This commit is contained in:
nayanpatel-arm 2021-10-20 18:28:58 -07:00 committed by nayankumar.patel
parent 5819e23bc4
commit c948185c97
4 changed files with 46 additions and 0 deletions

View File

@ -423,6 +423,9 @@ For Neoverse N2, the following errata build flags are defined :
- ``ERRATA_N2_2242415``: This applies errata 2242415 workaround to Neoverse-N2 - ``ERRATA_N2_2242415``: This applies errata 2242415 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.
- ``ERRATA_N2_2138958``: This applies errata 2138958 workaround to Neoverse-N2
CPU. This needs to be enabled for revision r0p0 of the CPU and is still open.
DSU Errata Workarounds DSU Errata Workarounds
---------------------- ----------------------

View File

@ -41,6 +41,7 @@
******************************************************************************/ ******************************************************************************/
#define NEOVERSE_N2_CPUACTLR5_EL1 S3_0_C15_C8_0 #define NEOVERSE_N2_CPUACTLR5_EL1 S3_0_C15_C8_0
#define NEOVERSE_N2_CPUACTLR5_EL1_BIT_44 (ULL(1) << 44) #define NEOVERSE_N2_CPUACTLR5_EL1_BIT_44 (ULL(1) << 44)
#define NEOVERSE_N2_CPUACTLR5_EL1_BIT_13 (ULL(1) << 13)
/******************************************************************************* /*******************************************************************************
* CPU Auxiliary Control register specific definitions. * CPU Auxiliary Control register specific definitions.

View File

@ -240,6 +240,34 @@ func check_errata_2138953
b cpu_rev_var_ls b cpu_rev_var_ls
endfunc check_errata_2138953 endfunc check_errata_2138953
/* --------------------------------------------------
* Errata Workaround for Neoverse N2 Erratum 2138958.
* This applies to revision r0p0 of Neoverse N2. it is still open.
* Inputs:
* x0: variant[4:7] and revision[0:3] of current cpu.
* Shall clobber: x0-x1, x17
* --------------------------------------------------
*/
func errata_n2_2138958_wa
/* Check revision. */
mov x17, x30
bl check_errata_2138958
cbz x0, 1f
/* Apply instruction patching sequence */
mrs x1, NEOVERSE_N2_CPUACTLR5_EL1
orr x1, x1, NEOVERSE_N2_CPUACTLR5_EL1_BIT_13
msr NEOVERSE_N2_CPUACTLR5_EL1, x1
1:
ret x17
endfunc errata_n2_2138958_wa
func check_errata_2138958
/* Applies to r0p0 */
mov x1, #0x00
b cpu_rev_var_ls
endfunc check_errata_2138958
/* ------------------------------------------- /* -------------------------------------------
* The CPU Ops reset function for Neoverse N2. * The CPU Ops reset function for Neoverse N2.
* ------------------------------------------- * -------------------------------------------
@ -291,6 +319,11 @@ func neoverse_n2_reset_func
bl errata_n2_2242415_wa bl errata_n2_2242415_wa
#endif #endif
#if ERRATA_N2_2138958
mov x0, x18
bl errata_n2_2138958_wa
#endif
#if ENABLE_AMU #if ENABLE_AMU
/* Make sure accesses from EL0/EL1 and EL2 are not trapped to EL3 */ /* Make sure accesses from EL0/EL1 and EL2 are not trapped to EL3 */
mrs x0, cptr_el3 mrs x0, cptr_el3
@ -358,6 +391,7 @@ func neoverse_n2_errata_report
report_errata ERRATA_N2_2138956, neoverse_n2, 2138956 report_errata ERRATA_N2_2138956, neoverse_n2, 2138956
report_errata ERRATA_N2_2138953, neoverse_n2, 2138953 report_errata ERRATA_N2_2138953, neoverse_n2, 2138953
report_errata ERRATA_N2_2242415, neoverse_n2, 2242415 report_errata ERRATA_N2_2242415, neoverse_n2, 2242415
report_errata ERRATA_N2_2138958, neoverse_n2, 2138958
ldp x8, x30, [sp], #16 ldp x8, x30, [sp], #16
ret ret

View File

@ -465,6 +465,10 @@ ERRATA_N2_2138953 ?=0
# to revision r0p0 of the Neoverse N2 cpu and is still open. # to revision r0p0 of the Neoverse N2 cpu and is still open.
ERRATA_N2_2242415 ?=0 ERRATA_N2_2242415 ?=0
# Flag to apply erratum 2138958 workaround during reset. This erratum applies
# to revision r0p0 of the Neoverse N2 cpu and is still open.
ERRATA_N2_2138958 ?=0
# Flag to apply erratum 2055002 workaround during reset. This erratum applies # Flag to apply erratum 2055002 workaround during reset. This erratum applies
# to revision r1p0, r2p0 of the Cortex-A710 cpu and is still open. # to revision r1p0, r2p0 of the Cortex-A710 cpu and is still open.
ERRATA_A710_2055002 ?=0 ERRATA_A710_2055002 ?=0
@ -870,6 +874,10 @@ $(eval $(call add_define,ERRATA_N2_2138953))
$(eval $(call assert_boolean,ERRATA_N2_2242415)) $(eval $(call assert_boolean,ERRATA_N2_2242415))
$(eval $(call add_define,ERRATA_N2_2242415)) $(eval $(call add_define,ERRATA_N2_2242415))
# Process ERRATA_N2_2138958 flag
$(eval $(call assert_boolean,ERRATA_N2_2138958))
$(eval $(call add_define,ERRATA_N2_2138958))
# Process ERRATA_A710_2055002 flag # Process ERRATA_A710_2055002 flag
$(eval $(call assert_boolean,ERRATA_A710_2055002)) $(eval $(call assert_boolean,ERRATA_A710_2055002))
$(eval $(call add_define,ERRATA_A710_2055002)) $(eval $(call add_define,ERRATA_A710_2055002))