[PATCH v7 11/16] arm64: ras: Add RAS decode notifier chain
Ruidong Tian
tianruidong at linux.alibaba.com
Tue Jun 2 00:15:34 PDT 2026
Introduce a blocking notifier chain that allows external modules (e.g.,
EDAC drivers, vendor-specific decoders) to receive and further decode
RAS error events. Each error event is passed to all registered decoders
after being logged.
Signed-off-by: Ruidong Tian <tianruidong at linux.alibaba.com>
---
drivers/ras/arm64/ras-core.c | 15 +++++++++++++++
include/linux/ras.h | 8 ++++++++
2 files changed, 23 insertions(+)
diff --git a/drivers/ras/arm64/ras-core.c b/drivers/ras/arm64/ras-core.c
index 94514a5bb973..0b07b69545ad 100644
--- a/drivers/ras/arm64/ras-core.c
+++ b/drivers/ras/arm64/ras-core.c
@@ -139,11 +139,26 @@ static void ras_print(struct ras_record *record, struct ras_ext_regs *regs)
}
}
+static ATOMIC_NOTIFIER_HEAD(ras_decoder_chain);
+
+void ras_register_decode_chain(struct notifier_block *nb)
+{
+ atomic_notifier_chain_register(&ras_decoder_chain, nb);
+}
+EXPORT_SYMBOL_GPL(ras_register_decode_chain);
+
+void ras_unregister_decode_chain(struct notifier_block *nb)
+{
+ atomic_notifier_chain_unregister(&ras_decoder_chain, nb);
+}
+EXPORT_SYMBOL_GPL(ras_unregister_decode_chain);
+
static void ras_do_proc(struct ras_record *record, struct ras_ext_regs *regs)
{
u64 status = regs->err_status, addr = regs->err_addr;
ras_print(record, regs);
+ atomic_notifier_call_chain(&ras_decoder_chain, 0, record);
if (status & ERR_STATUS_CE)
return;
diff --git a/include/linux/ras.h b/include/linux/ras.h
index 468941bfe855..11663150612f 100644
--- a/include/linux/ras.h
+++ b/include/linux/ras.h
@@ -63,4 +63,12 @@ amd_convert_umc_mca_addr_to_sys_addr(struct atl_err *err) { return -EINVAL; }
#define GET_LOGICAL_INDEX(mpidr) -EINVAL
#endif /* CONFIG_ARM || CONFIG_ARM64 */
+#if IS_ENABLED(CONFIG_ARM64_RAS_DRIVER)
+void ras_register_decode_chain(struct notifier_block *nb);
+void ras_unregister_decode_chain(struct notifier_block *nb);
+#else
+static inline void ras_register_decode_chain(struct notifier_block *nb) {}
+static inline void ras_unregister_decode_chain(struct notifier_block *nb) {}
+#endif /* CONFIG_ARM64_RAS_DRIVER */
+
#endif /* __RAS_H__ */
--
2.51.2.612.gdc70283dfc
More information about the linux-arm-kernel
mailing list