tools/testing/nvdimm: improve emulation of smart injection
authorVishal Verma <vishal.l.verma@intel.com>
Mon, 30 Jul 2018 22:11:34 +0000 (16:11 -0600)
committerDave Jiang <dave.jiang@intel.com>
Wed, 1 Aug 2018 00:05:19 +0000 (17:05 -0700)
The emulation for smart injection commands for nfit neglected to check
the smart field validity flags before injecting to that field. This is
required as a way to distinguish un-injection vs. leave-alone.

The emulation was also missing support for un-injection entirely. To add
this support, first, fix the above flags check. Second, use the
'enable' field in the injection command to determine injection vs
un-injection. Third, move the smart initialization struct to be a global
static structure for the nfit_test module. Reference this to get the
smart 'defaults' when un-injecting a smart field.

Signed-off-by: Vishal Verma <vishal.l.verma@intel.com>
Signed-off-by: Dave Jiang <dave.jiang@intel.com>
tools/testing/nvdimm/test/nfit.c

index a012ab7650838fcfe5c20eb5125258223d508229..cffc2c5a778db4e6a236e4491f29ff92aa3c3b75 100644 (file)
@@ -142,6 +142,28 @@ static u32 handle[] = {
 static unsigned long dimm_fail_cmd_flags[NUM_DCR];
 static int dimm_fail_cmd_code[NUM_DCR];
 
+static const struct nd_intel_smart smart_def = {
+       .flags = ND_INTEL_SMART_HEALTH_VALID
+               | ND_INTEL_SMART_SPARES_VALID
+               | ND_INTEL_SMART_ALARM_VALID
+               | ND_INTEL_SMART_USED_VALID
+               | ND_INTEL_SMART_SHUTDOWN_VALID
+               | ND_INTEL_SMART_MTEMP_VALID
+               | ND_INTEL_SMART_CTEMP_VALID,
+       .health = ND_INTEL_SMART_NON_CRITICAL_HEALTH,
+       .media_temperature = 23 * 16,
+       .ctrl_temperature = 25 * 16,
+       .pmic_temperature = 40 * 16,
+       .spares = 75,
+       .alarm_flags = ND_INTEL_SMART_SPARE_TRIP
+               | ND_INTEL_SMART_TEMP_TRIP,
+       .ait_status = 1,
+       .life_used = 5,
+       .shutdown_state = 0,
+       .vendor_size = 0,
+       .shutdown_count = 100,
+};
+
 struct nfit_test_fw {
        enum intel_fw_update_state state;
        u32 context;
@@ -752,15 +774,30 @@ static int nfit_test_cmd_smart_inject(
        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++;
+       if (inj->flags & ND_INTEL_SMART_INJECT_MTEMP) {
+               if (inj->mtemp_enable)
+                       smart->media_temperature = inj->media_temperature;
+               else
+                       smart->media_temperature = smart_def.media_temperature;
+       }
+       if (inj->flags & ND_INTEL_SMART_INJECT_SPARE) {
+               if (inj->spare_enable)
+                       smart->spares = inj->spares;
+               else
+                       smart->spares = smart_def.spares;
+       }
+       if (inj->flags & ND_INTEL_SMART_INJECT_FATAL) {
+               if (inj->fatal_enable)
+                       smart->health = ND_INTEL_SMART_FATAL_HEALTH;
+               else
+                       smart->health = ND_INTEL_SMART_NON_CRITICAL_HEALTH;
+       }
+       if (inj->flags & ND_INTEL_SMART_INJECT_SHUTDOWN) {
+               if (inj->unsafe_shutdown_enable) {
+                       smart->shutdown_state = 1;
+                       smart->shutdown_count++;
+               } else
+                       smart->shutdown_state = 0;
        }
        inj->status = 0;
        smart_notify(bus_dev, dimm_dev, smart, thresh);
@@ -1317,30 +1354,9 @@ static void smart_init(struct nfit_test *t)
                .ctrl_temperature = 30 * 16,
                .spares = 5,
        };
-       const struct nd_intel_smart smart_data = {
-               .flags = ND_INTEL_SMART_HEALTH_VALID
-                       | ND_INTEL_SMART_SPARES_VALID
-                       | ND_INTEL_SMART_ALARM_VALID
-                       | ND_INTEL_SMART_USED_VALID
-                       | ND_INTEL_SMART_SHUTDOWN_VALID
-                       | ND_INTEL_SMART_MTEMP_VALID
-                       | ND_INTEL_SMART_CTEMP_VALID,
-               .health = ND_INTEL_SMART_NON_CRITICAL_HEALTH,
-               .media_temperature = 23 * 16,
-               .ctrl_temperature = 25 * 16,
-               .pmic_temperature = 40 * 16,
-               .spares = 75,
-               .alarm_flags = ND_INTEL_SMART_SPARE_TRIP
-                       | ND_INTEL_SMART_TEMP_TRIP,
-               .ait_status = 1,
-               .life_used = 5,
-               .shutdown_state = 0,
-               .vendor_size = 0,
-               .shutdown_count = 100,
-       };
 
        for (i = 0; i < t->num_dcr; i++) {
-               memcpy(&t->smart[i], &smart_data, sizeof(smart_data));
+               memcpy(&t->smart[i], &smart_def, sizeof(smart_def));
                memcpy(&t->smart_threshold[i], &smart_t_data,
                                sizeof(smart_t_data));
        }