diff --git a/docs/design/cpu-specific-build-macros.rst b/docs/design/cpu-specific-build-macros.rst index f88992eef..2b9e2b23d 100644 --- a/docs/design/cpu-specific-build-macros.rst +++ b/docs/design/cpu-specific-build-macros.rst @@ -536,6 +536,10 @@ For Neoverse V2, the following errata build flags are defined : CPU. This needs to be enabled for revisions r0p0 and r0p1. It is fixed in r0p2. +- ``ERRATA_V2_2779510``: This applies errata 2779510 workaround to Neoverse-V2 + CPU. This needs to be enabled for revisions r0p0 and r0p1. It is fixed in + r0p2. + - ``ERRATA_V2_2801372``: This applies errata 2801372 workaround to Neoverse-V2 CPU, this affects all configurations. This needs to be enabled for revisions r0p0 and r0p1. It has been fixed in r0p2. diff --git a/include/lib/cpus/aarch64/neoverse_v2.h b/include/lib/cpus/aarch64/neoverse_v2.h index 2adddb6b6..5b06c0682 100644 --- a/include/lib/cpus/aarch64/neoverse_v2.h +++ b/include/lib/cpus/aarch64/neoverse_v2.h @@ -37,4 +37,10 @@ #define NEOVERSE_V2_CPUACTLR2_EL1 S3_0_C15_C1_1 #define NEOVERSE_V2_CPUACTLR2_EL1_BIT_0 (ULL(1) << 0) +/******************************************************************************* + * CPU Auxiliary Control register 3 specific definitions. + ******************************************************************************/ +#define NEOVERSE_V2_CPUACTLR3_EL1 S3_0_C15_C1_2 +#define NEOVERSE_V2_CPUACTLR3_EL1_BIT_47 (ULL(1) << 47) + #endif /* NEOVERSE_V2_H */ diff --git a/lib/cpus/aarch64/neoverse_v2.S b/lib/cpus/aarch64/neoverse_v2.S index 6c4adb12e..cde4032a8 100644 --- a/lib/cpus/aarch64/neoverse_v2.S +++ b/lib/cpus/aarch64/neoverse_v2.S @@ -35,6 +35,12 @@ workaround_reset_end neoverse_v2, ERRATUM(2719105) check_erratum_ls neoverse_v2, ERRATUM(2719105), CPU_REV(0, 1) +workaround_reset_start neoverse_v2, ERRATUM(2779510), ERRATA_V2_2779510 + sysreg_bit_set NEOVERSE_V2_CPUACTLR3_EL1, NEOVERSE_V2_CPUACTLR3_EL1_BIT_47 +workaround_reset_end neoverse_v2, ERRATUM(2779510) + +check_erratum_ls neoverse_v2, ERRATUM(2779510), CPU_REV(0, 1) + workaround_runtime_start neoverse_v2, ERRATUM(2801372), ERRATA_V2_2801372 /* dsb before isb of power down sequence */ dsb sy diff --git a/lib/cpus/cpu-ops.mk b/lib/cpus/cpu-ops.mk index 977e3aaef..42d905877 100644 --- a/lib/cpus/cpu-ops.mk +++ b/lib/cpus/cpu-ops.mk @@ -798,6 +798,10 @@ CPU_FLAG_LIST += ERRATA_V2_2719103 # to revisions r0p0 and r0p1. It is fixed in r0p2. CPU_FLAG_LIST += ERRATA_V2_2719105 +# Flag to apply erratum 2779510 workaround during reset. This erratum applies +# to revisions r0p0 and r0p1. It is fixed in r0p2. +CPU_FLAG_LIST += ERRATA_V2_2779510 + # Flag to apply erratum 2801372 workaround for all configurations. # This erratum applies to revisions r0p0, r0p1. Fixed in r0p2. CPU_FLAG_LIST += ERRATA_V2_2801372 diff --git a/services/std_svc/errata_abi/errata_abi_main.c b/services/std_svc/errata_abi/errata_abi_main.c index 7d2c4042e..25dc8f92f 100644 --- a/services/std_svc/errata_abi/errata_abi_main.c +++ b/services/std_svc/errata_abi/errata_abi_main.c @@ -403,8 +403,9 @@ struct em_cpu_list cpu_list[] = { [1] = {2719103, 0x00, 0x01, ERRATA_V2_2719103, \ ERRATA_NON_ARM_INTERCONNECT}, [2] = {2719105, 0x00, 0x01, ERRATA_V2_2719105}, - [3] = {2801372, 0x00, 0x01, ERRATA_V2_2801372}, - [4 ... ERRATA_LIST_END] = UNDEF_ERRATA, + [3] = {2779510, 0x00, 0x01, ERRATA_V2_2779510}, + [4] = {2801372, 0x00, 0x01, ERRATA_V2_2801372}, + [5 ... ERRATA_LIST_END] = UNDEF_ERRATA, } }, #endif /* NEOVERSE_V2_H_INC */