>= thresh->media_temperature)
                        || ((thresh->alarm_control & ND_INTEL_SMART_CTEMP_TRIP)
                                && smart->ctrl_temperature
-                               >= thresh->ctrl_temperature)) {
+                               >= thresh->ctrl_temperature)
+                       || (smart->health != ND_INTEL_SMART_NON_CRITICAL_HEALTH)
+                       || (smart->shutdown_state != 0)) {
                device_lock(bus_dev);
                __acpi_nvdimm_notify(dimm_dev, 0x81);
                device_unlock(bus_dev);
        return 0;
 }
 
+static int nfit_test_cmd_smart_inject(
+               struct nd_intel_smart_inject *inj,
+               unsigned int buf_len,
+               struct nd_intel_smart_threshold *thresh,
+               struct nd_intel_smart *smart,
+               struct device *bus_dev, struct device *dimm_dev)
+{
+       if (buf_len != sizeof(*inj))
+               return -EINVAL;
+
+       if (inj->mtemp_enable)
+               smart->media_temperature = inj->media_temperature;
+       if (inj->spare_enable)
+               smart->spares = inj->spares;
+       if (inj->fatal_enable)
+               smart->health = ND_INTEL_SMART_FATAL_HEALTH;
+       if (inj->unsafe_shutdown_enable) {
+               smart->shutdown_state = 1;
+               smart->shutdown_count++;
+       }
+       inj->status = 0;
+       smart_notify(bus_dev, dimm_dev, smart, thresh);
+
+       return 0;
+}
+
 static void uc_error_notify(struct work_struct *work)
 {
        struct nfit_test *t = container_of(work, typeof(*t), work);
                                                        t->dcr_idx],
                                                &t->smart[i - t->dcr_idx],
                                                &t->pdev.dev, t->dimm_dev[i]);
+                       case ND_INTEL_SMART_INJECT:
+                               return nfit_test_cmd_smart_inject(buf,
+                                               buf_len,
+                                               &t->smart_threshold[i -
+                                                       t->dcr_idx],
+                                               &t->smart[i - t->dcr_idx],
+                                               &t->pdev.dev, t->dimm_dev[i]);
                        default:
                                return -ENOTTY;
                        }
        set_bit(ND_INTEL_SMART, &acpi_desc->dimm_cmd_force_en);
        set_bit(ND_INTEL_SMART_THRESHOLD, &acpi_desc->dimm_cmd_force_en);
        set_bit(ND_INTEL_SMART_SET_THRESHOLD, &acpi_desc->dimm_cmd_force_en);
+       set_bit(ND_INTEL_SMART_INJECT, &acpi_desc->dimm_cmd_force_en);
        set_bit(ND_CMD_ARS_CAP, &acpi_desc->bus_cmd_force_en);
        set_bit(ND_CMD_ARS_START, &acpi_desc->bus_cmd_force_en);
        set_bit(ND_CMD_ARS_STATUS, &acpi_desc->bus_cmd_force_en);
 
 #define ND_INTEL_FW_FINISH_UPDATE      15
 #define ND_INTEL_FW_FINISH_QUERY       16
 #define ND_INTEL_SMART_SET_THRESHOLD   17
+#define ND_INTEL_SMART_INJECT          18
 
 #define ND_INTEL_SMART_HEALTH_VALID             (1 << 0)
 #define ND_INTEL_SMART_SPARES_VALID             (1 << 1)
 #define ND_INTEL_SMART_NON_CRITICAL_HEALTH      (1 << 0)
 #define ND_INTEL_SMART_CRITICAL_HEALTH          (1 << 1)
 #define ND_INTEL_SMART_FATAL_HEALTH             (1 << 2)
+#define ND_INTEL_SMART_INJECT_MTEMP            (1 << 0)
+#define ND_INTEL_SMART_INJECT_SPARE            (1 << 1)
+#define ND_INTEL_SMART_INJECT_FATAL            (1 << 2)
+#define ND_INTEL_SMART_INJECT_SHUTDOWN         (1 << 3)
 
 struct nd_intel_smart {
        __u32 status;
        __u32 status;
 } __packed;
 
+struct nd_intel_smart_inject {
+       __u64 flags;
+       __u8 mtemp_enable;
+       __u16 media_temperature;
+       __u8 spare_enable;
+       __u8 spares;
+       __u8 fatal_enable;
+       __u8 unsafe_shutdown_enable;
+       __u32 status;
+} __packed;
+
 #define INTEL_FW_STORAGE_SIZE          0x100000
 #define INTEL_FW_MAX_SEND_LEN          0xFFEC
 #define INTEL_FW_QUERY_INTERVAL                250000