#define OPAL_FLASH_WRITE                       111
 #define OPAL_FLASH_ERASE                       112
 #define OPAL_PRD_MSG                           113
-#define OPAL_LAST                              113
+#define OPAL_CEC_REBOOT2                       116
+#define OPAL_LAST                              116
 
 /* Device tree flags */
 
        OPAL_SYSCOOL_INSF       = 0x0001, /* System insufficient cooling */
 };
 
+/* Argument to OPAL_CEC_REBOOT2() */
+enum {
+       OPAL_REBOOT_NORMAL              = 0,
+       OPAL_REBOOT_PLATFORM_ERROR      = 1,
+};
+
 #endif /* __ASSEMBLY__ */
 
 #endif /* __OPAL_API_H */
 
                       uint32_t hour_min);
 int64_t opal_cec_power_down(uint64_t request);
 int64_t opal_cec_reboot(void);
+int64_t opal_cec_reboot2(uint32_t reboot_type, char *diag);
 int64_t opal_read_nvram(uint64_t buffer, uint64_t size, uint64_t offset);
 int64_t opal_write_nvram(uint64_t buffer, uint64_t size, uint64_t offset);
 int64_t opal_handle_interrupt(uint64_t isn, __be64 *outstanding_event_mask);
 
 OPAL_CALL(opal_rtc_write,                      OPAL_RTC_WRITE);
 OPAL_CALL(opal_cec_power_down,                 OPAL_CEC_POWER_DOWN);
 OPAL_CALL(opal_cec_reboot,                     OPAL_CEC_REBOOT);
+OPAL_CALL(opal_cec_reboot2,                    OPAL_CEC_REBOOT2);
 OPAL_CALL(opal_read_nvram,                     OPAL_READ_NVRAM);
 OPAL_CALL(opal_write_nvram,                    OPAL_WRITE_NVRAM);
 OPAL_CALL(opal_handle_interrupt,               OPAL_HANDLE_INTERRUPT);
 
 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;
 
        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;
 }