|
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 |
|