skx_set_decode(skx_decode, skx_show_retry_rd_err_log);
 
-       if (nvdimm_count && skx_adxl_get() == -ENODEV)
-               skx_printk(KERN_NOTICE, "Only decoding DDR4 address!\n");
+       if (nvdimm_count && skx_adxl_get() != -ENODEV) {
+               skx_set_decode(NULL, skx_show_retry_rd_err_log);
+       } else {
+               if (nvdimm_count)
+                       skx_printk(KERN_NOTICE, "Only decoding DDR4 address!\n");
+               skx_set_decode(skx_decode, skx_show_retry_rd_err_log);
+       }
 
        /* Ensure that the OPSTATE is set correctly for POLL or NMI */
        opstate_init();
 
 static unsigned long adxl_nm_bitmap;
 
 static char skx_msg[MSG_SIZE];
-static skx_decode_f skx_decode;
+static skx_decode_f driver_decode;
 static skx_show_retry_log_f skx_show_retry_rd_err_log;
 static u64 skx_tolm, skx_tohm;
 static LIST_HEAD(dev_edac_list);
                        break;
        }
 
+       res->decoded_by_adxl = true;
+
        return true;
 }
 
 
 void skx_set_decode(skx_decode_f decode, skx_show_retry_log_f show_retry_log)
 {
-       skx_decode = decode;
+       driver_decode = decode;
        skx_show_retry_rd_err_log = show_retry_log;
 }
 
                        break;
                }
        }
-       if (adxl_component_count) {
+       if (res->decoded_by_adxl) {
                len = snprintf(skx_msg, MSG_SIZE, "%s%s err_code:0x%04x:0x%04x %s",
                         overflow ? " OVERFLOW" : "",
                         (uncorrected_error && recoverable) ? " recoverable" : "",
        memset(&res, 0, sizeof(res));
        res.addr = mce->addr;
 
-       if (adxl_component_count) {
-               if (!skx_adxl_decode(&res, skx_error_in_1st_level_mem(mce)))
+       /* Try driver decoder first */
+       if (!(driver_decode && driver_decode(&res))) {
+               /* Then try firmware decoder (ACPI DSM methods) */
+               if (!(adxl_component_count && skx_adxl_decode(&res, skx_error_in_1st_level_mem(mce))))
                        return NOTIFY_DONE;
-       } else if (!skx_decode || !skx_decode(&res)) {
-               return NOTIFY_DONE;
        }
 
        mci = res.dev->imc[res.imc].mci;