fix(errata): workaround for Cortex-A77 erratum 2356587

Cortex-A77 erratum 2356587 is a cat B erratum that applies to revisions
r0p0 - r1p1 and is still open. The workaround is to set bit[0] of
CPUACTLR2_EL1 to force PLDW/PFRM ST to behave like PLD/PRFM LD and not
cause invalidations to other PE caches.

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

Signed-off-by: Bipin Ravi <bipin.ravi@arm.com>
Change-Id: I243cfd587bca06ffd2a7be5bce28f8d2c5e68230
This commit is contained in:
Bipin Ravi 2022-06-08 15:27:00 -05:00
parent 65a5e1c04d
commit 7bf1a7aaaa
4 changed files with 46 additions and 0 deletions

View file

@ -270,6 +270,9 @@ For Cortex-A77, the following errata build flags are defined :
- ``ERRATA_A77_1791578``: This applies errata 1791578 workaround to Cortex-A77 - ``ERRATA_A77_1791578``: This applies errata 1791578 workaround to Cortex-A77
CPU. This needs to be enabled for r0p0, r1p0, and r1p1, it is still open. CPU. This needs to be enabled for r0p0, r1p0, and r1p1, it is still open.
- ``ERRATA_A77_2356587``: This applies errata 2356587 workaround to Cortex-A77
CPU. This needs to be enabled for r0p0, r1p0, and r1p1, it is still open.
For Cortex-A78, the following errata build flags are defined : For Cortex-A78, the following errata build flags are defined :
- ``ERRATA_A78_1688305``: This applies errata 1688305 workaround to Cortex-A78 - ``ERRATA_A78_1688305``: This applies errata 1688305 workaround to Cortex-A78

View file

@ -32,6 +32,7 @@
******************************************************************************/ ******************************************************************************/
#define CORTEX_A77_ACTLR2_EL1 S3_0_C15_C1_1 #define CORTEX_A77_ACTLR2_EL1 S3_0_C15_C1_1
#define CORTEX_A77_ACTLR2_EL1_BIT_2 (ULL(1) << 2) #define CORTEX_A77_ACTLR2_EL1_BIT_2 (ULL(1) << 2)
#define CORTEX_A77_ACTLR2_EL1_BIT_0 ULL(1)
#define CORTEX_A77_CPUPSELR_EL3 S3_6_C15_C8_0 #define CORTEX_A77_CPUPSELR_EL3 S3_6_C15_C8_0
#define CORTEX_A77_CPUPCR_EL3 S3_6_C15_C8_1 #define CORTEX_A77_CPUPCR_EL3 S3_6_C15_C8_1

View file

@ -199,6 +199,34 @@ func check_errata_1791578
b cpu_rev_var_ls b cpu_rev_var_ls
endfunc check_errata_1791578 endfunc check_errata_1791578
/* --------------------------------------------------
* Errata Workaround for Cortex A77 Errata #2356587.
* This applies to revisions r0p0, r1p0, and r1p1 and is still open.
* x0: variant[4:7] and revision[0:3] of current cpu.
* Shall clobber: x0-x17
* --------------------------------------------------
*/
func errata_a77_2356587_wa
/* Check workaround compatibility. */
mov x17, x30
bl check_errata_2356587
cbz x0, 1f
/* Set bit 0 in ACTLR2_EL1 */
mrs x1, CORTEX_A77_ACTLR2_EL1
orr x1, x1, #CORTEX_A77_ACTLR2_EL1_BIT_0
msr CORTEX_A77_ACTLR2_EL1, x1
isb
1:
ret x17
endfunc errata_a77_2356587_wa
func check_errata_2356587
/* Applies to r0p0, r1p0, and r1p1 right now */
mov x1, #0x11
b cpu_rev_var_ls
endfunc check_errata_2356587
func check_errata_cve_2022_23960 func check_errata_cve_2022_23960
#if WORKAROUND_CVE_2022_23960 #if WORKAROUND_CVE_2022_23960
mov x0, #ERRATA_APPLIES mov x0, #ERRATA_APPLIES
@ -238,6 +266,11 @@ func cortex_a77_reset_func
bl errata_a77_1791578_wa bl errata_a77_1791578_wa
#endif #endif
#if ERRATA_A77_2356587
mov x0, x18
bl errata_a77_2356587_wa
#endif
#if IMAGE_BL31 && WORKAROUND_CVE_2022_23960 #if IMAGE_BL31 && WORKAROUND_CVE_2022_23960
/* /*
* The Cortex-A77 generic vectors are overridden to apply errata * The Cortex-A77 generic vectors are overridden to apply errata
@ -285,6 +318,7 @@ func cortex_a77_errata_report
report_errata ERRATA_A77_1925769, cortex_a77, 1925769 report_errata ERRATA_A77_1925769, cortex_a77, 1925769
report_errata ERRATA_A77_1946167, cortex_a77, 1946167 report_errata ERRATA_A77_1946167, cortex_a77, 1946167
report_errata ERRATA_A77_1791578, cortex_a77, 1791578 report_errata ERRATA_A77_1791578, cortex_a77, 1791578
report_errata ERRATA_A77_2356587, cortex_a77, 2356587
report_errata WORKAROUND_CVE_2022_23960, cortex_a77, cve_2022_23960 report_errata WORKAROUND_CVE_2022_23960, cortex_a77, cve_2022_23960
ldp x8, x30, [sp], #16 ldp x8, x30, [sp], #16

View file

@ -303,6 +303,10 @@ ERRATA_A77_1946167 ?=0
# to revisions r0p0, r1p0, and r1p1, it is still open. # to revisions r0p0, r1p0, and r1p1, it is still open.
ERRATA_A77_1791578 ?=0 ERRATA_A77_1791578 ?=0
# Flag to apply erratum 2356587 workaround during reset. This erratum applies
# to revisions r0p0, r1p0, and r1p1, it is still open.
ERRATA_A77_2356587 ?=0
# Flag to apply erratum 1688305 workaround during reset. This erratum applies # Flag to apply erratum 1688305 workaround during reset. This erratum applies
# to revisions r0p0 - r1p0 of the A78 cpu. # to revisions r0p0 - r1p0 of the A78 cpu.
ERRATA_A78_1688305 ?=0 ERRATA_A78_1688305 ?=0
@ -843,6 +847,10 @@ $(eval $(call add_define,ERRATA_A77_1946167))
$(eval $(call assert_boolean,ERRATA_A77_1791578)) $(eval $(call assert_boolean,ERRATA_A77_1791578))
$(eval $(call add_define,ERRATA_A77_1791578)) $(eval $(call add_define,ERRATA_A77_1791578))
# Process ERRATA_A77_2356587 flag
$(eval $(call assert_boolean,ERRATA_A77_2356587))
$(eval $(call add_define,ERRATA_A77_2356587))
# Process ERRATA_A78_1688305 flag # Process ERRATA_A78_1688305 flag
$(eval $(call assert_boolean,ERRATA_A78_1688305)) $(eval $(call assert_boolean,ERRATA_A78_1688305))
$(eval $(call add_define,ERRATA_A78_1688305)) $(eval $(call add_define,ERRATA_A78_1688305))