}
 EXPORT_SYMBOL_GPL(mce_is_correctable);
 
-static bool cec_add_mce(struct mce *m)
-{
-       if (!m)
-               return false;
-
-       /* We eat only correctable DRAM errors with usable addresses. */
-       if (mce_is_memory_error(m) &&
-           mce_is_correctable(m)  &&
-           mce_usable_address(m))
-               if (!cec_add_elem(m->addr >> PAGE_SHIFT))
-                       return true;
-
-       return false;
-}
-
 static int mce_early_notifier(struct notifier_block *nb, unsigned long val,
                              void *data)
 {
        if (!m)
                return NOTIFY_DONE;
 
-       if (cec_add_mce(m))
-               return NOTIFY_STOP;
-
        /* Emit the trace record: */
        trace_mce_record(m);
 
                static_branch_inc(&mcsafe_key);
 
        mcheck_debugfs_init();
-       cec_init();
 
        /*
         * Flush out everything that has been logged during early boot, now that
 
        return ret;
 }
 
-int cec_add_elem(u64 pfn)
+static int cec_add_elem(u64 pfn)
 {
        struct ce_array *ca = &ce_arr;
        unsigned int to = 0;
        return 1;
 }
 
-void __init cec_init(void)
+static int cec_notifier(struct notifier_block *nb, unsigned long val,
+                       void *data)
+{
+       struct mce *m = (struct mce *)data;
+
+       if (!m)
+               return NOTIFY_DONE;
+
+       /* We eat only correctable DRAM errors with usable addresses. */
+       if (mce_is_memory_error(m) &&
+           mce_is_correctable(m)  &&
+           mce_usable_address(m))
+               if (!cec_add_elem(m->addr >> PAGE_SHIFT))
+                       return NOTIFY_STOP;
+
+       return NOTIFY_DONE;
+}
+
+static struct notifier_block cec_nb = {
+       .notifier_call  = cec_notifier,
+       .priority       = MCE_PRIO_CEC,
+};
+
+static void __init cec_init(void)
 {
        if (ce_arr.disabled)
                return;
        INIT_DELAYED_WORK(&cec_work, cec_work_fn);
        schedule_delayed_work(&cec_work, CEC_DECAY_DEFAULT_INTERVAL);
 
+       mce_register_decode_chain(&cec_nb);
+
        pr_info("Correctable Errors collector initialized.\n");
 }
+late_initcall(cec_init);
 
 int __init parse_cec_param(char *str)
 {
 
 #endif
 
 #ifdef CONFIG_RAS_CEC
-void __init cec_init(void);
 int __init parse_cec_param(char *str);
-int cec_add_elem(u64 pfn);
-#else
-static inline void __init cec_init(void)       { }
-static inline int cec_add_elem(u64 pfn)                { return -ENODEV; }
 #endif
 
 #ifdef CONFIG_RAS