diff options
Diffstat (limited to 'nvme.h')
-rw-r--r-- | nvme.h | 63 |
1 files changed, 61 insertions, 2 deletions
@@ -19,8 +19,12 @@ #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" @@ -34,13 +38,68 @@ enum nvme_print_flags { 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); -int parse_and_open(int argc, char **argv, const char *desc, + +/* + * 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, const struct argconfig_commandline_options *clo); -extern const char *devicename; +void dev_close(struct nvme_dev *dev); + extern const char *output_format; enum nvme_print_flags validate_output_format(const char *format); |