summaryrefslogtreecommitdiffstats
path: root/nvme.h
diff options
context:
space:
mode:
Diffstat (limited to 'nvme.h')
-rw-r--r--nvme.h131
1 files changed, 131 insertions, 0 deletions
diff --git a/nvme.h b/nvme.h
new file mode 100644
index 0000000..3915698
--- /dev/null
+++ b/nvme.h
@@ -0,0 +1,131 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+/*
+ * Definitions for the NVM Express interface
+ * Copyright (c) 2011-2014, Intel Corporation.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ */
+
+#ifndef _NVME_H
+#define _NVME_H
+
+#include <dirent.h>
+#include <stdbool.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <endian.h>
+#include <sys/time.h>
+#include <sys/stat.h>
+
+#include <libnvme-mi.h>
+
+#include "plugin.h"
+#include "util/json.h"
+#include "util/mem.h"
+#include "util/argconfig.h"
+#include "util/cleanup.h"
+
+enum nvme_print_flags {
+ NORMAL = 0,
+ VERBOSE = 1 << 0, /* verbosely decode complex values for humans */
+ JSON = 1 << 1, /* display in json format */
+ VS = 1 << 2, /* hex dump vendor specific data areas */
+ BINARY = 1 << 3, /* binary dump raw bytes */
+};
+
+enum nvme_cli_topo_ranking {
+ NVME_CLI_TOPO_NAMESPACE,
+ NVME_CLI_TOPO_CTRL,
+};
+
+#define SYS_NVME "/sys/class/nvme"
+
+enum nvme_dev_type {
+ NVME_DEV_DIRECT,
+ NVME_DEV_MI,
+};
+
+struct nvme_dev {
+ enum nvme_dev_type type;
+ union {
+ struct {
+ int fd;
+ struct stat stat;
+ } direct;
+ struct {
+ nvme_root_t root;
+ nvme_mi_ep_t ep;
+ nvme_mi_ctrl_t ctrl;
+ } mi;
+ };
+
+ const char *name;
+};
+
+#define dev_fd(d) __dev_fd(d, __func__, __LINE__)
+
+static inline int __dev_fd(struct nvme_dev *dev, const char *func, int line)
+{
+ if (dev->type != NVME_DEV_DIRECT) {
+ fprintf(stderr,
+ "warning: %s:%d not a direct transport!\n",
+ func, line);
+ return -1;
+ }
+ return dev->direct.fd;
+}
+
+static inline nvme_mi_ep_t dev_mi_ep(struct nvme_dev *dev)
+{
+ if (dev->type != NVME_DEV_MI) {
+ fprintf(stderr,
+ "warning: not a MI transport!\n");
+ return NULL;
+ }
+ return dev->mi.ep;
+}
+
+void register_extension(struct plugin *plugin);
+
+/*
+ * parse_and_open - parses arguments and opens the NVMe device, populating @dev
+ */
+int parse_and_open(struct nvme_dev **dev, int argc, char **argv, const char *desc,
+ struct argconfig_commandline_options *clo);
+
+void dev_close(struct nvme_dev *dev);
+
+static inline DEFINE_CLEANUP_FUNC(
+ cleanup_nvme_dev, struct nvme_dev *, dev_close)
+#define _cleanup_nvme_dev_ __cleanup__(cleanup_nvme_dev)
+
+extern const char *output_format;
+
+int validate_output_format(const char *format, enum nvme_print_flags *flags);
+bool nvme_is_output_format_json(void);
+int __id_ctrl(int argc, char **argv, struct command *cmd,
+ struct plugin *plugin, void (*vs)(uint8_t *vs, struct json_object *root));
+
+extern int current_index;
+
+const char *nvme_strerror(int errnum);
+
+unsigned long long elapsed_utime(struct timeval start_time,
+ struct timeval end_time);
+
+/* nvme-print.c */
+const char *nvme_select_to_string(int sel);
+
+void d(unsigned char *buf, int len, int width, int group);
+void d_raw(unsigned char *buf, unsigned len);
+uint64_t int48_to_long(uint8_t *data);
+
+int map_log_level(int verbose, bool quiet);
+#endif /* _NVME_H */