|
@@ -441,6 +441,7 @@ static int opal_recover_mce(struct pt_regs *regs,
|
|
|
int opal_machine_check(struct pt_regs *regs)
|
|
|
{
|
|
|
struct machine_check_event evt;
|
|
|
+ int ret;
|
|
|
|
|
|
if (!get_mce_event(&evt, MCE_EVENT_RELEASE))
|
|
|
return 0;
|
|
@@ -455,6 +456,40 @@ int opal_machine_check(struct pt_regs *regs)
|
|
|
|
|
|
if (opal_recover_mce(regs, &evt))
|
|
|
return 1;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Unrecovered machine check, we are heading to panic path.
|
|
|
+ *
|
|
|
+ * We may have hit this MCE in very early stage of kernel
|
|
|
+ * initialization even before opal-prd has started running. If
|
|
|
+ * this is the case then this MCE error may go un-noticed or
|
|
|
+ * un-analyzed if we go down panic path. We need to inform
|
|
|
+ * BMC/OCC about this error so that they can collect relevant
|
|
|
+ * data for error analysis before rebooting.
|
|
|
+ * Use opal_cec_reboot2(OPAL_REBOOT_PLATFORM_ERROR) to do so.
|
|
|
+ * This function may not return on BMC based system.
|
|
|
+ */
|
|
|
+ ret = opal_cec_reboot2(OPAL_REBOOT_PLATFORM_ERROR,
|
|
|
+ "Unrecoverable Machine Check exception");
|
|
|
+ if (ret == OPAL_UNSUPPORTED) {
|
|
|
+ pr_emerg("Reboot type %d not supported\n",
|
|
|
+ OPAL_REBOOT_PLATFORM_ERROR);
|
|
|
+ }
|
|
|
+
|
|
|
+ /*
|
|
|
+ * We reached here. There can be three possibilities:
|
|
|
+ * 1. We are running on a firmware level that do not support
|
|
|
+ * opal_cec_reboot2()
|
|
|
+ * 2. We are running on a firmware level that do not support
|
|
|
+ * OPAL_REBOOT_PLATFORM_ERROR reboot type.
|
|
|
+ * 3. We are running on FSP based system that does not need opal
|
|
|
+ * to trigger checkstop explicitly for error analysis. The FSP
|
|
|
+ * PRD component would have already got notified about this
|
|
|
+ * error through other channels.
|
|
|
+ *
|
|
|
+ * In any case, let us just fall through. We anyway heading
|
|
|
+ * down to panic path.
|
|
|
+ */
|
|
|
return 0;
|
|
|
}
|
|
|
|