[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