diff --git a/docs/design/cpu-specific-build-macros.rst b/docs/design/cpu-specific-build-macros.rst index c07a0aa16..534b1e8a8 100644 --- a/docs/design/cpu-specific-build-macros.rst +++ b/docs/design/cpu-specific-build-macros.rst @@ -566,6 +566,10 @@ For Neoverse N2, the following errata build flags are defined : CPU. This needs to be enabled for revision r0p0 of the CPU, it is fixed in r0p1. +- ``ERRATA_N2_2743089``: This applies errata 2743089 workaround to Neoverse-N2 + CPU. This needs to be enabled for revisions r0p0, r0p1 and r0p2. It is fixed + in r0p3. + For Cortex-X2, the following errata build flags are defined : - ``ERRATA_X2_2002765``: This applies errata 2002765 workaround to Cortex-X2 diff --git a/lib/cpus/aarch64/neoverse_n2.S b/lib/cpus/aarch64/neoverse_n2.S index 5861decbb..dbf5941e3 100644 --- a/lib/cpus/aarch64/neoverse_n2.S +++ b/lib/cpus/aarch64/neoverse_n2.S @@ -428,6 +428,30 @@ func check_errata_2388450 b cpu_rev_var_ls endfunc check_errata_2388450 +/* ------------------------------------------------------- + * Errata Workaround for Neoverse N2 Erratum 2743089. + * This applies to revisions <= r0p2 and is fixed in r0p3. + * x0: variant[4:7] and revision[0:3] of current cpu. + * Shall clobber: x0-x17 + * ------------------------------------------------------- + */ +func errata_n2_2743089_wa + mov x17, x30 + bl check_errata_2743089 + cbz x0, 1f + + /* dsb before isb of power down sequence */ + dsb sy +1: + ret x17 +endfunc errata_n2_2743089_wa + +func check_errata_2743089 + /* Applies to all revisions <= r0p2 */ + mov x1, #0x02 + b cpu_rev_var_ls +endfunc check_errata_2743089 + func check_errata_cve_2022_23960 #if WORKAROUND_CVE_2022_23960 mov x0, #ERRATA_APPLIES @@ -576,6 +600,12 @@ func neoverse_n2_core_pwr_dwn mrs x0, NEOVERSE_N2_CPUPWRCTLR_EL1 orr x0, x0, #NEOVERSE_N2_CORE_PWRDN_EN_BIT msr NEOVERSE_N2_CPUPWRCTLR_EL1, x0 +#if ERRATA_N2_2743089 + mov x15, x30 + bl cpu_get_rev_var + bl errata_n2_2743089_wa + mov x30, x15 +#endif /* ERRATA_N2_2743089 */ isb ret endfunc neoverse_n2_core_pwr_dwn @@ -607,6 +637,7 @@ func neoverse_n2_errata_report report_errata ERRATA_N2_2326639, neoverse_n2, 2326639 report_errata ERRATA_N2_2376738, neoverse_n2, 2376738 report_errata ERRATA_N2_2388450, neoverse_n2, 2388450 + report_errata ERRATA_N2_2743089, neoverse_n2, 2743089 report_errata WORKAROUND_CVE_2022_23960, neoverse_n2, cve_2022_23960 report_errata ERRATA_DSU_2313941, neoverse_n2, dsu_2313941 diff --git a/lib/cpus/cpu-ops.mk b/lib/cpus/cpu-ops.mk index 527a82f28..8768ff6a3 100644 --- a/lib/cpus/cpu-ops.mk +++ b/lib/cpus/cpu-ops.mk @@ -462,10 +462,6 @@ ERRATA_N1_1946160 ?=0 # applies to all revisions <= r4p1 of the Neoverse N1 cpu and is still open. ERRATA_N1_2743102 ?=0 -# Flag to apply erratum 2002655 workaround during reset. This erratum applies -# to revisions r0p0 of the Neoverse-N2 cpu, it is still open. -ERRATA_N2_2002655 ?=0 - # Flag to apply erratum 1618635 workaround during reset. This erratum applies # to revision r0p0 of the Neoverse V1 cpu and was fixed in the revision r1p0. ERRATA_V1_1618635 ?=0 @@ -577,6 +573,10 @@ ERRATA_A710_2371105 ?=0 # still open. ERRATA_A710_2768515 ?=0 +# Flag to apply erratum 2002655 workaround during reset. This erratum applies +# to revisions r0p0 of the Neoverse-N2 cpu, it is still open. +ERRATA_N2_2002655 ?=0 + # Flag to apply erratum 2067956 workaround during reset. This erratum applies # to revision r0p0 of the Neoverse N2 cpu and is still open. ERRATA_N2_2067956 ?=0 @@ -625,6 +625,10 @@ ERRATA_N2_2376738 ?=0 # to revision r0p0 of the Neoverse N2 cpu, it is fixed in r0p1. ERRATA_N2_2388450 ?=0 +# Flag to apply erratum 2743089 workaround during during powerdown. This erratum +# applies to all revisions <= r0p2 of the Neoverse N2 cpu, it is fixed in r0p3. +ERRATA_N2_2743089 ?=0 + # Flag to apply erratum 2002765 workaround during reset. This erratum applies # to revisions r0p0, r1p0, and r2p0 of the Cortex-X2 cpu and is still open. ERRATA_X2_2002765 ?=0 @@ -1109,10 +1113,6 @@ $(eval $(call add_define,ERRATA_N1_1946160)) # Process ERRATA_N1_2743102 flag $(eval $(call assert_boolean,ERRATA_N1_2743102)) $(eval $(call add_define,ERRATA_N1_2743102)) -# -# Process ERRATA_N2_2002655 flag -$(eval $(call assert_boolean,ERRATA_N2_2002655)) -$(eval $(call add_define,ERRATA_N2_2002655)) # Process ERRATA_V1_1618635 flag $(eval $(call assert_boolean,ERRATA_V1_1618635)) @@ -1222,6 +1222,10 @@ $(eval $(call add_define,ERRATA_A710_2371105)) $(eval $(call assert_boolean,ERRATA_A710_2768515)) $(eval $(call add_define,ERRATA_A710_2768515)) +# Process ERRATA_N2_2002655 flag +$(eval $(call assert_boolean,ERRATA_N2_2002655)) +$(eval $(call add_define,ERRATA_N2_2002655)) + # Process ERRATA_N2_2067956 flag $(eval $(call assert_boolean,ERRATA_N2_2067956)) $(eval $(call add_define,ERRATA_N2_2067956)) @@ -1270,6 +1274,10 @@ $(eval $(call add_define,ERRATA_N2_2376738)) $(eval $(call assert_boolean,ERRATA_N2_2388450)) $(eval $(call add_define,ERRATA_N2_2388450)) +# Process ERRATA_N2_2743089 flag +$(eval $(call assert_boolean,ERRATA_N2_2743089)) +$(eval $(call add_define,ERRATA_N2_2743089)) + # Process ERRATA_X2_2002765 flag $(eval $(call assert_boolean,ERRATA_X2_2002765)) $(eval $(call add_define,ERRATA_X2_2002765))