]> www.infradead.org Git - users/sagi/nvme-cli.git/commitdiff
plugins/solidigm: Added OCP 2.0 vs-drive-info command.
authorda Cunha, Leonardo <leonardo.da.cunha@solidigm.com>
Wed, 29 Nov 2023 13:01:16 +0000 (05:01 -0800)
committerDaniel Wagner <wagi@monom.org>
Mon, 11 Dec 2023 07:58:03 +0000 (08:58 +0100)
Signed-off-by: Leonardo da Cunha <leonardo.da.cunha@solidigm.com>
plugins/solidigm/meson.build
plugins/solidigm/solidigm-get-drive-info.c [new file with mode: 0644]
plugins/solidigm/solidigm-get-drive-info.h [new file with mode: 0644]
plugins/solidigm/solidigm-nvme.c
plugins/solidigm/solidigm-nvme.h

index fb5e60d95c62e1504846d00f0ebb9e79fb76fa33..ada6669c9d995504575c713302e0044b7b997278 100644 (file)
@@ -9,6 +9,7 @@ sources += [
   'plugins/solidigm/solidigm-internal-logs.c',
   'plugins/solidigm/solidigm-market-log.c',
   'plugins/solidigm/solidigm-temp-stats.c',
+  'plugins/solidigm/solidigm-get-drive-info.c',
 ]
 subdir('solidigm-telemetry')
 
diff --git a/plugins/solidigm/solidigm-get-drive-info.c b/plugins/solidigm/solidigm-get-drive-info.c
new file mode 100644 (file)
index 0000000..21f59bb
--- /dev/null
@@ -0,0 +1,79 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (c) 2023 Solidigm.
+ *
+ * Authors: leonardo.da.cunha@solidigm.com
+ */
+
+#include <errno.h>
+#include "nvme-print.h"
+#include "nvme-wrap.h"
+#include "common.h"
+
+int sldgm_get_drive_info(int argc, char **argv, struct command *cmd, struct plugin *plugin)
+{
+       _cleanup_nvme_dev_ struct nvme_dev *dev = NULL;
+       const char *desc = "Get drive HW information";
+       const char *FTL_unit_size_str = "FTL_unit_size";
+       char *output_format = "normal";
+       enum nvme_print_flags flags;
+       nvme_root_t r;
+       nvme_ctrl_t c;
+       nvme_ns_t n;
+       struct nvme_id_ns ns = { 0 };
+       __u8 flbaf_inUse;
+       __u16 lba_size;
+       __u16 ftl_unit_size;
+       int err;
+
+       OPT_ARGS(opts) = {
+               OPT_FMT("output-format", 'o', &output_format, "normal|json"),
+               OPT_END()
+       };
+
+       err = parse_and_open(&dev, argc, argv, desc, opts);
+       if (err)
+               return err;
+
+       err = validate_output_format(output_format, &flags);
+       if ((err < 0) || !(flags == NORMAL || flags == JSON)) {
+               nvme_show_error("Invalid output format");
+               return err;
+       }
+
+       r = nvme_scan(NULL);
+       c = nvme_scan_ctrl(r, dev->name);
+       n = c ? nvme_ctrl_first_ns(c) : nvme_scan_namespace(dev->name);
+       if (!n) {
+               nvme_show_error("solidigm-vs-drive-info: drive missing namespace");
+               return -EINVAL;
+       }
+
+       err = nvme_ns_identify(n, &ns);
+       if (err) {
+               nvme_show_error("identify namespace: %s", nvme_strerror(errno));
+               return err;
+       }
+
+       if (!(ns.nsfeat & 0x10)) {
+               nvme_show_error("solidigm-vs-drive-info: performance options not available");
+               return -EINVAL;
+       }
+
+       nvme_id_ns_flbas_to_lbaf_inuse(ns.flbas, &flbaf_inUse);
+       lba_size = 1 << ns.lbaf[flbaf_inUse].ds;
+       ftl_unit_size = (le16_to_cpu(ns.npwg) + 1) * lba_size / 1024;
+
+       if (flags == JSON) {
+               struct json_object *root = json_create_object();
+
+               json_object_add_value_int(root, FTL_unit_size_str, ftl_unit_size);
+               json_print_object(root, NULL);
+               printf("\n");
+               json_free_object(root);
+       } else {
+               printf("%s: %d\n", FTL_unit_size_str, ftl_unit_size);
+       }
+
+       return err;
+}
diff --git a/plugins/solidigm/solidigm-get-drive-info.h b/plugins/solidigm/solidigm-get-drive-info.h
new file mode 100644 (file)
index 0000000..ffc1bd2
--- /dev/null
@@ -0,0 +1,8 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+/*
+ * Copyright (c) 2023 Solidigm.
+ *
+ * Author: leonardo.da.cunha@solidigm.com
+ */
+
+int sldgm_get_drive_info(int argc, char **argv, struct command *cmd, struct plugin *plugin);
index d9ef737d8410117c858745437ce36cdae62114d1..db6889a1128604230b1d5892843c3815cf2ede73 100644 (file)
@@ -19,6 +19,7 @@
 #include "solidigm-log-page-dir.h"
 #include "solidigm-market-log.h"
 #include "solidigm-temp-stats.h"
+#include "solidigm-get-drive-info.h"
 
 #include "plugins/ocp/ocp-clear-features.h"
 #include "plugins/ocp/ocp-smart-extended-log.h"
@@ -94,3 +95,8 @@ static int get_temp_stats_log(int argc, char **argv, struct command *cmd, struct
 {
        return sldgm_get_temp_stats_log(argc, argv, cmd, plugin);
 }
+
+static int get_drive_info(int argc, char **argv, struct command *cmd, struct plugin *plugin)
+{
+       return sldgm_get_drive_info(argc, argv, cmd, plugin);
+}
index 336f127b4ee6de165157828f4fdf92a7c0939bb9..8f1d7b89c3959b3011865bd6e639eb8eafe7b056 100644 (file)
@@ -13,7 +13,7 @@
 
 #include "cmd.h"
 
-#define SOLIDIGM_PLUGIN_VERSION "0.18"
+#define SOLIDIGM_PLUGIN_VERSION "0.19"
 
 PLUGIN(NAME("solidigm", "Solidigm vendor specific extensions", SOLIDIGM_PLUGIN_VERSION),
        COMMAND_LIST(
@@ -30,6 +30,7 @@ PLUGIN(NAME("solidigm", "Solidigm vendor specific extensions", SOLIDIGM_PLUGIN_V
                ENTRY("vs-fw-activate-history", "Get firmware activation history log (redirects to ocp plug-in)", fw_activation_history)
                ENTRY("log-page-directory", "Retrieve log page directory", get_log_page_directory_log)
                ENTRY("temp-stats", "Retrieve Temperature Statistics log", get_temp_stats_log)
+               ENTRY("vs-drive-info", "Retrieve drive information", get_drive_info)
        )
 );