errata: workaround for Cortex A78 errata 1821534

Cortex A78 erratum 1821534 is a Cat B erratum present in r0p0 and
r1p0 of the A78 processor core, it is fixed in r1p1.

SDEN can be found here:
https://documentation-service.arm.com/static/603e3733492bde1625aa8780

Signed-off-by: John Powell <john.powell@arm.com>
Change-Id: I71057c4b9625cd9edc1a06946b453cf16ae5ea2c
This commit is contained in:
johpow01 2021-04-30 18:08:52 -05:00 committed by bipin.ravi
parent 64b8db7e80
commit 1a691455d9
4 changed files with 63 additions and 17 deletions

View File

@ -275,6 +275,9 @@ For Cortex-A78, the following errata build flags are defined :
CPU. This needs to be enabled for revisions r1p0 and r1p1, r0p0 has the same CPU. This needs to be enabled for revisions r1p0 and r1p1, r0p0 has the same
issue but there is no workaround for that revision. issue but there is no workaround for that revision.
- ``ERRATA_A78_1821534``: This applies errata 1821534 workaround to Cortex-A78
CPU. This needs to be enabled for revisions r0p0 and r1p0.
For Neoverse N1, the following errata build flags are defined : For Neoverse N1, the following errata build flags are defined :
- ``ERRATA_N1_1073348``: This applies errata 1073348 workaround to Neoverse-N1 - ``ERRATA_N1_1073348``: This applies errata 1073348 workaround to Neoverse-N1

View File

@ -30,6 +30,7 @@
#define CORTEX_A78_ACTLR2_EL1 S3_0_C15_C1_1 #define CORTEX_A78_ACTLR2_EL1 S3_0_C15_C1_1
#define CORTEX_A78_ACTLR2_EL1_BIT_1 (ULL(1) << 1) #define CORTEX_A78_ACTLR2_EL1_BIT_1 (ULL(1) << 1)
#define CORTEX_A78_ACTLR2_EL1_BIT_2 (ULL(1) << 2)
/******************************************************************************* /*******************************************************************************
* CPU Activity Monitor Unit register specific definitions. * CPU Activity Monitor Unit register specific definitions.

View File

@ -44,13 +44,13 @@ func check_errata_1688305
b cpu_rev_var_ls b cpu_rev_var_ls
endfunc check_errata_1688305 endfunc check_errata_1688305
/* -------------------------------------------------- /* --------------------------------------------------
* Errata Workaround for Cortex A78 Errata #1941498. * Errata Workaround for Cortex A78 Errata #1941498.
* This applies to revisions r0p0, r1p0, and r1p1. * This applies to revisions r0p0, r1p0, and r1p1.
* x0: variant[4:7] and revision[0:3] of current cpu. * x0: variant[4:7] and revision[0:3] of current cpu.
* Shall clobber: x0-x17 * Shall clobber: x0-x17
* -------------------------------------------------- * --------------------------------------------------
*/ */
func errata_a78_1941498_wa func errata_a78_1941498_wa
/* Compare x0 against revision <= r1p1 */ /* Compare x0 against revision <= r1p1 */
mov x17, x30 mov x17, x30
@ -72,16 +72,16 @@ func check_errata_1941498
b cpu_rev_var_ls b cpu_rev_var_ls
endfunc check_errata_1941498 endfunc check_errata_1941498
/* -------------------------------------------------- /* --------------------------------------------------
* Errata Workaround for A78 Erratum 1951500. * Errata Workaround for A78 Erratum 1951500.
* This applies to revisions r1p0 and r1p1 of A78. * This applies to revisions r1p0 and r1p1 of A78.
* The issue also exists in r0p0 but there is no fix * The issue also exists in r0p0 but there is no fix
* in that revision. * in that revision.
* Inputs: * Inputs:
* x0: variant[4:7] and revision[0:3] of current cpu. * x0: variant[4:7] and revision[0:3] of current cpu.
* Shall clobber: x0-x17 * Shall clobber: x0-x17
* -------------------------------------------------- * --------------------------------------------------
*/ */
func errata_a78_1951500_wa func errata_a78_1951500_wa
/* Compare x0 against revisions r1p0 - r1p1 */ /* Compare x0 against revisions r1p0 - r1p1 */
mov x17, x30 mov x17, x30
@ -126,6 +126,34 @@ func check_errata_1951500
b cpu_rev_var_range b cpu_rev_var_range
endfunc check_errata_1951500 endfunc check_errata_1951500
/* --------------------------------------------------
* Errata Workaround for Cortex A78 Errata #1821534.
* This applies to revisions r0p0 and r1p0.
* x0: variant[4:7] and revision[0:3] of current cpu.
* Shall clobber: x0-x17
* --------------------------------------------------
*/
func errata_a78_1821534_wa
/* Check revision. */
mov x17, x30
bl check_errata_1821534
cbz x0, 1f
/* Set bit 2 in ACTLR2_EL1 */
mrs x1, CORTEX_A78_ACTLR2_EL1
orr x1, x1, #CORTEX_A78_ACTLR2_EL1_BIT_2
msr CORTEX_A78_ACTLR2_EL1, x1
isb
1:
ret x17
endfunc errata_a78_1821534_wa
func check_errata_1821534
/* Applies to r0p0 and r1p0 */
mov x1, #0x10
b cpu_rev_var_ls
endfunc check_errata_1821534
/* ------------------------------------------------- /* -------------------------------------------------
* The CPU Ops reset function for Cortex-A78 * The CPU Ops reset function for Cortex-A78
* ------------------------------------------------- * -------------------------------------------------
@ -150,6 +178,11 @@ func cortex_a78_reset_func
bl errata_a78_1951500_wa bl errata_a78_1951500_wa
#endif #endif
#if ERRATA_A78_1821534
mov x0, x18
bl errata_a78_1821534_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, actlr_el3 mrs x0, actlr_el3
@ -207,6 +240,7 @@ func cortex_a78_errata_report
report_errata ERRATA_A78_1688305, cortex_a78, 1688305 report_errata ERRATA_A78_1688305, cortex_a78, 1688305
report_errata ERRATA_A78_1941498, cortex_a78, 1941498 report_errata ERRATA_A78_1941498, cortex_a78, 1941498
report_errata ERRATA_A78_1951500, cortex_a78, 1951500 report_errata ERRATA_A78_1951500, cortex_a78, 1951500
report_errata ERRATA_A78_1821534, cortex_a78, 1821534
ldp x8, x30, [sp], #16 ldp x8, x30, [sp], #16
ret ret

View File

@ -307,6 +307,10 @@ ERRATA_A78_1941498 ?=0
# well but there is no workaround for that revision. # well but there is no workaround for that revision.
ERRATA_A78_1951500 ?=0 ERRATA_A78_1951500 ?=0
# Flag to apply erratum 1821534 workaround during reset. This erratum applies
# to revisions r0p0 and r1p0 of the A78 cpu.
ERRATA_A78_1821534 ?=0
# Flag to apply T32 CLREX workaround during reset. This erratum applies # Flag to apply T32 CLREX workaround during reset. This erratum applies
# only to r0p0 and r1p0 of the Neoverse N1 cpu. # only to r0p0 and r1p0 of the Neoverse N1 cpu.
ERRATA_N1_1043202 ?=0 ERRATA_N1_1043202 ?=0
@ -605,6 +609,10 @@ $(eval $(call add_define,ERRATA_A78_1941498))
$(eval $(call assert_boolean,ERRATA_A78_1951500)) $(eval $(call assert_boolean,ERRATA_A78_1951500))
$(eval $(call add_define,ERRATA_A78_1951500)) $(eval $(call add_define,ERRATA_A78_1951500))
# Process ERRATA_A78_1821534 flag
$(eval $(call assert_boolean,ERRATA_A78_1821534))
$(eval $(call add_define,ERRATA_A78_1821534))
# Process ERRATA_N1_1043202 flag # Process ERRATA_N1_1043202 flag
$(eval $(call assert_boolean,ERRATA_N1_1043202)) $(eval $(call assert_boolean,ERRATA_N1_1043202))
$(eval $(call add_define,ERRATA_N1_1043202)) $(eval $(call add_define,ERRATA_N1_1043202))