diff --git a/nvme-print-json.c b/nvme-print-json.c index 1f57d6ad34..b7cbf3afe4 100644 --- a/nvme-print-json.c +++ b/nvme-print-json.c @@ -442,6 +442,12 @@ void json_nvme_id_ctrl(struct nvme_id_ctrl *ctrl, obj_add_int(psd, "active_power", le16_to_cpu(ctrl->psd[i].actp)); obj_add_int(psd, "active_power_work", ctrl->psd[i].apws & 7); obj_add_int(psd, "active_scale", nvme_psd_power_scale(ctrl->psd[i].apws)); + obj_add_int(psd, "emerg_power_fail_recover_time", ctrl->psd[i].epfrt); + obj_add_int(psd, "emerg_power_fail_recover_scale", ctrl->psd[i].epfr_fqv_ts & 0xf); + obj_add_int(psd, "force_quiesce_vault_time", ctrl->psd[i].fqvt); + obj_add_int(psd, "force_quiesce_vault_scale", ctrl->psd[i].epfr_fqv_ts >> 4); + obj_add_int(psd, "emerg_power_fail_vault_time", ctrl->psd[i].epfvt); + obj_add_int(psd, "emerg_power_fail_vault_scale", ctrl->psd[i].epfvts & 0xf); array_add_obj(psds, psd); } diff --git a/nvme-print-stdout.c b/nvme-print-stdout.c index 484696a23e..6311786409 100644 --- a/nvme-print-stdout.c +++ b/nvme-print-stdout.c @@ -3020,6 +3020,27 @@ static void print_ps_power_and_scale(__le16 ctr_power, __u8 scale) } } +static void print_psd_time(const char *desc, __u8 time, __u8 ts) +{ + int width = 12 + strlen(desc); + char value[STR_LEN] = { 0 }; + + switch (time) { + case 0: + snprintf(value, sizeof(value), "-"); + break; + case 1 ... 99: + snprintf(value, sizeof(value), "%d (unit: %s)", time, + nvme_time_scale_to_string(ts)); + break; + default: + snprintf(value, sizeof(value), "reserved"); + break; + } + + printf("%*s: %s\n", width, desc, value); +} + static void stdout_id_ctrl_power(struct nvme_id_ctrl *ctrl) { int i; @@ -3051,7 +3072,12 @@ static void stdout_id_ctrl_power(struct nvme_id_ctrl *ctrl) printf("\n active_power_workload:"); print_psd_workload(ctrl->psd[i].apws); printf("\n"); - + print_psd_time("emergency power fail recovery time", ctrl->psd[i].epfrt, + ctrl->psd[i].epfr_fqv_ts & 0xf); + print_psd_time("forced quiescence vault time", ctrl->psd[i].fqvt, + ctrl->psd[i].epfr_fqv_ts >> 4); + print_psd_time("emergency power fail vault time", ctrl->psd[i].epfvt, + ctrl->psd[i].epfvts & 0xf); } } diff --git a/nvme-print.c b/nvme-print.c index 303ffd8545..77311e6cf5 100644 --- a/nvme-print.c +++ b/nvme-print.c @@ -1313,6 +1313,42 @@ const char *nvme_register_symbol_to_string(int offset) return "unknown"; } +const char *nvme_time_scale_to_string(__u8 ts) +{ + switch (ts) { + case 0: + return "1 microsecond"; + case 1: + return "10 microseconds"; + case 2: + return "100 microseconds"; + case 3: + return "1 millisecond"; + case 4: + return "10 milliseconds"; + case 5: + return "100 milliseconds"; + case 6: + return "1 second"; + case 7: + return "10 seconds"; + case 8: + return "100 seconds"; + case 9: + return "1,000 seconds"; + case 0xa: + return "10,000 seconds"; + case 0xb: + return "100,000 seconds"; + case 0xc: + return "1,000,000 seconds"; + default: + break; + } + + return "Reserved"; +} + void nvme_feature_show(enum nvme_features_id fid, int sel, unsigned int result) { nvme_print(show_feature, NORMAL, fid, sel, result); diff --git a/nvme-print.h b/nvme-print.h index 00f19947c8..b88149a94c 100644 --- a/nvme-print.h +++ b/nvme-print.h @@ -311,6 +311,7 @@ const char *nvme_ns_wp_cfg_to_string(enum nvme_ns_write_protect_cfg state); const char *nvme_pel_rci_rcpit_to_string(enum nvme_pel_rci_rcpit rcpit); const char *nvme_pel_ehai_pit_to_string(enum nvme_pel_ehai_pit pit); const char *nvme_ssi_state_to_string(__u8 state); +const char *nvme_time_scale_to_string(__u8 ts); void nvme_dev_full_path(nvme_ns_t n, char *path, size_t len); void nvme_generic_full_path(nvme_ns_t n, char *path, size_t len); diff --git a/util/json.h b/util/json.h index da4d7a4586..5f51b7b64d 100644 --- a/util/json.h +++ b/util/json.h @@ -72,8 +72,6 @@ struct json_object; #define json_object_add_value_array(o, k, v) json_object_object_add(o, k, v) #define json_object_add_value_object(o, k, v) json_object_object_add(o, k, v) -#define STR_LEN 100 - void json_object_add_uint_02x(struct json_object *o, const char *k, __u32 v); void json_object_add_uint_0x(struct json_object *o, const char *k, __u32 v); void json_object_add_byte_array(struct json_object *o, const char *k, unsigned char *buf, int len); diff --git a/util/types.h b/util/types.h index 70a7760707..4046d5c18c 100644 --- a/util/types.h +++ b/util/types.h @@ -11,6 +11,8 @@ #define ABSOLUTE_ZERO_CELSIUS -273 +#define STR_LEN 100 + static inline long kelvin_to_celsius(long t) { return t + ABSOLUTE_ZERO_CELSIUS;