Mian Yousaf Kaukab b414d7
From: Suzuki K Poulose <suzuki.poulose@arm.com>
Mian Yousaf Kaukab b414d7
Date: Tue, 19 Oct 2021 17:31:41 +0100
Mian Yousaf Kaukab b414d7
Subject: arm64: errata: Add workaround for TSB flush failures
Mian Yousaf Kaukab b414d7
Mian Yousaf Kaukab b414d7
Git-commit: fa82d0b4b833790ac4572377fb777dcea24a9d69
Mian Yousaf Kaukab b414d7
Patch-mainline: v5.16-rc1
Mian Yousaf Kaukab b414d7
References: jsc#SLE-19046
Mian Yousaf Kaukab b414d7
Mian Yousaf Kaukab b414d7
Arm Neoverse-N2 (#2067961) and Cortex-A710 (#2054223) suffers
Mian Yousaf Kaukab b414d7
from errata, where a TSB (trace synchronization barrier)
Mian Yousaf Kaukab b414d7
fails to flush the trace data completely, when executed from
Mian Yousaf Kaukab b414d7
a trace prohibited region. In Linux we always execute it
Mian Yousaf Kaukab b414d7
after we have moved the PE to trace prohibited region. So,
Mian Yousaf Kaukab b414d7
we can apply the workaround every time a TSB is executed.
Mian Yousaf Kaukab b414d7
Mian Yousaf Kaukab b414d7
The work around is to issue two TSB consecutively.
Mian Yousaf Kaukab b414d7
Mian Yousaf Kaukab b414d7
NOTE: This errata is defined as LOCAL_CPU_ERRATUM, implying
Mian Yousaf Kaukab b414d7
that a late CPU could be blocked from booting if it is the
Mian Yousaf Kaukab b414d7
first CPU that requires the workaround. This is because we
Mian Yousaf Kaukab b414d7
do not allow setting a cpu_hwcaps after the SMP boot. The
Mian Yousaf Kaukab b414d7
other alternative is to use "this_cpu_has_cap()" instead
Mian Yousaf Kaukab b414d7
of the faster system wide check, which may be a bit of an
Mian Yousaf Kaukab b414d7
overhead, given we may have to do this in nvhe KVM host
Mian Yousaf Kaukab b414d7
before a guest entry.
Mian Yousaf Kaukab b414d7
Mian Yousaf Kaukab b414d7
Cc: Will Deacon <will@kernel.org>
Mian Yousaf Kaukab b414d7
Cc: Catalin Marinas <catalin.marinas@arm.com>
Mian Yousaf Kaukab b414d7
Cc: Mathieu Poirier <mathieu.poirier@linaro.org>
Mian Yousaf Kaukab b414d7
Cc: Mike Leach <mike.leach@linaro.org>
Mian Yousaf Kaukab b414d7
Cc: Mark Rutland <mark.rutland@arm.com>
Mian Yousaf Kaukab b414d7
Cc: Anshuman Khandual <anshuman.khandual@arm.com>
Mian Yousaf Kaukab b414d7
Cc: Marc Zyngier <maz@kernel.org>
Mian Yousaf Kaukab b414d7
Acked-by: Catalin Marinas <catalin.marinas@arm.com>
Mian Yousaf Kaukab b414d7
Reviewed-by: Mathieu Poirier <mathieu.poirier@linaro.org>
Mian Yousaf Kaukab b414d7
Reviewed-by: Anshuman Khandual <anshuman.khandual@arm.com>
Mian Yousaf Kaukab b414d7
Signed-off-by: Suzuki K Poulose <suzuki.poulose@arm.com>
Mian Yousaf Kaukab b414d7
Link: https://lore.kernel.org/r/20211019163153.3692640-4-suzuki.poulose@arm.com
Mian Yousaf Kaukab b414d7
Signed-off-by: Will Deacon <will@kernel.org>
Mian Yousaf Kaukab b414d7
Signed-off-by: Mian Yousaf Kaukab <ykaukab@suse.de>
Mian Yousaf Kaukab b414d7
---
Mian Yousaf Kaukab b414d7
 Documentation/arm64/silicon-errata.rst |  4 ++++
Mian Yousaf Kaukab b414d7
 arch/arm64/Kconfig                     | 33 ++++++++++++++++++++++++++
Mian Yousaf Kaukab b414d7
 arch/arm64/include/asm/barrier.h       | 16 ++++++++++++-
Mian Yousaf Kaukab b414d7
 arch/arm64/kernel/cpu_errata.c         | 19 +++++++++++++++
Mian Yousaf Kaukab b414d7
 arch/arm64/tools/cpucaps               |  1 +
Mian Yousaf Kaukab b414d7
 5 files changed, 72 insertions(+), 1 deletion(-)
Mian Yousaf Kaukab b414d7
Mian Yousaf Kaukab b414d7
diff --git a/Documentation/arm64/silicon-errata.rst b/Documentation/arm64/silicon-errata.rst
Mian Yousaf Kaukab b414d7
index 2f99229d993c..569a92411dcd 100644
Mian Yousaf Kaukab b414d7
--- a/Documentation/arm64/silicon-errata.rst
Mian Yousaf Kaukab b414d7
+++ b/Documentation/arm64/silicon-errata.rst
Mian Yousaf Kaukab b414d7
@@ -94,6 +94,8 @@ stable kernels.
Mian Yousaf Kaukab b414d7
 +----------------+-----------------+-----------------+-----------------------------+
Mian Yousaf Kaukab b414d7
 | ARM            | Cortex-A710     | #2119858        | ARM64_ERRATUM_2119858       |
Mian Yousaf Kaukab b414d7
 +----------------+-----------------+-----------------+-----------------------------+
Mian Yousaf Kaukab b414d7
+| ARM            | Cortex-A710     | #2054223        | ARM64_ERRATUM_2054223       |
Mian Yousaf Kaukab b414d7
++----------------+-----------------+-----------------+-----------------------------+
Mian Yousaf Kaukab b414d7
 | ARM            | Neoverse-N1     | #1188873,1418040| ARM64_ERRATUM_1418040       |
Mian Yousaf Kaukab b414d7
 +----------------+-----------------+-----------------+-----------------------------+
Mian Yousaf Kaukab b414d7
 | ARM            | Neoverse-N1     | #1349291        | N/A                         |
Mian Yousaf Kaukab b414d7
@@ -102,6 +104,8 @@ stable kernels.
Mian Yousaf Kaukab b414d7
 +----------------+-----------------+-----------------+-----------------------------+
Mian Yousaf Kaukab b414d7
 | ARM            | Neoverse-N2     | #2139208        | ARM64_ERRATUM_2139208       |
Mian Yousaf Kaukab b414d7
 +----------------+-----------------+-----------------+-----------------------------+
Mian Yousaf Kaukab b414d7
+| ARM            | Neoverse-N2     | #2067961        | ARM64_ERRATUM_2067961       |
Mian Yousaf Kaukab b414d7
++----------------+-----------------+-----------------+-----------------------------+
Mian Yousaf Kaukab b414d7
 | ARM            | MMU-500         | #841119,826419  | N/A                         |
Mian Yousaf Kaukab b414d7
 +----------------+-----------------+-----------------+-----------------------------+
Mian Yousaf Kaukab b414d7
 +----------------+-----------------+-----------------+-----------------------------+
Mian Yousaf Kaukab b414d7
diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig
Mian Yousaf Kaukab b414d7
index 26bd128935bc..ec3bb346957f 100644
Mian Yousaf Kaukab b414d7
--- a/arch/arm64/Kconfig
Mian Yousaf Kaukab b414d7
+++ b/arch/arm64/Kconfig
Mian Yousaf Kaukab b414d7
@@ -707,6 +707,39 @@ config ARM64_ERRATUM_2139208
Mian Yousaf Kaukab b414d7
 
Mian Yousaf Kaukab b414d7
 	  If unsure, say Y.
Mian Yousaf Kaukab b414d7
 
Mian Yousaf Kaukab b414d7
+config ARM64_WORKAROUND_TSB_FLUSH_FAILURE
Mian Yousaf Kaukab b414d7
+	bool
Mian Yousaf Kaukab b414d7
+
Mian Yousaf Kaukab b414d7
+config ARM64_ERRATUM_2054223
Mian Yousaf Kaukab b414d7
+	bool "Cortex-A710: 2054223: workaround TSB instruction failing to flush trace"
Mian Yousaf Kaukab b414d7
+	default y
Mian Yousaf Kaukab b414d7
+	select ARM64_WORKAROUND_TSB_FLUSH_FAILURE
Mian Yousaf Kaukab b414d7
+	help
Mian Yousaf Kaukab b414d7
+	  Enable workaround for ARM Cortex-A710 erratum 2054223
Mian Yousaf Kaukab b414d7
+
Mian Yousaf Kaukab b414d7
+	  Affected cores may fail to flush the trace data on a TSB instruction, when
Mian Yousaf Kaukab b414d7
+	  the PE is in trace prohibited state. This will cause losing a few bytes
Mian Yousaf Kaukab b414d7
+	  of the trace cached.
Mian Yousaf Kaukab b414d7
+
Mian Yousaf Kaukab b414d7
+	  Workaround is to issue two TSB consecutively on affected cores.
Mian Yousaf Kaukab b414d7
+
Mian Yousaf Kaukab b414d7
+	  If unsure, say Y.
Mian Yousaf Kaukab b414d7
+
Mian Yousaf Kaukab b414d7
+config ARM64_ERRATUM_2067961
Mian Yousaf Kaukab b414d7
+	bool "Neoverse-N2: 2067961: workaround TSB instruction failing to flush trace"
Mian Yousaf Kaukab b414d7
+	default y
Mian Yousaf Kaukab b414d7
+	select ARM64_WORKAROUND_TSB_FLUSH_FAILURE
Mian Yousaf Kaukab b414d7
+	help
Mian Yousaf Kaukab b414d7
+	  Enable workaround for ARM Neoverse-N2 erratum 2067961
Mian Yousaf Kaukab b414d7
+
Mian Yousaf Kaukab b414d7
+	  Affected cores may fail to flush the trace data on a TSB instruction, when
Mian Yousaf Kaukab b414d7
+	  the PE is in trace prohibited state. This will cause losing a few bytes
Mian Yousaf Kaukab b414d7
+	  of the trace cached.
Mian Yousaf Kaukab b414d7
+
Mian Yousaf Kaukab b414d7
+	  Workaround is to issue two TSB consecutively on affected cores.
Mian Yousaf Kaukab b414d7
+
Mian Yousaf Kaukab b414d7
+	  If unsure, say Y.
Mian Yousaf Kaukab b414d7
+
Mian Yousaf Kaukab b414d7
 config CAVIUM_ERRATUM_22375
Mian Yousaf Kaukab b414d7
 	bool "Cavium erratum 22375, 24313"
Mian Yousaf Kaukab b414d7
 	default y
Mian Yousaf Kaukab b414d7
diff --git a/arch/arm64/include/asm/barrier.h b/arch/arm64/include/asm/barrier.h
Mian Yousaf Kaukab b414d7
index 451e11e5fd23..1c5a00598458 100644
Mian Yousaf Kaukab b414d7
--- a/arch/arm64/include/asm/barrier.h
Mian Yousaf Kaukab b414d7
+++ b/arch/arm64/include/asm/barrier.h
Mian Yousaf Kaukab b414d7
@@ -23,7 +23,7 @@
Mian Yousaf Kaukab b414d7
 #define dsb(opt)	asm volatile("dsb " #opt : : : "memory")
Mian Yousaf Kaukab b414d7
 
Mian Yousaf Kaukab b414d7
 #define psb_csync()	asm volatile("hint #17" : : : "memory")
Mian Yousaf Kaukab b414d7
-#define tsb_csync()	asm volatile("hint #18" : : : "memory")
Mian Yousaf Kaukab b414d7
+#define __tsb_csync()	asm volatile("hint #18" : : : "memory")
Mian Yousaf Kaukab b414d7
 #define csdb()		asm volatile("hint #20" : : : "memory")
Mian Yousaf Kaukab b414d7
 
Mian Yousaf Kaukab b414d7
 #ifdef CONFIG_ARM64_PSEUDO_NMI
Mian Yousaf Kaukab b414d7
@@ -46,6 +46,20 @@
Mian Yousaf Kaukab b414d7
 #define dma_rmb()	dmb(oshld)
Mian Yousaf Kaukab b414d7
 #define dma_wmb()	dmb(oshst)
Mian Yousaf Kaukab b414d7
 
Mian Yousaf Kaukab b414d7
+
Mian Yousaf Kaukab b414d7
+#define tsb_csync()								\
Mian Yousaf Kaukab b414d7
+	do {									\
Mian Yousaf Kaukab b414d7
+		/*								\
Mian Yousaf Kaukab b414d7
+		 * CPUs affected by Arm Erratum 2054223 or 2067961 needs	\
Mian Yousaf Kaukab b414d7
+		 * another TSB to ensure the trace is flushed. The barriers	\
Mian Yousaf Kaukab b414d7
+		 * don't have to be strictly back to back, as long as the	\
Mian Yousaf Kaukab b414d7
+		 * CPU is in trace prohibited state.				\
Mian Yousaf Kaukab b414d7
+		 */								\
Mian Yousaf Kaukab b414d7
+		if (cpus_have_final_cap(ARM64_WORKAROUND_TSB_FLUSH_FAILURE))	\
Mian Yousaf Kaukab b414d7
+			__tsb_csync();						\
Mian Yousaf Kaukab b414d7
+		__tsb_csync();							\
Mian Yousaf Kaukab b414d7
+	} while (0)
Mian Yousaf Kaukab b414d7
+
Mian Yousaf Kaukab b414d7
 /*
Mian Yousaf Kaukab b414d7
  * Generate a mask for array_index__nospec() that is ~0UL when 0 <= idx < sz
Mian Yousaf Kaukab b414d7
  * and 0 otherwise.
Mian Yousaf Kaukab b414d7
diff --git a/arch/arm64/kernel/cpu_errata.c b/arch/arm64/kernel/cpu_errata.c
Mian Yousaf Kaukab b414d7
index ccd757373f36..aaa66c9eee24 100644
Mian Yousaf Kaukab b414d7
--- a/arch/arm64/kernel/cpu_errata.c
Mian Yousaf Kaukab b414d7
+++ b/arch/arm64/kernel/cpu_errata.c
Mian Yousaf Kaukab b414d7
@@ -352,6 +352,18 @@ static const struct midr_range trbe_overwrite_fill_mode_cpus[] = {
Mian Yousaf Kaukab b414d7
 };
Mian Yousaf Kaukab b414d7
 #endif	/* CONFIG_ARM64_WORKAROUND_TRBE_OVERWRITE_FILL_MODE */
Mian Yousaf Kaukab b414d7
 
Mian Yousaf Kaukab b414d7
+#ifdef CONFIG_ARM64_WORKAROUND_TSB_FLUSH_FAILURE
Mian Yousaf Kaukab b414d7
+static const struct midr_range tsb_flush_fail_cpus[] = {
Mian Yousaf Kaukab b414d7
+#ifdef CONFIG_ARM64_ERRATUM_2067961
Mian Yousaf Kaukab b414d7
+	MIDR_ALL_VERSIONS(MIDR_NEOVERSE_N2),
Mian Yousaf Kaukab b414d7
+#endif
Mian Yousaf Kaukab b414d7
+#ifdef CONFIG_ARM64_ERRATUM_2054223
Mian Yousaf Kaukab b414d7
+	MIDR_ALL_VERSIONS(MIDR_CORTEX_A710),
Mian Yousaf Kaukab b414d7
+#endif
Mian Yousaf Kaukab b414d7
+	{},
Mian Yousaf Kaukab b414d7
+};
Mian Yousaf Kaukab b414d7
+#endif	/* CONFIG_ARM64_WORKAROUND_TSB_FLUSH_FAILURE */
Mian Yousaf Kaukab b414d7
+
Mian Yousaf Kaukab b414d7
 const struct arm64_cpu_capabilities arm64_errata[] = {
Mian Yousaf Kaukab b414d7
 #ifdef CONFIG_ARM64_WORKAROUND_CLEAN_CACHE
Mian Yousaf Kaukab b414d7
 	{
Mian Yousaf Kaukab b414d7
@@ -558,6 +570,13 @@ const struct arm64_cpu_capabilities arm64_errata[] = {
Mian Yousaf Kaukab b414d7
 		.type = ARM64_CPUCAP_WEAK_LOCAL_CPU_FEATURE,
Mian Yousaf Kaukab b414d7
 		CAP_MIDR_RANGE_LIST(trbe_overwrite_fill_mode_cpus),
Mian Yousaf Kaukab b414d7
 	},
Mian Yousaf Kaukab b414d7
+#endif
Mian Yousaf Kaukab b414d7
+#ifdef CONFIG_ARM64_WORKAROUND_TSB_FLUSH_FAILURE
Mian Yousaf Kaukab b414d7
+	{
Mian Yousaf Kaukab b414d7
+		.desc = "ARM erratum 2067961 or 2054223",
Mian Yousaf Kaukab b414d7
+		.capability = ARM64_WORKAROUND_TSB_FLUSH_FAILURE,
Mian Yousaf Kaukab b414d7
+		ERRATA_MIDR_RANGE_LIST(tsb_flush_fail_cpus),
Mian Yousaf Kaukab b414d7
+	},
Mian Yousaf Kaukab b414d7
 #endif
Mian Yousaf Kaukab b414d7
 	{
Mian Yousaf Kaukab b414d7
 	}
Mian Yousaf Kaukab b414d7
diff --git a/arch/arm64/tools/cpucaps b/arch/arm64/tools/cpucaps
Mian Yousaf Kaukab b414d7
index 1ccb92165bd8..2102e15af43d 100644
Mian Yousaf Kaukab b414d7
--- a/arch/arm64/tools/cpucaps
Mian Yousaf Kaukab b414d7
+++ b/arch/arm64/tools/cpucaps
Mian Yousaf Kaukab b414d7
@@ -54,6 +54,7 @@ WORKAROUND_1463225
Mian Yousaf Kaukab b414d7
 WORKAROUND_1508412
Mian Yousaf Kaukab b414d7
 WORKAROUND_1542419
Mian Yousaf Kaukab b414d7
 WORKAROUND_TRBE_OVERWRITE_FILL_MODE
Mian Yousaf Kaukab b414d7
+WORKAROUND_TSB_FLUSH_FAILURE
Mian Yousaf Kaukab b414d7
 WORKAROUND_CAVIUM_23154
Mian Yousaf Kaukab b414d7
 WORKAROUND_CAVIUM_27456
Mian Yousaf Kaukab b414d7
 WORKAROUND_CAVIUM_30115
Mian Yousaf Kaukab b414d7
-- 
Mian Yousaf Kaukab b414d7
2.31.1
Mian Yousaf Kaukab b414d7