return status & MCI_STATUS_DEFERRED;
 }
 
+static bool _log_error_deferred(unsigned int bank, u32 misc)
+{
+       if (!_log_error_bank(bank, mca_msr_reg(bank, MCA_STATUS),
+                            mca_msr_reg(bank, MCA_ADDR), misc))
+               return false;
+
+       /*
+        * Non-SMCA systems don't have MCA_DESTAT/MCA_DEADDR registers.
+        * Return true here to avoid accessing these registers.
+        */
+       if (!mce_flags.smca)
+               return true;
+
+       /* Clear MCA_DESTAT if the deferred error was logged from MCA_STATUS. */
+       wrmsrl(MSR_AMD64_SMCA_MCx_DESTAT(bank), 0);
+       return true;
+}
+
 /*
  * We have three scenarios for checking for Deferred errors:
  *
  */
 static void log_error_deferred(unsigned int bank)
 {
-       bool defrd;
-
-       defrd = _log_error_bank(bank, mca_msr_reg(bank, MCA_STATUS),
-                               mca_msr_reg(bank, MCA_ADDR), 0);
-
-       if (!mce_flags.smca)
-               return;
-
-       /* Clear MCA_DESTAT if we logged the deferred error from MCA_STATUS. */
-       if (defrd) {
-               wrmsrl(MSR_AMD64_SMCA_MCx_DESTAT(bank), 0);
+       if (_log_error_deferred(bank, 0))
                return;
-       }
 
        /*
         * Only deferred errors are logged in MCA_DE{STAT,ADDR} so just check
 
 static void log_error_thresholding(unsigned int bank, u64 misc)
 {
-       _log_error_bank(bank, mca_msr_reg(bank, MCA_STATUS), mca_msr_reg(bank, MCA_ADDR), misc);
+       _log_error_deferred(bank, misc);
 }
 
 static void log_and_reset_block(struct threshold_block *block)