xstop_reason[i].description);
 }
 
+static void print_npu_checkstop_reason(const char *level,
+                                       struct OpalHMIEvent *hmi_evt)
+{
+       uint8_t reason, reason_count, i;
+
+       /*
+        * We may not have a checkstop reason on some combination of
+        * hardware and/or skiboot version
+        */
+       if (!hmi_evt->u.xstop_error.xstop_reason) {
+               printk("%s      NPU checkstop on chip %x\n", level,
+                       be32_to_cpu(hmi_evt->u.xstop_error.u.chip_id));
+               return;
+       }
+
+       /*
+        * NPU2 has 3 FIRs. Reason encoded on a byte as:
+        *   2 bits for the FIR number
+        *   6 bits for the bit number
+        * It may be possible to find several reasons.
+        *
+        * We don't display a specific message per FIR bit as there
+        * are too many and most are meaningless without the workbook
+        * and/or hw team help anyway.
+        */
+       reason_count = sizeof(hmi_evt->u.xstop_error.xstop_reason) /
+               sizeof(reason);
+       for (i = 0; i < reason_count; i++) {
+               reason = (hmi_evt->u.xstop_error.xstop_reason >> (8 * i)) & 0xFF;
+               if (reason)
+                       printk("%s      NPU checkstop on chip %x: FIR%d bit %d is set\n",
+                               level,
+                               be32_to_cpu(hmi_evt->u.xstop_error.u.chip_id),
+                               reason >> 6, reason & 0x3F);
+       }
+}
+
 static void print_checkstop_reason(const char *level,
                                        struct OpalHMIEvent *hmi_evt)
 {
        case CHECKSTOP_TYPE_NX:
                print_nx_checkstop_reason(level, hmi_evt);
                break;
+       case CHECKSTOP_TYPE_NPU:
+               print_npu_checkstop_reason(level, hmi_evt);
+               break;
        default:
                printk("%s      Unknown Malfunction Alert of type %d\n",
                       level, type);