From: Tokunori Ikegami Date: Sat, 11 Jan 2025 15:21:58 +0000 (+0900) Subject: nvme-print-stdout: add NVMe 2.1 identify power state descriptor fields X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=622a96d0d684be05c0f07874a05e731708da5f5b;p=users%2Fsagi%2Fnvme-cli.git nvme-print-stdout: add NVMe 2.1 identify power state descriptor fields Since power loss signaling function introduced by NVMe 2.1. Signed-off-by: Tokunori Ikegami --- diff --git a/nvme-print-stdout.c b/nvme-print-stdout.c index 484696a2..63117864 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 303ffd85..77311e6c 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 00f19947..b88149a9 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);