[PATCH 3/4] perf: arm_pmu: Add workaround for FUJITSU-MONAKA Erratum E#030002
From: Tomohiro Misono
Date: Fri Oct 02 2026 - 06:46:25 EST
FUJITSU-MONAKA Erratum E#030002 affects FUJITSU-MONAKA CPU.
On affected FUJITSU-MONAKA CPUs, after a PMU event counter is
stopped at a value just before overflow, an overflow might still
be incorrectly detected, resulting interrupt storm in some case.
Work around the erratum by avoiding programming PMU event counters
with values within five counts of overflow.
Signed-off-by: Tomohiro Misono <misono.tomohiro@xxxxxxxxxxx>
---
Documentation/arch/arm64/silicon-errata.rst | 2 ++
arch/arm64/Kconfig | 17 +++++++++++++++++
arch/arm64/include/asm/cpucaps.h | 2 ++
arch/arm64/kernel/cpu_errata.c | 10 ++++++++++
arch/arm64/tools/cpucaps | 1 +
drivers/perf/arm_pmu.c | 13 +++++++++++++
6 files changed, 45 insertions(+)
diff --git a/Documentation/arch/arm64/silicon-errata.rst b/Documentation/arch/arm64/silicon-errata.rst
index 8ab6284e3d10..429bdf9a3d9d 100644
--- a/Documentation/arch/arm64/silicon-errata.rst
+++ b/Documentation/arch/arm64/silicon-errata.rst
@@ -375,6 +375,8 @@ stable kernels.
+----------------+-----------------+-----------------+-----------------------------+
| Fujitsu | MONAKA | E#030001 | FUJITSU_ERRATUM_030001 |
+----------------+-----------------+-----------------+-----------------------------+
+| Fujitsu | MONAKA | E#030002 | FUJITSU_ERRATUM_030002 |
++----------------+-----------------+-----------------+-----------------------------+
+----------------+-----------------+-----------------+-----------------------------+
| ASR | ASR8601 | #8601001 | N/A |
+----------------+-----------------+-----------------+-----------------------------+
diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig
index 38248a31d5f1..348d9836d2c2 100644
--- a/arch/arm64/Kconfig
+++ b/arch/arm64/Kconfig
@@ -1331,6 +1331,23 @@ config FUJITSU_ERRATUM_030001
If unsure, say Y.
+config FUJITSU_ERRATUM_030002
+ bool "FUJITSU-MONAKA erratum E#030002: PMU overflow may be incorrectly detected"
+ depends on ARM_PMUV3
+ default y
+ help
+ This option adds a workaround for FUJITSU-MONAKA erratum E#030002.
+ On affected FUJITSU-MONAKA CPUs, after a PMU event counter is
+ stopped at a value just before overflow, an overflow might still
+ be incorrectly detected.
+
+ Work around the erratum by avoiding programming PMU event counters
+ with values within five counts of overflow.
+
+ The workaround only affects the FUJITSU-MONAKA.
+
+ If unsure, say Y.
+
config HISILICON_ERRATUM_161600802
bool "Hip07 161600802: Erroneous redistributor VLPI base"
default y
diff --git a/arch/arm64/include/asm/cpucaps.h b/arch/arm64/include/asm/cpucaps.h
index 9220b917ec20..c0a0452daf94 100644
--- a/arch/arm64/include/asm/cpucaps.h
+++ b/arch/arm64/include/asm/cpucaps.h
@@ -68,6 +68,8 @@ cpucap_is_possible(const unsigned int cap)
return IS_ENABLED(CONFIG_ARM64_ERRATUM_4193714);
case ARM64_WORKAROUND_FUJITSU_030001:
return IS_ENABLED(CONFIG_FUJITSU_ERRATUM_030001);
+ case ARM64_WORKAROUND_FUJITSU_030002:
+ return IS_ENABLED(CONFIG_FUJITSU_ERRATUM_030002);
case ARM64_MPAM:
/*
* KVM MPAM support doesn't rely on the host kernel supporting MPAM.
diff --git a/arch/arm64/kernel/cpu_errata.c b/arch/arm64/kernel/cpu_errata.c
index 5b9dea3c761d..aa1dd1ae0f92 100644
--- a/arch/arm64/kernel/cpu_errata.c
+++ b/arch/arm64/kernel/cpu_errata.c
@@ -1036,6 +1036,16 @@ const struct arm64_cpu_capabilities arm64_errata[] = {
{}
})),
},
+#endif
+#ifdef CONFIG_FUJITSU_ERRATUM_030002
+ {
+ .desc = "FUJITSU-MONAKA Erratum E#030002",
+ .capability = ARM64_WORKAROUND_FUJITSU_030002,
+ ERRATA_MIDR_RANGE_LIST(((const struct midr_range[]) {
+ MIDR_ALL_VERSIONS(MIDR_FUJITSU_MONAKA),
+ {}
+ })),
+ },
#endif
{
.desc = "Known broken GICv3 SEIS implementation",
diff --git a/arch/arm64/tools/cpucaps b/arch/arm64/tools/cpucaps
index 50a9aa0e2bf0..6bf19fc68def 100644
--- a/arch/arm64/tools/cpucaps
+++ b/arch/arm64/tools/cpucaps
@@ -133,3 +133,4 @@ WORKAROUND_SPECULATIVE_AT
WORKAROUND_SPECULATIVE_SSBS
WORKAROUND_SPECULATIVE_UNPRIV_LOAD
WORKAROUND_FUJITSU_030001
+WORKAROUND_FUJITSU_030002
diff --git a/drivers/perf/arm_pmu.c b/drivers/perf/arm_pmu.c
index 115069565389..c0b8580d80ba 100644
--- a/drivers/perf/arm_pmu.c
+++ b/drivers/perf/arm_pmu.c
@@ -234,6 +234,19 @@ int armpmu_event_set_period(struct perf_event *event)
if (left > (max_period >> 1))
left = (max_period >> 1);
+#if IS_ENABLED(CONFIG_ARM64)
+ if (alternative_has_cap_unlikely(ARM64_WORKAROUND_FUJITSU_030002)) {
+ /*
+ * Due to the errata, overflow might be incorrectly detected in the handler
+ * when the counter is about to overflow in a single increment, resulting
+ * interrupt storm in some case. As the counter can increase by up to
+ * 5 at a time, set 6 here to prevent the condition.
+ */
+ if (left > 0 && left < 6)
+ left = 6;
+ }
+#endif
+
local64_set(&hwc->prev_count, (u64)-left);
armpmu->write_counter(event, (u64)(-left) & max_period);
--
2.43.0