]> www.infradead.org Git - users/sagi/nvme-cli.git/commitdiff
nvme-print-stdout: add NVMe 2.1 identify power state descriptor fields
authorTokunori Ikegami <ikegami.t@gmail.com>
Sat, 11 Jan 2025 15:21:58 +0000 (00:21 +0900)
committerDaniel Wagner <wagi@monom.org>
Mon, 13 Jan 2025 09:40:10 +0000 (10:40 +0100)
Since power loss signaling function introduced by NVMe 2.1.

Signed-off-by: Tokunori Ikegami <ikegami.t@gmail.com>
nvme-print-stdout.c
nvme-print.c
nvme-print.h

index 484696a23ed530c4aa8a88fe095abe1aa10fda0b..63117864098d33b57507cf7937035e117ac02f36 100644 (file)
@@ -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);
        }
 }
 
index 303ffd85455579ed4bbfc1646fa56895167b4918..77311e6cf5563db97e795ec7a812631dcc7d52e8 100644 (file)
@@ -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);
index 00f19947c87884e06f7f9ea619db288df496b844..b88149a94c3cb8581612ae248b00e13bc685d109 100644 (file)
@@ -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);