tools/testing/nvdimm: improve emulation of smart injection
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>
This commit is contained in:
parent
86ed913b0e
commit
b4d4702f30
|
@ -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));
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue