Skip to content

Commit

Permalink
tools/testing/nvdimm: improve emulation of smart injection
Browse files Browse the repository at this point in the history
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 <[email protected]>
Signed-off-by: Dave Jiang <[email protected]>
  • Loading branch information
stellarhopper authored and davejiang committed Aug 1, 2018
1 parent 86ed913 commit b4d4702
Showing 1 changed file with 47 additions and 31 deletions.
78 changes: 47 additions & 31 deletions tools/testing/nvdimm/test/nfit.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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));
}
Expand Down

0 comments on commit b4d4702

Please sign in to comment.