From cfca8a451bb13b88ed36a27acfe6cc19a477eef7 Mon Sep 17 00:00:00 2001 From: Martin George Date: Sun, 30 Jun 2024 13:09:07 +0530 Subject: [PATCH 001/281] nvme: update parse_args() return value handling Treat non-zero return values from parse_args() as errors, and not just negative return values. Also makes this consistent with other functions in nvme.c where parse_args() is invoked. Signed-off-by: Martin George --- nvme.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nvme.c b/nvme.c index 16dd57b586..91012faf98 100644 --- a/nvme.c +++ b/nvme.c @@ -3320,7 +3320,7 @@ static int list_subsys(int argc, char **argv, struct command *cmd, NVME_ARGS(opts); err = parse_args(argc, argv, desc, opts); - if (err < 0) + if (err) return err; devname = NULL; @@ -3378,7 +3378,7 @@ static int list(int argc, char **argv, struct command *cmd, struct plugin *plugi NVME_ARGS(opts); err = parse_args(argc, argv, desc, opts); - if (err < 0) + if (err) return err; err = validate_output_format(nvme_cfg.output_format, &flags); From 262c67505892a6886bcd28ecbd7746c3f8d34173 Mon Sep 17 00:00:00 2001 From: Tokunori Ikegami Date: Sat, 29 Jun 2024 16:41:56 +0900 Subject: [PATCH 002/281] nvme-print: Use 'unsigned int' instead of 'unsigned' Fix for the checkpatch review error below. Error: WARNING: Prefer 'unsigned int' to bare use of 'unsigned' Signed-off-by: Tokunori Ikegami --- nvme-print.c | 2 +- nvme-print.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/nvme-print.c b/nvme-print.c index 5b016c8f91..3e4f309c79 100644 --- a/nvme-print.c +++ b/nvme-print.c @@ -515,7 +515,7 @@ void nvme_show_cmd_set_independent_id_ns( nvme_print(id_independent_id_ns, flags, ns, nsid); } -void nvme_show_id_ns_descs(void *data, unsigned nsid, enum nvme_print_flags flags) +void nvme_show_id_ns_descs(void *data, unsigned int nsid, enum nvme_print_flags flags) { nvme_print(id_ns_descs, flags, data, nsid); } diff --git a/nvme-print.h b/nvme-print.h index fa74d7c326..8d9d2cd824 100644 --- a/nvme-print.h +++ b/nvme-print.h @@ -212,7 +212,7 @@ void nvme_show_supported_cap_config_log(struct nvme_supported_cap_config_list_lo void nvme_show_ctrl_registers(void *bar, bool fabrics, enum nvme_print_flags flags); void nvme_show_ctrl_register(void *bar, bool fabrics, int offset, enum nvme_print_flags flags); void nvme_show_single_property(int offset, uint64_t prop, enum nvme_print_flags flags); -void nvme_show_id_ns_descs(void *data, unsigned nsid, enum nvme_print_flags flags); +void nvme_show_id_ns_descs(void *data, unsigned int nsid, enum nvme_print_flags flags); void nvme_show_lba_status(struct nvme_lba_status *list, unsigned long len, enum nvme_print_flags flags); void nvme_show_list_items(nvme_root_t t, enum nvme_print_flags flags); From e1ce079b39f0e32c898611fc48b225fb31d4531c Mon Sep 17 00:00:00 2001 From: Tokunori Ikegami Date: Tue, 2 Jul 2024 01:06:31 +0900 Subject: [PATCH 003/281] nvme: add flags type nvme_print_flags_t Change the flags type to the type from enum nvme_print_flags. Signed-off-by: Tokunori Ikegami --- fabrics.c | 10 +- nbft.c | 6 +- nbft.h | 2 +- nvme-print-binary.c | 2 +- nvme-print-json.c | 2 +- nvme-print-stdout.c | 2 +- nvme-print.c | 126 ++++++++-------- nvme-print.h | 134 +++++++++--------- nvme.c | 102 ++++++------- nvme.h | 4 +- plugins/fdp/fdp.c | 10 +- plugins/huawei/huawei-nvme.c | 2 +- plugins/nbft/nbft-plugin.c | 2 +- plugins/ocp/ocp-fw-activation-history.c | 2 +- plugins/ocp/ocp-nvme.c | 12 +- plugins/ocp/ocp-smart-extended-log.c | 2 +- .../solidigm/solidigm-garbage-collection.c | 2 +- plugins/solidigm/solidigm-get-drive-info.c | 2 +- plugins/solidigm/solidigm-latency-tracking.c | 2 +- plugins/solidigm/solidigm-log-page-dir.c | 2 +- plugins/solidigm/solidigm-smart.c | 2 +- plugins/wdc/wdc-nvme.c | 40 +++--- plugins/zns/zns.c | 10 +- 23 files changed, 241 insertions(+), 239 deletions(-) diff --git a/fabrics.c b/fabrics.c index 59e52ba3d9..f1e0bd7772 100644 --- a/fabrics.c +++ b/fabrics.c @@ -261,7 +261,7 @@ static void save_discovery_log(char *raw, struct nvmf_discovery_log *log) static int __discover(nvme_ctrl_t c, struct nvme_fabrics_config *defcfg, char *raw, bool connect, bool persistent, - enum nvme_print_flags flags) + nvme_print_flags_t flags) { struct nvmf_discovery_log *log = NULL; nvme_subsystem_t s = nvme_ctrl_get_subsystem(c); @@ -407,7 +407,7 @@ static int discover_from_conf_file(nvme_root_t r, nvme_host_t h, int argc, ret = 0; unsigned int verbose = 0; FILE *f; - enum nvme_print_flags flags; + nvme_print_flags_t flags; char *format = "normal"; struct nvme_fabrics_config cfg; bool force = false; @@ -505,7 +505,7 @@ static int discover_from_conf_file(nvme_root_t r, nvme_host_t h, static int discover_from_json_config_file(nvme_root_t r, nvme_host_t h, const char *desc, bool connect, const struct nvme_fabrics_config *defcfg, - enum nvme_print_flags flags, + nvme_print_flags_t flags, bool force) { const char *transport, *traddr, *host_traddr, *host_iface, *trsvcid, *subsysnqn; @@ -693,7 +693,7 @@ int nvmf_discover(const char *desc, int argc, char **argv, bool connect) char *config_file = PATH_NVMF_CONFIG; char *hnqn = NULL, *hid = NULL; char *context = NULL; - enum nvme_print_flags flags; + nvme_print_flags_t flags; nvme_root_t r; nvme_host_t h; nvme_ctrl_t c = NULL; @@ -917,7 +917,7 @@ int nvmf_connect(const char *desc, int argc, char **argv) nvme_host_t h; nvme_ctrl_t c; int ret; - enum nvme_print_flags flags; + nvme_print_flags_t flags; struct nvme_fabrics_config cfg = { 0 }; char *format = "normal"; char *hostnqn_arg, *hostid_arg; diff --git a/nbft.c b/nbft.c index 8c03a1f53b..f93b4a57ad 100644 --- a/nbft.c +++ b/nbft.c @@ -110,7 +110,7 @@ static int do_connect(nvme_root_t r, struct nbft_info_subsystem_ns *ss, struct tr_config *trcfg, struct nvme_fabrics_config *cfg, - enum nvme_print_flags flags, + nvme_print_flags_t flags, unsigned int verbose) { nvme_ctrl_t c; @@ -184,7 +184,7 @@ static int do_discover(struct nbft_info_discovery *dd, nvme_ctrl_t c, struct nvme_fabrics_config *defcfg, struct tr_config *deftrcfg, - enum nvme_print_flags flags, + nvme_print_flags_t flags, unsigned int verbose) { struct nvmf_discovery_log *log = NULL; @@ -286,7 +286,7 @@ int discover_from_nbft(nvme_root_t r, char *hostnqn_arg, char *hostid_arg, char *hostnqn_sys, char *hostid_sys, const char *desc, bool connect, struct nvme_fabrics_config *cfg, char *nbft_path, - enum nvme_print_flags flags, unsigned int verbose) + nvme_print_flags_t flags, unsigned int verbose) { char *hostnqn = NULL, *hostid = NULL, *host_traddr = NULL; nvme_host_t h; diff --git a/nbft.h b/nbft.h index 5dfb8704fd..88e0f357ae 100644 --- a/nbft.h +++ b/nbft.h @@ -16,4 +16,4 @@ extern int discover_from_nbft(nvme_root_t r, char *hostnqn_arg, char *hostid_arg char *hostnqn_sys, char *hostid_sys, const char *desc, bool connect, struct nvme_fabrics_config *cfg, char *nbft_path, - enum nvme_print_flags flags, unsigned int verbose); + nvme_print_flags_t flags, unsigned int verbose); diff --git a/nvme-print-binary.c b/nvme-print-binary.c index d743b3e041..1743f6fe8d 100644 --- a/nvme-print-binary.c +++ b/nvme-print-binary.c @@ -379,7 +379,7 @@ static struct print_ops binary_print_ops = { .show_error_status = NULL, }; -struct print_ops *nvme_get_binary_print_ops(enum nvme_print_flags flags) +struct print_ops *nvme_get_binary_print_ops(nvme_print_flags_t flags) { binary_print_ops.flags = flags; return &binary_print_ops; diff --git a/nvme-print-json.c b/nvme-print-json.c index 0bb7a70587..ec04f79b12 100644 --- a/nvme-print-json.c +++ b/nvme-print-json.c @@ -4739,7 +4739,7 @@ static struct print_ops json_print_ops = { .show_error_status = json_output_error_status, }; -struct print_ops *nvme_get_json_print_ops(enum nvme_print_flags flags) +struct print_ops *nvme_get_json_print_ops(nvme_print_flags_t flags) { json_print_ops.flags = flags; return &json_print_ops; diff --git a/nvme-print-stdout.c b/nvme-print-stdout.c index 01c0019af2..d24cf74d08 100644 --- a/nvme-print-stdout.c +++ b/nvme-print-stdout.c @@ -5216,7 +5216,7 @@ static struct print_ops stdout_print_ops = { .show_error_status = stdout_error_status, }; -struct print_ops *nvme_get_stdout_print_ops(enum nvme_print_flags flags) +struct print_ops *nvme_get_stdout_print_ops(nvme_print_flags_t flags) { stdout_print_ops.flags = flags; return &stdout_print_ops; diff --git a/nvme-print.c b/nvme-print.c index 3e4f309c79..a3b8ddf34c 100644 --- a/nvme-print.c +++ b/nvme-print.c @@ -25,7 +25,7 @@ #define nvme_print_output_format(name, ...) \ nvme_print(name, nvme_is_output_format_json() ? JSON : NORMAL, ##__VA_ARGS__); -static struct print_ops *nvme_print_ops(enum nvme_print_flags flags) +static struct print_ops *nvme_print_ops(nvme_print_flags_t flags) { struct print_ops *ops = NULL; @@ -134,7 +134,7 @@ const char *nvme_sstat_status_to_string(__u16 status) void nvme_show_predictable_latency_per_nvmset( struct nvme_nvmset_predictable_lat_log *plpns_log, __u16 nvmset_id, const char *devname, - enum nvme_print_flags flags) + nvme_print_flags_t flags) { nvme_print(predictable_latency_per_nvmset, flags, plpns_log, nvmset_id, devname); @@ -143,7 +143,7 @@ void nvme_show_predictable_latency_per_nvmset( void nvme_show_predictable_latency_event_agg_log( struct nvme_aggregate_predictable_lat_event *pea_log, __u64 log_entries, __u32 size, const char *devname, - enum nvme_print_flags flags) + nvme_print_flags_t flags) { nvme_print(predictable_latency_event_agg_log, flags, pea_log, log_entries, size, devname); @@ -228,7 +228,7 @@ const char *nvme_nss_hw_error_to_string(__u16 error_code) void nvme_show_persistent_event_log(void *pevent_log_info, __u8 action, __u32 size, const char *devname, - enum nvme_print_flags flags) + nvme_print_flags_t flags) { nvme_print(persistent_event_log, flags, pevent_log_info, action, size, devname); @@ -237,14 +237,14 @@ void nvme_show_persistent_event_log(void *pevent_log_info, void nvme_show_endurance_group_event_agg_log( struct nvme_aggregate_predictable_lat_event *endurance_log, __u64 log_entries, __u32 size, const char *devname, - enum nvme_print_flags flags) + nvme_print_flags_t flags) { nvme_print(endurance_group_event_agg_log, flags, endurance_log, log_entries, size, devname); } void nvme_show_lba_status_log(void *lba_status, __u32 size, - const char *devname, enum nvme_print_flags flags) + const char *devname, nvme_print_flags_t flags) { nvme_print(lba_status_log, flags, lba_status, size, devname); } @@ -261,56 +261,56 @@ const char *nvme_resv_notif_to_string(__u8 type) } void nvme_show_resv_notif_log(struct nvme_resv_notification_log *resv, - const char *devname, enum nvme_print_flags flags) + const char *devname, nvme_print_flags_t flags) { nvme_print(resv_notification_log, flags, resv, devname); } void nvme_show_fid_support_effects_log(struct nvme_fid_supported_effects_log *fid_log, - const char *devname, enum nvme_print_flags flags) + const char *devname, nvme_print_flags_t flags) { nvme_print(fid_supported_effects_log, flags, fid_log, devname); } void nvme_show_mi_cmd_support_effects_log(struct nvme_mi_cmd_supported_effects_log *mi_cmd_log, - const char *devname, enum nvme_print_flags flags) + const char *devname, nvme_print_flags_t flags) { nvme_print(mi_cmd_support_effects_log, flags, mi_cmd_log, devname); } void nvme_show_boot_part_log(void *bp_log, const char *devname, - __u32 size, enum nvme_print_flags flags) + __u32 size, nvme_print_flags_t flags) { nvme_print(boot_part_log, flags, bp_log, devname, size); } void nvme_show_phy_rx_eom_log(struct nvme_phy_rx_eom_log *log, __u16 controller, - enum nvme_print_flags flags) + nvme_print_flags_t flags) { nvme_print(phy_rx_eom_log, flags, log, controller); } void nvme_show_media_unit_stat_log(struct nvme_media_unit_stat_log *mus_log, - enum nvme_print_flags flags) + nvme_print_flags_t flags) { nvme_print(media_unit_stat_log, flags, mus_log); } void nvme_show_fdp_configs(struct nvme_fdp_config_log *log, size_t len, - enum nvme_print_flags flags) + nvme_print_flags_t flags) { nvme_print(fdp_config_log, flags, log, len); } void nvme_show_fdp_usage(struct nvme_fdp_ruhu_log *log, size_t len, - enum nvme_print_flags flags) + nvme_print_flags_t flags) { nvme_print(fdp_usage_log, flags,log, len); } void nvme_show_fdp_stats(struct nvme_fdp_stats_log *log, - enum nvme_print_flags flags) + nvme_print_flags_t flags) { nvme_print(fdp_stats_log, flags, log); } @@ -330,26 +330,26 @@ const char *nvme_fdp_event_to_string(enum nvme_fdp_event_type event) } void nvme_show_fdp_events(struct nvme_fdp_events_log *log, - enum nvme_print_flags flags) + nvme_print_flags_t flags) { nvme_print(fdp_event_log, flags, log); } void nvme_show_fdp_ruh_status(struct nvme_fdp_ruh_status *status, size_t len, - enum nvme_print_flags flags) + nvme_print_flags_t flags) { nvme_print(fdp_ruh_status, flags, status, len); } void nvme_show_supported_cap_config_log( struct nvme_supported_cap_config_list_log *cap, - enum nvme_print_flags flags) + nvme_print_flags_t flags) { nvme_print(supported_cap_config_list_log, flags, cap); } void nvme_show_subsystem_list(nvme_root_t r, bool show_ana, - enum nvme_print_flags flags) + nvme_print_flags_t flags) { nvme_print(print_nvme_subsystem_list, flags, r, show_ana); } @@ -424,7 +424,7 @@ bool nvme_registers_pmrctl_ready(__u32 pmrctl) return NVME_PMRCTL_EN(pmrctl); } -void nvme_show_ctrl_register(void *bar, bool fabrics, int offset, enum nvme_print_flags flags) +void nvme_show_ctrl_register(void *bar, bool fabrics, int offset, nvme_print_flags_t flags) { uint64_t value; @@ -442,12 +442,12 @@ void nvme_show_ctrl_register(void *bar, bool fabrics, int offset, enum nvme_prin nvme_print(ctrl_register, flags, offset, value); } -void nvme_show_ctrl_registers(void *bar, bool fabrics, enum nvme_print_flags flags) +void nvme_show_ctrl_registers(void *bar, bool fabrics, nvme_print_flags_t flags) { nvme_print(ctrl_registers, flags, bar, fabrics); } -void nvme_show_single_property(int offset, uint64_t value64, enum nvme_print_flags flags) +void nvme_show_single_property(int offset, uint64_t value64, nvme_print_flags_t flags) { nvme_print(single_property, flags, offset, value64); } @@ -496,13 +496,13 @@ void nvme_show_error_status(int status, const char *msg, ...) va_end(ap); } -void nvme_show_id_ctrl_rpmbs(__le32 ctrl_rpmbs, enum nvme_print_flags flags) +void nvme_show_id_ctrl_rpmbs(__le32 ctrl_rpmbs, nvme_print_flags_t flags) { nvme_print(id_ctrl_rpmbs, flags, ctrl_rpmbs); } void nvme_show_id_ns(struct nvme_id_ns *ns, unsigned int nsid, - unsigned int lba_index, bool cap_only, enum nvme_print_flags flags) + unsigned int lba_index, bool cap_only, nvme_print_flags_t flags) { nvme_print(id_ns, flags, ns, nsid, lba_index, cap_only); } @@ -510,67 +510,67 @@ void nvme_show_id_ns(struct nvme_id_ns *ns, unsigned int nsid, void nvme_show_cmd_set_independent_id_ns( struct nvme_id_independent_id_ns *ns, unsigned int nsid, - enum nvme_print_flags flags) + nvme_print_flags_t flags) { nvme_print(id_independent_id_ns, flags, ns, nsid); } -void nvme_show_id_ns_descs(void *data, unsigned int nsid, enum nvme_print_flags flags) +void nvme_show_id_ns_descs(void *data, unsigned int nsid, nvme_print_flags_t flags) { nvme_print(id_ns_descs, flags, data, nsid); } -void nvme_show_id_ctrl(struct nvme_id_ctrl *ctrl, enum nvme_print_flags flags, +void nvme_show_id_ctrl(struct nvme_id_ctrl *ctrl, nvme_print_flags_t flags, void (*vendor_show)(__u8 *vs, struct json_object *root)) { nvme_print(id_ctrl, flags, ctrl, vendor_show); } void nvme_show_id_ctrl_nvm(struct nvme_id_ctrl_nvm *ctrl_nvm, - enum nvme_print_flags flags) + nvme_print_flags_t flags) { nvme_print(id_ctrl_nvm, flags, ctrl_nvm); } void nvme_show_nvm_id_ns(struct nvme_nvm_id_ns *nvm_ns, unsigned int nsid, struct nvme_id_ns *ns, unsigned int lba_index, - bool cap_only, enum nvme_print_flags flags) + bool cap_only, nvme_print_flags_t flags) { nvme_print(nvm_id_ns, flags, nvm_ns, nsid, ns, lba_index, cap_only); } void nvme_show_zns_id_ctrl(struct nvme_zns_id_ctrl *ctrl, - enum nvme_print_flags flags) + nvme_print_flags_t flags) { nvme_print(zns_id_ctrl, flags, ctrl); } void nvme_show_zns_id_ns(struct nvme_zns_id_ns *ns, struct nvme_id_ns *id_ns, - enum nvme_print_flags flags) + nvme_print_flags_t flags) { nvme_print(zns_id_ns, flags, ns, id_ns); } -void nvme_show_list_ns(struct nvme_ns_list *ns_list, enum nvme_print_flags flags) +void nvme_show_list_ns(struct nvme_ns_list *ns_list, nvme_print_flags_t flags) { nvme_print(ns_list, flags, ns_list); } void nvme_zns_start_zone_list(__u64 nr_zones, struct json_object **zone_list, - enum nvme_print_flags flags) + nvme_print_flags_t flags) { nvme_print(zns_start_zone_list, flags, nr_zones, zone_list); } void nvme_show_zns_changed(struct nvme_zns_changed_zone_log *log, - enum nvme_print_flags flags) + nvme_print_flags_t flags) { nvme_print(zns_changed_zone_log, flags, log); } void nvme_zns_finish_zone_list(__u64 nr_zones, struct json_object *zone_list, - enum nvme_print_flags flags) + nvme_print_flags_t flags) { nvme_print(zns_finish_zone_list, flags, nr_zones, zone_list); } @@ -610,33 +610,33 @@ const char *nvme_zone_state_to_string(__u8 state) void nvme_show_zns_report_zones(void *report, __u32 descs, __u8 ext_size, __u32 report_size, struct json_object *zone_list, - enum nvme_print_flags flags) + nvme_print_flags_t flags) { nvme_print(zns_report_zones, flags, report, descs, ext_size, report_size, zone_list); } void nvme_show_list_ctrl(struct nvme_ctrl_list *ctrl_list, - enum nvme_print_flags flags) + nvme_print_flags_t flags) { nvme_print(ctrl_list, flags, ctrl_list); } void nvme_show_id_nvmset(struct nvme_id_nvmset_list *nvmset, unsigned nvmset_id, - enum nvme_print_flags flags) + nvme_print_flags_t flags) { nvme_print(id_nvmset_list, flags, nvmset, nvmset_id); } void nvme_show_primary_ctrl_cap(const struct nvme_primary_ctrl_cap *caps, - enum nvme_print_flags flags) + nvme_print_flags_t flags) { nvme_print(primary_ctrl_cap, flags, caps); } void nvme_show_list_secondary_ctrl( const struct nvme_secondary_ctrl_list *sc_list, - __u32 count, enum nvme_print_flags flags) + __u32 count, nvme_print_flags_t flags) { __u16 num = sc_list->num; __u32 entries = min(num, count); @@ -645,30 +645,30 @@ void nvme_show_list_secondary_ctrl( } void nvme_show_id_ns_granularity_list(const struct nvme_id_ns_granularity_list *glist, - enum nvme_print_flags flags) + nvme_print_flags_t flags) { nvme_print(id_ns_granularity_list, flags, glist); } void nvme_show_id_uuid_list(const struct nvme_id_uuid_list *uuid_list, - enum nvme_print_flags flags) + nvme_print_flags_t flags) { nvme_print(id_uuid_list, flags, uuid_list); } void nvme_show_id_domain_list(struct nvme_id_domain_list *id_dom, - enum nvme_print_flags flags) + nvme_print_flags_t flags) { nvme_print(id_domain_list, flags, id_dom); } void nvme_show_endurance_group_list(struct nvme_id_endurance_group_list *endgrp_list, - enum nvme_print_flags flags) + nvme_print_flags_t flags) { nvme_print(endurance_group_list, flags, endgrp_list); } -void nvme_show_id_iocs(struct nvme_id_iocs *iocs, enum nvme_print_flags flags) +void nvme_show_id_iocs(struct nvme_id_iocs *iocs, nvme_print_flags_t flags) { nvme_print(id_iocs, flags, iocs); } @@ -687,32 +687,32 @@ const char *nvme_trtype_to_string(__u8 trtype) } void nvme_show_error_log(struct nvme_error_log_page *err_log, int entries, - const char *devname, enum nvme_print_flags flags) + const char *devname, nvme_print_flags_t flags) { nvme_print(error_log, flags, err_log, entries, devname); } void nvme_show_resv_report(struct nvme_resv_status *status, int bytes, - bool eds, enum nvme_print_flags flags) + bool eds, nvme_print_flags_t flags) { nvme_print(resv_report, flags, status, bytes, eds); } void nvme_show_fw_log(struct nvme_firmware_slot *fw_log, - const char *devname, enum nvme_print_flags flags) + const char *devname, nvme_print_flags_t flags) { nvme_print(fw_log, flags, fw_log, devname); } void nvme_show_changed_ns_list_log(struct nvme_ns_list *log, const char *devname, - enum nvme_print_flags flags) + nvme_print_flags_t flags) { nvme_print(ns_list_log, flags, log, devname); } void nvme_print_effects_log_pages(struct list_head *list, - enum nvme_print_flags flags) + nvme_print_flags_t flags) { nvme_print(effects_log_list, flags, list); } @@ -755,14 +755,14 @@ const char *nvme_log_to_string(__u8 lid) } void nvme_show_supported_log(struct nvme_supported_log_pages *support_log, - const char *devname, enum nvme_print_flags flags) + const char *devname, nvme_print_flags_t flags) { nvme_print(supported_log_pages, flags, support_log, devname); } void nvme_show_endurance_log(struct nvme_endurance_group_log *endurance_log, __u16 group_id, const char *devname, - enum nvme_print_flags flags) + nvme_print_flags_t flags) { nvme_print(endurance_log, flags, endurance_log, group_id, devname); } @@ -782,25 +782,25 @@ const char *nvme_degrees_string(long t, bool fahrenheit) } void nvme_show_smart_log(struct nvme_smart_log *smart, unsigned int nsid, - const char *devname, enum nvme_print_flags flags) + const char *devname, nvme_print_flags_t flags) { nvme_print(smart_log, flags, smart, nsid, devname); } void nvme_show_ana_log(struct nvme_ana_log *ana_log, const char *devname, - size_t len, enum nvme_print_flags flags) + size_t len, nvme_print_flags_t flags) { nvme_print(ana_log, flags, ana_log, devname, len); } void nvme_show_self_test_log(struct nvme_self_test_log *self_test, __u8 dst_entries, - __u32 size, const char *devname, enum nvme_print_flags flags) + __u32 size, const char *devname, nvme_print_flags_t flags) { nvme_print(self_test_log, flags, self_test, dst_entries, size, devname); } void nvme_show_sanitize_log(struct nvme_sanitize_log_page *sanitize, - const char *devname, enum nvme_print_flags flags) + const char *devname, nvme_print_flags_t flags) { nvme_print(sanitize_log_page, flags, sanitize, devname); } @@ -953,7 +953,7 @@ const char *nvme_feature_lba_type_to_string(__u8 type) } void nvme_show_lba_range(struct nvme_lba_range_type *lbrt, int nr_ranges, - enum nvme_print_flags flags) + nvme_print_flags_t flags) { nvme_print(lba_range, flags, lbrt, nr_ranges); } @@ -1010,7 +1010,7 @@ const char *nvme_ns_wp_cfg_to_string(enum nvme_ns_write_protect_cfg state) } void nvme_directive_show(__u8 type, __u8 oper, __u16 spec, __u32 nsid, __u32 result, - void *buf, __u32 len, enum nvme_print_flags flags) + void *buf, __u32 len, nvme_print_flags_t flags) { nvme_print(directive, flags, type, oper, spec, nsid, result, buf, len); } @@ -1200,7 +1200,7 @@ void nvme_feature_show_fields(enum nvme_features_id fid, unsigned int result, un } void nvme_show_lba_status(struct nvme_lba_status *list, unsigned long len, - enum nvme_print_flags flags) + nvme_print_flags_t flags) { nvme_print(lba_status, flags, list, len); } @@ -1254,14 +1254,14 @@ void nvme_show_list_item(nvme_ns_t n) nvme_print(list_item, NORMAL, n); } -void nvme_show_list_items(nvme_root_t r, enum nvme_print_flags flags) +void nvme_show_list_items(nvme_root_t r, nvme_print_flags_t flags) { nvme_print(list_items, flags, r); } void nvme_show_topology(nvme_root_t r, enum nvme_cli_topo_ranking ranking, - enum nvme_print_flags flags) + nvme_print_flags_t flags) { if (ranking == NVME_CLI_TOPO_NAMESPACE) nvme_print(topology_namespace, flags, r); @@ -1297,12 +1297,12 @@ void nvme_show_perror(const char *msg) } void nvme_show_discovery_log(struct nvmf_discovery_log *log, uint64_t numrec, - enum nvme_print_flags flags) + nvme_print_flags_t flags) { nvme_print(discovery_log, flags, log, numrec); } -void nvme_show_connect_msg(nvme_ctrl_t c, enum nvme_print_flags flags) +void nvme_show_connect_msg(nvme_ctrl_t c, nvme_print_flags_t flags) { nvme_print(connect_msg, flags, c); } diff --git a/nvme-print.h b/nvme-print.h index 8d9d2cd824..11928af60e 100644 --- a/nvme-print.h +++ b/nvme-print.h @@ -105,7 +105,7 @@ struct print_ops { void (*show_status)(int status); void (*show_error_status)(int status, const char *msg, va_list ap); - enum nvme_print_flags flags; + nvme_print_flags_t flags; }; struct nvme_bar_cap { @@ -131,158 +131,158 @@ struct nvme_bar_cap { #ifdef CONFIG_JSONC -struct print_ops *nvme_get_json_print_ops(enum nvme_print_flags flags); +struct print_ops *nvme_get_json_print_ops(nvme_print_flags_t flags); #else /* !CONFIG_JSONC */ -static inline struct print_ops *nvme_get_json_print_ops(enum nvme_print_flags flags) { return NULL; } +static inline struct print_ops *nvme_get_json_print_ops(nvme_print_flags_t flags) { return NULL; } #endif /* !CONFIG_JSONC */ -struct print_ops *nvme_get_stdout_print_ops(enum nvme_print_flags flags); -struct print_ops *nvme_get_binary_print_ops(enum nvme_print_flags flags); +struct print_ops *nvme_get_stdout_print_ops(nvme_print_flags_t flags); +struct print_ops *nvme_get_binary_print_ops(nvme_print_flags_t flags); void nvme_show_status(int status); void nvme_show_lba_status_info(__u32 result); void nvme_show_relatives(const char *name); -void nvme_show_id_iocs(struct nvme_id_iocs *iocs, enum nvme_print_flags flags); -void nvme_show_id_ctrl(struct nvme_id_ctrl *ctrl, enum nvme_print_flags flags, +void nvme_show_id_iocs(struct nvme_id_iocs *iocs, nvme_print_flags_t flags); +void nvme_show_id_ctrl(struct nvme_id_ctrl *ctrl, nvme_print_flags_t flags, void (*vendor_show)(__u8 *vs, struct json_object *root)); -void nvme_show_id_ctrl_rpmbs(__le32 ctrl_rpmbs, enum nvme_print_flags flags); +void nvme_show_id_ctrl_rpmbs(__le32 ctrl_rpmbs, nvme_print_flags_t flags); void nvme_show_id_ns(struct nvme_id_ns *ns, unsigned int nsid, - unsigned int lba_index, bool cap_only, enum nvme_print_flags flags); + unsigned int lba_index, bool cap_only, nvme_print_flags_t flags); void nvme_show_cmd_set_independent_id_ns( struct nvme_id_independent_id_ns *ns, unsigned int nsid, - enum nvme_print_flags flags); + nvme_print_flags_t flags); void nvme_show_resv_report(struct nvme_resv_status *status, int bytes, bool eds, - enum nvme_print_flags flags); + nvme_print_flags_t flags); void nvme_show_lba_range(struct nvme_lba_range_type *lbrt, int nr_ranges, - enum nvme_print_flags flags); + nvme_print_flags_t flags); void nvme_show_supported_log(struct nvme_supported_log_pages *support, - const char *devname, enum nvme_print_flags flags); + const char *devname, nvme_print_flags_t flags); void nvme_show_error_log(struct nvme_error_log_page *err_log, int entries, - const char *devname, enum nvme_print_flags flags); + const char *devname, nvme_print_flags_t flags); void nvme_show_smart_log(struct nvme_smart_log *smart, unsigned int nsid, const char *devname, - enum nvme_print_flags flags); + nvme_print_flags_t flags); void nvme_show_ana_log(struct nvme_ana_log *ana_log, const char *devname, - size_t len, enum nvme_print_flags flags); + size_t len, nvme_print_flags_t flags); void nvme_show_self_test_log(struct nvme_self_test_log *self_test, __u8 dst_entries, - __u32 size, const char *devname, enum nvme_print_flags flags); + __u32 size, const char *devname, nvme_print_flags_t flags); void nvme_show_fw_log(struct nvme_firmware_slot *fw_log, const char *devname, - enum nvme_print_flags flags); + nvme_print_flags_t flags); void nvme_print_effects_log_pages(struct list_head *list, - enum nvme_print_flags flags); + nvme_print_flags_t flags); void nvme_show_changed_ns_list_log(struct nvme_ns_list *log, - const char *devname, enum nvme_print_flags flags); + const char *devname, nvme_print_flags_t flags); void nvme_show_endurance_log(struct nvme_endurance_group_log *endurance_log, - __u16 group_id, const char *devname, enum nvme_print_flags flags); + __u16 group_id, const char *devname, nvme_print_flags_t flags); void nvme_show_sanitize_log(struct nvme_sanitize_log_page *sanitize, - const char *devname, enum nvme_print_flags flags); + const char *devname, nvme_print_flags_t flags); void nvme_show_predictable_latency_per_nvmset( struct nvme_nvmset_predictable_lat_log *plpns_log, - __u16 nvmset_id, const char *devname, enum nvme_print_flags flags); + __u16 nvmset_id, const char *devname, nvme_print_flags_t flags); void nvme_show_predictable_latency_event_agg_log( struct nvme_aggregate_predictable_lat_event *pea_log, __u64 log_entries, __u32 size, const char *devname, - enum nvme_print_flags flags); + nvme_print_flags_t flags); void nvme_show_persistent_event_log(void *pevent_log_info, __u8 action, __u32 size, const char *devname, - enum nvme_print_flags flags); + nvme_print_flags_t flags); void nvme_show_endurance_group_event_agg_log( struct nvme_aggregate_predictable_lat_event *endurance_log, __u64 log_entries, __u32 size, const char *devname, - enum nvme_print_flags flags); + nvme_print_flags_t flags); void nvme_show_lba_status_log(void *lba_status, __u32 size, - const char *devname, enum nvme_print_flags flags); + const char *devname, nvme_print_flags_t flags); void nvme_show_resv_notif_log(struct nvme_resv_notification_log *resv, - const char *devname, enum nvme_print_flags flags); + const char *devname, nvme_print_flags_t flags); void nvme_show_boot_part_log(void *bp_log, const char *devname, - __u32 size, enum nvme_print_flags flags); + __u32 size, nvme_print_flags_t flags); void nvme_show_phy_rx_eom_log(struct nvme_phy_rx_eom_log *log, - __u16 controller, enum nvme_print_flags flags); + __u16 controller, nvme_print_flags_t flags); void nvme_show_fid_support_effects_log(struct nvme_fid_supported_effects_log *fid_log, - const char *devname, enum nvme_print_flags flags); + const char *devname, nvme_print_flags_t flags); void nvme_show_mi_cmd_support_effects_log(struct nvme_mi_cmd_supported_effects_log *mi_cmd_log, - const char *devname, enum nvme_print_flags flags); + const char *devname, nvme_print_flags_t flags); void nvme_show_media_unit_stat_log(struct nvme_media_unit_stat_log *mus, - enum nvme_print_flags flags); + nvme_print_flags_t flags); void nvme_show_supported_cap_config_log(struct nvme_supported_cap_config_list_log *caplog, - enum nvme_print_flags flags); -void nvme_show_ctrl_registers(void *bar, bool fabrics, enum nvme_print_flags flags); -void nvme_show_ctrl_register(void *bar, bool fabrics, int offset, enum nvme_print_flags flags); -void nvme_show_single_property(int offset, uint64_t prop, enum nvme_print_flags flags); -void nvme_show_id_ns_descs(void *data, unsigned int nsid, enum nvme_print_flags flags); + nvme_print_flags_t flags); +void nvme_show_ctrl_registers(void *bar, bool fabrics, nvme_print_flags_t flags); +void nvme_show_ctrl_register(void *bar, bool fabrics, int offset, nvme_print_flags_t flags); +void nvme_show_single_property(int offset, uint64_t prop, nvme_print_flags_t flags); +void nvme_show_id_ns_descs(void *data, unsigned int nsid, nvme_print_flags_t flags); void nvme_show_lba_status(struct nvme_lba_status *list, unsigned long len, - enum nvme_print_flags flags); -void nvme_show_list_items(nvme_root_t t, enum nvme_print_flags flags); + nvme_print_flags_t flags); +void nvme_show_list_items(nvme_root_t t, nvme_print_flags_t flags); void nvme_show_subsystem_list(nvme_root_t t, bool show_ana, - enum nvme_print_flags flags); + nvme_print_flags_t flags); void nvme_show_id_nvmset(struct nvme_id_nvmset_list *nvmset, unsigned nvmset_id, - enum nvme_print_flags flags); + nvme_print_flags_t flags); void nvme_show_primary_ctrl_cap(const struct nvme_primary_ctrl_cap *cap, - enum nvme_print_flags flags); + nvme_print_flags_t flags); void nvme_show_list_secondary_ctrl(const struct nvme_secondary_ctrl_list *sc_list, - __u32 count, enum nvme_print_flags flags); + __u32 count, nvme_print_flags_t flags); void nvme_show_id_ns_granularity_list(const struct nvme_id_ns_granularity_list *glist, - enum nvme_print_flags flags); + nvme_print_flags_t flags); void nvme_show_id_uuid_list(const struct nvme_id_uuid_list *uuid_list, - enum nvme_print_flags flags); + nvme_print_flags_t flags); void nvme_show_list_ctrl(struct nvme_ctrl_list *ctrl_list, - enum nvme_print_flags flags); + nvme_print_flags_t flags); void nvme_show_id_domain_list(struct nvme_id_domain_list *id_dom, - enum nvme_print_flags flags); + nvme_print_flags_t flags); void nvme_show_endurance_group_list(struct nvme_id_endurance_group_list *endgrp_list, - enum nvme_print_flags flags); + nvme_print_flags_t flags); void nvme_show_list_ns(struct nvme_ns_list *ns_list, - enum nvme_print_flags flags); + nvme_print_flags_t flags); void nvme_show_topology(nvme_root_t t, enum nvme_cli_topo_ranking ranking, - enum nvme_print_flags flags); + nvme_print_flags_t flags); void nvme_feature_show(enum nvme_features_id fid, int sel, unsigned int result); void nvme_feature_show_fields(enum nvme_features_id fid, unsigned int result, unsigned char *buf); void nvme_directive_show(__u8 type, __u8 oper, __u16 spec, __u32 nsid, __u32 result, - void *buf, __u32 len, enum nvme_print_flags flags); + void *buf, __u32 len, nvme_print_flags_t flags); void nvme_show_select_result(enum nvme_features_id fid, __u32 result); void nvme_show_zns_id_ctrl(struct nvme_zns_id_ctrl *ctrl, - enum nvme_print_flags flags); + nvme_print_flags_t flags); void nvme_show_id_ctrl_nvm(struct nvme_id_ctrl_nvm *ctrl_nvm, - enum nvme_print_flags flags); + nvme_print_flags_t flags); void nvme_show_nvm_id_ns(struct nvme_nvm_id_ns *nvm_ns, unsigned int nsid, struct nvme_id_ns *ns, unsigned int lba_index, - bool cap_only, enum nvme_print_flags flags); + bool cap_only, nvme_print_flags_t flags); void nvme_show_zns_id_ns(struct nvme_zns_id_ns *ns, - struct nvme_id_ns *id_ns, enum nvme_print_flags flags); + struct nvme_id_ns *id_ns, nvme_print_flags_t flags); void nvme_zns_start_zone_list(__u64 nr_zones, struct json_object **zone_list, - enum nvme_print_flags flags); + nvme_print_flags_t flags); void nvme_show_zns_changed(struct nvme_zns_changed_zone_log *log, - enum nvme_print_flags flags); + nvme_print_flags_t flags); void nvme_zns_finish_zone_list(__u64 nr_zones, struct json_object *zone_list, - enum nvme_print_flags flags); + nvme_print_flags_t flags); void nvme_show_zns_report_zones(void *report, __u32 descs, __u8 ext_size, __u32 report_size, struct json_object *zone_list, - enum nvme_print_flags flags); + nvme_print_flags_t flags); void json_nvme_finish_zone_list(__u64 nr_zones, struct json_object *zone_list); void nvme_show_list_item(nvme_ns_t n); void nvme_show_fdp_configs(struct nvme_fdp_config_log *configs, size_t len, - enum nvme_print_flags flags); + nvme_print_flags_t flags); void nvme_show_fdp_stats(struct nvme_fdp_stats_log *log, - enum nvme_print_flags flags); + nvme_print_flags_t flags); void nvme_show_fdp_events(struct nvme_fdp_events_log *log, - enum nvme_print_flags flags); + nvme_print_flags_t flags); void nvme_show_fdp_usage(struct nvme_fdp_ruhu_log *log, size_t len, - enum nvme_print_flags flags); + nvme_print_flags_t flags); void nvme_show_fdp_ruh_status(struct nvme_fdp_ruh_status *status, size_t len, - enum nvme_print_flags flags); + nvme_print_flags_t flags); void nvme_show_discovery_log(struct nvmf_discovery_log *log, uint64_t numrec, - enum nvme_print_flags flags); -void nvme_show_connect_msg(nvme_ctrl_t c, enum nvme_print_flags flags); + nvme_print_flags_t flags); +void nvme_show_connect_msg(nvme_ctrl_t c, nvme_print_flags_t flags); const char *nvme_ana_state_to_string(enum nvme_ana_state state); const char *nvme_cmd_to_string(int admin, __u8 opcode); diff --git a/nvme.c b/nvme.c index 91012faf98..528eb448b4 100644 --- a/nvme.c +++ b/nvme.c @@ -489,9 +489,9 @@ int open_exclusive(struct nvme_dev **dev, int argc, char **argv, return get_dev(dev, argc, argv, flags); } -int validate_output_format(const char *format, enum nvme_print_flags *flags) +int validate_output_format(const char *format, nvme_print_flags_t *flags) { - enum nvme_print_flags f; + nvme_print_flags_t f; if (!format) return -EINVAL; @@ -512,7 +512,7 @@ int validate_output_format(const char *format, enum nvme_print_flags *flags) bool nvme_is_output_format_json(void) { - enum nvme_print_flags flags; + nvme_print_flags_t flags; if (validate_output_format(nvme_cfg.output_format, &flags)) return false; @@ -543,7 +543,7 @@ static int get_smart_log(int argc, char **argv, struct command *cmd, struct plug _cleanup_free_ struct nvme_smart_log *smart_log = NULL; _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; const char *namespace = "(optional) desired namespace"; - enum nvme_print_flags flags; + nvme_print_flags_t flags; int err = -1; struct config { @@ -613,7 +613,7 @@ static int get_ana_log(int argc, char **argv, struct command *cmd, _cleanup_free_ struct nvme_ana_log *ana_log = NULL; size_t max_ana_log_len; __u32 ana_log_len; - enum nvme_print_flags flags; + nvme_print_flags_t flags; int err = -1; struct config { @@ -986,7 +986,7 @@ static int get_endurance_log(int argc, char **argv, struct command *cmd, struct _cleanup_free_ struct nvme_endurance_group_log *endurance_log = NULL; _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; - enum nvme_print_flags flags; + nvme_print_flags_t flags; int err; struct config { @@ -1059,7 +1059,7 @@ static int get_effects_log(int argc, char **argv, struct command *cmd, struct pl void *bar = NULL; int err = -1; - enum nvme_print_flags flags; + nvme_print_flags_t flags; struct config { bool human_readable; @@ -1149,7 +1149,7 @@ static int get_supported_log_pages(int argc, char **argv, struct command *cmd, _cleanup_free_ struct nvme_supported_log_pages *supports = NULL; _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; - enum nvme_print_flags flags; + nvme_print_flags_t flags; int err = -1; NVME_ARGS(opts); @@ -1193,7 +1193,7 @@ static int get_error_log(int argc, char **argv, struct command *cmd, struct plug _cleanup_free_ struct nvme_error_log_page *err_log = NULL; _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; struct nvme_id_ctrl ctrl; - enum nvme_print_flags flags; + nvme_print_flags_t flags; int err = -1; struct config { @@ -1261,7 +1261,7 @@ static int get_fw_log(int argc, char **argv, struct command *cmd, struct plugin _cleanup_free_ struct nvme_firmware_slot *fw_log = NULL; _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; - enum nvme_print_flags flags; + nvme_print_flags_t flags; int err; struct config { @@ -1310,7 +1310,7 @@ static int get_changed_ns_list_log(int argc, char **argv, struct command *cmd, s _cleanup_free_ struct nvme_ns_list *changed_ns_list_log = NULL; _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; - enum nvme_print_flags flags; + nvme_print_flags_t flags; int err; struct config { @@ -1364,7 +1364,7 @@ static int get_pred_lat_per_nvmset_log(int argc, char **argv, _cleanup_free_ struct nvme_nvmset_predictable_lat_log *plpns_log = NULL; _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; - enum nvme_print_flags flags; + nvme_print_flags_t flags; int err; struct config { @@ -1422,7 +1422,7 @@ static int get_pred_lat_event_agg_log(int argc, char **argv, _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; _cleanup_free_ struct nvme_id_ctrl *ctrl = NULL; _cleanup_free_ void *pea_log = NULL; - enum nvme_print_flags flags; + nvme_print_flags_t flags; __u32 log_size; int err; @@ -1508,7 +1508,7 @@ static int get_persistent_event_log(int argc, char **argv, struct nvme_persistent_event_log *pevent_collected = NULL; _cleanup_huge_ struct nvme_mem_huge mh = { 0, }; _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; - enum nvme_print_flags flags; + nvme_print_flags_t flags; void *pevent_log_info; int err; @@ -1624,7 +1624,7 @@ static int get_endurance_event_agg_log(int argc, char **argv, _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; _cleanup_free_ struct nvme_id_ctrl *ctrl = NULL; _cleanup_free_ void *endurance_log = NULL; - enum nvme_print_flags flags; + nvme_print_flags_t flags; __u32 log_size; int err; @@ -1705,7 +1705,7 @@ static int get_lba_status_log(int argc, char **argv, _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; _cleanup_free_ void *lba_status = NULL; - enum nvme_print_flags flags; + nvme_print_flags_t flags; __u32 lslplen; int err; @@ -1765,7 +1765,7 @@ static int get_resv_notif_log(int argc, char **argv, _cleanup_free_ struct nvme_resv_notification_log *resv = NULL; _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; - enum nvme_print_flags flags; + nvme_print_flags_t flags; int err; NVME_ARGS(opts); @@ -1806,7 +1806,7 @@ static int get_boot_part_log(int argc, char **argv, struct command *cmd, struct _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; _cleanup_free_ struct nvme_boot_partition *boot = NULL; _cleanup_free_ __u8 *bp_log = NULL; - enum nvme_print_flags flags; + nvme_print_flags_t flags; int err = -1; _cleanup_file_ int output = -1; __u32 bpsz = 0; @@ -1900,7 +1900,7 @@ static int get_phy_rx_eom_log(int argc, char **argv, struct command *cmd, const char *controller = "Target Controller ID."; _cleanup_free_ struct nvme_phy_rx_eom_log *phy_rx_eom_log = NULL; size_t phy_rx_eom_log_len; - enum nvme_print_flags flags; + nvme_print_flags_t flags; _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; int err = -1; __u8 lsp_tmp; @@ -1990,7 +1990,7 @@ static int get_media_unit_stat_log(int argc, char **argv, struct command *cmd, _cleanup_free_ struct nvme_media_unit_stat_log *mus = NULL; _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; - enum nvme_print_flags flags; + nvme_print_flags_t flags; int err = -1; struct config { @@ -2042,7 +2042,7 @@ static int get_supp_cap_config_log(int argc, char **argv, struct command *cmd, _cleanup_free_ struct nvme_supported_cap_config_list_log *cap_log = NULL; _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; - enum nvme_print_flags flags; + nvme_print_flags_t flags; int err = -1; struct config { @@ -2399,7 +2399,7 @@ static int sanitize_log(int argc, char **argv, struct command *command, struct p _cleanup_free_ struct nvme_sanitize_log_page *sanitize_log = NULL; _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; - enum nvme_print_flags flags; + nvme_print_flags_t flags; int err; struct config { @@ -2457,7 +2457,7 @@ static int get_fid_support_effects_log(int argc, char **argv, struct command *cm _cleanup_free_ struct nvme_fid_supported_effects_log *fid_support_log = NULL; _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; - enum nvme_print_flags flags; + nvme_print_flags_t flags; int err = -1; struct config { @@ -2506,7 +2506,7 @@ static int get_mi_cmd_support_effects_log(int argc, char **argv, struct command _cleanup_free_ struct nvme_mi_cmd_supported_effects_log *mi_cmd_support_log = NULL; _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; - enum nvme_print_flags flags; + nvme_print_flags_t flags; int err = -1; struct config { @@ -2556,7 +2556,7 @@ static int list_ctrl(int argc, char **argv, struct command *cmd, struct plugin * _cleanup_free_ struct nvme_ctrl_list *cntlist = NULL; _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; - enum nvme_print_flags flags; + nvme_print_flags_t flags; int err; struct config { @@ -2612,7 +2612,7 @@ static int list_ns(int argc, char **argv, struct command *cmd, struct plugin *pl _cleanup_free_ struct nvme_ns_list *ns_list = NULL; _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; - enum nvme_print_flags flags; + nvme_print_flags_t flags; int err; struct config { @@ -2685,7 +2685,7 @@ static int id_ns_lba_format(int argc, char **argv, struct command *cmd, struct p _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; _cleanup_free_ struct nvme_id_ns *ns = NULL; - enum nvme_print_flags flags; + nvme_print_flags_t flags; int err = -1; struct config { @@ -2740,7 +2740,7 @@ static int id_endurance_grp_list(int argc, char **argv, struct command *cmd, _cleanup_free_ struct nvme_id_endurance_group_list *endgrp_list = NULL; _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; - enum nvme_print_flags flags; + nvme_print_flags_t flags; int err = -1; struct config { @@ -3310,7 +3310,7 @@ static int list_subsys(int argc, char **argv, struct command *cmd, struct plugin *plugin) { _cleanup_nvme_root_ nvme_root_t r = NULL; - enum nvme_print_flags flags; + nvme_print_flags_t flags; const char *desc = "Retrieve information for subsystems"; nvme_scan_filter_t filter = NULL; char *devname; @@ -3371,7 +3371,7 @@ static int list_subsys(int argc, char **argv, struct command *cmd, static int list(int argc, char **argv, struct command *cmd, struct plugin *plugin) { const char *desc = "Retrieve basic information for all NVMe namespaces"; - enum nvme_print_flags flags; + nvme_print_flags_t flags; _cleanup_nvme_root_ nvme_root_t r = NULL; int err = 0; @@ -3419,7 +3419,7 @@ int __id_ctrl(int argc, char **argv, struct command *cmd, struct plugin *plugin, _cleanup_free_ struct nvme_id_ctrl *ctrl = NULL; _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; - enum nvme_print_flags flags; + nvme_print_flags_t flags; int err; struct config { @@ -3487,7 +3487,7 @@ static int nvm_id_ctrl(int argc, char **argv, struct command *cmd, _cleanup_free_ struct nvme_id_ctrl_nvm *ctrl_nvm = NULL; _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; - enum nvme_print_flags flags; + nvme_print_flags_t flags; int err = -1; NVME_ARGS(opts); @@ -3527,7 +3527,7 @@ static int nvm_id_ns(int argc, char **argv, struct command *cmd, _cleanup_free_ struct nvme_nvm_id_ns *id_ns = NULL; _cleanup_free_ struct nvme_id_ns *ns = NULL; _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; - enum nvme_print_flags flags; + nvme_print_flags_t flags; int err = -1; struct config { @@ -3601,7 +3601,7 @@ static int nvm_id_ns_lba_format(int argc, char **argv, struct command *cmd, stru _cleanup_free_ struct nvme_nvm_id_ns *nvm_ns = NULL; _cleanup_free_ struct nvme_id_ns *ns = NULL; _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; - enum nvme_print_flags flags; + nvme_print_flags_t flags; int err = -1; struct config { @@ -3666,7 +3666,7 @@ static int ns_descs(int argc, char **argv, struct command *cmd, struct plugin *p _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; _cleanup_free_ void *nsdescs = NULL; - enum nvme_print_flags flags; + nvme_print_flags_t flags; int err; struct config { @@ -3733,7 +3733,7 @@ static int id_ns(int argc, char **argv, struct command *cmd, struct plugin *plug _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; _cleanup_free_ struct nvme_id_ns *ns = NULL; - enum nvme_print_flags flags; + nvme_print_flags_t flags; int err; struct config { @@ -3814,7 +3814,7 @@ static int cmd_set_independent_id_ns(int argc, char **argv, struct command *cmd, _cleanup_free_ struct nvme_id_independent_id_ns *ns = NULL; _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; - enum nvme_print_flags flags; + nvme_print_flags_t flags; int err = -1; struct config { @@ -3882,7 +3882,7 @@ static int id_ns_granularity(int argc, char **argv, struct command *cmd, struct _cleanup_free_ struct nvme_id_ns_granularity_list *granularity_list = NULL; _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; - enum nvme_print_flags flags; + nvme_print_flags_t flags; int err; NVME_ARGS(opts); @@ -3922,7 +3922,7 @@ static int id_nvmset(int argc, char **argv, struct command *cmd, struct plugin * _cleanup_free_ struct nvme_id_nvmset_list *nvmset = NULL; _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; - enum nvme_print_flags flags; + nvme_print_flags_t flags; int err; struct config { @@ -3971,7 +3971,7 @@ static int id_uuid(int argc, char **argv, struct command *cmd, struct plugin *pl _cleanup_free_ struct nvme_id_uuid_list *uuid_list = NULL; _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; - enum nvme_print_flags flags; + nvme_print_flags_t flags; int err; struct config { @@ -4071,7 +4071,7 @@ static int id_domain(int argc, char **argv, struct command *cmd, struct plugin * _cleanup_free_ struct nvme_id_domain_list *id_domain = NULL; _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; - enum nvme_print_flags flags; + nvme_print_flags_t flags; int err; struct config { @@ -4214,7 +4214,7 @@ static int primary_ctrl_caps(int argc, char **argv, struct command *cmd, struct _cleanup_free_ struct nvme_primary_ctrl_cap *caps = NULL; _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; - enum nvme_print_flags flags; + nvme_print_flags_t flags; int err; struct config { @@ -4269,7 +4269,7 @@ static int list_secondary_ctrl(int argc, char **argv, struct command *cmd, struc _cleanup_free_ struct nvme_secondary_ctrl_list *sc_list = NULL; _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; - enum nvme_print_flags flags; + nvme_print_flags_t flags; int err; struct config { @@ -4527,7 +4527,7 @@ static int self_test_log(int argc, char **argv, struct command *cmd, struct plug _cleanup_free_ struct nvme_self_test_log *log = NULL; _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; - enum nvme_print_flags flags; + nvme_print_flags_t flags; int err; struct config { @@ -5418,7 +5418,7 @@ static int show_registers(int argc, char **argv, struct command *cmd, struct plu "show info in readable format in case of output_format == normal"; _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; - enum nvme_print_flags flags; + nvme_print_flags_t flags; bool fabrics = false; void *bar; int err; @@ -5618,7 +5618,7 @@ bool nvme_is_ctrl_reg(int offset) } static bool get_register_offset(void *bar, bool fabrics, struct get_reg_config *cfg, - enum nvme_print_flags flags) + nvme_print_flags_t flags) { bool offset_matched = cfg->offset >= 0; int offset; @@ -5665,7 +5665,7 @@ static int get_register(int argc, char **argv, struct command *cmd, struct plugi _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; int err; - enum nvme_print_flags flags; + nvme_print_flags_t flags; bool fabrics = false; void *bar; @@ -7630,7 +7630,7 @@ static int resv_report(int argc, char **argv, struct command *cmd, struct plugin _cleanup_free_ struct nvme_resv_status *status = NULL; _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; - enum nvme_print_flags flags; + nvme_print_flags_t flags; int err, size; struct config { @@ -8319,7 +8319,7 @@ static int get_lba_status(int argc, char **argv, struct command *cmd, _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; _cleanup_free_ void *buf = NULL; - enum nvme_print_flags flags; + nvme_print_flags_t flags; unsigned long buf_len; int err; @@ -8466,7 +8466,7 @@ static int dir_receive(int argc, char **argv, struct command *cmd, struct plugin const char *desc = "Read directive parameters of the specified directive type."; const char *nsr = "namespace stream requested"; - enum nvme_print_flags flags = NORMAL; + nvme_print_flags_t flags = NORMAL; _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; _cleanup_free_ void *buf = NULL; __u32 result; @@ -9542,7 +9542,7 @@ static int show_topology_cmd(int argc, char **argv, struct command *command, str { const char *desc = "Show the topology\n"; const char *ranking = "Ranking order: namespace|ctrl"; - enum nvme_print_flags flags; + nvme_print_flags_t flags; _cleanup_nvme_root_ nvme_root_t r = NULL; enum nvme_cli_topo_ranking rank; int err; diff --git a/nvme.h b/nvme.h index 66b544fc9f..051fdf0030 100644 --- a/nvme.h +++ b/nvme.h @@ -41,6 +41,8 @@ enum nvme_print_flags { FAHRENHEIT = 1 << 4, /* show temperatures in degrees fahrenheit */ }; +typedef uint32_t nvme_print_flags_t; + enum nvme_cli_topo_ranking { NVME_CLI_TOPO_NAMESPACE, NVME_CLI_TOPO_CTRL, @@ -109,7 +111,7 @@ static inline DEFINE_CLEANUP_FUNC( extern const char *output_format; -int validate_output_format(const char *format, enum nvme_print_flags *flags); +int validate_output_format(const char *format, nvme_print_flags_t *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)); diff --git a/plugins/fdp/fdp.c b/plugins/fdp/fdp.c index 2a221f8657..1efdd76d25 100644 --- a/plugins/fdp/fdp.c +++ b/plugins/fdp/fdp.c @@ -25,7 +25,7 @@ static int fdp_configs(int argc, char **argv, struct command *cmd, const char *human_readable = "show log in readable format"; const char *raw = "use binary output"; - enum nvme_print_flags flags; + nvme_print_flags_t flags; struct nvme_dev *dev; struct nvme_fdp_config_log hdr; void *log = NULL; @@ -107,7 +107,7 @@ static int fdp_usage(int argc, char **argv, struct command *cmd, struct plugin * const char *egid = "Endurance group identifier"; const char *raw = "use binary output"; - enum nvme_print_flags flags; + nvme_print_flags_t flags; struct nvme_dev *dev; struct nvme_fdp_ruhu_log hdr; size_t len; @@ -180,7 +180,7 @@ static int fdp_stats(int argc, char **argv, struct command *cmd, struct plugin * const char *egid = "Endurance group identifier"; const char *raw = "use binary output"; - enum nvme_print_flags flags; + nvme_print_flags_t flags; struct nvme_dev *dev; struct nvme_fdp_stats_log stats; int err; @@ -238,7 +238,7 @@ static int fdp_events(int argc, char **argv, struct command *cmd, struct plugin const char *host_events = "Get host events"; const char *raw = "use binary output"; - enum nvme_print_flags flags; + nvme_print_flags_t flags; struct nvme_dev *dev; struct nvme_fdp_events_log events; int err; @@ -299,7 +299,7 @@ static int fdp_status(int argc, char **argv, struct command *cmd, struct plugin const char *namespace_id = "Namespace identifier"; const char *raw = "use binary output"; - enum nvme_print_flags flags; + nvme_print_flags_t flags; struct nvme_dev *dev; struct nvme_fdp_ruh_status hdr; size_t len; diff --git a/plugins/huawei/huawei-nvme.c b/plugins/huawei/huawei-nvme.c index 0272dead34..c09d8d3874 100644 --- a/plugins/huawei/huawei-nvme.c +++ b/plugins/huawei/huawei-nvme.c @@ -296,7 +296,7 @@ static int huawei_list(int argc, char **argv, struct command *command, struct huawei_list_item *list_items; unsigned int i, n, ret; unsigned int huawei_num = 0; - enum nvme_print_flags fmt; + nvme_print_flags_t fmt; const char *desc = "Retrieve basic information for the given huawei device"; struct config { char *output_format; diff --git a/plugins/nbft/nbft-plugin.c b/plugins/nbft/nbft-plugin.c index 21f97b10be..f25941a5db 100644 --- a/plugins/nbft/nbft-plugin.c +++ b/plugins/nbft/nbft-plugin.c @@ -531,7 +531,7 @@ int show_nbft(int argc, char **argv, struct command *cmd, struct plugin *plugin) struct list_head nbft_list; char *format = "normal"; char *nbft_path = NBFT_SYSFS_PATH; - enum nvme_print_flags flags; + nvme_print_flags_t flags; int ret; bool show_subsys = false, show_hfi = false, show_discovery = false; unsigned int verbose = 0; diff --git a/plugins/ocp/ocp-fw-activation-history.c b/plugins/ocp/ocp-fw-activation-history.c index 16598a0be4..543042f485 100644 --- a/plugins/ocp/ocp-fw-activation-history.c +++ b/plugins/ocp/ocp-fw-activation-history.c @@ -207,7 +207,7 @@ int ocp_fw_activation_history_log(int argc, char **argv, struct command *cmd, } if (!err) { - enum nvme_print_flags print_flag; + nvme_print_flags_t print_flag; err = validate_output_format(format, &print_flag); if (err < 0) { diff --git a/plugins/ocp/ocp-nvme.c b/plugins/ocp/ocp-nvme.c index 3a8efab7ff..5327518f6f 100644 --- a/plugins/ocp/ocp-nvme.c +++ b/plugins/ocp/ocp-nvme.c @@ -397,7 +397,7 @@ static void ocp_print_C3_log_json(struct ssd_latency_monitor_log *log_data) static int get_c3_log_page(struct nvme_dev *dev, char *format) { struct ssd_latency_monitor_log *log_data; - enum nvme_print_flags fmt; + nvme_print_flags_t fmt; int ret; __u8 *data; int i; @@ -1511,7 +1511,7 @@ static void ocp_print_c5_log_binary(struct unsupported_requirement_log *log_data static int get_c5_log_page(struct nvme_dev *dev, char *format) { - enum nvme_print_flags fmt; + nvme_print_flags_t fmt; int ret; __u8 *data; int i; @@ -1738,7 +1738,7 @@ static void ocp_print_c1_log_binary(struct ocp_error_recovery_log_page *log_data static int get_c1_log_page(struct nvme_dev *dev, char *format) { struct ocp_error_recovery_log_page *log_data; - enum nvme_print_flags fmt; + nvme_print_flags_t fmt; int ret; __u8 *data; int i, j; @@ -1954,7 +1954,7 @@ static void ocp_print_c4_log_binary(struct ocp_device_capabilities_log_page *log static int get_c4_log_page(struct nvme_dev *dev, char *format) { struct ocp_device_capabilities_log_page *log_data; - enum nvme_print_flags fmt; + nvme_print_flags_t fmt; int ret; __u8 *data; int i, j; @@ -3143,7 +3143,7 @@ static int get_c9_log_page(struct nvme_dev *dev, char *format) int ret = 0; __u8 *header_data; struct telemetry_str_log_format *log_data; - enum nvme_print_flags fmt; + nvme_print_flags_t fmt; __u8 *full_log_buf_data = NULL; __le64 stat_id_str_table_ofst = 0; __le64 event_str_table_ofst = 0; @@ -3435,7 +3435,7 @@ static void ocp_print_c7_log_binary(struct tcg_configuration_log *log_data) static int get_c7_log_page(struct nvme_dev *dev, char *format) { - enum nvme_print_flags fmt; + nvme_print_flags_t fmt; int ret; __u8 *data; int i; diff --git a/plugins/ocp/ocp-smart-extended-log.c b/plugins/ocp/ocp-smart-extended-log.c index 0d8ba81069..6a524d3e3b 100644 --- a/plugins/ocp/ocp-smart-extended-log.c +++ b/plugins/ocp/ocp-smart-extended-log.c @@ -252,7 +252,7 @@ static void ocp_print_C0_log_json(void *data) static int get_c0_log_page(int fd, char *format) { - enum nvme_print_flags fmt; + nvme_print_flags_t fmt; __u8 *data; int i; int ret; diff --git a/plugins/solidigm/solidigm-garbage-collection.c b/plugins/solidigm/solidigm-garbage-collection.c index 002b187fea..3c046b0ed4 100644 --- a/plugins/solidigm/solidigm-garbage-collection.c +++ b/plugins/solidigm/solidigm-garbage-collection.c @@ -68,7 +68,7 @@ static void vu_gc_log_show(struct garbage_control_collection_log *payload, const int solidigm_get_garbage_collection_log(int argc, char **argv, struct command *cmd, struct plugin *plugin) { const char *desc = "Get and parse Solidigm vendor specific garbage collection event log."; - enum nvme_print_flags flags; + nvme_print_flags_t flags; struct nvme_dev *dev; int err; __u8 uuid_index; diff --git a/plugins/solidigm/solidigm-get-drive-info.c b/plugins/solidigm/solidigm-get-drive-info.c index 21f59bb865..c783fa8abd 100644 --- a/plugins/solidigm/solidigm-get-drive-info.c +++ b/plugins/solidigm/solidigm-get-drive-info.c @@ -16,7 +16,7 @@ int sldgm_get_drive_info(int argc, char **argv, struct command *cmd, struct plug 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_print_flags_t flags; nvme_root_t r; nvme_ctrl_t c; nvme_ns_t n; diff --git a/plugins/solidigm/solidigm-latency-tracking.c b/plugins/solidigm/solidigm-latency-tracking.c index c6c33157c2..899075d7ac 100644 --- a/plugins/solidigm/solidigm-latency-tracking.c +++ b/plugins/solidigm/solidigm-latency-tracking.c @@ -45,7 +45,7 @@ struct latency_tracker { int fd; __u8 uuid_index; struct config cfg; - enum nvme_print_flags print_flags; + nvme_print_flags_t print_flags; struct latency_statistics stats; struct json_object *bucket_list; __u32 bucket_list_size; diff --git a/plugins/solidigm/solidigm-log-page-dir.c b/plugins/solidigm/solidigm-log-page-dir.c index 7d7c027f3e..f8d19743f0 100644 --- a/plugins/solidigm/solidigm-log-page-dir.c +++ b/plugins/solidigm/solidigm-log-page-dir.c @@ -241,7 +241,7 @@ int solidigm_get_log_page_directory_log(int argc, char **argv, struct command *c } if (!err) { - enum nvme_print_flags print_flag; + nvme_print_flags_t print_flag; err = validate_output_format(format, &print_flag); if (err < 0) { diff --git a/plugins/solidigm/solidigm-smart.c b/plugins/solidigm/solidigm-smart.c index a97abe2bcc..002753a54e 100644 --- a/plugins/solidigm/solidigm-smart.c +++ b/plugins/solidigm/solidigm-smart.c @@ -197,7 +197,7 @@ int solidigm_get_additional_smart_log(int argc, char **argv, struct command *cmd "Get Solidigm vendor specific smart log (optionally, for the specified namespace), and show it."; const int solidigm_vu_smart_log_id = 0xCA; struct vu_smart_log smart_log_payload; - enum nvme_print_flags flags; + nvme_print_flags_t flags; struct nvme_dev *dev; int err; __u8 uuid_index; diff --git a/plugins/wdc/wdc-nvme.c b/plugins/wdc/wdc-nvme.c index 7525055045..89b0d73814 100644 --- a/plugins/wdc/wdc-nvme.c +++ b/plugins/wdc/wdc-nvme.c @@ -6998,7 +6998,7 @@ static int wdc_get_c0_log_page(nvme_root_t r, struct nvme_dev *dev, char *format __u32 namespace_id) { uint32_t device_id, read_vendor_id; - enum nvme_print_flags fmt; + nvme_print_flags_t fmt; int ret; __u8 *data; __u8 log_id; @@ -7296,7 +7296,7 @@ static int wdc_get_ca_log_page(nvme_root_t r, struct nvme_dev *dev, char *format { uint32_t read_device_id, read_vendor_id; struct wdc_ssd_ca_perf_stats *perf; - enum nvme_print_flags fmt; + nvme_print_flags_t fmt; __u32 cust_id; __u8 *data; int ret; @@ -7427,7 +7427,7 @@ static int wdc_get_c1_log_page(nvme_root_t r, struct nvme_dev *dev, struct wdc_log_page_subpage_header *sph; struct wdc_ssd_perf_stats *perf; struct wdc_log_page_header *l; - enum nvme_print_flags fmt; + nvme_print_flags_t fmt; int total_subpages; int skip_cnt = 4; __u8 *data; @@ -7484,7 +7484,7 @@ static int wdc_get_c1_log_page(nvme_root_t r, struct nvme_dev *dev, static int wdc_get_c3_log_page(nvme_root_t r, struct nvme_dev *dev, char *format) { struct wdc_ssd_latency_monitor_log *log_data; - enum nvme_print_flags fmt; + nvme_print_flags_t fmt; __u8 *data; int ret; int i; @@ -7556,7 +7556,7 @@ static int wdc_get_c3_log_page(nvme_root_t r, struct nvme_dev *dev, char *format static int wdc_get_ocp_c1_log_page(nvme_root_t r, struct nvme_dev *dev, char *format) { struct wdc_ocp_c1_error_recovery_log *log_data; - enum nvme_print_flags fmt; + nvme_print_flags_t fmt; __u8 *data; int ret; int i; @@ -7627,7 +7627,7 @@ static int wdc_get_ocp_c1_log_page(nvme_root_t r, struct nvme_dev *dev, char *fo static int wdc_get_ocp_c4_log_page(nvme_root_t r, struct nvme_dev *dev, char *format) { struct wdc_ocp_C4_dev_cap_log *log_data; - enum nvme_print_flags fmt; + nvme_print_flags_t fmt; __u8 *data; int ret; int i; @@ -7697,7 +7697,7 @@ static int wdc_get_ocp_c4_log_page(nvme_root_t r, struct nvme_dev *dev, char *fo static int wdc_get_ocp_c5_log_page(nvme_root_t r, struct nvme_dev *dev, char *format) { struct wdc_ocp_C5_unsupported_reqs *log_data; - enum nvme_print_flags fmt; + nvme_print_flags_t fmt; int ret; __u8 *data; int i; @@ -7767,7 +7767,7 @@ static int wdc_get_ocp_c5_log_page(nvme_root_t r, struct nvme_dev *dev, char *fo static int wdc_get_d0_log_page(nvme_root_t r, struct nvme_dev *dev, char *format) { struct wdc_ssd_d0_smart_log *perf; - enum nvme_print_flags fmt; + nvme_print_flags_t fmt; int ret = 0; __u8 *data; @@ -8049,7 +8049,7 @@ static int wdc_vs_smart_add_log(int argc, char **argv, struct command *command, const char *log_page_version = "Log Page Version: 0 = vendor, 1 = WDC"; const char *log_page_mask = "Log Page Mask, comma separated list: 0xC0, 0xC1, 0xCA, 0xD0"; const char *namespace_id = "desired namespace id"; - enum nvme_print_flags fmt; + nvme_print_flags_t fmt; struct nvme_dev *dev; nvme_root_t r; int ret = 0; @@ -8219,7 +8219,7 @@ static int wdc_vs_cloud_log(int argc, char **argv, struct command *command, { const char *desc = "Retrieve Cloud Log Smart/Health Information"; const char *namespace_id = "desired namespace id"; - enum nvme_print_flags fmt; + nvme_print_flags_t fmt; __u64 capabilities = 0; struct nvme_dev *dev; nvme_root_t r; @@ -8290,7 +8290,7 @@ static int wdc_vs_hw_rev_log(int argc, char **argv, struct command *command, { const char *desc = "Retrieve Hardware Revision Log Information"; const char *namespace_id = "desired namespace id"; - enum nvme_print_flags fmt; + nvme_print_flags_t fmt; __u64 capabilities = 0; struct nvme_dev *dev; int ret; @@ -8375,7 +8375,7 @@ static int wdc_vs_device_waf(int argc, char **argv, struct command *command, const char *desc = "Retrieve Device Write Amplication Factor"; const char *namespace_id = "desired namespace id"; struct nvme_smart_log smart_log; - enum nvme_print_flags fmt; + nvme_print_flags_t fmt; struct nvme_dev *dev; __u8 *data; nvme_root_t r; @@ -8932,7 +8932,7 @@ static int wdc_get_fw_act_history(nvme_root_t r, struct nvme_dev *dev, char *format) { struct wdc_fw_act_history_log_hdr *fw_act_history_hdr; - enum nvme_print_flags fmt; + nvme_print_flags_t fmt; int ret; __u8 *data; @@ -9016,7 +9016,7 @@ static int wdc_get_fw_act_history_C2(nvme_root_t r, struct nvme_dev *dev, __u32 tot_entries = 0, num_entries = 0; __u32 vendor_id = 0, device_id = 0; __u32 cust_id = 0; - enum nvme_print_flags fmt; + nvme_print_flags_t fmt; __u8 *data; int ret; bool c2GuidMatch = false; @@ -10498,7 +10498,7 @@ static int wdc_log_page_directory(int argc, char **argv, struct command *command struct plugin *plugin) { const char *desc = "Retrieve Log Page Directory."; - enum nvme_print_flags fmt; + nvme_print_flags_t fmt; struct nvme_dev *dev; int ret = 0; nvme_root_t r; @@ -11158,7 +11158,7 @@ static void wdc_print_pcie_stats_json(struct wdc_vs_pcie_stats *pcie_stats) static int wdc_do_vs_nand_stats_sn810_2(struct nvme_dev *dev, char *format) { - enum nvme_print_flags fmt; + nvme_print_flags_t fmt; uint8_t *data = NULL; int ret; @@ -11197,7 +11197,7 @@ static int wdc_do_vs_nand_stats_sn810_2(struct nvme_dev *dev, char *format) static int wdc_do_vs_nand_stats(struct nvme_dev *dev, char *format) { - enum nvme_print_flags fmt; + nvme_print_flags_t fmt; uint8_t *output = NULL; __u16 version = 0; int ret; @@ -11321,7 +11321,7 @@ static int wdc_vs_pcie_stats(int argc, char **argv, struct command *command, struct plugin *plugin) { const char *desc = "Retrieve PCIE statistics."; - enum nvme_print_flags fmt; + nvme_print_flags_t fmt; struct nvme_dev *dev; nvme_root_t r; int ret; @@ -11396,7 +11396,7 @@ static int wdc_vs_drive_info(int argc, char **argv, struct command *command, struct plugin *plugin) { const char *desc = "Send a vs-drive-info command."; - enum nvme_print_flags fmt; + nvme_print_flags_t fmt; nvme_root_t r; uint64_t capabilities = 0; struct nvme_dev *dev; @@ -11663,7 +11663,7 @@ static int wdc_vs_temperature_stats(int argc, char **argv, const char *desc = "Send a vs-temperature-stats command."; struct nvme_smart_log smart_log; struct nvme_id_ctrl id_ctrl; - enum nvme_print_flags fmt; + nvme_print_flags_t fmt; struct nvme_dev *dev; nvme_root_t r; uint64_t capabilities = 0; diff --git a/plugins/zns/zns.c b/plugins/zns/zns.c index a7a37663b5..94336d781b 100644 --- a/plugins/zns/zns.c +++ b/plugins/zns/zns.c @@ -114,7 +114,7 @@ static int id_ctrl(int argc, char **argv, struct command *cmd, struct plugin *pl "the given device and report information about the specified\n" "controller in various formats."; - enum nvme_print_flags flags; + nvme_print_flags_t flags; struct nvme_zns_id_ctrl ctrl; struct nvme_dev *dev; int err = -1; @@ -160,7 +160,7 @@ static int id_ns(int argc, char **argv, struct command *cmd, struct plugin *plug const char *vendor_specific = "dump binary vendor fields"; const char *human_readable = "show identify in readable format"; - enum nvme_print_flags flags; + nvme_print_flags_t flags; struct nvme_zns_id_ns ns; struct nvme_id_ns id_ns; struct nvme_dev *dev; @@ -732,7 +732,7 @@ static int zone_mgmt_recv(int argc, char **argv, struct command *cmd, struct plu const char *partial = "Zone Receive Action Specific Features(Partial Report)"; const char *data_len = "length of data in bytes"; - enum nvme_print_flags flags; + nvme_print_flags_t flags; struct nvme_dev *dev; void *data = NULL; int err = -1; @@ -830,7 +830,7 @@ static int report_zones(int argc, char **argv, struct command *cmd, struct plugi const char *part = "set to use the partial report"; const char *verbose = "show report zones verbosity"; - enum nvme_print_flags flags; + nvme_print_flags_t flags; int zdes = 0, err = -1; struct nvme_dev *dev; __u32 report_size; @@ -1222,7 +1222,7 @@ static int changed_zone_list(int argc, char **argv, struct command *cmd, struct const char *rae = "retain an asynchronous event"; struct nvme_zns_changed_zone_log log; - enum nvme_print_flags flags; + nvme_print_flags_t flags; struct nvme_dev *dev; int err = -1; From 4ac020de644c9e00fc76306e908ecc79de2db31c Mon Sep 17 00:00:00 2001 From: jeff-lien-wdc Date: Tue, 2 Jul 2024 09:45:23 -0500 Subject: [PATCH 004/281] wdc: Fix compiler warning. Make the file_path array size big enough to contain the full directory and file name. Signed-off-by: jeff-lien-wdc --- plugins/wdc/wdc-nvme.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/wdc/wdc-nvme.c b/plugins/wdc/wdc-nvme.c index 89b0d73814..bf1ab78b71 100644 --- a/plugins/wdc/wdc-nvme.c +++ b/plugins/wdc/wdc-nvme.c @@ -3711,7 +3711,7 @@ static int wdc_do_sn730_get_and_tar(int fd, char *outputName) static int dump_internal_logs(struct nvme_dev *dev, char *dir_name, int verbose) { - char file_path[128]; + char file_path[PATH_MAX]; void *telemetry_log; const size_t bs = 512; struct nvme_telemetry_log *hdr; From 9b175cd5284b78e85ecf6159147478dedc4549b2 Mon Sep 17 00:00:00 2001 From: Daniel Wagner Date: Tue, 2 Jul 2024 14:21:51 +0200 Subject: [PATCH 005/281] nvme-print-stdout: refactor subsys config DRY the subsys config output. Refactor into a helper. Signed-off-by: Daniel Wagner --- nvme-print-stdout.c | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/nvme-print-stdout.c b/nvme-print-stdout.c index d24cf74d08..4204a1d585 100644 --- a/nvme-print-stdout.c +++ b/nvme-print-stdout.c @@ -1046,6 +1046,18 @@ static void stdout_subsystem_ctrls(nvme_subsystem_t s) } } +static void stdout_subsys_config(nvme_subsystem_t s) +{ + int len = strlen(nvme_subsystem_get_name(s)); + + printf("%s - NQN=%s\n", nvme_subsystem_get_name(s), + nvme_subsystem_get_nqn(s)); + printf("%*s hostnqn=%s\n", len, " ", + nvme_host_get_hostnqn(nvme_subsystem_get_host(s))); + printf("%*s iopolicy=%s\n", len, " ", + nvme_subsystem_get_iopolicy(s)); +} + static void stdout_subsystem(nvme_root_t r, bool show_ana) { nvme_host_t h; @@ -1055,18 +1067,11 @@ static void stdout_subsystem(nvme_root_t r, bool show_ana) nvme_subsystem_t s; nvme_for_each_subsystem(h, s) { - int len = strlen(nvme_subsystem_get_name(s)); - if (!first) printf("\n"); first = false; - printf("%s - NQN=%s\n", nvme_subsystem_get_name(s), - nvme_subsystem_get_nqn(s)); - printf("%*s hostnqn=%s\n", len, " ", - nvme_host_get_hostnqn(nvme_subsystem_get_host(s))); - printf("%*s iopolicy=%s\n", len, " ", - nvme_subsystem_get_iopolicy(s)); + stdout_subsys_config(s); printf("\\\n"); if (!show_ana || !stdout_subsystem_multipath(s)) @@ -5041,18 +5046,11 @@ static void stdout_simple_topology(nvme_root_t r, nvme_for_each_host(r, h) { nvme_for_each_subsystem(h, s) { - int len = strlen(nvme_subsystem_get_name(s)); - if (!first) printf("\n"); first = false; - printf("%s - NQN=%s\n", nvme_subsystem_get_name(s), - nvme_subsystem_get_nqn(s)); - printf("%*s hostnqn=%s\n", len, " ", - nvme_host_get_hostnqn(nvme_subsystem_get_host(s))); - printf("%*s iopolicy=%s\n", len, " ", - nvme_subsystem_get_iopolicy(s)); + stdout_subsys_config(s); printf("\\\n"); if (nvme_is_multipath(s)) From 9afc400af96227ff66cafe05e25a973db6f1884b Mon Sep 17 00:00:00 2001 From: jeff-lien-wdc Date: Wed, 10 Apr 2024 12:51:46 -0500 Subject: [PATCH 006/281] ocp: OCP 2.5 Telemetry DA 1 and 2 Parsing Updates This commit will provide the first phase of changes needed for parsing of OCP 2.5 Telemetry Data Areas 1 and 2. It will decode the prefined classes, statistics, and events. Signed-off-by: jeff-lien-wdc --- plugins/ocp/meson.build | 1 + plugins/ocp/ocp-nvme.c | 532 ++++++++++++++++++----------- plugins/ocp/ocp-telemetry-decode.c | 202 +++++++++++ plugins/ocp/ocp-telemetry-decode.h | 493 ++++++++++++++++++++++++++ 4 files changed, 1026 insertions(+), 202 deletions(-) create mode 100644 plugins/ocp/ocp-telemetry-decode.c create mode 100644 plugins/ocp/ocp-telemetry-decode.h diff --git a/plugins/ocp/meson.build b/plugins/ocp/meson.build index 64447ff66c..7835444493 100644 --- a/plugins/ocp/meson.build +++ b/plugins/ocp/meson.build @@ -4,5 +4,6 @@ sources += [ 'plugins/ocp/ocp-clear-features.c', 'plugins/ocp/ocp-smart-extended-log.c', 'plugins/ocp/ocp-fw-activation-history.c', + 'plugins/ocp/ocp-telemetry-decode.c', ] diff --git a/plugins/ocp/ocp-nvme.c b/plugins/ocp/ocp-nvme.c index 5327518f6f..8a3731d875 100644 --- a/plugins/ocp/ocp-nvme.c +++ b/plugins/ocp/ocp-nvme.c @@ -27,6 +27,7 @@ #include "ocp-smart-extended-log.h" #include "ocp-clear-features.h" #include "ocp-fw-activation-history.h" +#include "ocp-telemetry-decode.h" #define CREATE_CMD #include "ocp-nvme.h" @@ -805,57 +806,6 @@ static int eol_plp_failure_mode(int argc, char **argv, struct command *cmd, /////////////////////////////////////////////////////////////////////////////// /// Telemetry Log -#define TELEMETRY_HEADER_SIZE 512 -#define TELEMETRY_BYTE_PER_BLOCK 512 -#define TELEMETRY_TRANSFER_SIZE 1024 -#define FILE_NAME_SIZE 2048 - -enum TELEMETRY_TYPE { - TELEMETRY_TYPE_NONE = 0, - TELEMETRY_TYPE_HOST = 7, - TELEMETRY_TYPE_CONTROLLER = 8, - TELEMETRY_TYPE_HOST_0 = 9, - TELEMETRY_TYPE_HOST_1 = 10, -}; - -struct telemetry_initiated_log { - __u8 LogIdentifier; - __u8 Reserved1[4]; - __u8 IEEE[3]; - __le16 DataArea1LastBlock; - __le16 DataArea2LastBlock; - __le16 DataArea3LastBlock; - __u8 Reserved2[368]; - __u8 DataAvailable; - __u8 DataGenerationNumber; - __u8 ReasonIdentifier[128]; -}; - -struct telemetry_data_area_1 { - __le16 major_version; - __le16 minor_version; - __u8 reserved1[4]; - __le64 timestamp; - __u8 log_page_guid[16]; - __u8 no_of_tps_supp; - __u8 tps; - __u8 reserved2[6]; - __le16 sls; - __u8 reserved3[8]; - __le16 fw_revision; - __u8 reserved4[32]; - __le16 da1_stat_start; - __le16 da1_stat_size; - __le16 da2_stat_start; - __le16 da2_stat_size; - __u8 reserved5[32]; - __u8 event_fifo_da[16]; - __le64 event_fifo_start[16]; - __le64 event_fifo_size[16]; - __u8 reserved6[80]; - __u8 smart_health_info[512]; - __u8 smart_health_info_extended[512]; -}; static void get_serial_number(struct nvme_id_ctrl *ctrl, char *sn) { int i; @@ -867,39 +817,20 @@ static void get_serial_number(struct nvme_id_ctrl *ctrl, char *sn) } } -static int get_telemetry_header(struct nvme_dev *dev, __u32 ns, __u8 tele_type, - __u32 data_len, void *data, __u8 nLSP, __u8 nRAE) -{ - struct nvme_passthru_cmd cmd = { - .opcode = nvme_admin_get_log_page, - .nsid = ns, - .addr = (__u64)(uintptr_t) data, - .data_len = data_len, - }; - - __u32 numd = (data_len >> 2) - 1; - __u16 numdu = numd >> 16; - __u16 numdl = numd & 0xffff; - - cmd.cdw10 = tele_type | (nLSP & 0x0F) << 8 | (nRAE & 0x01) << 15 | (numdl & 0xFFFF) << 16; - cmd.cdw11 = numdu; - cmd.cdw12 = 0; - cmd.cdw13 = 0; - cmd.cdw14 = 0; - - return nvme_submit_admin_passthru(dev_fd(dev), &cmd, NULL); -} - static void print_telemetry_header(struct telemetry_initiated_log *logheader, int tele_type) { if (logheader) { unsigned int i = 0, j = 0; + __u8 dataGenNum; - if (tele_type == TELEMETRY_TYPE_HOST) + if (tele_type == TELEMETRY_TYPE_HOST) { printf("============ Telemetry Host Header ============\n"); - else + dataGenNum = logheader->DataHostGenerationNumber; + } else { printf("========= Telemetry Controller Header =========\n"); + dataGenNum = logheader->DataCtlrGenerationNumber; + } printf("Log Identifier : 0x%02X\n", logheader->LogIdentifier); printf("IEEE : 0x%02X%02X%02X\n", @@ -910,8 +841,10 @@ static void print_telemetry_header(struct telemetry_initiated_log *logheader, le16_to_cpu(logheader->DataArea2LastBlock)); printf("Data Area 3 Last Block : 0x%04X\n", le16_to_cpu(logheader->DataArea3LastBlock)); - printf("Data Available : 0x%02X\n", logheader->DataAvailable); - printf("Data Generation Number : 0x%02X\n", logheader->DataGenerationNumber); + printf("Data Available : 0x%02X\n", + logheader->CtlrDataAvailable); + printf("Data Generation Number : 0x%02X\n", + dataGenNum); printf("Reason Identifier :\n"); for (i = 0; i < 8; i++) { @@ -922,6 +855,7 @@ static void print_telemetry_header(struct telemetry_initiated_log *logheader, printf("===============================================\n\n"); } } + static int get_telemetry_data(struct nvme_dev *dev, __u32 ns, __u8 tele_type, __u32 data_len, void *data, __u8 nLSP, __u8 nRAE, __u64 offset) @@ -935,10 +869,13 @@ static int get_telemetry_data(struct nvme_dev *dev, __u32 ns, __u8 tele_type, __u32 numd = (data_len >> 2) - 1; __u16 numdu = numd >> 16; __u16 numdl = numd & 0xffff; - cmd.cdw10 = tele_type | (nLSP & 0x0F) << 8 | (nRAE & 0x01) << 15 | (numdl & 0xFFFF) << 16; + cmd.cdw10 = tele_type | + (nLSP & 0x0F) << 8 | + (nRAE & 0x01) << 15 | + (numdl & 0xFFFF) << 16; cmd.cdw11 = numdu; - cmd.cdw12 = offset; - cmd.cdw13 = 0; + cmd.cdw12 = (__u32)(0x00000000FFFFFFFF & offset); + cmd.cdw13 = (__u32)((0xFFFFFFFF00000000 & offset) >> 8); cmd.cdw14 = 0; return nvme_submit_admin_passthru(dev_fd(dev), &cmd, NULL); } @@ -951,116 +888,111 @@ static void print_telemetry_data_area_1(struct telemetry_data_area_1 *da1, printf("============ Telemetry Host Data area 1 ============\n"); else printf("========= Telemetry Controller Data area 1 =========\n"); - printf("Major Version : 0x%x\n", le16_to_cpu(da1->major_version)); - printf("Minor Version : 0x%x\n", le16_to_cpu(da1->minor_version)); - for (i = 0; i < 4; i++) - printf("reserved1 : 0x%x\n", da1->reserved1[i]); + printf("Major Version : 0x%x\n", le16_to_cpu(da1->major_version)); + printf("Minor Version : 0x%x\n", le16_to_cpu(da1->minor_version)); printf("Timestamp : %"PRIu64"\n", le64_to_cpu(da1->timestamp)); - for (i = 15; i >= 0; i--) - printf("%x", da1->log_page_guid[i]); - printf("Number Telemetry Profiles Supported : 0x%x\n", da1->no_of_tps_supp); - printf("Telemetry Profile Selected (TPS) : 0x%x\n", da1->tps); - for (i = 0; i < 6; i++) - printf("reserved2 : 0x%x\n", da1->reserved2[i]); - printf("Telemetry String Log Size (SLS) : 0x%x\n", le16_to_cpu(da1->sls)); + printf("Log Page GUID : 0x"); + for (int j = 15; j >= 0; j--) + printf("%02x", da1->log_page_guid[j]); + printf("\n"); + printf("Number Telemetry Profiles Supported : 0x%x\n", + da1->no_of_tps_supp); + printf("Telemetry Profile Selected (TPS) : 0x%x\n", + da1->tps); + printf("Telemetry String Log Size (SLS) : 0x%lx\n", + le64_to_cpu(da1->sls)); + printf("Firmware Revision : "); for (i = 0; i < 8; i++) - printf("reserved3 : 0x%x\n", da1->reserved3[i]); - printf("Firmware Revision : 0x%x\n", le16_to_cpu(da1->fw_revision)); - for (i = 0; i < 32; i++) - printf("reserved4 : 0x%x\n", da1->reserved4[i]); - printf("Data Area 1 Statistic Start : 0x%x\n", le16_to_cpu(da1->da1_stat_start)); - printf("Data Area 1 Statistic Size : 0x%x\n", le16_to_cpu(da1->da1_stat_size)); - printf("Data Area 2 Statistic Start : 0x%x\n", le16_to_cpu(da1->da2_stat_start)); - printf("Data Area 2 Statistic Size : 0x%x\n", le16_to_cpu(da1->da2_stat_size)); - for (i = 0; i < 32; i++) - printf("reserved5 : 0x%x\n", da1->reserved5[i]); + printf("%c", (char)da1->fw_revision[i]); + printf("\n"); + printf("Data Area 1 Statistic Start : 0x%lx\n", + le64_to_cpu(da1->da1_stat_start)); + printf("Data Area 1 Statistic Size : 0x%lx\n", + le64_to_cpu(da1->da1_stat_size)); + printf("Data Area 2 Statistic Start : 0x%lx\n", + le64_to_cpu(da1->da2_stat_start)); + printf("Data Area 2 Statistic Size : 0x%lx\n", + le64_to_cpu(da1->da2_stat_size)); for (i = 0; i < 16; i++) { - printf("Event FIFO %d Data Area : 0x%x\n", i, da1->event_fifo_da[i]); - printf("Event FIFO %d Start : %"PRIu64"\n", i, le64_to_cpu(da1->event_fifo_start[i])); - printf("Event FIFO %d Size : %"PRIu64"\n", i, le64_to_cpu(da1->event_fifo_size[i])); - } - for (i = 0; i < 80; i++) - printf("reserved6 : 0x%x\n", da1->reserved6[i]); - for (i = 0; i < 512; i++){ - printf("SMART / Health Information : 0x%x\n", da1->smart_health_info[i]); - printf("SMART / Health Information Extended : 0x%x\n", da1->smart_health_info_extended[i]); - } - printf("===============================================\n\n"); - } -} -static void print_telemetry_da1_stat(__u8 *da1_stat, int tele_type, __u16 buf_size) -{ - if (da1_stat) { - unsigned int i = 0; - if (tele_type == TELEMETRY_TYPE_HOST) - printf("============ Telemetry Host Data area 1 Statistics ============\n"); - else - printf("========= Telemetry Controller Data area 1 Statistics =========\n"); - while((i + 8) < buf_size) { - printf("Statistics Identifier : 0x%x\n", (da1_stat[i] | da1_stat[i+1] << 8)); - printf("Statistics info : 0x%x\n", da1_stat[i+2]); - printf("NS info : 0x%x\n", da1_stat[i+3]); - printf("Statistic Data Size : 0x%x\n", (da1_stat[i+4] | da1_stat[i+5] << 8)); - printf("Reserved : 0x%x\n", (da1_stat[i+6] | da1_stat[i+7] << 8)); - i = 8 + ((da1_stat[i+4] | da1_stat[i+5] << 8) * 4); - } - printf("===============================================\n\n"); - } -} -static void print_telemetry_da1_fifo(__u8 *da1_fifo, int tele_type, __u16 buf_size) -{ - if (da1_fifo) { - unsigned int i = 0; - if (tele_type == TELEMETRY_TYPE_HOST) - printf("============ Telemetry Host Data area 1 FIFO ============\n"); - else - printf("========= Telemetry Controller Data area 1 FIFO =========\n"); - while((i + 4) < buf_size) { - printf("Debug Event Class Type : 0x%x\n", da1_fifo[i]); - printf("Event ID : 0x%x\n", (da1_fifo[i+1] | da1_fifo[i+2] << 8)); - printf("Event Data Size : 0x%x\n", da1_fifo[3]); - i = 4 + ((da1_fifo[3]) * 4); + printf("Event FIFO %d Data Area : 0x%x\n", + i, da1->event_fifo_da[i]); + printf("Event FIFO %d Start : 0x%"PRIx64"\n", + i, le64_to_cpu(da1->event_fifos[i].start)); + printf("Event FIFO %d Size : 0x%"PRIx64"\n", + i, le64_to_cpu(da1->event_fifos[i].size)); } + printf("SMART / Health Information :\n"); + printf("0x"); + for (i = 0; i < 512; i++) + printf("%02x", da1->smart_health_info[i]); + printf("\n"); + + printf("SMART / Health Information Extended :\n"); + printf("0x"); + for (i = 0; i < 512; i++) + printf("%02x", da1->smart_health_info_extended[i]); + printf("\n"); + printf("===============================================\n\n"); } } -static void print_telemetry_da2_stat(__u8 *da1_stat, int tele_type, __u16 buf_size) +static void print_telemetry_da_stat(struct telemetry_stats_desc *da_stat, + int tele_type, + __u16 buf_size, + __u8 data_area) { - if (da1_stat) { + if (da_stat) { unsigned int i = 0; + struct telemetry_stats_desc *next_da_stat = da_stat; + if (tele_type == TELEMETRY_TYPE_HOST) - printf("============ Telemetry Host Data area 1 Statistics ============\n"); + printf("============ Telemetry Host Data Area %d Statistics ============\n", + data_area); else - printf("========= Telemetry Controller Data area 1 Statistics =========\n"); + printf("========= Telemetry Controller Data Area %d Statistics =========\n", + data_area); while((i + 8) < buf_size) { - printf("Statistics Identifier : 0x%x\n", (da1_stat[i] | da1_stat[i+1] << 8)); - printf("Statistics info : 0x%x\n", da1_stat[i+2]); - printf("NS info : 0x%x\n", da1_stat[i+3]); - printf("Statistic Data Size : 0x%x\n", (da1_stat[i+4] | da1_stat[i+5] << 8)); - printf("Reserved : 0x%x\n", (da1_stat[i+6] | da1_stat[i+7] << 8)); - i = 8 + ((da1_stat[i+4] | da1_stat[i+5] << 8) * 4); + print_stats_desc(next_da_stat); + i += 8 + ((next_da_stat->size) * 4); + next_da_stat = (struct telemetry_stats_desc *)((__u64)da_stat + i); + + if ((next_da_stat->id == 0) && (next_da_stat->size == 0)) + break; } printf("===============================================\n\n"); } } -static void print_telemetry_da2_fifo(__u8 *da1_fifo, int tele_type, __u16 buf_size) +static void print_telemetry_da_fifo(struct telemetry_event_desc *da_fifo, + __le64 buf_size, + int tele_type, + int da, + int index) { - if (da1_fifo) { + if (da_fifo) { unsigned int i = 0; + struct telemetry_event_desc *next_da_fifo = da_fifo; + if (tele_type == TELEMETRY_TYPE_HOST) - printf("============ Telemetry Host Data area 1 Statistics ============\n"); + printf("========= Telemetry Host Data area %d Event FIFO %d =========\n", + da, index); else - printf("========= Telemetry Controller Data area 1 Statistics =========\n"); + printf("====== Telemetry Controller Data area %d Event FIFO %d ======\n", + da, index); + + while((i + 4) < buf_size) { - printf("Debug Event Class Type : 0x%x\n", da1_fifo[i]); - printf("Event ID : 0x%x\n", (da1_fifo[i+1] | da1_fifo[i+2] << 8)); - printf("Event Data Size : 0x%x\n", da1_fifo[3]); - i = 4 + ((da1_fifo[3]) * 4); + /* Print Event Data */ + print_telemetry_fifo_event(next_da_fifo->class, /* Event class type */ + next_da_fifo->id, /* Event ID */ + next_da_fifo->size, /* Event data size */ + (__u8 *)&next_da_fifo->data); /* Event data */ + + i += (4 + (next_da_fifo->size * 4)); + next_da_fifo = (struct telemetry_event_desc *)((__u64)da_fifo + i); } printf("===============================================\n\n"); } } - static int extract_dump_get_log(struct nvme_dev *dev, char *featurename, char *filename, char *sn, int dumpsize, int transfersize, __u32 nsid, __u8 log_id, __u8 lsp, __u64 offset, bool rae) @@ -1146,10 +1078,12 @@ static int get_telemetry_dump(struct nvme_dev *dev, char *filename, char *sn, enum TELEMETRY_TYPE tele_type, int data_area, bool header_print) { __u32 err = 0, nsid = 0; - __u8 lsp = 0, rae = 0; + __le64 da1_sz = 512, m_512_sz = 0, da1_off = 0, m_512_off = 0, diff = 0, + temp_sz = 0, temp_ofst = 0; + __u8 lsp = 0, rae = 0, flag = 0; + __u8 data[TELEMETRY_HEADER_SIZE] = { 0 }; unsigned int i = 0; - char data[TELEMETRY_TRANSFER_SIZE] = { 0 }; - char data1[1536] = { 0 }; + char data1[TELEMETRY_DATA_SIZE] = { 0 }; char *featurename = 0; struct telemetry_initiated_log *logheader = (struct telemetry_initiated_log *)data; struct telemetry_data_area_1 *da1 = (struct telemetry_data_area_1 *)data1; @@ -1172,51 +1106,245 @@ static int get_telemetry_dump(struct nvme_dev *dev, char *filename, char *sn, rae = 1; } - err = get_telemetry_header(dev, nsid, tele_type, TELEMETRY_HEADER_SIZE, - (void *)data, lsp, rae); - if (err) + /* Get the telemetry header */ + err = get_telemetry_data(dev, nsid, tele_type, TELEMETRY_HEADER_SIZE, + (void *)data, lsp, rae, 0); + if (err) { + printf("get_telemetry_header failed, err: %d.\n", err); return err; + } if (header_print) print_telemetry_header(logheader, tele_type); - err = get_telemetry_data(dev, nsid, tele_type, 1536, + + /* Get the telemetry data */ + err = get_telemetry_data(dev, nsid, tele_type, TELEMETRY_DATA_SIZE, (void *)data1, lsp, rae, 512); - if (err) + if (err) { + printf("get_telemetry_data failed for type: 0x%x, err: %d.\n", tele_type, err); return err; + } + print_telemetry_data_area_1(da1, tele_type); - char *da1_stat = calloc((da1->da1_stat_size * 4), sizeof(char)); - err = get_telemetry_data(dev, nsid, tele_type, (da1->da1_stat_size) * 4, - (void *)da1_stat, lsp, rae, (da1->da1_stat_start) * 4); - if (err) - return err; - print_telemetry_da1_stat((void *)da1_stat, tele_type, (da1->da1_stat_size) * 4); - for (i = 0; i < 17 ; i++){ - if (da1->event_fifo_da[i] == 1){ - char *da1_fifo = calloc((da1->event_fifo_size[i]) * 4, sizeof(char)); - err = get_telemetry_data(dev, nsid, tele_type, (da1->event_fifo_size[i]) * 4, - (void *)da1_stat, lsp, rae, (da1->event_fifo_start[i]) * 4); - if (err) + + /* Print the Data Area 1 Stats */ + if (da1->da1_stat_size != 0) { + diff = 0; + da1_sz = (da1->da1_stat_size) * 4; + m_512_sz = (da1->da1_stat_size) * 4; + da1_off = (da1->da1_stat_start) * 4; + m_512_off = (da1->da1_stat_start) * 4; + temp_sz = (da1->da1_stat_size) * 4; + temp_ofst = (da1->da1_stat_start) * 4; + flag = 0; + + if ((da1_off % 512) > 0) { + m_512_off = (__le64) ((da1_off / 512)); + da1_off = m_512_off * 512; + diff = temp_ofst - da1_off; + flag = 1; + } + + if (da1_sz < 512) + da1_sz = 512; + else if ((da1_sz % 512) > 0) { + if (flag == 0) { + m_512_sz = (__le64) ((da1_sz / 512) + 1); + da1_sz = m_512_sz * 512; + } else { + if (diff < 512) + diff = 1; + else + diff = (diff / 512) * 512; + + m_512_sz = (__le64) ((da1_sz / 512) + 1 + diff + 1); + da1_sz = m_512_sz * 512; + } + } + + char *da1_stat = calloc(da1_sz, sizeof(char)); + + err = get_telemetry_data(dev, nsid, tele_type, da1_sz, + (void *)da1_stat, lsp, rae, da1_off); + if (err) { + printf("get_telemetry_data da1 stats failed, err: %d.\n", err); + return err; + } + + print_telemetry_da_stat((void *)(da1_stat + (temp_ofst - da1_off)), + tele_type, (da1->da1_stat_size) * 4, 1); + } + + /* Print the Data Area 1 Event FIFO's */ + for (i = 0; i < 16 ; i++) { + if ((da1->event_fifo_da[i] == 1) && (da1->event_fifos[i].size != 0)) { + diff = 0; + da1_sz = da1->event_fifos[i].size * 4; + m_512_sz = da1->event_fifos[i].size * 4; + da1_off = da1->event_fifos[i].start * 4; + m_512_off = da1->event_fifos[i].start * 4; + temp_sz = da1->event_fifos[i].size * 4; + temp_ofst = da1->event_fifos[i].start * 4; + flag = 0; + + if ((da1_off % 512) > 0) { + m_512_off = (__le64) ((da1_off / 512)); + da1_off = m_512_off * 512; + diff = temp_ofst - da1_off; + flag = 1; + } + + if (da1_sz < 512) + da1_sz = 512; + else if ((da1_sz % 512) > 0) { + if (flag == 0) { + m_512_sz = (__le64) ((da1_sz / 512) + 1); + da1_sz = m_512_sz * 512; + } else { + if (diff < 512) + diff = 1; + else + diff = (diff / 512) * 512; + + m_512_sz = (__le64) ((da1_sz / 512) + 1 + diff + 1); + da1_sz = m_512_sz * 512; + } + } + + char *da1_fifo = calloc(da1_sz, sizeof(char)); + + err = get_telemetry_data(dev, nsid, tele_type, + (da1->event_fifos[i].size) * 4, + (void *)da1_fifo, lsp, rae, da1_off); + if (err) { + printf("get_telemetry_data da1 event fifos failed, err: %d.\n", + err); return err; - print_telemetry_da1_fifo((void *)da1_fifo, tele_type, (da1->event_fifo_size[i]) * 4); + } + print_telemetry_da_fifo((void *)(da1_fifo + (temp_ofst - da1_off)), + temp_sz, + tele_type, + da1->event_fifo_da[i], + i); } } - char *da2_stat = calloc((da1->da2_stat_size * 4), sizeof(char)); - err = get_telemetry_data(dev, nsid, tele_type, (da1->da2_stat_size) * 4, - (void *)da2_stat, lsp, rae, (da1->da2_stat_start) * 4); - if (err) - return err; - print_telemetry_da2_stat((void *)da2_stat, tele_type, (da1->da2_stat_size) * 4); - for (i = 0; i < 17 ; i++){ - if (da1->event_fifo_da[i] == 2){ - char *da1_fifo = calloc((da1->event_fifo_size[i]) * 4, sizeof(char)); - err = get_telemetry_data(dev, nsid, tele_type, (da1->event_fifo_size[i]) * 4, - (void *)da1_stat, lsp, rae, (da1->event_fifo_start[i]) * 4); - if (err) + + /* Print the Data Area 2 Stats */ + if (da1->da2_stat_size != 0) { + da1_off = (da1->da2_stat_start) * 4; + temp_ofst = (da1->da2_stat_start) * 4; + da1_sz = (da1->da2_stat_size) * 4; + diff = 0; + flag = 0; + + if (da1->da2_stat_start == 0) { + da1_off = 512 + (logheader->DataArea1LastBlock * 512); + temp_ofst = 512 + (le16_to_cpu(logheader->DataArea1LastBlock) * 512); + if ((da1_off % 512) == 0) { + m_512_off = (__le64) (((da1_off) / 512)); + da1_off = m_512_off * 512; + diff = temp_ofst - da1_off; + flag = 1; + } + } else { + + if (((da1_off * 4) % 512) > 0) { + m_512_off = (__le64) ((((da1->da2_stat_start) * 4) / 512)); + da1_off = m_512_off * 512; + diff = ((da1->da2_stat_start) * 4) - da1_off; + flag = 1; + } + } + + if (da1_sz < 512) + da1_sz = 512; + else if ((da1_sz % 512) > 0) { + if (flag == 0) { + m_512_sz = (__le64) ((da1->da2_stat_size / 512) + 1); + da1_sz = m_512_sz * 512; + } else { + if (diff < 512) + diff = 1; + else + diff = (diff / 512) * 512; + m_512_sz = (__le64) ((da1->da2_stat_size / 512) + 1 + diff + 1); + da1_sz = m_512_sz * 512; + } + } + + char *da2_stat = calloc(da1_sz, sizeof(char)); + + err = get_telemetry_data(dev, nsid, tele_type, da1_sz, + (void *)da2_stat, lsp, rae, da1_off); + if (err) { + printf("get_telemetry_data da2 stats failed, err: %d.\n", err); + return err; + } + + print_telemetry_da_stat((void *)(da2_stat + (temp_ofst - da1_off)), + tele_type, + (da1->da2_stat_size) * 4, + 2); + } + + /* Print the Data Area 2 Event FIFO's */ + for (i = 0; i < 16 ; i++) { + if ((da1->event_fifo_da[i] == 2) && (da1->event_fifos[i].size != 0)) { + diff = 0; + da1_sz = da1->event_fifos[i].size * 4; + m_512_sz = da1->event_fifos[i].size * 4; + da1_off = da1->event_fifos[i].start * 4; + m_512_off = da1->event_fifos[i].start * 4; + temp_sz = da1->event_fifos[i].size * 4; + temp_ofst = da1->event_fifos[i].start * 4; + flag = 0; + + if ((da1_off % 512) > 0) { + m_512_off = (__le64) ((da1_off / 512)); + da1_off = m_512_off * 512; + diff = temp_ofst - da1_off; + flag = 1; + } + + if (da1_sz < 512) + da1_sz = 512; + else if ((da1_sz % 512) > 0) { + if (flag == 0) { + m_512_sz = (__le64) ((da1_sz / 512) + 1); + da1_sz = m_512_sz * 512; + } + + else { + if (diff < 512) + diff = 1; + else + diff = (diff / 512) * 512; + + m_512_sz = (__le64) ((da1_sz / 512) + 1 + diff + 1); + da1_sz = m_512_sz * 512; + } + } + + char *da1_fifo = calloc(da1_sz, sizeof(char)); + + err = get_telemetry_data(dev, nsid, tele_type, + (da1->event_fifos[i].size) * 4, + (void *)da1_fifo, lsp, rae, da1_off); + if (err) { + printf("get_telemetry_data da2 event fifos failed, err: %d.\n", + err); return err; - print_telemetry_da2_fifo((void *)da1_fifo, tele_type, (da1->event_fifo_size[i]) * 4); + } + print_telemetry_da_fifo((void *)(da1_fifo + (temp_ofst - da1_off)), + temp_sz, + tele_type, + da1->event_fifo_da[i], + i); } } + printf("------------------------------FIFO End---------------------------\n"); + switch (data_area) { case 1: offset = TELEMETRY_HEADER_SIZE; @@ -1406,9 +1534,10 @@ static int ocp_telemetry_log(int argc, char **argv, struct command *cmd, printf("telemetry-log done.\n"); -return err; + return err; } + /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// @@ -1585,7 +1714,6 @@ static int get_c5_log_page(struct nvme_dev *dev, char *format) return ret; } - static int ocp_unsupported_requirements_log(int argc, char **argv, struct command *cmd, struct plugin *plugin) { diff --git a/plugins/ocp/ocp-telemetry-decode.c b/plugins/ocp/ocp-telemetry-decode.c new file mode 100644 index 0000000000..2842dc16ef --- /dev/null +++ b/plugins/ocp/ocp-telemetry-decode.c @@ -0,0 +1,202 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* Copyright (c) 2024 Western Digital Corporation or its affiliates. + * + * Authors: Jeff Lien , + */ + +#include "common.h" +#include "nvme.h" +#include "libnvme.h" +#include "plugin.h" +#include "linux/types.h" +#include "util/types.h" +#include "nvme-print.h" + +#include "ocp-telemetry-decode.h" + + +void print_vu_event_data(__u32 size, __u8 *data) +{ + int j; + __u16 vu_event_id = *(__u16 *)data; + + printf(" VU Event ID : 0x%02x\n", le16_to_cpu(vu_event_id)); + printf(" VU Data : 0x"); + for (j = 2; j < size; j++) + printf("%x", data[j]); + printf("\n\n"); +} + +void print_stats_desc(struct telemetry_stats_desc *stat_desc) +{ + int j; + /* Get the statistics Identifier string name and data size */ + __u16 stat_id = stat_desc->id; + __u32 stat_data_sz = ((stat_desc->size) * 4); + + printf("Statistics Identifier : 0x%x, %s\n", + stat_id, telemetry_stat_id_to_string(stat_id)); + printf("Statistics info : 0x%x\n", stat_desc->info); + printf("NS info : 0x%x\n", stat_desc->ns_info); + printf("Statistic Data Size : 0x%x\n", le16_to_cpu(stat_data_sz)); + + if (stat_data_sz > 0) { + printf("%s : 0x", + telemetry_stat_id_to_string(stat_id)); + for (j = 0; j < stat_data_sz; j++) + printf("%02x", stat_desc->data[j]); + printf("\n"); + } + printf("\n"); +} + +void print_telemetry_fifo_event(__u8 class_type, + __u16 id, __u8 size_dw, __u8 *data) +{ + int j; + const char *class_str = NULL; + __u32 size = size_dw * 4; + char time_str[40]; + uint64_t timestamp = 0; + memset((void *)time_str, '\0', 40); + + if (class_type) { + class_str = telemetry_event_class_to_string(class_type); + printf("Event Class : %s\n", class_str); + } + + switch (class_type) { + case TELEMETRY_TIMESTAMP_CLASS: + timestamp = (0x0000FFFFFFFFFFFF & le64_to_cpu(*(uint64_t *)data)); + + memset((void *)time_str, 0, 9); + sprintf((char *)time_str, "%04d:%02d:%02d", (int)(le64_to_cpu(timestamp)/3600), + (int)((le64_to_cpu(timestamp%3600)/60)), + (int)(le64_to_cpu(timestamp%60))); + + printf(" Event ID : 0x%02x %s\n", id, telemetry_ts_event_to_string(id)); + printf(" Timestamp : %s\n", time_str); + printf(" Size : %d\n", size); + if (size > 8) { + printf(" VU Data : 0x"); + for (j = 8; j < size; j++) + printf("%02x", data[j]); + printf("\n\n"); + } + break; + + case TELEMETRY_PCIE_CLASS: + printf(" Event ID : 0x%02x %s\n", + id, telemetry_pcie_event_id_to_string(id)); + printf(" State : 0x%02x %s\n", + data[0], telemetry_pcie_state_data_to_string(data[0])); + printf(" Speed : 0x%02x %s\n", + data[1], telemetry_pcie_speed_data_to_string(data[1])); + printf(" Width : 0x%02x %s\n", + data[2], telemetry_pcie_width_data_to_string(data[2])); + if (size > 4) { + printf(" VU Data : "); + for (j = 4; j < size; j++) + printf("%x", data[j]); + printf("\n\n"); + } + break; + + case TELEMETRY_NVME_CLASS: + printf(" Event ID : 0x%02x %s\n", + id, telemetry_nvme_event_id_to_string(id)); + if ((id == ADMIN_QUEUE_NONZERO_STATUS) || + (id == IO_QUEUE_NONZERO_STATUS)) { + printf(" Cmd Op Code : 0x%02x\n", data[0]); + __u16 status = *(__u16 *)&data[1]; + __u16 cmd_id = *(__u16 *)&data[3]; + __u16 sq_id = *(__u16 *)&data[5]; + + printf(" Status Code : 0x%04x\n", le16_to_cpu(status)); + printf(" Cmd ID : 0x%04x\n", le16_to_cpu(cmd_id)); + printf(" SQ ID : 0x%04x\n", le16_to_cpu(sq_id)); + } else if (id == CC_REGISTER_CHANGED) { + __u32 cc_reg_data = *(__u32 *)data; + + printf(" CC Reg Data : 0x%08x\n", + le32_to_cpu(cc_reg_data)); + } else if (id == CSTS_REGISTER_CHANGED) { + __u32 csts_reg_data = *(__u32 *)data; + + printf(" CSTS Reg Data : 0x%08x\n", + le32_to_cpu(csts_reg_data)); + } + if (size > 8) + print_vu_event_data(size, (__u8 *)&data[8]); + break; + + case TELEMETRY_RESET_CLASS: + printf(" Event ID : 0x%02x %s\n", + id, telemetry_reset_event_id_to_string(id)); + if (size) + print_vu_event_data(size, data); + break; + + case TELEMETRY_BOOT_SEQ_CLASS: + printf(" Event ID : 0x%02x %s\n", + id, telemetry_boot_seq_event_id_to_string(id)); + if (size) + print_vu_event_data(size, data); + break; + + case TELEMETRY_FW_ASSERT_CLASS: + printf(" Event ID : 0x%02x %s\n", + id, telemetry_fw_assert_event_id_to_string(id)); + if (size) + print_vu_event_data(size, data); + break; + + case TELEMETRY_TEMPERATURE_CLASS: + printf(" Event ID : 0x%02x %s\n", + id, telemetry_temperature_event_id_to_string(id)); + if (size) + print_vu_event_data(size, data); + break; + + case TELEMETRY_MEDIA_DBG_CLASS: + printf(" Event ID : 0x%02x %s\n", + id, telemetry_media_debug_event_id_to_string(id)); + if (size) + print_vu_event_data(size, data); + break; + + case TELEMETRY_MEDIA_WEAR_CLASS: + printf(" Event ID : 0x%02x %s\n", + id, telemetry_media_debug_event_id_to_string(id)); + __u32 host_tb_written = *(__u32 *)&data[0]; + __u32 media_tb_written = *(__u32 *)&data[4]; + __u32 media_tb_erased = *(__u32 *)&data[8]; + + printf(" Host TB Written : 0x%04x\n", + le16_to_cpu(host_tb_written)); + printf(" Media TB Written : 0x%04x\n", + le16_to_cpu(media_tb_written)); + printf(" Media TB Erased : 0x%04x\n", + le16_to_cpu(media_tb_erased)); + + if (size > 12) + print_vu_event_data(size, (__u8 *)&data[12]); + break; + + case TELEMETRY_STAT_SNAPSHOT_CLASS: + printf(" Statistic ID : 0x%02x %s\n", + id, telemetry_stat_id_to_string(id)); + print_stats_desc((struct telemetry_stats_desc *)data); + break; + + default: + /* + * printf("Unknown Event Class Type\n"); + * printf("Data : 0x"); + * for (j = 0; j < size; j++) + * printf("%x", data[j]); + * printf("\n\n"); + */ + break; + } +} diff --git a/plugins/ocp/ocp-telemetry-decode.h b/plugins/ocp/ocp-telemetry-decode.h new file mode 100644 index 0000000000..312c41db57 --- /dev/null +++ b/plugins/ocp/ocp-telemetry-decode.h @@ -0,0 +1,493 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* Copyright (c) 2024 Western Digital Corporation or its affiliates. + * + * Authors: Jeff Lien , + */ + +/***************************************************************************** + * Telemetry Statistics ID's and Strings + *****************************************************************************/ +enum TELEMETRY_STATISTIC_ID { + TELEMETRY_STAT_ID_OAC = 0x1, /* Outstanding Admin Commands */ + TELEMETRY_STAT_ID_HWB = 0x2, /* Host Write Bandwidth */ + TELEMETRY_STAT_ID_GCWB = 0x3, /* Garbage Collection Write Bandwidth */ + TELEMETRY_STAT_ID_AN = 0x4, /* Active Namespaces */ + TELEMETRY_STAT_ID_IWW = 0x5, /* Internal Write Workload */ + TELEMETRY_STAT_ID_IRW = 0x6, /* Internal Read Workload */ + TELEMETRY_STAT_ID_IWQD = 0x7, /* Internal Write Queue Depth */ + TELEMETRY_STAT_ID_IRQD = 0x8, /* Internal Read Queue Depth */ + TELEMETRY_STAT_ID_PTC = 0x9, /* Pending Trim LBA Count */ + TELEMETRY_STAT_ID_HTRC = 0xA, /* Host Trim LBA Request Count */ + TELEMETRY_STAT_ID_CNPS = 0xB, /* Current NVMe Power State */ + TELEMETRY_STAT_ID_CDPS = 0xC, /* Current DSSD Power State */ + TELEMETRY_STAT_ID_PFC = 0xD, /* Program Fail Count */ + TELEMETRY_STAT_ID_EFC = 0xE, /* Erase Fail Count */ + TELEMETRY_STAT_ID_RDW = 0xF, /* Read Disturb Write */ + TELEMETRY_STAT_ID_RW = 0x10, /* Retention Writes */ + TELEMETRY_STAT_ID_WLW = 0x11, /* Wear Leveling Writes */ + TELEMETRY_STAT_ID_RRW = 0x12, /* Read Recovery Writes */ + TELEMETRY_STAT_ID_GCW = 0x13, /* Garbage Collection Writes */ + TELEMETRY_STAT_ID_SCC = 0x14, /* SRAM Correctable Count */ + TELEMETRY_STAT_ID_DCC = 0x15, /* DRAM Uncorrectable Count */ + TELEMETRY_STAT_ID_SUC = 0x16, /* SRAM Correctable Count */ + TELEMETRY_STAT_ID_DUC = 0x17, /* DRAM Uncorrectable Count */ + TELEMETRY_STAT_ID_DIEC = 0x18, /* Data Integrity Error Count */ + TELEMETRY_STAT_ID_RREC = 0x19, /* Read Retry Error Count */ + TELEMETRY_STAT_ID_PEC = 0x1A, /* PERST Events Count */ + TELEMETRY_STAT_ID_MAXDBB = 0x1B, /* Max Die Bad Block */ + TELEMETRY_STAT_ID_MAXCBB = 0x1C, /* Max NAND Channel Bad Block */ + TELEMETRY_STAT_ID_MINCBB = 0x1D, /* Min NAND Channel Bad Block */ +}; + +static const char * const telemetry_stat_id_str[] = { + [TELEMETRY_STAT_ID_OAC] = "Outstanding Admin Commands", + [TELEMETRY_STAT_ID_HWB] = "Host Write Bandwidth", + [TELEMETRY_STAT_ID_GCWB] = "Garbage Collection Write Bandwidth", + [TELEMETRY_STAT_ID_AN] = "Active Namespaces", + [TELEMETRY_STAT_ID_IWW] = "Internal Write Workload", + [TELEMETRY_STAT_ID_IRW] = "Internal Read Workload", + [TELEMETRY_STAT_ID_IWQD] = "Internal Write Queue Depth", + [TELEMETRY_STAT_ID_IRQD] = "Internal Read Queue Depth", + [TELEMETRY_STAT_ID_PTC] = "Pending Trim LBA Count", + [TELEMETRY_STAT_ID_HTRC] = "Host Trim LBA Request Count", + [TELEMETRY_STAT_ID_CNPS] = "Current NVMe Power State", + [TELEMETRY_STAT_ID_CDPS] = "Current DSSD Power State", + [TELEMETRY_STAT_ID_PFC] = "Program Fail Count", + [TELEMETRY_STAT_ID_EFC] = "Erase Fail Count", + [TELEMETRY_STAT_ID_RDW] = "Read Disturb Write", + [TELEMETRY_STAT_ID_RW] = "Retention Writes", + [TELEMETRY_STAT_ID_WLW] = "Wear Leveling Writes", + [TELEMETRY_STAT_ID_RRW] = "Read Recovery Writes", + [TELEMETRY_STAT_ID_GCW] = "Garbage Collection Writes", + [TELEMETRY_STAT_ID_SCC] = "SRAM Correctable Count", + [TELEMETRY_STAT_ID_DCC] = "DRAM Correctable Count", + [TELEMETRY_STAT_ID_SUC] = "SRAM Uncorrectable Count", + [TELEMETRY_STAT_ID_DUC] = "DRAM Uncorrectable Count", + [TELEMETRY_STAT_ID_DIEC] = "Data Integrity Error Count", + [TELEMETRY_STAT_ID_RREC] = "Read Retry Error Count", + [TELEMETRY_STAT_ID_PEC] = "PERST Events Count", + [TELEMETRY_STAT_ID_MAXDBB] = "Max Die Bad Block", + [TELEMETRY_STAT_ID_MAXCBB] = "Max NAND Channel Bad Block", + [TELEMETRY_STAT_ID_MINCBB] = "Min NAND Channel Bad Block", +}; + +/***************************************************************************** + * Telemetry FIFO Event Class ID's and Strings + *****************************************************************************/ +enum TELEMETRY_EVENT_CLASS_TYPE { + TELEMETRY_TIMESTAMP_CLASS = 0x1, + TELEMETRY_PCIE_CLASS = 0x2, + TELEMETRY_NVME_CLASS = 0x3, + TELEMETRY_RESET_CLASS = 0x4, + TELEMETRY_BOOT_SEQ_CLASS = 0x5, + TELEMETRY_FW_ASSERT_CLASS = 0x6, + TELEMETRY_TEMPERATURE_CLASS = 0x7, + TELEMETRY_MEDIA_DBG_CLASS = 0x8, + TELEMETRY_MEDIA_WEAR_CLASS = 0x9, + TELEMETRY_STAT_SNAPSHOT_CLASS = 0xA, +}; + +static const char * const telemetry_event_class_str[] = { + [TELEMETRY_TIMESTAMP_CLASS] = "Timestamp Class", + [TELEMETRY_PCIE_CLASS] = "PCIe Class", + [TELEMETRY_NVME_CLASS] = "NVMe Class", + [TELEMETRY_RESET_CLASS] = "Reset Class", + [TELEMETRY_BOOT_SEQ_CLASS] = "Boot Sequence Class", + [TELEMETRY_FW_ASSERT_CLASS] = "FW Assert Class", + [TELEMETRY_TEMPERATURE_CLASS] = "Temperature Class", + [TELEMETRY_MEDIA_DBG_CLASS] = "Media Debug Class", + [TELEMETRY_MEDIA_WEAR_CLASS] = "Media Wear Class", + [TELEMETRY_STAT_SNAPSHOT_CLASS] = "Statistic Snapshot Class", +}; + +/***************************************************************************** + * Telemetry Timestamp Class (01h) Event ID's and Strings + *****************************************************************************/ +enum TELEMETRY_TIMESTAMP_EVENT_ID { + TIMESTAMP_HOST_CMD_ISSUED = 0x0000, + TIMESTAMP_SNAPSHOT = 0x0001, + TIMESTAMP_POWER_ON_HOURS = 0x0002, +}; + +static const char * const telemetry_timestamp_event_id_str[] = { + [TIMESTAMP_HOST_CMD_ISSUED] = "Timestamp Host Cmd Issued", + [TIMESTAMP_SNAPSHOT] = "Timestamp Snapshot", + [TIMESTAMP_POWER_ON_HOURS] = "Timestamp Power on Hours", +}; + +/***************************************************************************** + * Telemetry PCIE Class (02h) Event ID's and Strings + *****************************************************************************/ +enum TELEMETRY_PCIE_EVENT_ID { + PCIE_LINK_UP = 0x0000, + PCIE_LINK_DOWN = 0x0001, + PCIE_ERROR_DETECTED = 0x0002, + PCIE_PERST_ASSERTED = 0x0003, + PCIE_PERST_DEASSERTED = 0x0004, + PCIE_REFCLK_STABLE = 0x0005, + PCIE_VMAIN_STABLE = 0x0006, + PCIE_LINK_NEGOTIATED = 0x0007, +}; + +static const char * const telemetry_pcie_event_id_str[] = { + [PCIE_LINK_UP] = "PCIe Link Up", + [PCIE_LINK_DOWN] = "PCIe Link Down", + [PCIE_ERROR_DETECTED] = "PCIe Error Detected", + [PCIE_PERST_ASSERTED] = "PCIe PERST Asserted", + [PCIE_PERST_DEASSERTED] = "PCIe PERST Deasserted", + [PCIE_REFCLK_STABLE] = "PCIe Refclk Stable", + [PCIE_VMAIN_STABLE] = "PCIe Vmain Stable", + [PCIE_LINK_NEGOTIATED] = "PCIe Link Negotiated", +}; + +enum TELEMETRY_PCIE_STATE_DATA { + PCIE_STATE_UNCHANGED = 0x00, + PCIE_SPEED_CHANGED = 0x01, + PCIE_WIDTH_CHANGED = 0x02, +}; + +static const char * const telemetry_pcie_state_data_str[] = { + [PCIE_STATE_UNCHANGED] = "PCIe State Unchained", + [PCIE_SPEED_CHANGED] = "PCIe Speed Changed", + [PCIE_WIDTH_CHANGED] = "PCIe Width Changed", +}; + +enum TELEMETRY_PCIE_SPEED_DATA { + PCIE_LINK_GEN1 = 0x01, + PCIE_LINK_GEN2 = 0x02, + PCIE_LINK_GEN3 = 0x03, + PCIE_LINK_GEN4 = 0x04, + PCIE_LINK_GEN5 = 0x05, + PCIE_LINK_GEN6 = 0x06, + PCIE_LINK_GEN7 = 0x07, +}; + +static const char * const telemetry_pcie_speed_data_str[] = { + [PCIE_LINK_GEN1] = "PCIe Link Speed Gen1", + [PCIE_LINK_GEN2] = "PCIe Link Speed Gen2", + [PCIE_LINK_GEN3] = "PCIe Link Speed Gen3", + [PCIE_LINK_GEN4] = "PCIe Link Speed Gen4", + [PCIE_LINK_GEN5] = "PCIe Link Speed Gen5", + [PCIE_LINK_GEN6] = "PCIe Link Speed Gen6", + [PCIE_LINK_GEN7] = "PCIe Link Speed Gen7", +}; + +enum TELEMETRY_PCIE_WIDTH_DATA { + PCIE_LINK_X1 = 0x01, + PCIE_LINK_X2 = 0x02, + PCIE_LINK_X4 = 0x03, + PCIE_LINK_X8 = 0x04, + PCIE_LINK_X16 = 0x05, +}; + +static const char * const telemetry_pcie_width_data_str[] = { + [PCIE_LINK_X1] = "PCIe Link Width x1", + [PCIE_LINK_X2] = "PCIe Link Width x2", + [PCIE_LINK_X4] = "PCIe Link Width x4", + [PCIE_LINK_X8] = "PCIe Link Width x8", + [PCIE_LINK_X16] = "PCIe Link Width x16", +}; + +/***************************************************************************** + * Telemetry NVMe Class (03h) Event ID's and Strings + *****************************************************************************/ +enum TELEMETRY_NVME_EVENT_ID { + CC_EN_0_TO_1 = 0x0000, + CC_EN_1_TO_0 = 0x0001, + CSTS_RDY_0_TO_1 = 0x0002, + CSTS_RDY_1_TO_0 = 0x0003, + NVME_EVENT_ID_RESERVED = 0x0004, + CREATE_IO_QUEUE_PROCESSED = 0x0005, + ADMIN_QUEUE_CMD_PROCESSED = 0x0006, + ADMIN_QUEUE_NONZERO_STATUS = 0x0007, + IO_QUEUE_NONZERO_STATUS = 0x0008, + CSTS_CFS_0_TO_1 = 0x0009, + ADMIN_QUEUE_BASE_WRITTEN = 0x000A, + CC_REGISTER_CHANGED = 0x000B, + CSTS_REGISTER_CHANGED = 0x000C, + DELETE_IO_QUEUE_PROCESSED = 0x000D, +}; + +static const char * const telemetry_nvme_event_id_str[] = { + [CC_EN_0_TO_1] = "CC.EN Transitions from 0 to 1", + [CC_EN_1_TO_0] = "CC.EN Transitions from 1 to 0", + [CSTS_RDY_0_TO_1] = "CSTS.RDY Transitions from 0 to 1", + [CSTS_RDY_1_TO_0] = "CSTS.RDY Transitions from 1 to 0", + [NVME_EVENT_ID_RESERVED] = "Reserved NVMe Event ID", + [CREATE_IO_QUEUE_PROCESSED] = "Create IO SQ or CQ Command Processed", + [ADMIN_QUEUE_CMD_PROCESSED] = "Other Admin Queue Command Processed", + [ADMIN_QUEUE_NONZERO_STATUS] = "Admin Command Returned Non-zero Status", + [IO_QUEUE_NONZERO_STATUS] = "IO Command Returned Non-zero Status", + [CSTS_CFS_0_TO_1] = "CSTS.CFS Transitions from 0 to 1", + [ADMIN_QUEUE_BASE_WRITTEN] = "Admin SQ or CQ Base Address Written", + [CC_REGISTER_CHANGED] = "CC Register Changed", + [CSTS_REGISTER_CHANGED] = "CTS Register Changed", + [DELETE_IO_QUEUE_PROCESSED] = "Delete IO SQ or CQ Command Processed", +}; + +/***************************************************************************** + * Telemetry Reset Class (04h) Event ID's and Strings + *****************************************************************************/ +enum TELEMETRY_RESET_EVENT_ID { + PCIE_CONVENTIONAL_HOT_RESET = 0x0000, + MAIN_POWER_CYCLE = 0x0001, + PERST = 0x0002, + PCIE_FUNCTION_LEVEL_RESET = 0x0003, + NVME_SUBSYSTEM_RESET = 0x0004, +}; + +static const char * const telemetry_reset_event_id_str[] = { + [PCIE_CONVENTIONAL_HOT_RESET] = "PCIE Conventional Hot Reset", + [MAIN_POWER_CYCLE] = "Main Power_Cycle", + [PERST] = "PERST", + [PCIE_FUNCTION_LEVEL_RESET] = "PCIE Function Level Reset", + [NVME_SUBSYSTEM_RESET] = "NVMe Subsytem Reset", +}; + +/***************************************************************************** + * Telemetry Boot Sequence Class (05h) Event ID's and Strings + *****************************************************************************/ +enum TELEMETRY_BOOT_SEQ_EVENT_ID { + MAIN_FW_BOOT_COMPLETE = 0x0000, + FTL_LOAD_FROM_NVM_COMPLETE = 0x0001, + FTL_REBUILD_STARTED = 0x0002, + FTL_REBUILD_COMPLETE = 0x0003, +}; + +static const char * const telemetry_boot_seq_event_id_str[] = { + [MAIN_FW_BOOT_COMPLETE] = "Main Firmware Boot Complete", + [FTL_LOAD_FROM_NVM_COMPLETE] = "FTL Load from NVM Complete", + [FTL_REBUILD_STARTED] = "FTL Rebuild Started", + [FTL_REBUILD_COMPLETE] = "FTL Rebuild Complete", +}; + +/***************************************************************************** + * Telemetry Firmware Assert Class (06h) Event ID's and Strings + *****************************************************************************/ +enum TELEMETRY_FW_ASSERT_EVENT_ID { + ASSERT_NVME_CODE = 0x0000, + ASSERT_MEDIA_CODE = 0x0001, + ASSERT_SECURITY_CODE = 0x0002, + ASSERT_BACKGROUND_CODE = 0x0003, + FTL_REBUILD_FAILED = 0x0004, + FTL_DATA_MISMATCH = 0x0005, + ASSERT_OTHER_CODE = 0x0006, +}; + +static const char * const telemetry_fw_assert_event_id_str[] = { + [ASSERT_NVME_CODE] = "Assert in NVMe Processing Code", + [ASSERT_MEDIA_CODE] = "Assert in Media Code", + [ASSERT_SECURITY_CODE] = "Assert in Security Code", + [ASSERT_BACKGROUND_CODE] = "Assert in Background Services Code", + [FTL_REBUILD_FAILED] = "FTL Rebuild Failed", + [FTL_DATA_MISMATCH] = "FTL Data Mismatch", + [ASSERT_OTHER_CODE] = "FTL Other Code", +}; + +/***************************************************************************** + * Telemetry Temperature Class (07h) Event ID's and Strings + *****************************************************************************/ +enum TELEMETRY_TEMPERATURE_EVENT_ID { + COMPOSITE_TEMP_DECREASE = 0x0000, + COMPOSITE_TEMP_INCREASE_WCTEMP = 0x0001, + COMPOSITE_TEMP_INCREASE_CCTEMP = 0x0002, +}; + +static const char * const telemetry_temperature_event_id_str[] = { + [COMPOSITE_TEMP_DECREASE] = "Composite Temp Decreases to (WCTEMP-2)", + [COMPOSITE_TEMP_INCREASE_WCTEMP] = "Composite Temp Increases to WCTEMP", + [COMPOSITE_TEMP_INCREASE_CCTEMP] = "Composite Temp Increases to CCTEMP", +}; + +/***************************************************************************** + * Telemetry Media Debug Class (08h) Event ID's and Strings + *****************************************************************************/ +enum TELEMETRY_MEDIA_DEBUG_EVENT_ID { + XOR_RECOVERY_INVOKED = 0x0000, + UNCORRECTABLE_MEDIA_ERROR = 0x0001, + BAD_BLOCK_PROGRAM_ERROR = 0x0002, + BAD_BLOCK_ERASE_ERROR = 0x0003, + BAD_BLOCK_READ_ERROR = 0x0004, + PLANE_FAILURE_EVENT = 0x0005, +}; + +static const char * const telemetry_media_debug_event_id_str[] = { + [XOR_RECOVERY_INVOKED] = "XOR Recovery Invoked", + [UNCORRECTABLE_MEDIA_ERROR] = "Uncorrectable Media Error", + [BAD_BLOCK_PROGRAM_ERROR] = "Block Marked Bad Due to Program Error", + [BAD_BLOCK_ERASE_ERROR] = "Block Marked Bad Due to Erase Error", + [BAD_BLOCK_READ_ERROR] = "Block Marked Bad Due to Read Error", + [PLANE_FAILURE_EVENT] = "Plane Failure Event", +}; + +/***************************************************************************** + * Telemetry Media Wear Class (09h) Event ID's and Strings + *****************************************************************************/ +enum TELEMETRY_MEDIA_WEAR_EVENT_ID { + MEDIA_WEAR = 0x0000, +}; + +static const char * const telemetry_media_wear_event_id_str[] = { + [MEDIA_WEAR] = "Media Wear", +}; + + +/***************************************************************************** + * Telemetry Data Structures + *****************************************************************************/ +#define TELEMETRY_HEADER_SIZE 512 +#define TELEMETRY_DATA_SIZE 1536 +#define TELEMETRY_BYTE_PER_BLOCK 512 +#define TELEMETRY_TRANSFER_SIZE 1024 +#define FILE_NAME_SIZE 2048 + +enum TELEMETRY_TYPE { + TELEMETRY_TYPE_NONE = 0, + TELEMETRY_TYPE_HOST = 7, + TELEMETRY_TYPE_CONTROLLER = 8, + TELEMETRY_TYPE_HOST_0 = 9, + TELEMETRY_TYPE_HOST_1 = 10, +}; + +struct telemetry_initiated_log { + __u8 LogIdentifier; + __u8 Reserved1[4]; + __u8 IEEE[3]; + __le16 DataArea1LastBlock; + __le16 DataArea2LastBlock; + __le16 DataArea3LastBlock; + __u8 Reserved2[2]; + __le32 DataArea4LastBlock; + __u8 Reserved3[361]; + __u8 DataHostGenerationNumber; + __u8 CtlrDataAvailable; + __u8 DataCtlrGenerationNumber; + __u8 ReasonIdentifier[128]; +}; + +struct telemetry_stats_desc { + __le16 id; + __u8 info; + __u8 ns_info; + __le16 size; + __le16 rsvd1; + __u8 data[]; +}; + +struct telemetry_event_desc { + __u8 class; + __le16 id; + __u8 size; + __u8 data[]; +}; + +struct event_fifo { + __le64 start; + __le64 size; +}; + +struct telemetry_data_area_1 { + __le16 major_version; + __le16 minor_version; + __u8 reserved1[4]; + __le64 timestamp; + __u8 log_page_guid[16]; + __u8 no_of_tps_supp; + __u8 tps; + __u8 reserved2[6]; + __le64 sls; + __u8 reserved3[8]; + __u8 fw_revision[8]; + __u8 reserved4[32]; + __le64 da1_stat_start; + __le64 da1_stat_size; + __le64 da2_stat_start; + __le64 da2_stat_size; + __u8 reserved5[32]; + __u8 event_fifo_da[16]; + struct event_fifo event_fifos[16]; + __u8 reserved6[80]; + __u8 smart_health_info[512]; + __u8 smart_health_info_extended[512]; +}; + + +/************************************************************ + * Telemetry Parsing Function Prototypes + ************************************************************/ +void print_vu_event_data(__u32 size, __u8 *data); +void print_stats_desc(struct telemetry_stats_desc *stat_desc); +void print_telemetry_fifo_event(__u8 class_type, + __u16 id, __u8 size, __u8 *data); + + +/************************************************************ + * Telemetry ID to String Conversion Functions + ************************************************************/ +static inline const char *arg_str(const char * const *strings, + size_t array_size, size_t idx) +{ + if (idx < array_size && strings[idx]) + return strings[idx]; + return "unrecognized"; +} + +#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0])) +#define ARGSTR(s, i) arg_str(s, ARRAY_SIZE(s), i) + +static inline const char *telemetry_stat_id_to_string(int stat_id) +{ + return ARGSTR(telemetry_stat_id_str, stat_id); +} +static inline const char *telemetry_event_class_to_string(int class) +{ + return ARGSTR(telemetry_event_class_str, class); +} +static inline const char *telemetry_ts_event_to_string(int event_id) +{ + return ARGSTR(telemetry_timestamp_event_id_str, event_id); +} +static inline const char *telemetry_pcie_event_id_to_string(int event_id) +{ + return ARGSTR(telemetry_pcie_event_id_str, event_id); +} +static inline const char *telemetry_pcie_state_data_to_string(int pcie_state) +{ + return ARGSTR(telemetry_pcie_state_data_str, pcie_state); +} +static inline const char *telemetry_pcie_speed_data_to_string(int pcie_speed) +{ + return ARGSTR(telemetry_pcie_speed_data_str, pcie_speed); +} +static inline const char *telemetry_pcie_width_data_to_string(int pcie_width) +{ + return ARGSTR(telemetry_pcie_width_data_str, pcie_width); +} +static inline const char *telemetry_nvme_event_id_to_string(int event_id) +{ + return ARGSTR(telemetry_nvme_event_id_str, event_id); +} +static inline const char *telemetry_reset_event_id_to_string(int event_id) +{ + return ARGSTR(telemetry_reset_event_id_str, event_id); +} +static inline const char *telemetry_boot_seq_event_id_to_string(int event_id) +{ + return ARGSTR(telemetry_boot_seq_event_id_str, event_id); +} +static inline const char *telemetry_fw_assert_event_id_to_string(int event_id) +{ + return ARGSTR(telemetry_fw_assert_event_id_str, event_id); +} +static inline const char *telemetry_temperature_event_id_to_string(int event_id) +{ + return ARGSTR(telemetry_temperature_event_id_str, event_id); +} +static inline const char *telemetry_media_debug_event_id_to_string(int event_id) +{ + return ARGSTR(telemetry_media_debug_event_id_str, event_id); +} +static inline const char *telemetry_media_wear_event_id_to_string(int event_id) +{ + return ARGSTR(telemetry_media_wear_event_id_str, event_id); +} From fa5a46cc25b884a61a14f06e6693373bcefff29d Mon Sep 17 00:00:00 2001 From: Oliver Upton Date: Thu, 4 Jul 2024 09:09:40 +0000 Subject: [PATCH 007/281] common.h: Avoid using unsupported load/store instructions in arm64 VMs Using nvme show-regs within a VM on arm64 can sometimes lead to VM termination. To answer why this happens: one of the deficiencies of the Arm architecture is that there exists a range of load/store instructions that have insufficient decode information for traps taken to the hypervisor. KVM, for example, may raise an external abort or outright terminate the VM depending on the configuration. This is a known problem on the kernel side, and is fixed by using assembly MMIO accessors w/ 'safe' load/store instructions. So do exactly that, providing arm64-specific accessors and falling back to plain old volatile pointer accesses for other architectures. Reported-by: William Butler Signed-off-by: Oliver Upton --- common.h | 62 +++++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 50 insertions(+), 12 deletions(-) diff --git a/common.h b/common.h index a4f4f99de2..9e3a367bc3 100644 --- a/common.h +++ b/common.h @@ -17,43 +17,81 @@ #define __packed __attribute__((__packed__)) #endif /* __packed */ -static inline uint32_t mmio_read32(void *addr) +/* + * VMs on arm64 can only use a subset of instructions for MMIO that provide + * the hypervisor with a complete instruction decode. Provide assembly MMIO + * accessors to prevent the compiler from using a possibly unsupported + * instruction. + * + * See kernel commit c726200dd106 ("KVM: arm/arm64: Allow reporting non-ISV + * data aborts to userspace") for more details. + */ +#if defined(__aarch64__) +static inline leint32_t __raw_readl(const volatile leint32_t *addr) +{ + leint32_t val; + + asm volatile("ldr %w0, %1" : "=r" (val) : "Qo" (*addr)); + + return val; +} + +static inline void __raw_writel(volatile leint32_t *addr, leint32_t val) { - leint32_t *p = addr; + asm volatile("str %w0, %1" : : "r" (val), "Qo" (*addr)); +} - return le32_to_cpu(*p); +static inline void __raw_writeq(volatile leint64_t *addr, leint64_t val) +{ + asm volatile("str %0, %1" : : "r" (val), "Qo" (*addr)); +} +#else +static inline leint32_t __raw_readl(volatile leint32_t *addr) +{ + return *addr; +} + +static inline void __raw_writel(volatile leint32_t *addr, leint32_t val) +{ + *addr = val; +} + +static inline void __raw_writeq(volatile leint64_t *addr, leint64_t val) +{ + *addr = val; +} +#endif + +static inline uint32_t mmio_read32(void *addr) +{ + return le32_to_cpu(__raw_readl(addr)); } /* Access 64-bit registers as 2 32-bit; Some devices fail 64-bit MMIO. */ static inline uint64_t mmio_read64(void *addr) { - const volatile uint32_t *p = addr; uint32_t low, high; - low = le32_to_cpu(*p); - high = le32_to_cpu(*(p + 1)); + low = le32_to_cpu(__raw_readl(addr)); + high = le32_to_cpu(__raw_readl(addr + sizeof(leint32_t))); return ((uint64_t)high << 32) | low; } static inline void mmio_write32(void *addr, uint32_t value) { - leint32_t *p = addr; - - *p = cpu_to_le32(value); + __raw_writel(addr, cpu_to_le32(value)); } /* Access 64-bit registers as 2 32-bit if write32 flag set; Some devices fail 64-bit MMIO. */ static inline void mmio_write64(void *addr, uint64_t value, bool write32) { - uint64_t *p = addr; - if (write32) { mmio_write32(addr, value); mmio_write32((uint32_t *)addr + 1, value >> 32); return; } - *p = cpu_to_le64(value); + __raw_writeq(addr, cpu_to_le64(value)); } #endif From 24a6bfdbc38c95a4515201658cd4b0c1c4705470 Mon Sep 17 00:00:00 2001 From: Tokunori Ikegami Date: Fri, 5 Jul 2024 00:59:56 +0900 Subject: [PATCH 008/281] nvme: change _cleanup_file_ to _cleanup_fd_ Add _cleanup_file_ to clean up file stream instead. Signed-off-by: Tokunori Ikegami --- nvme.c | 20 ++++++++++---------- plugins/solidigm/solidigm-internal-logs.c | 2 +- util/cleanup.h | 16 +++++++++------- 3 files changed, 20 insertions(+), 18 deletions(-) diff --git a/nvme.c b/nvme.c index 528eb448b4..08553e5664 100644 --- a/nvme.c +++ b/nvme.c @@ -880,7 +880,7 @@ static int get_telemetry_log(int argc, char **argv, struct command *cmd, _cleanup_free_ struct nvme_telemetry_log *log = NULL; _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; - _cleanup_file_ int output = -1; + _cleanup_fd_ int output = -1; int err = 0; size_t total_size; __u8 *data_ptr = NULL; @@ -1808,7 +1808,7 @@ static int get_boot_part_log(int argc, char **argv, struct command *cmd, struct _cleanup_free_ __u8 *bp_log = NULL; nvme_print_flags_t flags; int err = -1; - _cleanup_file_ int output = -1; + _cleanup_fd_ int output = -1; __u32 bpsz = 0; struct config { @@ -2183,7 +2183,7 @@ static int io_mgmt_recv(int argc, char **argv, struct command *cmd, struct plugi _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; _cleanup_free_ void *buf = NULL; int err = -1; - _cleanup_file_ int dfd = -1; + _cleanup_fd_ int dfd = -1; struct config { __u16 mos; @@ -4903,7 +4903,7 @@ static int fw_download(int argc, char **argv, struct command *cmd, struct plugin _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; _cleanup_huge_ struct nvme_mem_huge mh = { 0, }; - _cleanup_file_ int fw_fd = -1; + _cleanup_fd_ int fw_fd = -1; unsigned int fw_size, pos; int err; struct stat sb; @@ -6374,7 +6374,7 @@ static int set_feature(int argc, char **argv, struct command *cmd, struct plugin _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; _cleanup_free_ void *buf = NULL; - _cleanup_file_ int ffd = STDIN_FILENO; + _cleanup_fd_ int ffd = STDIN_FILENO; int err; __u32 result; @@ -6524,7 +6524,7 @@ static int sec_send(int argc, char **argv, struct command *cmd, struct plugin *p _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; _cleanup_free_ void *sec_buf = NULL; - _cleanup_file_ int sec_fd = -1; + _cleanup_fd_ int sec_fd = -1; unsigned int sec_size; int err; @@ -6633,7 +6633,7 @@ static int dir_send(int argc, char **argv, struct command *cmd, struct plugin *p _cleanup_free_ void *buf = NULL; __u32 result; __u32 dw12 = 0; - _cleanup_file_ int ffd = STDIN_FILENO; + _cleanup_fd_ int ffd = STDIN_FILENO; int err; struct config { @@ -7720,7 +7720,7 @@ static int submit_io(int opcode, char *command, const char *desc, int argc, char void *buffer; _cleanup_free_ void *mbuffer = NULL; int err = 0; - _cleanup_file_ int dfd = -1, mfd = -1; + _cleanup_fd_ int dfd = -1, mfd = -1; int flags; int mode = 0644; __u16 control = 0, nblocks = 0; @@ -8728,7 +8728,7 @@ static int passthru(int argc, char **argv, bool admin, _cleanup_huge_ struct nvme_mem_huge mh = { 0, }; _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; - _cleanup_file_ int dfd = -1, mfd = -1; + _cleanup_fd_ int dfd = -1, mfd = -1; int flags; int mode = 0644; void *data = NULL; @@ -9663,7 +9663,7 @@ static int nvme_mi(int argc, char **argv, __u8 admin_opcode, const char *desc) void *data = NULL; int err = 0; bool send; - _cleanup_file_ int fd = -1; + _cleanup_fd_ int fd = -1; int flags; _cleanup_huge_ struct nvme_mem_huge mh = { 0, }; _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; diff --git a/plugins/solidigm/solidigm-internal-logs.c b/plugins/solidigm/solidigm-internal-logs.c index ef7a39426e..f5b57f321a 100644 --- a/plugins/solidigm/solidigm-internal-logs.c +++ b/plugins/solidigm/solidigm-internal-logs.c @@ -455,7 +455,7 @@ struct log { static int log_save(struct log *log, const char *parent_dir_name, const char *subdir_name, const char *file_name, __u8 *buffer, size_t buf_size) { - _cleanup_file_ int output = -1; + _cleanup_fd_ int output = -1; char file_path[PATH_MAX] = {0}; size_t bytes_remaining = 0; int err = 0; diff --git a/util/cleanup.h b/util/cleanup.h index 36200f2895..0819523d7d 100644 --- a/util/cleanup.h +++ b/util/cleanup.h @@ -23,18 +23,18 @@ DECLARE_CLEANUP_FUNC(name, type) \ static inline void freep(void *p) { - free(*(void**) p); + free(*(void **)p); } #define _cleanup_free_ __cleanup__(freep) #define _cleanup_huge_ __cleanup__(nvme_free_huge) -static inline void close_file(int *f) +static inline void cleanup_fd(int *fd) { - if (*f > STDERR_FILENO) - close(*f); + if (*fd > STDERR_FILENO) + close(*fd); } -#define _cleanup_file_ __cleanup__(close_file) +#define _cleanup_fd_ __cleanup__(cleanup_fd) static inline void cleanup_nvme_root(nvme_root_t *r) { @@ -48,7 +48,9 @@ static inline void free_uri(struct nvme_fabrics_uri **uri) if (*uri) nvme_free_uri(*uri); } - #define _cleanup_uri_ __cleanup__(free_uri) -#endif +static inline DEFINE_CLEANUP_FUNC(cleanup_file, FILE *, fclose) +#define _cleanup_file_ __cleanup__(cleanup_file) + +#endif /* __CLEANUP_H */ From 6bebd94b070a239035f1f7b9aea7f72efcabae18 Mon Sep 17 00:00:00 2001 From: Daniel Wagner Date: Thu, 4 Jul 2024 19:28:07 +0200 Subject: [PATCH 009/281] build: bump libnvme wrap Fetch nvme_revoke_tls_key. Signed-off-by: Daniel Wagner --- subprojects/libnvme.wrap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subprojects/libnvme.wrap b/subprojects/libnvme.wrap index 06779fe2f7..38746019b8 100644 --- a/subprojects/libnvme.wrap +++ b/subprojects/libnvme.wrap @@ -1,6 +1,6 @@ [wrap-git] url = https://github.com/linux-nvme/libnvme.git -revision = e42b6a81cbeb558b5f63e93cf2e7cd70857df4df +revision = 926456937807434a716624cee4ee01e6add3b74d [provide] libnvme = libnvme_dep From cf3db5f1d49ae5b967aa9ed7fa9a03fb0a91143f Mon Sep 17 00:00:00 2001 From: Daniel Wagner Date: Mon, 1 Jul 2024 11:41:11 +0200 Subject: [PATCH 010/281] nvme: use stdout for exporting TLS keys The export command should use stdout as default output as documentation claims. Furthermore, it should open the keyfile to write in write mode. Signed-off-by: Daniel Wagner --- nvme.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/nvme.c b/nvme.c index 08553e5664..28fac1cc06 100644 --- a/nvme.c +++ b/nvme.c @@ -9477,14 +9477,25 @@ static int tls_key(int argc, char **argv, struct command *command, struct plugin return err; if (cfg.keyfile) { - fd = fopen(cfg.keyfile, "r"); + const char *mode; + + if (cfg.import) + mode = "r"; + else + mode = "w"; + + fd = fopen(cfg.keyfile, mode); if (!fd) { nvme_show_error("Cannot open keyfile %s, error %d\n", cfg.keyfile, errno); return -errno; } - } else - fd = stdin; + } else { + if (cfg.import) + fd = freopen(NULL, "r", stdin); + else + fd = freopen(NULL, "w", stdout); + } if (cfg.export && cfg.import) { nvme_show_error("Cannot specify both --import and --export"); From 7e28911df81966259a0abc7d466524047464b28b Mon Sep 17 00:00:00 2001 From: Daniel Wagner Date: Mon, 1 Jul 2024 14:46:04 +0200 Subject: [PATCH 011/281] nvme: strip newline when parsing TLS key files When exporting a TLS keys from the kernel keyring a line might have a newline. Strip the newline away as the nvme_import_tls_key is not expecting it and thus fails to load an exported keyfile. Signed-off-by: Daniel Wagner --- nvme.c | 1 + 1 file changed, 1 insertion(+) diff --git a/nvme.c b/nvme.c index 28fac1cc06..6ce7f12e83 100644 --- a/nvme.c +++ b/nvme.c @@ -9527,6 +9527,7 @@ static int tls_key(int argc, char **argv, struct command *command, struct plugin } *tls_key = '\0'; tls_key++; + tls_key[strcspn(tls_key, "\n")] = 0; psk = nvme_import_tls_key(tls_key, &key_len, &hmac); if (!psk) { nvme_show_error("Failed to import key in line %d", From d3a06ed0d52a67b81e7c81459bafe9868a110061 Mon Sep 17 00:00:00 2001 From: Daniel Wagner Date: Thu, 4 Jul 2024 18:38:56 +0200 Subject: [PATCH 012/281] nvme: use cleanup helper for STREAM objects The tls_key function is using a STREAM object and closes it when leaving the context. Update it to use the helper. Signed-off-by: Daniel Wagner --- nvme.c | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/nvme.c b/nvme.c index 6ce7f12e83..0c18f4e195 100644 --- a/nvme.c +++ b/nvme.c @@ -9446,7 +9446,7 @@ static int tls_key(int argc, char **argv, struct command *command, struct plugin const char *import = "Import all keys into the keyring."; const char *export = "Export all keys from the keyring."; - FILE *fd; + _cleanup_file_ FILE *fd = NULL; int err = 0; struct config { @@ -9499,7 +9499,7 @@ static int tls_key(int argc, char **argv, struct command *command, struct plugin if (cfg.export && cfg.import) { nvme_show_error("Cannot specify both --import and --export"); - err = -EINVAL; + return -EINVAL; } else if (cfg.export) { nvme_scan_tls_keys(cfg.keyring, __scan_tls_key, fd); } else if (cfg.import) { @@ -9513,8 +9513,7 @@ static int tls_key(int argc, char **argv, struct command *command, struct plugin keyring_id = nvme_lookup_keyring(cfg.keyring); if (!keyring_id) { nvme_show_error("Invalid keyring '%s'", cfg.keyring); - err = -ENOKEY; - goto out; + return -ENOKEY; } while (fgets(tls_str, 512, fd)) { @@ -9543,10 +9542,6 @@ static int tls_key(int argc, char **argv, struct command *command, struct plugin err = -EINVAL; } -out: - if (cfg.keyfile) - fclose(fd); - return err; } From 87bd4039c98e2abd4867e3a8c345d1abc19617a8 Mon Sep 17 00:00:00 2001 From: Daniel Wagner Date: Thu, 4 Jul 2024 18:41:35 +0200 Subject: [PATCH 013/281] fabrics: use cleanup helper for STREAM objects discover_from_conf_file uses a STREAM. Let's use the cleanup helper to close it. Signed-off-by: Daniel Wagner --- fabrics.c | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/fabrics.c b/fabrics.c index f1e0bd7772..2f3b81231f 100644 --- a/fabrics.c +++ b/fabrics.c @@ -406,7 +406,7 @@ static int discover_from_conf_file(nvme_root_t r, nvme_host_t h, char *ptr, **argv, *p, line[4096]; int argc, ret = 0; unsigned int verbose = 0; - FILE *f; + _cleanup_file_ FILE *f = NULL; nvme_print_flags_t flags; char *format = "normal"; struct nvme_fabrics_config cfg; @@ -431,15 +431,12 @@ static int discover_from_conf_file(nvme_root_t r, nvme_host_t h, f = fopen(PATH_NVMF_DISC, "r"); if (f == NULL) { fprintf(stderr, "No params given and no %s\n", PATH_NVMF_DISC); - errno = ENOENT; - return -1; + return -ENOENT; } argv = calloc(MAX_DISC_ARGS, sizeof(char *)); - if (!argv) { - ret = -1; - goto out; - } + if (!argv) + return -1; argv[0] = "discover"; memset(line, 0, sizeof(line)); @@ -497,8 +494,7 @@ static int discover_from_conf_file(nvme_root_t r, nvme_host_t h, memset(&cfg, 0, sizeof(cfg)); } free(argv); -out: - fclose(f); + return ret; } From 41e5750c80bdfd6a879e9bc7c3f44b9e8f50eacf Mon Sep 17 00:00:00 2001 From: Daniel Wagner Date: Thu, 4 Jul 2024 18:42:46 +0200 Subject: [PATCH 014/281] nvme-rpmb: use cleanup helper for STREAM objects write_file uses a STREAM. Let's use the cleanup helper to close it. Signed-off-by: Daniel Wagner --- nvme-rpmb.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/nvme-rpmb.c b/nvme-rpmb.c index 345e6ea53f..b35ce1d70f 100644 --- a/nvme-rpmb.c +++ b/nvme-rpmb.c @@ -207,7 +207,7 @@ static void write_file(unsigned char *data, size_t len, const char *dir, const char *file, const char *msg) { char temp_folder[PATH_MAX] = { 0 }; - FILE *fp = NULL; + _cleanup_file_ FILE *fp = NULL; if (dir != NULL) sprintf(temp_folder, "%s/%s", dir, file); @@ -219,7 +219,6 @@ static void write_file(unsigned char *data, size_t len, const char *dir, fprintf(stderr, "Failed to write %s data to %s\n", msg ? msg : "", temp_folder); } - fclose(fp); } else { fprintf(stderr, "Failed to open %s file to write %s\n", temp_folder, msg ? msg : ""); From 7e1f6799f8cd61b474fa12fa3b1de529e063b39c Mon Sep 17 00:00:00 2001 From: Daniel Wagner Date: Thu, 4 Jul 2024 18:43:54 +0200 Subject: [PATCH 015/281] nvme: use cleanup helper to close file descriptor io_mgmt_send uses a file descriptor. Let's use the cleanup helper to close it. Signed-off-by: Daniel Wagner --- nvme.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/nvme.c b/nvme.c index 0c18f4e195..17d3fac678 100644 --- a/nvme.c +++ b/nvme.c @@ -2096,7 +2096,7 @@ static int io_mgmt_send(int argc, char **argv, struct command *cmd, struct plugi _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; _cleanup_free_ void *buf = NULL; int err = -1; - int dfd = STDIN_FILENO; + _cleanup_fd_ int dfd = -1; struct config { __u16 mos; @@ -2141,12 +2141,13 @@ static int io_mgmt_send(int argc, char **argv, struct command *cmd, struct plugi nvme_show_perror(cfg.file); return -errno; } - } + } else + dfd = dup(STDIN_FILENO); err = read(dfd, buf, cfg.data_len); if (err < 0) { nvme_show_perror("read"); - goto close_fd; + return err; } struct nvme_io_mgmt_send_args args = { @@ -2169,9 +2170,6 @@ static int io_mgmt_send(int argc, char **argv, struct command *cmd, struct plugi else nvme_show_perror("io-mgmt-send"); -close_fd: - if (cfg.file) - close(dfd); return err; } From 08c8c7d5cb16d2cfb5f175b8a78d9e80ac50b759 Mon Sep 17 00:00:00 2001 From: Daniel Wagner Date: Fri, 28 Jun 2024 20:12:55 +0200 Subject: [PATCH 016/281] nvme: factor out import key function Split the command line option handling code from the operation. Signed-off-by: Daniel Wagner --- nvme.c | 76 ++++++++++++++++++++++++++++++++-------------------------- 1 file changed, 42 insertions(+), 34 deletions(-) diff --git a/nvme.c b/nvme.c index 17d3fac678..58c3e73257 100644 --- a/nvme.c +++ b/nvme.c @@ -9435,6 +9435,47 @@ static void __scan_tls_key(long keyring_id, long key_id, fprintf(fd, "%s %s\n", desc, encoded_key); } +static int import_key(const char *keyring, FILE *fd) +{ + long keyring_id; + char tls_str[512]; + char *tls_key; + unsigned char *psk; + unsigned int hmac; + int linenum = -1, key_len; + + keyring_id = nvme_lookup_keyring(keyring); + if (!keyring_id) { + nvme_show_error("Invalid keyring '%s'", keyring); + return -ENOKEY; + } + + while (fgets(tls_str, 512, fd)) { + linenum++; + tls_key = strrchr(tls_str, ' '); + if (!tls_key) { + nvme_show_error("Parse error in line %d", + linenum); + continue; + } + *tls_key = '\0'; + tls_key++; + tls_key[strcspn(tls_key, "\n")] = 0; + psk = nvme_import_tls_key(tls_key, &key_len, &hmac); + if (!psk) { + nvme_show_error("Failed to import key in line %d", + linenum); + continue; + } + nvme_update_key(keyring_id, "psk", tls_str, + psk, key_len); + free(psk); + } + + return 0; +} + + static int tls_key(int argc, char **argv, struct command *command, struct plugin *plugin) { const char *desc = "Manipulation of TLS keys.\n"; @@ -9501,40 +9542,7 @@ static int tls_key(int argc, char **argv, struct command *command, struct plugin } else if (cfg.export) { nvme_scan_tls_keys(cfg.keyring, __scan_tls_key, fd); } else if (cfg.import) { - long keyring_id; - char tls_str[512]; - char *tls_key; - unsigned char *psk; - unsigned int hmac; - int linenum = -1, key_len; - - keyring_id = nvme_lookup_keyring(cfg.keyring); - if (!keyring_id) { - nvme_show_error("Invalid keyring '%s'", cfg.keyring); - return -ENOKEY; - } - - while (fgets(tls_str, 512, fd)) { - linenum++; - tls_key = strrchr(tls_str, ' '); - if (!tls_key) { - nvme_show_error("Parse error in line %d", - linenum); - continue; - } - *tls_key = '\0'; - tls_key++; - tls_key[strcspn(tls_key, "\n")] = 0; - psk = nvme_import_tls_key(tls_key, &key_len, &hmac); - if (!psk) { - nvme_show_error("Failed to import key in line %d", - linenum); - continue; - } - nvme_update_key(keyring_id, "psk", tls_str, - psk, key_len); - free(psk); - } + import_key(cfg.keyring, fd); } else { nvme_show_error("Must specify either --import or --export"); err = -EINVAL; From 020c08a0089c5d1c95e198cc18469faf0e30813b Mon Sep 17 00:00:00 2001 From: Daniel Wagner Date: Tue, 9 Jul 2024 11:19:06 +0200 Subject: [PATCH 017/281] nvme: return error code/message for TLS commands Propagate error codes for TLS commands. Also print an error message when scanning TLS keys. Signed-off-by: Daniel Wagner --- nvme.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/nvme.c b/nvme.c index 58c3e73257..bd6dbeb49e 100644 --- a/nvme.c +++ b/nvme.c @@ -9540,9 +9540,12 @@ static int tls_key(int argc, char **argv, struct command *command, struct plugin nvme_show_error("Cannot specify both --import and --export"); return -EINVAL; } else if (cfg.export) { - nvme_scan_tls_keys(cfg.keyring, __scan_tls_key, fd); + err = nvme_scan_tls_keys(cfg.keyring, __scan_tls_key, fd); + if (err) + nvme_show_error("Export of TLS keys failed with '%s'", + nvme_strerror(errno)); } else if (cfg.import) { - import_key(cfg.keyring, fd); + err = import_key(cfg.keyring, fd); } else { nvme_show_error("Must specify either --import or --export"); err = -EINVAL; From f76430f18750797b5e18c99c38af9a1b8350365f Mon Sep 17 00:00:00 2001 From: Daniel Wagner Date: Mon, 1 Jul 2024 11:13:11 +0200 Subject: [PATCH 018/281] nvme: add support to revoke TLS key Add support to nvme-cli to revoke TLS keys from a keyring. Signed-off-by: Daniel Wagner --- nvme.c | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/nvme.c b/nvme.c index bd6dbeb49e..f3288cf005 100644 --- a/nvme.c +++ b/nvme.c @@ -9484,9 +9484,10 @@ static int tls_key(int argc, char **argv, struct command *command, struct plugin const char *keyfile = "File for list of keys."; const char *import = "Import all keys into the keyring."; const char *export = "Export all keys from the keyring."; + const char *revoke = "Revoke key from the keyring."; _cleanup_file_ FILE *fd = NULL; - int err = 0; + int cnt, err = 0; struct config { char *keyring; @@ -9494,6 +9495,7 @@ static int tls_key(int argc, char **argv, struct command *command, struct plugin char *keyfile; bool import; bool export; + char *revoke; }; struct config cfg = { @@ -9502,6 +9504,7 @@ static int tls_key(int argc, char **argv, struct command *command, struct plugin .keyfile = NULL, .import = false, .export = false, + .revoke = NULL, }; NVME_ARGS(opts, @@ -9509,7 +9512,8 @@ static int tls_key(int argc, char **argv, struct command *command, struct plugin OPT_STR("keytype", 't', &cfg.keytype, keytype), OPT_STR("keyfile", 'f', &cfg.keyfile, keyfile), OPT_FLAG("import", 'i', &cfg.import, import), - OPT_FLAG("export", 'e', &cfg.export, export)); + OPT_FLAG("export", 'e', &cfg.export, export), + OPT_STR("revoke", 'r', &cfg.revoke, revoke)); err = argconfig_parse(argc, argv, desc, opts); if (err) @@ -9536,8 +9540,13 @@ static int tls_key(int argc, char **argv, struct command *command, struct plugin fd = freopen(NULL, "w", stdout); } - if (cfg.export && cfg.import) { - nvme_show_error("Cannot specify both --import and --export"); + cnt = 0; + if (cfg.export) cnt++; + if (cfg.import) cnt++; + if (cfg.revoke) cnt++; + + if (cnt != 1) { + nvme_show_error("Must specify either --import, --export or --revoke"); return -EINVAL; } else if (cfg.export) { err = nvme_scan_tls_keys(cfg.keyring, __scan_tls_key, fd); @@ -9547,8 +9556,10 @@ static int tls_key(int argc, char **argv, struct command *command, struct plugin } else if (cfg.import) { err = import_key(cfg.keyring, fd); } else { - nvme_show_error("Must specify either --import or --export"); - err = -EINVAL; + err = nvme_revoke_tls_key(cfg.keyring, cfg.keytype, cfg.revoke); + if (err) + nvme_show_error("Failed to revoke key '%s'", + nvme_strerror(errno)); } return err; From bdd432020ee9841de5389c793c22d9cac21e07de Mon Sep 17 00:00:00 2001 From: Daniel Wagner Date: Mon, 1 Jul 2024 14:38:27 +0200 Subject: [PATCH 019/281] build: sort documentation files entries Sort the file names alphabetically. Signed-off-by: Daniel Wagner --- Documentation/meson.build | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/Documentation/meson.build b/Documentation/meson.build index 4dc551c95e..f800aabbc6 100644 --- a/Documentation/meson.build +++ b/Documentation/meson.build @@ -29,15 +29,14 @@ adoc_sources = [ 'nvme-endurance-event-agg-log', 'nvme-endurance-log', 'nvme-error-log', - 'nvme-fid-support-effects-log', - 'nvme-mi-cmd-support-effects-log', 'nvme-fdp-configs', - 'nvme-fdp-usage', - 'nvme-fdp-stats', 'nvme-fdp-events', + 'nvme-fdp-set-events', + 'nvme-fdp-stats', 'nvme-fdp-status', 'nvme-fdp-update', - 'nvme-fdp-set-events', + 'nvme-fdp-usage', + 'nvme-fid-support-effects-log', 'nvme-flush', 'nvme-format', 'nvme-fw-commit', @@ -57,6 +56,7 @@ adoc_sources = [ 'nvme-id-iocs', 'nvme-id-ns', 'nvme-id-nvmset', + 'nvme-inspur-nvme-vendor-log', 'nvme-intel-id-ctrl', 'nvme-intel-internal-log', 'nvme-intel-lat-stats', @@ -73,6 +73,7 @@ adoc_sources = [ 'nvme-list-ns', 'nvme-list-subsys', 'nvme-lockdown', + 'nvme-mi-cmd-support-effects-log', 'nvme-micron-clear-pcie-errors', 'nvme-micron-internal-log', 'nvme-micron-nand-stats', @@ -84,11 +85,9 @@ adoc_sources = [ 'nvme-netapp-smdevices', 'nvme-ns-descs', 'nvme-ns-rescan', + 'nvme-nvm-id-ctrl', 'nvme-nvme-mi-recv', 'nvme-nvme-mi-send', - 'nvme-nvm-id-ctrl', - 'nvme-ocp-latency-monitor-log', - 'nvme-ocp-smart-add-log', 'nvme-ocp-clear-fw-activate-history', 'nvme-ocp-clear-pcie-correctable-error-counters', 'nvme-ocp-device-capability-log', @@ -97,10 +96,12 @@ adoc_sources = [ 'nvme-ocp-get-dssd-async-event-config', 'nvme-ocp-get-dssd-power-state-feature', 'nvme-ocp-get-plp-health-check-interval', + 'nvme-ocp-latency-monitor-log', 'nvme-ocp-set-dssd-async-event-config', 'nvme-ocp-set-dssd-power-state-feature', 'nvme-ocp-set-plp-health-check-interval', 'nvme-ocp-set-telemetry-profile', + 'nvme-ocp-smart-add-log', 'nvme-ocp-telemetry-string-log-page', 'nvme-ocp-unsupported-reqs-log-pages', 'nvme-persistent-event-log', @@ -117,20 +118,20 @@ adoc_sources = [ 'nvme-rpmb', 'nvme-sanitize', 'nvme-sanitize-log', + 'nvme-seagate-clear-fw-activate-history', 'nvme-seagate-clear-pcie-correctable-errors', + 'nvme-seagate-cloud-SSD-plugin-version', 'nvme-seagate-get-ctrl-tele', 'nvme-seagate-get-host-tele', 'nvme-seagate-help', 'nvme-seagate-plugin-version', 'nvme-seagate-version', + 'nvme-seagate-vs-fw-activate-history', 'nvme-seagate-vs-internal-log', 'nvme-seagate-vs-log-page-sup', 'nvme-seagate-vs-pcie-stats', 'nvme-seagate-vs-smart-add-log', 'nvme-seagate-vs-temperature-stats', - 'nvme-seagate-cloud-SSD-plugin-version', - 'nvme-seagate-vs-fw-activate-history', - 'nvme-seagate-clear-fw-activate-history', 'nvme-security-recv', 'nvme-security-send', 'nvme-self-test-log', @@ -156,8 +157,8 @@ adoc_sources = [ 'nvme-wdc-clear-assert-dump', 'nvme-wdc-clear-fw-activate-history', 'nvme-wdc-clear-pcie-correctable-errors', - 'nvme-wdc-cloud-boot-SSD-version', 'nvme-wdc-cloud-SSD-plugin-version', + 'nvme-wdc-cloud-boot-SSD-version', 'nvme-wdc-drive-essentials', 'nvme-wdc-drive-log', 'nvme-wdc-drive-resize', @@ -201,7 +202,6 @@ adoc_sources = [ 'nvme-zns-zone-append', 'nvme-zns-zone-mgmt-recv', 'nvme-zns-zone-mgmt-send', - 'nvme-inspur-nvme-vendor-log', ] adoc_includes = [ From 0cfc91e51c57cec8cf21365440c83026c97a3834 Mon Sep 17 00:00:00 2001 From: Daniel Wagner Date: Thu, 4 Jul 2024 19:20:27 +0200 Subject: [PATCH 020/281] doc: fix tls-key --keyfile shorthand The shorthand for --keyfile is -f and not -k. Signed-off-by: Daniel Wagner --- Documentation/nvme-tls-key.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Documentation/nvme-tls-key.txt b/Documentation/nvme-tls-key.txt index 15942a409f..9f170a648b 100644 --- a/Documentation/nvme-tls-key.txt +++ b/Documentation/nvme-tls-key.txt @@ -41,7 +41,7 @@ OPTIONS Type of the key for resulting TLS key. Default is 'psk'. --k :: +-f :: --keyfile=:: File to read the keys from or write the keys to instead of stdin / stdout. From ab49163b6a417f34fb54cce2cc59c8cd167fb9a0 Mon Sep 17 00:00:00 2001 From: Daniel Wagner Date: Mon, 1 Jul 2024 11:24:12 +0200 Subject: [PATCH 021/281] doc: add tls-key --revoke documentation Add the --revoke option to the tls-key documentation. While at it, add examples how to use it. Signed-off-by: Daniel Wagner --- Documentation/meson.build | 1 + Documentation/nvme-tls-key.txt | 71 +++++++++++++++++++++++++++++++--- 2 files changed, 66 insertions(+), 6 deletions(-) diff --git a/Documentation/meson.build b/Documentation/meson.build index f800aabbc6..12abe8940c 100644 --- a/Documentation/meson.build +++ b/Documentation/meson.build @@ -144,6 +144,7 @@ adoc_sources = [ 'nvme-subsystem-reset', 'nvme-supported-log-pages', 'nvme-telemetry-log', + 'nvme-tls-key', 'nvme-toshiba-clear-pcie-correctable-errors', 'nvme-toshiba-vs-internal-log', 'nvme-toshiba-vs-smart-add-log', diff --git a/Documentation/nvme-tls-key.txt b/Documentation/nvme-tls-key.txt index 9f170a648b..e1819c74b2 100644 --- a/Documentation/nvme-tls-key.txt +++ b/Documentation/nvme-tls-key.txt @@ -1,5 +1,5 @@ nvme-tls-key(1) -====================== +=============== NAME ---- @@ -12,13 +12,14 @@ SYNOPSIS [--keytype= | -t ] [--keyfile= | -f ] [--import | -i] [--export | -e] + [--revoke=| -r ] [--verbose | -v] DESCRIPTION ----------- -Import or export NVMe TLS pre-shared keys (PSKs) from the -system keystore. When the '--export' option is given, all -NVMe TLS PSKs are exported in the form +Import, export or remove NVMe TLS pre-shared keys (PSKs) from the system +keystore. When the '--export' option is given, all NVMe TLS PSKs are +exported in the form @@ -54,7 +55,11 @@ OPTIONS -e:: --export:: Write the key data to the file specified by '--keyfile' - or stdou if not present. + or stdout if not present. + +-r :: +--revoke=:: + Revoke a key from a keyring. -v:: --verbose:: @@ -62,7 +67,61 @@ OPTIONS EXAMPLES -------- -No Examples + +* Create a new TLS key and insert it directly into the .nvme keyring: ++ +------------ +# nvme gen-tls-key -i -n hostnqn0 -c subsys0 +NVMeTLSkey-1:01:/b9tVz2OXJVISnoFgrPAygyS86XYJWkAapQeULns6PMpM8wv: +Inserted TLS key 26b3260e +------------ + +* Export previously created key from the kernel keyring and store it into a file ++ +------------ +# nvme tls-key -e -f nvme-tls-keys.txt +------------ + +* Export/list all keys from the .nvme keyring using nvme and keyctl ++ +------------ +# nvme tls-key --export +NVMe0R01 hostnqn0 subsys0 NVMeTLSkey-1:01:/b9tVz2OXJVISnoFgrPAygyS86XYJWkAapQeULns6PMpM8wv: + +# keyctl show +Session Keyring + 573249525 --alswrv 0 0 keyring: _ses + 353599402 --alswrv 0 65534 \_ keyring: _uid.0 + 475911922 ---lswrv 0 0 \_ keyring: .nvme + 649274894 --als-rv 0 0 \_ psk: NVMe0R01 hostnqn0 subsys0 +------------ + +* Revoke a key using the description and verifying with +keyctl the operation ++ +------------ +# nvme tls-key --revoke="NVMe0R01 hostnqn0 subsys0" + +# keyctl show +Session Keyring + 573249525 --alswrv 0 0 keyring: _ses + 353599402 --alswrv 0 65534 \_ keyring: _uid.0 + 475911922 ---lswrv 0 0 \_ keyring: .nvme +649274894: key inaccessible (Key has been revoked) +------------ + +* Import back previously generated key from file and verify with keyctl ++ +------------ +# nvme tls-key --import -f nvme-tls-keys.txt + +# keyctl show +Session Keyring + 573249525 --alswrv 0 0 keyring: _ses + 353599402 --alswrv 0 65534 \_ keyring: _uid.0 + 475911922 ---lswrv 0 0 \_ keyring: .nvme + 734343968 --als-rv 0 0 \_ psk: NVMe0R01 hostnqn0 subsys0 +------------ NVME ---- From 5249914b4bf6377cda2a807ceacbe96307e16375 Mon Sep 17 00:00:00 2001 From: Daniel Wagner Date: Thu, 4 Jul 2024 19:17:46 +0200 Subject: [PATCH 022/281] completion: add support for tls-key The tls-key command is missing support for the zsh and bash completion. Signed-off-by: Daniel Wagner --- completions/_nvme | 27 +++++++++++++++++++++++++-- completions/bash-nvme-completion.sh | 7 ++++++- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/completions/_nvme b/completions/_nvme index 33d30ebed4..f7eb40dbbd 100644 --- a/completions/_nvme +++ b/completions/_nvme @@ -97,6 +97,7 @@ _nvme () { 'disconnect-all:disconnect from all connected NVMeoF subsystems' 'gen-hostnqn:generate a host NVMe Qualified Name' 'show-hostnqn:show the host NQN configured for the system' + 'tls-key:manipulate NVMeoF TLS PSK' 'dir-receive:read directive parameters of the specified directive type' 'dir-send:set directive parameters of the specified directive type' 'virt-mgmt:submit a Virtualization Management command' @@ -2194,6 +2195,28 @@ _nvme () { _arguments '*:: :->subcmds' _describe -t commands "nvme show-hostnqn options" _show_hostnqn ;; + (tls-key) + local _tls_key + _tls_key=( + --verbose':show infos verbosely' + -v':alias of --verbose' + --output-format=':Output format: normal|json|binary' + -o':alias for --output-format' + --keyring=':name for keyring' + -r':alias for --keyring' + --keytype=':type for the key' + -t':alias for --keytype' + --keyfile='filename for reading/writing keys from' + -f':alias for --keyfile' + --import'import all keys into keyring' + -i':alias for --import' + --export'export all keys from keyring' + -e':alias for --export' + --revoke='revoke key from keyring' + -r':alias for --revoke' + ) + _arguments '*:: :->subcmds' + _describe -t commands "nvme tls-key options" _tls_key (dir-receive) local _dir_receive _dir_receive=( @@ -2546,8 +2569,8 @@ _nvme () { effects-log endurance-log device-self-test self-test-log set-property get-property write-zeroes write-uncor verify sanitize sanitize-log reset subsystem-reset ns-rescan get-lba-status dsm discover connect-all connect - dim disconnect disconnect-all gen-hostnqn show-hostnqn dir-receive dir-send - virt-mgmt rpmb version ocp solidigm + dim disconnect disconnect-all gen-hostnqn show-hostnqn tls-key dir-receive + dir-send virt-mgmt rpmb version ocp solidigm ) _arguments '*:: :->subcmds' _describe -t commands "help: infos on a specific nvme command, or provide no option to see a synopsis of all nvme commands" _h diff --git a/completions/bash-nvme-completion.sh b/completions/bash-nvme-completion.sh index e22609b8a0..00dcb307af 100644 --- a/completions/bash-nvme-completion.sh +++ b/completions/bash-nvme-completion.sh @@ -427,6 +427,11 @@ nvme_list_opts () { "show-hostnqn") opts+=$NO_OPTS ;; + "tls-key") + opts+=" --output-format= -o --verbose -v --keyring= -k \ + --keytype= -k --keyfile= -f --import -i \ + --export -e --revoke= -r" + ;; "dir-receive") opts+=" --namespace-id= -n --data-len= -l --raw-binary -b \ --dir-type= -D --dir-spec= -S --dir-oper= -O \ @@ -1603,7 +1608,7 @@ _nvme_subcmds () { sanitize sanitize-log reset subsystem-reset \ ns-rescan show-regs discover connect-all \ connect disconnect disconnect-all gen-hostnqn \ - show-hostnqn dir-receive dir-send virt-mgmt \ + show-hostnqn tls-key dir-receive dir-send virt-mgmt \ rpmb boot-part-log fid-support-effects-log \ supported-log-pages lockdown media-unit-stat-log \ supported-cap-config-log dim show-topology list-endgrp \ From c95f96e0dceb019113fc411ed4b5c9f2164becf3 Mon Sep 17 00:00:00 2001 From: Tokunori Ikegami Date: Fri, 5 Jul 2024 01:55:45 +0900 Subject: [PATCH 023/281] nvme-print: check locale to use temperatures in degrees fahrenheit Delete the fahrenheit option separately. Signed-off-by: Tokunori Ikegami --- nvme-print-stdout.c | 5 ++--- nvme-print.c | 40 +++++++++++++++++++++++++++++++++++++++- nvme-print.h | 2 +- 3 files changed, 42 insertions(+), 5 deletions(-) diff --git a/nvme-print-stdout.c b/nvme-print-stdout.c index 4204a1d585..a14239b986 100644 --- a/nvme-print-stdout.c +++ b/nvme-print-stdout.c @@ -3883,7 +3883,6 @@ static void stdout_smart_log(struct nvme_smart_log *smart, unsigned int nsid, co __u16 temperature = smart->temperature[1] << 8 | smart->temperature[0]; int i; bool human = stdout_print_ops.flags & VERBOSE; - bool fahrenheit = !!(stdout_print_ops.flags & FAHRENHEIT); printf("Smart Log for NVME device:%s namespace-id:%x\n", devname, nsid); printf("critical_warning : %#x\n", smart->critical_warning); @@ -3904,7 +3903,7 @@ static void stdout_smart_log(struct nvme_smart_log *smart, unsigned int nsid, co } printf("temperature : %s (%u K)\n", - nvme_degrees_string(temperature, fahrenheit), temperature); + nvme_degrees_string(temperature), temperature); printf("available_spare : %u%%\n", smart->avail_spare); printf("available_spare_threshold : %u%%\n", smart->spare_thresh); printf("percentage_used : %u%%\n", smart->percent_used); @@ -3941,7 +3940,7 @@ static void stdout_smart_log(struct nvme_smart_log *smart, unsigned int nsid, co if (!temperature) continue; printf("Temperature Sensor %d : %s (%u K)\n", i + 1, - nvme_degrees_string(temperature, fahrenheit), temperature); + nvme_degrees_string(temperature), temperature); } printf("Thermal Management T1 Trans Count : %u\n", diff --git a/nvme-print.c b/nvme-print.c index a3b8ddf34c..f2b9988a85 100644 --- a/nvme-print.c +++ b/nvme-print.c @@ -6,6 +6,7 @@ #include #include #include +#include #include "nvme.h" #include "libnvme.h" @@ -767,10 +768,47 @@ void nvme_show_endurance_log(struct nvme_endurance_group_log *endurance_log, nvme_print(endurance_log, flags, endurance_log, group_id, devname); } -const char *nvme_degrees_string(long t, bool fahrenheit) +static bool is_fahrenheit_country(const char *country) +{ + static const char * const countries[] = { + "AQ", "AS", "BS", "BZ", "CY", "FM", "GU", "KN", "KY", "LR", + "MH", "MP", "MS", "PR", "PW", "TC", "US", "VG", "VI" + }; + int i; + + for (i = 0; i < ARRAY_SIZE(countries); i++) { + if (!strcmp(country, countries[i])) + return true; + } + + return false; +} + +static bool is_temperature_fahrenheit(void) +{ + const char *locale, *underscore; + char country[3] = { 0 }; + + setlocale(LC_ALL, ""); + locale = setlocale(LC_ALL, NULL); + + if (!locale || strlen(locale) < 2) + return false; + + underscore = strchr(locale, '_'); + if (underscore && strlen(underscore) >= 3) + locale = underscore + 1; + + memcpy(country, locale, 2); + + return is_fahrenheit_country(country); +} + +const char *nvme_degrees_string(long t) { static char str[STR_LEN]; long val = kelvin_to_celsius(t); + bool fahrenheit = is_temperature_fahrenheit(); if (fahrenheit) val = kelvin_to_fahrenheit(t); diff --git a/nvme-print.h b/nvme-print.h index 11928af60e..a3943ccd98 100644 --- a/nvme-print.h +++ b/nvme-print.h @@ -322,5 +322,5 @@ void nvme_show_finish(void); bool nvme_is_fabrics_reg(int offset); bool nvme_registers_cmbloc_support(__u32 cmbsz); bool nvme_registers_pmrctl_ready(__u32 pmrctl); -const char *nvme_degrees_string(long t, bool fahrenheit); +const char *nvme_degrees_string(long t); #endif /* NVME_PRINT_H */ From 41deae7550141ed79f3949d52d88c9166d194f90 Mon Sep 17 00:00:00 2001 From: Tokunori Ikegami Date: Sat, 6 Jul 2024 00:52:48 +0900 Subject: [PATCH 024/281] nvme: delete smart-log command fahrenheit option Used locale for the fahrenheit temperature instead. Signed-off-by: Tokunori Ikegami --- Documentation/nvme-smart-log.txt | 6 +----- completions/_nvme | 2 -- completions/bash-nvme-completion.sh | 2 +- nvme.c | 8 +------- nvme.h | 1 - 5 files changed, 3 insertions(+), 16 deletions(-) diff --git a/Documentation/nvme-smart-log.txt b/Documentation/nvme-smart-log.txt index 659ed222a8..c08f523cb2 100644 --- a/Documentation/nvme-smart-log.txt +++ b/Documentation/nvme-smart-log.txt @@ -9,7 +9,7 @@ SYNOPSIS -------- [verse] 'nvme smart-log' [--namespace-id= | -n ] - [--raw-binary | -b] [--fahrenheit | -f] + [--raw-binary | -b] [--output-format= | -o ] [--verbose | -v] DESCRIPTION @@ -38,10 +38,6 @@ OPTIONS --raw-binary:: Print the raw SMART log buffer to stdout. --f:: ---fahrenheit:: - Print the temperatures in degrees fahrenheit. - -o :: --output-format=:: Set the reporting format to 'normal', 'json' or 'binary'. Only one diff --git a/completions/_nvme b/completions/_nvme index f7eb40dbbd..96ffd3faa5 100644 --- a/completions/_nvme +++ b/completions/_nvme @@ -999,8 +999,6 @@ _nvme () { -b':alias to --raw-binary' --verbose':show infos verbosely' -v':alias to --verbose' - --fahrenheit'show temperatures in degrees fahrenheit' - -f':alias to --fahrenheit' ) _arguments '*:: :->subcmds' _describe -t commands "nvme smart-log options" _smartlog diff --git a/completions/bash-nvme-completion.sh b/completions/bash-nvme-completion.sh index 00dcb307af..682c0b7da1 100644 --- a/completions/bash-nvme-completion.sh +++ b/completions/bash-nvme-completion.sh @@ -149,7 +149,7 @@ nvme_list_opts () { ;; "smart-log") opts+=" --namespace-id= -n --raw-binary -b \ - --output-format= -o --verbose -v --fahrenheit -f" + --output-format= -o --verbose -v" ;; "ana-log") opts+=" --output-format -o" diff --git a/nvme.c b/nvme.c index f3288cf005..0dbc209056 100644 --- a/nvme.c +++ b/nvme.c @@ -216,7 +216,6 @@ static const char *doper = "directive operation"; static const char *dry = "show command instead of sending"; static const char *dspec_w_dtype = "directive specification associated with directive type"; static const char *dtype = "directive type"; -static const char *fahrenheit = "show temperatures in degrees fahrenheit"; static const char *force_unit_access = "force device to commit data before command completes"; static const char *human_readable_directive = "show directive in readable format"; static const char *human_readable_identify = "show identify in readable format"; @@ -550,7 +549,6 @@ static int get_smart_log(int argc, char **argv, struct command *cmd, struct plug __u32 namespace_id; bool raw_binary; bool human_readable; - bool fahrenheit; }; struct config cfg = { @@ -562,8 +560,7 @@ static int get_smart_log(int argc, char **argv, struct command *cmd, struct plug NVME_ARGS(opts, OPT_UINT("namespace-id", 'n', &cfg.namespace_id, namespace), OPT_FLAG("raw-binary", 'b', &cfg.raw_binary, raw_output), - OPT_FLAG("human-readable", 'H', &cfg.human_readable, human_readable_info), - OPT_FLAG("fahrenheit", 'f', &cfg.fahrenheit, fahrenheit)); + OPT_FLAG("human-readable", 'H', &cfg.human_readable, human_readable_info)); err = parse_and_open(&dev, argc, argv, desc, opts); if (err) @@ -581,9 +578,6 @@ static int get_smart_log(int argc, char **argv, struct command *cmd, struct plug if (cfg.human_readable) flags |= VERBOSE; - if (cfg.fahrenheit) - flags |= FAHRENHEIT; - smart_log = nvme_alloc(sizeof(*smart_log)); if (!smart_log) return -ENOMEM; diff --git a/nvme.h b/nvme.h index 051fdf0030..e769c9af02 100644 --- a/nvme.h +++ b/nvme.h @@ -38,7 +38,6 @@ enum nvme_print_flags { JSON = 1 << 1, /* display in json format */ VS = 1 << 2, /* hex dump vendor specific data areas */ BINARY = 1 << 3, /* binary dump raw bytes */ - FAHRENHEIT = 1 << 4, /* show temperatures in degrees fahrenheit */ }; typedef uint32_t nvme_print_flags_t; From 7a34cab350ca203fc43dadb0ab4ee56c8c490fa2 Mon Sep 17 00:00:00 2001 From: Tokunori Ikegami Date: Sat, 6 Jul 2024 01:01:15 +0900 Subject: [PATCH 025/281] nvme: add get-feature and id-ctrl commands fahrenheit outputs Show temperatures in degrees fahrenheit by the option. Signed-off-by: Tokunori Ikegami --- nvme-print-stdout.c | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/nvme-print-stdout.c b/nvme-print-stdout.c index a14239b986..69bff14ab7 100644 --- a/nvme-print-stdout.c +++ b/nvme-print-stdout.c @@ -1968,15 +1968,15 @@ static void stdout_id_ctrl_apsta(__u8 apsta) static void stdout_id_ctrl_wctemp(__le16 wctemp) { - printf(" [15:0] : %ld °C (%u K)\tWarning Composite Temperature Threshold (WCTEMP)\n", - kelvin_to_celsius(le16_to_cpu(wctemp)), le16_to_cpu(wctemp)); + printf(" [15:0] : %s (%u K)\tWarning Composite Temperature Threshold (WCTEMP)\n", + nvme_degrees_string(le16_to_cpu(wctemp)), le16_to_cpu(wctemp)); printf("\n"); } static void stdout_id_ctrl_cctemp(__le16 cctemp) { - printf(" [15:0] : %ld °C (%u K)\tCritical Composite Temperature Threshold (CCTEMP)\n", - kelvin_to_celsius(le16_to_cpu(cctemp)), le16_to_cpu(cctemp)); + printf(" [15:0] : %s (%u K)\tCritical Composite Temperature Threshold (CCTEMP)\n", + nvme_degrees_string(le16_to_cpu(cctemp)), le16_to_cpu(cctemp)); printf("\n"); } @@ -2025,15 +2025,15 @@ static void stdout_id_ctrl_hctma(__le16 ctrl_hctma) static void stdout_id_ctrl_mntmt(__le16 mntmt) { - printf(" [15:0] : %ld °C (%u K)\tMinimum Thermal Management Temperature (MNTMT)\n", - kelvin_to_celsius(le16_to_cpu(mntmt)), le16_to_cpu(mntmt)); + printf(" [15:0] : %s (%u K)\tMinimum Thermal Management Temperature (MNTMT)\n", + nvme_degrees_string(le16_to_cpu(mntmt)), le16_to_cpu(mntmt)); printf("\n"); } static void stdout_id_ctrl_mxtmt(__le16 mxtmt) { - printf(" [15:0] : %ld °C (%u K)\tMaximum Thermal Management Temperature (MXTMT)\n", - kelvin_to_celsius(le16_to_cpu(mxtmt)), le16_to_cpu(mxtmt)); + printf(" [15:0] : %s (%u K)\tMaximum Thermal Management Temperature (MXTMT)\n", + nvme_degrees_string(le16_to_cpu(mxtmt)), le16_to_cpu(mxtmt)); printf("\n"); } @@ -4452,8 +4452,8 @@ static void stdout_feature_show_fields(enum nvme_features_id fid, field = (result & 0x000f0000) >> 16; printf("\tThreshold Temperature Select (TMPSEL): %u - %s\n", field, nvme_feature_temp_sel_to_string(field)); - printf("\tTemperature Threshold (TMPTH): %ld °C (%u K)\n", - kelvin_to_celsius(result & 0x0000ffff), result & 0x0000ffff); + printf("\tTemperature Threshold (TMPTH): %s (%u K)\n", + nvme_degrees_string(result & 0x0000ffff), result & 0x0000ffff); break; case NVME_FEAT_FID_ERR_RECOVERY: printf("\tDeallocated or Unwritten Logical Block Error Enable (DULBE): %s\n", @@ -4518,10 +4518,10 @@ static void stdout_feature_show_fields(enum nvme_features_id fid, printf("\tKeep Alive Timeout (KATO) in milliseconds: %u\n", result); break; case NVME_FEAT_FID_HCTM: - printf("\tThermal Management Temperature 1 (TMT1) : %u K (%ld °C)\n", - result >> 16, kelvin_to_celsius(result >> 16)); - printf("\tThermal Management Temperature 2 (TMT2) : %u K (%ld °C)\n", - result & 0x0000ffff, kelvin_to_celsius(result & 0x0000ffff)); + printf("\tThermal Management Temperature 1 (TMT1) : %u K (%s)\n", + result >> 16, nvme_degrees_string(result >> 16)); + printf("\tThermal Management Temperature 2 (TMT2) : %u K (%s)\n", + result & 0x0000ffff, nvme_degrees_string(result & 0x0000ffff)); break; case NVME_FEAT_FID_NOPSC: printf("\tNon-Operational Power State Permissive Mode Enable (NOPPME): %s\n", From c67e0e7ff6c1d1ab7a8fe2e7c94e405cc495bbb3 Mon Sep 17 00:00:00 2001 From: Tokunori Ikegami Date: Sun, 30 Jun 2024 15:56:27 +0900 Subject: [PATCH 026/281] nvme-print-json: add get-feature command fahrenheit temperature output Add temperature threshold and host controlled thermal management outputs. Signed-off-by: Tokunori Ikegami --- nvme-print-json.c | 6 +++--- nvme-print.c | 6 ++++-- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/nvme-print-json.c b/nvme-print-json.c index ec04f79b12..414af8e699 100644 --- a/nvme-print-json.c +++ b/nvme-print-json.c @@ -3297,7 +3297,7 @@ static void json_feature_show_fields_temp_thresh(struct json_object *r, unsigned obj_add_uint(r, "Threshold Temperature Select (TMPSEL)", field); obj_add_str(r, "TMPSEL description", nvme_feature_temp_sel_to_string(field)); - sprintf(json_str, "%ld Celsius", kelvin_to_celsius(result & 0xffff)); + sprintf(json_str, "%s", nvme_degrees_string(result & 0xffff)); obj_add_str(r, "Temperature Threshold (TMPTH)", json_str); sprintf(json_str, "%u K", result & 0xffff); @@ -3467,13 +3467,13 @@ static void json_feature_show_fields_hctm(struct json_object *r, unsigned int re sprintf(json_str, "%u K", result >> 16); obj_add_str(r, "Thermal Management Temperature 1 (TMT1)", json_str); - sprintf(json_str, "%ld Celsius", kelvin_to_celsius(result >> 16)); + sprintf(json_str, "%s", nvme_degrees_string(result >> 16)); obj_add_str(r, "TMT1 celsius", json_str); sprintf(json_str, "%u K", result & 0xffff); obj_add_str(r, "Thermal Management Temperature 2", json_str); - sprintf(json_str, "%ld Celsius", kelvin_to_celsius(result & 0xffff)); + sprintf(json_str, "%s", nvme_degrees_string(result & 0xffff)); obj_add_str(r, "TMT2 celsius", json_str); } diff --git a/nvme-print.c b/nvme-print.c index f2b9988a85..3165ab92bc 100644 --- a/nvme-print.c +++ b/nvme-print.c @@ -813,8 +813,10 @@ const char *nvme_degrees_string(long t) if (fahrenheit) val = kelvin_to_fahrenheit(t); - sprintf(str, "%ld °%s", val, fahrenheit ? "F" : "C"); - + if (nvme_is_output_format_json()) + sprintf(str, "%ld %s", val, fahrenheit ? "Fahrenheit" : "Celsius"); + else + sprintf(str, "%ld °%s", val, fahrenheit ? "F" : "C"); return str; } From 02c6260b09f6240e7a2360d2d7c2679f041f7a4b Mon Sep 17 00:00:00 2001 From: Vigneshwaran Saravanan/Vigneshwaran Saravanan Date: Thu, 4 Jul 2024 14:06:02 +0530 Subject: [PATCH 027/281] plugins/ocp: Update telemetry string log page (C9h) Take care the below failures for "telemetry-string-log". Resolved the json printing issue. Changed the Statistic Identifier, Event String, Vendor Unique, ASCII table offset and size calculation. Reviewed-by: Karthik Balan Reviewed-by: Arunpandian J Reviewed-by: Jayakanthan Rajendran Signed-off-by: Vigneshwaran Saravanan --- plugins/ocp/ocp-nvme.c | 309 ++++++++++++++++++++++++----------------- 1 file changed, 185 insertions(+), 124 deletions(-) diff --git a/plugins/ocp/ocp-nvme.c b/plugins/ocp/ocp-nvme.c index 8a3731d875..e9ebc40124 100644 --- a/plugins/ocp/ocp-nvme.c +++ b/plugins/ocp/ocp-nvme.c @@ -2885,14 +2885,13 @@ static int ocp_print_C9_log_normal(struct telemetry_str_log_format *log_data,__u __le64 vu_eve_index = (log_data->vu_eve_st_sz * 4) / 16; __le64 ascii_table_index = (log_data->asctsz * 4); //Calculating the offset for dynamic fields. - __le64 stat_id_str_table_ofst = C9_TELEMETRY_STR_LOG_SIST_OFST + (log_data->sitsz * 4); - __le64 event_str_table_ofst = stat_id_str_table_ofst + (log_data->estsz * 4); - __le64 vu_event_str_table_ofst = event_str_table_ofst + (log_data->vu_eve_st_sz * 4); - __le64 ascii_table_ofst = vu_event_str_table_ofst + (log_data->asctsz * 4); + __le64 stat_id_str_table_ofst = log_data->sits * 4; + __le64 event_str_table_ofst = log_data->ests * 4; + __le64 vu_event_str_table_ofst = log_data->vu_eve_sts * 4; + __le64 ascii_table_ofst = log_data->ascts * 4; struct statistics_id_str_table_entry stat_id_str_table_arr[stat_id_index]; struct event_id_str_table_entry event_id_str_table_arr[eve_id_index]; struct vu_event_id_str_table_entry vu_event_id_str_table_arr[vu_eve_index]; - __u8 ascii_table_info_arr[ascii_table_index]; int j; printf(" Log Page Version : 0x%x\n", log_data->log_page_version); @@ -2925,172 +2924,180 @@ static int ocp_print_C9_log_normal(struct telemetry_str_log_format *log_data,__u printf(" FIFO 1 ASCII String\n"); printf(" index value ascii_val\n"); - for (j = 0; j < 16; j++){ + for (j = 0; j < 16; j++) printf(" %d %d %c \n", j, log_data->fifo1[j], log_data->fifo1[j]); - } printf(" FIFO 2 ASCII String\n"); printf(" index value ascii_val\n"); - for (j = 0; j < 16; j++){ + for (j = 0; j < 16; j++) printf(" %d %d %c \n", j, log_data->fifo2[j], log_data->fifo2[j]); - } printf(" FIFO 3 ASCII String\n"); printf(" index value ascii_val\n"); - for (j = 0; j < 16; j++){ + for (j = 0; j < 16; j++) printf(" %d %d %c \n", j, log_data->fifo3[j], log_data->fifo3[j]); - } printf(" FIFO 4 ASCII String\n"); printf(" index value ascii_val\n"); - for (j = 0; j < 16; j++){ - + for (j = 0; j < 16; j++) printf(" %d %d %c \n", j, log_data->fifo4[j], log_data->fifo4[j]); - } printf(" FIFO 5 ASCII String\n"); printf(" index value ascii_val\n"); - for (j = 0; j < 16; j++){ + for (j = 0; j < 16; j++) printf(" %d %d %c \n", j, log_data->fifo5[j], log_data->fifo5[j]); - } printf(" FIFO 6 ASCII String\n"); printf(" index value ascii_val\n"); - for (j = 0; j < 16; j++){ + for (j = 0; j < 16; j++) printf(" %d %d %c \n", j, log_data->fifo6[j], log_data->fifo6[j]); - } printf(" FIFO 7 ASCII String\n"); printf(" index value ascii_val\n"); - for (j = 0; j < 16; j++){ + for (j = 0; j < 16; j++) printf(" %d %d %c \n", j, log_data->fifo7[j], log_data->fifo7[j]); - } printf(" FIFO 8 ASCII String\n"); printf(" index value ascii_val\n"); - for (j = 0; j < 16; j++){ - printf("index value ascii_val"); + for (j = 0; j < 16; j++) printf(" %d %d %c \n", j, log_data->fifo8[j], log_data->fifo8[j]); - } printf(" FIFO 9 ASCII String\n"); printf(" index value ascii_val\n"); - for (j = 0; j < 16; j++){ + for (j = 0; j < 16; j++) printf(" %d %d %c \n", j, log_data->fifo9[j], log_data->fifo9[j]); - } printf(" FIFO 10 ASCII String\n"); printf(" index value ascii_val\n"); - for (j = 0; j < 16; j++){ + for (j = 0; j < 16; j++) printf(" %d %d %c \n", j, log_data->fifo10[j], log_data->fifo10[j]); - } printf(" FIFO 11 ASCII String\n"); printf(" index value ascii_val\n"); - for (j = 0; j < 16; j++){ + for (j = 0; j < 16; j++) printf(" %d %d %c \n", j, log_data->fifo11[j], log_data->fifo11[j]); - } printf(" FIFO 12 ASCII String\n"); printf(" index value ascii_val\n"); - for (j = 0; j < 16; j++){ + for (j = 0; j < 16; j++) printf(" %d %d %c \n", j, log_data->fifo12[j], log_data->fifo12[j]); - } printf(" FIFO 13 ASCII String\n"); printf(" index value ascii_val\n"); - for (j = 0; j < 16; j++){ + for (j = 0; j < 16; j++) printf(" %d %d %c \n", j, log_data->fifo13[j], log_data->fifo13[j]); - } printf(" FIFO 14 ASCII String\n"); printf(" index value ascii_val\n"); - for (j = 0; j < 16; j++){ + for (j = 0; j < 16; j++) printf(" %d %d %c \n", j, log_data->fifo14[j], log_data->fifo14[j]); - } printf(" FIFO 15 ASCII String\n"); printf(" index value ascii_val\n"); - for (j = 0; j < 16; j++){ + for (j = 0; j < 16; j++) printf(" %d %d %c \n", j, log_data->fifo15[j], log_data->fifo16[j]); - } printf(" FIFO 16 ASCII String\n"); printf(" index value ascii_val\n"); - for (j = 0; j < 16; j++){ + for (j = 0; j < 16; j++) printf(" %d %d %c \n", j, log_data->fifo16[j], log_data->fifo16[j]); - } printf(" Reserved : "); for (j = 0; j < 48; j++) printf("%d", log_data->reserved3[j]); printf("\n"); - memcpy(stat_id_str_table_arr, (__u8*)log_data_buf + stat_id_str_table_ofst, (log_data->sitsz * 4)); - memcpy(event_id_str_table_arr, (__u8*)log_data_buf + event_str_table_ofst, (log_data->estsz * 4)); - memcpy(vu_event_id_str_table_arr, (__u8*)log_data_buf + vu_event_str_table_ofst, (log_data->vu_eve_st_sz * 4)); - memcpy(ascii_table_info_arr, (__u8*)log_data_buf + ascii_table_ofst, (log_data->asctsz * 4)); - printf(" Statistics Identifier String Table\n"); - for (j = 0; j < stat_id_index; j++){ - printf(" Vendor Specific Statistic Identifier : 0x%x\n",le16_to_cpu(stat_id_str_table_arr[j].vs_si)); - printf(" Reserved : 0x%d",stat_id_str_table_arr[j].reserved1); - printf(" ASCII ID Length : 0x%x\n",stat_id_str_table_arr[j].ascii_id_len); - printf(" ASCII ID offset : 0x%lx\n",le64_to_cpu(stat_id_str_table_arr[j].ascii_id_ofst)); - printf(" Reserved : 0x%d\n",stat_id_str_table_arr[j].reserved2); + if (log_data->sitsz != 0) { + memcpy(stat_id_str_table_arr, + (__u8 *)log_data_buf + stat_id_str_table_ofst, + (log_data->sitsz * 4)); + printf(" Statistics Identifier String Table\n"); + for (j = 0; j < stat_id_index; j++) { + printf(" Vendor Specific Statistic Identifier : 0x%x\n", + le16_to_cpu(stat_id_str_table_arr[j].vs_si)); + printf(" Reserved : 0x%x\n", + stat_id_str_table_arr[j].reserved1); + printf(" ASCII ID Length : 0x%x\n", + stat_id_str_table_arr[j].ascii_id_len); + printf(" ASCII ID offset : 0x%lx\n", + le64_to_cpu(stat_id_str_table_arr[j].ascii_id_ofst)); + printf(" Reserved : 0x%x\n", + stat_id_str_table_arr[j].reserved2); + } } - printf(" Event Identifier String Table Entry\n"); - for (j = 0; j < eve_id_index; j++){ - printf(" Debug Event Class : 0x%x\n",event_id_str_table_arr[j].deb_eve_class); - printf(" Event Identifier : 0x%x\n",le16_to_cpu(event_id_str_table_arr[j].ei)); - printf(" ASCII ID Length : 0x%x\n",event_id_str_table_arr[j].ascii_id_len); - printf(" ASCII ID offset : 0x%lx\n",le64_to_cpu(event_id_str_table_arr[j].ascii_id_ofst)); - printf(" Reserved : 0x%d\n",event_id_str_table_arr[j].reserved2); + if (log_data->estsz != 0) { + memcpy(event_id_str_table_arr, (__u8 *)log_data_buf + + event_str_table_ofst, (log_data->estsz * 4)); + printf(" Event Identifier String Table Entry\n"); + for (j = 0; j < eve_id_index; j++) { + printf(" Debug Event Class : 0x%x\n", + event_id_str_table_arr[j].deb_eve_class); + printf(" Event Identifier : 0x%x\n", + le16_to_cpu(event_id_str_table_arr[j].ei)); + printf(" ASCII ID Length : 0x%x\n", + event_id_str_table_arr[j].ascii_id_len); + printf(" ASCII ID offset : 0x%lx\n", + le64_to_cpu(event_id_str_table_arr[j].ascii_id_ofst)); + printf(" Reserved : 0x%x\n", + event_id_str_table_arr[j].reserved2); + + } } - printf(" VU Event Identifier String Table Entry\n"); - for (j = 0; j < vu_eve_index; j++){ - printf(" Debug Event Class : 0x%x\n",vu_event_id_str_table_arr[j].deb_eve_class); - printf(" VU Event Identifier : 0x%x\n",le16_to_cpu(vu_event_id_str_table_arr[j].vu_ei)); - printf(" ASCII ID Length : 0x%x\n",vu_event_id_str_table_arr[j].ascii_id_len); - printf(" ASCII ID offset : 0x%lx\n",le64_to_cpu(vu_event_id_str_table_arr[j].ascii_id_ofst)); - printf(" Reserved : 0x%d\n",vu_event_id_str_table_arr[j].reserved); + if (log_data->vu_eve_st_sz != 0) { + memcpy(vu_event_id_str_table_arr, (__u8 *)log_data_buf + + vu_event_str_table_ofst, (log_data->vu_eve_st_sz * 4)); + printf(" VU Event Identifier String Table Entry\n"); + for (j = 0; j < vu_eve_index; j++) { + printf(" Debug Event Class : 0x%x\n", + vu_event_id_str_table_arr[j].deb_eve_class); + printf(" VU Event Identifier : 0x%x\n", + le16_to_cpu(vu_event_id_str_table_arr[j].vu_ei)); + printf(" ASCII ID Length : 0x%x\n", + vu_event_id_str_table_arr[j].ascii_id_len); + printf(" ASCII ID offset : 0x%lx\n", + le64_to_cpu(vu_event_id_str_table_arr[j].ascii_id_ofst)); + printf(" Reserved : 0x%x\n", + vu_event_id_str_table_arr[j].reserved); + } } - printf(" ASCII Table\n"); - printf(" Byte Data_Byte ASCII_Character\n"); - for (j = 0; j < ascii_table_index; j++){ - printf(" %lld 0x%x %c \n",ascii_table_ofst+j,ascii_table_info_arr[j],ascii_table_info_arr[j]); + if (log_data->asctsz != 0) { + printf(" ASCII Table\n"); + printf(" Byte Data_Byte ASCII_Character\n"); + for (j = 0; j < ascii_table_index; j++) + printf(" %lld %d %c\n", + ascii_table_ofst+j, log_data_buf[ascii_table_ofst + j], + (char)log_data_buf[ascii_table_ofst + j]); } + return 0; } static int ocp_print_C9_log_json(struct telemetry_str_log_format *log_data,__u8 *log_data_buf) { struct json_object *root = json_create_object(); - struct json_object *stat_table = json_create_object(); - struct json_object *eve_table = json_create_object(); - struct json_object *vu_eve_table = json_create_object(); - struct json_object *entry = json_create_object(); char res_arr[48]; char *res = res_arr; char guid_buf[C9_GUID_LENGTH]; char *guid = guid_buf; char fifo_arr[16]; char *fifo = fifo_arr; + char buf[128]; //calculating the index value for array __le64 stat_id_index = (log_data->sitsz * 4) / 16; __le64 eve_id_index = (log_data->estsz * 4) / 16; __le64 vu_eve_index = (log_data->vu_eve_st_sz * 4) / 16; __le64 ascii_table_index = (log_data->asctsz * 4); //Calculating the offset for dynamic fields. - __le64 stat_id_str_table_ofst = C9_TELEMETRY_STR_LOG_SIST_OFST + (log_data->sitsz * 4); - __le64 event_str_table_ofst = stat_id_str_table_ofst + (log_data->estsz * 4); - __le64 vu_event_str_table_ofst = event_str_table_ofst + (log_data->vu_eve_st_sz * 4); - __le64 ascii_table_ofst = vu_event_str_table_ofst + (log_data->asctsz * 4); + __le64 stat_id_str_table_ofst = log_data->sits * 4; + __le64 event_str_table_ofst = log_data->ests * 4; + __le64 vu_event_str_table_ofst = log_data->vu_eve_sts * 4; + __le64 ascii_table_ofst = log_data->ascts * 4; struct statistics_id_str_table_entry stat_id_str_table_arr[stat_id_index]; struct event_id_str_table_entry event_id_str_table_arr[eve_id_index]; struct vu_event_id_str_table_entry vu_event_id_str_table_arr[vu_eve_index]; @@ -3210,53 +3217,102 @@ static int ocp_print_C9_log_json(struct telemetry_str_log_format *log_data,__u8 for (j = 0; j < 48; j++) res += sprintf(res, "%d", log_data->reserved3[j]); json_object_add_value_string(root, "Reserved", res_arr); - - memcpy(stat_id_str_table_arr, (__u8*)log_data_buf + stat_id_str_table_ofst, (log_data->sitsz * 4)); - memcpy(event_id_str_table_arr, (__u8*)log_data_buf + event_str_table_ofst, (log_data->estsz * 4)); - memcpy(vu_event_id_str_table_arr, (__u8*)log_data_buf + vu_event_str_table_ofst, (log_data->vu_eve_st_sz * 4)); - memcpy(ascii_table_info_arr, (__u8*)log_data_buf + ascii_table_ofst, (log_data->asctsz * 4)); - - for (j = 0; j < stat_id_index; j++){ - json_object_add_value_int(entry, "Vendor Specific Statistic Identifier", le16_to_cpu(stat_id_str_table_arr[j].vs_si)); - json_object_add_value_int(entry, "Reserved", le64_to_cpu(stat_id_str_table_arr[j].reserved1)); - json_object_add_value_int(entry, "ASCII ID Length", le64_to_cpu(stat_id_str_table_arr[j].ascii_id_len)); - json_object_add_value_int(entry, "ASCII ID offset", le64_to_cpu(stat_id_str_table_arr[j].ascii_id_ofst)); - json_object_add_value_int(entry, "Reserved", le64_to_cpu(stat_id_str_table_arr[j].reserved2)); - json_array_add_value_object(stat_table, entry); - } - json_object_add_value_array(root, "Statistics Identifier String Table", stat_table); - - for (j = 0; j < eve_id_index; j++){ - json_object_add_value_int(entry, "Debug Event Class", le16_to_cpu(event_id_str_table_arr[j].deb_eve_class)); - json_object_add_value_int(entry, "Event Identifier", le16_to_cpu(event_id_str_table_arr[j].ei)); - json_object_add_value_int(entry, "ASCII ID Length", le64_to_cpu(event_id_str_table_arr[j].ascii_id_len)); - json_object_add_value_int(entry, "ASCII ID offset", le64_to_cpu(event_id_str_table_arr[j].ascii_id_ofst)); - json_object_add_value_int(entry, "Reserved", le64_to_cpu(event_id_str_table_arr[j].reserved2)); - json_array_add_value_object(eve_table, entry); - } - json_object_add_value_array(root, "Event Identifier String Table Entry", eve_table); - - for (j = 0; j < vu_eve_index; j++){ - json_object_add_value_int(entry, "Debug Event Class", le16_to_cpu(vu_event_id_str_table_arr[j].deb_eve_class)); - json_object_add_value_int(entry, "VU Event Identifier", le16_to_cpu(vu_event_id_str_table_arr[j].vu_ei)); - json_object_add_value_int(entry, "ASCII ID Length", le64_to_cpu(vu_event_id_str_table_arr[j].ascii_id_len)); - json_object_add_value_int(entry, "ASCII ID offset", le64_to_cpu(vu_event_id_str_table_arr[j].ascii_id_ofst)); - json_object_add_value_int(entry, "Reserved", le64_to_cpu(vu_event_id_str_table_arr[j].reserved)); - json_array_add_value_object(vu_eve_table, entry); - } - json_object_add_value_array(root, "VU Event Identifier String Table Entry", vu_eve_table); - - memset((void *)ascii, 0, ascii_table_index); - for (j = 0; j < ascii_table_index; j++) - ascii += sprintf(ascii, "%c", ascii_table_info_arr[j]); - json_object_add_value_string(root, "ASCII Table", ascii_buf); + + if (log_data->sitsz != 0) { + + memcpy(stat_id_str_table_arr, + (__u8 *)log_data_buf + stat_id_str_table_ofst, + (log_data->sitsz * 4)); + struct json_object *stat_table = json_create_object(); + + for (j = 0; j < stat_id_index; j++) { + struct json_object *entry = json_create_object(); + + json_object_add_value_uint(entry, "Vendor Specific Statistic Identifier", + le16_to_cpu(stat_id_str_table_arr[j].vs_si)); + json_object_add_value_uint(entry, "Reserved", + le64_to_cpu(stat_id_str_table_arr[j].reserved1)); + json_object_add_value_uint(entry, "ASCII ID Length", + le64_to_cpu(stat_id_str_table_arr[j].ascii_id_len)); + json_object_add_value_uint(entry, "ASCII ID offset", + le64_to_cpu(stat_id_str_table_arr[j].ascii_id_ofst)); + json_object_add_value_uint(entry, "Reserved2", + le64_to_cpu(stat_id_str_table_arr[j].reserved2)); + sprintf(buf, "Statistics Identifier String Table %d", j); + json_object_add_value_object(stat_table, buf, entry); + } + + json_object_add_value_object(root, + "Statistics Identifier String Table", stat_table); + } + + if (log_data->estsz != 0) { + struct json_object *eve_table = json_create_object(); + + memcpy(event_id_str_table_arr, + (__u8 *)log_data_buf + event_str_table_ofst, + (log_data->estsz * 4)); + for (j = 0; j < eve_id_index; j++) { + struct json_object *entry = json_create_object(); + + json_object_add_value_int(entry, "Debug Event Class", + le16_to_cpu(event_id_str_table_arr[j].deb_eve_class)); + json_object_add_value_int(entry, "Event Identifier", + le16_to_cpu(event_id_str_table_arr[j].ei)); + json_object_add_value_int(entry, "ASCII ID Length", + le64_to_cpu(event_id_str_table_arr[j].ascii_id_len)); + json_object_add_value_int(entry, "ASCII ID offset", + le64_to_cpu(event_id_str_table_arr[j].ascii_id_ofst)); + json_object_add_value_int(entry, "Reserved", + le64_to_cpu(event_id_str_table_arr[j].reserved2)); + sprintf(buf, "Event Identifier String Table Entry %d", j); + json_object_add_value_object(eve_table, buf, entry); + } + json_object_add_value_object(root, + "Event Identifier String Table Entry", + eve_table); + } + + if (log_data->vu_eve_st_sz != 0) { + struct json_object *vu_eve_table = json_create_object(); + + memcpy(vu_event_id_str_table_arr, + (__u8 *)log_data_buf + vu_event_str_table_ofst, + (log_data->vu_eve_st_sz * 4)); + for (j = 0; j < vu_eve_index; j++) { + struct json_object *entry = json_create_object(); + + json_object_add_value_int(entry, "Debug Event Class", + le16_to_cpu(vu_event_id_str_table_arr[j].deb_eve_class)); + json_object_add_value_int(entry, "VU Event Identifier", + le16_to_cpu(vu_event_id_str_table_arr[j].vu_ei)); + json_object_add_value_int(entry, "ASCII ID Length", + le64_to_cpu(vu_event_id_str_table_arr[j].ascii_id_len)); + json_object_add_value_int(entry, "ASCII ID offset", + le64_to_cpu(vu_event_id_str_table_arr[j].ascii_id_ofst)); + json_object_add_value_int(entry, "Reserved", + le64_to_cpu(vu_event_id_str_table_arr[j].reserved)); + sprintf(buf, "VU Event Identifier String Table Entry %d", j); + json_object_add_value_object(vu_eve_table, buf, entry); + } + json_object_add_value_object(root, + "VU Event Identifier String Table Entry", + vu_eve_table); + } + + if (log_data->asctsz != 0) { + memcpy(ascii_table_info_arr, + (__u8 *)log_data_buf + ascii_table_ofst, + (log_data->asctsz * 4)); + memset((void *)ascii, 0, ascii_table_index); + for (j = 0; j < ascii_table_index; j++) + ascii += sprintf(ascii, "%c", ascii_table_info_arr[j]); + json_object_add_value_string(root, "ASCII Table", ascii_buf); + } json_print_object(root, NULL); printf("\n"); json_free_object(root); - json_free_object(stat_table); - json_free_object(eve_table); - json_free_object(vu_eve_table); return 0; } @@ -3303,11 +3359,16 @@ static int get_c9_log_page(struct nvme_dev *dev, char *format) printf("ASCII Table Size = %lld\n",log_data->asctsz); //Calculating the offset for dynamic fields. - stat_id_str_table_ofst = C9_TELEMETRY_STR_LOG_SIST_OFST + (log_data->sitsz * 4); - event_str_table_ofst = stat_id_str_table_ofst + (log_data->estsz * 4); - vu_event_str_table_ofst = event_str_table_ofst + (log_data->vu_eve_st_sz * 4); - ascii_table_ofst = vu_event_str_table_ofst + (log_data->asctsz * 4); - total_log_page_sz = stat_id_str_table_ofst + event_str_table_ofst + vu_event_str_table_ofst + ascii_table_ofst; + + stat_id_str_table_ofst = log_data->sits * 4; + event_str_table_ofst = log_data->ests * 4; + vu_event_str_table_ofst = log_data->vu_eve_sts * 4; + ascii_table_ofst = log_data->ascts * 4; + total_log_page_sz = C9_TELEMETRY_STR_LOG_LEN + + (log_data->sitsz * 4) + (log_data->estsz * 4) + + (log_data->vu_eve_st_sz * 4) + (log_data->asctsz * 4); + + printf("stat_id_str_table_ofst = %lld\n",stat_id_str_table_ofst); printf("event_str_table_ofst = %lld\n",event_str_table_ofst); From 2531f65922923641f036a3ad35f3d811cccebe04 Mon Sep 17 00:00:00 2001 From: Tokunori Ikegami Date: Sat, 6 Jul 2024 20:35:25 +0900 Subject: [PATCH 028/281] nvme: use _cleanup_free_ type buffer for get-feature command Reduce the buffer free calls. Signed-off-by: Tokunori Ikegami --- nvme.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/nvme.c b/nvme.c index 0dbc209056..49d11e5e46 100644 --- a/nvme.c +++ b/nvme.c @@ -4642,8 +4642,8 @@ static int get_feature_id_changed(struct nvme_dev *dev, struct feat_cfg cfg, int err_def = 0; __u32 result; __u32 result_def; - void *buf = NULL; - void *buf_def = NULL; + _cleanup_free_ void *buf = NULL; + _cleanup_free_ void *buf_def = NULL; if (changed) cfg.sel = 0; @@ -4662,9 +4662,6 @@ static int get_feature_id_changed(struct nvme_dev *dev, struct feat_cfg cfg, (buf && buf_def && !strcmp(buf, buf_def))) get_feature_id_print(cfg, err, result, buf); - free(buf); - free(buf_def); - return err; } From 26c3026fd412d2fe1dacabb173b2d4e011327f43 Mon Sep 17 00:00:00 2001 From: Tokunori Ikegami Date: Sun, 7 Jul 2024 22:52:41 +0900 Subject: [PATCH 029/281] nvme: extern NVME_ARGS macro definition To use the macro by the plugins/ocp commands etc. Signed-off-by: Tokunori Ikegami --- nvme.c | 27 ++++----------------------- nvme.h | 22 ++++++++++++++++++++++ 2 files changed, 26 insertions(+), 23 deletions(-) diff --git a/nvme.c b/nvme.c index 49d11e5e46..70798a58f7 100644 --- a/nvme.c +++ b/nvme.c @@ -163,26 +163,6 @@ struct set_reg_config { __u32 pmrmscu; }; -struct nvme_config { - char *output_format; - int verbose; - __u32 timeout; -}; - -#define NVME_ARGS(n, ...) \ - struct argconfig_commandline_options n[] = { \ - OPT_INCR("verbose", 'v', &nvme_cfg.verbose, verbose), \ - OPT_FMT("output-format", 'o', &nvme_cfg.output_format, output_format), \ - ##__VA_ARGS__, \ - /* \ - * the ordering of the arguments matters, as the argument parser uses \ - * the first match, thus any command which defines -t shorthand will \ - * match first. \ - */ \ - OPT_UINT("timeout", 't', &nvme_cfg.timeout, timeout), \ - OPT_END() \ - } - static const char nvme_version_string[] = NVME_VERSION; static struct plugin builtin = { @@ -205,6 +185,9 @@ static struct program nvme = { }; const char *output_format = "Output format: normal|json|binary"; +const char *timeout = "timeout value, in milliseconds"; +const char *verbose = "Increase output verbosity"; + static const char *app_tag = "app tag for end-to-end PI"; static const char *app_tag_mask = "app tag mask for end-to-end PI"; static const char *block_count = "number of blocks (zeroes based) on device to access"; @@ -247,10 +230,8 @@ static const char *secp = "security protocol (cf. SPC-4)"; static const char *spsp = "security-protocol-specific (cf. SPC-4)"; static const char *start_block = "64-bit LBA of first block to access"; static const char *storage_tag = "storage tag for end-to-end PI"; -static const char *timeout = "timeout value, in milliseconds"; static const char *uuid_index = "UUID index"; static const char *uuid_index_specify = "specify uuid index"; -static const char *verbose = "Increase output verbosity"; static const char dash[51] = {[0 ... 49] = '=', '\0'}; static const char space[51] = {[0 ... 49] = ' ', '\0'}; static const char *offset = "offset of the requested register"; @@ -270,7 +251,7 @@ static const char *pmrctl = "PMRCTL=0xe04 register offset"; static const char *pmrmscl = "PMRMSCL=0xe14 register offset"; static const char *pmrmscu = "PMRMSCU=0xe18 register offset"; -static struct nvme_config nvme_cfg = { +struct nvme_config nvme_cfg = { .output_format = "normal", }; diff --git a/nvme.h b/nvme.h index e769c9af02..cae4345214 100644 --- a/nvme.h +++ b/nvme.h @@ -73,6 +73,25 @@ struct nvme_dev { #define dev_fd(d) __dev_fd(d, __func__, __LINE__) +struct nvme_config { + char *output_format; + int verbose; + __u32 timeout; +}; + +/* + * the ordering of the arguments matters, as the argument parser uses the first match, thus any + * command which defines -t shorthand will match first. + */ +#define NVME_ARGS(n, ...) \ + struct argconfig_commandline_options n[] = { \ + OPT_INCR("verbose", 'v', &nvme_cfg.verbose, verbose), \ + OPT_FMT("output-format", 'o', &nvme_cfg.output_format, output_format), \ + ##__VA_ARGS__, \ + OPT_UINT("timeout", 't', &nvme_cfg.timeout, timeout), \ + OPT_END() \ + } + static inline int __dev_fd(struct nvme_dev *dev, const char *func, int line) { if (dev->type != NVME_DEV_DIRECT) { @@ -109,6 +128,9 @@ static inline DEFINE_CLEANUP_FUNC( #define _cleanup_nvme_dev_ __cleanup__(cleanup_nvme_dev) extern const char *output_format; +extern const char *timeout; +extern const char *verbose; +extern struct nvme_config nvme_cfg; int validate_output_format(const char *format, nvme_print_flags_t *flags); bool nvme_is_output_format_json(void); From f0860ad7208bdd465b4f22e557875435322f4f0d Mon Sep 17 00:00:00 2001 From: Tokunori Ikegami Date: Sun, 7 Jul 2024 22:55:14 +0900 Subject: [PATCH 030/281] ocp: use NVME_ARGS macro definition by eol-plp-failure-mode command The verbose, output-format and timeout options enabled by the macro. Signed-off-by: Tokunori Ikegami --- plugins/ocp/ocp-nvme.c | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/plugins/ocp/ocp-nvme.c b/plugins/ocp/ocp-nvme.c index e9ebc40124..88ac212e49 100644 --- a/plugins/ocp/ocp-nvme.c +++ b/plugins/ocp/ocp-nvme.c @@ -775,14 +775,12 @@ static int eol_plp_failure_mode(int argc, char **argv, struct command *cmd, .sel = 0, }; - OPT_ARGS(opts) = { - OPT_BYTE("mode", 'm', &cfg.mode, mode), - OPT_FLAG("save", 's', &cfg.save, save), - OPT_BYTE("sel", 'S', &cfg.sel, sel), - OPT_FLAG("no-uuid", 'n', NULL, - "Skip UUID index search (UUID index not required for OCP 1.0)"), - OPT_END() - }; + NVME_ARGS(opts, + OPT_BYTE("mode", 'm', &cfg.mode, mode), + OPT_FLAG("save", 's', &cfg.save, save), + OPT_BYTE("sel", 'S', &cfg.sel, sel), + OPT_FLAG("no-uuid", 'n', NULL, + "Skip UUID index search (UUID index not required for OCP 1.0)")); err = parse_and_open(&dev, argc, argv, desc, opts); if (err) From ef8ca2bedc8ebaec2d1a974f15d8443d06b616ff Mon Sep 17 00:00:00 2001 From: Steven Seungcheol Lee Date: Mon, 8 Jul 2024 15:55:54 +0900 Subject: [PATCH 031/281] nvme: fix lbaf inuse to use 6:5 bits Signed-off-by: Steven Seungcheol Lee --- nvme.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/nvme.c b/nvme.c index 70798a58f7..d998c80083 100644 --- a/nvme.c +++ b/nvme.c @@ -2901,10 +2901,10 @@ static int parse_lba_num_si(struct nvme_dev *dev, const char *opt, _cleanup_free_ struct nvme_id_ctrl *ctrl = NULL; _cleanup_free_ struct nvme_id_ns *ns = NULL; __u32 nsid = 1; + __u8 lbaf; unsigned int remainder; char *endptr; int err = -EINVAL; - int i; int lbas; struct nvme_identify_args args = { @@ -2970,8 +2970,8 @@ static int parse_lba_num_si(struct nvme_dev *dev, const char *opt, return err; } - i = flbas & NVME_NS_FLBAS_LOWER_MASK; - lbas = (1 << ns->lbaf[i].ds) + ns->lbaf[i].ms; + nvme_id_ns_flbas_to_lbaf_inuse(flbas, &lbaf); + lbas = (1 << ns->lbaf[lbaf].ds) + ns->lbaf[lbaf].ms; if (suffix_si_parse(val, &endptr, (uint64_t *)num)) { nvme_show_error("Expected long suffixed integer argument for '%s-si' but got '%s'!", From b138de6cd8fc85dfa2395da14739dac18c117045 Mon Sep 17 00:00:00 2001 From: jeff-lien-wdc Date: Fri, 5 Jul 2024 09:35:08 -0500 Subject: [PATCH 032/281] ocp: Update Plugin Version Update ocp plugin version to 2.9.0 Signed-off-by: jeff-lien-wdc --- plugins/ocp/ocp-nvme.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/ocp/ocp-nvme.h b/plugins/ocp/ocp-nvme.h index f468b22fda..f5b599e4b4 100644 --- a/plugins/ocp/ocp-nvme.h +++ b/plugins/ocp/ocp-nvme.h @@ -11,7 +11,7 @@ #if !defined(OCP_NVME) || defined(CMD_HEADER_MULTI_READ) #define OCP_NVME -#define OCP_PLUGIN_VERSION "1.17.0" +#define OCP_PLUGIN_VERSION "2.9.0" #include "cmd.h" PLUGIN(NAME("ocp", "OCP cloud SSD extensions", OCP_PLUGIN_VERSION), From e9c2e8f72843ee6f27ef6166481d5a6481aa8d43 Mon Sep 17 00:00:00 2001 From: Chaithanya shoba Date: Fri, 24 May 2024 12:56:08 +0530 Subject: [PATCH 033/281] plugins/micron: Add support for OCP telemetry log parsing Datacenter NVMe SSD Specification v2.5r9, section 4.9. Signed-off-by: Chaithanya Shoba --- Documentation/cmd-plugins.txt | 3 + Documentation/meson.build | 1 + .../nvme-micron-ocp-telemetry-log-parse.txt | 88 + completions/_nvme | 52 + completions/bash-nvme-completion.sh | 6 +- plugins/meson.build | 2 + plugins/micron/micron-nvme.c | 162 +- plugins/micron/micron-nvme.h | 11 +- plugins/micron/micron-ocp-telemetry.c | 1416 +++++++++++++++++ plugins/micron/micron-ocp-telemetry.h | 609 +++++++ plugins/micron/micron-utils.c | 304 ++++ plugins/micron/micron-utils.h | 169 ++ 12 files changed, 2717 insertions(+), 106 deletions(-) create mode 100644 Documentation/nvme-micron-ocp-telemetry-log-parse.txt create mode 100644 plugins/micron/micron-ocp-telemetry.c create mode 100644 plugins/micron/micron-ocp-telemetry.h create mode 100644 plugins/micron/micron-utils.c create mode 100644 plugins/micron/micron-utils.h diff --git a/Documentation/cmd-plugins.txt b/Documentation/cmd-plugins.txt index f767603932..3827465630 100644 --- a/Documentation/cmd-plugins.txt +++ b/Documentation/cmd-plugins.txt @@ -46,6 +46,9 @@ linknvme:nvme-micron-smart-add-log[1]:: linknvme:nvme-micron-temperature-stats[1]:: Retrieves temperature information of given micron device +linknvme:nvme-micron-ocp-telemetry-log-parse[1]:: + Parse OCP Telemetry DA1 and DA2 logs. + linknvme:nvme-netapp-ontapdevices[1]:: Display information about ONTAP devices diff --git a/Documentation/meson.build b/Documentation/meson.build index 12abe8940c..22a995fe03 100644 --- a/Documentation/meson.build +++ b/Documentation/meson.build @@ -81,6 +81,7 @@ adoc_sources = [ 'nvme-micron-selective-download', 'nvme-micron-smart-add-log', 'nvme-micron-temperature-stats', + 'nvme-micron-ocp-telemetry-log-parse', 'nvme-netapp-ontapdevices', 'nvme-netapp-smdevices', 'nvme-ns-descs', diff --git a/Documentation/nvme-micron-ocp-telemetry-log-parse.txt b/Documentation/nvme-micron-ocp-telemetry-log-parse.txt new file mode 100644 index 0000000000..fd3bd144db --- /dev/null +++ b/Documentation/nvme-micron-ocp-telemetry-log-parse.txt @@ -0,0 +1,88 @@ +nvme-micron-ocp-telemetry-log-parse +=================================== + +NAME +---- +nvme-micron-ocp-telemetry-log-parse - Parses OCP Telemetry DA1 and DA2 logs. + +SYNOPSIS +-------- +[verse] +'nvme micron ocp-telemetry-log-parse' + [--telemetry-log= | -l ] + [--string-log= | -s ] + [--output-file= | -o ] + [--format= | -f ] + +DESCRIPTION +----------- +For the given NVMe device, parses the telemetry log and string log +(in binary format) and provides the parsed data in json and normal text formats. + +The parameter is mandatory and may be either the NVMe +character device (ex: /dev/nvme0), or a namespace block device (ex: +/dev/nvme0n1). + +This will only work on Micron devices of model numbers 51Bx. Support for new +devices may be added subsequently. Results for any other device are undefined. + +OPTIONS +------- +-l :: +--telemetry-log=:: + This option will allow the users to specify input telemetry-log file name. + +-o :: +--string-log=:: + This option will allow the users to specify input string-log file name. + +-o :: +--output-file=:: + This option will allow the users to specify the output file name. + +-f :: +--format=:: + Set the reporting format to 'normal', 'json'. Only one output format can be + used at a time. + +EXAMPLES +-------- +* Parse nvme_host_telemetry_log.bin with nvmelog_ocp_c9.bin and output parsed +json data into nvme_cli_telemetry_host.json ++ +------------ +# sudo ./nvme micron ocp-telemetry-log-parse --format=json + --string-log="nvmelog_ocp_c9.bin" --telemetry-log="nvme_host_telemetry_log.bin" + --output-file=nvme_cli_telemetry_host.json /dev/nvme0 +------------ + +* Parse nvme_host_telemetry_log.bin with nvmelog_ocp_c9.bin and output parsed +text data into nvme_cli_telemetry_host_normal.txt ++ +------------ +# sudo ./nvme micron ocp-telemetry-log-parse --format=normal + --string-log="nvmelog_ocp_c9.bin" --telemetry-log="nvme_host_telemetry_log.bin" + --output-file=nvme_cli_telemetry_host_normal.txt /dev/nvme0 +------------ + +* Parse nvme_host_telemetry_log.bin with nvmelog_ocp_c9.bin and redirect parsed +json data into nvme_cli_telemetry_host_console.json ++ +------------ +# sudo ./nvme micron ocp-telemetry-log-parse --format=json + --string-log="nvmelog_ocp_c9.bin" --telemetry-log="nvme_host_telemetry_log.bin" + > nvme_cli_telemetry_host_console.txt /dev/nvme0 +------------ + +* Parse nvme_host_telemetry_log.bin with nvmelog_ocp_c9.bin and redirect parsed +text data into nvme_cli_telemetry_host_console.json ++ +------------ +# sudo ./nvme micron ocp-telemetry-log-parse --format=normal + --string-log="nvmelog_ocp_c9.bin" --telemetry-log="nvme_host_telemetry_log.bin" + > nvme_cli_telemetry_host_console.txt /dev/nvme0 +------------ + +NVME +---- +Part of the nvme-user suite diff --git a/completions/_nvme b/completions/_nvme index 96ffd3faa5..e6ee1ae3b8 100644 --- a/completions/_nvme +++ b/completions/_nvme @@ -112,6 +112,7 @@ _nvme () { 'version:show the program version' 'ocp:OCP cloud SSD extensions' 'solidigm:Solidigm plug-in extensions' + 'micron:Micron plug-in extensions' 'help:print brief descriptions of all nvme commands' 'json:dump output in json format' ) @@ -519,6 +520,29 @@ _nvme () { (*) _files ;; + esac + ;; + (micron) + case ${words[2]} in + (ocp-telemetry-log-parse) + local _ocp-telemetry-log-parse + _ocp-telemetry-log-parse=( + /dev/nvme':supply a device to use (required)' + --output-file=':Output file name with path' + -o':alias for --output-file' + --telemetry-log=':Telemetry log binary' + -l':alias for --telemetry-log' + --string-log=':String log binary' + -s':alias for --string-log' + --format':Output format: normal|json' + -f':alias for --format' + ) + _arguments '*:: :->subcmds' + _describe -t commands "nvme micron ocp-telemetry-log-parse" _ocp-telemetry-log-parse + ;; + (*) + _files + ;; esac return else @@ -2551,6 +2575,34 @@ _nvme () { _arguments '*:: :->subcmds' _describe -t commands "nvme solidigm options" _solidigm ;; + (micron) + local micron + _micron=( + select-download':Selective Firmware Download' + vs-temperature-stats':Retrieve Micron temperature statistics' + vs-pcie-stats':Retrieve Micron PCIe error stats' + clear-pcie-correctable-errors':Clear correctable PCIe errors' + vs-internal-log':Retrieve Micron logs' + vs-telemetry-controller-option':Enable/Disable controller telemetry log generation' + vs-nand-stats':Retrieve NAND Stats' + vs-smart-ext-log':Retrieve extended SMART logs' + vs-drive-info':Retrieve Drive information' + plugin-version':Display plugin version info' + cloud-SSD-plugin-version':Display plugin version info' + log-page-directory':Retrieve log page directory' + vs-fw-activate-history':Display FW activation history' + latency-tracking':Latency monitoring feature control' + latency-stats':Latency information for tracked commands' + latency-logs':Latency log details tracked by drive' + vs-smart-add-log':Retrieve extended SMART data' + clear-fw-activate-history':Clear FW activation history' + vs-smbus-option':Enable/Disable SMBUS on the drive' + ocp-telemetry-log-parse':Parse OCP Telemetry DA1 and DA2 logs' + help':Display this help' + ) + _arguments '*:: :->subcmds' + _describe -t commands "nvme micron options" _micron + ;; (help) local _h _h=( id-ctrl id-ns list-ns id-iocs create-ns delete-ns attach-ns detach-ns diff --git a/completions/bash-nvme-completion.sh b/completions/bash-nvme-completion.sh index 682c0b7da1..b07f1ddb88 100644 --- a/completions/bash-nvme-completion.sh +++ b/completions/bash-nvme-completion.sh @@ -889,6 +889,10 @@ plugin_micron_opts () { "vs-smbus-option") opts+=" --option= -o --value= -v --save= -s" ;; + "ocp-telemetry-log-parse") + opts+=" --format= -f --telemetry-log= -l --string-log= -s \ + --output-file= -o" + ;; "help") opts+=$NO_OPTS ;; @@ -1529,7 +1533,7 @@ _nvme_subcmds () { vs-drive-info plugin-version cloud-SSD-plugin-version \ log-page-directory vs-fw-activate-history \ vs-error-reason-identifier vs-smart-add-log \ - clear-fw-activate-history vs-smbus-option" + clear-fw-activate-history vs-smbus-option ocp-telemetry-log-parse" [seagate]="vs-temperature-stats vs-log-page-sup \ vs-smart-add-log vs-pcie-stats clear-pcie-correctable-errors \ get-host-tele get-ctrl-tele vs-internal-log \ diff --git a/plugins/meson.build b/plugins/meson.build index 146fa2a0ad..45defa06b2 100644 --- a/plugins/meson.build +++ b/plugins/meson.build @@ -11,6 +11,8 @@ if json_c_dep.found() 'plugins/inspur/inspur-nvme.c', 'plugins/intel/intel-nvme.c', 'plugins/memblaze/memblaze-nvme.c', + 'plugins/micron/micron-utils.c', + 'plugins/micron/micron-ocp-telemetry.c', 'plugins/micron/micron-nvme.c', 'plugins/nbft/nbft-plugin.c', 'plugins/netapp/netapp-nvme.c', diff --git a/plugins/micron/micron-nvme.c b/plugins/micron/micron-nvme.c index ddecc970ab..dcb3748fa8 100644 --- a/plugins/micron/micron-nvme.c +++ b/plugins/micron/micron-nvme.c @@ -1,22 +1,13 @@ // SPDX-License-Identifier: GPL-2.0-or-later -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "common.h" -#include "nvme.h" -#include "libnvme.h" -#include -#include "linux/types.h" -#include "nvme-print.h" -#include "util/cleanup.h" +/* + * Copyright (c) Micron, Inc 2024. + * + * @file: micron-nvme.c + * @brief: This module contains all the constructs needed for micron nvme-cli plugin. + * @authors:Chaithanya Shoba , + */ + +#include "micron-ocp-telemetry.h" #define CREATE_CMD #include "micron-nvme.h" @@ -1191,14 +1182,8 @@ static void init_d0_log_page(__u8 *buf, __u8 nsze) sprintf(d0_log_page[6].datastr, "0x%x", logD0[1]); } -/* OCP and Vendor specific log data format */ -struct micron_vs_logpage { - char *field; - int size; /* FB client spec version 1.0 sizes - M5410 models */ - int size2; /* FB client spec version 0.7 sizes - M5407 models */ -} /* Smart Health Log information as per OCP spec M51CX models */ -ocp_c0_log_page[] = { +struct micron_vs_logpage ocp_c0_log_page[] = { { "Physical Media Units Written", 16}, { "Physical Media Units Read", 16 }, { "Raw Bad User NAND Block Count", 6}, @@ -1317,82 +1302,6 @@ fb_log_page[] = { { "Log Page GUID", 0, 16}, }; -/* - * Common function to print Micron VS log pages - * - buf: raw log data - * - log_page: format of the data - * - field_count: log field count - * - stats: json object to add fields - * - spec: ocp spec index - */ -static void print_micron_vs_logs(__u8 *buf, struct micron_vs_logpage *log_page, int field_count, - struct json_object *stats, __u8 spec) -{ - __u64 lval_lo, lval_hi; - __u32 ival; - __u16 sval; - __u8 cval, lval[8] = { 0 }; - int field; - int offset = 0; - - for (field = 0; field < field_count; field++) { - char datastr[1024] = { 0 }; - char *sfield = NULL; - int size = !spec ? log_page[field].size : log_page[field].size2; - - if (!size) - continue; - sfield = log_page[field].field; - if (size == 16) { - if (strstr(sfield, "GUID")) { - sprintf(datastr, "0x%"PRIx64"%"PRIx64"", - (uint64_t)le64_to_cpu(*(uint64_t *)(&buf[offset + 8])), - (uint64_t)le64_to_cpu(*(uint64_t *)(&buf[offset]))); - } else { - lval_lo = *((__u64 *)(&buf[offset])); - lval_hi = *((__u64 *)(&buf[offset + 8])); - if (lval_hi) - sprintf(datastr, "0x%"PRIx64"%016"PRIx64"", - le64_to_cpu(lval_hi), le64_to_cpu(lval_lo)); - else - sprintf(datastr, "0x%"PRIx64"", le64_to_cpu(lval_lo)); - } - } else if (size == 8) { - lval_lo = *((__u64 *)(&buf[offset])); - sprintf(datastr, "0x%"PRIx64"", le64_to_cpu(lval_lo)); - } else if (size == 7) { - /* 7 bytes will be in little-endian format, with last byte as MSB */ - memcpy(&lval[0], &buf[offset], 7); - memcpy((void *)&lval_lo, lval, 8); - sprintf(datastr, "0x%"PRIx64"", le64_to_cpu(lval_lo)); - } else if (size == 6) { - ival = *((__u32 *)(&buf[offset])); - sval = *((__u16 *)(&buf[offset + 4])); - lval_lo = (((__u64)sval << 32) | ival); - sprintf(datastr, "0x%"PRIx64"", le64_to_cpu(lval_lo)); - } else if (size == 4) { - ival = *((__u32 *)(&buf[offset])); - sprintf(datastr, "0x%x", le32_to_cpu(ival)); - } else if (size == 2) { - sval = *((__u16 *)(&buf[offset])); - sprintf(datastr, "0x%04x", le16_to_cpu(sval)); - } else if (size == 1) { - cval = buf[offset]; - sprintf(datastr, "0x%02x", cval); - } else { - sprintf(datastr, "0"); - } - offset += size; - /* do not print reserved values */ - if (strstr(sfield, "Reserved")) - continue; - if (stats) - json_object_add_value_string(stats, sfield, datastr); - else - printf("%-40s : %-4s\n", sfield, datastr); - } -} - static void print_smart_cloud_health_log(__u8 *buf, bool is_json) { struct json_object *root; @@ -1408,7 +1317,7 @@ static void print_smart_cloud_health_log(__u8 *buf, bool is_json) logPages); } - print_micron_vs_logs(buf, ocp_c0_log_page, field_count, stats, 0); + print_micron_vs_logs(buf, ocp_c0_log_page, field_count, stats, 0, NULL); if (is_json) { json_array_add_value_object(logPages, stats); @@ -1433,7 +1342,7 @@ static void print_nand_stats_fb(__u8 *buf, __u8 *buf2, __u8 nsze, bool is_json, logPages); } - print_micron_vs_logs(buf, fb_log_page, field_count, stats, spec); + print_micron_vs_logs(buf, fb_log_page, field_count, stats, spec, NULL); /* print last three entries from D0 log page */ if (buf2) { @@ -1587,7 +1496,7 @@ static void print_ext_smart_logs_e1(__u8 *buf, bool is_json) printf("SMART Extended Log:0xE1\n"); } - print_micron_vs_logs(buf, e1_log_page, field_count, stats, 0); + print_micron_vs_logs(buf, e1_log_page, field_count, stats, 0, NULL); if (is_json) { json_array_add_value_object(logPages, stats); @@ -1756,6 +1665,7 @@ static void GetGenericLogs(int fd, const char *dir) struct nvme_firmware_slot fw_log; struct nvme_cmd_effects_log effects; struct nvme_persistent_event_log pevent_log; + _cleanup_huge_ struct nvme_mem_huge mh = { 0, }; void *pevent_log_info = NULL; __u32 log_len = 0; @@ -3364,3 +3274,47 @@ static int micron_logpage_dir(int argc, char **argv, struct command *cmd, return err; } + +static int micron_ocp_telemetry_log_parse(int argc, char **argv, + struct command *cmd, struct plugin *plugin) +{ + const char *desc = "Parse OCP Telemetry DA1 and DA2 logs."; + const char *output_fmt = "output format normal|json"; + const char *telemetry_log = "Telemetry log binary;\n 'host.bin' or 'controller.bin'"; + const char *string_log = "String log binary; 'C9.bin'"; + const char *output_file = "Output file name with path;\n" + "e.g. '-o ./path/name'\n'-o ./path1/path2/';\n" + "If requested path doesn't exist, the file will be newly created."; + enum eDriveModel eModel = UNKNOWN_MODEL; + int err = 0; + struct nvme_dev *dev; + struct ocp_telemetry_parse_options opt; + + OPT_ARGS(opts) = { + OPT_STR("telemetry-log", 'l', &opt.telemetry_log, telemetry_log), + OPT_STR("string-log", 's', &opt.string_log, string_log), + OPT_FILE("output-file", 'o', &opt.output_file, output_file), + OPT_FMT("format", 'f', &opt.output_fmt, output_fmt), + OPT_END() + }; + + err = micron_parse_options(&dev, argc, argv, desc, opts, &eModel); + if (err < 0) + return -1; + + if (!opt.telemetry_log) { + nvme_show_result("\nMissing telemetry-log.\n"); + return -1; + } else if (!opt.string_log) { + nvme_show_result("\nMissing string-log. Skipping adding string data.\n"); + } else if (!opt.output_fmt) { + nvme_show_result("\nMissing format. Using default format - JSON.\n"); + } + + err = parse_ocp_telemetry_log(&opt); + + dev_close(dev); + if (err != 0) + nvme_show_status(err); + return err; +} diff --git a/plugins/micron/micron-nvme.h b/plugins/micron/micron-nvme.h index 4f7b892702..91fc2c8da2 100644 --- a/plugins/micron/micron-nvme.h +++ b/plugins/micron/micron-nvme.h @@ -1,4 +1,11 @@ -/* SPDX-License-Identifier: GPL-2.0-or-later */ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Copyright (c) Micron, Inc 2024. + * + * @file: micron-nvme.h + * @brief: This module contains all the constructs needed for micron nvme-cli plugin. + * @authors:Chaithanya Shoba , + */ #undef CMD_INC_FILE #define CMD_INC_FILE plugins/micron/micron-nvme @@ -28,6 +35,8 @@ PLUGIN(NAME("micron", "Micron vendor specific extensions", NVME_VERSION), ENTRY("vs-smart-add-log", "Retrieve extended SMART data", micron_ocp_smart_health_logs) ENTRY("clear-fw-activate-history", "Clear FW activation history", micron_clr_fw_activation_history) ENTRY("vs-smbus-option", "Enable/Disable SMBUS on the drive", micron_smbus_option) + ENTRY("ocp-telemetry-log-parse", "Parse OCP Telemetry DA1 and DA2 logs", + micron_ocp_telemetry_log_parse) ) ); diff --git a/plugins/micron/micron-ocp-telemetry.c b/plugins/micron/micron-ocp-telemetry.c new file mode 100644 index 0000000000..b177722eaf --- /dev/null +++ b/plugins/micron/micron-ocp-telemetry.c @@ -0,0 +1,1416 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Copyright (c) Micron, Inc 2024. + * + * @file: micron-ocp-telemetry.c + * @brief: This module contains all the constructs needed for parsing (or) + * decoding ocp telemetry log files. + * @author: Chaithanya Shoba + */ + +#include "micron-ocp-telemetry.h" + +//global buffers +static unsigned char *ptelemetry_buffer; +static unsigned char *pstring_buffer; + +struct statistic_entry statistic_identifiers_map[] = { + { 0x00, "Error, this entry does not exist." }, + { 0x01, "Outstanding Admin Commands" }, + { 0x02, "Host Write Bandwidth"}, + { 0x03, "GC Write Bandwidth"}, + { 0x04, "Active Namespaces"}, + { 0x05, "Internal Write Workload"}, + { 0x06, "Internal Read Workload"}, + { 0x07, "Internal Write Queue Depth"}, + { 0x08, "Internal Read Queue Depth"}, + { 0x09, "Pending Trim LBA Count"}, + { 0x0A, "Host Trim LBA Request Count"}, + { 0x0B, "Current NVMe Power State"}, + { 0x0C, "Current DSSD Power State"}, + { 0x0D, "Program Fail Count"}, + { 0x0E, "Erase Fail Count"}, + { 0x0F, "Read Disturb Writes"}, + { 0x10, "Retention Writes"}, + { 0x11, "Wear Leveling Writes"}, + { 0x12, "Read Recovery Writes"}, + { 0x13, "GC Writes"}, + { 0x14, "SRAM Correctable Count"}, + { 0x15, "DRAM Correctable Count"}, + { 0x16, "SRAM Uncorrectable Count"}, + { 0x17, "DRAM Uncorrectable Count"}, + { 0x18, "Data Integrity Error Count"}, + { 0x19, "Read Retry Error Count"}, + { 0x1A, "PERST Events Count"}, + { 0x1B, "Max Die Bad Block"}, + { 0x1C, "Max NAND Channel Bad Block"}, + { 0x1D, "Minimum NAND Channel Bad Block"} +}; + +struct micron_vs_logpage host_log_page_header[] = { + { "LogIdentifier", 1 }, + { "Reserved1", 4 }, + { "IEEE OUI Identifier", 3 }, + { "Telemetry Host-Initiated Data Area 1 Last Block", 2 }, + { "Telemetry Host-Initiated Data Area 2 Last Block", 2 }, + { "Telemetry Host-Initiated Data Area 3 Last Block", 2 }, + { "Reserved2", 2 }, + { "Telemetry Host-Initiated Data Area 4 Last Block", 4 }, + { "Reserved3", 360 }, + { "Telemetry Host-Initiated Scope", 1 }, + { "Telemetry Host Initiated Generation Number", 1 }, + { "Telemetry Host-Initiated Data Available", 1 }, + { "Telemetry Controller-Initiated Data Generation Number", 1 } +}; + +struct micron_vs_logpage controller_log_page_header[] = { + { "LogIdentifier", 1 }, + { "Reserved1", 4 }, + { "IEEE OUI Identifier", 3 }, + { "Telemetry Host-Initiated Data Area 1 Last Block", 2 }, + { "Telemetry Host-Initiated Data Area 2 Last Block", 2 }, + { "Telemetry Host-Initiated Data Area 3 Last Block", 2 }, + { "Reserved2", 2 }, + { "Telemetry Host-Initiated Data Area 4 Last Block", 4 }, + { "Reserved3", 361 }, + { "Telemetry Controller-Initiated Scope", 1 }, + { "Telemetry Controller-Initiated Data Available", 1 }, + { "Telemetry Controller-Initiated Data Generation Number", 1 } +}; + +struct micron_vs_logpage reason_identifier[] = { + { "Error ID", 64 }, + { "File ID", 8 }, + { "Line Number", 2 }, + { "Valid Flags", 1 }, + { "Reserved", 21 }, + { "VU Reason Extension", 32 } +}; + +struct micron_vs_logpage ocp_header_in_da1[] = { + { "Major Version", 2 }, + { "Minor Version", 2 }, + { "Reserved1", 4 }, + { "Timestamp", 8 }, + { "Log page GUID", 16 }, + { "Number Telemetry Profiles Supported", 1 }, + { "Telemetry Profile Selected", 1 }, + { "Reserved2", 6 }, + { "Telemetry String Log Size", 8 }, + { "Reserved3", 8 }, + { "Firmware Revision", 8 }, + { "Reserved4", 32 }, + { "Data Area 1 Statistic Start", 8 }, + { "Data Area 1 Statistic Size", 8 }, + { "Data Area 2 Statistic Start", 8 }, + { "Data Area 2 Statistic Size", 8 }, + { "Reserved5", 32 }, + { "Event FIFO 1 Data Area", 1 }, + { "Event FIFO 2 Data Area", 1 }, + { "Event FIFO 3 Data Area", 1 }, + { "Event FIFO 4 Data Area", 1 }, + { "Event FIFO 5 Data Area", 1 }, + { "Event FIFO 6 Data Area", 1 }, + { "Event FIFO 7 Data Area", 1 }, + { "Event FIFO 8 Data Area", 1 }, + { "Event FIFO 9 Data Area", 1 }, + { "Event FIFO 10 Data Area", 1 }, + { "Event FIFO 11 Data Area", 1 }, + { "Event FIFO 12 Data Area", 1 }, + { "Event FIFO 13 Data Area", 1 }, + { "Event FIFO 14 Data Area", 1 }, + { "Event FIFO 15 Data Area", 1 }, + { "Event FIFO 16 Data Area", 1 }, + { "Event FIFO 1 Start", 8 }, + { "Event FIFO 1 Size", 8 }, + { "Event FIFO 2 Start", 8 }, + { "Event FIFO 2 Size", 8 }, + { "Event FIFO 3 Start", 8 }, + { "Event FIFO 3 Size", 8 }, + { "Event FIFO 4 Start", 8 }, + { "Event FIFO 4 Size", 8 }, + { "Event FIFO 5 Start", 8 }, + { "Event FIFO 5 Size", 8 }, + { "Event FIFO 6 Start", 8 }, + { "Event FIFO 6 Size", 8 }, + { "Event FIFO 7 Start", 8 }, + { "Event FIFO 7 Size", 8 }, + { "Event FIFO 8 Start", 8 }, + { "Event FIFO 8 Size", 8 }, + { "Event FIFO 9 Start", 8 }, + { "Event FIFO 9 Size", 8 }, + { "Event FIFO 10 Start", 8 }, + { "Event FIFO 10 Size", 8 }, + { "Event FIFO 11 Start", 8 }, + { "Event FIFO 11 Size", 8 }, + { "Event FIFO 12 Start", 8 }, + { "Event FIFO 12 Size", 8 }, + { "Event FIFO 13 Start", 8 }, + { "Event FIFO 13 Size", 8 }, + { "Event FIFO 14 Start", 8 }, + { "Event FIFO 14 Size", 8 }, + { "Event FIFO 15 Start", 8 }, + { "Event FIFO 15 Size", 8 }, + { "Event FIFO 16 Start", 8 }, + { "Event FIFO 16 Size", 8 }, + { "Reserved6", 80 } +}; + +struct micron_vs_logpage smart[] = { + { "Critical Warning", 1 }, + { "Composite Temperature", 2 }, + { "Available Spare", 1 }, + { "Available Spare Threshold", 1 }, + { "Percentage Used", 1 }, + { "Reserved1", 26 }, + { "Data Units Read", 16 }, + { "Data Units Written", 16 }, + { "Host Read Commands", 16 }, + { "Host Write Commands", 16 }, + { "Controller Busy Time", 16 }, + { "Power Cycles", 16 }, + { "Power On Hours", 16 }, + { "Unsafe Shutdowns", 16 }, + { "Media and Data Integrity Errors", 16 }, + { "Number of Error Information Log Entries", 16 }, + { "Warning Composite Temperature Time", 4 }, + { "Critical Composite Temperature Time", 4 }, + { "Temperature Sensor 1", 2 }, + { "Temperature Sensor 2", 2 }, + { "Temperature Sensor 3", 2 }, + { "Temperature Sensor 4", 2 }, + { "Temperature Sensor 5", 2 }, + { "Temperature Sensor 6", 2 }, + { "Temperature Sensor 7", 2 }, + { "Temperature Sensor 8", 2 }, + { "Thermal Management Temperature 1 Transition Count", 4 }, + { "Thermal Management Temperature 2 Transition Count", 4 }, + { "Total Time for Thermal Management Temperature 1", 4 }, + { "Total Time for Thermal Management Temperature 2", 4 }, + { "Reserved2", 280 } +}; + +struct micron_vs_logpage smart_extended[] = { + { "Physical Media Units Written", 16 }, + { "Physical Media Units Read", 16 }, + { "Bad User NAND Blocks Raw Count", 6 }, + { "Bad User NAND Blocks Normalized Value", 2 }, + { "Bad System NAND Blocks Raw Count", 6 }, + { "Bad System NAND Blocks Normalized Value", 2 }, + { "XOR Recovery Count", 8 }, + { "Uncorrectable Read Error Count", 8 }, + { "Soft ECC Error Count", 8 }, + { "End to End Correction Counts Detected Errors", 4 }, + { "End to End Correction Counts Corrected Errors", 4 }, + { "System Data Percent Used", 1 }, + { "Refresh Counts", 7 }, + { "Maximum User Data Erase Count", 4 }, + { "Minimum User Data Erase Count", 4 }, + { "Number of thermal throttling events", 1 }, + { "Current Throttling Status", 1 }, + { "Errata Version Field", 1 }, + { "Point Version Field", 2 }, + { "Minor Version Field", 2 }, + { "Major Version Field", 1 }, + { "PCIe Correctable Error Count", 8 }, + { "Incomplete Shutdowns", 4 }, + { "Reserved1", 4 }, + { "Percent Free Blocks", 1 }, + { "Reserved2", 7 }, + { "Capacitor Health", 2 }, + { "NVMe Base Errata Version", 1 }, + { "NVMe Command Set Errata Version", 1 }, + { "Reserved3", 4 }, + { "Unaligned IO", 8 }, + { "Security Version Number", 8 }, + { "Total NUSE", 8 }, + { "PLP Start Count", 16 }, + { "Endurance Estimate", 16 }, + { "PCIe Link Retraining Count", 8 }, + { "Power State Change Count", 8 }, + { "Lowest Permitted Firmware Revision", 8 }, + { "Reserved4", 278 }, + { "Log Page Version", 2 }, + { "Log page GUID", 16 } +}; + +void json_add_formatted_u32_str(struct json_object *pobject, const char *msg, unsigned int pdata) +{ + char data_str[70] = { 0 }; + + sprintf(data_str, "0x%x", pdata); + json_object_add_value_string(pobject, msg, data_str); +} + +void json_add_formatted_var_size_str(struct json_object *pobject, const char *msg, __u8 *pdata, + unsigned int data_size) +{ + char description_str[256] = ""; + char temp_buffer[3] = { 0 }; + + for (size_t i = 0; i < data_size; ++i) { + sprintf(temp_buffer, "%02X", pdata[i]); + strcat(description_str, temp_buffer); + } + + json_object_add_value_string(pobject, msg, description_str); +} + +int get_telemetry_das_offset_and_size( + struct nvme_ocp_telemetry_common_header *ptelemetry_common_header, + struct nvme_ocp_telemetry_offsets *ptelemetry_das_offset) +{ + if (NULL == ptelemetry_common_header || NULL == ptelemetry_das_offset) { + nvme_show_error("Invalid input arguments."); + return -1; + } + + if (ptelemetry_common_header->log_id == NVME_HOST_TELEMETRY_LOG) + ptelemetry_das_offset->header_size = + sizeof(struct nvme_ocp_telemetry_host_initiated_header); + else if (ptelemetry_common_header->log_id == NVME_CNTRL_TELEMETRY_LOG) + ptelemetry_das_offset->header_size = + sizeof(struct nvme_ocp_telemetry_controller_initiated_header); + else + return -1; + + ptelemetry_das_offset->da1_start_offset = ptelemetry_das_offset->header_size; + ptelemetry_das_offset->da1_size = ptelemetry_common_header->da1_last_block * + OCP_TELEMETRY_DATA_BLOCK_SIZE; + + ptelemetry_das_offset->da2_start_offset = ptelemetry_das_offset->da1_start_offset + + ptelemetry_das_offset->da1_size; + ptelemetry_das_offset->da2_size = + (ptelemetry_common_header->da2_last_block - + ptelemetry_common_header->da1_last_block) * OCP_TELEMETRY_DATA_BLOCK_SIZE; + + ptelemetry_das_offset->da3_start_offset = ptelemetry_das_offset->da2_start_offset + + ptelemetry_das_offset->da2_size; + ptelemetry_das_offset->da3_size = + (ptelemetry_common_header->da3_last_block - + ptelemetry_common_header->da2_last_block) * OCP_TELEMETRY_DATA_BLOCK_SIZE; + + ptelemetry_das_offset->da4_start_offset = ptelemetry_das_offset->da3_start_offset + + ptelemetry_das_offset->da3_size; + ptelemetry_das_offset->da4_size = + (ptelemetry_common_header->da4_last_block - + ptelemetry_common_header->da3_last_block) * OCP_TELEMETRY_DATA_BLOCK_SIZE; + + return 0; +} + +int get_static_id_ascii_string(int identifier, char *description) +{ + if (pstring_buffer == NULL) + return -1; + + struct nvme_ocp_telemetry_string_header *pocp_ts_header = + (struct nvme_ocp_telemetry_string_header *)pstring_buffer; + + //Calculating the sizes of the tables. Note: Data is present in the form of DWORDS, + //So multiplying with sizeof(DWORD) + unsigned long long sits_table_size = (pocp_ts_header->sitsz) * SIZE_OF_DWORD; + + //Calculating number of entries present in all 3 tables + int sits_entries = (int)sits_table_size / + sizeof(struct nvme_ocp_statistics_identifier_string_table); + + for (int sits_entry = 0; sits_entry < sits_entries; sits_entry++) { + struct nvme_ocp_statistics_identifier_string_table + *peach_statistic_entry = + (struct nvme_ocp_statistics_identifier_string_table *) + (pstring_buffer + (pocp_ts_header->sits * SIZE_OF_DWORD) + + (sits_entry * + sizeof(struct nvme_ocp_statistics_identifier_string_table))); + + if (identifier == (int)peach_statistic_entry->vs_statistic_identifier) { + char *pdescription = (char *)(pstring_buffer + + (pocp_ts_header->ascts * SIZE_OF_DWORD) + + (peach_statistic_entry->ascii_id_offset * + SIZE_OF_DWORD)); + + memcpy(description, pdescription, + peach_statistic_entry->ascii_id_length + 1); + + // If ASCII string isn't found, see in our internal Map + // for 2.5 Spec defined strings (id < 0x1D). + if ((description == NULL) && (identifier < 0x1D)) + memcpy(description, + statistic_identifiers_map[identifier].description, + peach_statistic_entry->ascii_id_length + 1); + return 0; + } + } + + return -1; +} + +int get_event_id_ascii_string(int identifier, int debug_event_class, char *description) +{ + if (pstring_buffer == NULL) + return -1; + + struct nvme_ocp_telemetry_string_header *pocp_ts_header = + (struct nvme_ocp_telemetry_string_header *)pstring_buffer; + + //Calculating the sizes of the tables. Note: Data is present in the form of DWORDS, + //So multiplying with sizeof(DWORD) + unsigned long long ests_table_size = (pocp_ts_header->estsz) * SIZE_OF_DWORD; + + //Calculating number of entries present in all 3 tables + int ests_entries = (int)ests_table_size / sizeof(struct nvme_ocp_event_string_table); + + for (int ests_entry = 0; ests_entry < ests_entries; ests_entry++) { + struct nvme_ocp_event_string_table *peach_event_entry = + (struct nvme_ocp_event_string_table *) + (pstring_buffer + (pocp_ts_header->ests * SIZE_OF_DWORD) + + (ests_entry * sizeof(struct nvme_ocp_event_string_table))); + + if (identifier == (int)peach_event_entry->event_identifier && + debug_event_class == (int)peach_event_entry->debug_event_class) { + char *pdescription = (char *)(pstring_buffer + + (pocp_ts_header->ascts * SIZE_OF_DWORD) + + (peach_event_entry->ascii_id_offset * SIZE_OF_DWORD)); + + memcpy(description, pdescription, + peach_event_entry->ascii_id_length + 1); + return 0; + } + } + + return -1; +} + +int get_vu_event_id_ascii_string(int identifier, int debug_event_class, char *description) +{ + if (pstring_buffer == NULL) + return -1; + + struct nvme_ocp_telemetry_string_header *pocp_ts_header = + (struct nvme_ocp_telemetry_string_header *)pstring_buffer; + + //Calculating the sizes of the tables. Note: Data is present in the form of DWORDS, + //So multiplying with sizeof(DWORD) + unsigned long long vuests_table_size = (pocp_ts_header->vu_estsz) * SIZE_OF_DWORD; + + //Calculating number of entries present in all 3 tables + int vu_ests_entries = (int)vuests_table_size / + sizeof(struct nvme_ocp_vu_event_string_table); + + for (int vu_ests_entry = 0; vu_ests_entry < vu_ests_entries; vu_ests_entry++) { + struct nvme_ocp_vu_event_string_table *peach_vu_event_entry = + (struct nvme_ocp_vu_event_string_table *) + (pstring_buffer + (pocp_ts_header->vu_ests * SIZE_OF_DWORD) + + (vu_ests_entry * sizeof(struct nvme_ocp_vu_event_string_table))); + + if (identifier == (int)peach_vu_event_entry->vu_event_identifier && + debug_event_class == + (int)peach_vu_event_entry->debug_event_class) { + char *pdescription = (char *)(pstring_buffer + + (pocp_ts_header->ascts * SIZE_OF_DWORD) + + (peach_vu_event_entry->ascii_id_offset * SIZE_OF_DWORD)); + + memcpy(description, pdescription, + peach_vu_event_entry->ascii_id_length + 1); + return 0; + } + } + + return -1; +} + +int parse_ocp_telemetry_string_log(int event_fifo_num, int identifier, int debug_event_class, + enum ocp_telemetry_string_tables string_table, char *description) +{ + if (pstring_buffer == NULL) + return -1; + + if (event_fifo_num != 0) { + struct nvme_ocp_telemetry_string_header *pocp_ts_header = + (struct nvme_ocp_telemetry_string_header *)pstring_buffer; + + if (*pocp_ts_header->fifo_ascii_string[event_fifo_num-1] != '\0') + memcpy(description, pocp_ts_header->fifo_ascii_string[event_fifo_num-1], + 16); + else + description = ""; + + return 0; + } + + if (string_table == STATISTICS_IDENTIFIER_STRING) + get_static_id_ascii_string(identifier, description); + else if (string_table == EVENT_STRING) + get_event_id_ascii_string(identifier, debug_event_class, description); + else if (string_table == VU_EVENT_STRING) + get_vu_event_id_ascii_string(identifier, debug_event_class, description); + + return 0; +} + +void parse_time_stamp_event(struct nvme_ocp_telemetry_event_descriptor *pevent_descriptor, + struct json_object *pevent_descriptor_obj, __u8 *pevent_specific_data, + struct json_object *pevent_fifos_object, FILE *fp) +{ + struct nvme_ocp_time_stamp_dbg_evt_class_format *ptime_stamp_event = + (struct nvme_ocp_time_stamp_dbg_evt_class_format *) pevent_specific_data; + + int vu_event_id = (int)ptime_stamp_event->vu_event_identifier; + + unsigned int data_size = ((pevent_descriptor->event_data_size * SIZE_OF_DWORD)- + sizeof(struct nvme_ocp_time_stamp_dbg_evt_class_format)); + + __u8 *pdata = (__u8 *)ptime_stamp_event + + sizeof(struct nvme_ocp_time_stamp_dbg_evt_class_format); + + char description_str[256] = ""; + + parse_ocp_telemetry_string_log(0, ptime_stamp_event->vu_event_identifier, + pevent_descriptor->debug_event_class_type, + VU_EVENT_STRING, description_str); + + if (pevent_fifos_object != NULL) { + json_add_formatted_var_size_str(pevent_descriptor_obj, STR_CLASS_SPECIFIC_DATA, + ptime_stamp_event->time_stamp, DATA_SIZE_8); + json_add_formatted_u32_str(pevent_descriptor_obj, STR_VU_EVENT_ID_STRING, + vu_event_id); + json_object_add_value_string(pevent_descriptor_obj, STR_VU_EVENT_STRING, + description_str); + json_add_formatted_var_size_str(pevent_descriptor_obj, STR_VU_DATA, pdata, + data_size); + } else { + if (fp) { + print_formatted_var_size_str(STR_CLASS_SPECIFIC_DATA, + ptime_stamp_event->time_stamp, DATA_SIZE_8, fp); + fprintf(fp, "%s: 0x%x\n", STR_VU_EVENT_ID_STRING, vu_event_id); + fprintf(fp, "%s: %s\n", STR_VU_EVENT_STRING, description_str); + print_formatted_var_size_str(STR_VU_DATA, pdata, data_size, fp); + } else { + print_formatted_var_size_str(STR_CLASS_SPECIFIC_DATA, + ptime_stamp_event->time_stamp, DATA_SIZE_8, fp); + printf("%s: 0x%x\n", STR_VU_EVENT_ID_STRING, vu_event_id); + printf("%s: %s\n", STR_VU_EVENT_STRING, description_str); + print_formatted_var_size_str(STR_VU_DATA, pdata, data_size, fp); + } + } +} + +void parse_pcie_event(struct nvme_ocp_telemetry_event_descriptor *pevent_descriptor, + struct json_object *pevent_descriptor_obj, __u8 *pevent_specific_data, + struct json_object *pevent_fifos_object, FILE *fp) +{ + struct nvme_ocp_pcie_dbg_evt_class_format *ppcie_event = + (struct nvme_ocp_pcie_dbg_evt_class_format *) pevent_specific_data; + int vu_event_id = (int) ppcie_event->vu_event_identifier; + unsigned int data_size = ((pevent_descriptor->event_data_size * SIZE_OF_DWORD) - + sizeof(struct nvme_ocp_pcie_dbg_evt_class_format)); + __u8 *pdata = (__u8 *) ppcie_event + sizeof(struct nvme_ocp_pcie_dbg_evt_class_format); + char description_str[256] = ""; + + parse_ocp_telemetry_string_log(0, ppcie_event->vu_event_identifier, + pevent_descriptor->debug_event_class_type, VU_EVENT_STRING, description_str); + + if (pevent_fifos_object != NULL) { + json_add_formatted_var_size_str(pevent_descriptor_obj, STR_CLASS_SPECIFIC_DATA, + ppcie_event->pCIeDebugEventData, DATA_SIZE_4); + json_add_formatted_u32_str(pevent_descriptor_obj, STR_VU_EVENT_ID_STRING, + vu_event_id); + json_object_add_value_string(pevent_descriptor_obj, STR_VU_EVENT_STRING, + description_str); + json_add_formatted_var_size_str(pevent_descriptor_obj, STR_VU_DATA, pdata, + data_size); + } else { + if (fp) { + print_formatted_var_size_str(STR_CLASS_SPECIFIC_DATA, + ppcie_event->pCIeDebugEventData, DATA_SIZE_4, fp); + fprintf(fp, "%s: 0x%x\n", STR_VU_EVENT_ID_STRING, vu_event_id); + fprintf(fp, "%s: %s\n", STR_VU_EVENT_STRING, description_str); + print_formatted_var_size_str(STR_VU_DATA, pdata, data_size, fp); + } else { + print_formatted_var_size_str(STR_CLASS_SPECIFIC_DATA, + ppcie_event->pCIeDebugEventData, DATA_SIZE_4, fp); + printf("%s: 0x%x\n", STR_VU_EVENT_ID_STRING, vu_event_id); + printf("%s: %s\n", STR_VU_EVENT_STRING, description_str); + print_formatted_var_size_str(STR_VU_DATA, pdata, data_size, fp); + } + } +} + +void parse_nvme_event(struct nvme_ocp_telemetry_event_descriptor *pevent_descriptor, + struct json_object *pevent_descriptor_obj, __u8 *pevent_specific_data, + struct json_object *pevent_fifos_object, FILE *fp) +{ + struct nvme_ocp_nvme_dbg_evt_class_format *pnvme_event = + (struct nvme_ocp_nvme_dbg_evt_class_format *) pevent_specific_data; + int vu_event_id = (int) pnvme_event->vu_event_identifier; + unsigned int data_size = ((pevent_descriptor->event_data_size * + SIZE_OF_DWORD) - sizeof(struct nvme_ocp_nvme_dbg_evt_class_format)); + __u8 *pdata = (__u8 *) pnvme_event + sizeof(struct nvme_ocp_nvme_dbg_evt_class_format); + char description_str[256] = ""; + + parse_ocp_telemetry_string_log(0, pnvme_event->vu_event_identifier, + pevent_descriptor->debug_event_class_type, VU_EVENT_STRING, + description_str); + + if (pevent_fifos_object != NULL) { + json_add_formatted_var_size_str(pevent_descriptor_obj, STR_CLASS_SPECIFIC_DATA, + pnvme_event->nvmeDebugEventData, DATA_SIZE_8); + json_add_formatted_u32_str(pevent_descriptor_obj, STR_VU_EVENT_ID_STRING, + vu_event_id); + json_object_add_value_string(pevent_descriptor_obj, STR_VU_EVENT_STRING, + description_str); + json_add_formatted_var_size_str(pevent_descriptor_obj, STR_VU_DATA, pdata, + data_size); + } else { + if (fp) { + print_formatted_var_size_str(STR_CLASS_SPECIFIC_DATA, + pnvme_event->nvmeDebugEventData, DATA_SIZE_8, fp); + fprintf(fp, "%s: 0x%x\n", STR_VU_EVENT_ID_STRING, vu_event_id); + fprintf(fp, "%s: %s\n", STR_VU_EVENT_STRING, description_str); + print_formatted_var_size_str(STR_VU_DATA, pdata, data_size, fp); + } else { + print_formatted_var_size_str(STR_CLASS_SPECIFIC_DATA, + pnvme_event->nvmeDebugEventData, DATA_SIZE_8, fp); + printf("%s: 0x%x\n", STR_VU_EVENT_ID_STRING, vu_event_id); + printf("%s: %s\n", STR_VU_EVENT_STRING, description_str); + print_formatted_var_size_str(STR_VU_DATA, pdata, data_size, fp); + } + } +} + +void parse_common_event(struct nvme_ocp_telemetry_event_descriptor *pevent_descriptor, + struct json_object *pevent_descriptor_obj, __u8 *pevent_specific_data, + struct json_object *pevent_fifos_object, FILE *fp) +{ + struct nvme_ocp_common_dbg_evt_class_format *pcommon_debug_event = + (struct nvme_ocp_common_dbg_evt_class_format *) pevent_specific_data; + int vu_event_id = (int) pcommon_debug_event->vu_event_identifier; + unsigned int data_size = ((pevent_descriptor->event_data_size * + SIZE_OF_DWORD) - sizeof(struct nvme_ocp_common_dbg_evt_class_format)); + __u8 *pdata = (__u8 *) pcommon_debug_event + + sizeof(struct nvme_ocp_common_dbg_evt_class_format); + char description_str[256] = ""; + + parse_ocp_telemetry_string_log(0, pcommon_debug_event->vu_event_identifier, + pevent_descriptor->debug_event_class_type, VU_EVENT_STRING, description_str); + + if (pevent_fifos_object != NULL) { + json_add_formatted_u32_str(pevent_descriptor_obj, STR_VU_EVENT_ID_STRING, + vu_event_id); + json_object_add_value_string(pevent_descriptor_obj, STR_VU_EVENT_STRING, + description_str); + json_add_formatted_var_size_str(pevent_descriptor_obj, STR_VU_DATA, pdata, + data_size); + } else { + if (fp) { + fprintf(fp, "%s: 0x%x\n", STR_VU_EVENT_ID_STRING, vu_event_id); + fprintf(fp, "%s: %s\n", STR_VU_EVENT_STRING, description_str); + print_formatted_var_size_str(STR_VU_DATA, pdata, data_size, fp); + } else { + printf("%s: 0x%x\n", STR_VU_EVENT_ID_STRING, vu_event_id); + printf("%s: %s\n", STR_VU_EVENT_STRING, description_str); + print_formatted_var_size_str(STR_VU_DATA, pdata, data_size, fp); + } + } +} + +void parse_media_wear_event(struct nvme_ocp_telemetry_event_descriptor *pevent_descriptor, + struct json_object *pevent_descriptor_obj, __u8 *pevent_specific_data, + struct json_object *pevent_fifos_object, FILE *fp) +{ + struct nvme_ocp_media_wear_dbg_evt_class_format *pmedia_wear_event = + (struct nvme_ocp_media_wear_dbg_evt_class_format *) pevent_specific_data; + int vu_event_id = (int) pmedia_wear_event->vu_event_identifier; + unsigned int data_size = ((pevent_descriptor->event_data_size * SIZE_OF_DWORD) - + sizeof(struct nvme_ocp_media_wear_dbg_evt_class_format)); + __u8 *pdata = (__u8 *) pmedia_wear_event + + sizeof(struct nvme_ocp_media_wear_dbg_evt_class_format); + char description_str[256] = ""; + + parse_ocp_telemetry_string_log(0, pmedia_wear_event->vu_event_identifier, + pevent_descriptor->debug_event_class_type, VU_EVENT_STRING, + description_str); + + if (pevent_fifos_object != NULL) { + json_add_formatted_var_size_str(pevent_descriptor_obj, STR_CLASS_SPECIFIC_DATA, + pmedia_wear_event->currentMediaWear, DATA_SIZE_12); + json_add_formatted_u32_str(pevent_descriptor_obj, STR_VU_EVENT_ID_STRING, + vu_event_id); + json_object_add_value_string(pevent_descriptor_obj, STR_VU_EVENT_STRING, + description_str); + json_add_formatted_var_size_str(pevent_descriptor_obj, STR_VU_DATA, pdata, + data_size); + } else { + if (fp) { + print_formatted_var_size_str(STR_CLASS_SPECIFIC_DATA, + pmedia_wear_event->currentMediaWear, DATA_SIZE_12, fp); + fprintf(fp, "%s: 0x%x\n", STR_VU_EVENT_ID_STRING, vu_event_id); + fprintf(fp, "%s: %s\n", STR_VU_EVENT_STRING, description_str); + print_formatted_var_size_str(STR_VU_DATA, pdata, data_size, fp); + } else { + print_formatted_var_size_str(STR_CLASS_SPECIFIC_DATA, + pmedia_wear_event->currentMediaWear, DATA_SIZE_12, NULL); + printf("%s: 0x%x\n", STR_VU_EVENT_ID_STRING, vu_event_id); + printf("%s: %s\n", STR_VU_EVENT_STRING, description_str); + print_formatted_var_size_str(STR_VU_DATA, pdata, data_size, fp); + } + } +} + +int parse_event_fifo(unsigned int fifo_num, unsigned char *pfifo_start, + struct json_object *pevent_fifos_object, unsigned char *pstring_buffer, + struct nvme_ocp_telemetry_offsets *poffsets, __u64 fifo_size, FILE *fp) +{ + if (NULL == pfifo_start || NULL == poffsets) { + nvme_show_error("Input buffer was NULL"); + return -1; + } + + int status = 0; + unsigned int event_fifo_number = fifo_num + 1; + char *description = (char *)malloc((40 + 1) * sizeof(char)); + + memset(description, 0, sizeof(40)); + + status = + parse_ocp_telemetry_string_log(event_fifo_number, 0, 0, EVENT_STRING, description); + + if (status != 0) { + nvme_show_error("Failed to get C9 String. status: %d\n", status); + return -1; + } + + char event_fifo_name[100] = {0}; + + snprintf(event_fifo_name, sizeof(event_fifo_name), "%s%d%s%s", "EVENT FIFO ", + event_fifo_number, " - ", description); + + struct json_object *pevent_fifo_array = NULL; + + if (pevent_fifos_object != NULL) + pevent_fifo_array = json_create_array(); + else { + char buffer[1024] = {0}; + + sprintf(buffer, "%s%s\n%s", STR_LINE, event_fifo_name, STR_LINE); + if (fp) + fprintf(fp, "%s", buffer); + else + printf("%s", buffer); + } + + int offset_to_move = 0; + unsigned int event_des_size = sizeof(struct nvme_ocp_telemetry_event_descriptor); + + while ((fifo_size > 0) && (offset_to_move < fifo_size)) { + struct nvme_ocp_telemetry_event_descriptor *pevent_descriptor = + (struct nvme_ocp_telemetry_event_descriptor *) + (pfifo_start + offset_to_move); + + if (pevent_descriptor != NULL && pevent_descriptor->event_data_size >= 0) { + //Data is present in the form of DWORDS, So multiplying with sizeof(DWORD) + unsigned int data_size = pevent_descriptor->event_data_size * + SIZE_OF_DWORD; + + __u8 *pevent_specific_data = (__u8 *)pevent_descriptor + event_des_size; + + char description_str[256] = ""; + + parse_ocp_telemetry_string_log(0, pevent_descriptor->event_id, + pevent_descriptor->debug_event_class_type, EVENT_STRING, + description_str); + + struct json_object *pevent_descriptor_obj = + ((pevent_fifos_object != NULL)?json_create_object():NULL); + + if (pevent_descriptor_obj != NULL) { + json_add_formatted_u32_str(pevent_descriptor_obj, + STR_DBG_EVENT_CLASS_TYPE, + pevent_descriptor->debug_event_class_type); + json_add_formatted_u32_str(pevent_descriptor_obj, + STR_EVENT_IDENTIFIER, pevent_descriptor->event_id); + json_object_add_value_string(pevent_descriptor_obj, + STR_EVENT_STRING, description_str); + json_add_formatted_u32_str(pevent_descriptor_obj, + STR_EVENT_DATA_SIZE, pevent_descriptor->event_data_size); + + if (pevent_descriptor->debug_event_class_type >= 0x80) + json_add_formatted_var_size_str(pevent_descriptor_obj, + STR_VU_DATA, pevent_specific_data, data_size); + } else { + if (fp) { + fprintf(fp, "%s: 0x%x\n", STR_DBG_EVENT_CLASS_TYPE, + pevent_descriptor->debug_event_class_type); + fprintf(fp, "%s: 0x%x\n", STR_EVENT_IDENTIFIER, + pevent_descriptor->event_id); + fprintf(fp, "%s: %s\n", STR_EVENT_STRING, description_str); + fprintf(fp, "%s: 0x%x\n", STR_EVENT_DATA_SIZE, + pevent_descriptor->event_data_size); + } else { + printf("%s: 0x%x\n", STR_DBG_EVENT_CLASS_TYPE, + pevent_descriptor->debug_event_class_type); + printf("%s: 0x%x\n", STR_EVENT_IDENTIFIER, + pevent_descriptor->event_id); + printf("%s: %s\n", STR_EVENT_STRING, description_str); + printf("%s: 0x%x\n", STR_EVENT_DATA_SIZE, + pevent_descriptor->event_data_size); + } + + if (pevent_descriptor->debug_event_class_type >= 0x80) + print_formatted_var_size_str(STR_VU_DATA, + pevent_specific_data, data_size, fp); + } + + switch (pevent_descriptor->debug_event_class_type) { + case TIME_STAMP_CLASS_TYPE: + parse_time_stamp_event(pevent_descriptor, pevent_descriptor_obj, + pevent_specific_data, pevent_fifos_object, fp); + break; + case PCIE_CLASS_TYPE: + parse_pcie_event(pevent_descriptor, pevent_descriptor_obj, + pevent_specific_data, pevent_fifos_object, fp); + break; + case NVME_CLASS_TYPE: + parse_nvme_event(pevent_descriptor, pevent_descriptor_obj, + pevent_specific_data, pevent_fifos_object, fp); + break; + case RESET_CLASS_TYPE: + case BOOT_SEQUENCE_CLASS_TYPE: + case FIRMWARE_ASSERT_CLASS_TYPE: + case TEMPERATURE_CLASS_TYPE: + case MEDIA_CLASS_TYPE: + parse_common_event(pevent_descriptor, pevent_descriptor_obj, + pevent_specific_data, pevent_fifos_object, fp); + break; + case MEDIA_WEAR_CLASS_TYPE: + parse_media_wear_event(pevent_descriptor, pevent_descriptor_obj, + pevent_specific_data, pevent_fifos_object, fp); + break; + case STATISTIC_SNAPSHOT_CLASS_TYPE: { + struct nvme_ocp_statistic_snapshot_evt_class_format + *pStaticSnapshotEvent = + (struct nvme_ocp_statistic_snapshot_evt_class_format *) + pevent_specific_data; + struct nvme_ocp_telemetry_statistic_descriptor *pstatistic_entry = + (struct nvme_ocp_telemetry_statistic_descriptor *) + (&pStaticSnapshotEvent->statisticDescriptorData); + + parse_statistic(pstatistic_entry, pevent_descriptor_obj, fp); + break; + } + case RESERVED_CLASS_TYPE: + default: + break; + } + + if (pevent_descriptor_obj != NULL && pevent_fifo_array != NULL) + json_array_add_value_object(pevent_fifo_array, pevent_descriptor_obj); + else { + if (fp) + fprintf(fp, STR_LINE2); + else + printf(STR_LINE2); + } + } else + break; + + offset_to_move += (pevent_descriptor->event_data_size * SIZE_OF_DWORD + event_des_size); + } + + if (pevent_fifos_object != NULL && pevent_fifo_array != NULL) + json_object_add_value_array(pevent_fifos_object, event_fifo_name, + pevent_fifo_array); + + free(description); + return 0; +} + +int parse_event_fifos(struct json_object *root, struct nvme_ocp_telemetry_offsets *poffsets, + FILE *fp) +{ + if (poffsets == NULL) { + nvme_show_error("Input buffer was NULL"); + return -1; + } + + struct json_object *pevent_fifos_object = NULL; + + if (root != NULL) + pevent_fifos_object = json_create_object(); + + __u8 *pda1_header_offset = ptelemetry_buffer + poffsets->da1_start_offset;//512 + __u8 *pda2_offset = ptelemetry_buffer + poffsets->da2_start_offset; + struct nvme_ocp_header_in_da1 *pda1_header = (struct nvme_ocp_header_in_da1 *) + pda1_header_offset; + struct nvme_ocp_event_fifo_data event_fifo[MAX_NUM_FIFOS]; + + for (int fifo_num = 0; fifo_num < MAX_NUM_FIFOS; fifo_num++) { + event_fifo[fifo_num].event_fifo_num = fifo_num; + event_fifo[fifo_num].event_fifo_da = pda1_header->event_fifo_da[fifo_num]; + event_fifo[fifo_num].event_fifo_start = + pda1_header->fifo_offsets[fifo_num].event_fifo_start; + event_fifo[fifo_num].event_fifo_size = + pda1_header->fifo_offsets[fifo_num].event_fifo_size; + } + + //Parse all the FIFOs DA wise + for (int fifo_no = 0; fifo_no < MAX_NUM_FIFOS; fifo_no++) { + if (event_fifo[fifo_no].event_fifo_da == poffsets->data_area) { + __u64 fifo_offset = + (event_fifo[fifo_no].event_fifo_start * SIZE_OF_DWORD); + __u64 fifo_size = + (event_fifo[fifo_no].event_fifo_size * SIZE_OF_DWORD); + __u8 *pfifo_start = NULL; + + if (event_fifo[fifo_no].event_fifo_da == 1) + pfifo_start = pda1_header_offset + fifo_offset; + else if (event_fifo[fifo_no].event_fifo_da == 2) + pfifo_start = pda2_offset + fifo_offset; + else { + nvme_show_error("Unsupported Data Area:[%d]", poffsets->data_area); + return -1; + } + + int status = parse_event_fifo(fifo_no, pfifo_start, pevent_fifos_object, + pstring_buffer, poffsets, fifo_size, fp); + + if (status != 0) { + nvme_show_error("Failed to parse Event FIFO. status:%d\n", status); + return -1; + } + } + } + + if (pevent_fifos_object != NULL && root != NULL) { + const char *data_area = (poffsets->data_area == 1 ? STR_DA_1_EVENT_FIFO_INFO : + STR_DA_2_EVENT_FIFO_INFO); + + json_object_add_value_array(root, data_area, pevent_fifos_object); + } + + return 0; +} + +int parse_statistic(struct nvme_ocp_telemetry_statistic_descriptor *pstatistic_entry, + struct json_object *pstats_array, FILE *fp) +{ + if (pstatistic_entry == NULL) { + nvme_show_error("Input buffer was NULL"); + return -1; + } + + unsigned int data_size = pstatistic_entry->statistic_data_size * SIZE_OF_DWORD; + __u8 *pdata = (__u8 *)pstatistic_entry + + sizeof(struct nvme_ocp_telemetry_statistic_descriptor); + char description_str[256] = ""; + + parse_ocp_telemetry_string_log(0, pstatistic_entry->statistic_id, 0, + STATISTICS_IDENTIFIER_STRING, description_str); + + if (pstats_array != NULL) { + struct json_object *pstatistics_object = json_create_object(); + + json_add_formatted_u32_str(pstatistics_object, STR_STATISTICS_IDENTIFIER, + pstatistic_entry->statistic_id); + json_object_add_value_string(pstatistics_object, STR_STATISTICS_IDENTIFIER_STR, + description_str); + json_add_formatted_u32_str(pstatistics_object, + STR_STATISTICS_INFO_BEHAVIOUR_TYPE, + pstatistic_entry->statistic_info_behaviour_type); + json_add_formatted_u32_str(pstatistics_object, STR_STATISTICS_INFO_RESERVED, + pstatistic_entry->statistic_info_reserved); + json_add_formatted_u32_str(pstatistics_object, STR_NAMESPACE_IDENTIFIER, + pstatistic_entry->ns_info_nsid); + json_add_formatted_u32_str(pstatistics_object, STR_NAMESPACE_INFO_VALID, + pstatistic_entry->ns_info_ns_info_valid); + json_add_formatted_u32_str(pstatistics_object, STR_STATISTICS_DATA_SIZE, + pstatistic_entry->statistic_data_size); + json_add_formatted_u32_str(pstatistics_object, STR_RESERVED, + pstatistic_entry->reserved); + json_add_formatted_var_size_str(pstatistics_object, STR_STATISTICS_SPECIFIC_DATA, + pdata, data_size); + + if (pstatistics_object != NULL) + json_array_add_value_object(pstats_array, pstatistics_object); + } else { + if (fp) { + fprintf(fp, "%s: 0x%x\n", STR_STATISTICS_IDENTIFIER, + pstatistic_entry->statistic_id); + fprintf(fp, "%s: %s\n", STR_STATISTICS_IDENTIFIER_STR, description_str); + fprintf(fp, "%s: 0x%x\n", STR_STATISTICS_INFO_BEHAVIOUR_TYPE, + pstatistic_entry->statistic_info_behaviour_type); + fprintf(fp, "%s: 0x%x\n", STR_STATISTICS_INFO_RESERVED, + pstatistic_entry->statistic_info_reserved); + fprintf(fp, "%s: 0x%x\n", STR_NAMESPACE_IDENTIFIER, + pstatistic_entry->ns_info_nsid); + fprintf(fp, "%s: 0x%x\n", STR_NAMESPACE_INFO_VALID, + pstatistic_entry->ns_info_ns_info_valid); + fprintf(fp, "%s: 0x%x\n", STR_STATISTICS_DATA_SIZE, + pstatistic_entry->statistic_data_size); + fprintf(fp, "%s: 0x%x\n", STR_RESERVED, pstatistic_entry->reserved); + print_formatted_var_size_str(STR_STATISTICS_SPECIFIC_DATA, pdata, + data_size, fp); + fprintf(fp, STR_LINE2); + } else { + printf("%s: 0x%x\n", STR_STATISTICS_IDENTIFIER, + pstatistic_entry->statistic_id); + printf("%s: %s\n", STR_STATISTICS_IDENTIFIER_STR, description_str); + printf("%s: 0x%x\n", STR_STATISTICS_INFO_BEHAVIOUR_TYPE, + pstatistic_entry->statistic_info_behaviour_type); + printf("%s: 0x%x\n", STR_STATISTICS_INFO_RESERVED, + pstatistic_entry->statistic_info_reserved); + printf("%s: 0x%x\n", STR_NAMESPACE_IDENTIFIER, + pstatistic_entry->ns_info_nsid); + printf("%s: 0x%x\n", STR_NAMESPACE_INFO_VALID, + pstatistic_entry->ns_info_ns_info_valid); + printf("%s: 0x%x\n", STR_STATISTICS_DATA_SIZE, + pstatistic_entry->statistic_data_size); + printf("%s: 0x%x\n", STR_RESERVED, pstatistic_entry->reserved); + print_formatted_var_size_str(STR_STATISTICS_SPECIFIC_DATA, pdata, + data_size, fp); + printf(STR_LINE2); + } + } + + return 0; +} + +int parse_statistics(struct json_object *root, struct nvme_ocp_telemetry_offsets *poffsets, + FILE *fp) +{ + if (poffsets == NULL) { + nvme_show_error("Input buffer was NULL"); + return -1; + } + + __u8 *pda1_ocp_header_offset = ptelemetry_buffer + poffsets->header_size;//512 + __u32 statistics_size = 0; + __u32 stats_da_1_start_dw = 0, stats_da_1_size_dw = 0; + __u32 stats_da_2_start_dw = 0, stats_da_2_size_dw = 0; + __u8 *pstats_offset = NULL; + + if (poffsets->data_area == 1) { + __u32 stats_da_1_start = *(__u32 *)(pda1_ocp_header_offset + + offsetof(struct nvme_ocp_header_in_da1, da1_statistic_start)); + __u32 stats_da_1_size = *(__u32 *)(pda1_ocp_header_offset + + offsetof(struct nvme_ocp_header_in_da1, da1_statistic_size)); + + //Data is present in the form of DWORDS, So multiplying with sizeof(DWORD) + stats_da_1_start_dw = (stats_da_1_start * SIZE_OF_DWORD); + stats_da_1_size_dw = (stats_da_1_size * SIZE_OF_DWORD); + + pstats_offset = pda1_ocp_header_offset + stats_da_1_start_dw; + statistics_size = stats_da_1_size_dw; + } else if (poffsets->data_area == 2) { + __u32 stats_da_2_start = *(__u32 *)(pda1_ocp_header_offset + + offsetof(struct nvme_ocp_header_in_da1, da2_statistic_start)); + __u32 stats_da_2_size = *(__u32 *)(pda1_ocp_header_offset + + offsetof(struct nvme_ocp_header_in_da1, da2_statistic_size)); + + stats_da_2_start_dw = (stats_da_2_start * SIZE_OF_DWORD); + stats_da_2_size_dw = (stats_da_2_size * SIZE_OF_DWORD); + + pstats_offset = pda1_ocp_header_offset + poffsets->da1_size + stats_da_2_start_dw; + statistics_size = stats_da_2_size_dw; + } else { + nvme_show_error("Unsupported Data Area:[%d]", poffsets->data_area); + return -1; + } + + struct json_object *pstats_array = ((root != NULL) ? json_create_array() : NULL); + + __u32 stat_des_size = sizeof(struct nvme_ocp_telemetry_statistic_descriptor);//8 + __u32 offset_to_move = 0; + + while (((statistics_size > 0) && (offset_to_move < statistics_size))) { + struct nvme_ocp_telemetry_statistic_descriptor *pstatistic_entry = + (struct nvme_ocp_telemetry_statistic_descriptor *) + (pstats_offset + offset_to_move); + + parse_statistic(pstatistic_entry, pstats_array, fp); + offset_to_move += (pstatistic_entry->statistic_data_size * SIZE_OF_DWORD + + stat_des_size); + } + + if (root != NULL && pstats_array != NULL) { + const char *pdata_area = + (poffsets->data_area == 1 ? STR_DA_1_STATS : STR_DA_2_STATS); + + json_object_add_value_array(root, pdata_area, pstats_array); + } + + return 0; +} + +int print_ocp_telemetry_normal(char *output_file) +{ + int status = 0; + + if (output_file != NULL) { + FILE *fp = fopen(output_file, "w"); + + if (fp) { + fprintf(fp, STR_LINE); + fprintf(fp, "%s\n", STR_LOG_PAGE_HEADER); + fprintf(fp, STR_LINE); + print_micron_vs_logs(ptelemetry_buffer, host_log_page_header, + ARRAY_SIZE(host_log_page_header), NULL, 0, fp); + + fprintf(fp, STR_LINE); + fprintf(fp, "%s\n", STR_REASON_IDENTIFIER); + fprintf(fp, STR_LINE); + __u8 *preason_identifier_offset = ptelemetry_buffer + + offsetof(struct nvme_ocp_telemetry_host_initiated_header, + reason_id); + + print_micron_vs_logs(preason_identifier_offset, reason_identifier, + ARRAY_SIZE(reason_identifier), NULL, 0, fp); + + fprintf(fp, STR_LINE); + fprintf(fp, "%s\n", STR_TELEMETRY_HOST_DATA_BLOCK_1); + fprintf(fp, STR_LINE); + + //Set DA to 1 and get offsets + struct nvme_ocp_telemetry_offsets offsets = { 0 }; + + offsets.data_area = 1; + + struct nvme_ocp_telemetry_common_header *ptelemetry_common_header = + (struct nvme_ocp_telemetry_common_header *) ptelemetry_buffer; + + get_telemetry_das_offset_and_size(ptelemetry_common_header, &offsets); + + __u8 *pda1_header_offset = ptelemetry_buffer + + offsets.da1_start_offset;//512 + + print_micron_vs_logs(pda1_header_offset, ocp_header_in_da1, + ARRAY_SIZE(ocp_header_in_da1), NULL, 0, fp); + + fprintf(fp, STR_LINE); + fprintf(fp, "%s\n", STR_SMART_HEALTH_INFO); + fprintf(fp, STR_LINE); + __u8 *pda1_smart_offset = pda1_header_offset + + offsetof(struct nvme_ocp_header_in_da1, smart_health_info); + //512+512 =1024 + + print_micron_vs_logs(pda1_smart_offset, smart, ARRAY_SIZE(smart), + NULL, 0, fp); + + fprintf(fp, STR_LINE); + fprintf(fp, "%s\n", STR_SMART_HEALTH_INTO_EXTENDED); + fprintf(fp, STR_LINE); + __u8 *pda1_smart_ext_offset = pda1_header_offset + + offsetof(struct nvme_ocp_header_in_da1, + smart_health_info_extended); + + print_micron_vs_logs(pda1_smart_ext_offset, smart_extended, + ARRAY_SIZE(smart_extended), NULL, 0, fp); + + fprintf(fp, STR_LINE); + fprintf(fp, "%s\n", STR_DA_1_STATS); + fprintf(fp, STR_LINE); + + status = parse_statistics(NULL, &offsets, fp); + if (status != 0) { + nvme_show_error("status: %d\n", status); + return -1; + } + + fprintf(fp, STR_LINE); + fprintf(fp, "%s\n", STR_DA_1_EVENT_FIFO_INFO); + fprintf(fp, STR_LINE); + status = parse_event_fifos(NULL, &offsets, fp); + if (status != 0) { + nvme_show_error("status: %d\n", status); + return -1; + } + + //Set the DA to 2 + offsets.data_area = 2; + + fprintf(fp, STR_LINE); + fprintf(fp, "%s\n", STR_DA_2_STATS); + fprintf(fp, STR_LINE); + status = parse_statistics(NULL, &offsets, fp); + + if (status != 0) { + nvme_show_error("status: %d\n", status); + return -1; + } + + fprintf(fp, STR_LINE); + fprintf(fp, "%s\n", STR_DA_2_EVENT_FIFO_INFO); + fprintf(fp, STR_LINE); + status = parse_event_fifos(NULL, &offsets, fp); + if (status != 0) { + nvme_show_error("status: %d\n", status); + return -1; + } + + fprintf(fp, STR_LINE); + + fclose(fp); + } else { + nvme_show_error("Failed to open %s file.\n", output_file); + return -1; + } + } else { + printf(STR_LINE); + printf("%s\n", STR_LOG_PAGE_HEADER); + printf(STR_LINE); + print_micron_vs_logs(ptelemetry_buffer, host_log_page_header, + ARRAY_SIZE(host_log_page_header), NULL, 0, NULL); + + printf(STR_LINE); + printf("%s\n", STR_REASON_IDENTIFIER); + printf(STR_LINE); + __u8 *preason_identifier_offset = ptelemetry_buffer + + offsetof(struct nvme_ocp_telemetry_host_initiated_header, reason_id); + print_micron_vs_logs(preason_identifier_offset, reason_identifier, + ARRAY_SIZE(reason_identifier), NULL, 0, NULL); + + printf(STR_LINE); + printf("%s\n", STR_TELEMETRY_HOST_DATA_BLOCK_1); + printf(STR_LINE); + + //Set DA to 1 and get offsets + struct nvme_ocp_telemetry_offsets offsets = { 0 }; + + offsets.data_area = 1; + + struct nvme_ocp_telemetry_common_header *ptelemetry_common_header = + (struct nvme_ocp_telemetry_common_header *) ptelemetry_buffer; + + get_telemetry_das_offset_and_size(ptelemetry_common_header, &offsets); + + __u8 *pda1_header_offset = ptelemetry_buffer + offsets.da1_start_offset;//512 + + print_micron_vs_logs(pda1_header_offset, ocp_header_in_da1, + ARRAY_SIZE(ocp_header_in_da1), NULL, 0, NULL); + + printf(STR_LINE); + printf("%s\n", STR_SMART_HEALTH_INFO); + printf(STR_LINE); + __u8 *pda1_smart_offset = pda1_header_offset + + offsetof(struct nvme_ocp_header_in_da1, smart_health_info); + + print_micron_vs_logs(pda1_smart_offset, smart, ARRAY_SIZE(smart), NULL, 0, NULL); + + printf(STR_LINE); + printf("%s\n", STR_SMART_HEALTH_INTO_EXTENDED); + printf(STR_LINE); + __u8 *pda1_smart_ext_offset = pda1_header_offset + + offsetof(struct nvme_ocp_header_in_da1, smart_health_info_extended); + + print_micron_vs_logs(pda1_smart_ext_offset, smart_extended, + ARRAY_SIZE(smart_extended), NULL, 0, NULL); + + printf(STR_LINE); + printf("%s\n", STR_DA_1_STATS); + printf(STR_LINE); + status = parse_statistics(NULL, &offsets, NULL); + if (status != 0) { + nvme_show_error("status: %d\n", status); + return -1; + } + + printf(STR_LINE); + printf("%s\n", STR_DA_1_EVENT_FIFO_INFO); + printf(STR_LINE); + status = parse_event_fifos(NULL, &offsets, NULL); + if (status != 0) { + nvme_show_error("status: %d\n", status); + return -1; + } + + //Set the DA to 2 + offsets.data_area = 2; + + printf(STR_LINE); + printf("%s\n", STR_DA_2_STATS); + printf(STR_LINE); + status = parse_statistics(NULL, &offsets, NULL); + if (status != 0) { + nvme_show_error("status: %d\n", status); + return -1; + } + + printf(STR_LINE); + printf("%s\n", STR_DA_2_EVENT_FIFO_INFO); + printf(STR_LINE); + status = parse_event_fifos(NULL, &offsets, NULL); + if (status != 0) { + nvme_show_error("status: %d\n", status); + return -1; + } + + printf(STR_LINE); + } + + return status; +} + +int print_ocp_telemetry_json(char *output_file) +{ + int status = 0; + + //create json objects + struct json_object *root, *pheader, *preason_identifier, *da1_header, *smart_obj, + *ext_smart_obj; + + root = json_create_object(); + + //Add data to root json object + + //"Log Page Header" + pheader = json_create_object(); + + print_micron_vs_logs(ptelemetry_buffer, host_log_page_header, + ARRAY_SIZE(host_log_page_header), pheader, 0, NULL); + json_object_add_value_object(root, STR_LOG_PAGE_HEADER, pheader); + + //"Reason Identifier" + preason_identifier = json_create_object(); + + __u8 *preason_identifier_offset = ptelemetry_buffer + + offsetof(struct nvme_ocp_telemetry_host_initiated_header, reason_id); + + print_micron_vs_logs(preason_identifier_offset, reason_identifier, + ARRAY_SIZE(reason_identifier), preason_identifier, 0, NULL); + json_object_add_value_object(pheader, STR_REASON_IDENTIFIER, preason_identifier); + + struct nvme_ocp_telemetry_offsets offsets = { 0 }; + + //Set DA to 1 and get offsets + offsets.data_area = 1; + struct nvme_ocp_telemetry_common_header *ptelemetry_common_header = + (struct nvme_ocp_telemetry_common_header *) ptelemetry_buffer; + + get_telemetry_das_offset_and_size(ptelemetry_common_header, &offsets); + + //"Telemetry Host-Initiated Data Block 1" + __u8 *pda1_header_offset = ptelemetry_buffer + offsets.da1_start_offset;//512 + + da1_header = json_create_object(); + + print_micron_vs_logs(pda1_header_offset, ocp_header_in_da1, ARRAY_SIZE(ocp_header_in_da1), + da1_header, 0, NULL); + json_object_add_value_object(root, STR_TELEMETRY_HOST_DATA_BLOCK_1, da1_header); + + //"SMART / Health Information Log(LID-02h)" + __u8 *pda1_smart_offset = pda1_header_offset + offsetof(struct nvme_ocp_header_in_da1, + smart_health_info); + smart_obj = json_create_object(); + + print_micron_vs_logs(pda1_smart_offset, smart, ARRAY_SIZE(smart), smart_obj, 0, NULL); + json_object_add_value_object(da1_header, STR_SMART_HEALTH_INFO, smart_obj); + + //"SMART / Health Information Extended(LID-C0h)" + __u8 *pda1_smart_ext_offset = pda1_header_offset + offsetof(struct nvme_ocp_header_in_da1, + smart_health_info_extended); + ext_smart_obj = json_create_object(); + + print_micron_vs_logs(pda1_smart_ext_offset, smart_extended, ARRAY_SIZE(smart_extended), + ext_smart_obj, 0, NULL); + json_object_add_value_object(da1_header, STR_SMART_HEALTH_INTO_EXTENDED, ext_smart_obj); + + //Data Area 1 Statistics + status = parse_statistics(root, &offsets, NULL); + if (status != 0) { + nvme_show_error("status: %d\n", status); + return -1; + } + + //Data Area 1 Event FIFOs + status = parse_event_fifos(root, &offsets, NULL); + if (status != 0) { + nvme_show_error("status: %d\n", status, NULL); + return -1; + } + + //Set the DA to 2 + offsets.data_area = 2; + + //Data Area 2 Statistics + status = parse_statistics(root, &offsets, NULL); + if (status != 0) { + nvme_show_error("status: %d\n", status); + return -1; + } + + //Data Area 2 Event FIFOs + status = parse_event_fifos(root, &offsets, NULL); + if (status != 0) { + nvme_show_error("status: %d\n", status); + return -1; + } + + if (output_file != NULL) { + const char *json_string = json_object_to_json_string(root); + FILE *fp = fopen(output_file, "w"); + + if (fp) { + fputs(json_string, fp); + fclose(fp); + } else { + nvme_show_error("Failed to open %s file.\n", output_file); + return -1; + } + } else { + //Print root json object + json_print_object(root, NULL); + nvme_show_result("\n"); + json_free_object(root); + } + + return status; +} + +int parse_ocp_telemetry_log(struct ocp_telemetry_parse_options *options) +{ + int status = 0; + long telemetry_buffer_size = 0; + long string_buffer_size = 0; + enum nvme_print_flags fmt; + unsigned char log_id; + + // Read the data from the telemetry binary file + ptelemetry_buffer = + read_binary_file(NULL, options->telemetry_log, &telemetry_buffer_size, 1); + if (ptelemetry_buffer == NULL) { + nvme_show_error("Failed to read telemetry bin file.\n"); + return -1; + } + + log_id = ptelemetry_buffer[0]; + if ((log_id != NVME_HOST_TELEMETRY_LOG) && (log_id != NVME_CNTRL_TELEMETRY_LOG)) { + nvme_show_error("Invalid LogPageId [0x%02X]\n", log_id); + return -1; + } + + // Read the data from the string binary file + pstring_buffer = read_binary_file(NULL, options->string_log, &string_buffer_size, 1); + if (pstring_buffer == NULL) { + nvme_show_error("Failed to read string log bin file.\n"); + return -1; + } + + status = validate_output_format(options->output_fmt, &fmt); + if (status < 0) { + nvme_show_error("Invalid output format\n"); + return status; + } + + switch (fmt) { + case NORMAL: + print_ocp_telemetry_normal(options->output_file); + break; + case JSON: + print_ocp_telemetry_json(options->output_file); + break; + default: + break; + } + + return 0; +} diff --git a/plugins/micron/micron-ocp-telemetry.h b/plugins/micron/micron-ocp-telemetry.h new file mode 100644 index 0000000000..96eefa9b15 --- /dev/null +++ b/plugins/micron/micron-ocp-telemetry.h @@ -0,0 +1,609 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Copyright (c) Micron, Inc 2024. + * + * @file: micron-ocp-telemetry.h + * @brief: This module contains all the constructs needed for parsing + * (or) decoding ocp telemetry log files. + * @author: Chaithanya Shoba + */ + +#include "nvme.h" +#include "nvme-print.h" +#include "micron-utils.h" +#include "common.h" + +#define DATA_SIZE_12 12 +#define DATA_SIZE_8 8 +#define DATA_SIZE_4 4 +#define NVME_HOST_TELEMETRY_LOG 0x07 +#define NVME_CNTRL_TELEMETRY_LOG 0x08 +#define MAX_BUFFER_32_KB 0x8000 +#define OCP_TELEMETRY_DATA_BLOCK_SIZE 512 +#define SIZE_OF_DWORD 4 +#define MAX_NUM_FIFOS 16 +#define DA1_OFFSET 512 +#define DEFAULT_ASCII_STRING_SIZE 16 + +#define STR_LOG_PAGE_HEADER "Log Page Header" +#define STR_REASON_IDENTIFIER "Reason Identifier" +#define STR_TELEMETRY_HOST_DATA_BLOCK_1 "Telemetry Host-Initiated Data Block 1" +#define STR_SMART_HEALTH_INFO "SMART / Health Information Log(LID-02h)" +#define STR_SMART_HEALTH_INTO_EXTENDED "SMART / Health Information Extended(LID-C0h)" +#define STR_DA_1_STATS "Data Area 1 Statistics" +#define STR_DA_2_STATS "Data Area 2 Statistics" +#define STR_DA_1_EVENT_FIFO_INFO "Data Area 1 Event FIFO info" +#define STR_DA_2_EVENT_FIFO_INFO "Data Area 2 Event FIFO info" +#define STR_STATISTICS_IDENTIFIER "Statistics Identifier" +#define STR_STATISTICS_IDENTIFIER_STR "Statistic Identifier String" +#define STR_STATISTICS_INFO_BEHAVIOUR_TYPE "Statistics Info Behavior Type" +#define STR_STATISTICS_INFO_RESERVED "Statistics Info Reserved" +#define STR_NAMESPACE_IDENTIFIER "Namespace Identifier" +#define STR_NAMESPACE_INFO_VALID "Namespace Information Valid" +#define STR_STATISTICS_DATA_SIZE "Statistic Data Size" +#define STR_RESERVED "Reserved" +#define STR_STATISTICS_SPECIFIC_DATA "Statistic Specific Data" +#define STR_CLASS_SPECIFIC_DATA "Class Specific Data" +#define STR_DBG_EVENT_CLASS_TYPE "Debug Event Class type" +#define STR_EVENT_IDENTIFIER "Event Identifier" +#define STR_EVENT_STRING "Event String" +#define STR_EVENT_DATA_SIZE "Event Data Size" +#define STR_VU_EVENT_STRING "VU Event String" +#define STR_VU_EVENT_ID_STRING "VU Event Identifier" +#define STR_VU_DATA "VU Data" +#define STR_LINE "==============================================================================\n" +#define STR_LINE2 "-----------------------------------------------------------------------------\n" + +struct __packed nvme_ocp_telemetry_reason_id +{ + __u8 error_id[64]; // Bytes 63:00 + __u8 file_id[8]; // Bytes 71:64 + __le16 line_number; // Bytes 73:72 + __u8 valid_flags; // Bytes 74 + __u8 reserved[21]; // Bytes 95:75 + __u8 vu_reason_ext[32]; // Bytes 127:96 +}; + +struct __packed nvme_ocp_telemetry_common_header +{ + __u8 log_id; // Byte 00 + __le32 reserved1; // Bytes 04:01 + __u8 ieee_oui_id[3]; // Bytes 07:05 + __le16 da1_last_block; // Bytes 09:08 + __le16 da2_last_block; // Bytes 11:10 + __le16 da3_last_block; // Bytes 13:12 + __le16 reserved2; // Bytes 15:14 + __le32 da4_last_block; // Bytes 19:16 +}; + +struct __packed nvme_ocp_telemetry_host_initiated_header +{ + struct nvme_ocp_telemetry_common_header commonHeader; // Bytes 19:00 + __u8 reserved3[360]; // Bytes 379:20 + __u8 host_initiated_scope; // Byte 380 + __u8 host_initiated_gen_number; // Byte 381 + __u8 host_initiated_data_available; // Byte 382 + __u8 ctrl_initiated_gen_number; // Byte 383 + struct nvme_ocp_telemetry_reason_id reason_id; // Bytes 511:384 +}; + +struct __packed nvme_ocp_telemetry_controller_initiated_header +{ + struct nvme_ocp_telemetry_common_header commonHeader; // Bytes 19:00 + __u8 reserved3[361]; // Bytes 380:20 + __u8 ctrl_initiated_scope; // Byte 381 + __u8 ctrl_initiated_data_available; // Byte 382 + __u8 ctrl_initiated_gen_number; // Byte 383 + struct nvme_ocp_telemetry_reason_id reason_id; // Bytes 511:384 +}; + +struct __packed nvme_ocp_telemetry_smart +{ + __u8 critical_warning; // Byte 0 + __le16 composite_temperature; // Bytes 2:1 + __u8 available_spare; // Bytes 3 + __u8 available_spare_threshold; // Bytes 4 + __u8 percentage_used; // Bytes 5 + __u8 reserved1[26]; // Bytes 31:6 + __u8 data_units_read[16]; // Bytes 47:32 + __u8 data_units_written[16]; // Bytes 63:48 + __u8 host_read_commands[16]; // Byte 79:64 + __u8 host_write_commands[16]; // Bytes 95:80 + __u8 controller_busy_time[16]; // Bytes 111:96 + __u8 power_cycles[16]; // Bytes 127:112 + __u8 power_on_hours[16]; // Bytes 143:128 + __u8 unsafe_shutdowns[16]; // Bytes 159:144 + __u8 media_and_data_integrity_errors[16]; // Bytes 175:160 + __u8 number_of_error_information_log_entries[16]; // Bytes 191:176 + __le32 warning_composite_temperature_time; // Byte 195:192 + __le32 critical_composite_temperature_time; // Bytes 199:196 + __le16 temperature_sensor1; // Bytes 201:200 + __le16 temperature_sensor2; // Byte 203:202 + __le16 temperature_sensor3; // Byte 205:204 + __le16 temperature_sensor4; // Bytes 207:206 + __le16 temperature_sensor5; // Bytes 209:208 + __le16 temperature_sensor6; // Bytes 211:210 + __le16 temperature_sensor7; // Bytes 213:212 + __le16 temperature_sensor8; // Bytes 215:214 + __le32 thermal_management_temperature1_transition_count; // Bytes 219:216 + __le32 thermal_management_temperature2_transition_count; // Bytes 223:220 + __le32 total_time_for_thermal_management_temperature1; // Bytes 227:224 + __le32 total_time_for_thermal_management_temperature2; // Bytes 231:228 + __u8 reserved2[280]; // Bytes 511:232 +}; + +struct __packed nvme_ocp_telemetry_smart_extended +{ + __u8 physical_media_units_written[16]; // Bytes 15:0 + __u8 physical_media_units_read[16]; // Bytes 31:16 + __u8 bad_user_nand_blocks_raw_count[6]; // Bytes 37:32 + __le16 bad_user_nand_blocks_normalized_value; // Bytes 39:38 + __u8 bad_system_nand_blocks_raw_count[6]; // Bytes 45:40 + __le16 bad_system_nand_blocks_normalized_value; // Bytes 47:46 + __le64 xor_recovery_count; // Bytes 55:48 + __le64 uncorrectable_read_error_count; // Bytes 63:56 + __le64 soft_ecc_error_count; // Bytes 71:64 + __le32 end_to_end_correction_counts_detected_errors; // Bytes 75:72 + __le32 end_to_end_correction_counts_corrected_errors; // Bytes 79:76 + __u8 system_data_percent_used; // Byte 80 + __u8 refresh_counts[7]; // Bytes 87:81 + __le32 max_user_data_erase_count; // Bytes 91:88 + __le32 min_user_data_erase_count; // Bytes 95:92 + __u8 num_thermal_throttling_events; // Bytes 96 + __u8 current_throttling_status; // Bytes 97 + __u8 errata_version_field; // Byte 98 + __le16 point_version_field; // Byte 100:99 + __le16 minor_version_field; // Byte 102:101 + __u8 major_version_field; // Byte 103 + __le64 pcie_correctable_error_count; // Bytes 111:104 + __le32 incomplete_shutdowns; // Bytes 115:112 + __le32 reserved1; // Bytes 119:116 + __u8 percent_free_blocks; // Byte 120 + __u8 reserved2[7]; // Bytes 127:121 + __le16 capacitor_health; // Bytes 129:128 + __u8 nvme_base_errata_version; // Byte 130 + __u8 nvme_command_set_errata_version; // Byte 131 + __le32 reserved3; // Bytes 135:132 + __le64 unaligned_io; // Bytes 143:136 + __le64 security_version_number; // Bytes 151:144 + __le64 total_nuse; // Bytes 159:152 + __u8 plp_start_count[16]; // Bytes 175:160 + __u8 endurance_estimate[16]; // Bytes 191:176 + __le64 pcie_link_retraining_count; // Bytes 199:192 + __le64 power_state_change_count; // Bytes 207:200 + __le64 lowest_permitted_firmware_revision; // Bytes 215:208 + __u8 reserved4[278]; // Bytes 493:216 + __le16 log_page_version; // Bytes 495:494 + __u8 log_page_guid[16]; // Bytes 511:496 +}; + +struct __packed nvme_ocp_event_fifo_data +{ + __le32 event_fifo_num; + __u8 event_fifo_da; + __le64 event_fifo_start; + __le64 event_fifo_size; +}; + +struct __packed nvme_ocp_telemetry_offsets +{ + __le32 data_area; + __le32 header_size; + __le32 da1_start_offset; + __le32 da1_size; + __le32 da2_start_offset; + __le32 da2_size; + __le32 da3_start_offset; + __le32 da3_size; + __le32 da4_start_offset; + __le32 da4_size; +}; + +struct __packed nvme_ocp_event_fifo_offsets +{ + __le64 event_fifo_start; + __le64 event_fifo_size; +}; + +struct __packed nvme_ocp_header_in_da1 +{ + __le16 major_version; // Bytes 1:0 + __le16 minor_version; // Bytes 3:2 + __le32 reserved1; // Bytes 7:4 + __le64 time_stamp; // Bytes 15:8 + __u8 log_page_guid[16]; // Bytes 31:16 + __u8 num_telemetry_profiles_supported; // Byte 32 + __u8 telemetry_profile_selected; // Byte 33 + __u8 reserved2[6]; // Bytes 39:34 + __le64 string_log_size; // Bytes 47:40 + __le64 reserved3; // Bytes 55:48 + __le64 firmware_revision; // Bytes 63:56 + __u8 reserved4[32]; // Bytes 95:64 + __le64 da1_statistic_start; // Bytes 103:96 + __le64 da1_statistic_size; // Bytes 111:104 + __le64 da2_statistic_start; // Bytes 119:112 + __le64 da2_statistic_size; // Bytes 127:120 + __u8 reserved5[32]; // Bytes 159:128 + __u8 event_fifo_da[16]; // Bytes 175:160 + struct nvme_ocp_event_fifo_offsets fifo_offsets[16]; // Bytes 431:176 + __u8 reserved6[80]; // Bytes 511:432 + struct nvme_ocp_telemetry_smart smart_health_info; // Bytes 1023:512 + struct nvme_ocp_telemetry_smart_extended smart_health_info_extended; // Bytes 1535:1024 +}; + +struct __packed nvme_ocp_telemetry_statistic_descriptor +{ + __le16 statistic_id; // Bytes 1:0 + __u8 statistic_info_behaviour_type : 4; // Byte 2(3:0) + __u8 statistic_info_reserved : 4; // Byte 2(7:4) + __u8 ns_info_nsid : 7; // Bytes 3(6:0) + __u8 ns_info_ns_info_valid : 1; // Bytes 3(7) + __le16 statistic_data_size; // Bytes 5:4 + __le16 reserved; // Bytes 7:6 +}; + +struct __packed nvme_ocp_telemetry_event_descriptor +{ + __u8 debug_event_class_type; // Byte 0 + __le16 event_id; // Bytes 2:1 + __u8 event_data_size; // Byte 3 +}; + +struct __packed nvme_ocp_time_stamp_dbg_evt_class_format +{ + __u8 time_stamp[DATA_SIZE_8]; // Bytes 11:4 + __le16 vu_event_identifier; // Bytes 13:12 +}; + +struct __packed nvme_ocp_pcie_dbg_evt_class_format +{ + __u8 pCIeDebugEventData[DATA_SIZE_4]; // Bytes 7:4 + __le16 vu_event_identifier; // Bytes 9:8 +}; + +struct __packed nvme_ocp_nvme_dbg_evt_class_format +{ + __u8 nvmeDebugEventData[DATA_SIZE_8]; // Bytes 11:4 + __le16 vu_event_identifier; // Bytes 13:12 +}; + +struct __packed nvme_ocp_common_dbg_evt_class_format +{ + __le16 vu_event_identifier; // Bytes 5:4 +}; + +struct __packed nvme_ocp_media_wear_dbg_evt_class_format +{ + __u8 currentMediaWear[DATA_SIZE_12]; // Bytes 15:4 + __le16 vu_event_identifier; // Bytes 17:16 +}; + +struct __packed nvme_ocp_statistic_snapshot_evt_class_format +{ + struct nvme_ocp_telemetry_statistic_descriptor statisticDescriptorData; // Bytes 11:10 +}; + +struct __packed nvme_ocp_statistics_identifier_string_table +{ + __le16 vs_statistic_identifier; //1:0 + __u8 reserved1; //2 + __u8 ascii_id_length; //3 + __le64 ascii_id_offset; //11:4 + __le32 reserved2; //15:12 +}; + +struct __packed nvme_ocp_event_string_table +{ + __u8 debug_event_class; //0 + __le16 event_identifier; //2:1 + __u8 ascii_id_length; //3 + __le64 ascii_id_offset; //11:4 + __le32 reserved; //15:12 +}; + +struct __packed nvme_ocp_vu_event_string_table +{ + __u8 debug_event_class; //0 + __le16 vu_event_identifier; //2:1 + __u8 ascii_id_length; //3 + __le64 ascii_id_offset; //11:4 + __le32 reserved; //15:12 +}; + +struct __packed nvme_ocp_telemetry_string_header +{ + __u8 version; //0:0 + __u8 reserved1[15]; //15:1 + __u8 guid[16]; //32:16 + __le64 string_log_size; //39:32 + __u8 reserved2[24]; //63:40 + __le64 sits; //71:64 Statistics Identifier String Table Start(SITS) + __le64 sitsz; //79:72 Statistics Identifier String Table Size (SITSZ) + __le64 ests; //87:80 Event String Table Start(ESTS) + __le64 estsz; //95:88 Event String Table Size(ESTSZ) + __le64 vu_ests; //103:96 VU Event String Table Start + __le64 vu_estsz; //111:104 VU Event String Table Size + __le64 ascts; //119:112 ASCII Table start + __le64 asctsz; //127:120 ASCII Table Size + __u8 fifo_ascii_string[16][16]; //383:128 + __u8 reserved3[48]; //431:384 +}; + +struct __packed statistic_entry { + int identifier; + char *description; +}; + +struct __packed ocp_telemetry_parse_options { + char *telemetry_log; + char *string_log; + char *output_file; + char *output_fmt; +}; + +/** + * enum ocp_telemetry_data_area - Telemetry Data Areas + * @DATA_AREA_1: Data Area 1 + * @DATA_AREA_2: Data Area 2 + * @DATA_AREA_3: Data Area 3 + * @DATA_AREA_4: Data Area 4 + */ +enum ocp_telemetry_data_area { + DATA_AREA_1 = 0x01, + DATA_AREA_2 = 0x02, + DATA_AREA_3 = 0x03, + DATA_AREA_4 = 0x04, +}; + +/** + * enum ocp_telemetry_string_tables - OCP telemetry string tables + * @STATISTICS_IDENTIFIER_STRING: Statistic Identifier string + * @EVENT_STRING: Event String + * @VU_EVENT_STRING: VU Event String + */ +enum ocp_telemetry_string_tables { + STATISTICS_IDENTIFIER_STRING = 0, + EVENT_STRING, + VU_EVENT_STRING +}; + +/** + * enum ocp_telemetry_debug_event_class_types - OCP Debug Event Class types + * @RESERVED_CLASS_TYPE: Reserved class + * @TIME_STAMP_CLASS_TYPE: Time stamp class + * @PCIE_CLASS_TYPE: PCIe class + * @NVME_CLASS_TYPE: NVME class + * @RESET_CLASS_TYPE: Reset class + * @BOOT_SEQUENCE_CLASS_TYPE: Boot Sequence class + * @FIRMWARE_ASSERT_CLASS_TYPE: Firmware Assert class + * @TEMPERATURE_CLASS_TYPE: Temperature class + * @MEDIA_CLASS_TYPE: Media class + * @MEDIA_WEAR_CLASS_TYPE: Media wear class + * @STATISTIC_SNAPSHOT_CLASS_TYPE: Statistic snapshot class + * @RESERVED: Reserved class + * @VENDOR_UNIQUE_CLASS_TYPE: Vendor Unique class + */ +enum ocp_telemetry_debug_event_class_types { + RESERVED_CLASS_TYPE = 0x00, + TIME_STAMP_CLASS_TYPE = 0x01, + PCIE_CLASS_TYPE = 0x02, + NVME_CLASS_TYPE = 0x03, + RESET_CLASS_TYPE = 0x04, + BOOT_SEQUENCE_CLASS_TYPE = 0x05, + FIRMWARE_ASSERT_CLASS_TYPE = 0x06, + TEMPERATURE_CLASS_TYPE = 0x07, + MEDIA_CLASS_TYPE = 0x08, + MEDIA_WEAR_CLASS_TYPE = 0x09, + STATISTIC_SNAPSHOT_CLASS_TYPE = 0x0A, + //RESERVED = 7Fh-0Bh, + //VENDOR_UNIQUE_CLASS_TYPE = FFh-80h, +}; + +/** + * @brief parse the ocp telemetry host or controller log binary file + * into json or text + * + * @param options, input pointer for inputs like telemetry log bin file, + * string log bin file and output file etc. + * + * @return 0 success + */ +int parse_ocp_telemetry_log(struct ocp_telemetry_parse_options *options); + +/** + * @brief parse the ocp telemetry string log binary file to json or text + * + * @param event_fifo_num, input event FIFO number + * @param debug_event_class, input debug event class id + * @param string_table, input string table + * @param description, input description string + * + * @return 0 success + */ +int parse_ocp_telemetry_string_log(int event_fifo_num, int identifier, int debug_event_class, + enum ocp_telemetry_string_tables string_table, char *description); + +/** + * @brief gets the telemetry datas areas, offsets and sizes information + * + * @param ptelemetry_common_header, input telemetry common header pointer + * @param ptelemetry_das_offset, input telemetry offsets pointer + * + * @return 0 success + */ +int get_telemetry_das_offset_and_size( + struct nvme_ocp_telemetry_common_header *ptelemetry_common_header, + struct nvme_ocp_telemetry_offsets *ptelemetry_das_offset); + +/** + * @brief parses statistics data to text or json formats + * + * @param root, input time json root object pointer + * @param ptelemetry_das_offset, input telemetry offsets pointer + * @param fp, input file pointer + * + * @return 0 success + */ +int parse_statistics(struct json_object *root, struct nvme_ocp_telemetry_offsets *pOffsets, + FILE *fp); + +/** + * @brief parses a single statistic data to text or json formats + * + * @param pstatistic_entry, statistic entry pointer + * @param pstats_array, stats array pointer + * @param fp, input file pointer + * + * @return 0 success + */ +int parse_statistic(struct nvme_ocp_telemetry_statistic_descriptor *pstatistic_entry, + struct json_object *pstats_array, FILE *fp); + +/** + * @brief parses event fifos data to text or json formats + * + * @param root, input time json root object pointer + * @param poffsets, input telemetry offsets pointer + * @param fp, input file pointer + * + * @return 0 success + */ +int parse_event_fifos(struct json_object *root, struct nvme_ocp_telemetry_offsets *poffsets, + FILE *fp); + +/** + * @brief parses a single event fifo data to text or json formats + * + * @param fifo_num, input event fifo number + * @param pfifo_start, event fifo start pointer + * @param pevent_fifos_object, event fifos json object pointer + * @param ptelemetry_das_offset, input telemetry offsets pointer + * @param fifo_size, input event fifo size + * @param fp, input file pointer + * + * @return 0 success + */ +int parse_event_fifo(unsigned int fifo_num, unsigned char *pfifo_start, + struct json_object *pevent_fifos_object, unsigned char *pstring_buffer, + struct nvme_ocp_telemetry_offsets *poffsets, __u64 fifo_size, FILE *fp); + +/** + * @brief parses event fifos data to text or json formats + * + * @return 0 success + */ +int print_ocp_telemetry_normal(char *output_file); + +/** + * @brief parses event fifos data to text or json formats + * + * @return 0 success + */ +int print_ocp_telemetry_json(char *output_file); + +/** + * @brief gets statistic id ascii string + * + * @param identifier, string id + * @param description, string description + * + * @return 0 success + */ +int get_static_id_ascii_string(int identifier, char *description); + +/** + * @brief gets event id ascii string + * + * @param identifier, string id + * @param debug_event_class, debug event class + * @param description, string description + * + * @return 0 success + */ +int get_event_id_ascii_string(int identifier, int debug_event_class, char *description); + +/** + * @brief gets vu event id ascii string + * + * @param identifier, string id + * @param debug_event_class, debug event class + * @param description, string description + * + * @return 0 success + */ +int get_vu_event_id_ascii_string(int identifier, int debug_event_class, char *description); + +/** + * @brief parses a time-stamp event fifo data to text or json formats + * + * @param pevent_descriptor, input event descriptor data + * @param pevent_descriptor_obj, event descriptor json object pointer + * @param pevent_specific_data, input event specific data + * @param pevent_fifos_object, event fifos json object pointer + * @param fp, input file pointer + * + * @return + */ +void parse_time_stamp_event(struct nvme_ocp_telemetry_event_descriptor *pevent_descriptor, + struct json_object *pevent_descriptor_obj, __u8 *pevent_specific_data, + struct json_object *pevent_fifos_object, FILE *fp); + +/** + * @brief parses a pcie event fifo data to text or json formats + * + * @param pevent_descriptor, input event descriptor data + * @param pevent_descriptor_obj, event descriptor json object pointer + * @param pevent_specific_data, input event specific data + * @param pevent_fifos_object, event fifos json object pointer + * @param fp, input file pointer + * + * @return + */ +void parse_pcie_event(struct nvme_ocp_telemetry_event_descriptor *pevent_descriptor, + struct json_object *pevent_descriptor_obj, __u8 *pevent_specific_data, + struct json_object *pevent_fifos_object, FILE *fp); + +/** + * @brief parses a nvme event fifo data to text or json formats + * + * @param pevent_descriptor, input event descriptor data + * @param pevent_descriptor_obj, event descriptor json object pointer + * @param pevent_specific_data, input event specific data + * @param pevent_fifos_object, event fifos json object pointer + * @param fp, input file pointer + * + * @return + */ +void parse_nvme_event(struct nvme_ocp_telemetry_event_descriptor *pevent_descriptor, + struct json_object *pevent_descriptor_obj, __u8 *pevent_specific_data, + struct json_object *pevent_fifos_object, FILE *fp); + +/** + * @brief parses common event fifo data to text or json formats + * + * @param pevent_descriptor, input event descriptor data + * @param pevent_descriptor_obj, event descriptor json object pointer + * @param pevent_specific_data, input event specific data + * @param pevent_fifos_object, event fifos json object pointer + * @param fp, input file pointer + * + * @return + */ +void parse_common_event(struct nvme_ocp_telemetry_event_descriptor *pevent_descriptor, + struct json_object *pevent_descriptor_obj, __u8 *pevent_specific_data, + struct json_object *pevent_fifos_object, FILE *fp); + +/** + * @brief parses a media-wear event fifo data to text or json formats + * + * @param pevent_descriptor, input event descriptor data + * @param pevent_descriptor_obj, event descriptor json object pointer + * @param pevent_specific_data, input event specific data + * @param pevent_fifos_object, event fifos json object pointer + * @param fp, input file pointer + * + * @return + */ +void parse_media_wear_event(struct nvme_ocp_telemetry_event_descriptor *pevent_descriptor, + struct json_object *pevent_descriptor_obj, __u8 *pevent_specific_data, + struct json_object *pevent_fifos_object, FILE *fp); diff --git a/plugins/micron/micron-utils.c b/plugins/micron/micron-utils.c new file mode 100644 index 0000000000..e19b7c22f8 --- /dev/null +++ b/plugins/micron/micron-utils.c @@ -0,0 +1,304 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Copyright (c) Micron, Inc 2024. + * + * @file: micron-utils.h + * @brief: This module contains all the utilities needed for micron nvme plugin + * and other micron modules. + * @author: Chaithanya Shoba + */ + +#include "micron-utils.h" + +int hex_to_int(char c) +{ + if (c >= '0' && c <= '9') + return c - '0'; + else if (c >= 'A' && c <= 'F') + return 10 + (c - 'A'); + else if (c >= 'a' && c <= 'f') + return 10 + (c - 'a'); + else + return -1; // Invalid character +} + +char *hex_to_ascii(const char *hex) +{ + int hex_length = strlen(hex); + + char *text = NULL; + + if (hex_length > 0) { + int symbol_count; + int odd_hex_count = hex_length % 2 == 1; + + if (odd_hex_count) + symbol_count = (hex_length / 2) + 1; + else + symbol_count = hex_length / 2; + + text = (char *)malloc(symbol_count + 1); // Allocate memory for the result + + int last_index = hex_length - 1; + + for (int i = last_index; i >= 0; --i) { + if ((last_index - i) % 2 != 0) { + int dec = 16 * hex_to_int(hex[i]) + hex_to_int(hex[i + 1]); + + if (odd_hex_count) + text[i / 2 + 1] = dec; + else + text[i / 2] = dec; + } else if (i == 0) { + int dec = hex_to_int(hex[0]); + + text[0] = dec; + } + } + + text[symbol_count] = '\0'; // Terminate the string + } + + return text; +} + +unsigned char *read_binary_file(char *data_dir_path, const char *bin_path, + long *buffer_size, int retry_count) +{ + char *file_path = NULL; + FILE *bin_file = NULL; + size_t n_data = 0; + unsigned char *buffer = NULL; + + /* set path */ + if (data_dir_path == NULL) { + file_path = (char *)bin_path; + } else { + /* +2 for the / and null terminator */ + file_path = (char *) calloc(1, strlen(data_dir_path) + strlen(bin_path) + 2); + if (!file_path) + return NULL; + + if (strlen(bin_path) != 0) + sprintf(file_path, "%s/%s", data_dir_path, bin_path); + else + sprintf(file_path, "%s", data_dir_path); + } + + /* open file */ + for (int i = 0; i < retry_count; i++) { + bin_file = fopen(file_path, "rb"); + if (bin_file != NULL) + break; + sleep((unsigned int)(retry_count > 1)); + } + + if (!bin_file) { + nvme_show_error("\nFailed to open %s", file_path); + if (file_path != bin_path) + free(file_path); + return NULL; + } + + /* get size */ + fseek(bin_file, 0, SEEK_END); + *buffer_size = ftell(bin_file); + fseek(bin_file, 0, SEEK_SET); + if (*buffer_size <= 0) { + fclose(bin_file); + return NULL; + } + + /* allocate buffer */ + buffer = (unsigned char *)malloc(*buffer_size); + if (!buffer) { + nvme_show_result("\nFailed to allocate %ld bytes!", *buffer_size); + fclose(bin_file); + return NULL; + } + memset(buffer, 0, *buffer_size); + + /* Read data */ + n_data = fread(buffer, 1, *buffer_size, bin_file); + + /* Close file */ + fclose(bin_file); + + /* Validate we read data */ + if (n_data != (size_t)*buffer_size) { + nvme_show_result("\nFailed to read %ld bytes from %s", *buffer_size, file_path); + return NULL; + } + + if (file_path != bin_path) + free(file_path); + return buffer; +} + +void print_formatted_var_size_str(const char *msg, const __u8 *pdata, size_t data_size, FILE *fp) +{ + char description_str[256] = ""; + char temp_buffer[3] = { 0 }; + + for (size_t i = 0; i < data_size; ++i) { + sprintf(temp_buffer, "%02X", pdata[i]); + strcat(description_str, temp_buffer); + } + + if (fp) + fprintf(fp, "%s: %s\n", msg, description_str); + else + printf("%s: %s\n", msg, description_str); +} + +void process_field_size_16(int offset, char *sfield, __u8 *buf, char *datastr) +{ + __u64 lval_lo, lval_hi; + + if (strstr(sfield, "GUID")) { + sprintf(datastr, "0x%"PRIx64"%"PRIx64"", + le64_to_cpu(*(__u64 *)(&buf[offset + 8])), + le64_to_cpu(*(__u64 *)(&buf[offset]))); + } else { + lval_lo = *((__u64 *)(&buf[offset])); + lval_hi = *((__u64 *)(&buf[offset + 8])); + + if (lval_hi) + sprintf(datastr, "0x%"PRIx64"%016"PRIx64"", + le64_to_cpu(lval_hi), le64_to_cpu(lval_lo)); + else + sprintf(datastr, "0x%"PRIx64"", le64_to_cpu(lval_lo)); + } +} + +void process_field_size_8(int offset, char *sfield, __u8 *buf, char *datastr) +{ + __u64 lval_lo; + + if (strstr(sfield, "Boot SSD Spec Version")) { + sprintf(datastr, "%x.%x.%x.%x", + le16_to_cpu(*((__u16 *)(&buf[300]))), + le16_to_cpu(*((__u16 *)(&buf[302]))), + le16_to_cpu(*((__u16 *)(&buf[304]))), + le16_to_cpu(*((__u16 *)(&buf[306])))); + } else if (strstr(sfield, "Firmware Revision")) { + char buffer[30] = {'\0'}; + + lval_lo = *((__u64 *)(&buf[offset])); + + sprintf(buffer, "%lx", __builtin_bswap64(lval_lo)); + sprintf(datastr, "%s", hex_to_ascii(buffer)); + } else if (strstr(sfield, "Timestamp")) { + char ts_buf[128]; + + lval_lo = *((__u64 *)(&buf[offset])); + + convert_ts(le64_to_cpu(lval_lo), ts_buf); + sprintf(datastr, "%s", ts_buf); + } else { + lval_lo = *((__u64 *)(&buf[offset])); + + sprintf(datastr, "0x%"PRIx64"", le64_to_cpu(lval_lo)); + } +} + +void process_field_size_7(int offset, char *sfield, __u8 *buf, char *datastr) +{ + __u8 lval[8] = { 0 }; + __u64 lval_lo; + + /* 7 bytes will be in little-endian format, with last byte as MSB */ + memcpy(&lval[0], &buf[offset], 7); + memcpy((void *)&lval_lo, lval, 8); + sprintf(datastr, "0x%"PRIx64"", le64_to_cpu(lval_lo)); +} + +void process_field_size_6(int offset, char *sfield, __u8 *buf, char *datastr) +{ + __u32 ival; + __u16 sval; + __u64 lval_lo; + + if (strstr(sfield, "DSSD Spec Version")) { + sprintf(datastr, "%x.%x.%x.%x", buf[103], + le16_to_cpu(*((__u16 *)(&buf[101]))), + le16_to_cpu(*((__u16 *)(&buf[99]))), buf[98]); + } else { + ival = *((__u32 *)(&buf[offset])); + sval = *((__u16 *)(&buf[offset + 4])); + lval_lo = (((__u64)sval << 32) | ival); + + sprintf(datastr, "0x%"PRIx64"", le64_to_cpu(lval_lo)); + } +} + +void process_field_size_default(int offset, char *sfield, __u8 *buf, int size, char *datastr) +{ + __u8 cval; + char description_str[256] = "0x"; + char temp_buffer[3] = { 0 }; + + for (unsigned char i = 0; i < (unsigned char)size; i++) { + cval = (buf[offset + i]); + + sprintf(temp_buffer, "%02X", cval); + strcat(description_str, temp_buffer); + } + sprintf(datastr, "%s", description_str); +} + +void print_micron_vs_logs(__u8 *buf, struct micron_vs_logpage *log_page, int field_count, + struct json_object *stats, __u8 spec, FILE *fp) +{ + int offset = 0; + + for (int field = 0; field < field_count; field++) { + char datastr[1024] = { 0 }; + char *sfield = log_page[field].field; + int size = !spec ? log_page[field].size : log_page[field].size2; + + if (!size || sfield == NULL) + continue; + + switch (size) { + case FIELD_SIZE_16: + process_field_size_16(offset, sfield, buf, datastr); + break; + case FIELD_SIZE_8: + process_field_size_8(offset, sfield, buf, datastr); + break; + case FIELD_SIZE_7: + process_field_size_7(offset, sfield, buf, datastr); + break; + case FIELD_SIZE_6: + process_field_size_6(offset, sfield, buf, datastr); + break; + case FIELD_SIZE_4: + sprintf(datastr, "0x%x", le32_to_cpu(*((__u32 *)(&buf[offset])))); + break; + case FIELD_SIZE_3: + sprintf(datastr, "0x%02X%02X%02X", + buf[offset + 0], buf[offset + 1], buf[offset + 2]); + break; + case FIELD_SIZE_2: + sprintf(datastr, "0x%04x", le16_to_cpu(*((__u16 *)(&buf[offset])))); + break; + case FIELD_SIZE_1: + sprintf(datastr, "0x%02x", buf[offset]); + break; + default: + process_field_size_default(offset, sfield, buf, size, datastr); + break; + } + offset += size; + /* do not print reserved values */ + if (strstr(sfield, "Reserved")) + continue; + if (stats) + json_object_add_value_string(stats, sfield, datastr); + else if (fp) + fprintf(fp, "%-40s : %-4s\n", sfield, datastr); + else + printf("%-40s : %-4s\n", sfield, datastr); + } +} diff --git a/plugins/micron/micron-utils.h b/plugins/micron/micron-utils.h new file mode 100644 index 0000000000..289c836f38 --- /dev/null +++ b/plugins/micron/micron-utils.h @@ -0,0 +1,169 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Copyright (c) Micron, Inc 2024. + * + * @file: micron-utils.h + * @brief: This module contains all the utilities needed for micron nvme plugin + * and other micron modules. + * @author: Chaithanya Shoba + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "common.h" +#include "nvme.h" +#include "libnvme.h" +#include +#include "linux/types.h" +#include "nvme-print.h" +#include "util/cleanup.h" + +/* OCP and Vendor specific log data format */ +struct __packed micron_vs_logpage { + char *field; + int size; /* FB client spec version 1.0 sizes - M5410 models */ + int size2; /* FB client spec version 0.7 sizes - M5407 models */ +}; + +enum field_size { + FIELD_SIZE_16 = 16, + FIELD_SIZE_8 = 8, + FIELD_SIZE_7 = 7, + FIELD_SIZE_6 = 6, + FIELD_SIZE_4 = 4, + FIELD_SIZE_3 = 3, + FIELD_SIZE_2 = 2, + FIELD_SIZE_1 = 1 +}; + +/** + * @brief converts a single hexadecimal character to its integer value. + * + * @param hex_char, input hex char + * @param ts_buf, output time string + * + * @return integer value of hexadecimal + */ +int hex_to_int(char c); + +/** + * @brief convert time_t format time to a human readable string + * + * @param hex_string, input hex string pointer + * @param ascii_buffer, output ascii buffer pointer + * + * @return nothing + */ +char *hex_to_ascii(const char *hex); + +/** + * @brief convert time_t format time to a human readable string + * + * @param data_dir_path, input data directory path pointer + * @param bin_path, input binary file path pointer + * @param buffer_size, input buffer size pointer + * @param retry_count, input retry count + * + * @return pointer to binary data buffer + */ +unsigned char *read_binary_file(char *data_dir_path, const char *bin_path, long *buffer_size, + int retry_count); + +/** + * @brief prints Micron VS log pages + * + * @param buf, input raw log data + * @param log_page, input format of the data + * @param field_count, intput log field count + * @param stats, input json object to add fields + * @param spec, input ocp spec index + * @param fp, input file pointer + * + * @return 0 success + */ +void print_micron_vs_logs(__u8 *buf, struct micron_vs_logpage *log_page, int field_count, + struct json_object *stats, __u8 spec, FILE *fp); + +/** + * @brief prints raw data to the buffer + * + * @param msg, intput buffer to write data + * @param pdata, input raw data + * @param data_size, input size of the data + * @param fp, input file pointer + * + * @return 0 success + */ +void print_formatted_var_size_str(const char *msg, const __u8 *pdata, size_t data_size, FILE *fp); + +/** + * @brief prints raw data to the buffer + * + * @param offset, intput offset of the param + * @param sfield, intput field + * @param buf, input raw data + * @param datastr, output data buffer + * + * @return 0 success + */ +void process_field_size_16(int offset, char *sfield, __u8 *buf, char *datastr); + +/** + * @brief prints raw data to the buffer + * + * @param offset, intput offset of the param + * @param sfield, intput field + * @param buf, input raw data + * @param datastr, output data buffer + * + * @return 0 success + */ +void process_field_size_8(int offset, char *sfield, __u8 *buf, char *datastr); + +/** + * @brief prints raw data to the buffer + * + * @param offset, intput offset of the param + * @param sfield, intput field + * @param buf, input raw data + * @param datastr, output data buffer + * + * @return 0 success + */ +void process_field_size_7(int offset, char *sfield, __u8 *buf, char *datastr); + +/** + * @brief prints raw data to the buffer + * + * @param offset, intput offset of the param + * @param sfield, intput field + * @param buf, input raw data + * @param datastr, output data buffer + * + * @return 0 success + */ +void process_field_size_6(int offset, char *sfield, __u8 *buf, char *datastr); + +/** + * @brief prints raw data to the buffer + * + * @param offset, intput offset of the param + * @param sfield, intput field + * @param buf, input raw data + * @param size, input data size + * @param datastr, output data buffer + * + * @return 0 success + */ +void process_field_size_default(int offset, char *sfield, __u8 *buf, int size, char *datastr); From f9baeb64802721cf2ca393219f582c339da1455e Mon Sep 17 00:00:00 2001 From: Tokunori Ikegami Date: Fri, 28 Jun 2024 20:57:40 +0900 Subject: [PATCH 034/281] nvme-rpmb: send RPMB_REQ_READ_RESULT for authentication key programming This follows the NVMe revision 2.0a authentication key data flow. Signed-off-by: Tokunori Ikegami --- nvme-rpmb.c | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/nvme-rpmb.c b/nvme-rpmb.c index b35ce1d70f..692b062188 100644 --- a/nvme-rpmb.c +++ b/nvme-rpmb.c @@ -601,9 +601,28 @@ static int rpmb_program_auth_key(int fd, unsigned char target, goto out; } - /* send request and read the result first */ - rsp = rpmb_read_request(fd, req, req_size, rsp_size); - if (rsp == NULL || rsp->result != 0) { + /* send the request and get response */ + err = send_rpmb_req(fd, req->target, req_size, req); + if (err) { + fprintf(stderr, "RPMB request 0x%04x for 0x%x, err: %d\n", req->type, req->target, + err); + goto out; + } + + /* send the request to get the result and then request to get the response */ + rsp = (struct rpmb_data_frame_t *)calloc(rsp_size, 1); + if (!rsp) { + fprintf(stderr, "failed to allocate response buffer memory\n"); + err = -ENOMEM; + goto out; + } + + rsp->target = req->target; + rsp->type = RPMB_REQ_READ_RESULT; + err = send_rpmb_req(fd, req->target, rsp_size, rsp); + if (err || rsp->result) { + fprintf(stderr, "Program auth key read result 0x%x, error = 0x%x\n", rsp->result, + err); goto out; } From 92eaf9a65fd52801898683a4de87d33ad5976fa7 Mon Sep 17 00:00:00 2001 From: Daniel Wagner Date: Tue, 9 Jul 2024 17:38:41 +0200 Subject: [PATCH 035/281] doc: fix micron ocp telemetry log parse title The title needs a man page section info. Signed-off-by: Daniel Wagner --- Documentation/nvme-micron-ocp-telemetry-log-parse.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Documentation/nvme-micron-ocp-telemetry-log-parse.txt b/Documentation/nvme-micron-ocp-telemetry-log-parse.txt index fd3bd144db..417284fa6e 100644 --- a/Documentation/nvme-micron-ocp-telemetry-log-parse.txt +++ b/Documentation/nvme-micron-ocp-telemetry-log-parse.txt @@ -1,5 +1,5 @@ -nvme-micron-ocp-telemetry-log-parse -=================================== +nvme-micron-ocp-telemetry-log-parse(1) +====================================== NAME ---- From 5cbfb1859bc3ece55d10b51f92ec77587fccc765 Mon Sep 17 00:00:00 2001 From: Martin George Date: Mon, 8 Jul 2024 21:33:58 +0530 Subject: [PATCH 036/281] nvme: fix verbose logging The -v verbose option for certain nvme commands like id-ctrl, id-ns, smart-log, sanitize-log, etc. is practically a no-op since it only prints latency info in addition to the regular output. But at the same time, these commands already implement a -H human readable option which prints additional useful info. So fix the -v option to make it synonymous with the -H option here. And while we are at it, move the latency info from current INFO level (i.e. -v logging) to DEBUG level (i.e. -vv logging) since it is better suited there. Signed-off-by: Martin George --- nvme.c | 26 +++++++++++++------------- util/logging.c | 14 ++++++-------- 2 files changed, 19 insertions(+), 21 deletions(-) diff --git a/nvme.c b/nvme.c index d998c80083..b09f09a13d 100644 --- a/nvme.c +++ b/nvme.c @@ -556,7 +556,7 @@ static int get_smart_log(int argc, char **argv, struct command *cmd, struct plug if (cfg.raw_binary) flags = BINARY; - if (cfg.human_readable) + if (cfg.human_readable || argconfig_parse_seen(opts, "verbose")) flags |= VERBOSE; smart_log = nvme_alloc(sizeof(*smart_log)); @@ -1066,7 +1066,7 @@ static int get_effects_log(int argc, char **argv, struct command *cmd, struct pl if (cfg.raw_binary) flags = BINARY; - if (cfg.human_readable) + if (cfg.human_readable || argconfig_parse_seen(opts, "verbose")) flags |= VERBOSE; list_head_init(&log_pages); @@ -2405,7 +2405,7 @@ static int sanitize_log(int argc, char **argv, struct command *command, struct p if (cfg.raw_binary) flags = BINARY; - if (cfg.human_readable) + if (cfg.human_readable || argconfig_parse_seen(opts, "verbose")) flags |= VERBOSE; sanitize_log = nvme_alloc(sizeof(*sanitize_log)); @@ -2454,7 +2454,7 @@ static int get_fid_support_effects_log(int argc, char **argv, struct command *cm return err; } - if (cfg.human_readable) + if (cfg.human_readable || argconfig_parse_seen(opts, "verbose")) flags |= VERBOSE; fid_support_log = nvme_alloc(sizeof(*fid_support_log)); @@ -2503,7 +2503,7 @@ static int get_mi_cmd_support_effects_log(int argc, char **argv, struct command return err; } - if (cfg.human_readable) + if (cfg.human_readable || argconfig_parse_seen(opts, "verbose")) flags |= VERBOSE; mi_cmd_support_log = nvme_alloc(sizeof(*mi_cmd_support_log)); @@ -3428,7 +3428,7 @@ int __id_ctrl(int argc, char **argv, struct command *cmd, struct plugin *plugin, if (cfg.vendor_specific) flags |= VS; - if (cfg.human_readable) + if (cfg.human_readable || argconfig_parse_seen(opts, "verbose")) flags |= VERBOSE; ctrl = nvme_alloc(sizeof(*ctrl)); @@ -3748,7 +3748,7 @@ static int id_ns(int argc, char **argv, struct command *cmd, struct plugin *plug if (cfg.vendor_specific) flags |= VS; - if (cfg.human_readable) + if (cfg.human_readable || argconfig_parse_seen(opts, "verbose")) flags |= VERBOSE; if (!cfg.namespace_id) { @@ -3820,7 +3820,7 @@ static int cmd_set_independent_id_ns(int argc, char **argv, struct command *cmd, if (cfg.raw_binary) flags = BINARY; - if (cfg.human_readable) + if (cfg.human_readable || argconfig_parse_seen(opts, "verbose")) flags |= VERBOSE; if (!cfg.namespace_id) { @@ -3974,7 +3974,7 @@ static int id_uuid(int argc, char **argv, struct command *cmd, struct plugin *pl if (cfg.raw_binary) flags = BINARY; - if (cfg.human_readable) + if (cfg.human_readable || argconfig_parse_seen(opts, "verbose")) flags |= VERBOSE; uuid_list = nvme_alloc(sizeof(*uuid_list)); @@ -4214,7 +4214,7 @@ static int primary_ctrl_caps(int argc, char **argv, struct command *cmd, struct return err; } - if (cfg.human_readable) + if (cfg.human_readable || argconfig_parse_seen(opts, "verbose")) flags |= VERBOSE; caps = nvme_alloc(sizeof(*caps)); @@ -5410,7 +5410,7 @@ static int show_registers(int argc, char **argv, struct command *cmd, struct plu return err; } - if (cfg.human_readable) + if (cfg.human_readable || argconfig_parse_seen(opts, "verbose")) flags |= VERBOSE; bar = mmap_registers(dev, false); @@ -5686,7 +5686,7 @@ static int get_register(int argc, char **argv, struct command *cmd, struct plugi return err; } - if (cfg.human_readable) + if (cfg.human_readable || argconfig_parse_seen(opts, "verbose")) flags |= VERBOSE; bar = mmap_registers(dev, false); @@ -8479,7 +8479,7 @@ static int dir_receive(int argc, char **argv, struct command *cmd, struct plugin if (err) return err; - if (cfg.human_readable) + if (cfg.human_readable || argconfig_parse_seen(opts, "verbose")) flags |= VERBOSE; if (cfg.raw_binary) flags = BINARY; diff --git a/util/logging.c b/util/logging.c index c26d9e228e..8e59948ec2 100644 --- a/util/logging.c +++ b/util/logging.c @@ -92,15 +92,14 @@ int nvme_submit_passthru(int fd, unsigned long ioctl_cmd, struct timeval end; int err; - if (log_level >= LOG_INFO) + if (log_level >= LOG_DEBUG) gettimeofday(&start, NULL); err = ioctl(fd, ioctl_cmd, cmd); - if (log_level >= LOG_INFO) { + if (log_level >= LOG_DEBUG) { gettimeofday(&end, NULL); - if (log_level >= LOG_DEBUG) - nvme_show_command(cmd, err); + nvme_show_command(cmd, err); nvme_show_latency(start, end); } @@ -118,16 +117,15 @@ int nvme_submit_passthru64(int fd, unsigned long ioctl_cmd, struct timeval end; int err; - if (log_level >= LOG_INFO) + if (log_level >= LOG_DEBUG) gettimeofday(&start, NULL); err = ioctl(fd, ioctl_cmd, cmd); - if (log_level >= LOG_INFO) { + if (log_level >= LOG_DEBUG) { gettimeofday(&end, NULL); - if (log_level >= LOG_DEBUG) - nvme_show_command64(cmd, err); + nvme_show_command64(cmd, err); nvme_show_latency(start, end); } From 39f97ac9681a27e79684b4677c615f9c709fe355 Mon Sep 17 00:00:00 2001 From: Tokunori Ikegami Date: Sun, 7 Jul 2024 15:28:54 +0900 Subject: [PATCH 037/281] ocp: set UUID index for eol-plp-failure-mode command to get The value required from OCP version 2.0 for get feature command also. Signed-off-by: Tokunori Ikegami --- plugins/ocp/ocp-nvme.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/plugins/ocp/ocp-nvme.c b/plugins/ocp/ocp-nvme.c index 88ac212e49..5f7b75520e 100644 --- a/plugins/ocp/ocp-nvme.c +++ b/plugins/ocp/ocp-nvme.c @@ -665,8 +665,8 @@ static const char *eol_plp_failure_mode_to_string(__u8 mode) return "Reserved"; } -static int eol_plp_failure_mode_get(struct nvme_dev *dev, const __u32 nsid, - const __u8 fid, __u8 sel) +static int eol_plp_failure_mode_get(struct nvme_dev *dev, const __u32 nsid, const __u8 fid, + __u8 sel, bool uuid) { __u32 result; int err; @@ -685,6 +685,15 @@ static int eol_plp_failure_mode_get(struct nvme_dev *dev, const __u32 nsid, .result = &result, }; + if (uuid) { + /* OCP 2.0 requires UUID index support */ + err = ocp_get_uuid_index(dev, &args.uuidx); + if (err || !args.uuidx) { + nvme_show_error("ERROR: No OCP UUID index found"); + return err; + } + } + err = nvme_get_features(&args); if (!err) { nvme_show_result("End of Life Behavior (feature: %#0*x): %#0*x (%s: %s)", @@ -791,7 +800,8 @@ static int eol_plp_failure_mode(int argc, char **argv, struct command *cmd, cfg.save, !argconfig_parse_seen(opts, "no-uuid")); else - err = eol_plp_failure_mode_get(dev, nsid, fid, cfg.sel); + err = eol_plp_failure_mode_get(dev, nsid, fid, cfg.sel, + !argconfig_parse_seen(opts, "no-uuid")); dev_close(dev); From 2e9a5bf3a4f9d92f3cbcd30993297b20bda8376f Mon Sep 17 00:00:00 2001 From: Tokunori Ikegami Date: Sun, 7 Jul 2024 17:20:55 +0900 Subject: [PATCH 038/281] doc: fix ocp eol-plp-failure-mode select short option Fix -s to -S since the -s is used for the save short option. Signed-off-by: Tokunori Ikegami --- Documentation/nvme-ocp-eol-plp-failure-mode.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Documentation/nvme-ocp-eol-plp-failure-mode.txt b/Documentation/nvme-ocp-eol-plp-failure-mode.txt index 0ebc4ab7fb..16939250c8 100644 --- a/Documentation/nvme-ocp-eol-plp-failure-mode.txt +++ b/Documentation/nvme-ocp-eol-plp-failure-mode.txt @@ -11,7 +11,7 @@ SYNOPSIS [verse] 'nvme ocp eol-plp-failure-mode' [--mode= | -m ] [--no-uuid | -n] [--save | -s] - [--sel=] + [--sel=] DESCRIPTION ----------- From ff0b762929691e5ca58439e1cd6e522724db77ba Mon Sep 17 00:00:00 2001 From: Tokunori Ikegami Date: Sun, 7 Jul 2024 18:11:05 +0900 Subject: [PATCH 039/281] ocp: fix eol-plp-failure-mode command sel option value Since the select value 8 as changed not supported by the command. Signed-off-by: Tokunori Ikegami --- plugins/ocp/ocp-nvme.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/ocp/ocp-nvme.c b/plugins/ocp/ocp-nvme.c index 5f7b75520e..cca6f3acf4 100644 --- a/plugins/ocp/ocp-nvme.c +++ b/plugins/ocp/ocp-nvme.c @@ -766,7 +766,7 @@ static int eol_plp_failure_mode(int argc, char **argv, struct command *cmd, "No argument prints current mode."; const char *mode = "[0-3]: default/rom/wtm/normal"; const char *save = "Specifies that the controller shall save the attribute"; - const char *sel = "[0-3,8]: current/default/saved/supported/changed"; + const char *sel = "[0-3]: current/default/saved/supported"; const __u32 nsid = 0; const __u8 fid = 0xc2; struct nvme_dev *dev; From de014218c81648d1dc5c38d20f72211ed63afff2 Mon Sep 17 00:00:00 2001 From: Tokunori Ikegami Date: Sun, 7 Jul 2024 15:08:20 +0900 Subject: [PATCH 040/281] ocp: add get-error-injection command The set-error-injection command will be added separately. Signed-off-by: Tokunori Ikegami --- plugins/ocp/ocp-nvme.c | 157 ++++++++++++++++++++++++++++++++++++++++- plugins/ocp/ocp-nvme.h | 1 + 2 files changed, 157 insertions(+), 1 deletion(-) diff --git a/plugins/ocp/ocp-nvme.c b/plugins/ocp/ocp-nvme.c index cca6f3acf4..1ffa40b990 100644 --- a/plugins/ocp/ocp-nvme.c +++ b/plugins/ocp/ocp-nvme.c @@ -23,6 +23,7 @@ #include "linux/types.h" #include "util/types.h" #include "nvme-print.h" +#include "nvme-wrap.h" #include "ocp-smart-extended-log.h" #include "ocp-clear-features.h" @@ -113,6 +114,82 @@ struct __packed feature_latency_monitor { __u8 reserved[4083]; }; +struct erri_entry { + union { + __u8 flags; + struct { + __u8 enable:1; + __u8 single:1; + __u8 rsvd2:6; + }; + }; + __u8 rsvd1; + __le16 type; + union { + __u8 specific[28]; + struct { + __le16 nrtdp; + __u8 rsvd4[26]; + }; + }; +}; + +#define ERRI_ENTRIES_MAX 127 + +enum erri_type { + ERRI_TYPE_CPU_CTRL_HANG = 1, + ERRI_TYPE_NAND_HANG, + ERRI_TYPE_PLP_DEFECT, + ERRI_TYPE_LOGICAL_FIRMWARE_ERROR, + ERRI_TYPE_DRAM_CORRUPT_CRIT, + ERRI_TYPE_DRAM_CORRUPT_NON_CRIT, + ERRI_TYPE_NAND_CORRUPT, + ERRI_TYPE_SRAM_CORRUPT, + ERRI_TYPE_HW_MALFUNCTION, + ERRI_TYPE_NO_MORE_NAND_SPARES, + ERRI_TYPE_INCOMPLETE_SHUTDOWN, +}; + +const char *erri_type_to_string(__le16 type) +{ + switch (type) { + case ERRI_TYPE_CPU_CTRL_HANG: + return "CPU/controller hang"; + case ERRI_TYPE_NAND_HANG: + return "NAND hang"; + case ERRI_TYPE_PLP_DEFECT: + return "PLP defect"; + case ERRI_TYPE_LOGICAL_FIRMWARE_ERROR: + return "logical firmware error"; + case ERRI_TYPE_DRAM_CORRUPT_CRIT: + return "DRAM corruption critical path"; + case ERRI_TYPE_DRAM_CORRUPT_NON_CRIT: + return "DRAM corruption non-critical path"; + case ERRI_TYPE_NAND_CORRUPT: + return "NAND corruption"; + case ERRI_TYPE_SRAM_CORRUPT: + return "SRAM corruption"; + case ERRI_TYPE_HW_MALFUNCTION: + return "HW malfunction"; + case ERRI_TYPE_NO_MORE_NAND_SPARES: + return "no more NAND spares available"; + case ERRI_TYPE_INCOMPLETE_SHUTDOWN: + return "incomplete shutdown"; + default: + break; + } + + return "unknown"; +} + +struct erri_get_cq_entry { + __u32 nume:7; + __u32 rsvd7:25; +}; + +static const char *sel = "[0-3]: current/default/saved/supported"; +static const char *no_uuid = "Skip UUID index search (UUID index not required for OCP 1.0)"; + static int ocp_print_C3_log_normal(struct nvme_dev *dev, struct ssd_latency_monitor_log *log_data) { @@ -726,7 +803,6 @@ static int eol_plp_failure_mode_set(struct nvme_dev *dev, const __u32 nsid, } } - struct nvme_set_features_args args = { .args_size = sizeof(args), .fd = dev_fd(dev), @@ -3768,3 +3844,82 @@ static int fw_activation_history_log(int argc, char **argv, struct command *cmd, { return ocp_fw_activation_history_log(argc, argv, cmd, plugin); } + +static int error_injection_get(struct nvme_dev *dev, const __u8 sel, bool uuid) +{ + struct erri_get_cq_entry cq_entry; + int err; + int i; + const __u8 fid = 0xc0; + + _cleanup_free_ struct erri_entry *entry = NULL; + + struct nvme_get_features_args args = { + .result = (__u32 *)&cq_entry, + .data = entry, + .args_size = sizeof(args), + .fd = dev_fd(dev), + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .sel = sel, + .data_len = sizeof(*entry) * ERRI_ENTRIES_MAX, + .fid = fid, + }; + + if (uuid) { + /* OCP 2.0 requires UUID index support */ + err = ocp_get_uuid_index(dev, &args.uuidx); + if (err || !args.uuidx) { + nvme_show_error("ERROR: No OCP UUID index found"); + return err; + } + } + + entry = nvme_alloc(args.data_len); + if (!entry) { + nvme_show_error("malloc: %s", strerror(errno)); + return -errno; + } + + err = nvme_cli_get_features(dev, &args); + if (!err) { + nvme_show_result("Number of Error Injecttions (feature: %#0*x): %#0*x (%s: %d)", + fid ? 4 : 2, fid, cq_entry.nume ? 10 : 8, cq_entry.nume, + nvme_select_to_string(sel), cq_entry.nume); + if (sel == NVME_GET_FEATURES_SEL_SUPPORTED) + nvme_show_select_result(fid, *args.result); + for (i = 0; i < cq_entry.nume; i++) { + printf("Entry: %d, Flags: %x (%s%s), Type: %x (%s), NRTDP: %d\n", i, + entry->flags, entry->enable ? "Enabled" : "Disabled", + entry->single ? ", Single instance" : "", entry->type, + erri_type_to_string(entry->type), entry->nrtdp); + } + } else { + nvme_show_error("Could not get feature: %#0*x.", fid ? 4 : 2, fid); + } + + return err; +} + +static int get_error_injection(int argc, char **argv, struct command *cmd, struct plugin *plugin) +{ + const char *desc = "Return set of error injection"; + int err; + struct config { + __u8 sel; + }; + struct config cfg = { 0 }; + + _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; + + OPT_ARGS(opts) = { + OPT_BYTE("sel", 's', &cfg.sel, sel), + OPT_FLAG("no-uuid", 'n', NULL, no_uuid), + OPT_END() + }; + + err = parse_and_open(&dev, argc, argv, desc, opts); + if (err) + return err; + + return error_injection_get(dev, cfg.sel, !argconfig_parse_seen(opts, "no-uuid")); +} diff --git a/plugins/ocp/ocp-nvme.h b/plugins/ocp/ocp-nvme.h index f5b599e4b4..ec4b4fa369 100644 --- a/plugins/ocp/ocp-nvme.h +++ b/plugins/ocp/ocp-nvme.h @@ -36,6 +36,7 @@ PLUGIN(NAME("ocp", "OCP cloud SSD extensions", OCP_PLUGIN_VERSION), ENTRY("set-dssd-async-event-config", "Set DSSD Async Event Config", set_dssd_async_event_config) ENTRY("get-dssd-async-event-config", "Get DSSD Async Event Config", get_dssd_async_event_config) ENTRY("tcg-configuration-log", "Retrieve TCG Configuration Log Page", ocp_tcg_configuration_log) + ENTRY("get-error-injection", "Return set of error injection", get_error_injection) ) ); From 5a52f60c51e0c75a563b34241ae4126ff67e3144 Mon Sep 17 00:00:00 2001 From: Tokunori Ikegami Date: Sun, 7 Jul 2024 16:36:07 +0900 Subject: [PATCH 041/281] doc: add ocp get-error-injection command The set-error-injection command will be added separately. Signed-off-by: Tokunori Ikegami --- .../nvme-ocp-get-error-injection.txt | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 Documentation/nvme-ocp-get-error-injection.txt diff --git a/Documentation/nvme-ocp-get-error-injection.txt b/Documentation/nvme-ocp-get-error-injection.txt new file mode 100644 index 0000000000..8061e497bf --- /dev/null +++ b/Documentation/nvme-ocp-get-error-injection.txt @@ -0,0 +1,57 @@ +nvme-ocp-get-error-injection(1) +=============================== + +NAME +---- +nvme-ocp-get-error-injection - Return set of error injection + +SYNOPSIS +-------- +[verse] +'nvme ocp get-error-injection' [--no-uuid | -n] + [--sel=] + +DESCRIPTION +----------- +Return set of error injection. + +The parameter is mandatory NVMe character device (ex: /dev/nvme0). + +This will only work on OCP compliant devices supporting this feature. +Results for any other device are undefined. + +On success it returns 0, error code otherwise. + +OPTIONS +------- +-n:: +--no-uuid:: + Do not try to automatically detect UUID index for this command (required + for old OCP 1.0 support) + +-s :: + Select (SEL): This field specifies which value of the attributes + to return in the provided data: ++ +[] +|================== +|Select|Description +|0|Current +|1|Default +|2|Saved +|3|Supported capabilities +|4-7|Reserved +|================== + +EXAMPLES +-------- +* Has the program issue a get-error-injection to retrieve the 0xC0 get features. ++ +------------ +# nvme ocp get-error-injection /dev/nvme0 +------------ + +NVME +---- +Part of the nvme-user suite. From eb659fed2fa3a2e4b76b4917336d4603d11021b1 Mon Sep 17 00:00:00 2001 From: Tokunori Ikegami Date: Sun, 7 Jul 2024 16:52:44 +0900 Subject: [PATCH 042/281] completions: add ocp get-error-injection command The set-error-injection command will be added separately. Signed-off-by: Tokunori Ikegami --- completions/_nvme | 13 +++++++++++++ completions/bash-nvme-completion.sh | 6 +++++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/completions/_nvme b/completions/_nvme index e6ee1ae3b8..28786bbdfb 100644 --- a/completions/_nvme +++ b/completions/_nvme @@ -317,6 +317,18 @@ _nvme () { _arguments '*:: :->subcmds' _describe -t commands "nvme ocp tcg-configuration-log options" _ocp_tcg_configuration_log ;; + (get-error-injection) + local _get_error_injection + _get_error_injection=( + /dev/nvme':supply a device to use (required)' + --sel=':0-3: current/default/saved/supported/changed:' + -s':alias for --sel' + --no-uuid':Skip UUID index search' + -n':alias for --no-uuid' + ) + _arguments '*:: :->subcmds' + _describe -t commands "nvme ocp get-error-injection options" _get_error_injection + ;; (*) _files ;; @@ -2547,6 +2559,7 @@ _nvme () { telemetry-string-log':Retrieve Telemetry string Log Page' set-telemetry-profile':Set Telemetry Profile' tcg-configuration-log':tcg configuration log' + get-error-injection':get error injection' ) _arguments '*:: :->subcmds' _describe -t commands "nvme ocp options" _ocp diff --git a/completions/bash-nvme-completion.sh b/completions/bash-nvme-completion.sh index b07f1ddb88..00ea5e9b27 100644 --- a/completions/bash-nvme-completion.sh +++ b/completions/bash-nvme-completion.sh @@ -1487,6 +1487,9 @@ plugin_ocp_opts () { "tcg-configuration-log") opts+=" --output-file= -o" ;; + "get-error-injection") + opts+=" --sel= -s --no-uuid -n" + ;; "help") opts+=$NO_OPTS ;; @@ -1564,7 +1567,8 @@ _nvme_subcmds () { vs-fw-activate-history device-capability-log \ set-dssd-power-state-feature get-dssd-power-state-feature \ telemetry-string-log set-telemetry-profile \ - set-dssd-async-event-config get-dssd-async-event-config" + set-dssd-async-event-config get-dssd-async-event-config \ + get-error-injection" ) # Associative array mapping plugins to corresponding option completions From cb977c1fd6a125bbf1538ad71cad0c2dc83c7c1d Mon Sep 17 00:00:00 2001 From: Daniel Wagner Date: Wed, 10 Jul 2024 08:58:16 +0200 Subject: [PATCH 043/281] build: add documentation CI build Build the documentation in the CI build to catch formatting issues in the submissions. Signed-off-by: Daniel Wagner --- .github/workflows/docs.yaml | 26 ++++++++++++++++++++++++++ scripts/build.sh | 10 ++++++++++ 2 files changed, 36 insertions(+) create mode 100644 .github/workflows/docs.yaml diff --git a/.github/workflows/docs.yaml b/.github/workflows/docs.yaml new file mode 100644 index 0000000000..89fbd67b77 --- /dev/null +++ b/.github/workflows/docs.yaml @@ -0,0 +1,26 @@ +--- +name: docs + +on: + push: + branches: [master] + paths: + - Documentation/** + pull_request: + branches: [master] + paths: + - Documentation/** + + workflow_dispatch: + +jobs: + build-docs: + name: build documentation + runs-on: ubuntu-latest + container: + image: ghcr.io/igaw/linux-nvme/debian:latest + steps: + - uses: actions/checkout@v4 + - name: build + run: | + scripts/build.sh docs diff --git a/scripts/build.sh b/scripts/build.sh index be907a5af7..933d62bc7a 100755 --- a/scripts/build.sh +++ b/scripts/build.sh @@ -22,6 +22,7 @@ usage() { echo " coverage build coverage report" echo " appimage build AppImage target" echo " distro build libnvme and nvme-cli separately" + echo " docs build documentation" echo "" echo "configs with muon:" echo " [default] minimal static build" @@ -116,6 +117,15 @@ config_meson_appimage() { "${BUILDDIR}" } +config_meson_docs() { + CC="${CC}" "${MESON}" setup \ + -Ddocs=all \ + -Ddocs-build=true \ + --force-fallback-for=libnvme \ + -Dlibnvme:werror=false \ + "${BUILDDIR}" +} + build_meson() { "${MESON}" compile \ -C "${BUILDDIR}" From 5746db348c4948523af7724b85604d5a11586a42 Mon Sep 17 00:00:00 2001 From: Tokunori Ikegami Date: Wed, 10 Jul 2024 00:55:49 +0900 Subject: [PATCH 044/281] nvme-print-binary: add effects-log command output missed The csi data added before effects log page output. Signed-off-by: Tokunori Ikegami --- nvme-print-binary.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/nvme-print-binary.c b/nvme-print-binary.c index 1743f6fe8d..33804f1b2a 100644 --- a/nvme-print-binary.c +++ b/nvme-print-binary.c @@ -297,6 +297,16 @@ static void binary_discovery_log(struct nvmf_discovery_log *log, int numrec) numrec * sizeof(struct nvmf_disc_log_entry)); } +static void binary_effects_log_pages(struct list_head *list) +{ + nvme_effects_log_node_t *node = NULL; + + list_for_each(list, node, node) { + d_raw((unsigned char *)&node->csi, sizeof(node->csi)); + d_raw((unsigned char *)&node->effects, sizeof(node->effects)); + } +} + static struct print_ops binary_print_ops = { /* libnvme types.h print functions */ .ana_log = binary_ana_log, @@ -306,7 +316,7 @@ static struct print_ops binary_print_ops = { .ctrl_registers = binary_ctrl_registers, .directive = binary_directive, .discovery_log = binary_discovery_log, - .effects_log_list = NULL, + .effects_log_list = binary_effects_log_pages, .endurance_group_event_agg_log = binary_endurance_group_event_agg_log, .endurance_group_list = NULL, .endurance_log = binary_endurance_log, From dca16e40b7c0768e06ba1d67f690ab966bd42edc Mon Sep 17 00:00:00 2001 From: Nitin Sao Date: Wed, 26 Jun 2024 08:47:42 +0530 Subject: [PATCH 045/281] build: bump libnvme wrap Fetch npdgl field from nvme_nvm_id_ns Signed-off-by: Nitin Sao --- subprojects/libnvme.wrap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subprojects/libnvme.wrap b/subprojects/libnvme.wrap index 38746019b8..c7f9ace128 100644 --- a/subprojects/libnvme.wrap +++ b/subprojects/libnvme.wrap @@ -1,6 +1,6 @@ [wrap-git] url = https://github.com/linux-nvme/libnvme.git -revision = 926456937807434a716624cee4ee01e6add3b74d +revision = fce9d7f977cf08e196ee7a3085a59393b46663f9 [provide] libnvme = libnvme_dep From 75efb73b7890f5bb19f55442ea8f1f0324ed7692 Mon Sep 17 00:00:00 2001 From: Nitin Sao Date: Wed, 26 Jun 2024 08:47:42 +0530 Subject: [PATCH 046/281] nvme-print: add new field added in TP4090 As per TP4090, a new field support is added as NPDGL (Namespace Preferred Deallocate Granularity Large) and so the bit-field of NSFEAT, OPTPERF get extended by 1 bit. Signed-off-by: Nitin Sao Reviewed-by: Steven Seungcheol Lee Reviewed-by: Mohit Kapoor --- nvme-print-json.c | 7 +++++-- nvme-print-stdout.c | 18 +++++++++++------- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/nvme-print-json.c b/nvme-print-json.c index 414af8e699..efd340a5ec 100644 --- a/nvme-print-json.c +++ b/nvme-print-json.c @@ -269,10 +269,11 @@ static void json_nvme_id_ns(struct nvme_id_ns *ns, unsigned int nsid, obj_add_int(r, "nsattr", ns->nsattr); obj_add_int(r, "nvmsetid", le16_to_cpu(ns->nvmsetid)); - if (ns->nsfeat & 0x10) { + if (ns->nsfeat & 0x30) { obj_add_int(r, "npwg", le16_to_cpu(ns->npwg)); obj_add_int(r, "npwa", le16_to_cpu(ns->npwa)); - obj_add_int(r, "npdg", le16_to_cpu(ns->npdg)); + if (ns->nsfeat & 0x10) + obj_add_int(r, "npdg", le16_to_cpu(ns->npdg)); obj_add_int(r, "npda", le16_to_cpu(ns->npda)); obj_add_int(r, "nows", le16_to_cpu(ns->nows)); } @@ -3063,6 +3064,8 @@ static void json_nvme_nvm_id_ns(struct nvme_nvm_id_ns *nvm_ns, array_add_obj(elbafs, elbaf); } + if (ns->nsfeat & 0x20) + obj_add_int(r, "npdgl", le32_to_cpu(nvm_ns->npdgl)); json_print(r); } diff --git a/nvme-print-stdout.c b/nvme-print-stdout.c index 69bff14ab7..17461de1a8 100644 --- a/nvme-print-stdout.c +++ b/nvme-print-stdout.c @@ -2345,17 +2345,18 @@ static void stdout_id_ctrl_ofcs(__le16 ofcs) static void stdout_id_ns_nsfeat(__u8 nsfeat) { - __u8 rsvd = (nsfeat & 0xE0) >> 5; - __u8 ioopt = (nsfeat & 0x10) >> 4; + __u8 rsvd = (nsfeat & 0xC0) >> 6; + __u8 optperf = (nsfeat & 0x30) >> 4; __u8 uidreuse = (nsfeat & 0x8) >> 3; __u8 dulbe = (nsfeat & 0x4) >> 2; __u8 na = (nsfeat & 0x2) >> 1; __u8 thin = nsfeat & 0x1; if (rsvd) - printf(" [7:5] : %#x\tReserved\n", rsvd); - printf(" [4:4] : %#x\tNPWG, NPWA, NPDG, NPDA, and NOWS are %sSupported\n", - ioopt, ioopt ? "" : "Not "); + printf(" [7:6] : %#x\tReserved\n", rsvd); + printf(" [5:4] : %#x\tNPWG, NPWA, %s%sNPDA, and NOWS are %sSupported\n", + optperf, ((optperf & 0x1) || (!optperf)) ? "NPDG, " : "", + ((optperf & 0x2) || (!optperf)) ? "NPDGL, " : "", optperf ? "" : "Not "); printf(" [3:3] : %#x\tNGUID and EUI64 fields if non-zero, %sReused\n", uidreuse, uidreuse ? "Never " : ""); printf(" [2:2] : %#x\tDeallocated or Unwritten Logical Block error %sSupported\n", @@ -2588,10 +2589,11 @@ static void stdout_id_ns(struct nvme_id_ns *ns, unsigned int nsid, printf("noiob : %d\n", le16_to_cpu(ns->noiob)); printf("nvmcap : %s\n", uint128_t_to_l10n_string(le128_to_cpu(ns->nvmcap))); - if (ns->nsfeat & 0x10) { + if (ns->nsfeat & 0x30) { printf("npwg : %u\n", le16_to_cpu(ns->npwg)); printf("npwa : %u\n", le16_to_cpu(ns->npwa)); - printf("npdg : %u\n", le16_to_cpu(ns->npdg)); + if (ns->nsfeat & 0x10) + printf("npdg : %u\n", le16_to_cpu(ns->npdg)); printf("npda : %u\n", le16_to_cpu(ns->npda)); printf("nows : %u\n", le16_to_cpu(ns->nows)); } @@ -3135,6 +3137,8 @@ static void stdout_nvm_id_ns(struct nvme_nvm_id_ns *nvm_ns, unsigned int nsid, printf("elbaf %2d : qpif:%d pif:%d sts:%-2d %s\n", i, qpif, pif, sts, i == lbaf ? in_use : ""); } + if (ns->nsfeat & 0x20) + printf("npdgl : %#x\n", le32_to_cpu(nvm_ns->npdgl)); } static void stdout_zns_id_ctrl(struct nvme_zns_id_ctrl *ctrl) From e0a8a5ae2385ec2abd8409d7773cbfcd452888f7 Mon Sep 17 00:00:00 2001 From: Francis Pravin Date: Fri, 12 Jul 2024 11:48:51 +0530 Subject: [PATCH 047/281] nvme: check MD size with PI size when PRACT set to 1 As per NVM Command Set Specification, Rev 1.0d, Sec-5.2.2 PRACT Bit: "If PRACT bit is set to 1 and Metadata size equals to the Protection Information size, the protection information is stripped or inserted by the controller." Currently NVMe supports 8 and 16 byte size of Protection Information. So, use pi_size instead of 8 byte. Signed-off-by: Francis Pravin Reviewed-by: Steven Seungcheol Lee --- nvme.c | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/nvme.c b/nvme.c index b09f09a13d..fd0e9e976d 100644 --- a/nvme.c +++ b/nvme.c @@ -7691,7 +7691,7 @@ static int submit_io(int opcode, char *command, const char *desc, int argc, char _cleanup_free_ void *mbuffer = NULL; int err = 0; _cleanup_fd_ int dfd = -1, mfd = -1; - int flags; + int flags, pi_size; int mode = 0644; __u16 control = 0, nblocks = 0; __u32 dsmgmt = 0; @@ -7887,13 +7887,23 @@ static int submit_io(int opcode, char *command, const char *desc, int argc, char nvme_id_ns_flbas_to_lbaf_inuse(ns->flbas, &lba_index); logical_block_size = 1 << ns->lbaf[lba_index].ds; ms = ns->lbaf[lba_index].ms; + + nvm_ns = nvme_alloc(sizeof(*nvm_ns)); + if (!nvm_ns) + return -ENOMEM; + + err = nvme_identify_ns_csi(dev_fd(dev), cfg.namespace_id, 0, NVME_CSI_NVM, nvm_ns); + if (!err) + get_pif_sts(ns, nvm_ns, &pif, &sts); + + pi_size = (pif == NVME_NVM_PIF_16B_GUARD) ? 8 : 16; if (NVME_FLBAS_META_EXT(ns->flbas)) { /* - * No meta data is transferred for PRACT=1 and MD=8: + * No meta data is transferred for PRACT=1 and MD=PI size: * 5.2.2.1 Protection Information and Write Commands * 5.2.2.2 Protection Information and Read Commands */ - if (!((cfg.prinfo & 0x8) != 0 && ms == 8)) + if (!((cfg.prinfo & 0x8) != 0 && ms == pi_size)) logical_block_size += ms; } @@ -7918,16 +7928,7 @@ static int submit_io(int opcode, char *command, const char *desc, int argc, char if (!buffer) return -ENOMEM; - nvm_ns = nvme_alloc(sizeof(*nvm_ns)); - if (!nvm_ns) - return -ENOMEM; - if (cfg.metadata_size) { - err = nvme_identify_ns_csi(dev_fd(dev), 1, 0, NVME_CSI_NVM, nvm_ns); - if (!err) { - get_pif_sts(ns, nvm_ns, &pif, &sts); - } - mbuffer_size = ((unsigned long long)cfg.block_count + 1) * ms; if (ms && cfg.metadata_size < mbuffer_size) nvme_show_error("Rounding metadata size to fit block count (%lld bytes)", From da8c4ea9be6e7414a467ecb445af3159ffec8e55 Mon Sep 17 00:00:00 2001 From: Daniel Wagner Date: Fri, 12 Jul 2024 10:20:25 +0200 Subject: [PATCH 048/281] build: bump libnvme wrap Fetch hostnqn changes. Signed-off-by: Daniel Wagner --- subprojects/libnvme.wrap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subprojects/libnvme.wrap b/subprojects/libnvme.wrap index c7f9ace128..85e83ac083 100644 --- a/subprojects/libnvme.wrap +++ b/subprojects/libnvme.wrap @@ -1,6 +1,6 @@ [wrap-git] url = https://github.com/linux-nvme/libnvme.git -revision = fce9d7f977cf08e196ee7a3085a59393b46663f9 +revision = f39802f9e6a9bc90cd7d45fcb1a5195d1890e74d [provide] libnvme = libnvme_dep From 48134631ff0a73657477a89219ce7ab865a8cbd3 Mon Sep 17 00:00:00 2001 From: Daniel Wagner Date: Wed, 3 Jul 2024 11:42:42 +0200 Subject: [PATCH 049/281] fabrics: use cleanup helper to free nvme root object Simplify the error handling path by using the cleanup helpers. Signed-off-by: Daniel Wagner --- fabrics.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/fabrics.c b/fabrics.c index 2f3b81231f..ffcb14fa7b 100644 --- a/fabrics.c +++ b/fabrics.c @@ -690,7 +690,7 @@ int nvmf_discover(const char *desc, int argc, char **argv, bool connect) char *hnqn = NULL, *hid = NULL; char *context = NULL; nvme_print_flags_t flags; - nvme_root_t r; + _cleanup_nvme_root_ nvme_root_t r = NULL; nvme_host_t h; nvme_ctrl_t c = NULL; unsigned int verbose = 0; @@ -749,7 +749,6 @@ int nvmf_discover(const char *desc, int argc, char **argv, bool connect) if (errno != ENOENT) fprintf(stderr, "Failed to scan topology: %s\n", nvme_strerror(errno)); - nvme_free_tree(r); return ret; } @@ -894,7 +893,6 @@ int nvmf_discover(const char *desc, int argc, char **argv, bool connect) free(hid); if (dump_config) nvme_dump_config(r); - nvme_free_tree(r); return ret; } @@ -909,7 +907,7 @@ int nvmf_connect(const char *desc, int argc, char **argv) char *config_file = PATH_NVMF_CONFIG; char *context = NULL; unsigned int verbose = 0; - nvme_root_t r; + _cleanup_nvme_root_ nvme_root_t r = NULL; nvme_host_t h; nvme_ctrl_t c; int ret; @@ -979,7 +977,6 @@ int nvmf_connect(const char *desc, int argc, char **argv) if (errno != ENOENT) fprintf(stderr, "Failed to scan topology: %s\n", nvme_strerror(errno)); - nvme_free_tree(r); return ret; } nvme_read_config(r, config_file); @@ -1046,7 +1043,6 @@ int nvmf_connect(const char *desc, int argc, char **argv) free(hid); if (dump_config) nvme_dump_config(r); - nvme_free_tree(r); return -errno; } From 824911a2eccf613cc88953895ba64fce0f240682 Mon Sep 17 00:00:00 2001 From: Daniel Wagner Date: Thu, 11 Jul 2024 13:40:42 +0200 Subject: [PATCH 050/281] fabrics: extend already connected message The 'already connected' message only contains the traddr as info. Add the missing information so that it's possible to figure out what combination is already in use. Signed-off-by: Daniel Wagner --- fabrics.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/fabrics.c b/fabrics.c index ffcb14fa7b..fc103ea499 100644 --- a/fabrics.c +++ b/fabrics.c @@ -365,11 +365,15 @@ static int __discover(nvme_ctrl_t c, struct nvme_fabrics_config *defcfg, nvme_free_ctrl(child); } } else if (errno == ENVME_CONNECT_ALREADY && !quiet) { - char *traddr = log->entries[i].traddr; + const char *subnqn = log->entries[i].subnqn; + const char *trtype = nvmf_trtype_str(log->entries[i].trtype); + const char *traddr = log->entries[i].traddr; + const char *trsvcid = log->entries[i].trsvcid; fprintf(stderr, - "traddr=%s is already connected\n", - traddr); + "already connected to hostnqn=%s,nqn=%s,transport=%s,traddr=%s,trsvcid=%s\n", + nvme_host_get_hostnqn(h), subnqn, + trtype, traddr, trsvcid); } } } From fb91adb367090e5d1c9da2249f75c2eeaf513cdf Mon Sep 17 00:00:00 2001 From: Daniel Wagner Date: Wed, 3 Jul 2024 10:22:18 +0200 Subject: [PATCH 051/281] fabrics: use helper to lookup default hostnqn/hostid libnvme provides a handy new helper to lookup the hostnqn and hostid. Signed-off-by: Daniel Wagner --- fabrics.c | 102 ++++++++---------------------------------------------- 1 file changed, 15 insertions(+), 87 deletions(-) diff --git a/fabrics.c b/fabrics.c index fc103ea499..7cf594865b 100644 --- a/fabrics.c +++ b/fabrics.c @@ -627,71 +627,14 @@ static int nvme_read_volatile_config(nvme_root_t r) return ret; } -char *nvmf_hostid_from_hostnqn(const char *hostnqn) -{ - const char *uuid; - - if (!hostnqn) - return NULL; - - uuid = strstr(hostnqn, "uuid:"); - if (!uuid) - return NULL; - - return strdup(uuid + strlen("uuid:")); -} - -void nvmf_check_hostid_and_hostnqn(const char *hostid, const char *hostnqn, unsigned int verbose) -{ - _cleanup_free_ char *hostid_from_hostnqn = NULL; - - if (!hostnqn || !hostid) - return; - - hostid_from_hostnqn = nvmf_hostid_from_hostnqn(hostnqn); - if (hostid_from_hostnqn && strcmp(hostid_from_hostnqn, hostid)) { - if (verbose) - fprintf(stderr, - "warning: use hostid which does not match uuid in hostnqn\n"); - } -} - -void nvmf_set_hostid_and_hostnqn(char **hostid, char **hostnqn) -{ - char *hid = *hostid; - char *hnqn = *hostnqn; - - if (!hid) - hid = nvmf_hostid_from_file(); - if (!hnqn) - hnqn = nvmf_hostnqn_from_file(); - - if (!hid) { - if (hnqn) { - hid = nvmf_hostid_from_hostnqn(hnqn); - if (!hid) - hid = nvmf_hostid_generate(); - } else { - hid = nvmf_hostid_generate(); - hnqn = nvmf_hostnqn_generate_from_hostid(hid); - } - } - - if (!hnqn) - hnqn = nvmf_hostnqn_generate_from_hostid(hid); - - *hostid = hid; - *hostnqn = hnqn; -} - int nvmf_discover(const char *desc, int argc, char **argv, bool connect) { char *subsysnqn = NVME_DISC_SUBSYS_NAME; char *hostnqn = NULL, *hostid = NULL, *hostkey = NULL; - char *hostnqn_arg, *hostid_arg; char *transport = NULL, *traddr = NULL, *trsvcid = NULL; char *config_file = PATH_NVMF_CONFIG; - char *hnqn = NULL, *hid = NULL; + _cleanup_free_ char *hnqn = NULL; + _cleanup_free_ char *hid = NULL; char *context = NULL; nvme_print_flags_t flags; _cleanup_nvme_root_ nvme_root_t r = NULL; @@ -761,21 +704,16 @@ int nvmf_discover(const char *desc, int argc, char **argv, bool connect) if (!nvme_read_volatile_config(r)) json_config = true; - hostnqn_arg = hostnqn; - hostid_arg = hostid; - - nvmf_set_hostid_and_hostnqn(&hostid, &hostnqn); - if (!hostid_arg) - hid = hostid; - if (!hostnqn_arg) - hnqn = hostnqn; + ret = nvme_host_get_ids(r, hostnqn, hostid, &hnqn, &hid); + if (ret < 0) + return -errno; - nvmf_check_hostid_and_hostnqn(hostid, hostnqn, verbose); - h = nvme_lookup_host(r, hostnqn, hostid); + h = nvme_lookup_host(r, hnqn, hid); if (!h) { ret = ENOMEM; goto out_free; } + if (device) { if (!strcmp(device, "none")) device = NULL; @@ -787,8 +725,8 @@ int nvmf_discover(const char *desc, int argc, char **argv, bool connect) if (!device && !transport && !traddr) { if (!nonbft) - discover_from_nbft(r, hostnqn_arg, hostid_arg, - hostnqn, hostid, desc, connect, + discover_from_nbft(r, hostnqn, hostid, + hnqn, hid, desc, connect, &cfg, nbft_path, flags, verbose); if (nbft) @@ -893,8 +831,6 @@ int nvmf_discover(const char *desc, int argc, char **argv, bool connect) nvme_free_ctrl(c); out_free: - free(hnqn); - free(hid); if (dump_config) nvme_dump_config(r); @@ -907,7 +843,8 @@ int nvmf_connect(const char *desc, int argc, char **argv) char *transport = NULL, *traddr = NULL; char *trsvcid = NULL, *hostnqn = NULL, *hostid = NULL; char *hostkey = NULL, *ctrlkey = NULL; - char *hnqn = NULL, *hid = NULL; + _cleanup_free_ char *hnqn = NULL; + _cleanup_free_ char *hid = NULL; char *config_file = PATH_NVMF_CONFIG; char *context = NULL; unsigned int verbose = 0; @@ -918,7 +855,6 @@ int nvmf_connect(const char *desc, int argc, char **argv) nvme_print_flags_t flags; struct nvme_fabrics_config cfg = { 0 }; char *format = "normal"; - char *hostnqn_arg, *hostid_arg; NVMF_ARGS(opts, cfg, @@ -986,17 +922,11 @@ int nvmf_connect(const char *desc, int argc, char **argv) nvme_read_config(r, config_file); nvme_read_volatile_config(r); - hostnqn_arg = hostnqn; - hostid_arg = hostid; - - nvmf_set_hostid_and_hostnqn(&hostid, &hostnqn); - if (!hostid_arg) - hid = hostid; - if (!hostnqn_arg) - hnqn = hostnqn; + ret = nvme_host_get_ids(r, hostnqn, hostid, &hnqn, &hid); + if (ret < 0) + return -errno; - nvmf_check_hostid_and_hostnqn(hostid, hostnqn, verbose); - h = nvme_lookup_host(r, hostnqn, hostid); + h = nvme_lookup_host(r, hnqn, hid); if (!h) { errno = ENOMEM; goto out_free; @@ -1043,8 +973,6 @@ int nvmf_connect(const char *desc, int argc, char **argv) } out_free: - free(hnqn); - free(hid); if (dump_config) nvme_dump_config(r); return -errno; From 89008c03a4b491d01b9dbcc9305020a514d6a5f7 Mon Sep 17 00:00:00 2001 From: Daniel Wagner Date: Thu, 11 Jul 2024 10:49:23 +0200 Subject: [PATCH 052/281] fabrics: first read config before topology scanning The topology scanning will create nodes in the internal libnvme tree. As we rely on the order of the nodes in the tree, we need to read the config before we scan. This makes sure the first node is the one we have defined in the config.json. This is important because the first node provides default hosnqn configuration in absents of /etc/nvme/hostnqn. Signed-off-by: Daniel Wagner --- fabrics.c | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/fabrics.c b/fabrics.c index 7cf594865b..d42bdc19d2 100644 --- a/fabrics.c +++ b/fabrics.c @@ -690,6 +690,12 @@ int nvmf_discover(const char *desc, int argc, char **argv, bool connect) } if (context) nvme_root_set_application(r, context); + + if (!nvme_read_config(r, config_file)) + json_config = true; + if (!nvme_read_volatile_config(r)) + json_config = true; + nvme_root_skip_namespaces(r); ret = nvme_scan_topology(r, NULL, NULL); if (ret < 0) { @@ -699,11 +705,6 @@ int nvmf_discover(const char *desc, int argc, char **argv, bool connect) return ret; } - if (!nvme_read_config(r, config_file)) - json_config = true; - if (!nvme_read_volatile_config(r)) - json_config = true; - ret = nvme_host_get_ids(r, hostnqn, hostid, &hnqn, &hid); if (ret < 0) return -errno; @@ -911,6 +912,10 @@ int nvmf_connect(const char *desc, int argc, char **argv) } if (context) nvme_root_set_application(r, context); + + nvme_read_config(r, config_file); + nvme_read_volatile_config(r); + nvme_root_skip_namespaces(r); ret = nvme_scan_topology(r, NULL, NULL); if (ret < 0) { @@ -919,8 +924,6 @@ int nvmf_connect(const char *desc, int argc, char **argv) nvme_strerror(errno)); return ret; } - nvme_read_config(r, config_file); - nvme_read_volatile_config(r); ret = nvme_host_get_ids(r, hostnqn, hostid, &hnqn, &hid); if (ret < 0) @@ -1206,6 +1209,9 @@ int nvmf_config(const char *desc, int argc, char **argv) nvme_strerror(errno)); return -errno; } + + nvme_read_config(r, config_file); + if (scan_tree) { nvme_root_skip_namespaces(r); ret = nvme_scan_topology(r, NULL, NULL); @@ -1217,7 +1223,6 @@ int nvmf_config(const char *desc, int argc, char **argv) return ret; } } - nvme_read_config(r, config_file); if (modify_config) { nvme_host_t h; From b3b9963396c5bb7cd16c24db5e338e88d064d8e8 Mon Sep 17 00:00:00 2001 From: Daniel Wagner Date: Fri, 5 Jul 2024 14:35:30 +0200 Subject: [PATCH 053/281] fabrics: refactore discover from json config Move the connect logic out of the subsystem, ctrl loop. Too much indention. Signed-off-by: Daniel Wagner --- fabrics.c | 147 ++++++++++++++++++++++++++++++------------------------ 1 file changed, 81 insertions(+), 66 deletions(-) diff --git a/fabrics.c b/fabrics.c index d42bdc19d2..db5cc97d74 100644 --- a/fabrics.c +++ b/fabrics.c @@ -502,91 +502,106 @@ static int discover_from_conf_file(nvme_root_t r, nvme_host_t h, return ret; } -static int discover_from_json_config_file(nvme_root_t r, nvme_host_t h, - const char *desc, bool connect, +static int _discover_from_json_config_file(nvme_root_t r, nvme_host_t h, nvme_subsystem_t s, + nvme_ctrl_t c, const char *desc, bool connect, const struct nvme_fabrics_config *defcfg, nvme_print_flags_t flags, bool force) { - const char *transport, *traddr, *host_traddr, *host_iface, *trsvcid, *subsysnqn; - nvme_subsystem_t s; - nvme_ctrl_t c, cn; + const char *transport, *traddr, *host_traddr; + const char *host_iface, *trsvcid, *subsysnqn; struct nvme_fabrics_config cfg; + nvme_ctrl_t cn; int ret = 0; - nvme_for_each_subsystem(h, s) { - nvme_subsystem_for_each_ctrl(s, c) { - transport = nvme_ctrl_get_transport(c); - traddr = nvme_ctrl_get_traddr(c); - host_traddr = nvme_ctrl_get_host_traddr(c); - host_iface = nvme_ctrl_get_host_iface(c); + transport = nvme_ctrl_get_transport(c); + traddr = nvme_ctrl_get_traddr(c); + host_traddr = nvme_ctrl_get_host_traddr(c); + host_iface = nvme_ctrl_get_host_iface(c); + + if (!transport && !traddr) + return 0; + + /* ignore none fabric transports */ + if (strcmp(transport, "tcp") && + strcmp(transport, "rdma") && + strcmp(transport, "fc")) + return 0; + + /* ignore if no host_traddr for fc */ + if (!strcmp(transport, "fc")) { + if (!host_traddr) { + fprintf(stderr, "host_traddr required for fc\n"); + return 0; + } + } - if (!transport && !traddr) - continue; + /* ignore if host_iface set for any transport other than tcp */ + if (!strcmp(transport, "rdma") || !strcmp(transport, "fc")) { + if (host_iface) { + fprintf(stderr, + "host_iface not permitted for rdma or fc\n"); + return 0; + } + } - /* ignore none fabric transports */ - if (strcmp(transport, "tcp") && - strcmp(transport, "rdma") && - strcmp(transport, "fc")) - continue; + trsvcid = nvme_ctrl_get_trsvcid(c); + if (!trsvcid || !strcmp(trsvcid, "")) + trsvcid = nvmf_get_default_trsvcid(transport, true); - /* ignore if no host_traddr for fc */ - if (!strcmp(transport, "fc")) { - if (!host_traddr) { - fprintf(stderr, "host_traddr required for fc\n"); - continue; - } - } + if (force) + subsysnqn = nvme_ctrl_get_subsysnqn(c); + else + subsysnqn = NVME_DISC_SUBSYS_NAME; - /* ignore if host_iface set for any transport other than tcp */ - if (!strcmp(transport, "rdma") || !strcmp(transport, "fc")) { - if (host_iface) { - fprintf(stderr, "host_iface not permitted for rdma or fc\n"); - continue; - } - } + if (nvme_ctrl_is_persistent(c)) + persistent = true; - trsvcid = nvme_ctrl_get_trsvcid(c); - if (!trsvcid || !strcmp(trsvcid, "")) - trsvcid = nvmf_get_default_trsvcid(transport, - true); + memcpy(&cfg, defcfg, sizeof(cfg)); - if (force) - subsysnqn = nvme_ctrl_get_subsysnqn(c); - else - subsysnqn = NVME_DISC_SUBSYS_NAME; + struct tr_config trcfg = { + .subsysnqn = subsysnqn, + .transport = transport, + .traddr = traddr, + .host_traddr = host_traddr, + .host_iface = host_iface, + .trsvcid = trsvcid, + }; - if (nvme_ctrl_is_persistent(c)) - persistent = true; + if (!force) { + cn = lookup_ctrl(h, &trcfg); + if (cn) { + __discover(cn, &cfg, raw, connect, true, flags); + return 0; + } + } - memcpy(&cfg, defcfg, sizeof(cfg)); + cn = nvmf_create_discover_ctrl(r, h, &cfg, &trcfg); + if (!cn) + return 0; - struct tr_config trcfg = { - .subsysnqn = subsysnqn, - .transport = transport, - .traddr = traddr, - .host_traddr = host_traddr, - .host_iface = host_iface, - .trsvcid = trsvcid, - }; + __discover(cn, &cfg, raw, connect, persistent, flags); + if (!(persistent || is_persistent_discovery_ctrl(h, cn))) + ret = nvme_disconnect_ctrl(cn); + nvme_free_ctrl(cn); - if (!force) { - cn = lookup_ctrl(h, &trcfg); - if (cn) { - __discover(cn, &cfg, raw, connect, - true, flags); - continue; - } - } + return ret; +} - cn = nvmf_create_discover_ctrl(r, h, &cfg, &trcfg); - if (!cn) - continue; +static int discover_from_json_config_file(nvme_root_t r, nvme_host_t h, + const char *desc, bool connect, + const struct nvme_fabrics_config *defcfg, + nvme_print_flags_t flags, + bool force) +{ + nvme_subsystem_t s; + nvme_ctrl_t c; + int ret = 0; - __discover(cn, &cfg, raw, connect, persistent, flags); - if (!(persistent || is_persistent_discovery_ctrl(h, cn))) - ret = nvme_disconnect_ctrl(cn); - nvme_free_ctrl(cn); + nvme_for_each_subsystem(h, s) { + nvme_subsystem_for_each_ctrl(s, c) { + ret = _discover_from_json_config_file(r, h, s, c, desc, + connect, defcfg, flags, force); } } From 927aac948bd33016ee439446cb16f05ff036a291 Mon Sep 17 00:00:00 2001 From: Daniel Wagner Date: Tue, 9 Jul 2024 11:02:48 +0200 Subject: [PATCH 054/281] fabrics: connect all hosts in config.json Iterate over all hosts defined in the config.json configuration file, instead just the default controller. Signed-off-by: Daniel Wagner --- fabrics.c | 42 +++++++++++++++++++++++++++++++++--------- 1 file changed, 33 insertions(+), 9 deletions(-) diff --git a/fabrics.c b/fabrics.c index db5cc97d74..f8136c4ab8 100644 --- a/fabrics.c +++ b/fabrics.c @@ -588,20 +588,44 @@ static int _discover_from_json_config_file(nvme_root_t r, nvme_host_t h, nvme_su return ret; } -static int discover_from_json_config_file(nvme_root_t r, nvme_host_t h, - const char *desc, bool connect, +static int discover_from_json_config_file(nvme_root_t r, const char *hostnqn, + const char *hostid, const char *desc, + bool connect, const struct nvme_fabrics_config *defcfg, nvme_print_flags_t flags, bool force) { + const char *hnqn, *hid; + nvme_host_t h; nvme_subsystem_t s; nvme_ctrl_t c; - int ret = 0; + int ret = 0, err; - nvme_for_each_subsystem(h, s) { - nvme_subsystem_for_each_ctrl(s, c) { - ret = _discover_from_json_config_file(r, h, s, c, desc, - connect, defcfg, flags, force); + nvme_for_each_host(r, h) { + nvme_for_each_subsystem(h, s) { + hnqn = nvme_host_get_hostnqn(h); + if (hostnqn && hnqn && strcmp(hostnqn, hnqn)) + continue; + hid = nvme_host_get_hostid(h); + if (hostid && hid && strcmp(hostid, hid)) + continue; + + nvme_subsystem_for_each_ctrl(s, c) { + err = _discover_from_json_config_file( + r, h, s, c, desc, connect, defcfg, + flags, force); + + if (err) { + fprintf(stderr, + "failed to connect to hostnqn=%s,nqn=%s,%s\n", + nvme_host_get_hostnqn(h), + nvme_subsystem_get_name(s), + nvme_ctrl_get_address(c)); + + if (!ret) + ret = err; + } + } } } @@ -749,8 +773,8 @@ int nvmf_discover(const char *desc, int argc, char **argv, bool connect) goto out_free; if (json_config) - ret = discover_from_json_config_file(r, h, desc, - connect, &cfg, + ret = discover_from_json_config_file(r, hostnqn, hostid, + desc, connect, &cfg, flags, force); if (ret || access(PATH_NVMF_DISC, F_OK)) goto out_free; From 1d00848677db63f763a25140e2fb9cf7ada123c3 Mon Sep 17 00:00:00 2001 From: Tokunori Ikegami Date: Fri, 23 Feb 2024 21:07:48 +0900 Subject: [PATCH 055/281] ccan: Add freed pointer checking to delete strset member Add to set freed entry pointer to NULL then check it if NULL. Signed-off-by: Tokunori Ikegami --- ccan/ccan/strset/strset.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ccan/ccan/strset/strset.c b/ccan/ccan/strset/strset.c index 06b0d7a76c..823241ffdf 100644 --- a/ccan/ccan/strset/strset.c +++ b/ccan/ccan/strset/strset.c @@ -194,6 +194,7 @@ char *strset_del(struct strset *set, const char *member) /* Sew empty string back so remaining logic works */ free(n->u.n); + n->u.n = NULL; n->u.s = empty_str; break; } @@ -208,7 +209,7 @@ char *strset_del(struct strset *set, const char *member) } /* Did we find it? */ - if (!streq(member, n->u.s)) { + if (!n->u.s || !streq(member, n->u.s)) { errno = ENOENT; return NULL; } From 5f5d8b22275d7656c24b0c94f247f8b3b93077b7 Mon Sep 17 00:00:00 2001 From: Daniel Wagner Date: Fri, 12 Jul 2024 13:52:54 +0200 Subject: [PATCH 056/281] build: add static build target Add a static build target. Signed-off-by: Daniel Wagner --- scripts/build.sh | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/scripts/build.sh b/scripts/build.sh index 933d62bc7a..a88336fb90 100755 --- a/scripts/build.sh +++ b/scripts/build.sh @@ -23,6 +23,7 @@ usage() { echo " appimage build AppImage target" echo " distro build libnvme and nvme-cli separately" echo " docs build documentation" + echo " static build a static binary" echo "" echo "configs with muon:" echo " [default] minimal static build" @@ -126,6 +127,16 @@ config_meson_docs() { "${BUILDDIR}" } +config_meson_static() { + CC="${CC}" "${MESON}" setup \ + --buildtype=release \ + --default-library=static \ + --wrap-mode=forcefallback \ + -Dc_link_args="-static" \ + -Dlibnvme:keyutils=disabled \ + "${BUILDDIR}" +} + build_meson() { "${MESON}" compile \ -C "${BUILDDIR}" From 9d557b8ea3604ea87a95b9b15ed8113a5ba7973a Mon Sep 17 00:00:00 2001 From: Daniel Wagner Date: Fri, 12 Jul 2024 14:18:12 +0200 Subject: [PATCH 057/281] build: show git version used during configuration Show which git version is used when configuration phase. Signed-off-by: Daniel Wagner --- meson.build | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/meson.build b/meson.build index 11f7cc5453..a53fec24d6 100644 --- a/meson.build +++ b/meson.build @@ -352,7 +352,8 @@ if meson.version().version_compare('>=0.53.0') } summary(dep_dict, section: 'Dependencies') conf_dict = { - 'pdc enabled': get_option('pdc-enabled') + 'git version': conf.get('GIT_VERSION'), + 'pdc enabled': get_option('pdc-enabled'), } summary(conf_dict, section: 'Configuration') endif From edb1bb45769cc60ebc8f8437b57c039eb5efd138 Mon Sep 17 00:00:00 2001 From: Daniel Wagner Date: Fri, 12 Jul 2024 14:51:14 +0200 Subject: [PATCH 058/281] build: fetch complete git history In order to build a image with which contains the correct git version SHA we need to fetch the complete git tree. Otherwise 'git describe' fails and we use the project version string as fallback. Signed-off-by: Daniel Wagner --- .github/workflows/appimage.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.github/workflows/appimage.yml b/.github/workflows/appimage.yml index c8205ef8c9..8b96bc1a53 100644 --- a/.github/workflows/appimage.yml +++ b/.github/workflows/appimage.yml @@ -17,6 +17,13 @@ jobs: image: ghcr.io/igaw/linux-nvme/debian:latest steps: - uses: actions/checkout@v4 + with: + fetch-depth: 0 + - name: fixup permissions + env: + GITHUB_WORKSPACE: ${{ github.workspace }} + run: | + git config --global --add safe.directory "${GITHUB_WORKSPACE}" - name: build run: | scripts/build.sh appimage From 698d356137e797a8a64cf619935fb0539f3a7f02 Mon Sep 17 00:00:00 2001 From: Daniel Wagner Date: Fri, 12 Jul 2024 20:38:38 +0200 Subject: [PATCH 059/281] build: use official download action There is no point in using 3rd party actions for downloading the artifacts. Let's use the official one. Signed-off-by: Daniel Wagner --- .github/workflows/appimage.yml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/.github/workflows/appimage.yml b/.github/workflows/appimage.yml index 8b96bc1a53..c7b92f7fde 100644 --- a/.github/workflows/appimage.yml +++ b/.github/workflows/appimage.yml @@ -43,11 +43,10 @@ jobs: needs: build-appimage if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' && github.repository == 'linux-nvme/nvme-cli' }} steps: - - name: Download artifact - uses: dawidd6/action-download-artifact@v6 + - uses: actions/download-artifact@v4 with: - workflow: ${{ github.event.workflow_run.workflow_id }} - workflow_conclusion: success + name: AppImage + path: AppImage - name: FTP Deployer uses: sand4rt/ftp-deployer@v1.8 with: From 6b709ad831264c4995823608c4096f0dde705150 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Jul 2024 18:23:37 +0000 Subject: [PATCH 060/281] build(deps): bump mosteo-actions/docker-run from 1 to 2 Bumps [mosteo-actions/docker-run](https://github.com/mosteo-actions/docker-run) from 1 to 2. - [Release notes](https://github.com/mosteo-actions/docker-run/releases) - [Commits](https://github.com/mosteo-actions/docker-run/compare/v1...v2) --- updated-dependencies: - dependency-name: mosteo-actions/docker-run dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 78ae0cad70..66b3811bae 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -44,7 +44,7 @@ jobs: - name: enable foreign arch uses: dbhi/qus/action@main - name: compile and run unit tests - uses: mosteo-actions/docker-run@v1 + uses: mosteo-actions/docker-run@v2 with: image: ghcr.io/igaw/linux-nvme/ubuntu-cross-${{ matrix.arch }}:latest guest-dir: /build From e99ee46b7ad6cd2e426ef06aac38c24df6c469f1 Mon Sep 17 00:00:00 2001 From: jeff-lien-wdc Date: Mon, 8 Jan 2024 09:38:55 -0600 Subject: [PATCH 061/281] wdc: Update and refactor the C0h log page parsing Add OCP 2.5 fields Create common functions to get and parse the different variations of the C0 log page. Signed-off-by: jeff-lien-wdc --- plugins/wdc/wdc-nvme.c | 739 +++++++++++++++-------------------------- plugins/wdc/wdc-nvme.h | 2 +- 2 files changed, 262 insertions(+), 479 deletions(-) diff --git a/plugins/wdc/wdc-nvme.c b/plugins/wdc/wdc-nvme.c index bf1ab78b71..ac6e75c427 100644 --- a/plugins/wdc/wdc-nvme.c +++ b/plugins/wdc/wdc-nvme.c @@ -681,44 +681,6 @@ struct __packed wdc_nvme_ext_smart_log { __u8 ext_smart_lpg[16]; /* 496 Log page GUID */ }; -enum { - SCAO_PMUW = 0, /* Physical media units written */ - SCAO_PMUR = 16, /* Physical media units read */ - SCAO_BUNBR = 32, /* Bad user nand blocks raw */ - SCAO_BUNBN = 38, /* Bad user nand blocks normalized */ - SCAO_BSNBR = 40, /* Bad system nand blocks raw */ - SCAO_BSNBN = 46, /* Bad system nand blocks normalized */ - SCAO_XRC = 48, /* XOR recovery count */ - SCAO_UREC = 56, /* Uncorrectable read error count */ - SCAO_SEEC = 64, /* Soft ecc error count */ - SCAO_EECE = 72, /* End to end corrected errors */ - SCAO_EEDC = 76, /* End to end detected errors */ - SCAO_SDPU = 80, /* System data percent used */ - SCAO_RFSC = 81, /* Refresh counts */ - SCAO_MXUDEC = 88, /* Max User data erase counts */ - SCAO_MNUDEC = 92, /* Min User data erase counts */ - SCAO_NTTE = 96, /* Number of Thermal throttling events */ - SCAO_CTS = 97, /* Current throttling status */ - SCAO_EVF = 98, /* Errata Version Field */ - SCAO_PVF = 99, /* Point Version Field */ - SCAO_MIVF = 101, /* Minor Version Field */ - SCAO_MAVF = 103, /* Major Version Field */ - SCAO_PCEC = 104, /* PCIe correctable error count */ - SCAO_ICS = 112, /* Incomplete shutdowns */ - SCAO_PFB = 120, /* Percent free blocks */ - SCAO_CPH = 128, /* Capacitor health */ - SCAO_NEV = 130, /* NVMe Errata Version */ - SCAO_UIO = 136, /* Unaligned I/O */ - SCAO_SVN = 144, /* Security Version Number */ - SCAO_NUSE = 152, /* NUSE - Namespace utilization */ - SCAO_PSC = 160, /* PLP start count */ - SCAO_EEST = 176, /* Endurance estimate */ - SCAO_PLRC = 192, /* PCIe Link Retraining Count */ - SCAO_PSCC = 200, /* Power State Change Count */ - SCAO_LPV = 494, /* Log page version */ - SCAO_LPG = 496, /* Log page GUID */ -}; - struct ocp_bad_nand_block_count { __u64 raw : 48; __u16 normalized : 16; @@ -766,8 +728,9 @@ struct ocp_cloud_smart_log { __u8 percent_free_blocks; __u8 rsvd121[7]; __u16 capacitor_health; - __u8 nvme_errata_ver; - __u8 rsvd131[5]; + __u8 nvme_base_errata_ver; + __u8 nvme_cmd_set_errata_ver; + __u8 rsvd132[4]; __u64 unaligned_io; __u64 security_version_number; __u64 total_nuse; @@ -775,7 +738,8 @@ struct ocp_cloud_smart_log { __u8 endurance_estimate[16]; __u64 pcie_link_retraining_cnt; __u64 power_state_change_cnt; - __u8 rsvd208[286]; + char lowest_permitted_fw_rev[8]; + __u8 rsvd216[278]; __u16 log_page_version; __u8 log_page_guid[16]; }; @@ -1004,6 +968,13 @@ static int wdc_enc_submit_move_data(struct nvme_dev *dev, char *cmd, int len, in static bool get_dev_mgment_cbs_data(nvme_root_t r, struct nvme_dev *dev, __u8 log_id, void **cbs_data); static __u32 wdc_get_fw_cust_id(nvme_root_t r, struct nvme_dev *dev); +static int wdc_print_c0_cloud_attr_log(void *data, + int fmt, + struct nvme_dev *dev); +static int wdc_print_c0_eol_log(void *data, int fmt); +static void wdc_show_cloud_smart_log_normal(struct ocp_cloud_smart_log *log, + struct nvme_dev *dev); +static void wdc_show_cloud_smart_log_json(struct ocp_cloud_smart_log *log); /* Drive log data size */ struct wdc_log_size { @@ -5875,6 +5846,141 @@ static void wdc_print_fw_act_history_log_json(__u8 *data, int num_entries, json_free_object(root); } +static int nvme_get_print_ocp_cloud_smart_log(struct nvme_dev *dev, + int uuid_index, + __u32 namespace_id, + int fmt) +{ + struct ocp_cloud_smart_log *log_ptr = NULL; + int ret, i; + __u32 length = WDC_NVME_SMART_CLOUD_ATTR_LEN; + int fd = dev_fd(dev); + + log_ptr = (struct ocp_cloud_smart_log *)malloc(sizeof(__u8) * length); + if (!log_ptr) { + fprintf(stderr, "ERROR: WDC: malloc: %s\n", strerror(errno)); + return -1; + } + + if (namespace_id == NVME_NSID_ALL) { + ret = nvme_get_nsid(fd, &namespace_id); + if (ret < 0) + namespace_id = NVME_NSID_ALL; + } + + /* Get the 0xC0 log data */ + struct nvme_get_log_args args = { + .args_size = sizeof(args), + .fd = fd, + .lid = WDC_NVME_GET_SMART_CLOUD_ATTR_LOG_ID, + .nsid = namespace_id, + .lpo = 0, + .lsp = NVME_LOG_LSP_NONE, + .lsi = 0, + .rae = false, + .uuidx = uuid_index, + .csi = NVME_CSI_NVM, + .ot = false, + .len = length, + .log = log_ptr, + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .result = NULL, + }; + ret = nvme_get_log(&args); + + if (fmt == JSON) + nvme_show_status(ret); + + if (!ret) { + /* Verify GUID matches */ + for (i = 0; i < 16; i++) { + if (scao_guid[i] != log_ptr->log_page_guid[i]) { + fprintf(stderr, "ERROR: WDC: Unknown GUID in C0 Log Page data\n"); + int j; + + fprintf(stderr, "ERROR: WDC: Expected GUID: 0x"); + for (j = 0; j < 16; j++) + fprintf(stderr, "%x", scao_guid[j]); + fprintf(stderr, "\nERROR: WDC: Actual GUID: 0x"); + for (j = 0; j < 16; j++) + fprintf(stderr, "%x", log_ptr->log_page_guid[j]); + fprintf(stderr, "\n"); + + ret = -1; + break; + } + } + + if (!ret) + /* parse the data */ + wdc_print_c0_cloud_attr_log(log_ptr, fmt, dev); + } else { + fprintf(stderr, "ERROR: WDC: Unable to read C0 Log Page data\n"); + ret = -1; + } + + free(log_ptr); + return ret; +} + +static int nvme_get_print_c0_eol_log(struct nvme_dev *dev, + int uuid_index, + __u32 namespace_id, + int fmt) +{ + void *log_ptr = NULL; + int ret; + __u32 length = WDC_NVME_EOL_STATUS_LOG_LEN; + int fd = dev_fd(dev); + + log_ptr = (void *)malloc(sizeof(__u8) * length); + if (!log_ptr) { + fprintf(stderr, "ERROR: WDC: malloc: %s\n", strerror(errno)); + return -1; + } + + if (namespace_id == NVME_NSID_ALL) { + ret = nvme_get_nsid(fd, &namespace_id); + if (ret < 0) + namespace_id = NVME_NSID_ALL; + } + + /* Get the 0xC0 log data */ + struct nvme_get_log_args args = { + .args_size = sizeof(args), + .fd = fd, + .lid = WDC_NVME_GET_EOL_STATUS_LOG_OPCODE, + .nsid = namespace_id, + .lpo = 0, + .lsp = NVME_LOG_LSP_NONE, + .lsi = 0, + .rae = false, + .uuidx = uuid_index, + .csi = NVME_CSI_NVM, + .ot = false, + .len = length, + .log = log_ptr, + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .result = NULL, + }; + ret = nvme_get_log(&args); + + if (fmt == JSON) + nvme_show_status(ret); + + if (!ret) { + /* parse the data */ + wdc_print_c0_eol_log(log_ptr, fmt); + } else { + fprintf(stderr, "ERROR: WDC: Unable to read C0 Log Page data "); + fprintf(stderr, "with uuid index %d\n", uuid_index); + ret = -1; + } + + free(log_ptr); + return ret; +} + static int nvme_get_ext_smart_cloud_log(int fd, __u8 **data, int uuid_index, __u32 namespace_id) { int ret, i; @@ -6556,177 +6662,6 @@ static void wdc_print_ext_smart_cloud_log_json(void *data, int mask) json_free_object(root); } -static void wdc_print_smart_cloud_attr_C0_normal(void *data) -{ - __u8 *log_data = (__u8 *)data; - uint16_t smart_log_ver = 0; - - printf(" SMART Cloud Attributes :-\n"); - - printf(" Physical media units written : %s\n", - uint128_t_to_string(le128_to_cpu(&log_data[SCAO_PMUW]))); - printf(" Physical media units read : %s\n", - uint128_t_to_string(le128_to_cpu(&log_data[SCAO_PMUR]))); - printf(" Bad user nand blocks Raw : %"PRIu64"\n", - (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_BUNBR] & 0x0000FFFFFFFFFFFF)); - printf(" Bad user nand blocks Normalized : %d\n", - (uint16_t)le16_to_cpu(*(uint16_t *)&log_data[SCAO_BUNBN])); - printf(" Bad system nand blocks Raw : %"PRIu64"\n", - (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_BSNBR] & 0x0000FFFFFFFFFFFF)); - printf(" Bad system nand blocks Normalized : %d\n", - (uint16_t)le16_to_cpu(*(uint16_t *)&log_data[SCAO_BSNBN])); - printf(" XOR recovery count : %"PRIu64"\n", - (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_XRC])); - printf(" Uncorrectable read error count : %"PRIu64"\n", - (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_UREC])); - printf(" Soft ecc error count : %"PRIu64"\n", - (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_SEEC])); - printf(" End to end corrected errors : %"PRIu32"\n", - (uint32_t)le32_to_cpu(*(uint32_t *)&log_data[SCAO_EECE])); - printf(" End to end detected errors : %"PRIu32"\n", - (uint32_t)le32_to_cpu(*(uint32_t *)&log_data[SCAO_EEDC])); - printf(" System data percent used : %d\n", (__u8)log_data[SCAO_SDPU]); - printf(" Refresh counts : %"PRIu64"\n", - (uint64_t)(le64_to_cpu(*(uint64_t *)&log_data[SCAO_RFSC]) & 0x00FFFFFFFFFFFFFF)); - printf(" Max User data erase counts : %"PRIu32"\n", - (uint32_t)le32_to_cpu(*(uint32_t *)&log_data[SCAO_MXUDEC])); - printf(" Min User data erase counts : %"PRIu32"\n", - (uint32_t)le32_to_cpu(*(uint32_t *)&log_data[SCAO_MNUDEC])); - printf(" Number of Thermal throttling events : %d\n", (__u8)log_data[SCAO_NTTE]); - printf(" Current throttling status : 0x%x\n", (__u8)log_data[SCAO_CTS]); - printf(" PCIe correctable error count : %"PRIu64"\n", - (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_PCEC])); - printf(" Incomplete shutdowns : %"PRIu32"\n", - (uint32_t)le32_to_cpu(*(uint32_t *)&log_data[SCAO_ICS])); - printf(" Percent free blocks : %d\n", (__u8)log_data[SCAO_PFB]); - printf(" Capacitor health : %"PRIu16"\n", - (uint16_t)le16_to_cpu(*(uint16_t *)&log_data[SCAO_CPH])); - printf(" Unaligned I/O : %"PRIu64"\n", - (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_UIO])); - printf(" Security Version Number : %"PRIu64"\n", - (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_SVN])); - printf(" NUSE Namespace utilization : %"PRIu64"\n", - (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_NUSE])); - printf(" PLP start count : %s\n", - uint128_t_to_string(le128_to_cpu(&log_data[SCAO_PSC]))); - printf(" Endurance estimate : %s\n", - uint128_t_to_string(le128_to_cpu(&log_data[SCAO_EEST]))); - smart_log_ver = (uint16_t)le16_to_cpu(*(uint16_t *)&log_data[SCAO_LPV]); - printf(" Log page version : %"PRIu16"\n", smart_log_ver); - printf(" Log page GUID : 0x"); - printf("%"PRIx64"%"PRIx64"\n", - (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_LPG + 8]), - (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_LPG])); - if (smart_log_ver > 2) { - printf(" Errata Version Field : %d\n", - (__u8)log_data[SCAO_EVF]); - printf(" Point Version Field : %"PRIu16"\n", - (uint16_t)log_data[SCAO_PVF]); - printf(" Minor Version Field : %"PRIu16"\n", - (uint16_t)log_data[SCAO_MIVF]); - printf(" Major Version Field : %d\n", - (__u8)log_data[SCAO_MAVF]); - printf(" NVMe Errata Version : %d\n", - (__u8)log_data[SCAO_NEV]); - printf(" PCIe Link Retraining Count : %"PRIu64"\n", - (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_PLRC])); - } - if (smart_log_ver > 3) { - printf(" Power State Change Count : %"PRIu64"\n", - (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_PSCC])); - } - printf("\n"); -} - -static void wdc_print_smart_cloud_attr_C0_json(void *data) -{ - __u8 *log_data = (__u8 *)data; - struct json_object *root = json_create_object(); - uint16_t smart_log_ver = 0; - - json_object_add_value_uint128(root, "Physical media units written", - le128_to_cpu(&log_data[SCAO_PMUW])); - json_object_add_value_uint128(root, "Physical media units read", - le128_to_cpu(&log_data[SCAO_PMUR])); - json_object_add_value_uint64(root, "Bad user nand blocks - Raw", - (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_BUNBR] & 0x0000FFFFFFFFFFFF)); - json_object_add_value_uint(root, "Bad user nand blocks - Normalized", - (uint16_t)le16_to_cpu(*(uint16_t *)&log_data[SCAO_BUNBN])); - json_object_add_value_uint64(root, "Bad system nand blocks - Raw", - (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_BSNBR] & 0x0000FFFFFFFFFFFF)); - json_object_add_value_uint(root, "Bad system nand blocks - Normalized", - (uint16_t)le16_to_cpu(*(uint16_t *)&log_data[SCAO_BSNBN])); - json_object_add_value_uint64(root, "XOR recovery count", - (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_XRC])); - json_object_add_value_uint64(root, "Uncorrectable read error count", - (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_UREC])); - json_object_add_value_uint64(root, "Soft ecc error count", - (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_SEEC])); - json_object_add_value_uint(root, "End to end corrected errors", - (uint32_t)le32_to_cpu(*(uint32_t *)&log_data[SCAO_EECE])); - json_object_add_value_uint(root, "End to end detected errors", - (uint32_t)le32_to_cpu(*(uint32_t *)&log_data[SCAO_EEDC])); - json_object_add_value_uint(root, "System data percent used", - (__u8)log_data[SCAO_SDPU]); - json_object_add_value_uint64(root, "Refresh counts", - (uint64_t)(le64_to_cpu(*(uint64_t *)&log_data[SCAO_RFSC]) & 0x00FFFFFFFFFFFFFF)); - json_object_add_value_uint(root, "Max User data erase counts", - (uint32_t)le32_to_cpu(*(uint32_t *)&log_data[SCAO_MXUDEC])); - json_object_add_value_uint(root, "Min User data erase counts", - (uint32_t)le32_to_cpu(*(uint32_t *)&log_data[SCAO_MNUDEC])); - json_object_add_value_uint(root, "Number of Thermal throttling events", - (__u8)log_data[SCAO_NTTE]); - json_object_add_value_uint(root, "Current throttling status", - (__u8)log_data[SCAO_CTS]); - json_object_add_value_uint64(root, "PCIe correctable error count", - (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_PCEC])); - json_object_add_value_uint(root, "Incomplete shutdowns", - (uint32_t)le32_to_cpu(*(uint32_t *)&log_data[SCAO_ICS])); - json_object_add_value_uint(root, "Percent free blocks", - (__u8)log_data[SCAO_PFB]); - json_object_add_value_uint(root, "Capacitor health", - (uint16_t)le16_to_cpu(*(uint16_t *)&log_data[SCAO_CPH])); - json_object_add_value_uint64(root, "Unaligned I/O", - (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_UIO])); - json_object_add_value_uint64(root, "Security Version Number", - (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_SVN])); - json_object_add_value_uint64(root, "NUSE - Namespace utilization", - (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_NUSE])); - json_object_add_value_uint128(root, "PLP start count", - le128_to_cpu(&log_data[SCAO_PSC])); - json_object_add_value_uint128(root, "Endurance estimate", - le128_to_cpu(&log_data[SCAO_EEST])); - smart_log_ver = (uint16_t)le16_to_cpu(*(uint16_t *)&log_data[SCAO_LPV]); - json_object_add_value_uint(root, "Log page version", smart_log_ver); - char guid[40]; - - memset((void *)guid, 0, 40); - sprintf((char *)guid, "0x%"PRIx64"%"PRIx64"", - (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_LPG + 8]), - (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_LPG])); - json_object_add_value_string(root, "Log page GUID", guid); - if (smart_log_ver > 2) { - json_object_add_value_uint(root, "Errata Version Field", - (__u8)log_data[SCAO_EVF]); - json_object_add_value_uint(root, "Point Version Field", - (uint16_t)log_data[SCAO_PVF]); - json_object_add_value_uint(root, "Minor Version Field", - (uint16_t)log_data[SCAO_MIVF]); - json_object_add_value_uint(root, "Major Version Field", - (__u8)log_data[SCAO_MAVF]); - json_object_add_value_uint(root, "NVMe Errata Version", - (__u8)log_data[SCAO_NEV]); - json_object_add_value_uint64(root, "PCIe Link Retraining Count", - (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_PLRC])); - } - if (smart_log_ver > 3) { - json_object_add_value_uint64(root, "Power State Change Count", - (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_PSCC])); - } - json_print_object(root, NULL); - printf("\n"); - json_free_object(root); -} static void wdc_print_eol_c0_normal(void *data) { @@ -6794,18 +6729,26 @@ static int wdc_print_ext_smart_cloud_log(void *data, int fmt) return 0; } -static int wdc_print_c0_cloud_attr_log(void *data, int fmt) +static int wdc_print_c0_cloud_attr_log(void *data, + int fmt, + struct nvme_dev *dev) { + struct ocp_cloud_smart_log *log = (struct ocp_cloud_smart_log *)data; + if (!data) { fprintf(stderr, "ERROR: WDC: Invalid buffer to read 0xC0 log\n"); return -1; } + switch (fmt) { + case BINARY: + d_raw((unsigned char *)log, sizeof(struct ocp_cloud_smart_log)); + break; case NORMAL: - wdc_print_smart_cloud_attr_C0_normal(data); + wdc_show_cloud_smart_log_normal(log, dev); break; case JSON: - wdc_print_smart_cloud_attr_C0_json(data); + wdc_show_cloud_smart_log_json(log); break; } return 0; @@ -6818,6 +6761,9 @@ static int wdc_print_c0_eol_log(void *data, int fmt) return -1; } switch (fmt) { + case BINARY: + d_raw((unsigned char *)data, WDC_NVME_EOL_STATUS_LOG_LEN); + break; case NORMAL: wdc_print_eol_c0_normal(data); break; @@ -6832,113 +6778,17 @@ static int wdc_get_c0_log_page_sn_customer_id_0x100X(struct nvme_dev *dev, int u char *format, __u32 namespace_id, int fmt) { int ret; - __u8 *data; - int i; if (!uuid_index) { - data = (__u8 *)malloc(sizeof(__u8) * WDC_NVME_SMART_CLOUD_ATTR_LEN); - if (!data) { - fprintf(stderr, "ERROR: WDC: malloc: %s\n", strerror(errno)); - return -1; - } - - if (namespace_id == NVME_NSID_ALL) { - ret = nvme_get_nsid(dev_fd(dev), &namespace_id); - if (ret < 0) - namespace_id = NVME_NSID_ALL; - } - - /* Get the 0xC0 log data */ - struct nvme_get_log_args args = { - .args_size = sizeof(args), - .fd = dev_fd(dev), - .lid = WDC_NVME_GET_SMART_CLOUD_ATTR_LOG_ID, - .nsid = namespace_id, - .lpo = 0, - .lsp = NVME_LOG_LSP_NONE, - .lsi = 0, - .rae = false, - .uuidx = uuid_index, - .csi = NVME_CSI_NVM, - .ot = false, - .len = WDC_NVME_SMART_CLOUD_ATTR_LEN, - .log = data, - .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, - .result = NULL, - }; - ret = nvme_get_log(&args); - - if (strcmp(format, "json")) - nvme_show_status(ret); - - if (!ret) { - /* Verify GUID matches */ - for (i = 0; i < 16; i++) { - if (scao_guid[i] != data[SCAO_LPG + i]) { - fprintf(stderr, "ERROR: WDC: Unknown GUID in C0 Log Page data\n"); - int j; - - fprintf(stderr, "ERROR: WDC: Expected GUID: 0x"); - for (j = 0; j < 16; j++) - fprintf(stderr, "%x", scao_guid[j]); - fprintf(stderr, "\nERROR: WDC: Actual GUID: 0x"); - for (j = 0; j < 16; j++) - fprintf(stderr, "%x", data[SCAO_LPG + j]); - fprintf(stderr, "\n"); - - ret = -1; - break; - } - } - - if (!ret) - /* parse the data */ - wdc_print_c0_cloud_attr_log(data, fmt); - } else { - fprintf(stderr, "ERROR: WDC: Unable to read C0 Log Page data\n"); - ret = -1; - } - - free(data); + ret = nvme_get_print_ocp_cloud_smart_log(dev, + uuid_index, + namespace_id, + fmt); } else if (uuid_index == 1) { - data = (__u8 *)malloc(sizeof(__u8) * WDC_NVME_EOL_STATUS_LOG_LEN); - if (!data) { - fprintf(stderr, "ERROR: WDC: malloc: %s\n", strerror(errno)); - return -1; - } - - /* Get the 0xC0 log data */ - struct nvme_get_log_args args = { - .args_size = sizeof(args), - .fd = dev_fd(dev), - .lid = WDC_NVME_GET_EOL_STATUS_LOG_OPCODE, - .nsid = NVME_NSID_ALL, - .lpo = 0, - .lsp = NVME_LOG_LSP_NONE, - .lsi = 0, - .rae = false, - .uuidx = uuid_index, - .csi = NVME_CSI_NVM, - .ot = false, - .len = WDC_NVME_EOL_STATUS_LOG_LEN, - .log = data, - .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, - .result = NULL, - }; - ret = nvme_get_log(&args); - - if (strcmp(format, "json")) - nvme_show_status(ret); - - if (!ret) { - /* parse the data */ - wdc_print_c0_eol_log(data, fmt); - } else { - fprintf(stderr, "ERROR: WDC: Unable to read C0 Log Page data\n"); - ret = -1; - } - - free(data); + ret = nvme_get_print_c0_eol_log(dev, + uuid_index, + namespace_id, + fmt); } else { fprintf(stderr, "ERROR: WDC: Unknown uuid index\n"); ret = -1; @@ -6952,7 +6802,6 @@ static int wdc_get_c0_log_page_sn(nvme_root_t r, struct nvme_dev *dev, int uuid_ { int ret = 0; __u32 cust_id; - __u8 *data; cust_id = wdc_get_fw_cust_id(r, dev); if (cust_id == WDC_INVALID_CUSTOMER_ID) { @@ -6965,30 +6814,10 @@ static int wdc_get_c0_log_page_sn(nvme_root_t r, struct nvme_dev *dev, int uuid_ ret = wdc_get_c0_log_page_sn_customer_id_0x100X(dev, uuid_index, format, namespace_id, fmt); } else { - data = (__u8 *)malloc(sizeof(__u8) * WDC_NVME_EOL_STATUS_LOG_LEN); - if (!data) { - fprintf(stderr, "ERROR: WDC: malloc: %s\n", strerror(errno)); - return -1; - } - - /* Get the 0xC0 log data */ - ret = nvme_get_log_simple(dev_fd(dev), - WDC_NVME_GET_EOL_STATUS_LOG_OPCODE, - WDC_NVME_EOL_STATUS_LOG_LEN, - data); - - if (strcmp(format, "json")) - nvme_show_status(ret); - - if (!ret) { - /* parse the data */ - wdc_print_c0_eol_log(data, fmt); - } else { - fprintf(stderr, "ERROR: WDC: Unable to read C0 Log Page data\n"); - ret = -1; - } - - free(data); + ret = nvme_get_print_c0_eol_log(dev, + 0, + namespace_id, + fmt); } return ret; @@ -7001,8 +6830,6 @@ static int wdc_get_c0_log_page(nvme_root_t r, struct nvme_dev *dev, char *format nvme_print_flags_t fmt; int ret; __u8 *data; - __u8 log_id; - __u32 length; if (!wdc_check_device(r, dev)) return -1; @@ -7035,86 +6862,23 @@ static int wdc_get_c0_log_page(nvme_root_t r, struct nvme_dev *dev, char *format case WDC_NVME_SN650_DEV_ID_4: case WDC_NVME_SN655_DEV_ID: if (uuid_index == 0) { - log_id = WDC_NVME_GET_SMART_CLOUD_ATTR_LOG_ID; - length = WDC_NVME_SMART_CLOUD_ATTR_LEN; + ret = nvme_get_print_ocp_cloud_smart_log(dev, + uuid_index, + namespace_id, + fmt); } else { - log_id = WDC_NVME_GET_EOL_STATUS_LOG_OPCODE; - length = WDC_NVME_EOL_STATUS_LOG_LEN; - } - - data = (__u8 *)malloc(sizeof(__u8) * length); - if (!data) { - fprintf(stderr, "ERROR: WDC: malloc: %s\n", strerror(errno)); - return -1; - } - - if (namespace_id == NVME_NSID_ALL) { - ret = nvme_get_nsid(dev_fd(dev), &namespace_id); - if (ret < 0) - namespace_id = NVME_NSID_ALL; + ret = nvme_get_print_c0_eol_log(dev, + uuid_index, + namespace_id, + fmt); } - - /* Get the 0xC0 log data */ - struct nvme_get_log_args args = { - .args_size = sizeof(args), - .fd = dev_fd(dev), - .lid = log_id, - .nsid = namespace_id, - .lpo = 0, - .lsp = NVME_LOG_LSP_NONE, - .lsi = 0, - .rae = false, - .uuidx = uuid_index, - .csi = NVME_CSI_NVM, - .ot = false, - .len = length, - .log = data, - .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, - .result = NULL, - }; - ret = nvme_get_log(&args); - - if (strcmp(format, "json")) - nvme_show_status(ret); - - if (!ret) { - /* parse the data */ - if (uuid_index == 0) - wdc_print_c0_cloud_attr_log(data, fmt); - else - wdc_print_c0_eol_log(data, fmt); - } else { - fprintf(stderr, "ERROR: WDC: Unable to read C0 Log Page data "); - fprintf(stderr, "with uuid index %d\n", uuid_index); - ret = -1; - } - free(data); break; case WDC_NVME_ZN350_DEV_ID: case WDC_NVME_ZN350_DEV_ID_1: - data = (__u8 *)malloc(sizeof(__u8) * WDC_NVME_SMART_CLOUD_ATTR_LEN); - if (!data) { - fprintf(stderr, "ERROR: WDC: malloc: %s\n", strerror(errno)); - return -1; - } - - /* Get the 0xC0 log data */ - ret = nvme_get_log_simple(dev_fd(dev), - WDC_NVME_GET_SMART_CLOUD_ATTR_LOG_ID, - WDC_NVME_SMART_CLOUD_ATTR_LEN, data); - - if (strcmp(format, "json")) - nvme_show_status(ret); - - if (!ret) { - /* parse the data */ - wdc_print_c0_cloud_attr_log(data, fmt); - } else { - fprintf(stderr, "ERROR: WDC: Unable to read C0 Log Page data\n"); - ret = -1; - } - - free(data); + ret = nvme_get_print_ocp_cloud_smart_log(dev, + 0, + NVME_NSID_ALL, + fmt); break; case WDC_NVME_SN820CL_DEV_ID: /* Get the 0xC0 Extended Smart Cloud Attribute log data */ @@ -7852,7 +7616,7 @@ static const char *stringify_cloud_smart_log_thermal_status(__u8 status) return "unrecognized"; } -static void show_cloud_smart_log_json(struct ocp_cloud_smart_log *log) +static void wdc_show_cloud_smart_log_json(struct ocp_cloud_smart_log *log) { struct json_object *root; struct json_object *bad_user_nand_blocks; @@ -7862,6 +7626,8 @@ static void show_cloud_smart_log_json(struct ocp_cloud_smart_log *log) struct json_object *thermal_status; struct json_object *dssd_specific_ver; char buf[2 * sizeof(log->log_page_guid) + 3]; + char lowest_fr[sizeof(log->lowest_permitted_fw_rev) + 1]; + uint16_t smart_log_ver = (uint16_t)le16_to_cpu(log->log_page_version); bad_user_nand_blocks = json_create_object(); json_object_add_value_uint(bad_user_nand_blocks, "normalized", @@ -7927,7 +7693,8 @@ static void show_cloud_smart_log_json(struct ocp_cloud_smart_log *log) json_object_add_value_object(root, "user_data_erase_counts", user_data_erase_counts); json_object_add_value_object(root, "thermal_status", thermal_status); - json_object_add_value_object(root, "dssd_specific_ver", + if (smart_log_ver >= 3) + json_object_add_value_object(root, "dssd_specific_ver", dssd_specific_ver); json_object_add_value_uint(root, "pcie_correctable_error_count", le64_to_cpu(log->pcie_correctable_error_count)); @@ -7937,8 +7704,18 @@ static void show_cloud_smart_log_json(struct ocp_cloud_smart_log *log) log->percent_free_blocks); json_object_add_value_uint(root, "capacitor_health", le16_to_cpu(log->capacitor_health)); - sprintf(buf, "%c", log->nvme_errata_ver); - json_object_add_value_string(root, "nvme_errata_version", buf); + if (smart_log_ver >= 3) { + if (smart_log_ver >= 4) { + sprintf(buf, "%c", log->nvme_base_errata_ver); + json_object_add_value_string(root, "nvme_base_errata_version", buf); + sprintf(buf, "%c", log->nvme_cmd_set_errata_ver); + json_object_add_value_string(root, "nvme_cmd_set_errata_version", buf); + } else { + sprintf(buf, "%c", log->nvme_base_errata_ver); + json_object_add_value_string(root, "nvme_errata_version", buf); + } + } + json_object_add_value_uint(root, "unaligned_io", le64_to_cpu(log->unaligned_io)); json_object_add_value_uint(root, "security_version_number", @@ -7949,12 +7726,22 @@ static void show_cloud_smart_log_json(struct ocp_cloud_smart_log *log) le_to_float(log->plp_start_count, 16)); json_object_add_value_uint64(root, "endurance_estimate", le_to_float(log->endurance_estimate, 16)); - json_object_add_value_uint(root, "pcie_link_retraining_count", - le64_to_cpu(log->pcie_link_retraining_cnt)); - json_object_add_value_uint(root, "power_state_change_count", - le64_to_cpu(log->power_state_change_cnt)); + if (smart_log_ver >= 3) { + json_object_add_value_uint(root, "pcie_link_retraining_count", + le64_to_cpu(log->pcie_link_retraining_cnt)); + json_object_add_value_uint(root, "power_state_change_count", + le64_to_cpu(log->power_state_change_cnt)); + if (smart_log_ver >= 4) { + snprintf(lowest_fr, sizeof(lowest_fr), "%-.*s", + (int)sizeof(log->lowest_permitted_fw_rev), + log->lowest_permitted_fw_rev); + json_object_add_value_string(root, "lowest_permitted_fw_rev", lowest_fr); + } else + json_object_add_value_uint128(root, "hardware_revision", + le128_to_cpu((__u8 *)&log->lowest_permitted_fw_rev[0])); + } json_object_add_value_uint(root, "log_page_version", - le16_to_cpu(log->log_page_version)); + smart_log_ver); stringify_log_page_guid(log->log_page_guid, buf); json_object_add_value_string(root, "log_page_guid", buf); @@ -7963,11 +7750,13 @@ static void show_cloud_smart_log_json(struct ocp_cloud_smart_log *log) json_free_object(root); } -static void show_cloud_smart_log_normal(struct ocp_cloud_smart_log *log, struct nvme_dev *dev) +static void wdc_show_cloud_smart_log_normal(struct ocp_cloud_smart_log *log, + struct nvme_dev *dev) { char buf[2 * sizeof(log->log_page_guid) + 3]; + uint16_t smart_log_ver = (uint16_t)le16_to_cpu(log->log_page_version); - printf("Smart Extended Log for NVME device:%s\n", dev->name); + printf("SMART Cloud Attributes for NVMe device : %s\n", dev->name); printf("Physical Media Units Written : %'.0Lf\n", le_to_float(log->physical_media_units_written, 16)); printf("Physical Media Units Read : %'.0Lf\n", @@ -8002,14 +7791,16 @@ static void show_cloud_smart_log_normal(struct ocp_cloud_smart_log *log, struct stringify_cloud_smart_log_thermal_status(log->thermal_status.current_status)); printf("Thermal Throttling Status (Number of Events) : %" PRIu8 "\n", log->thermal_status.num_events); - printf("NVMe Major Version : %" PRIu8 "\n", - log->dssd_specific_ver.major_ver); - printf(" Minor Version : %" PRIu16 "\n", - le16_to_cpu(log->dssd_specific_ver.minor_ver)); - printf(" Point Version : %" PRIu16 "\n", - le16_to_cpu(log->dssd_specific_ver.point_ver)); - printf(" Errata Version : %" PRIu8 "\n", - log->dssd_specific_ver.errata_ver); + if (smart_log_ver >= 3) { + printf("NVMe Major Version : %" PRIu8 "\n", + log->dssd_specific_ver.major_ver); + printf(" Minor Version : %" PRIu16 "\n", + le16_to_cpu(log->dssd_specific_ver.minor_ver)); + printf(" Point Version : %" PRIu16 "\n", + le16_to_cpu(log->dssd_specific_ver.point_ver)); + printf(" Errata Version : %" PRIu8 "\n", + log->dssd_specific_ver.errata_ver); + } printf("PCIe Correctable Error Count : %" PRIu64 "\n", le64_to_cpu(log->pcie_correctable_error_count)); printf("Incomplete Shutdowns : %" PRIu32 "\n", @@ -8018,8 +7809,17 @@ static void show_cloud_smart_log_normal(struct ocp_cloud_smart_log *log, struct log->percent_free_blocks); printf("Capacitor Health : %" PRIu16 "%%\n", le16_to_cpu(log->capacitor_health)); - printf("NVMe Errata Version : %c\n", - log->nvme_errata_ver); + if (smart_log_ver >= 3) { + if (smart_log_ver >= 4) { + printf("NVMe Base Errata Version : %c\n", + log->nvme_base_errata_ver); + printf("NVMe Command Set Errata Version : %c\n", + log->nvme_cmd_set_errata_ver); + } else { + printf("NVMe Errata Version : %c\n", + log->nvme_base_errata_ver); + } + } printf("Unaligned IO : %" PRIu64 "\n", le64_to_cpu(log->unaligned_io)); printf("Security Version Number : %" PRIu64 "\n", @@ -8030,12 +7830,22 @@ static void show_cloud_smart_log_normal(struct ocp_cloud_smart_log *log, struct le_to_float(log->plp_start_count, 16)); printf("Endurance Estimate : %'.0Lf\n", le_to_float(log->endurance_estimate, 16)); - printf("PCIe Link Retraining Count : %" PRIu64 "\n", - le64_to_cpu(log->pcie_link_retraining_cnt)); - printf("Power State Change Count : %" PRIu64 "\n", - le64_to_cpu(log->power_state_change_cnt)); + if (smart_log_ver >= 3) { + printf("PCIe Link Retraining Count : %" PRIu64 "\n", + le64_to_cpu(log->pcie_link_retraining_cnt)); + printf("Power State Change Count : %" PRIu64 "\n", + le64_to_cpu(log->power_state_change_cnt)); + if (smart_log_ver >= 4) + printf("Lowest Permitted FW Revision : %-.*s\n", + (int)sizeof(log->lowest_permitted_fw_rev), + log->lowest_permitted_fw_rev); + else + printf("Hardware Revision : %s\n", + uint128_t_to_string(le128_to_cpu( + (__u8 *)&log->lowest_permitted_fw_rev[0]))); + } printf("Log Page Version : %" PRIu16 "\n", - le16_to_cpu(log->log_page_version)); + smart_log_ver); stringify_log_page_guid(log->log_page_guid, buf); printf("Log Page GUID : %s\n", buf); printf("\n\n"); @@ -8145,43 +7955,16 @@ static int wdc_vs_smart_add_log(int argc, char **argv, struct command *command, "ERROR: WDC: Failure reading the C0 Log Page, ret = %d\n", ret); } else { - struct ocp_cloud_smart_log log; - char buf[2 * sizeof(log.log_page_guid) + 3]; - ret = validate_output_format(cfg.output_format, &fmt); if (ret < 0) { fprintf(stderr, "Invalid output format: %s\n", cfg.output_format); goto out; } - ret = nvme_get_log_simple(dev_fd(dev), - WDC_NVME_GET_SMART_CLOUD_ATTR_LOG_ID, - sizeof(log), &log); - if (!ret) { - char *ptr = buf; - int i; - __u8 *guid = log.log_page_guid; - - memset(buf, 0, sizeof(char) * 19); - - ptr += sprintf(ptr, "0x"); - for (i = 0; i < 16; i++) - ptr += sprintf(ptr, "%x", guid[15 - i]); - if (strcmp(buf, "0xafd514c97c6f4f9ca4f2bfea2810afc5")) - fprintf(stderr, "Invalid GUID: %s\n", buf); - else { - if (fmt == BINARY) - d_raw((unsigned char *)&log, sizeof(log)); - else if (fmt == JSON) - show_cloud_smart_log_json(&log); - else - show_cloud_smart_log_normal(&log, dev); - } - } else if (ret > 0) { - nvme_show_status(ret); - } else { - perror("vs-smart-add-log"); - } + ret = nvme_get_print_ocp_cloud_smart_log(dev, + 0, + NVME_NSID_ALL, + fmt); } } if (((capabilities & (WDC_DRIVE_CAP_CA_LOG_PAGE)) == (WDC_DRIVE_CAP_CA_LOG_PAGE)) && diff --git a/plugins/wdc/wdc-nvme.h b/plugins/wdc/wdc-nvme.h index 65d2de3a3a..e2343b7656 100644 --- a/plugins/wdc/wdc-nvme.h +++ b/plugins/wdc/wdc-nvme.h @@ -5,7 +5,7 @@ #if !defined(WDC_NVME) || defined(CMD_HEADER_MULTI_READ) #define WDC_NVME -#define WDC_PLUGIN_VERSION "2.8.1" +#define WDC_PLUGIN_VERSION "2.9.0" #include "cmd.h" PLUGIN(NAME("wdc", "Western Digital vendor specific extensions", WDC_PLUGIN_VERSION), From aa061c7b92240e4597aa06b1e708c8bbf5d1bf99 Mon Sep 17 00:00:00 2001 From: Caleb Sander Mateos Date: Tue, 16 Jul 2024 12:38:11 -0600 Subject: [PATCH 062/281] test: add test cases for argconfig option values test-argconfig-parse.c tests argconfig option parsing, but is missing test cases for options with opt_val lists. Add test cases to verify this functionality and its edge cases. Signed-off-by: Caleb Sander Mateos --- unit/test-argconfig-parse.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/unit/test-argconfig-parse.c b/unit/test-argconfig-parse.c index 23c8d4feef..24756163ff 100644 --- a/unit/test-argconfig-parse.c +++ b/unit/test-argconfig-parse.c @@ -28,6 +28,7 @@ union val { char *file; char *list; char *str; + __u8 val; }; struct toval_test { @@ -73,6 +74,7 @@ struct cfg { char *file; char *list; char *str; + __u8 val; }; static struct cfg cfg; @@ -105,6 +107,17 @@ static struct toval_test toval_tests[] = { VAL_TEST("--file=file", file, "file", false, 0), VAL_TEST("--list=list", list, "list", false, 0), VAL_TEST("--str=str", str, "str", false, 0), + VAL_TEST("--val=", val, 0, true, -EINVAL), + VAL_TEST("--val=o", val, 1, true, 0), + VAL_TEST("--val=t", val, 0, true, -EINVAL), + VAL_TEST("--val=tw", val, 2, true, 0), + VAL_TEST("--val=two", val, 2, true, 0), + VAL_TEST("--val=twoo", val, 0, true, -EINVAL), + VAL_TEST("--val=th", val, 3, true, 0), + VAL_TEST("--val=three", val, 3, true, 0), + VAL_TEST("--val=threed", val, 0, true, -EINVAL), + VAL_TEST("--val=123", val, 123, true, 0), + VAL_TEST("--val=1234", val, 0, true, -EINVAL), }; void toval_test(struct toval_test *test) @@ -113,6 +126,13 @@ void toval_test(struct toval_test *test) int ret; char *argv[] = { "test-argconfig", test->arg }; + OPT_VALS(opt_vals) = { + VAL_BYTE("one", 1), + VAL_BYTE("two", 2), + VAL_BYTE("three", 3), + VAL_END() + }; + OPT_ARGS(opts) = { OPT_FLAG("flag",'f', &cfg.flag, "flag"), OPT_SUFFIX("suffix", 's', &cfg.suffix, "suffix"), @@ -128,6 +148,7 @@ void toval_test(struct toval_test *test) OPT_FILE("file", 'L', &cfg.file, "file"), OPT_LIST("list", 'T', &cfg.list, "list"), OPT_STR("str", 'r', &cfg.str, "str"), + OPT_BYTE("val", 'v', &cfg.val, "val", opt_vals), OPT_END() }; From 54560141a231753a6c11e64a1081441f5826d9c4 Mon Sep 17 00:00:00 2001 From: Caleb Sander Mateos Date: Tue, 16 Jul 2024 16:46:04 -0600 Subject: [PATCH 063/281] test: add test cases for argconfig comma-separated array parsing There are no unit tests currently covering argconfig's comma-separated integer array parsing. Add test cases to test-argconfig-parse.c that use argconfig_parse_comma_sep_array_u32(), verifying its functionality and edge cases. Signed-off-by: Caleb Sander Mateos --- unit/test-argconfig-parse.c | 51 ++++++++++++++++++++++++++++++++++++- 1 file changed, 50 insertions(+), 1 deletion(-) diff --git a/unit/test-argconfig-parse.c b/unit/test-argconfig-parse.c index 24756163ff..d861d69279 100644 --- a/unit/test-argconfig-parse.c +++ b/unit/test-argconfig-parse.c @@ -7,7 +7,7 @@ #include #include "../util/argconfig.h" -#include "nvme/types.h" +#include "../util/cleanup.h" #define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0])) @@ -164,6 +164,52 @@ void toval_test(struct toval_test *test) check_val(test->arg, &test->exp, test->val, test->size); } +#define COMMA_SEP_ARRAY_MAX_VALUES 4 + +struct comma_sep_array_test { + const char *input; + int ret; + __u32 values[COMMA_SEP_ARRAY_MAX_VALUES]; +}; + +const struct comma_sep_array_test comma_sep_array_tests[] = { + {"", 0}, + {",,,", 0}, + {" ", -1}, + {"abc", -1}, + {"0xFFFFFFFF", 1, {0xFFFFFFFF}}, + {"0x100000000", -1}, + {"123,0x456", 2, {123, 0x456}}, + {",1,,2,", 2, {1, 2}}, + {"1,22,333,4444", 4, {1, 22, 333, 4444}}, + {"1,2,3,4,5", -1}, +}; + +void comma_sep_array_test(const struct comma_sep_array_test *test) +{ + _cleanup_free_ char *input = strdup(test->input); + __u32 values[COMMA_SEP_ARRAY_MAX_VALUES] = {}; + int ret = argconfig_parse_comma_sep_array_u32( + input, values, COMMA_SEP_ARRAY_MAX_VALUES); + int i; + + if (ret != test->ret) { + printf("ERROR: input '%s' return value %d != %d\n", + test->input, ret, test->ret); + test_rc = 1; + return; + } + + for (i = 0; i < ret; i++) { + if (values[i] != test->values[i]) { + printf("ERROR: input '%s' values[%d] = %u != %u\n", + test->input, i, values[i], test->values[i]); + test_rc = 1; + return; + } + } +} + int main(void) { unsigned int i; @@ -178,6 +224,9 @@ int main(void) for (i = 0; i < ARRAY_SIZE(toval_tests); i++) toval_test(&toval_tests[i]); + for (i = 0; i < ARRAY_SIZE(comma_sep_array_tests); i++) + comma_sep_array_test(&comma_sep_array_tests[i]); + if (f) fclose(f); From f02e953a54b52833ad021bd1a979e33ddcfac399 Mon Sep 17 00:00:00 2001 From: Caleb Sander Mateos Date: Tue, 16 Jul 2024 12:42:44 -0600 Subject: [PATCH 064/281] util: remove argconfig CFG_SIZE type CFG_SIZE is unused and not handled by argconfig_set_opt_val(). Signed-off-by: Caleb Sander Mateos --- util/argconfig.c | 5 ----- util/argconfig.h | 1 - 2 files changed, 6 deletions(-) diff --git a/util/argconfig.c b/util/argconfig.c index 5ec3d6f215..88bcd10f9f 100644 --- a/util/argconfig.c +++ b/util/argconfig.c @@ -170,11 +170,6 @@ static int argconfig_parse_type(struct argconfig_commandline_options *s, struct case CFG_STRING: *((char **)value) = optarg; break; - case CFG_SIZE: - *((size_t *)value) = strtol(optarg, &endptr, 0); - if (errno || optarg == endptr) - ret = argconfig_error("integer", option[index].name, optarg); - break; case CFG_INT: *((int *)value) = strtol(optarg, &endptr, 0); if (errno || optarg == endptr) diff --git a/util/argconfig.h b/util/argconfig.h index 2a04a32e72..17ff5fa10b 100644 --- a/util/argconfig.h +++ b/util/argconfig.h @@ -47,7 +47,6 @@ enum argconfig_types { CFG_FLAG, CFG_STRING, CFG_INT, - CFG_SIZE, CFG_LONG, CFG_LONG_SUFFIX, CFG_DOUBLE, From ea53e6ed33b0ada93f2c06d931948f9118095595 Mon Sep 17 00:00:00 2001 From: Caleb Sander Mateos Date: Tue, 16 Jul 2024 09:42:36 -0600 Subject: [PATCH 065/281] util: remove argconfig_parse_val() declaration argconfig_parse_val() is defined before it is used, so there is no need to pre-declare it. Signed-off-by: Caleb Sander Mateos --- util/argconfig.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/util/argconfig.c b/util/argconfig.c index 88bcd10f9f..19e25e77ad 100644 --- a/util/argconfig.c +++ b/util/argconfig.c @@ -45,9 +45,6 @@ static const char *append_usage_str = ""; -static int argconfig_parse_val(struct argconfig_commandline_options *s, struct option *option, - int index); - void argconfig_append_usage(const char *str) { append_usage_str = str; From 7a925d6dfbe28507697ac98284a362cc36890432 Mon Sep 17 00:00:00 2001 From: Caleb Sander Mateos Date: Tue, 16 Jul 2024 09:49:46 -0600 Subject: [PATCH 066/281] util: make argconfig_set_opt_val() a void function argconfig_set_opt_val() always returns 0, so there is no need for its return value. Return 0 in the one caller, argconfig_set_opt_val(), instead. Signed-off-by: Caleb Sander Mateos --- util/argconfig.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/util/argconfig.c b/util/argconfig.c index 19e25e77ad..d2ffc48444 100644 --- a/util/argconfig.c +++ b/util/argconfig.c @@ -240,7 +240,7 @@ static int argconfig_get_val_len(struct argconfig_opt_val *opt_val, const char * return len; } -static int argconfig_set_opt_val(enum argconfig_types type, union argconfig_val *opt_val, void *val) +static void argconfig_set_opt_val(enum argconfig_types type, union argconfig_val *opt_val, void *val) { switch (type) { case CFG_FLAG: @@ -276,8 +276,6 @@ static int argconfig_set_opt_val(enum argconfig_types type, union argconfig_val default: break; } - - return 0; } static int argconfig_parse_val(struct argconfig_commandline_options *s, struct option *option, @@ -293,7 +291,8 @@ static int argconfig_parse_val(struct argconfig_commandline_options *s, struct o val_len = argconfig_get_val_len(s->opt_val, v->str); if (strncasecmp(str, v->str, len > val_len ? len : val_len)) continue; - return argconfig_set_opt_val(v->type, &v->val, val); + argconfig_set_opt_val(v->type, &v->val, val); + return 0; } return argconfig_parse_type(s, option, index); From ba72357b9284736637cf04ca9be1616a3b34ff39 Mon Sep 17 00:00:00 2001 From: Caleb Sander Mateos Date: Tue, 16 Jul 2024 09:57:38 -0600 Subject: [PATCH 067/281] util: use cleanup to avoid goto in argconfig_parse() Use _cleanup_free_ in place of explicit calls to free() in argconfig_parse(). This simplifies the code and allows using an early return in place of a goto. Signed-off-by: Caleb Sander Mateos --- util/argconfig.c | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/util/argconfig.c b/util/argconfig.c index d2ffc48444..791ae2500f 100644 --- a/util/argconfig.c +++ b/util/argconfig.c @@ -30,6 +30,7 @@ */ #include "argconfig.h" +#include "cleanup.h" #include "suffix.h" #include @@ -311,8 +312,8 @@ static bool argconfig_check_human_readable(struct argconfig_commandline_options int argconfig_parse(int argc, char *argv[], const char *program_desc, struct argconfig_commandline_options *options) { - char *short_opts; - struct option *long_opts; + _cleanup_free_ char *short_opts = NULL; + _cleanup_free_ struct option *long_opts = NULL; struct argconfig_commandline_options *s; int c, option_index = 0, short_index = 0, options_count = 0; int ret = 0; @@ -326,8 +327,7 @@ int argconfig_parse(int argc, char *argv[], const char *program_desc, if (!long_opts || !short_opts) { fprintf(stderr, "failed to allocate memory for opts: %s\n", strerror(errno)); - ret = -errno; - goto out; + return -errno; } for (s = options; s->option && option_index < options_count; s++) { @@ -386,9 +386,6 @@ int argconfig_parse(int argc, char *argv[], const char *program_desc, if (!argconfig_check_human_readable(options)) setlocale(LC_ALL, "C"); -out: - free(short_opts); - free(long_opts); return ret; } From 6f691a92f20beaf4fc6f4f8a36d598db6e053fc8 Mon Sep 17 00:00:00 2001 From: Caleb Sander Mateos Date: Tue, 16 Jul 2024 10:05:41 -0600 Subject: [PATCH 068/281] util: remove redundant NULL check in argconfig_print_help() s has been checked to be non-NULL earlier, so there is no need to check it in the loop. Signed-off-by: Caleb Sander Mateos --- util/argconfig.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/util/argconfig.c b/util/argconfig.c index 791ae2500f..8a4d0aa989 100644 --- a/util/argconfig.c +++ b/util/argconfig.c @@ -132,7 +132,7 @@ void argconfig_print_help(const char *program_desc, return; fprintf(stderr, "\n\033[1mOptions:\033[0m\n"); - for (; s && s->option; s++) + for (; s->option; s++) show_option(s); } From 0e543743fdaf93005abd7fece9b5a03c4b2dcc11 Mon Sep 17 00:00:00 2001 From: Caleb Sander Mateos Date: Tue, 16 Jul 2024 10:10:48 -0600 Subject: [PATCH 069/281] util: inline argconfig_parse_byte() argconfig_parse_byte() is only used in argconfig_parse_type(). For consistency with the other cases, inline it into the function. Signed-off-by: Caleb Sander Mateos --- util/argconfig.c | 23 ++++++++--------------- util/argconfig.h | 1 - 2 files changed, 8 insertions(+), 16 deletions(-) diff --git a/util/argconfig.c b/util/argconfig.c index 8a4d0aa989..87487eae71 100644 --- a/util/argconfig.c +++ b/util/argconfig.c @@ -142,19 +142,6 @@ static int argconfig_error(char *type, const char *opt, const char *arg) return -EINVAL; } -int argconfig_parse_byte(const char *opt, const char *str, unsigned char *val) -{ - char *endptr; - unsigned long tmp = strtoul(str, &endptr, 0); - - if (errno || tmp >= 1 << 8 || str == endptr) - return argconfig_error("byte", opt, str); - - *val = tmp; - - return 0; -} - static int argconfig_parse_type(struct argconfig_commandline_options *s, struct option *option, int index) { @@ -173,9 +160,15 @@ static int argconfig_parse_type(struct argconfig_commandline_options *s, struct if (errno || optarg == endptr) ret = argconfig_error("integer", option[index].name, optarg); break; - case CFG_BYTE: - ret = argconfig_parse_byte(option[index].name, optarg, (uint8_t *)value); + case CFG_BYTE: { + unsigned long tmp = strtoul(optarg, &endptr, 0); + + if (errno || tmp >= 1 << 8 || optarg == endptr) + ret = argconfig_error("byte", option[index].name, optarg); + else + *((uint8_t *)value) = tmp; break; + } case CFG_SHORT: { unsigned long tmp = strtoul(optarg, &endptr, 0); diff --git a/util/argconfig.h b/util/argconfig.h index 17ff5fa10b..3dff25a327 100644 --- a/util/argconfig.h +++ b/util/argconfig.h @@ -180,7 +180,6 @@ int argconfig_parse_comma_sep_array_u32(char *string, __u32 *val, unsigned int max_length); int argconfig_parse_comma_sep_array_u64(char *string, __u64 *val, unsigned int max_length); -int argconfig_parse_byte(const char *opt, const char *str, unsigned char *val); void print_word_wrapped(const char *s, int indent, int start, FILE *stream); bool argconfig_parse_seen(struct argconfig_commandline_options *options, From 37853a94825a59bc49be2d3f858657eb300b55cc Mon Sep 17 00:00:00 2001 From: Caleb Sander Mateos Date: Tue, 16 Jul 2024 10:13:01 -0600 Subject: [PATCH 070/281] util: remove redundant cast in argconfig_parse_type() s->default_value is already a void *, so there is no need to cast it to a char * and back. Signed-off-by: Caleb Sander Mateos --- util/argconfig.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/util/argconfig.c b/util/argconfig.c index 87487eae71..4bb0ea9286 100644 --- a/util/argconfig.c +++ b/util/argconfig.c @@ -145,7 +145,7 @@ static int argconfig_error(char *type, const char *opt, const char *arg) static int argconfig_parse_type(struct argconfig_commandline_options *s, struct option *option, int index) { - void *value = (void *)(char *)s->default_value; + void *value = s->default_value; char *endptr; int ret = 0; From 957d9421800542f7ae0069b19fbd683b0e1b73c3 Mon Sep 17 00:00:00 2001 From: Caleb Sander Mateos Date: Tue, 16 Jul 2024 10:17:46 -0600 Subject: [PATCH 071/281] util: remove unnecessary parentheses in argconfig_parse_type() Match the style in argconfig_set_opt_val(). Signed-off-by: Caleb Sander Mateos --- util/argconfig.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/util/argconfig.c b/util/argconfig.c index 4bb0ea9286..f480508766 100644 --- a/util/argconfig.c +++ b/util/argconfig.c @@ -153,10 +153,10 @@ static int argconfig_parse_type(struct argconfig_commandline_options *s, struct switch (s->config_type) { case CFG_STRING: - *((char **)value) = optarg; + *(char **)value = optarg; break; case CFG_INT: - *((int *)value) = strtol(optarg, &endptr, 0); + *(int *)value = strtol(optarg, &endptr, 0); if (errno || optarg == endptr) ret = argconfig_error("integer", option[index].name, optarg); break; @@ -166,7 +166,7 @@ static int argconfig_parse_type(struct argconfig_commandline_options *s, struct if (errno || tmp >= 1 << 8 || optarg == endptr) ret = argconfig_error("byte", option[index].name, optarg); else - *((uint8_t *)value) = tmp; + *(uint8_t *)value = tmp; break; } case CFG_SHORT: { @@ -175,7 +175,7 @@ static int argconfig_parse_type(struct argconfig_commandline_options *s, struct if (errno || tmp >= 1 << 16 || optarg == endptr) ret = argconfig_error("short", option[index].name, optarg); else - *((uint16_t *)value) = tmp; + *(uint16_t *)value = tmp; break; } case CFG_POSITIVE: { @@ -184,14 +184,14 @@ static int argconfig_parse_type(struct argconfig_commandline_options *s, struct if (errno || optarg == endptr) ret = argconfig_error("word", option[index].name, optarg); else - *((uint32_t *)value) = tmp; + *(uint32_t *)value = tmp; break; } case CFG_INCREMENT: - *((int *)value) += 1; + *(int *)value += 1; break; case CFG_LONG: - *((unsigned long *)value) = strtoul(optarg, &endptr, 0); + *(unsigned long *)value = strtoul(optarg, &endptr, 0); if (errno || optarg == endptr) ret = argconfig_error("long integer", option[index].name, optarg); break; @@ -201,12 +201,12 @@ static int argconfig_parse_type(struct argconfig_commandline_options *s, struct argconfig_error("long suffixed integer", option[index].name, optarg); break; case CFG_DOUBLE: - *((double *)value) = strtod(optarg, &endptr); + *(double *)value = strtod(optarg, &endptr); if (errno || optarg == endptr) ret = argconfig_error("float", option[index].name, optarg); break; case CFG_FLAG: - *((bool *)value) = true; + *(bool *)value = true; break; default: break; From 2a68afc5f2b4c3f05f484f164e566fe22ee9413e Mon Sep 17 00:00:00 2001 From: Caleb Sander Mateos Date: Tue, 16 Jul 2024 10:21:04 -0600 Subject: [PATCH 072/281] util: remove empty default case in argconfig functions Both argconfig_parse_type() and argconfig_set_opt_val() switch on the argument value type and have an empty default case. This is unnecessary and masks errors from unhandled enum values. So drop the default cases. Signed-off-by: Caleb Sander Mateos --- util/argconfig.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/util/argconfig.c b/util/argconfig.c index f480508766..faa20fa77e 100644 --- a/util/argconfig.c +++ b/util/argconfig.c @@ -208,8 +208,6 @@ static int argconfig_parse_type(struct argconfig_commandline_options *s, struct case CFG_FLAG: *(bool *)value = true; break; - default: - break; } return ret; @@ -267,8 +265,6 @@ static void argconfig_set_opt_val(enum argconfig_types type, union argconfig_val case CFG_STRING: *(char **)val = opt_val->string; break; - default: - break; } } From 3771bbcc9a224554f4b2404e892776318ac193c7 Mon Sep 17 00:00:00 2001 From: Caleb Sander Mateos Date: Tue, 16 Jul 2024 10:35:07 -0600 Subject: [PATCH 073/281] util: reduce arguments passed to argconfig_parse_type() Arguments option and index are only used to get the name of the option. This can be obtained from s->option instead. Signed-off-by: Caleb Sander Mateos --- util/argconfig.c | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/util/argconfig.c b/util/argconfig.c index faa20fa77e..652d51b3a6 100644 --- a/util/argconfig.c +++ b/util/argconfig.c @@ -142,8 +142,7 @@ static int argconfig_error(char *type, const char *opt, const char *arg) return -EINVAL; } -static int argconfig_parse_type(struct argconfig_commandline_options *s, struct option *option, - int index) +static int argconfig_parse_type(struct argconfig_commandline_options *s) { void *value = s->default_value; char *endptr; @@ -158,13 +157,13 @@ static int argconfig_parse_type(struct argconfig_commandline_options *s, struct case CFG_INT: *(int *)value = strtol(optarg, &endptr, 0); if (errno || optarg == endptr) - ret = argconfig_error("integer", option[index].name, optarg); + ret = argconfig_error("integer", s->option, optarg); break; case CFG_BYTE: { unsigned long tmp = strtoul(optarg, &endptr, 0); if (errno || tmp >= 1 << 8 || optarg == endptr) - ret = argconfig_error("byte", option[index].name, optarg); + ret = argconfig_error("byte", s->option, optarg); else *(uint8_t *)value = tmp; break; @@ -173,7 +172,7 @@ static int argconfig_parse_type(struct argconfig_commandline_options *s, struct unsigned long tmp = strtoul(optarg, &endptr, 0); if (errno || tmp >= 1 << 16 || optarg == endptr) - ret = argconfig_error("short", option[index].name, optarg); + ret = argconfig_error("short", s->option, optarg); else *(uint16_t *)value = tmp; break; @@ -182,7 +181,7 @@ static int argconfig_parse_type(struct argconfig_commandline_options *s, struct uint32_t tmp = strtoul(optarg, &endptr, 0); if (errno || optarg == endptr) - ret = argconfig_error("word", option[index].name, optarg); + ret = argconfig_error("word", s->option, optarg); else *(uint32_t *)value = tmp; break; @@ -193,17 +192,17 @@ static int argconfig_parse_type(struct argconfig_commandline_options *s, struct case CFG_LONG: *(unsigned long *)value = strtoul(optarg, &endptr, 0); if (errno || optarg == endptr) - ret = argconfig_error("long integer", option[index].name, optarg); + ret = argconfig_error("long integer", s->option, optarg); break; case CFG_LONG_SUFFIX: ret = suffix_binary_parse(optarg, &endptr, (uint64_t *)value); if (ret) - argconfig_error("long suffixed integer", option[index].name, optarg); + argconfig_error("long suffixed integer", s->option, optarg); break; case CFG_DOUBLE: *(double *)value = strtod(optarg, &endptr); if (errno || optarg == endptr) - ret = argconfig_error("float", option[index].name, optarg); + ret = argconfig_error("float", s->option, optarg); break; case CFG_FLAG: *(bool *)value = true; @@ -268,8 +267,7 @@ static void argconfig_set_opt_val(enum argconfig_types type, union argconfig_val } } -static int argconfig_parse_val(struct argconfig_commandline_options *s, struct option *option, - int index) +static int argconfig_parse_val(struct argconfig_commandline_options *s) { const char *str = optarg; void *val = s->default_value; @@ -285,7 +283,7 @@ static int argconfig_parse_val(struct argconfig_commandline_options *s, struct o return 0; } - return argconfig_parse_type(s, option, index); + return argconfig_parse_type(s); } static bool argconfig_check_human_readable(struct argconfig_commandline_options *s) @@ -365,9 +363,9 @@ int argconfig_parse(int argc, char *argv[], const char *program_desc, continue; if (s->opt_val) - ret = argconfig_parse_val(s, long_opts, option_index); + ret = argconfig_parse_val(s); else - ret = argconfig_parse_type(s, long_opts, option_index); + ret = argconfig_parse_type(s); if (ret) break; } From 1b3ba5de38ef1e24d84071f05d3d535363298521 Mon Sep 17 00:00:00 2001 From: Caleb Sander Mateos Date: Tue, 16 Jul 2024 10:53:59 -0600 Subject: [PATCH 074/281] util: reduce complexity of argconfig_parse_val() Assuming constant-length value strings, argconfig_parse_val()'s runtime is currently quadratic in the number of option values. For each option value, it computes a minimum prefix length that distinguishes that option from all others. It then checks whether the input matches up to that prefix length. Instead, compare the input directly against each option value. If exactly one matches, select that option value. Otherwise, fallback on the default value parser. Signed-off-by: Caleb Sander Mateos --- util/argconfig.c | 56 +++++++++++++++++++++--------------------------- 1 file changed, 24 insertions(+), 32 deletions(-) diff --git a/util/argconfig.c b/util/argconfig.c index 652d51b3a6..7d9f9399a3 100644 --- a/util/argconfig.c +++ b/util/argconfig.c @@ -212,25 +212,6 @@ static int argconfig_parse_type(struct argconfig_commandline_options *s) return ret; } -static int argconfig_get_val_len(struct argconfig_opt_val *opt_val, const char *str) -{ - struct argconfig_opt_val *v; - int len; - int match; - - for (len = 1; len <= strlen(str); len++) { - match = 0; - for (v = opt_val; v && v->str; v++) { - if (!strncasecmp(str, v->str, len)) - match++; - } - if (match == 1) - break; - } - - return len; -} - static void argconfig_set_opt_val(enum argconfig_types type, union argconfig_val *opt_val, void *val) { switch (type) { @@ -267,23 +248,34 @@ static void argconfig_set_opt_val(enum argconfig_types type, union argconfig_val } } -static int argconfig_parse_val(struct argconfig_commandline_options *s) +static struct argconfig_opt_val * +argconfig_match_val(struct argconfig_commandline_options *s, const char *str) { - const char *str = optarg; - void *val = s->default_value; - int len = strlen(optarg); - struct argconfig_opt_val *v; - int val_len; - - for (v = s->opt_val; v && v->str; v++) { - val_len = argconfig_get_val_len(s->opt_val, v->str); - if (strncasecmp(str, v->str, len > val_len ? len : val_len)) + size_t len = strlen(str); + struct argconfig_opt_val *v, *match = NULL; + + for (v = s->opt_val; v->str; v++) { + if (strncasecmp(str, v->str, len)) continue; - argconfig_set_opt_val(v->type, &v->val, val); - return 0; + + if (match) + return NULL; /* multiple matches; input is ambiguous */ + + match = v; } - return argconfig_parse_type(s); + return match; +} + +static int argconfig_parse_val(struct argconfig_commandline_options *s) +{ + struct argconfig_opt_val *v = argconfig_match_val(s, optarg); + + if (!v) + return argconfig_parse_type(s); + + argconfig_set_opt_val(v->type, &v->val, s->default_value); + return 0; } static bool argconfig_check_human_readable(struct argconfig_commandline_options *s) From c8761493bdbbe973456ef8e46bc94f05c4de25dd Mon Sep 17 00:00:00 2001 From: Caleb Sander Mateos Date: Tue, 16 Jul 2024 13:01:36 -0600 Subject: [PATCH 075/281] util: consolidate call paths to argconfig_parse_type() argconfig_parse_val() already falls back on argconfig_parse_type() if no option values match. So always call argconfig_parse_val() from argconfig_parse() instead of checking whether any option values are defined. Signed-off-by: Caleb Sander Mateos --- util/argconfig.c | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/util/argconfig.c b/util/argconfig.c index 7d9f9399a3..9a416376cb 100644 --- a/util/argconfig.c +++ b/util/argconfig.c @@ -249,12 +249,12 @@ static void argconfig_set_opt_val(enum argconfig_types type, union argconfig_val } static struct argconfig_opt_val * -argconfig_match_val(struct argconfig_commandline_options *s, const char *str) +argconfig_match_val(struct argconfig_opt_val *v, const char *str) { size_t len = strlen(str); - struct argconfig_opt_val *v, *match = NULL; + struct argconfig_opt_val *match = NULL; - for (v = s->opt_val; v->str; v++) { + for (; v->str; v++) { if (strncasecmp(str, v->str, len)) continue; @@ -269,8 +269,10 @@ argconfig_match_val(struct argconfig_commandline_options *s, const char *str) static int argconfig_parse_val(struct argconfig_commandline_options *s) { - struct argconfig_opt_val *v = argconfig_match_val(s, optarg); + struct argconfig_opt_val *v = s->opt_val; + if (v) + v = argconfig_match_val(v, optarg); if (!v) return argconfig_parse_type(s); @@ -354,10 +356,7 @@ int argconfig_parse(int argc, char *argv[], const char *program_desc, if (!s->default_value) continue; - if (s->opt_val) - ret = argconfig_parse_val(s); - else - ret = argconfig_parse_type(s); + ret = argconfig_parse_val(s); if (ret) break; } From 9f9d5582c994ae55ce24e872c54ce0ae097e56cb Mon Sep 17 00:00:00 2001 From: Caleb Sander Mateos Date: Tue, 16 Jul 2024 13:07:23 -0600 Subject: [PATCH 076/281] util: reduce allocation sizes in argconfig_parse() long_opts stores up to 1 element per option, plus a help element, and a zerored final element. So it can be allocated with length options_count + 2 instead of options_count + 3. short_opts stores up to 3 characters per option, plus 2 help characters, and a NUL terminator. So it can be allocated with length options_count * 3 + 3 instead of options_count * 3 + 5. Also use the two arguments to calloc() instead of multiplying the sizes. Signed-off-by: Caleb Sander Mateos --- util/argconfig.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/util/argconfig.c b/util/argconfig.c index 9a416376cb..5cd5889a67 100644 --- a/util/argconfig.c +++ b/util/argconfig.c @@ -303,8 +303,8 @@ int argconfig_parse(int argc, char *argv[], const char *program_desc, for (s = options; s->option; s++) options_count++; - long_opts = calloc(1, sizeof(struct option) * (options_count + 3)); - short_opts = calloc(1, sizeof(*short_opts) * (options_count * 3 + 5)); + long_opts = calloc(options_count + 2, sizeof(struct option)); + short_opts = calloc(options_count * 3 + 3, sizeof(*short_opts)); if (!long_opts || !short_opts) { fprintf(stderr, "failed to allocate memory for opts: %s\n", strerror(errno)); From 28eee1ae1f3c360d53261a554f887e47e1f93583 Mon Sep 17 00:00:00 2001 From: Caleb Sander Mateos Date: Tue, 16 Jul 2024 15:43:18 -0600 Subject: [PATCH 077/281] util: introduce is_null_or_empty() to avoid strlen() argconfig uses strlen() in several places to check for empty strings. strlen() traverses the entire string though only the first char matters. Add a helper function is_null_or_empty() that only checks the first char for NUL. It also encapsulates the NULL check performed by each caller. Signed-off-by: Caleb Sander Mateos --- util/argconfig.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/util/argconfig.c b/util/argconfig.c index 5cd5889a67..3424e6913d 100644 --- a/util/argconfig.c +++ b/util/argconfig.c @@ -44,6 +44,11 @@ #include #include +static bool is_null_or_empty(const char *s) +{ + return !s || !*s; +} + static const char *append_usage_str = ""; void argconfig_append_usage(const char *str) @@ -320,7 +325,7 @@ int argconfig_parse(int argc, char *argv[], const char *program_desc, if (s->argument_type == optional_argument) short_opts[short_index++] = ':'; } - if (s->option && strlen(s->option)) { + if (!is_null_or_empty(s->option)) { long_opts[option_index].name = s->option; long_opts[option_index].has_arg = s->argument_type; } @@ -374,7 +379,7 @@ int argconfig_parse_comma_sep_array(char *string, int *val, unsigned int max_len char *tmp; char *p; - if (!string || !strlen(string)) + if (is_null_or_empty(string)) return 0; tmp = strtok(string, ","); @@ -420,7 +425,7 @@ int argconfig_parse_comma_sep_array_short(char *string, unsigned short *val, char *tmp; char *p; - if (!string || !strlen(string)) + if (is_null_or_empty(string)) return 0; tmp = strtok(string, ","); @@ -464,7 +469,7 @@ int argconfig_parse_comma_sep_array_long(char *string, unsigned long long *val, char *tmp; char *p; - if (!string || !strlen(string)) + if (is_null_or_empty(string)) return 0; tmp = strtok(string, ","); @@ -501,7 +506,7 @@ int argconfig_parse_comma_sep_array_u##size(char *string, \ char *tmp; \ char *p; \ \ - if (!string || !strlen(string)) \ + if (is_null_or_empty(string)) \ return 0; \ \ tmp = strtok(string, ","); \ From 8b902ec38726f73669db778e754a9d7739cc9752 Mon Sep 17 00:00:00 2001 From: Caleb Sander Mateos Date: Tue, 16 Jul 2024 13:11:34 -0600 Subject: [PATCH 078/281] util: remove redundant loop condition in argconfig_parse() Since options_count is computed as the number of options until the first one with a NULL option field, s->option and option_index < options_count are equivalent. Signed-off-by: Caleb Sander Mateos --- util/argconfig.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/util/argconfig.c b/util/argconfig.c index 3424e6913d..371ab7f3fc 100644 --- a/util/argconfig.c +++ b/util/argconfig.c @@ -316,7 +316,7 @@ int argconfig_parse(int argc, char *argv[], const char *program_desc, return -errno; } - for (s = options; s->option && option_index < options_count; s++) { + for (s = options; s->option; s++) { if (s->short_option) { short_opts[short_index++] = s->short_option; if (s->argument_type == required_argument || From 72f3ab65f141eb39fa5ea67dc051321d8820825e Mon Sep 17 00:00:00 2001 From: Caleb Sander Mateos Date: Tue, 16 Jul 2024 15:28:53 -0600 Subject: [PATCH 079/281] util: avoid duplication in argconfig_parse_comma_sep_array*() Use the loop body to convert the first token to an int. Extend the existing macro so it can be used to define all the functions. Signed-off-by: Caleb Sander Mateos --- util/argconfig.c | 163 +++++------------------------------------------ 1 file changed, 17 insertions(+), 146 deletions(-) diff --git a/util/argconfig.c b/util/argconfig.c index 371ab7f3fc..34607202ae 100644 --- a/util/argconfig.c +++ b/util/argconfig.c @@ -372,133 +372,9 @@ int argconfig_parse(int argc, char *argv[], const char *program_desc, return ret; } -int argconfig_parse_comma_sep_array(char *string, int *val, unsigned int max_length) -{ - int ret = 0; - unsigned long v; - char *tmp; - char *p; - - if (is_null_or_empty(string)) - return 0; - - tmp = strtok(string, ","); - if (!tmp) - return 0; - - v = strtoul(tmp, &p, 0); - if (*p != 0) - return -1; - if (v > UINT_MAX) { - fprintf(stderr, "%s out of range\n", tmp); - return -1; - } - val[ret] = v; - - ret++; - while (1) { - tmp = strtok(NULL, ","); - - if (tmp == NULL) - return ret; - - if (ret >= max_length) - return -1; - - v = strtoul(tmp, &p, 0); - if (*p != 0) - return -1; - if (v > UINT_MAX) { - fprintf(stderr, "%s out of range\n", tmp); - return -1; - } - val[ret] = v; - ret++; - } -} - -int argconfig_parse_comma_sep_array_short(char *string, unsigned short *val, - unsigned int max_length) -{ - int ret = 0; - unsigned long v; - char *tmp; - char *p; - - if (is_null_or_empty(string)) - return 0; - - tmp = strtok(string, ","); - if (!tmp) - return 0; - - v = strtoul(tmp, &p, 0); - if (*p != 0) - return -1; - if (v > UINT16_MAX) { - fprintf(stderr, "%s out of range\n", tmp); - return -1; - } - val[ret] = v; - ret++; - - while (1) { - tmp = strtok(NULL, ","); - if (tmp == NULL) - return ret; - - if (ret >= max_length) - return -1; - - v = strtoul(tmp, &p, 0); - if (*p != 0) - return -1; - if (v > UINT16_MAX) { - fprintf(stderr, "%s out of range\n", tmp); - return -1; - } - val[ret] = v; - ret++; - } -} - -int argconfig_parse_comma_sep_array_long(char *string, unsigned long long *val, - unsigned int max_length) -{ - int ret = 0; - char *tmp; - char *p; - - if (is_null_or_empty(string)) - return 0; - - tmp = strtok(string, ","); - if (tmp == NULL) - return 0; - - val[ret] = strtoll(tmp, &p, 0); - if (*p != 0) - return -1; - ret++; - while (1) { - tmp = strtok(NULL, ","); - - if (tmp == NULL) - return ret; - - if (ret >= max_length) - return -1; - - val[ret] = strtoll(tmp, &p, 0); - if (*p != 0) - return -1; - ret++; - } -} - -#define DEFINE_ARGCONFIG_PARSE_COMMA_SEP_ARRAY_UINT_FUNC(size) \ -int argconfig_parse_comma_sep_array_u##size(char *string, \ - __u##size *val, \ +#define DEFINE_ARGCONFIG_PARSE_COMMA_SEP_ARRAY_FUNC(name, ret_t, ret_max) \ +int argconfig_parse_comma_sep_array ## name(char *string, \ + ret_t *val, \ unsigned int max_length) \ { \ int ret = 0; \ @@ -510,40 +386,35 @@ int argconfig_parse_comma_sep_array_u##size(char *string, \ return 0; \ \ tmp = strtok(string, ","); \ - if (!tmp) \ - return 0; \ - \ - v = strtoumax(tmp, &p, 0); \ - if (*p != 0) \ - return -1; \ - if (v > UINT##size##_MAX) { \ - fprintf(stderr, "%s out of range\n", tmp); \ - return -1; \ - } \ - val[ret] = v; \ - \ - ret++; \ - while (1) { \ - tmp = strtok(NULL, ","); \ - \ - if (tmp == NULL) \ - return ret; \ \ + while (tmp) { \ if (ret >= max_length) \ return -1; \ \ v = strtoumax(tmp, &p, 0); \ if (*p != 0) \ return -1; \ - if (v > UINT##size##_MAX) { \ + if (v > ret_max) { \ fprintf(stderr, "%s out of range\n", tmp); \ return -1; \ } \ val[ret] = v; \ ret++; \ + \ + tmp = strtok(NULL, ","); \ } \ + \ + return ret; \ } +DEFINE_ARGCONFIG_PARSE_COMMA_SEP_ARRAY_FUNC(, int, UINT_MAX) +DEFINE_ARGCONFIG_PARSE_COMMA_SEP_ARRAY_FUNC(_short, unsigned short, UINT16_MAX) +DEFINE_ARGCONFIG_PARSE_COMMA_SEP_ARRAY_FUNC(_long, unsigned long long, ULLONG_MAX) + +#define DEFINE_ARGCONFIG_PARSE_COMMA_SEP_ARRAY_UINT_FUNC(size) \ + DEFINE_ARGCONFIG_PARSE_COMMA_SEP_ARRAY_FUNC(_u ## size, __u ## size, \ + UINT ## size ## _MAX) + DEFINE_ARGCONFIG_PARSE_COMMA_SEP_ARRAY_UINT_FUNC(16); DEFINE_ARGCONFIG_PARSE_COMMA_SEP_ARRAY_UINT_FUNC(32); DEFINE_ARGCONFIG_PARSE_COMMA_SEP_ARRAY_UINT_FUNC(64); From 648114f39b7b474d6b4007546ff0aa5ac99279a9 Mon Sep 17 00:00:00 2001 From: Caleb Sander Mateos Date: Tue, 16 Jul 2024 15:34:57 -0600 Subject: [PATCH 080/281] nvme: use argconfig_parse_comma_sep_array_u16() in attach-ns nvme_attach_ns() is using argconfig_parse_comma_sep_array() to parse a list of ints and then copying them into a list of u16s. Use argconfig_parse_comma_sep_array_u16() instead to save on memory and avoid needing to copy the values to another list. This also checks that the values fit in u16. Also use NVME_ID_CTRL_LIST_MAX instead of hard-coding the max list size. Signed-off-by: Caleb Sander Mateos --- nvme.c | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/nvme.c b/nvme.c index fd0e9e976d..cb1de12973 100644 --- a/nvme.c +++ b/nvme.c @@ -2804,9 +2804,9 @@ static int delete_ns(int argc, char **argv, struct command *cmd, struct plugin * static int nvme_attach_ns(int argc, char **argv, int attach, const char *desc, struct command *cmd) { _cleanup_free_ struct nvme_ctrl_list *cntlist = NULL; - _cleanup_free_ __u16 *ctrlist = NULL; _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; - int err, num, i, list[2048]; + int err, num; + __u16 list[NVME_ID_CTRL_LIST_MAX]; const char *namespace_id = "namespace to attach"; const char *cont = "optional comma-sep controller id list"; @@ -2834,7 +2834,8 @@ static int nvme_attach_ns(int argc, char **argv, int attach, const char *desc, s return -EINVAL; } - num = argconfig_parse_comma_sep_array(cfg.cntlist, list, 2047); + num = argconfig_parse_comma_sep_array_u16(cfg.cntlist, + list, ARRAY_SIZE(list)); if (!num) fprintf(stderr, "warning: empty controller-id list will result in no actual change in namespace attachment\n"); @@ -2847,14 +2848,7 @@ static int nvme_attach_ns(int argc, char **argv, int attach, const char *desc, s if (!cntlist) return -ENOMEM; - ctrlist = nvme_alloc(sizeof(*ctrlist) * 2048); - if (!ctrlist) - return -ENOMEM; - - for (i = 0; i < num; i++) - ctrlist[i] = (__u16)list[i]; - - nvme_init_ctrl_list(cntlist, num, ctrlist); + nvme_init_ctrl_list(cntlist, num, list); if (attach) err = nvme_cli_ns_attach_ctrls(dev, cfg.namespace_id, From 4e616593b52001fa8dfeac2506be613f98d8feda Mon Sep 17 00:00:00 2001 From: Caleb Sander Mateos Date: Tue, 16 Jul 2024 09:59:29 -0600 Subject: [PATCH 081/281] util: remove unnecessary NULL check in cleanup_nvme_root() cleanup_nvme_root() is checking whether the passed pointer is non-NULL, but since the pointer is to a local variable, this will always be true. Therefore, remove the check and always call nvme_free_tree(). Signed-off-by: Caleb Sander Mateos --- util/cleanup.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/util/cleanup.h b/util/cleanup.h index 0819523d7d..f2acde0d3d 100644 --- a/util/cleanup.h +++ b/util/cleanup.h @@ -38,8 +38,7 @@ static inline void cleanup_fd(int *fd) static inline void cleanup_nvme_root(nvme_root_t *r) { - if (r) - nvme_free_tree(*r); + nvme_free_tree(*r); } #define _cleanup_nvme_root_ __cleanup__(cleanup_nvme_root) From 03006b921bc829361d60502a79fba29bdc684ebd Mon Sep 17 00:00:00 2001 From: Caleb Sander Mateos Date: Tue, 16 Jul 2024 20:04:04 -0600 Subject: [PATCH 082/281] nvme: avoid unnecessary dup() + close() in io_mgmt_send() _cleanup_fd_ doesn't close STD{IN,OUT,ERR}_FILENO, so don't bother creating a duplicate fd. Signed-off-by: Caleb Sander Mateos Fixes: 7e1f6799f8cd ("nvme: use cleanup helper to close file descriptor") --- nvme.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/nvme.c b/nvme.c index cb1de12973..4b0e2313b4 100644 --- a/nvme.c +++ b/nvme.c @@ -2071,7 +2071,7 @@ static int io_mgmt_send(int argc, char **argv, struct command *cmd, struct plugi _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; _cleanup_free_ void *buf = NULL; int err = -1; - _cleanup_fd_ int dfd = -1; + _cleanup_fd_ int dfd = STDIN_FILENO; struct config { __u16 mos; @@ -2116,8 +2116,7 @@ static int io_mgmt_send(int argc, char **argv, struct command *cmd, struct plugi nvme_show_perror(cfg.file); return -errno; } - } else - dfd = dup(STDIN_FILENO); + } err = read(dfd, buf, cfg.data_len); if (err < 0) { From 0a47891b27b38e4d4e491952ce89b669295f8158 Mon Sep 17 00:00:00 2001 From: Caleb Sander Mateos Date: Tue, 16 Jul 2024 20:26:05 -0600 Subject: [PATCH 083/281] fabrics: remove unused _discover_from_json_config_file() argument _discover_from_json_config_file() takes a nvme_subsystem_t argument but doesn't use it. Drop the unnecessary argument. Signed-off-by: Caleb Sander Mateos Fixes: b3b9963396c5 ("fabrics: refactore discover from json config") --- fabrics.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fabrics.c b/fabrics.c index f8136c4ab8..043a9b53d8 100644 --- a/fabrics.c +++ b/fabrics.c @@ -502,7 +502,7 @@ static int discover_from_conf_file(nvme_root_t r, nvme_host_t h, return ret; } -static int _discover_from_json_config_file(nvme_root_t r, nvme_host_t h, nvme_subsystem_t s, +static int _discover_from_json_config_file(nvme_root_t r, nvme_host_t h, nvme_ctrl_t c, const char *desc, bool connect, const struct nvme_fabrics_config *defcfg, nvme_print_flags_t flags, @@ -612,7 +612,7 @@ static int discover_from_json_config_file(nvme_root_t r, const char *hostnqn, nvme_subsystem_for_each_ctrl(s, c) { err = _discover_from_json_config_file( - r, h, s, c, desc, connect, defcfg, + r, h, c, desc, connect, defcfg, flags, force); if (err) { From c01c44b17bb2799f88db2e3d58a6c16e2692ec71 Mon Sep 17 00:00:00 2001 From: Chaithanya shoba Date: Sun, 14 Jul 2024 22:59:11 +0530 Subject: [PATCH 084/281] plugins/micron: Move OCP internal log parsing from Micron to OCP Plugin. Move OCP internal log parsing from Micron to OCP Plugin. Previous PR https://github.com/linux-nvme/nvme-cli/pull/2354. Datacenter NVMe SSD Specification v2.5r9, section 4.9. Signed-off-by: Chaithanya shoba --- Documentation/cmd-plugins.txt | 4 +- Documentation/meson.build | 2 +- .../nvme-micron-ocp-telemetry-log-parse.txt | 88 - Documentation/nvme-ocp-internal-log.txt | 109 ++ completions/_nvme | 37 +- completions/bash-nvme-completion.sh | 9 +- plugins/meson.build | 2 - plugins/micron/micron-nvme.c | 74 +- plugins/micron/micron-nvme.h | 2 - plugins/micron/micron-ocp-telemetry.c | 1416 ----------------- plugins/micron/micron-ocp-telemetry.h | 609 ------- plugins/ocp/ocp-nvme.c | 640 +++++--- plugins/ocp/ocp-telemetry-decode.c | 1364 ++++++++++++++++ plugins/ocp/ocp-telemetry-decode.h | 735 +++++++++ util/meson.build | 1 + plugins/micron/micron-utils.c => util/utils.c | 11 +- plugins/micron/micron-utils.h => util/utils.h | 15 +- 17 files changed, 2640 insertions(+), 2478 deletions(-) delete mode 100644 Documentation/nvme-micron-ocp-telemetry-log-parse.txt create mode 100644 Documentation/nvme-ocp-internal-log.txt delete mode 100644 plugins/micron/micron-ocp-telemetry.c delete mode 100644 plugins/micron/micron-ocp-telemetry.h rename plugins/micron/micron-utils.c => util/utils.c (95%) rename plugins/micron/micron-utils.h => util/utils.h (89%) diff --git a/Documentation/cmd-plugins.txt b/Documentation/cmd-plugins.txt index 3827465630..338425efaa 100644 --- a/Documentation/cmd-plugins.txt +++ b/Documentation/cmd-plugins.txt @@ -46,8 +46,8 @@ linknvme:nvme-micron-smart-add-log[1]:: linknvme:nvme-micron-temperature-stats[1]:: Retrieves temperature information of given micron device -linknvme:nvme-micron-ocp-telemetry-log-parse[1]:: - Parse OCP Telemetry DA1 and DA2 logs. +linknvme:nvme-ocp-internal-log[1]:: + Retrieves and parses OCP Telemetry DA1 and DA2 logs. linknvme:nvme-netapp-ontapdevices[1]:: Display information about ONTAP devices diff --git a/Documentation/meson.build b/Documentation/meson.build index 22a995fe03..30c0efc418 100644 --- a/Documentation/meson.build +++ b/Documentation/meson.build @@ -81,7 +81,6 @@ adoc_sources = [ 'nvme-micron-selective-download', 'nvme-micron-smart-add-log', 'nvme-micron-temperature-stats', - 'nvme-micron-ocp-telemetry-log-parse', 'nvme-netapp-ontapdevices', 'nvme-netapp-smdevices', 'nvme-ns-descs', @@ -105,6 +104,7 @@ adoc_sources = [ 'nvme-ocp-smart-add-log', 'nvme-ocp-telemetry-string-log-page', 'nvme-ocp-unsupported-reqs-log-pages', + 'nvme-ocp-internal-log', 'nvme-persistent-event-log', 'nvme-pred-lat-event-agg-log', 'nvme-predictable-lat-log', diff --git a/Documentation/nvme-micron-ocp-telemetry-log-parse.txt b/Documentation/nvme-micron-ocp-telemetry-log-parse.txt deleted file mode 100644 index 417284fa6e..0000000000 --- a/Documentation/nvme-micron-ocp-telemetry-log-parse.txt +++ /dev/null @@ -1,88 +0,0 @@ -nvme-micron-ocp-telemetry-log-parse(1) -====================================== - -NAME ----- -nvme-micron-ocp-telemetry-log-parse - Parses OCP Telemetry DA1 and DA2 logs. - -SYNOPSIS --------- -[verse] -'nvme micron ocp-telemetry-log-parse' - [--telemetry-log= | -l ] - [--string-log= | -s ] - [--output-file= | -o ] - [--format= | -f ] - -DESCRIPTION ------------ -For the given NVMe device, parses the telemetry log and string log -(in binary format) and provides the parsed data in json and normal text formats. - -The parameter is mandatory and may be either the NVMe -character device (ex: /dev/nvme0), or a namespace block device (ex: -/dev/nvme0n1). - -This will only work on Micron devices of model numbers 51Bx. Support for new -devices may be added subsequently. Results for any other device are undefined. - -OPTIONS -------- --l :: ---telemetry-log=:: - This option will allow the users to specify input telemetry-log file name. - --o :: ---string-log=:: - This option will allow the users to specify input string-log file name. - --o :: ---output-file=:: - This option will allow the users to specify the output file name. - --f :: ---format=:: - Set the reporting format to 'normal', 'json'. Only one output format can be - used at a time. - -EXAMPLES --------- -* Parse nvme_host_telemetry_log.bin with nvmelog_ocp_c9.bin and output parsed -json data into nvme_cli_telemetry_host.json -+ ------------- -# sudo ./nvme micron ocp-telemetry-log-parse --format=json - --string-log="nvmelog_ocp_c9.bin" --telemetry-log="nvme_host_telemetry_log.bin" - --output-file=nvme_cli_telemetry_host.json /dev/nvme0 ------------- - -* Parse nvme_host_telemetry_log.bin with nvmelog_ocp_c9.bin and output parsed -text data into nvme_cli_telemetry_host_normal.txt -+ ------------- -# sudo ./nvme micron ocp-telemetry-log-parse --format=normal - --string-log="nvmelog_ocp_c9.bin" --telemetry-log="nvme_host_telemetry_log.bin" - --output-file=nvme_cli_telemetry_host_normal.txt /dev/nvme0 ------------- - -* Parse nvme_host_telemetry_log.bin with nvmelog_ocp_c9.bin and redirect parsed -json data into nvme_cli_telemetry_host_console.json -+ ------------- -# sudo ./nvme micron ocp-telemetry-log-parse --format=json - --string-log="nvmelog_ocp_c9.bin" --telemetry-log="nvme_host_telemetry_log.bin" - > nvme_cli_telemetry_host_console.txt /dev/nvme0 ------------- - -* Parse nvme_host_telemetry_log.bin with nvmelog_ocp_c9.bin and redirect parsed -text data into nvme_cli_telemetry_host_console.json -+ ------------- -# sudo ./nvme micron ocp-telemetry-log-parse --format=normal - --string-log="nvmelog_ocp_c9.bin" --telemetry-log="nvme_host_telemetry_log.bin" - > nvme_cli_telemetry_host_console.txt /dev/nvme0 ------------- - -NVME ----- -Part of the nvme-user suite diff --git a/Documentation/nvme-ocp-internal-log.txt b/Documentation/nvme-ocp-internal-log.txt new file mode 100644 index 0000000000..7393349122 --- /dev/null +++ b/Documentation/nvme-ocp-internal-log.txt @@ -0,0 +1,109 @@ +nvme-ocp-internal-log(1) +======================== + +NAME +---- +nvme-ocp-internal-log - Conditionally retrieves 07h Telemetry Host-Initiated +log, C9h OCP Strings Log from an NVMe device or from user-specified file path. +Takes retrieved logs and decodes into human-readable output format specified by +user. + +SYNOPSIS +-------- +[verse] +'nvme ocp internal-log' + [--telemetry-log= | -l ] + [--string-log= | -s ] + [--output-file= | -o ] + [--output-format= | -f ] + [--data-area= | -a ] + [--telemetry-type= | -t ] + +DESCRIPTION +----------- +Conditionally retrieves 07h Telemetry Host-Initiated log, C9h OCP Strings Log +from an NVMe device or from user-specified file path. Takes retrieved logs and +decodes (or) parses into human-readable output format specified by user. + +The parameter is mandatory and may be either the NVMe +character device (ex: /dev/nvme0), or a namespace block device (ex: +/dev/nvme0n1). + +This will only work on OCP compliant devices supporting this feature. +Results for any other device are undefined. + +On success it returns 0, error code otherwise. + +OPTIONS +------- +-l :: +--telemetry-log=:: + File name to existing Telemetry Host-Initiated raw binary data to be used. + If no path is specified, a live retrieval of payload on will be + performed. + +-s :: +--string-log=:: + File name to existing OCP String Log raw binary data to be used. If no path + is specified, a live retrieval of payload on will be + performed. + +-o :: +--output-file=:: + Filepath name to where human-readable output data will be saved to. + +-f :: +--output-format=:: + Set the reporting format to 'normal', 'json'. Only one output format can be + used at a time, the default value is 'json'. + +-a :: +--data-area=:: + Retrieves the specific data area requested. Valid inputs are 1,2. If this + option is not specified, the default value is 1. + +-t :: +--telemetry-type=:: + If set to 1, controller shall capture the Telemetry Host-Initiated data + representing the internal state of the controller at the time the associated + Get Log Page command is processed. If cleared to 0, controller shall not + update this data. + +EXAMPLES +-------- + +* Retrieve in both OCP String Log and Telemetry Host-Initiated Log from +device. Decode default data-area(s) in default format and output to console. ++ +---------------------------------- +# nvme ocp internal-log /dev/nvme0 +---------------------------------- + +* Retrieve Telemetry Host-Initiated data, reads in the OCP String Log locally. +Decode default data-area(s) in default format. ++ +-------------------------------------------------------------------- +# nvme ocp internal-log /dev/nvme0 --string-log=ocp_string_log.bin + --output-file=output_file.json +-------------------------------------------------------------------- + +* Retrieve OCP String Log, reads in the Telemetry Host-Initiated Log locally. +Decode data-areas 1 and 2, and output in json format. ++ +--------------------------------------------------------------------- +# nvme ocp internal-log /dev/nvme0 --telemetry-log=host_telemetry.bin + --output-format=json --output-file=output_file.json --data-area=2 +--------------------------------------------------------------------- + +* Reads in both OCP String Log and Telemetry Host-Initiated Log locally. +Decode data-areas 1 and 2, and output in normal text format. ++ +------------------------------------------------------------------ +# nvme ocp internal-log /dev/nvme0 --string-log=ocp_string_log.bin + --telemetry-log=host_telemetry.bin --output-format=normal + --output-file=output_file.txt --data-area=2 +------------------------------------------------------------------ + +NVME +---- +Part of the nvme-user suite diff --git a/completions/_nvme b/completions/_nvme index 28786bbdfb..fd8e5d5893 100644 --- a/completions/_nvme +++ b/completions/_nvme @@ -180,12 +180,18 @@ _nvme () { local _internal_log _internal_log=( /dev/nvme':supply a device to use (required)' - --telemetry_type=':Telemetry Type; host (Create bit) or controller' - -t':alias for --telemetry_type' - --telemetry_data_area=':Telemetry Data Area; 1 or 3' - -a':alias for --telemetry_data_area' + --telemetry-type=':Telemetry Type; host or controller generated' + -t':alias for --telemetry-type' + --data-area=':Telemetry Data Area; 1 or 2' + -a':alias for --data-area' --output-file=':Output file name with path' -o':alias for --output-file' + --telemetry-log=':Telemetry log binary' + -l':alias for --telemetry-log' + --string-log=':String log binary' + -s':alias for --string-log' + --output-format':Output format: normal|json' + -f':alias for --output-format' ) _arguments '*:: :->subcmds' _describe -t commands "nvme ocp internal-log options" _internal_log @@ -532,29 +538,6 @@ _nvme () { (*) _files ;; - esac - ;; - (micron) - case ${words[2]} in - (ocp-telemetry-log-parse) - local _ocp-telemetry-log-parse - _ocp-telemetry-log-parse=( - /dev/nvme':supply a device to use (required)' - --output-file=':Output file name with path' - -o':alias for --output-file' - --telemetry-log=':Telemetry log binary' - -l':alias for --telemetry-log' - --string-log=':String log binary' - -s':alias for --string-log' - --format':Output format: normal|json' - -f':alias for --format' - ) - _arguments '*:: :->subcmds' - _describe -t commands "nvme micron ocp-telemetry-log-parse" _ocp-telemetry-log-parse - ;; - (*) - _files - ;; esac return else diff --git a/completions/bash-nvme-completion.sh b/completions/bash-nvme-completion.sh index 00ea5e9b27..35149c196b 100644 --- a/completions/bash-nvme-completion.sh +++ b/completions/bash-nvme-completion.sh @@ -889,10 +889,6 @@ plugin_micron_opts () { "vs-smbus-option") opts+=" --option= -o --value= -v --save= -s" ;; - "ocp-telemetry-log-parse") - opts+=" --format= -f --telemetry-log= -l --string-log= -s \ - --output-file= -o" - ;; "help") opts+=$NO_OPTS ;; @@ -1448,8 +1444,9 @@ plugin_ocp_opts () { --latency_monitor_feature_enable= -e" ;; "internal-log") - opts+=" --telemetry_type= -t --telemetry_data_area= -a \ - --output-file= -o" + opts+=" --telemetry-log= -l --string-log= -s \ + --output-file= -o --output-format= -f \ + --data-area= -a --telemetry-type= -t" ;; "clear-fw-activate-history") opts+=" --no-uuid -n" diff --git a/plugins/meson.build b/plugins/meson.build index 45defa06b2..146fa2a0ad 100644 --- a/plugins/meson.build +++ b/plugins/meson.build @@ -11,8 +11,6 @@ if json_c_dep.found() 'plugins/inspur/inspur-nvme.c', 'plugins/intel/intel-nvme.c', 'plugins/memblaze/memblaze-nvme.c', - 'plugins/micron/micron-utils.c', - 'plugins/micron/micron-ocp-telemetry.c', 'plugins/micron/micron-nvme.c', 'plugins/nbft/nbft-plugin.c', 'plugins/netapp/netapp-nvme.c', diff --git a/plugins/micron/micron-nvme.c b/plugins/micron/micron-nvme.c index dcb3748fa8..27825953c9 100644 --- a/plugins/micron/micron-nvme.c +++ b/plugins/micron/micron-nvme.c @@ -7,7 +7,27 @@ * @authors:Chaithanya Shoba , */ -#include "micron-ocp-telemetry.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "common.h" +#include "nvme.h" +#include "libnvme.h" +#include +#include "linux/types.h" +#include "nvme-print.h" +#include "util/cleanup.h" +#include "util/utils.h" #define CREATE_CMD #include "micron-nvme.h" @@ -1183,7 +1203,7 @@ static void init_d0_log_page(__u8 *buf, __u8 nsze) } /* Smart Health Log information as per OCP spec M51CX models */ -struct micron_vs_logpage ocp_c0_log_page[] = { +struct request_data ocp_c0_log_page[] = { { "Physical Media Units Written", 16}, { "Physical Media Units Read", 16 }, { "Raw Bad User NAND Block Count", 6}, @@ -1317,7 +1337,7 @@ static void print_smart_cloud_health_log(__u8 *buf, bool is_json) logPages); } - print_micron_vs_logs(buf, ocp_c0_log_page, field_count, stats, 0, NULL); + generic_structure_parser(buf, ocp_c0_log_page, field_count, stats, 0, NULL); if (is_json) { json_array_add_value_object(logPages, stats); @@ -1342,7 +1362,7 @@ static void print_nand_stats_fb(__u8 *buf, __u8 *buf2, __u8 nsze, bool is_json, logPages); } - print_micron_vs_logs(buf, fb_log_page, field_count, stats, spec, NULL); + generic_structure_parser(buf, fb_log_page, field_count, stats, spec, NULL); /* print last three entries from D0 log page */ if (buf2) { @@ -1496,7 +1516,7 @@ static void print_ext_smart_logs_e1(__u8 *buf, bool is_json) printf("SMART Extended Log:0xE1\n"); } - print_micron_vs_logs(buf, e1_log_page, field_count, stats, 0, NULL); + generic_structure_parser(buf, e1_log_page, field_count, stats, 0, NULL); if (is_json) { json_array_add_value_object(logPages, stats); @@ -3274,47 +3294,3 @@ static int micron_logpage_dir(int argc, char **argv, struct command *cmd, return err; } - -static int micron_ocp_telemetry_log_parse(int argc, char **argv, - struct command *cmd, struct plugin *plugin) -{ - const char *desc = "Parse OCP Telemetry DA1 and DA2 logs."; - const char *output_fmt = "output format normal|json"; - const char *telemetry_log = "Telemetry log binary;\n 'host.bin' or 'controller.bin'"; - const char *string_log = "String log binary; 'C9.bin'"; - const char *output_file = "Output file name with path;\n" - "e.g. '-o ./path/name'\n'-o ./path1/path2/';\n" - "If requested path doesn't exist, the file will be newly created."; - enum eDriveModel eModel = UNKNOWN_MODEL; - int err = 0; - struct nvme_dev *dev; - struct ocp_telemetry_parse_options opt; - - OPT_ARGS(opts) = { - OPT_STR("telemetry-log", 'l', &opt.telemetry_log, telemetry_log), - OPT_STR("string-log", 's', &opt.string_log, string_log), - OPT_FILE("output-file", 'o', &opt.output_file, output_file), - OPT_FMT("format", 'f', &opt.output_fmt, output_fmt), - OPT_END() - }; - - err = micron_parse_options(&dev, argc, argv, desc, opts, &eModel); - if (err < 0) - return -1; - - if (!opt.telemetry_log) { - nvme_show_result("\nMissing telemetry-log.\n"); - return -1; - } else if (!opt.string_log) { - nvme_show_result("\nMissing string-log. Skipping adding string data.\n"); - } else if (!opt.output_fmt) { - nvme_show_result("\nMissing format. Using default format - JSON.\n"); - } - - err = parse_ocp_telemetry_log(&opt); - - dev_close(dev); - if (err != 0) - nvme_show_status(err); - return err; -} diff --git a/plugins/micron/micron-nvme.h b/plugins/micron/micron-nvme.h index 91fc2c8da2..c9e3ca7a6a 100644 --- a/plugins/micron/micron-nvme.h +++ b/plugins/micron/micron-nvme.h @@ -35,8 +35,6 @@ PLUGIN(NAME("micron", "Micron vendor specific extensions", NVME_VERSION), ENTRY("vs-smart-add-log", "Retrieve extended SMART data", micron_ocp_smart_health_logs) ENTRY("clear-fw-activate-history", "Clear FW activation history", micron_clr_fw_activation_history) ENTRY("vs-smbus-option", "Enable/Disable SMBUS on the drive", micron_smbus_option) - ENTRY("ocp-telemetry-log-parse", "Parse OCP Telemetry DA1 and DA2 logs", - micron_ocp_telemetry_log_parse) ) ); diff --git a/plugins/micron/micron-ocp-telemetry.c b/plugins/micron/micron-ocp-telemetry.c deleted file mode 100644 index b177722eaf..0000000000 --- a/plugins/micron/micron-ocp-telemetry.c +++ /dev/null @@ -1,1416 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-or-later -/* - * Copyright (c) Micron, Inc 2024. - * - * @file: micron-ocp-telemetry.c - * @brief: This module contains all the constructs needed for parsing (or) - * decoding ocp telemetry log files. - * @author: Chaithanya Shoba - */ - -#include "micron-ocp-telemetry.h" - -//global buffers -static unsigned char *ptelemetry_buffer; -static unsigned char *pstring_buffer; - -struct statistic_entry statistic_identifiers_map[] = { - { 0x00, "Error, this entry does not exist." }, - { 0x01, "Outstanding Admin Commands" }, - { 0x02, "Host Write Bandwidth"}, - { 0x03, "GC Write Bandwidth"}, - { 0x04, "Active Namespaces"}, - { 0x05, "Internal Write Workload"}, - { 0x06, "Internal Read Workload"}, - { 0x07, "Internal Write Queue Depth"}, - { 0x08, "Internal Read Queue Depth"}, - { 0x09, "Pending Trim LBA Count"}, - { 0x0A, "Host Trim LBA Request Count"}, - { 0x0B, "Current NVMe Power State"}, - { 0x0C, "Current DSSD Power State"}, - { 0x0D, "Program Fail Count"}, - { 0x0E, "Erase Fail Count"}, - { 0x0F, "Read Disturb Writes"}, - { 0x10, "Retention Writes"}, - { 0x11, "Wear Leveling Writes"}, - { 0x12, "Read Recovery Writes"}, - { 0x13, "GC Writes"}, - { 0x14, "SRAM Correctable Count"}, - { 0x15, "DRAM Correctable Count"}, - { 0x16, "SRAM Uncorrectable Count"}, - { 0x17, "DRAM Uncorrectable Count"}, - { 0x18, "Data Integrity Error Count"}, - { 0x19, "Read Retry Error Count"}, - { 0x1A, "PERST Events Count"}, - { 0x1B, "Max Die Bad Block"}, - { 0x1C, "Max NAND Channel Bad Block"}, - { 0x1D, "Minimum NAND Channel Bad Block"} -}; - -struct micron_vs_logpage host_log_page_header[] = { - { "LogIdentifier", 1 }, - { "Reserved1", 4 }, - { "IEEE OUI Identifier", 3 }, - { "Telemetry Host-Initiated Data Area 1 Last Block", 2 }, - { "Telemetry Host-Initiated Data Area 2 Last Block", 2 }, - { "Telemetry Host-Initiated Data Area 3 Last Block", 2 }, - { "Reserved2", 2 }, - { "Telemetry Host-Initiated Data Area 4 Last Block", 4 }, - { "Reserved3", 360 }, - { "Telemetry Host-Initiated Scope", 1 }, - { "Telemetry Host Initiated Generation Number", 1 }, - { "Telemetry Host-Initiated Data Available", 1 }, - { "Telemetry Controller-Initiated Data Generation Number", 1 } -}; - -struct micron_vs_logpage controller_log_page_header[] = { - { "LogIdentifier", 1 }, - { "Reserved1", 4 }, - { "IEEE OUI Identifier", 3 }, - { "Telemetry Host-Initiated Data Area 1 Last Block", 2 }, - { "Telemetry Host-Initiated Data Area 2 Last Block", 2 }, - { "Telemetry Host-Initiated Data Area 3 Last Block", 2 }, - { "Reserved2", 2 }, - { "Telemetry Host-Initiated Data Area 4 Last Block", 4 }, - { "Reserved3", 361 }, - { "Telemetry Controller-Initiated Scope", 1 }, - { "Telemetry Controller-Initiated Data Available", 1 }, - { "Telemetry Controller-Initiated Data Generation Number", 1 } -}; - -struct micron_vs_logpage reason_identifier[] = { - { "Error ID", 64 }, - { "File ID", 8 }, - { "Line Number", 2 }, - { "Valid Flags", 1 }, - { "Reserved", 21 }, - { "VU Reason Extension", 32 } -}; - -struct micron_vs_logpage ocp_header_in_da1[] = { - { "Major Version", 2 }, - { "Minor Version", 2 }, - { "Reserved1", 4 }, - { "Timestamp", 8 }, - { "Log page GUID", 16 }, - { "Number Telemetry Profiles Supported", 1 }, - { "Telemetry Profile Selected", 1 }, - { "Reserved2", 6 }, - { "Telemetry String Log Size", 8 }, - { "Reserved3", 8 }, - { "Firmware Revision", 8 }, - { "Reserved4", 32 }, - { "Data Area 1 Statistic Start", 8 }, - { "Data Area 1 Statistic Size", 8 }, - { "Data Area 2 Statistic Start", 8 }, - { "Data Area 2 Statistic Size", 8 }, - { "Reserved5", 32 }, - { "Event FIFO 1 Data Area", 1 }, - { "Event FIFO 2 Data Area", 1 }, - { "Event FIFO 3 Data Area", 1 }, - { "Event FIFO 4 Data Area", 1 }, - { "Event FIFO 5 Data Area", 1 }, - { "Event FIFO 6 Data Area", 1 }, - { "Event FIFO 7 Data Area", 1 }, - { "Event FIFO 8 Data Area", 1 }, - { "Event FIFO 9 Data Area", 1 }, - { "Event FIFO 10 Data Area", 1 }, - { "Event FIFO 11 Data Area", 1 }, - { "Event FIFO 12 Data Area", 1 }, - { "Event FIFO 13 Data Area", 1 }, - { "Event FIFO 14 Data Area", 1 }, - { "Event FIFO 15 Data Area", 1 }, - { "Event FIFO 16 Data Area", 1 }, - { "Event FIFO 1 Start", 8 }, - { "Event FIFO 1 Size", 8 }, - { "Event FIFO 2 Start", 8 }, - { "Event FIFO 2 Size", 8 }, - { "Event FIFO 3 Start", 8 }, - { "Event FIFO 3 Size", 8 }, - { "Event FIFO 4 Start", 8 }, - { "Event FIFO 4 Size", 8 }, - { "Event FIFO 5 Start", 8 }, - { "Event FIFO 5 Size", 8 }, - { "Event FIFO 6 Start", 8 }, - { "Event FIFO 6 Size", 8 }, - { "Event FIFO 7 Start", 8 }, - { "Event FIFO 7 Size", 8 }, - { "Event FIFO 8 Start", 8 }, - { "Event FIFO 8 Size", 8 }, - { "Event FIFO 9 Start", 8 }, - { "Event FIFO 9 Size", 8 }, - { "Event FIFO 10 Start", 8 }, - { "Event FIFO 10 Size", 8 }, - { "Event FIFO 11 Start", 8 }, - { "Event FIFO 11 Size", 8 }, - { "Event FIFO 12 Start", 8 }, - { "Event FIFO 12 Size", 8 }, - { "Event FIFO 13 Start", 8 }, - { "Event FIFO 13 Size", 8 }, - { "Event FIFO 14 Start", 8 }, - { "Event FIFO 14 Size", 8 }, - { "Event FIFO 15 Start", 8 }, - { "Event FIFO 15 Size", 8 }, - { "Event FIFO 16 Start", 8 }, - { "Event FIFO 16 Size", 8 }, - { "Reserved6", 80 } -}; - -struct micron_vs_logpage smart[] = { - { "Critical Warning", 1 }, - { "Composite Temperature", 2 }, - { "Available Spare", 1 }, - { "Available Spare Threshold", 1 }, - { "Percentage Used", 1 }, - { "Reserved1", 26 }, - { "Data Units Read", 16 }, - { "Data Units Written", 16 }, - { "Host Read Commands", 16 }, - { "Host Write Commands", 16 }, - { "Controller Busy Time", 16 }, - { "Power Cycles", 16 }, - { "Power On Hours", 16 }, - { "Unsafe Shutdowns", 16 }, - { "Media and Data Integrity Errors", 16 }, - { "Number of Error Information Log Entries", 16 }, - { "Warning Composite Temperature Time", 4 }, - { "Critical Composite Temperature Time", 4 }, - { "Temperature Sensor 1", 2 }, - { "Temperature Sensor 2", 2 }, - { "Temperature Sensor 3", 2 }, - { "Temperature Sensor 4", 2 }, - { "Temperature Sensor 5", 2 }, - { "Temperature Sensor 6", 2 }, - { "Temperature Sensor 7", 2 }, - { "Temperature Sensor 8", 2 }, - { "Thermal Management Temperature 1 Transition Count", 4 }, - { "Thermal Management Temperature 2 Transition Count", 4 }, - { "Total Time for Thermal Management Temperature 1", 4 }, - { "Total Time for Thermal Management Temperature 2", 4 }, - { "Reserved2", 280 } -}; - -struct micron_vs_logpage smart_extended[] = { - { "Physical Media Units Written", 16 }, - { "Physical Media Units Read", 16 }, - { "Bad User NAND Blocks Raw Count", 6 }, - { "Bad User NAND Blocks Normalized Value", 2 }, - { "Bad System NAND Blocks Raw Count", 6 }, - { "Bad System NAND Blocks Normalized Value", 2 }, - { "XOR Recovery Count", 8 }, - { "Uncorrectable Read Error Count", 8 }, - { "Soft ECC Error Count", 8 }, - { "End to End Correction Counts Detected Errors", 4 }, - { "End to End Correction Counts Corrected Errors", 4 }, - { "System Data Percent Used", 1 }, - { "Refresh Counts", 7 }, - { "Maximum User Data Erase Count", 4 }, - { "Minimum User Data Erase Count", 4 }, - { "Number of thermal throttling events", 1 }, - { "Current Throttling Status", 1 }, - { "Errata Version Field", 1 }, - { "Point Version Field", 2 }, - { "Minor Version Field", 2 }, - { "Major Version Field", 1 }, - { "PCIe Correctable Error Count", 8 }, - { "Incomplete Shutdowns", 4 }, - { "Reserved1", 4 }, - { "Percent Free Blocks", 1 }, - { "Reserved2", 7 }, - { "Capacitor Health", 2 }, - { "NVMe Base Errata Version", 1 }, - { "NVMe Command Set Errata Version", 1 }, - { "Reserved3", 4 }, - { "Unaligned IO", 8 }, - { "Security Version Number", 8 }, - { "Total NUSE", 8 }, - { "PLP Start Count", 16 }, - { "Endurance Estimate", 16 }, - { "PCIe Link Retraining Count", 8 }, - { "Power State Change Count", 8 }, - { "Lowest Permitted Firmware Revision", 8 }, - { "Reserved4", 278 }, - { "Log Page Version", 2 }, - { "Log page GUID", 16 } -}; - -void json_add_formatted_u32_str(struct json_object *pobject, const char *msg, unsigned int pdata) -{ - char data_str[70] = { 0 }; - - sprintf(data_str, "0x%x", pdata); - json_object_add_value_string(pobject, msg, data_str); -} - -void json_add_formatted_var_size_str(struct json_object *pobject, const char *msg, __u8 *pdata, - unsigned int data_size) -{ - char description_str[256] = ""; - char temp_buffer[3] = { 0 }; - - for (size_t i = 0; i < data_size; ++i) { - sprintf(temp_buffer, "%02X", pdata[i]); - strcat(description_str, temp_buffer); - } - - json_object_add_value_string(pobject, msg, description_str); -} - -int get_telemetry_das_offset_and_size( - struct nvme_ocp_telemetry_common_header *ptelemetry_common_header, - struct nvme_ocp_telemetry_offsets *ptelemetry_das_offset) -{ - if (NULL == ptelemetry_common_header || NULL == ptelemetry_das_offset) { - nvme_show_error("Invalid input arguments."); - return -1; - } - - if (ptelemetry_common_header->log_id == NVME_HOST_TELEMETRY_LOG) - ptelemetry_das_offset->header_size = - sizeof(struct nvme_ocp_telemetry_host_initiated_header); - else if (ptelemetry_common_header->log_id == NVME_CNTRL_TELEMETRY_LOG) - ptelemetry_das_offset->header_size = - sizeof(struct nvme_ocp_telemetry_controller_initiated_header); - else - return -1; - - ptelemetry_das_offset->da1_start_offset = ptelemetry_das_offset->header_size; - ptelemetry_das_offset->da1_size = ptelemetry_common_header->da1_last_block * - OCP_TELEMETRY_DATA_BLOCK_SIZE; - - ptelemetry_das_offset->da2_start_offset = ptelemetry_das_offset->da1_start_offset + - ptelemetry_das_offset->da1_size; - ptelemetry_das_offset->da2_size = - (ptelemetry_common_header->da2_last_block - - ptelemetry_common_header->da1_last_block) * OCP_TELEMETRY_DATA_BLOCK_SIZE; - - ptelemetry_das_offset->da3_start_offset = ptelemetry_das_offset->da2_start_offset + - ptelemetry_das_offset->da2_size; - ptelemetry_das_offset->da3_size = - (ptelemetry_common_header->da3_last_block - - ptelemetry_common_header->da2_last_block) * OCP_TELEMETRY_DATA_BLOCK_SIZE; - - ptelemetry_das_offset->da4_start_offset = ptelemetry_das_offset->da3_start_offset + - ptelemetry_das_offset->da3_size; - ptelemetry_das_offset->da4_size = - (ptelemetry_common_header->da4_last_block - - ptelemetry_common_header->da3_last_block) * OCP_TELEMETRY_DATA_BLOCK_SIZE; - - return 0; -} - -int get_static_id_ascii_string(int identifier, char *description) -{ - if (pstring_buffer == NULL) - return -1; - - struct nvme_ocp_telemetry_string_header *pocp_ts_header = - (struct nvme_ocp_telemetry_string_header *)pstring_buffer; - - //Calculating the sizes of the tables. Note: Data is present in the form of DWORDS, - //So multiplying with sizeof(DWORD) - unsigned long long sits_table_size = (pocp_ts_header->sitsz) * SIZE_OF_DWORD; - - //Calculating number of entries present in all 3 tables - int sits_entries = (int)sits_table_size / - sizeof(struct nvme_ocp_statistics_identifier_string_table); - - for (int sits_entry = 0; sits_entry < sits_entries; sits_entry++) { - struct nvme_ocp_statistics_identifier_string_table - *peach_statistic_entry = - (struct nvme_ocp_statistics_identifier_string_table *) - (pstring_buffer + (pocp_ts_header->sits * SIZE_OF_DWORD) + - (sits_entry * - sizeof(struct nvme_ocp_statistics_identifier_string_table))); - - if (identifier == (int)peach_statistic_entry->vs_statistic_identifier) { - char *pdescription = (char *)(pstring_buffer + - (pocp_ts_header->ascts * SIZE_OF_DWORD) + - (peach_statistic_entry->ascii_id_offset * - SIZE_OF_DWORD)); - - memcpy(description, pdescription, - peach_statistic_entry->ascii_id_length + 1); - - // If ASCII string isn't found, see in our internal Map - // for 2.5 Spec defined strings (id < 0x1D). - if ((description == NULL) && (identifier < 0x1D)) - memcpy(description, - statistic_identifiers_map[identifier].description, - peach_statistic_entry->ascii_id_length + 1); - return 0; - } - } - - return -1; -} - -int get_event_id_ascii_string(int identifier, int debug_event_class, char *description) -{ - if (pstring_buffer == NULL) - return -1; - - struct nvme_ocp_telemetry_string_header *pocp_ts_header = - (struct nvme_ocp_telemetry_string_header *)pstring_buffer; - - //Calculating the sizes of the tables. Note: Data is present in the form of DWORDS, - //So multiplying with sizeof(DWORD) - unsigned long long ests_table_size = (pocp_ts_header->estsz) * SIZE_OF_DWORD; - - //Calculating number of entries present in all 3 tables - int ests_entries = (int)ests_table_size / sizeof(struct nvme_ocp_event_string_table); - - for (int ests_entry = 0; ests_entry < ests_entries; ests_entry++) { - struct nvme_ocp_event_string_table *peach_event_entry = - (struct nvme_ocp_event_string_table *) - (pstring_buffer + (pocp_ts_header->ests * SIZE_OF_DWORD) + - (ests_entry * sizeof(struct nvme_ocp_event_string_table))); - - if (identifier == (int)peach_event_entry->event_identifier && - debug_event_class == (int)peach_event_entry->debug_event_class) { - char *pdescription = (char *)(pstring_buffer + - (pocp_ts_header->ascts * SIZE_OF_DWORD) + - (peach_event_entry->ascii_id_offset * SIZE_OF_DWORD)); - - memcpy(description, pdescription, - peach_event_entry->ascii_id_length + 1); - return 0; - } - } - - return -1; -} - -int get_vu_event_id_ascii_string(int identifier, int debug_event_class, char *description) -{ - if (pstring_buffer == NULL) - return -1; - - struct nvme_ocp_telemetry_string_header *pocp_ts_header = - (struct nvme_ocp_telemetry_string_header *)pstring_buffer; - - //Calculating the sizes of the tables. Note: Data is present in the form of DWORDS, - //So multiplying with sizeof(DWORD) - unsigned long long vuests_table_size = (pocp_ts_header->vu_estsz) * SIZE_OF_DWORD; - - //Calculating number of entries present in all 3 tables - int vu_ests_entries = (int)vuests_table_size / - sizeof(struct nvme_ocp_vu_event_string_table); - - for (int vu_ests_entry = 0; vu_ests_entry < vu_ests_entries; vu_ests_entry++) { - struct nvme_ocp_vu_event_string_table *peach_vu_event_entry = - (struct nvme_ocp_vu_event_string_table *) - (pstring_buffer + (pocp_ts_header->vu_ests * SIZE_OF_DWORD) + - (vu_ests_entry * sizeof(struct nvme_ocp_vu_event_string_table))); - - if (identifier == (int)peach_vu_event_entry->vu_event_identifier && - debug_event_class == - (int)peach_vu_event_entry->debug_event_class) { - char *pdescription = (char *)(pstring_buffer + - (pocp_ts_header->ascts * SIZE_OF_DWORD) + - (peach_vu_event_entry->ascii_id_offset * SIZE_OF_DWORD)); - - memcpy(description, pdescription, - peach_vu_event_entry->ascii_id_length + 1); - return 0; - } - } - - return -1; -} - -int parse_ocp_telemetry_string_log(int event_fifo_num, int identifier, int debug_event_class, - enum ocp_telemetry_string_tables string_table, char *description) -{ - if (pstring_buffer == NULL) - return -1; - - if (event_fifo_num != 0) { - struct nvme_ocp_telemetry_string_header *pocp_ts_header = - (struct nvme_ocp_telemetry_string_header *)pstring_buffer; - - if (*pocp_ts_header->fifo_ascii_string[event_fifo_num-1] != '\0') - memcpy(description, pocp_ts_header->fifo_ascii_string[event_fifo_num-1], - 16); - else - description = ""; - - return 0; - } - - if (string_table == STATISTICS_IDENTIFIER_STRING) - get_static_id_ascii_string(identifier, description); - else if (string_table == EVENT_STRING) - get_event_id_ascii_string(identifier, debug_event_class, description); - else if (string_table == VU_EVENT_STRING) - get_vu_event_id_ascii_string(identifier, debug_event_class, description); - - return 0; -} - -void parse_time_stamp_event(struct nvme_ocp_telemetry_event_descriptor *pevent_descriptor, - struct json_object *pevent_descriptor_obj, __u8 *pevent_specific_data, - struct json_object *pevent_fifos_object, FILE *fp) -{ - struct nvme_ocp_time_stamp_dbg_evt_class_format *ptime_stamp_event = - (struct nvme_ocp_time_stamp_dbg_evt_class_format *) pevent_specific_data; - - int vu_event_id = (int)ptime_stamp_event->vu_event_identifier; - - unsigned int data_size = ((pevent_descriptor->event_data_size * SIZE_OF_DWORD)- - sizeof(struct nvme_ocp_time_stamp_dbg_evt_class_format)); - - __u8 *pdata = (__u8 *)ptime_stamp_event + - sizeof(struct nvme_ocp_time_stamp_dbg_evt_class_format); - - char description_str[256] = ""; - - parse_ocp_telemetry_string_log(0, ptime_stamp_event->vu_event_identifier, - pevent_descriptor->debug_event_class_type, - VU_EVENT_STRING, description_str); - - if (pevent_fifos_object != NULL) { - json_add_formatted_var_size_str(pevent_descriptor_obj, STR_CLASS_SPECIFIC_DATA, - ptime_stamp_event->time_stamp, DATA_SIZE_8); - json_add_formatted_u32_str(pevent_descriptor_obj, STR_VU_EVENT_ID_STRING, - vu_event_id); - json_object_add_value_string(pevent_descriptor_obj, STR_VU_EVENT_STRING, - description_str); - json_add_formatted_var_size_str(pevent_descriptor_obj, STR_VU_DATA, pdata, - data_size); - } else { - if (fp) { - print_formatted_var_size_str(STR_CLASS_SPECIFIC_DATA, - ptime_stamp_event->time_stamp, DATA_SIZE_8, fp); - fprintf(fp, "%s: 0x%x\n", STR_VU_EVENT_ID_STRING, vu_event_id); - fprintf(fp, "%s: %s\n", STR_VU_EVENT_STRING, description_str); - print_formatted_var_size_str(STR_VU_DATA, pdata, data_size, fp); - } else { - print_formatted_var_size_str(STR_CLASS_SPECIFIC_DATA, - ptime_stamp_event->time_stamp, DATA_SIZE_8, fp); - printf("%s: 0x%x\n", STR_VU_EVENT_ID_STRING, vu_event_id); - printf("%s: %s\n", STR_VU_EVENT_STRING, description_str); - print_formatted_var_size_str(STR_VU_DATA, pdata, data_size, fp); - } - } -} - -void parse_pcie_event(struct nvme_ocp_telemetry_event_descriptor *pevent_descriptor, - struct json_object *pevent_descriptor_obj, __u8 *pevent_specific_data, - struct json_object *pevent_fifos_object, FILE *fp) -{ - struct nvme_ocp_pcie_dbg_evt_class_format *ppcie_event = - (struct nvme_ocp_pcie_dbg_evt_class_format *) pevent_specific_data; - int vu_event_id = (int) ppcie_event->vu_event_identifier; - unsigned int data_size = ((pevent_descriptor->event_data_size * SIZE_OF_DWORD) - - sizeof(struct nvme_ocp_pcie_dbg_evt_class_format)); - __u8 *pdata = (__u8 *) ppcie_event + sizeof(struct nvme_ocp_pcie_dbg_evt_class_format); - char description_str[256] = ""; - - parse_ocp_telemetry_string_log(0, ppcie_event->vu_event_identifier, - pevent_descriptor->debug_event_class_type, VU_EVENT_STRING, description_str); - - if (pevent_fifos_object != NULL) { - json_add_formatted_var_size_str(pevent_descriptor_obj, STR_CLASS_SPECIFIC_DATA, - ppcie_event->pCIeDebugEventData, DATA_SIZE_4); - json_add_formatted_u32_str(pevent_descriptor_obj, STR_VU_EVENT_ID_STRING, - vu_event_id); - json_object_add_value_string(pevent_descriptor_obj, STR_VU_EVENT_STRING, - description_str); - json_add_formatted_var_size_str(pevent_descriptor_obj, STR_VU_DATA, pdata, - data_size); - } else { - if (fp) { - print_formatted_var_size_str(STR_CLASS_SPECIFIC_DATA, - ppcie_event->pCIeDebugEventData, DATA_SIZE_4, fp); - fprintf(fp, "%s: 0x%x\n", STR_VU_EVENT_ID_STRING, vu_event_id); - fprintf(fp, "%s: %s\n", STR_VU_EVENT_STRING, description_str); - print_formatted_var_size_str(STR_VU_DATA, pdata, data_size, fp); - } else { - print_formatted_var_size_str(STR_CLASS_SPECIFIC_DATA, - ppcie_event->pCIeDebugEventData, DATA_SIZE_4, fp); - printf("%s: 0x%x\n", STR_VU_EVENT_ID_STRING, vu_event_id); - printf("%s: %s\n", STR_VU_EVENT_STRING, description_str); - print_formatted_var_size_str(STR_VU_DATA, pdata, data_size, fp); - } - } -} - -void parse_nvme_event(struct nvme_ocp_telemetry_event_descriptor *pevent_descriptor, - struct json_object *pevent_descriptor_obj, __u8 *pevent_specific_data, - struct json_object *pevent_fifos_object, FILE *fp) -{ - struct nvme_ocp_nvme_dbg_evt_class_format *pnvme_event = - (struct nvme_ocp_nvme_dbg_evt_class_format *) pevent_specific_data; - int vu_event_id = (int) pnvme_event->vu_event_identifier; - unsigned int data_size = ((pevent_descriptor->event_data_size * - SIZE_OF_DWORD) - sizeof(struct nvme_ocp_nvme_dbg_evt_class_format)); - __u8 *pdata = (__u8 *) pnvme_event + sizeof(struct nvme_ocp_nvme_dbg_evt_class_format); - char description_str[256] = ""; - - parse_ocp_telemetry_string_log(0, pnvme_event->vu_event_identifier, - pevent_descriptor->debug_event_class_type, VU_EVENT_STRING, - description_str); - - if (pevent_fifos_object != NULL) { - json_add_formatted_var_size_str(pevent_descriptor_obj, STR_CLASS_SPECIFIC_DATA, - pnvme_event->nvmeDebugEventData, DATA_SIZE_8); - json_add_formatted_u32_str(pevent_descriptor_obj, STR_VU_EVENT_ID_STRING, - vu_event_id); - json_object_add_value_string(pevent_descriptor_obj, STR_VU_EVENT_STRING, - description_str); - json_add_formatted_var_size_str(pevent_descriptor_obj, STR_VU_DATA, pdata, - data_size); - } else { - if (fp) { - print_formatted_var_size_str(STR_CLASS_SPECIFIC_DATA, - pnvme_event->nvmeDebugEventData, DATA_SIZE_8, fp); - fprintf(fp, "%s: 0x%x\n", STR_VU_EVENT_ID_STRING, vu_event_id); - fprintf(fp, "%s: %s\n", STR_VU_EVENT_STRING, description_str); - print_formatted_var_size_str(STR_VU_DATA, pdata, data_size, fp); - } else { - print_formatted_var_size_str(STR_CLASS_SPECIFIC_DATA, - pnvme_event->nvmeDebugEventData, DATA_SIZE_8, fp); - printf("%s: 0x%x\n", STR_VU_EVENT_ID_STRING, vu_event_id); - printf("%s: %s\n", STR_VU_EVENT_STRING, description_str); - print_formatted_var_size_str(STR_VU_DATA, pdata, data_size, fp); - } - } -} - -void parse_common_event(struct nvme_ocp_telemetry_event_descriptor *pevent_descriptor, - struct json_object *pevent_descriptor_obj, __u8 *pevent_specific_data, - struct json_object *pevent_fifos_object, FILE *fp) -{ - struct nvme_ocp_common_dbg_evt_class_format *pcommon_debug_event = - (struct nvme_ocp_common_dbg_evt_class_format *) pevent_specific_data; - int vu_event_id = (int) pcommon_debug_event->vu_event_identifier; - unsigned int data_size = ((pevent_descriptor->event_data_size * - SIZE_OF_DWORD) - sizeof(struct nvme_ocp_common_dbg_evt_class_format)); - __u8 *pdata = (__u8 *) pcommon_debug_event + - sizeof(struct nvme_ocp_common_dbg_evt_class_format); - char description_str[256] = ""; - - parse_ocp_telemetry_string_log(0, pcommon_debug_event->vu_event_identifier, - pevent_descriptor->debug_event_class_type, VU_EVENT_STRING, description_str); - - if (pevent_fifos_object != NULL) { - json_add_formatted_u32_str(pevent_descriptor_obj, STR_VU_EVENT_ID_STRING, - vu_event_id); - json_object_add_value_string(pevent_descriptor_obj, STR_VU_EVENT_STRING, - description_str); - json_add_formatted_var_size_str(pevent_descriptor_obj, STR_VU_DATA, pdata, - data_size); - } else { - if (fp) { - fprintf(fp, "%s: 0x%x\n", STR_VU_EVENT_ID_STRING, vu_event_id); - fprintf(fp, "%s: %s\n", STR_VU_EVENT_STRING, description_str); - print_formatted_var_size_str(STR_VU_DATA, pdata, data_size, fp); - } else { - printf("%s: 0x%x\n", STR_VU_EVENT_ID_STRING, vu_event_id); - printf("%s: %s\n", STR_VU_EVENT_STRING, description_str); - print_formatted_var_size_str(STR_VU_DATA, pdata, data_size, fp); - } - } -} - -void parse_media_wear_event(struct nvme_ocp_telemetry_event_descriptor *pevent_descriptor, - struct json_object *pevent_descriptor_obj, __u8 *pevent_specific_data, - struct json_object *pevent_fifos_object, FILE *fp) -{ - struct nvme_ocp_media_wear_dbg_evt_class_format *pmedia_wear_event = - (struct nvme_ocp_media_wear_dbg_evt_class_format *) pevent_specific_data; - int vu_event_id = (int) pmedia_wear_event->vu_event_identifier; - unsigned int data_size = ((pevent_descriptor->event_data_size * SIZE_OF_DWORD) - - sizeof(struct nvme_ocp_media_wear_dbg_evt_class_format)); - __u8 *pdata = (__u8 *) pmedia_wear_event + - sizeof(struct nvme_ocp_media_wear_dbg_evt_class_format); - char description_str[256] = ""; - - parse_ocp_telemetry_string_log(0, pmedia_wear_event->vu_event_identifier, - pevent_descriptor->debug_event_class_type, VU_EVENT_STRING, - description_str); - - if (pevent_fifos_object != NULL) { - json_add_formatted_var_size_str(pevent_descriptor_obj, STR_CLASS_SPECIFIC_DATA, - pmedia_wear_event->currentMediaWear, DATA_SIZE_12); - json_add_formatted_u32_str(pevent_descriptor_obj, STR_VU_EVENT_ID_STRING, - vu_event_id); - json_object_add_value_string(pevent_descriptor_obj, STR_VU_EVENT_STRING, - description_str); - json_add_formatted_var_size_str(pevent_descriptor_obj, STR_VU_DATA, pdata, - data_size); - } else { - if (fp) { - print_formatted_var_size_str(STR_CLASS_SPECIFIC_DATA, - pmedia_wear_event->currentMediaWear, DATA_SIZE_12, fp); - fprintf(fp, "%s: 0x%x\n", STR_VU_EVENT_ID_STRING, vu_event_id); - fprintf(fp, "%s: %s\n", STR_VU_EVENT_STRING, description_str); - print_formatted_var_size_str(STR_VU_DATA, pdata, data_size, fp); - } else { - print_formatted_var_size_str(STR_CLASS_SPECIFIC_DATA, - pmedia_wear_event->currentMediaWear, DATA_SIZE_12, NULL); - printf("%s: 0x%x\n", STR_VU_EVENT_ID_STRING, vu_event_id); - printf("%s: %s\n", STR_VU_EVENT_STRING, description_str); - print_formatted_var_size_str(STR_VU_DATA, pdata, data_size, fp); - } - } -} - -int parse_event_fifo(unsigned int fifo_num, unsigned char *pfifo_start, - struct json_object *pevent_fifos_object, unsigned char *pstring_buffer, - struct nvme_ocp_telemetry_offsets *poffsets, __u64 fifo_size, FILE *fp) -{ - if (NULL == pfifo_start || NULL == poffsets) { - nvme_show_error("Input buffer was NULL"); - return -1; - } - - int status = 0; - unsigned int event_fifo_number = fifo_num + 1; - char *description = (char *)malloc((40 + 1) * sizeof(char)); - - memset(description, 0, sizeof(40)); - - status = - parse_ocp_telemetry_string_log(event_fifo_number, 0, 0, EVENT_STRING, description); - - if (status != 0) { - nvme_show_error("Failed to get C9 String. status: %d\n", status); - return -1; - } - - char event_fifo_name[100] = {0}; - - snprintf(event_fifo_name, sizeof(event_fifo_name), "%s%d%s%s", "EVENT FIFO ", - event_fifo_number, " - ", description); - - struct json_object *pevent_fifo_array = NULL; - - if (pevent_fifos_object != NULL) - pevent_fifo_array = json_create_array(); - else { - char buffer[1024] = {0}; - - sprintf(buffer, "%s%s\n%s", STR_LINE, event_fifo_name, STR_LINE); - if (fp) - fprintf(fp, "%s", buffer); - else - printf("%s", buffer); - } - - int offset_to_move = 0; - unsigned int event_des_size = sizeof(struct nvme_ocp_telemetry_event_descriptor); - - while ((fifo_size > 0) && (offset_to_move < fifo_size)) { - struct nvme_ocp_telemetry_event_descriptor *pevent_descriptor = - (struct nvme_ocp_telemetry_event_descriptor *) - (pfifo_start + offset_to_move); - - if (pevent_descriptor != NULL && pevent_descriptor->event_data_size >= 0) { - //Data is present in the form of DWORDS, So multiplying with sizeof(DWORD) - unsigned int data_size = pevent_descriptor->event_data_size * - SIZE_OF_DWORD; - - __u8 *pevent_specific_data = (__u8 *)pevent_descriptor + event_des_size; - - char description_str[256] = ""; - - parse_ocp_telemetry_string_log(0, pevent_descriptor->event_id, - pevent_descriptor->debug_event_class_type, EVENT_STRING, - description_str); - - struct json_object *pevent_descriptor_obj = - ((pevent_fifos_object != NULL)?json_create_object():NULL); - - if (pevent_descriptor_obj != NULL) { - json_add_formatted_u32_str(pevent_descriptor_obj, - STR_DBG_EVENT_CLASS_TYPE, - pevent_descriptor->debug_event_class_type); - json_add_formatted_u32_str(pevent_descriptor_obj, - STR_EVENT_IDENTIFIER, pevent_descriptor->event_id); - json_object_add_value_string(pevent_descriptor_obj, - STR_EVENT_STRING, description_str); - json_add_formatted_u32_str(pevent_descriptor_obj, - STR_EVENT_DATA_SIZE, pevent_descriptor->event_data_size); - - if (pevent_descriptor->debug_event_class_type >= 0x80) - json_add_formatted_var_size_str(pevent_descriptor_obj, - STR_VU_DATA, pevent_specific_data, data_size); - } else { - if (fp) { - fprintf(fp, "%s: 0x%x\n", STR_DBG_EVENT_CLASS_TYPE, - pevent_descriptor->debug_event_class_type); - fprintf(fp, "%s: 0x%x\n", STR_EVENT_IDENTIFIER, - pevent_descriptor->event_id); - fprintf(fp, "%s: %s\n", STR_EVENT_STRING, description_str); - fprintf(fp, "%s: 0x%x\n", STR_EVENT_DATA_SIZE, - pevent_descriptor->event_data_size); - } else { - printf("%s: 0x%x\n", STR_DBG_EVENT_CLASS_TYPE, - pevent_descriptor->debug_event_class_type); - printf("%s: 0x%x\n", STR_EVENT_IDENTIFIER, - pevent_descriptor->event_id); - printf("%s: %s\n", STR_EVENT_STRING, description_str); - printf("%s: 0x%x\n", STR_EVENT_DATA_SIZE, - pevent_descriptor->event_data_size); - } - - if (pevent_descriptor->debug_event_class_type >= 0x80) - print_formatted_var_size_str(STR_VU_DATA, - pevent_specific_data, data_size, fp); - } - - switch (pevent_descriptor->debug_event_class_type) { - case TIME_STAMP_CLASS_TYPE: - parse_time_stamp_event(pevent_descriptor, pevent_descriptor_obj, - pevent_specific_data, pevent_fifos_object, fp); - break; - case PCIE_CLASS_TYPE: - parse_pcie_event(pevent_descriptor, pevent_descriptor_obj, - pevent_specific_data, pevent_fifos_object, fp); - break; - case NVME_CLASS_TYPE: - parse_nvme_event(pevent_descriptor, pevent_descriptor_obj, - pevent_specific_data, pevent_fifos_object, fp); - break; - case RESET_CLASS_TYPE: - case BOOT_SEQUENCE_CLASS_TYPE: - case FIRMWARE_ASSERT_CLASS_TYPE: - case TEMPERATURE_CLASS_TYPE: - case MEDIA_CLASS_TYPE: - parse_common_event(pevent_descriptor, pevent_descriptor_obj, - pevent_specific_data, pevent_fifos_object, fp); - break; - case MEDIA_WEAR_CLASS_TYPE: - parse_media_wear_event(pevent_descriptor, pevent_descriptor_obj, - pevent_specific_data, pevent_fifos_object, fp); - break; - case STATISTIC_SNAPSHOT_CLASS_TYPE: { - struct nvme_ocp_statistic_snapshot_evt_class_format - *pStaticSnapshotEvent = - (struct nvme_ocp_statistic_snapshot_evt_class_format *) - pevent_specific_data; - struct nvme_ocp_telemetry_statistic_descriptor *pstatistic_entry = - (struct nvme_ocp_telemetry_statistic_descriptor *) - (&pStaticSnapshotEvent->statisticDescriptorData); - - parse_statistic(pstatistic_entry, pevent_descriptor_obj, fp); - break; - } - case RESERVED_CLASS_TYPE: - default: - break; - } - - if (pevent_descriptor_obj != NULL && pevent_fifo_array != NULL) - json_array_add_value_object(pevent_fifo_array, pevent_descriptor_obj); - else { - if (fp) - fprintf(fp, STR_LINE2); - else - printf(STR_LINE2); - } - } else - break; - - offset_to_move += (pevent_descriptor->event_data_size * SIZE_OF_DWORD + event_des_size); - } - - if (pevent_fifos_object != NULL && pevent_fifo_array != NULL) - json_object_add_value_array(pevent_fifos_object, event_fifo_name, - pevent_fifo_array); - - free(description); - return 0; -} - -int parse_event_fifos(struct json_object *root, struct nvme_ocp_telemetry_offsets *poffsets, - FILE *fp) -{ - if (poffsets == NULL) { - nvme_show_error("Input buffer was NULL"); - return -1; - } - - struct json_object *pevent_fifos_object = NULL; - - if (root != NULL) - pevent_fifos_object = json_create_object(); - - __u8 *pda1_header_offset = ptelemetry_buffer + poffsets->da1_start_offset;//512 - __u8 *pda2_offset = ptelemetry_buffer + poffsets->da2_start_offset; - struct nvme_ocp_header_in_da1 *pda1_header = (struct nvme_ocp_header_in_da1 *) - pda1_header_offset; - struct nvme_ocp_event_fifo_data event_fifo[MAX_NUM_FIFOS]; - - for (int fifo_num = 0; fifo_num < MAX_NUM_FIFOS; fifo_num++) { - event_fifo[fifo_num].event_fifo_num = fifo_num; - event_fifo[fifo_num].event_fifo_da = pda1_header->event_fifo_da[fifo_num]; - event_fifo[fifo_num].event_fifo_start = - pda1_header->fifo_offsets[fifo_num].event_fifo_start; - event_fifo[fifo_num].event_fifo_size = - pda1_header->fifo_offsets[fifo_num].event_fifo_size; - } - - //Parse all the FIFOs DA wise - for (int fifo_no = 0; fifo_no < MAX_NUM_FIFOS; fifo_no++) { - if (event_fifo[fifo_no].event_fifo_da == poffsets->data_area) { - __u64 fifo_offset = - (event_fifo[fifo_no].event_fifo_start * SIZE_OF_DWORD); - __u64 fifo_size = - (event_fifo[fifo_no].event_fifo_size * SIZE_OF_DWORD); - __u8 *pfifo_start = NULL; - - if (event_fifo[fifo_no].event_fifo_da == 1) - pfifo_start = pda1_header_offset + fifo_offset; - else if (event_fifo[fifo_no].event_fifo_da == 2) - pfifo_start = pda2_offset + fifo_offset; - else { - nvme_show_error("Unsupported Data Area:[%d]", poffsets->data_area); - return -1; - } - - int status = parse_event_fifo(fifo_no, pfifo_start, pevent_fifos_object, - pstring_buffer, poffsets, fifo_size, fp); - - if (status != 0) { - nvme_show_error("Failed to parse Event FIFO. status:%d\n", status); - return -1; - } - } - } - - if (pevent_fifos_object != NULL && root != NULL) { - const char *data_area = (poffsets->data_area == 1 ? STR_DA_1_EVENT_FIFO_INFO : - STR_DA_2_EVENT_FIFO_INFO); - - json_object_add_value_array(root, data_area, pevent_fifos_object); - } - - return 0; -} - -int parse_statistic(struct nvme_ocp_telemetry_statistic_descriptor *pstatistic_entry, - struct json_object *pstats_array, FILE *fp) -{ - if (pstatistic_entry == NULL) { - nvme_show_error("Input buffer was NULL"); - return -1; - } - - unsigned int data_size = pstatistic_entry->statistic_data_size * SIZE_OF_DWORD; - __u8 *pdata = (__u8 *)pstatistic_entry + - sizeof(struct nvme_ocp_telemetry_statistic_descriptor); - char description_str[256] = ""; - - parse_ocp_telemetry_string_log(0, pstatistic_entry->statistic_id, 0, - STATISTICS_IDENTIFIER_STRING, description_str); - - if (pstats_array != NULL) { - struct json_object *pstatistics_object = json_create_object(); - - json_add_formatted_u32_str(pstatistics_object, STR_STATISTICS_IDENTIFIER, - pstatistic_entry->statistic_id); - json_object_add_value_string(pstatistics_object, STR_STATISTICS_IDENTIFIER_STR, - description_str); - json_add_formatted_u32_str(pstatistics_object, - STR_STATISTICS_INFO_BEHAVIOUR_TYPE, - pstatistic_entry->statistic_info_behaviour_type); - json_add_formatted_u32_str(pstatistics_object, STR_STATISTICS_INFO_RESERVED, - pstatistic_entry->statistic_info_reserved); - json_add_formatted_u32_str(pstatistics_object, STR_NAMESPACE_IDENTIFIER, - pstatistic_entry->ns_info_nsid); - json_add_formatted_u32_str(pstatistics_object, STR_NAMESPACE_INFO_VALID, - pstatistic_entry->ns_info_ns_info_valid); - json_add_formatted_u32_str(pstatistics_object, STR_STATISTICS_DATA_SIZE, - pstatistic_entry->statistic_data_size); - json_add_formatted_u32_str(pstatistics_object, STR_RESERVED, - pstatistic_entry->reserved); - json_add_formatted_var_size_str(pstatistics_object, STR_STATISTICS_SPECIFIC_DATA, - pdata, data_size); - - if (pstatistics_object != NULL) - json_array_add_value_object(pstats_array, pstatistics_object); - } else { - if (fp) { - fprintf(fp, "%s: 0x%x\n", STR_STATISTICS_IDENTIFIER, - pstatistic_entry->statistic_id); - fprintf(fp, "%s: %s\n", STR_STATISTICS_IDENTIFIER_STR, description_str); - fprintf(fp, "%s: 0x%x\n", STR_STATISTICS_INFO_BEHAVIOUR_TYPE, - pstatistic_entry->statistic_info_behaviour_type); - fprintf(fp, "%s: 0x%x\n", STR_STATISTICS_INFO_RESERVED, - pstatistic_entry->statistic_info_reserved); - fprintf(fp, "%s: 0x%x\n", STR_NAMESPACE_IDENTIFIER, - pstatistic_entry->ns_info_nsid); - fprintf(fp, "%s: 0x%x\n", STR_NAMESPACE_INFO_VALID, - pstatistic_entry->ns_info_ns_info_valid); - fprintf(fp, "%s: 0x%x\n", STR_STATISTICS_DATA_SIZE, - pstatistic_entry->statistic_data_size); - fprintf(fp, "%s: 0x%x\n", STR_RESERVED, pstatistic_entry->reserved); - print_formatted_var_size_str(STR_STATISTICS_SPECIFIC_DATA, pdata, - data_size, fp); - fprintf(fp, STR_LINE2); - } else { - printf("%s: 0x%x\n", STR_STATISTICS_IDENTIFIER, - pstatistic_entry->statistic_id); - printf("%s: %s\n", STR_STATISTICS_IDENTIFIER_STR, description_str); - printf("%s: 0x%x\n", STR_STATISTICS_INFO_BEHAVIOUR_TYPE, - pstatistic_entry->statistic_info_behaviour_type); - printf("%s: 0x%x\n", STR_STATISTICS_INFO_RESERVED, - pstatistic_entry->statistic_info_reserved); - printf("%s: 0x%x\n", STR_NAMESPACE_IDENTIFIER, - pstatistic_entry->ns_info_nsid); - printf("%s: 0x%x\n", STR_NAMESPACE_INFO_VALID, - pstatistic_entry->ns_info_ns_info_valid); - printf("%s: 0x%x\n", STR_STATISTICS_DATA_SIZE, - pstatistic_entry->statistic_data_size); - printf("%s: 0x%x\n", STR_RESERVED, pstatistic_entry->reserved); - print_formatted_var_size_str(STR_STATISTICS_SPECIFIC_DATA, pdata, - data_size, fp); - printf(STR_LINE2); - } - } - - return 0; -} - -int parse_statistics(struct json_object *root, struct nvme_ocp_telemetry_offsets *poffsets, - FILE *fp) -{ - if (poffsets == NULL) { - nvme_show_error("Input buffer was NULL"); - return -1; - } - - __u8 *pda1_ocp_header_offset = ptelemetry_buffer + poffsets->header_size;//512 - __u32 statistics_size = 0; - __u32 stats_da_1_start_dw = 0, stats_da_1_size_dw = 0; - __u32 stats_da_2_start_dw = 0, stats_da_2_size_dw = 0; - __u8 *pstats_offset = NULL; - - if (poffsets->data_area == 1) { - __u32 stats_da_1_start = *(__u32 *)(pda1_ocp_header_offset + - offsetof(struct nvme_ocp_header_in_da1, da1_statistic_start)); - __u32 stats_da_1_size = *(__u32 *)(pda1_ocp_header_offset + - offsetof(struct nvme_ocp_header_in_da1, da1_statistic_size)); - - //Data is present in the form of DWORDS, So multiplying with sizeof(DWORD) - stats_da_1_start_dw = (stats_da_1_start * SIZE_OF_DWORD); - stats_da_1_size_dw = (stats_da_1_size * SIZE_OF_DWORD); - - pstats_offset = pda1_ocp_header_offset + stats_da_1_start_dw; - statistics_size = stats_da_1_size_dw; - } else if (poffsets->data_area == 2) { - __u32 stats_da_2_start = *(__u32 *)(pda1_ocp_header_offset + - offsetof(struct nvme_ocp_header_in_da1, da2_statistic_start)); - __u32 stats_da_2_size = *(__u32 *)(pda1_ocp_header_offset + - offsetof(struct nvme_ocp_header_in_da1, da2_statistic_size)); - - stats_da_2_start_dw = (stats_da_2_start * SIZE_OF_DWORD); - stats_da_2_size_dw = (stats_da_2_size * SIZE_OF_DWORD); - - pstats_offset = pda1_ocp_header_offset + poffsets->da1_size + stats_da_2_start_dw; - statistics_size = stats_da_2_size_dw; - } else { - nvme_show_error("Unsupported Data Area:[%d]", poffsets->data_area); - return -1; - } - - struct json_object *pstats_array = ((root != NULL) ? json_create_array() : NULL); - - __u32 stat_des_size = sizeof(struct nvme_ocp_telemetry_statistic_descriptor);//8 - __u32 offset_to_move = 0; - - while (((statistics_size > 0) && (offset_to_move < statistics_size))) { - struct nvme_ocp_telemetry_statistic_descriptor *pstatistic_entry = - (struct nvme_ocp_telemetry_statistic_descriptor *) - (pstats_offset + offset_to_move); - - parse_statistic(pstatistic_entry, pstats_array, fp); - offset_to_move += (pstatistic_entry->statistic_data_size * SIZE_OF_DWORD + - stat_des_size); - } - - if (root != NULL && pstats_array != NULL) { - const char *pdata_area = - (poffsets->data_area == 1 ? STR_DA_1_STATS : STR_DA_2_STATS); - - json_object_add_value_array(root, pdata_area, pstats_array); - } - - return 0; -} - -int print_ocp_telemetry_normal(char *output_file) -{ - int status = 0; - - if (output_file != NULL) { - FILE *fp = fopen(output_file, "w"); - - if (fp) { - fprintf(fp, STR_LINE); - fprintf(fp, "%s\n", STR_LOG_PAGE_HEADER); - fprintf(fp, STR_LINE); - print_micron_vs_logs(ptelemetry_buffer, host_log_page_header, - ARRAY_SIZE(host_log_page_header), NULL, 0, fp); - - fprintf(fp, STR_LINE); - fprintf(fp, "%s\n", STR_REASON_IDENTIFIER); - fprintf(fp, STR_LINE); - __u8 *preason_identifier_offset = ptelemetry_buffer + - offsetof(struct nvme_ocp_telemetry_host_initiated_header, - reason_id); - - print_micron_vs_logs(preason_identifier_offset, reason_identifier, - ARRAY_SIZE(reason_identifier), NULL, 0, fp); - - fprintf(fp, STR_LINE); - fprintf(fp, "%s\n", STR_TELEMETRY_HOST_DATA_BLOCK_1); - fprintf(fp, STR_LINE); - - //Set DA to 1 and get offsets - struct nvme_ocp_telemetry_offsets offsets = { 0 }; - - offsets.data_area = 1; - - struct nvme_ocp_telemetry_common_header *ptelemetry_common_header = - (struct nvme_ocp_telemetry_common_header *) ptelemetry_buffer; - - get_telemetry_das_offset_and_size(ptelemetry_common_header, &offsets); - - __u8 *pda1_header_offset = ptelemetry_buffer + - offsets.da1_start_offset;//512 - - print_micron_vs_logs(pda1_header_offset, ocp_header_in_da1, - ARRAY_SIZE(ocp_header_in_da1), NULL, 0, fp); - - fprintf(fp, STR_LINE); - fprintf(fp, "%s\n", STR_SMART_HEALTH_INFO); - fprintf(fp, STR_LINE); - __u8 *pda1_smart_offset = pda1_header_offset + - offsetof(struct nvme_ocp_header_in_da1, smart_health_info); - //512+512 =1024 - - print_micron_vs_logs(pda1_smart_offset, smart, ARRAY_SIZE(smart), - NULL, 0, fp); - - fprintf(fp, STR_LINE); - fprintf(fp, "%s\n", STR_SMART_HEALTH_INTO_EXTENDED); - fprintf(fp, STR_LINE); - __u8 *pda1_smart_ext_offset = pda1_header_offset + - offsetof(struct nvme_ocp_header_in_da1, - smart_health_info_extended); - - print_micron_vs_logs(pda1_smart_ext_offset, smart_extended, - ARRAY_SIZE(smart_extended), NULL, 0, fp); - - fprintf(fp, STR_LINE); - fprintf(fp, "%s\n", STR_DA_1_STATS); - fprintf(fp, STR_LINE); - - status = parse_statistics(NULL, &offsets, fp); - if (status != 0) { - nvme_show_error("status: %d\n", status); - return -1; - } - - fprintf(fp, STR_LINE); - fprintf(fp, "%s\n", STR_DA_1_EVENT_FIFO_INFO); - fprintf(fp, STR_LINE); - status = parse_event_fifos(NULL, &offsets, fp); - if (status != 0) { - nvme_show_error("status: %d\n", status); - return -1; - } - - //Set the DA to 2 - offsets.data_area = 2; - - fprintf(fp, STR_LINE); - fprintf(fp, "%s\n", STR_DA_2_STATS); - fprintf(fp, STR_LINE); - status = parse_statistics(NULL, &offsets, fp); - - if (status != 0) { - nvme_show_error("status: %d\n", status); - return -1; - } - - fprintf(fp, STR_LINE); - fprintf(fp, "%s\n", STR_DA_2_EVENT_FIFO_INFO); - fprintf(fp, STR_LINE); - status = parse_event_fifos(NULL, &offsets, fp); - if (status != 0) { - nvme_show_error("status: %d\n", status); - return -1; - } - - fprintf(fp, STR_LINE); - - fclose(fp); - } else { - nvme_show_error("Failed to open %s file.\n", output_file); - return -1; - } - } else { - printf(STR_LINE); - printf("%s\n", STR_LOG_PAGE_HEADER); - printf(STR_LINE); - print_micron_vs_logs(ptelemetry_buffer, host_log_page_header, - ARRAY_SIZE(host_log_page_header), NULL, 0, NULL); - - printf(STR_LINE); - printf("%s\n", STR_REASON_IDENTIFIER); - printf(STR_LINE); - __u8 *preason_identifier_offset = ptelemetry_buffer + - offsetof(struct nvme_ocp_telemetry_host_initiated_header, reason_id); - print_micron_vs_logs(preason_identifier_offset, reason_identifier, - ARRAY_SIZE(reason_identifier), NULL, 0, NULL); - - printf(STR_LINE); - printf("%s\n", STR_TELEMETRY_HOST_DATA_BLOCK_1); - printf(STR_LINE); - - //Set DA to 1 and get offsets - struct nvme_ocp_telemetry_offsets offsets = { 0 }; - - offsets.data_area = 1; - - struct nvme_ocp_telemetry_common_header *ptelemetry_common_header = - (struct nvme_ocp_telemetry_common_header *) ptelemetry_buffer; - - get_telemetry_das_offset_and_size(ptelemetry_common_header, &offsets); - - __u8 *pda1_header_offset = ptelemetry_buffer + offsets.da1_start_offset;//512 - - print_micron_vs_logs(pda1_header_offset, ocp_header_in_da1, - ARRAY_SIZE(ocp_header_in_da1), NULL, 0, NULL); - - printf(STR_LINE); - printf("%s\n", STR_SMART_HEALTH_INFO); - printf(STR_LINE); - __u8 *pda1_smart_offset = pda1_header_offset + - offsetof(struct nvme_ocp_header_in_da1, smart_health_info); - - print_micron_vs_logs(pda1_smart_offset, smart, ARRAY_SIZE(smart), NULL, 0, NULL); - - printf(STR_LINE); - printf("%s\n", STR_SMART_HEALTH_INTO_EXTENDED); - printf(STR_LINE); - __u8 *pda1_smart_ext_offset = pda1_header_offset + - offsetof(struct nvme_ocp_header_in_da1, smart_health_info_extended); - - print_micron_vs_logs(pda1_smart_ext_offset, smart_extended, - ARRAY_SIZE(smart_extended), NULL, 0, NULL); - - printf(STR_LINE); - printf("%s\n", STR_DA_1_STATS); - printf(STR_LINE); - status = parse_statistics(NULL, &offsets, NULL); - if (status != 0) { - nvme_show_error("status: %d\n", status); - return -1; - } - - printf(STR_LINE); - printf("%s\n", STR_DA_1_EVENT_FIFO_INFO); - printf(STR_LINE); - status = parse_event_fifos(NULL, &offsets, NULL); - if (status != 0) { - nvme_show_error("status: %d\n", status); - return -1; - } - - //Set the DA to 2 - offsets.data_area = 2; - - printf(STR_LINE); - printf("%s\n", STR_DA_2_STATS); - printf(STR_LINE); - status = parse_statistics(NULL, &offsets, NULL); - if (status != 0) { - nvme_show_error("status: %d\n", status); - return -1; - } - - printf(STR_LINE); - printf("%s\n", STR_DA_2_EVENT_FIFO_INFO); - printf(STR_LINE); - status = parse_event_fifos(NULL, &offsets, NULL); - if (status != 0) { - nvme_show_error("status: %d\n", status); - return -1; - } - - printf(STR_LINE); - } - - return status; -} - -int print_ocp_telemetry_json(char *output_file) -{ - int status = 0; - - //create json objects - struct json_object *root, *pheader, *preason_identifier, *da1_header, *smart_obj, - *ext_smart_obj; - - root = json_create_object(); - - //Add data to root json object - - //"Log Page Header" - pheader = json_create_object(); - - print_micron_vs_logs(ptelemetry_buffer, host_log_page_header, - ARRAY_SIZE(host_log_page_header), pheader, 0, NULL); - json_object_add_value_object(root, STR_LOG_PAGE_HEADER, pheader); - - //"Reason Identifier" - preason_identifier = json_create_object(); - - __u8 *preason_identifier_offset = ptelemetry_buffer + - offsetof(struct nvme_ocp_telemetry_host_initiated_header, reason_id); - - print_micron_vs_logs(preason_identifier_offset, reason_identifier, - ARRAY_SIZE(reason_identifier), preason_identifier, 0, NULL); - json_object_add_value_object(pheader, STR_REASON_IDENTIFIER, preason_identifier); - - struct nvme_ocp_telemetry_offsets offsets = { 0 }; - - //Set DA to 1 and get offsets - offsets.data_area = 1; - struct nvme_ocp_telemetry_common_header *ptelemetry_common_header = - (struct nvme_ocp_telemetry_common_header *) ptelemetry_buffer; - - get_telemetry_das_offset_and_size(ptelemetry_common_header, &offsets); - - //"Telemetry Host-Initiated Data Block 1" - __u8 *pda1_header_offset = ptelemetry_buffer + offsets.da1_start_offset;//512 - - da1_header = json_create_object(); - - print_micron_vs_logs(pda1_header_offset, ocp_header_in_da1, ARRAY_SIZE(ocp_header_in_da1), - da1_header, 0, NULL); - json_object_add_value_object(root, STR_TELEMETRY_HOST_DATA_BLOCK_1, da1_header); - - //"SMART / Health Information Log(LID-02h)" - __u8 *pda1_smart_offset = pda1_header_offset + offsetof(struct nvme_ocp_header_in_da1, - smart_health_info); - smart_obj = json_create_object(); - - print_micron_vs_logs(pda1_smart_offset, smart, ARRAY_SIZE(smart), smart_obj, 0, NULL); - json_object_add_value_object(da1_header, STR_SMART_HEALTH_INFO, smart_obj); - - //"SMART / Health Information Extended(LID-C0h)" - __u8 *pda1_smart_ext_offset = pda1_header_offset + offsetof(struct nvme_ocp_header_in_da1, - smart_health_info_extended); - ext_smart_obj = json_create_object(); - - print_micron_vs_logs(pda1_smart_ext_offset, smart_extended, ARRAY_SIZE(smart_extended), - ext_smart_obj, 0, NULL); - json_object_add_value_object(da1_header, STR_SMART_HEALTH_INTO_EXTENDED, ext_smart_obj); - - //Data Area 1 Statistics - status = parse_statistics(root, &offsets, NULL); - if (status != 0) { - nvme_show_error("status: %d\n", status); - return -1; - } - - //Data Area 1 Event FIFOs - status = parse_event_fifos(root, &offsets, NULL); - if (status != 0) { - nvme_show_error("status: %d\n", status, NULL); - return -1; - } - - //Set the DA to 2 - offsets.data_area = 2; - - //Data Area 2 Statistics - status = parse_statistics(root, &offsets, NULL); - if (status != 0) { - nvme_show_error("status: %d\n", status); - return -1; - } - - //Data Area 2 Event FIFOs - status = parse_event_fifos(root, &offsets, NULL); - if (status != 0) { - nvme_show_error("status: %d\n", status); - return -1; - } - - if (output_file != NULL) { - const char *json_string = json_object_to_json_string(root); - FILE *fp = fopen(output_file, "w"); - - if (fp) { - fputs(json_string, fp); - fclose(fp); - } else { - nvme_show_error("Failed to open %s file.\n", output_file); - return -1; - } - } else { - //Print root json object - json_print_object(root, NULL); - nvme_show_result("\n"); - json_free_object(root); - } - - return status; -} - -int parse_ocp_telemetry_log(struct ocp_telemetry_parse_options *options) -{ - int status = 0; - long telemetry_buffer_size = 0; - long string_buffer_size = 0; - enum nvme_print_flags fmt; - unsigned char log_id; - - // Read the data from the telemetry binary file - ptelemetry_buffer = - read_binary_file(NULL, options->telemetry_log, &telemetry_buffer_size, 1); - if (ptelemetry_buffer == NULL) { - nvme_show_error("Failed to read telemetry bin file.\n"); - return -1; - } - - log_id = ptelemetry_buffer[0]; - if ((log_id != NVME_HOST_TELEMETRY_LOG) && (log_id != NVME_CNTRL_TELEMETRY_LOG)) { - nvme_show_error("Invalid LogPageId [0x%02X]\n", log_id); - return -1; - } - - // Read the data from the string binary file - pstring_buffer = read_binary_file(NULL, options->string_log, &string_buffer_size, 1); - if (pstring_buffer == NULL) { - nvme_show_error("Failed to read string log bin file.\n"); - return -1; - } - - status = validate_output_format(options->output_fmt, &fmt); - if (status < 0) { - nvme_show_error("Invalid output format\n"); - return status; - } - - switch (fmt) { - case NORMAL: - print_ocp_telemetry_normal(options->output_file); - break; - case JSON: - print_ocp_telemetry_json(options->output_file); - break; - default: - break; - } - - return 0; -} diff --git a/plugins/micron/micron-ocp-telemetry.h b/plugins/micron/micron-ocp-telemetry.h deleted file mode 100644 index 96eefa9b15..0000000000 --- a/plugins/micron/micron-ocp-telemetry.h +++ /dev/null @@ -1,609 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-or-later -/* - * Copyright (c) Micron, Inc 2024. - * - * @file: micron-ocp-telemetry.h - * @brief: This module contains all the constructs needed for parsing - * (or) decoding ocp telemetry log files. - * @author: Chaithanya Shoba - */ - -#include "nvme.h" -#include "nvme-print.h" -#include "micron-utils.h" -#include "common.h" - -#define DATA_SIZE_12 12 -#define DATA_SIZE_8 8 -#define DATA_SIZE_4 4 -#define NVME_HOST_TELEMETRY_LOG 0x07 -#define NVME_CNTRL_TELEMETRY_LOG 0x08 -#define MAX_BUFFER_32_KB 0x8000 -#define OCP_TELEMETRY_DATA_BLOCK_SIZE 512 -#define SIZE_OF_DWORD 4 -#define MAX_NUM_FIFOS 16 -#define DA1_OFFSET 512 -#define DEFAULT_ASCII_STRING_SIZE 16 - -#define STR_LOG_PAGE_HEADER "Log Page Header" -#define STR_REASON_IDENTIFIER "Reason Identifier" -#define STR_TELEMETRY_HOST_DATA_BLOCK_1 "Telemetry Host-Initiated Data Block 1" -#define STR_SMART_HEALTH_INFO "SMART / Health Information Log(LID-02h)" -#define STR_SMART_HEALTH_INTO_EXTENDED "SMART / Health Information Extended(LID-C0h)" -#define STR_DA_1_STATS "Data Area 1 Statistics" -#define STR_DA_2_STATS "Data Area 2 Statistics" -#define STR_DA_1_EVENT_FIFO_INFO "Data Area 1 Event FIFO info" -#define STR_DA_2_EVENT_FIFO_INFO "Data Area 2 Event FIFO info" -#define STR_STATISTICS_IDENTIFIER "Statistics Identifier" -#define STR_STATISTICS_IDENTIFIER_STR "Statistic Identifier String" -#define STR_STATISTICS_INFO_BEHAVIOUR_TYPE "Statistics Info Behavior Type" -#define STR_STATISTICS_INFO_RESERVED "Statistics Info Reserved" -#define STR_NAMESPACE_IDENTIFIER "Namespace Identifier" -#define STR_NAMESPACE_INFO_VALID "Namespace Information Valid" -#define STR_STATISTICS_DATA_SIZE "Statistic Data Size" -#define STR_RESERVED "Reserved" -#define STR_STATISTICS_SPECIFIC_DATA "Statistic Specific Data" -#define STR_CLASS_SPECIFIC_DATA "Class Specific Data" -#define STR_DBG_EVENT_CLASS_TYPE "Debug Event Class type" -#define STR_EVENT_IDENTIFIER "Event Identifier" -#define STR_EVENT_STRING "Event String" -#define STR_EVENT_DATA_SIZE "Event Data Size" -#define STR_VU_EVENT_STRING "VU Event String" -#define STR_VU_EVENT_ID_STRING "VU Event Identifier" -#define STR_VU_DATA "VU Data" -#define STR_LINE "==============================================================================\n" -#define STR_LINE2 "-----------------------------------------------------------------------------\n" - -struct __packed nvme_ocp_telemetry_reason_id -{ - __u8 error_id[64]; // Bytes 63:00 - __u8 file_id[8]; // Bytes 71:64 - __le16 line_number; // Bytes 73:72 - __u8 valid_flags; // Bytes 74 - __u8 reserved[21]; // Bytes 95:75 - __u8 vu_reason_ext[32]; // Bytes 127:96 -}; - -struct __packed nvme_ocp_telemetry_common_header -{ - __u8 log_id; // Byte 00 - __le32 reserved1; // Bytes 04:01 - __u8 ieee_oui_id[3]; // Bytes 07:05 - __le16 da1_last_block; // Bytes 09:08 - __le16 da2_last_block; // Bytes 11:10 - __le16 da3_last_block; // Bytes 13:12 - __le16 reserved2; // Bytes 15:14 - __le32 da4_last_block; // Bytes 19:16 -}; - -struct __packed nvme_ocp_telemetry_host_initiated_header -{ - struct nvme_ocp_telemetry_common_header commonHeader; // Bytes 19:00 - __u8 reserved3[360]; // Bytes 379:20 - __u8 host_initiated_scope; // Byte 380 - __u8 host_initiated_gen_number; // Byte 381 - __u8 host_initiated_data_available; // Byte 382 - __u8 ctrl_initiated_gen_number; // Byte 383 - struct nvme_ocp_telemetry_reason_id reason_id; // Bytes 511:384 -}; - -struct __packed nvme_ocp_telemetry_controller_initiated_header -{ - struct nvme_ocp_telemetry_common_header commonHeader; // Bytes 19:00 - __u8 reserved3[361]; // Bytes 380:20 - __u8 ctrl_initiated_scope; // Byte 381 - __u8 ctrl_initiated_data_available; // Byte 382 - __u8 ctrl_initiated_gen_number; // Byte 383 - struct nvme_ocp_telemetry_reason_id reason_id; // Bytes 511:384 -}; - -struct __packed nvme_ocp_telemetry_smart -{ - __u8 critical_warning; // Byte 0 - __le16 composite_temperature; // Bytes 2:1 - __u8 available_spare; // Bytes 3 - __u8 available_spare_threshold; // Bytes 4 - __u8 percentage_used; // Bytes 5 - __u8 reserved1[26]; // Bytes 31:6 - __u8 data_units_read[16]; // Bytes 47:32 - __u8 data_units_written[16]; // Bytes 63:48 - __u8 host_read_commands[16]; // Byte 79:64 - __u8 host_write_commands[16]; // Bytes 95:80 - __u8 controller_busy_time[16]; // Bytes 111:96 - __u8 power_cycles[16]; // Bytes 127:112 - __u8 power_on_hours[16]; // Bytes 143:128 - __u8 unsafe_shutdowns[16]; // Bytes 159:144 - __u8 media_and_data_integrity_errors[16]; // Bytes 175:160 - __u8 number_of_error_information_log_entries[16]; // Bytes 191:176 - __le32 warning_composite_temperature_time; // Byte 195:192 - __le32 critical_composite_temperature_time; // Bytes 199:196 - __le16 temperature_sensor1; // Bytes 201:200 - __le16 temperature_sensor2; // Byte 203:202 - __le16 temperature_sensor3; // Byte 205:204 - __le16 temperature_sensor4; // Bytes 207:206 - __le16 temperature_sensor5; // Bytes 209:208 - __le16 temperature_sensor6; // Bytes 211:210 - __le16 temperature_sensor7; // Bytes 213:212 - __le16 temperature_sensor8; // Bytes 215:214 - __le32 thermal_management_temperature1_transition_count; // Bytes 219:216 - __le32 thermal_management_temperature2_transition_count; // Bytes 223:220 - __le32 total_time_for_thermal_management_temperature1; // Bytes 227:224 - __le32 total_time_for_thermal_management_temperature2; // Bytes 231:228 - __u8 reserved2[280]; // Bytes 511:232 -}; - -struct __packed nvme_ocp_telemetry_smart_extended -{ - __u8 physical_media_units_written[16]; // Bytes 15:0 - __u8 physical_media_units_read[16]; // Bytes 31:16 - __u8 bad_user_nand_blocks_raw_count[6]; // Bytes 37:32 - __le16 bad_user_nand_blocks_normalized_value; // Bytes 39:38 - __u8 bad_system_nand_blocks_raw_count[6]; // Bytes 45:40 - __le16 bad_system_nand_blocks_normalized_value; // Bytes 47:46 - __le64 xor_recovery_count; // Bytes 55:48 - __le64 uncorrectable_read_error_count; // Bytes 63:56 - __le64 soft_ecc_error_count; // Bytes 71:64 - __le32 end_to_end_correction_counts_detected_errors; // Bytes 75:72 - __le32 end_to_end_correction_counts_corrected_errors; // Bytes 79:76 - __u8 system_data_percent_used; // Byte 80 - __u8 refresh_counts[7]; // Bytes 87:81 - __le32 max_user_data_erase_count; // Bytes 91:88 - __le32 min_user_data_erase_count; // Bytes 95:92 - __u8 num_thermal_throttling_events; // Bytes 96 - __u8 current_throttling_status; // Bytes 97 - __u8 errata_version_field; // Byte 98 - __le16 point_version_field; // Byte 100:99 - __le16 minor_version_field; // Byte 102:101 - __u8 major_version_field; // Byte 103 - __le64 pcie_correctable_error_count; // Bytes 111:104 - __le32 incomplete_shutdowns; // Bytes 115:112 - __le32 reserved1; // Bytes 119:116 - __u8 percent_free_blocks; // Byte 120 - __u8 reserved2[7]; // Bytes 127:121 - __le16 capacitor_health; // Bytes 129:128 - __u8 nvme_base_errata_version; // Byte 130 - __u8 nvme_command_set_errata_version; // Byte 131 - __le32 reserved3; // Bytes 135:132 - __le64 unaligned_io; // Bytes 143:136 - __le64 security_version_number; // Bytes 151:144 - __le64 total_nuse; // Bytes 159:152 - __u8 plp_start_count[16]; // Bytes 175:160 - __u8 endurance_estimate[16]; // Bytes 191:176 - __le64 pcie_link_retraining_count; // Bytes 199:192 - __le64 power_state_change_count; // Bytes 207:200 - __le64 lowest_permitted_firmware_revision; // Bytes 215:208 - __u8 reserved4[278]; // Bytes 493:216 - __le16 log_page_version; // Bytes 495:494 - __u8 log_page_guid[16]; // Bytes 511:496 -}; - -struct __packed nvme_ocp_event_fifo_data -{ - __le32 event_fifo_num; - __u8 event_fifo_da; - __le64 event_fifo_start; - __le64 event_fifo_size; -}; - -struct __packed nvme_ocp_telemetry_offsets -{ - __le32 data_area; - __le32 header_size; - __le32 da1_start_offset; - __le32 da1_size; - __le32 da2_start_offset; - __le32 da2_size; - __le32 da3_start_offset; - __le32 da3_size; - __le32 da4_start_offset; - __le32 da4_size; -}; - -struct __packed nvme_ocp_event_fifo_offsets -{ - __le64 event_fifo_start; - __le64 event_fifo_size; -}; - -struct __packed nvme_ocp_header_in_da1 -{ - __le16 major_version; // Bytes 1:0 - __le16 minor_version; // Bytes 3:2 - __le32 reserved1; // Bytes 7:4 - __le64 time_stamp; // Bytes 15:8 - __u8 log_page_guid[16]; // Bytes 31:16 - __u8 num_telemetry_profiles_supported; // Byte 32 - __u8 telemetry_profile_selected; // Byte 33 - __u8 reserved2[6]; // Bytes 39:34 - __le64 string_log_size; // Bytes 47:40 - __le64 reserved3; // Bytes 55:48 - __le64 firmware_revision; // Bytes 63:56 - __u8 reserved4[32]; // Bytes 95:64 - __le64 da1_statistic_start; // Bytes 103:96 - __le64 da1_statistic_size; // Bytes 111:104 - __le64 da2_statistic_start; // Bytes 119:112 - __le64 da2_statistic_size; // Bytes 127:120 - __u8 reserved5[32]; // Bytes 159:128 - __u8 event_fifo_da[16]; // Bytes 175:160 - struct nvme_ocp_event_fifo_offsets fifo_offsets[16]; // Bytes 431:176 - __u8 reserved6[80]; // Bytes 511:432 - struct nvme_ocp_telemetry_smart smart_health_info; // Bytes 1023:512 - struct nvme_ocp_telemetry_smart_extended smart_health_info_extended; // Bytes 1535:1024 -}; - -struct __packed nvme_ocp_telemetry_statistic_descriptor -{ - __le16 statistic_id; // Bytes 1:0 - __u8 statistic_info_behaviour_type : 4; // Byte 2(3:0) - __u8 statistic_info_reserved : 4; // Byte 2(7:4) - __u8 ns_info_nsid : 7; // Bytes 3(6:0) - __u8 ns_info_ns_info_valid : 1; // Bytes 3(7) - __le16 statistic_data_size; // Bytes 5:4 - __le16 reserved; // Bytes 7:6 -}; - -struct __packed nvme_ocp_telemetry_event_descriptor -{ - __u8 debug_event_class_type; // Byte 0 - __le16 event_id; // Bytes 2:1 - __u8 event_data_size; // Byte 3 -}; - -struct __packed nvme_ocp_time_stamp_dbg_evt_class_format -{ - __u8 time_stamp[DATA_SIZE_8]; // Bytes 11:4 - __le16 vu_event_identifier; // Bytes 13:12 -}; - -struct __packed nvme_ocp_pcie_dbg_evt_class_format -{ - __u8 pCIeDebugEventData[DATA_SIZE_4]; // Bytes 7:4 - __le16 vu_event_identifier; // Bytes 9:8 -}; - -struct __packed nvme_ocp_nvme_dbg_evt_class_format -{ - __u8 nvmeDebugEventData[DATA_SIZE_8]; // Bytes 11:4 - __le16 vu_event_identifier; // Bytes 13:12 -}; - -struct __packed nvme_ocp_common_dbg_evt_class_format -{ - __le16 vu_event_identifier; // Bytes 5:4 -}; - -struct __packed nvme_ocp_media_wear_dbg_evt_class_format -{ - __u8 currentMediaWear[DATA_SIZE_12]; // Bytes 15:4 - __le16 vu_event_identifier; // Bytes 17:16 -}; - -struct __packed nvme_ocp_statistic_snapshot_evt_class_format -{ - struct nvme_ocp_telemetry_statistic_descriptor statisticDescriptorData; // Bytes 11:10 -}; - -struct __packed nvme_ocp_statistics_identifier_string_table -{ - __le16 vs_statistic_identifier; //1:0 - __u8 reserved1; //2 - __u8 ascii_id_length; //3 - __le64 ascii_id_offset; //11:4 - __le32 reserved2; //15:12 -}; - -struct __packed nvme_ocp_event_string_table -{ - __u8 debug_event_class; //0 - __le16 event_identifier; //2:1 - __u8 ascii_id_length; //3 - __le64 ascii_id_offset; //11:4 - __le32 reserved; //15:12 -}; - -struct __packed nvme_ocp_vu_event_string_table -{ - __u8 debug_event_class; //0 - __le16 vu_event_identifier; //2:1 - __u8 ascii_id_length; //3 - __le64 ascii_id_offset; //11:4 - __le32 reserved; //15:12 -}; - -struct __packed nvme_ocp_telemetry_string_header -{ - __u8 version; //0:0 - __u8 reserved1[15]; //15:1 - __u8 guid[16]; //32:16 - __le64 string_log_size; //39:32 - __u8 reserved2[24]; //63:40 - __le64 sits; //71:64 Statistics Identifier String Table Start(SITS) - __le64 sitsz; //79:72 Statistics Identifier String Table Size (SITSZ) - __le64 ests; //87:80 Event String Table Start(ESTS) - __le64 estsz; //95:88 Event String Table Size(ESTSZ) - __le64 vu_ests; //103:96 VU Event String Table Start - __le64 vu_estsz; //111:104 VU Event String Table Size - __le64 ascts; //119:112 ASCII Table start - __le64 asctsz; //127:120 ASCII Table Size - __u8 fifo_ascii_string[16][16]; //383:128 - __u8 reserved3[48]; //431:384 -}; - -struct __packed statistic_entry { - int identifier; - char *description; -}; - -struct __packed ocp_telemetry_parse_options { - char *telemetry_log; - char *string_log; - char *output_file; - char *output_fmt; -}; - -/** - * enum ocp_telemetry_data_area - Telemetry Data Areas - * @DATA_AREA_1: Data Area 1 - * @DATA_AREA_2: Data Area 2 - * @DATA_AREA_3: Data Area 3 - * @DATA_AREA_4: Data Area 4 - */ -enum ocp_telemetry_data_area { - DATA_AREA_1 = 0x01, - DATA_AREA_2 = 0x02, - DATA_AREA_3 = 0x03, - DATA_AREA_4 = 0x04, -}; - -/** - * enum ocp_telemetry_string_tables - OCP telemetry string tables - * @STATISTICS_IDENTIFIER_STRING: Statistic Identifier string - * @EVENT_STRING: Event String - * @VU_EVENT_STRING: VU Event String - */ -enum ocp_telemetry_string_tables { - STATISTICS_IDENTIFIER_STRING = 0, - EVENT_STRING, - VU_EVENT_STRING -}; - -/** - * enum ocp_telemetry_debug_event_class_types - OCP Debug Event Class types - * @RESERVED_CLASS_TYPE: Reserved class - * @TIME_STAMP_CLASS_TYPE: Time stamp class - * @PCIE_CLASS_TYPE: PCIe class - * @NVME_CLASS_TYPE: NVME class - * @RESET_CLASS_TYPE: Reset class - * @BOOT_SEQUENCE_CLASS_TYPE: Boot Sequence class - * @FIRMWARE_ASSERT_CLASS_TYPE: Firmware Assert class - * @TEMPERATURE_CLASS_TYPE: Temperature class - * @MEDIA_CLASS_TYPE: Media class - * @MEDIA_WEAR_CLASS_TYPE: Media wear class - * @STATISTIC_SNAPSHOT_CLASS_TYPE: Statistic snapshot class - * @RESERVED: Reserved class - * @VENDOR_UNIQUE_CLASS_TYPE: Vendor Unique class - */ -enum ocp_telemetry_debug_event_class_types { - RESERVED_CLASS_TYPE = 0x00, - TIME_STAMP_CLASS_TYPE = 0x01, - PCIE_CLASS_TYPE = 0x02, - NVME_CLASS_TYPE = 0x03, - RESET_CLASS_TYPE = 0x04, - BOOT_SEQUENCE_CLASS_TYPE = 0x05, - FIRMWARE_ASSERT_CLASS_TYPE = 0x06, - TEMPERATURE_CLASS_TYPE = 0x07, - MEDIA_CLASS_TYPE = 0x08, - MEDIA_WEAR_CLASS_TYPE = 0x09, - STATISTIC_SNAPSHOT_CLASS_TYPE = 0x0A, - //RESERVED = 7Fh-0Bh, - //VENDOR_UNIQUE_CLASS_TYPE = FFh-80h, -}; - -/** - * @brief parse the ocp telemetry host or controller log binary file - * into json or text - * - * @param options, input pointer for inputs like telemetry log bin file, - * string log bin file and output file etc. - * - * @return 0 success - */ -int parse_ocp_telemetry_log(struct ocp_telemetry_parse_options *options); - -/** - * @brief parse the ocp telemetry string log binary file to json or text - * - * @param event_fifo_num, input event FIFO number - * @param debug_event_class, input debug event class id - * @param string_table, input string table - * @param description, input description string - * - * @return 0 success - */ -int parse_ocp_telemetry_string_log(int event_fifo_num, int identifier, int debug_event_class, - enum ocp_telemetry_string_tables string_table, char *description); - -/** - * @brief gets the telemetry datas areas, offsets and sizes information - * - * @param ptelemetry_common_header, input telemetry common header pointer - * @param ptelemetry_das_offset, input telemetry offsets pointer - * - * @return 0 success - */ -int get_telemetry_das_offset_and_size( - struct nvme_ocp_telemetry_common_header *ptelemetry_common_header, - struct nvme_ocp_telemetry_offsets *ptelemetry_das_offset); - -/** - * @brief parses statistics data to text or json formats - * - * @param root, input time json root object pointer - * @param ptelemetry_das_offset, input telemetry offsets pointer - * @param fp, input file pointer - * - * @return 0 success - */ -int parse_statistics(struct json_object *root, struct nvme_ocp_telemetry_offsets *pOffsets, - FILE *fp); - -/** - * @brief parses a single statistic data to text or json formats - * - * @param pstatistic_entry, statistic entry pointer - * @param pstats_array, stats array pointer - * @param fp, input file pointer - * - * @return 0 success - */ -int parse_statistic(struct nvme_ocp_telemetry_statistic_descriptor *pstatistic_entry, - struct json_object *pstats_array, FILE *fp); - -/** - * @brief parses event fifos data to text or json formats - * - * @param root, input time json root object pointer - * @param poffsets, input telemetry offsets pointer - * @param fp, input file pointer - * - * @return 0 success - */ -int parse_event_fifos(struct json_object *root, struct nvme_ocp_telemetry_offsets *poffsets, - FILE *fp); - -/** - * @brief parses a single event fifo data to text or json formats - * - * @param fifo_num, input event fifo number - * @param pfifo_start, event fifo start pointer - * @param pevent_fifos_object, event fifos json object pointer - * @param ptelemetry_das_offset, input telemetry offsets pointer - * @param fifo_size, input event fifo size - * @param fp, input file pointer - * - * @return 0 success - */ -int parse_event_fifo(unsigned int fifo_num, unsigned char *pfifo_start, - struct json_object *pevent_fifos_object, unsigned char *pstring_buffer, - struct nvme_ocp_telemetry_offsets *poffsets, __u64 fifo_size, FILE *fp); - -/** - * @brief parses event fifos data to text or json formats - * - * @return 0 success - */ -int print_ocp_telemetry_normal(char *output_file); - -/** - * @brief parses event fifos data to text or json formats - * - * @return 0 success - */ -int print_ocp_telemetry_json(char *output_file); - -/** - * @brief gets statistic id ascii string - * - * @param identifier, string id - * @param description, string description - * - * @return 0 success - */ -int get_static_id_ascii_string(int identifier, char *description); - -/** - * @brief gets event id ascii string - * - * @param identifier, string id - * @param debug_event_class, debug event class - * @param description, string description - * - * @return 0 success - */ -int get_event_id_ascii_string(int identifier, int debug_event_class, char *description); - -/** - * @brief gets vu event id ascii string - * - * @param identifier, string id - * @param debug_event_class, debug event class - * @param description, string description - * - * @return 0 success - */ -int get_vu_event_id_ascii_string(int identifier, int debug_event_class, char *description); - -/** - * @brief parses a time-stamp event fifo data to text or json formats - * - * @param pevent_descriptor, input event descriptor data - * @param pevent_descriptor_obj, event descriptor json object pointer - * @param pevent_specific_data, input event specific data - * @param pevent_fifos_object, event fifos json object pointer - * @param fp, input file pointer - * - * @return - */ -void parse_time_stamp_event(struct nvme_ocp_telemetry_event_descriptor *pevent_descriptor, - struct json_object *pevent_descriptor_obj, __u8 *pevent_specific_data, - struct json_object *pevent_fifos_object, FILE *fp); - -/** - * @brief parses a pcie event fifo data to text or json formats - * - * @param pevent_descriptor, input event descriptor data - * @param pevent_descriptor_obj, event descriptor json object pointer - * @param pevent_specific_data, input event specific data - * @param pevent_fifos_object, event fifos json object pointer - * @param fp, input file pointer - * - * @return - */ -void parse_pcie_event(struct nvme_ocp_telemetry_event_descriptor *pevent_descriptor, - struct json_object *pevent_descriptor_obj, __u8 *pevent_specific_data, - struct json_object *pevent_fifos_object, FILE *fp); - -/** - * @brief parses a nvme event fifo data to text or json formats - * - * @param pevent_descriptor, input event descriptor data - * @param pevent_descriptor_obj, event descriptor json object pointer - * @param pevent_specific_data, input event specific data - * @param pevent_fifos_object, event fifos json object pointer - * @param fp, input file pointer - * - * @return - */ -void parse_nvme_event(struct nvme_ocp_telemetry_event_descriptor *pevent_descriptor, - struct json_object *pevent_descriptor_obj, __u8 *pevent_specific_data, - struct json_object *pevent_fifos_object, FILE *fp); - -/** - * @brief parses common event fifo data to text or json formats - * - * @param pevent_descriptor, input event descriptor data - * @param pevent_descriptor_obj, event descriptor json object pointer - * @param pevent_specific_data, input event specific data - * @param pevent_fifos_object, event fifos json object pointer - * @param fp, input file pointer - * - * @return - */ -void parse_common_event(struct nvme_ocp_telemetry_event_descriptor *pevent_descriptor, - struct json_object *pevent_descriptor_obj, __u8 *pevent_specific_data, - struct json_object *pevent_fifos_object, FILE *fp); - -/** - * @brief parses a media-wear event fifo data to text or json formats - * - * @param pevent_descriptor, input event descriptor data - * @param pevent_descriptor_obj, event descriptor json object pointer - * @param pevent_specific_data, input event specific data - * @param pevent_fifos_object, event fifos json object pointer - * @param fp, input file pointer - * - * @return - */ -void parse_media_wear_event(struct nvme_ocp_telemetry_event_descriptor *pevent_descriptor, - struct json_object *pevent_descriptor_obj, __u8 *pevent_specific_data, - struct json_object *pevent_fifos_object, FILE *fp); diff --git a/plugins/ocp/ocp-nvme.c b/plugins/ocp/ocp-nvme.c index 1ffa40b990..8ea22896a2 100644 --- a/plugins/ocp/ocp-nvme.c +++ b/plugins/ocp/ocp-nvme.c @@ -218,7 +218,7 @@ static int ocp_print_C3_log_normal(struct nvme_dev *dev, printf(" Active Threshold D %d ms\n", C3_ACTIVE_THRESHOLD_INCREMENT * le16_to_cpu(log_data->active_threshold_d+1)); - printf(" Active Latency Configuration 0x%x \n", + printf(" Active Latency Configuration 0x%x\n", le16_to_cpu(log_data->active_latency_config)); printf(" Active Latency Minimum Window %d ms\n", C3_MINIMUM_WINDOW_INCREMENT * @@ -889,6 +889,13 @@ static int eol_plp_failure_mode(int argc, char **argv, struct command *cmd, /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// /// Telemetry Log +//global buffers +static __le64 total_log_page_sz; +static struct telemetry_str_log_format *log_data; + +__u8 *ptelemetry_buffer; +__u8 *pstring_buffer; +__u8 *pC9_string_buffer; static void get_serial_number(struct nvme_id_ctrl *ctrl, char *sn) { @@ -953,6 +960,7 @@ static int get_telemetry_data(struct nvme_dev *dev, __u32 ns, __u8 tele_type, __u32 numd = (data_len >> 2) - 1; __u16 numdu = numd >> 16; __u16 numdl = numd & 0xffff; + cmd.cdw10 = tele_type | (nLSP & 0x0F) << 8 | (nRAE & 0x01) << 15 | @@ -968,6 +976,7 @@ static void print_telemetry_data_area_1(struct telemetry_data_area_1 *da1, { if (da1) { int i = 0; + if (tele_type == TELEMETRY_TYPE_HOST) printf("============ Telemetry Host Data area 1 ============\n"); else @@ -1035,7 +1044,7 @@ static void print_telemetry_da_stat(struct telemetry_stats_desc *da_stat, else printf("========= Telemetry Controller Data Area %d Statistics =========\n", data_area); - while((i + 8) < buf_size) { + while ((i + 8) < buf_size) { print_stats_desc(next_da_stat); i += 8 + ((next_da_stat->size) * 4); next_da_stat = (struct telemetry_stats_desc *)((__u64)da_stat + i); @@ -1064,7 +1073,7 @@ static void print_telemetry_da_fifo(struct telemetry_event_desc *da_fifo, da, index); - while((i + 4) < buf_size) { + while ((i + 4) < buf_size) { /* Print Event Data */ print_telemetry_fifo_event(next_da_fifo->class, /* Event class type */ next_da_fifo->id, /* Event ID */ @@ -1464,43 +1473,286 @@ static int get_telemetry_dump(struct nvme_dev *dev, char *filename, char *sn, return err; } +static int get_telemetry_log_page_data(struct nvme_dev *dev, int tele_type) +{ + char file_path[PATH_MAX]; + void *telemetry_log; + const size_t bs = 512; + struct nvme_telemetry_log *hdr; + size_t full_size, offset = bs; + int err, fd; + + if ((tele_type == TELEMETRY_TYPE_HOST_0) || (tele_type == TELEMETRY_TYPE_HOST_1)) + tele_type = TELEMETRY_TYPE_HOST; + + int log_id = (tele_type == TELEMETRY_TYPE_HOST ? NVME_LOG_LID_TELEMETRY_HOST : + NVME_LOG_LID_TELEMETRY_CTRL); + + hdr = malloc(bs); + telemetry_log = malloc(bs); + if (!hdr || !telemetry_log) { + fprintf(stderr, "Failed to allocate %zu bytes for log: %s\n", + bs, strerror(errno)); + err = -ENOMEM; + goto exit_status; + } + memset(hdr, 0, bs); + + sprintf(file_path, DEFAULT_TELEMETRY_BIN); + fd = open(file_path, O_WRONLY | O_CREAT | O_TRUNC, 0666); + if (fd < 0) { + fprintf(stderr, "Failed to open output file %s: %s!\n", + file_path, strerror(errno)); + err = fd; + goto exit_status; + } + + struct nvme_get_log_args args = { + .lpo = 0, + .result = NULL, + .log = hdr, + .args_size = sizeof(args), + .fd = dev_fd(dev), + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .lid = log_id, + .len = bs, + .nsid = NVME_NSID_ALL, + .csi = NVME_CSI_NVM, + .lsi = NVME_LOG_LSI_NONE, + .lsp = NVME_LOG_TELEM_HOST_LSP_CREATE, + .uuidx = NVME_UUID_NONE, + .rae = true, + .ot = false, + }; + + err = nvme_get_log(&args); + if (err < 0) + nvme_show_error("Failed to fetch the log from drive.\n"); + else if (err > 0) { + nvme_show_status(err); + nvme_show_error("Failed to fetch telemetry-header. Error:%d.\n", err); + goto close_fd; + } + + err = write(fd, (void *)hdr, bs); + if (err != bs) { + nvme_show_error("Failed to write data to file.\n"); + goto close_fd; + } + + full_size = (le16_to_cpu(hdr->dalb3) * bs) + offset; + + while (offset != full_size) { + args.log = telemetry_log; + args.lpo = offset; + args.lsp = NVME_LOG_LSP_NONE; + err = nvme_get_log(&args); + if (err < 0) { + nvme_show_error("Failed to fetch the log from drive.\n"); + break; + } else if (err > 0) { + nvme_show_error("Failed to fetch telemetry-log.\n"); + nvme_show_status(err); + break; + } + + err = write(fd, (void *)telemetry_log, bs); + if (err != bs) { + nvme_show_error("Failed to write data to file.\n"); + break; + } + err = 0; + offset += bs; + } + +close_fd: + close(fd); +exit_status: + free(hdr); + free(telemetry_log); + + return err; +} + +static int get_c9_log_page_data(struct nvme_dev *dev, int print_data, int save_bin) +{ + int ret = 0, fd; + __u8 *header_data; + struct telemetry_str_log_format *log_data; + __le64 stat_id_str_table_ofst = 0; + __le64 event_str_table_ofst = 0; + __le64 vu_event_str_table_ofst = 0; + __le64 ascii_table_ofst = 0; + char file_path[PATH_MAX]; + + header_data = (__u8 *)malloc(sizeof(__u8) * C9_TELEMETRY_STR_LOG_LEN); + if (!header_data) { + fprintf(stderr, "ERROR : OCP : malloc : %s\n", strerror(errno)); + return -1; + } + memset(header_data, 0, sizeof(__u8) * C9_TELEMETRY_STR_LOG_LEN); + + ret = nvme_get_log_simple(dev_fd(dev), C9_TELEMETRY_STRING_LOG_ENABLE_OPCODE, + C9_TELEMETRY_STR_LOG_LEN, header_data); + + if (!ret) { + log_data = (struct telemetry_str_log_format *)header_data; + if (print_data) { + printf("Statistics Identifier String Table Size = %lld\n", + log_data->sitsz); + printf("Event String Table Size = %lld\n", log_data->estsz); + printf("VU Event String Table Size = %lld\n", log_data->vu_eve_st_sz); + printf("ASCII Table Size = %lld\n", log_data->asctsz); + } + + //Calculating the offset for dynamic fields. + + stat_id_str_table_ofst = log_data->sits * 4; + event_str_table_ofst = log_data->ests * 4; + vu_event_str_table_ofst = log_data->vu_eve_sts * 4; + ascii_table_ofst = log_data->ascts * 4; + total_log_page_sz = C9_TELEMETRY_STR_LOG_LEN + + (log_data->sitsz * 4) + (log_data->estsz * 4) + + (log_data->vu_eve_st_sz * 4) + (log_data->asctsz * 4); + + if (print_data) { + printf("stat_id_str_table_ofst = %lld\n", stat_id_str_table_ofst); + printf("event_str_table_ofst = %lld\n", event_str_table_ofst); + printf("vu_event_str_table_ofst = %lld\n", vu_event_str_table_ofst); + printf("ascii_table_ofst = %lld\n", ascii_table_ofst); + printf("total_log_page_sz = %lld\n", total_log_page_sz); + } + + pC9_string_buffer = (__u8 *)malloc(sizeof(__u8) * total_log_page_sz); + if (!pC9_string_buffer) { + fprintf(stderr, "ERROR : OCP : malloc : %s\n", strerror(errno)); + return -1; + } + memset(pC9_string_buffer, 0, sizeof(__u8) * total_log_page_sz); + + ret = nvme_get_log_simple(dev_fd(dev), C9_TELEMETRY_STRING_LOG_ENABLE_OPCODE, + total_log_page_sz, pC9_string_buffer); + } else + fprintf(stderr, "ERROR : OCP : Unable to read C9 data.\n"); + + if (save_bin) { + sprintf(file_path, DEFAULT_STRING_BIN); + fd = open(file_path, O_WRONLY | O_CREAT | O_TRUNC, 0666); + if (fd < 0) { + fprintf(stderr, "Failed to open output file %s: %s!\n", + file_path, strerror(errno)); + goto exit_status; + } + + ret = write(fd, (void *)pC9_string_buffer, total_log_page_sz); + if (ret != total_log_page_sz) + fprintf(stderr, "Failed to flush all data to file!\n"); + + close(fd); + } + +exit_status: + free(header_data); + return 0; +} + +int parse_ocp_telemetry_log(struct ocp_telemetry_parse_options *options) +{ + int status = 0; + long telemetry_buffer_size = 0; + long string_buffer_size = 0; + enum nvme_print_flags fmt; + unsigned char log_id; + + if (options->telemetry_log) { + if (strstr((const char *)options->telemetry_log, "bin")) { + // Read the data from the telemetry binary file + ptelemetry_buffer = + read_binary_file(NULL, (const char *)options->telemetry_log, + &telemetry_buffer_size, 1); + if (ptelemetry_buffer == NULL) { + nvme_show_error("Failed to read telemetry-log.\n"); + return -1; + } + } + } else { + nvme_show_error("telemetry-log is empty.\n"); + return -1; + } + + log_id = ptelemetry_buffer[0]; + if ((log_id != NVME_LOG_LID_TELEMETRY_HOST) && (log_id != NVME_LOG_LID_TELEMETRY_CTRL)) { + nvme_show_error("Invalid LogPageId [0x%02X]\n", log_id); + return -1; + } + + if (options->string_log) { + // Read the data from the string binary file + if (strstr((const char *)options->string_log, "bin")) { + pstring_buffer = read_binary_file(NULL, (const char *)options->string_log, + &string_buffer_size, 1); + if (pstring_buffer == NULL) { + nvme_show_error("Failed to read string-log.\n"); + return -1; + } + } + } else { + nvme_show_error("string-log is empty.\n"); + return -1; + } + + status = validate_output_format(options->output_format, &fmt); + if (status < 0) { + nvme_show_error("Invalid output format\n"); + return status; + } + + switch (fmt) { + case NORMAL: + print_ocp_telemetry_normal(options); + break; + case JSON: + print_ocp_telemetry_json(options); + break; + default: + break; + } + + return 0; +} + static int ocp_telemetry_log(int argc, char **argv, struct command *cmd, struct plugin *plugin) { - struct nvme_dev *dev; - int err = 0; - const char *desc = "Retrieve and save telemetry log."; - const char *type = "Telemetry Type; 'host[Create bit]' or 'controller'"; - const char *area = "Telemetry Data Area; 1 or 3"; - const char *file = "Output file name with path;\n" + const char *desc = "Retrieve and parse OCP Telemetry log."; + const char *telemetry_log = "Telemetry log binary;\n 'host.bin' or 'controller.bin'"; + const char *string_log = "String log binary; 'C9.bin'"; + const char *output_file = "Output file name with path;\n" "e.g. '-o ./path/name'\n'-o ./path1/path2/';\n" "If requested path does not exist, the directory will be newly created."; + const char *output_format = "output format normal|json"; + const char *data_area = "Telemetry Data Area; 1 or 2;\n" + "e.g. '-a 1 for Data Area 1.'\n'-a 2 for Data Areas 1 and 2.';\n"; + const char *telemetry_type = "Telemetry Type; 'host' or 'controller'"; + struct nvme_dev *dev; + int err = 0; __u32 nsid = NVME_NSID_ALL; struct stat nvme_stat; char sn[21] = {0,}; struct nvme_id_ctrl ctrl; bool is_support_telemetry_controller; - + struct ocp_telemetry_parse_options opt; int tele_type = 0; int tele_area = 0; - struct config { - char *type; - int area; - char *file; - }; - - struct config cfg = { - .type = NULL, - .area = 0, - .file = NULL, - }; - OPT_ARGS(opts) = { - OPT_STR("telemetry_type", 't', &cfg.type, type), - OPT_INT("telemetry_data_area", 'a', &cfg.area, area), - OPT_FILE("output-file", 'o', &cfg.file, file), + OPT_STR("telemetry-log", 'l', &opt.telemetry_log, telemetry_log), + OPT_STR("string-log", 's', &opt.string_log, string_log), + OPT_FILE("output-file", 'o', &opt.output_file, output_file), + OPT_FMT("output-format", 'f', &opt.output_format, output_format), + OPT_INT("data-area", 'a', &opt.data_area, data_area), + OPT_STR("telemetry-type", 't', &opt.telemetry_type, telemetry_type), OPT_END() }; @@ -1526,36 +1778,84 @@ static int ocp_telemetry_log(int argc, char **argv, struct command *cmd, is_support_telemetry_controller = ((ctrl.lpa & 0x8) >> 3); - if (!cfg.type && !cfg.area) { - tele_type = TELEMETRY_TYPE_NONE; - tele_area = 0; - } else if (cfg.type && cfg.area) { - if (!strcmp(cfg.type, "host0")) + if (!opt.data_area) { + nvme_show_result("Missing data-area. Using default data area 1.\n"); + opt.data_area = DATA_AREA_1;//Default data area 1 + } else if (opt.data_area != 1 && opt.data_area != 2) { + nvme_show_result("Invalid data-area specified. Please specify 1 or 2.\n"); + goto out; + } + + tele_area = opt.data_area; + + if (opt.telemetry_type) { + if (!strcmp(opt.telemetry_type, "host0")) tele_type = TELEMETRY_TYPE_HOST_0; - else if (!strcmp(cfg.type, "host1")) + else if (!strcmp(opt.telemetry_type, "host1")) tele_type = TELEMETRY_TYPE_HOST_1; - else if (!strcmp(cfg.type, "controller")) + else if (!strcmp(opt.telemetry_type, "host")) + tele_type = TELEMETRY_TYPE_HOST; + else if (!strcmp(opt.telemetry_type, "controller")) tele_type = TELEMETRY_TYPE_CONTROLLER; + else { + nvme_show_error("telemetry-type should be host or controller.\n"); + goto out; + } + } else { + tele_type = TELEMETRY_TYPE_HOST; //Default Type - Host + nvme_show_result("Missing telemetry-type. Using default - host.\n"); + } - tele_area = cfg.area; + if (!opt.telemetry_log) { + nvme_show_result("\nMissing telemetry-log. Fetching from drive...\n"); + err = get_telemetry_log_page_data(dev, tele_type);//Pull Telemetry log + if (err) { + nvme_show_error("Failed to fetch telemetry-log from the drive.\n"); + goto out; + } + nvme_show_result("telemetry.bin generated. Proceeding with next steps.\n"); + opt.telemetry_log = DEFAULT_TELEMETRY_BIN; + } - if ((tele_area != 1 && tele_area != 3) || - (tele_type == TELEMETRY_TYPE_CONTROLLER && tele_area != 3)) { - printf("\nUnsupported parameters entered.\n"); - printf("Possible combinations; {'host0',1}, {'host0',3}, {'host1',1}, {'host1',3}, {'controller',3}\n"); - return err; + if (!opt.string_log) { + nvme_show_result("Missing string-log. Fetching from drive...\n"); + err = get_c9_log_page_data(dev, 0, 1); //Pull String log + if (err) { + nvme_show_error("Failed to fetch string-log from the drive.\n"); + goto out; } - } else { - printf("\nShould provide these all; 'telemetry_type' and 'telemetry_data_area'\n"); - return err; + nvme_show_result("string.bin generated. Proceeding with next steps.\n"); + opt.string_log = DEFAULT_STRING_BIN; } - if (tele_type == TELEMETRY_TYPE_NONE) { + if (!opt.output_format) { + nvme_show_result("Missing format. Using default format - JSON.\n"); + opt.output_format = DEFAULT_OUTPUT_FORMAT_JSON; + } + + switch (tele_type) { + case TELEMETRY_TYPE_HOST: { + printf("Extracting Telemetry Host Dump (Data Area %d)...\n", tele_area); + err = parse_ocp_telemetry_log(&opt); + if (err) + nvme_show_result("Status:(%x)\n", err); + } + break; + case TELEMETRY_TYPE_CONTROLLER: { + printf("Extracting Telemetry Controller Dump (Data Area %d)...\n", tele_area); + if (is_support_telemetry_controller == true) { + err = parse_ocp_telemetry_log(&opt); + if (err) + nvme_show_result("Status:(%x)\n", err); + } + } + break; + case TELEMETRY_TYPE_NONE: { printf("\n-------------------------------------------------------------\n"); /* Host 0 (lsp == 0) must be executed before Host 1 (lsp == 1). */ printf("\nExtracting Telemetry Host 0 Dump (Data Area 1)...\n"); - err = get_telemetry_dump(dev, cfg.file, sn, + err = get_telemetry_dump(dev, opt.output_file, sn, TELEMETRY_TYPE_HOST_0, 1, true); if (err) fprintf(stderr, "NVMe Status: %s(%x)\n", nvme_status_to_string(err, false), err); @@ -1564,7 +1864,7 @@ static int ocp_telemetry_log(int argc, char **argv, struct command *cmd, printf("\nExtracting Telemetry Host 0 Dump (Data Area 3)...\n"); - err = get_telemetry_dump(dev, cfg.file, sn, + err = get_telemetry_dump(dev, opt.output_file, sn, TELEMETRY_TYPE_HOST_0, 3, false); if (err) fprintf(stderr, "NVMe Status: %s(%x)\n", nvme_status_to_string(err, false), err); @@ -1573,7 +1873,7 @@ static int ocp_telemetry_log(int argc, char **argv, struct command *cmd, printf("\nExtracting Telemetry Host 1 Dump (Data Area 1)...\n"); - err = get_telemetry_dump(dev, cfg.file, sn, + err = get_telemetry_dump(dev, opt.output_file, sn, TELEMETRY_TYPE_HOST_1, 1, true); if (err) fprintf(stderr, "NVMe Status: %s(%x)\n", nvme_status_to_string(err, false), err); @@ -1582,7 +1882,7 @@ static int ocp_telemetry_log(int argc, char **argv, struct command *cmd, printf("\nExtracting Telemetry Host 1 Dump (Data Area 3)...\n"); - err = get_telemetry_dump(dev, cfg.file, sn, + err = get_telemetry_dump(dev, opt.output_file, sn, TELEMETRY_TYPE_HOST_1, 3, false); if (err) fprintf(stderr, "NVMe Status: %s(%x)\n", nvme_status_to_string(err, false), err); @@ -1592,32 +1892,31 @@ static int ocp_telemetry_log(int argc, char **argv, struct command *cmd, printf("\nExtracting Telemetry Controller Dump (Data Area 3)...\n"); if (is_support_telemetry_controller == true) { - err = get_telemetry_dump(dev, cfg.file, sn, + err = get_telemetry_dump(dev, opt.output_file, sn, TELEMETRY_TYPE_CONTROLLER, 3, true); if (err) fprintf(stderr, "NVMe Status: %s(%x)\n", nvme_status_to_string(err, false), err); } printf("\n-------------------------------------------------------------\n"); - } else if (tele_type == TELEMETRY_TYPE_CONTROLLER) { - printf("Extracting Telemetry Controller Dump (Data Area %d)...\n", tele_area); - - if (is_support_telemetry_controller == true) { - err = get_telemetry_dump(dev, cfg.file, sn, tele_type, tele_area, true); - if (err) - fprintf(stderr, "NVMe Status: %s(%x)\n", nvme_status_to_string(err, false), err); - } - } else { + } + break; + case TELEMETRY_TYPE_HOST_0: + case TELEMETRY_TYPE_HOST_1: + default: { printf("Extracting Telemetry Host(%d) Dump (Data Area %d)...\n", (tele_type == TELEMETRY_TYPE_HOST_0) ? 0 : 1, tele_area); - err = get_telemetry_dump(dev, cfg.file, sn, tele_type, tele_area, true); + err = get_telemetry_dump(dev, opt.output_file, sn, tele_type, tele_area, true); if (err) fprintf(stderr, "NVMe Status: %s(%x)\n", nvme_status_to_string(err, false), err); } + break; + } - printf("telemetry-log done.\n"); - + printf("ocp internal-log command completed.\n"); +out: + dev_close(dev); return err; } @@ -2829,139 +3128,12 @@ static int get_dssd_async_event_config(int argc, char **argv, struct command *cm /////////////////////////////////////////////////////////////////////////////// /// Telemetry String Log Format Log Page (LID : C9h) -/* C9 Telemetry String Log Format Log Page */ -#define C9_GUID_LENGTH 16 -#define C9_TELEMETRY_STRING_LOG_ENABLE_OPCODE 0xC9 -#define C9_TELEMETRY_STR_LOG_LEN 432 -#define C9_TELEMETRY_STR_LOG_SIST_OFST 431 - -/** - * struct telemetry_str_log_format - Telemetry String Log Format - * @log_page_version: indicates the version of the mapping this log page uses - * Shall be set to 01h. - * @reserved1: Reserved. - * @log_page_guid: Shall be set to B13A83691A8F408B9EA495940057AA44h. - * @sls: Shall be set to the number of DWORDS in the String Log. - * @reserved2: reserved. - * @sits: shall be set to the number of DWORDS in the Statistics - * Identifier String Table - * @ests: Shall be set to the number of DWORDS from byte 0 of this - * log page to the start of the Event String Table - * @estsz: shall be set to the number of DWORDS in the Event String Table - * @vu_eve_sts: Shall be set to the number of DWORDS from byte 0 of this - * log page to the start of the VU Event String Table - * @vu_eve_st_sz: shall be set to the number of DWORDS in the VU Event String Table - * @ascts: the number of DWORDS from byte 0 of this log page until the ASCII Table Starts. - * @asctsz: the number of DWORDS in the ASCII Table - * @fifo1: FIFO 0 ASCII String - * @fifo2: FIFO 1 ASCII String - * @fifo3: FIFO 2 ASCII String - * @fifo4: FIFO 3 ASCII String - * @fif05: FIFO 4 ASCII String - * @fifo6: FIFO 5 ASCII String - * @fifo7: FIFO 6 ASCII String - * @fifo8: FIFO 7 ASCII String - * @fifo9: FIFO 8 ASCII String - * @fifo10: FIFO 9 ASCII String - * @fif011: FIFO 10 ASCII String - * @fif012: FIFO 11 ASCII String - * @fifo13: FIFO 12 ASCII String - * @fif014: FIFO 13 ASCII String - * @fif015: FIFO 14 ASCII String - * @fif016: FIFO 15 ASCII String - * @reserved3: reserved - */ -struct __attribute__((__packed__)) telemetry_str_log_format { - __u8 log_page_version; - __u8 reserved1[15]; - __u8 log_page_guid[C9_GUID_LENGTH]; - __le64 sls; - __u8 reserved2[24]; - __le64 sits; - __le64 sitsz; - __le64 ests; - __le64 estsz; - __le64 vu_eve_sts; - __le64 vu_eve_st_sz; - __le64 ascts; - __le64 asctsz; - __u8 fifo1[16]; - __u8 fifo2[16]; - __u8 fifo3[16]; - __u8 fifo4[16]; - __u8 fifo5[16]; - __u8 fifo6[16]; - __u8 fifo7[16]; - __u8 fifo8[16]; - __u8 fifo9[16]; - __u8 fifo10[16]; - __u8 fifo11[16]; - __u8 fifo12[16]; - __u8 fifo13[16]; - __u8 fifo14[16]; - __u8 fifo15[16]; - __u8 fifo16[16]; - __u8 reserved3[48]; -}; - -/* - * struct statistics_id_str_table_entry - Statistics Identifier String Table Entry - * @vs_si: Shall be set the Vendor Unique Statistic Identifier number. - * @reserved1: Reserved - * @ascii_id_len: Shall be set the number of ASCII Characters that are valid. - * @ascii_id_ofst: Shall be set to the offset from DWORD 0/Byte 0 of the Start - * of the ASCII Table to the first character of the string for - * this Statistic Identifier string.. - * @reserved2 reserved - */ -struct __attribute__((__packed__)) statistics_id_str_table_entry { - __le16 vs_si; - __u8 reserved1; - __u8 ascii_id_len; - __le64 ascii_id_ofst; - __le32 reserved2; -}; - -/* - * struct event_id_str_table_entry - Event Identifier String Table Entry - * @deb_eve_class: Shall be set the Debug Class. - * @ei: Shall be set to the Event Identifier - * @ascii_id_len: Shall be set the number of ASCII Characters that are valid. - * @ascii_id_ofst: This is the offset from DWORD 0/ Byte 0 of the start of the - * ASCII table to the ASCII data for this identifier - * @reserved2 reserved - */ -struct __attribute__((__packed__)) event_id_str_table_entry { - __u8 deb_eve_class; - __le16 ei; - __u8 ascii_id_len; - __le64 ascii_id_ofst; - __le32 reserved2; -}; - -/* - * struct vu_event_id_str_table_entry - VU Event Identifier String Table Entry - * @deb_eve_class: Shall be set the Debug Class. - * @vu_ei: Shall be set to the VU Event Identifier - * @ascii_id_len: Shall be set the number of ASCII Characters that are valid. - * @ascii_id_ofst: This is the offset from DWORD 0/ Byte 0 of the start of the - * ASCII table to the ASCII data for this identifier - * @reserved reserved - */ -struct __attribute__((__packed__)) vu_event_id_str_table_entry { - __u8 deb_eve_class; - __le16 vu_ei; - __u8 ascii_id_len; - __le64 ascii_id_ofst; - __le32 reserved; -}; - /* Function declaration for Telemetry String Log Format (LID:C9h) */ static int ocp_telemetry_str_log_format(int argc, char **argv, struct command *cmd, struct plugin *plugin); -static int ocp_print_C9_log_normal(struct telemetry_str_log_format *log_data,__u8 *log_data_buf) +static int ocp_print_C9_log_normal(struct telemetry_str_log_format *log_data, __u8 *log_data_buf) { //calculating the index value for array __le64 stat_id_index = (log_data->sitsz * 4) / 16; @@ -3162,7 +3334,7 @@ static int ocp_print_C9_log_normal(struct telemetry_str_log_format *log_data,__u return 0; } -static int ocp_print_C9_log_json(struct telemetry_str_log_format *log_data,__u8 *log_data_buf) +static int ocp_print_C9_log_json(struct telemetry_str_log_format *log_data, __u8 *log_data_buf) { struct json_object *root = json_create_object(); char res_arr[48]; @@ -3401,23 +3573,17 @@ static int ocp_print_C9_log_json(struct telemetry_str_log_format *log_data,__u8 return 0; } -static void ocp_print_c9_log_binary(__u8 *log_data_buf,int total_log_page_size) +static void ocp_print_c9_log_binary(__u8 *log_data_buf, int total_log_page_size) { return d_raw((unsigned char *)log_data_buf, total_log_page_size); } static int get_c9_log_page(struct nvme_dev *dev, char *format) { + int ret = 0; - __u8 *header_data; - struct telemetry_str_log_format *log_data; + nvme_print_flags_t fmt; - __u8 *full_log_buf_data = NULL; - __le64 stat_id_str_table_ofst = 0; - __le64 event_str_table_ofst = 0; - __le64 vu_event_str_table_ofst = 0; - __le64 ascii_table_ofst = 0; - __le64 total_log_page_sz = 0; ret = validate_output_format(format, &fmt); if (ret < 0) { @@ -3425,75 +3591,25 @@ static int get_c9_log_page(struct nvme_dev *dev, char *format) return ret; } - header_data = (__u8 *)malloc(sizeof(__u8) * C9_TELEMETRY_STR_LOG_LEN); - if (!header_data) { - fprintf(stderr, "ERROR : OCP : malloc : %s\n", strerror(errno)); - return -1; - } - memset(header_data, 0, sizeof(__u8) * C9_TELEMETRY_STR_LOG_LEN); - - ret = nvme_get_log_simple(dev_fd(dev), C9_TELEMETRY_STRING_LOG_ENABLE_OPCODE, - C9_TELEMETRY_STR_LOG_LEN, header_data); + get_c9_log_page_data(dev, 1, 0); if (!ret) { - log_data = (struct telemetry_str_log_format *)header_data; - printf("Statistics Identifier String Table Size = %lld\n",log_data->sitsz); - printf("Event String Table Size = %lld\n",log_data->estsz); - printf("VU Event String Table Size = %lld\n",log_data->vu_eve_st_sz); - printf("ASCII Table Size = %lld\n",log_data->asctsz); - - //Calculating the offset for dynamic fields. - - stat_id_str_table_ofst = log_data->sits * 4; - event_str_table_ofst = log_data->ests * 4; - vu_event_str_table_ofst = log_data->vu_eve_sts * 4; - ascii_table_ofst = log_data->ascts * 4; - total_log_page_sz = C9_TELEMETRY_STR_LOG_LEN + - (log_data->sitsz * 4) + (log_data->estsz * 4) + - (log_data->vu_eve_st_sz * 4) + (log_data->asctsz * 4); - - - - printf("stat_id_str_table_ofst = %lld\n",stat_id_str_table_ofst); - printf("event_str_table_ofst = %lld\n",event_str_table_ofst); - printf("vu_event_str_table_ofst = %lld\n",vu_event_str_table_ofst); - printf("ascii_table_ofst = %lld\n",ascii_table_ofst); - printf("total_log_page_sz = %lld\n",total_log_page_sz); - - full_log_buf_data = (__u8 *)malloc(sizeof(__u8) * total_log_page_sz); - if (!full_log_buf_data) { - fprintf(stderr, "ERROR : OCP : malloc : %s\n", strerror(errno)); - return -1; - } - memset(full_log_buf_data, 0, sizeof(__u8) * total_log_page_sz); - - ret = nvme_get_log_simple(dev_fd(dev), C9_TELEMETRY_STRING_LOG_ENABLE_OPCODE, - total_log_page_sz, full_log_buf_data); - - if (!ret) { - switch (fmt) { - case NORMAL: - ocp_print_C9_log_normal(log_data,full_log_buf_data); - break; - case JSON: - ocp_print_C9_log_json(log_data,full_log_buf_data); - break; - case BINARY: - ocp_print_c9_log_binary(full_log_buf_data,total_log_page_sz); - break; - default: - fprintf(stderr, "unhandled output format\n"); - break; - } - } else{ - fprintf(stderr, "ERROR : OCP : Unable to read C9 data from buffer\n"); + switch (fmt) { + case NORMAL: + ocp_print_C9_log_normal(log_data, pC9_string_buffer); + break; + case JSON: + ocp_print_C9_log_json(log_data, pC9_string_buffer); + break; + case BINARY: + ocp_print_c9_log_binary(pC9_string_buffer, total_log_page_sz); + break; + default: + fprintf(stderr, "unhandled output format\n"); + break; } - } else { + } else fprintf(stderr, "ERROR : OCP : Unable to read C9 data from buffer\n"); - } - - free(header_data); - free(full_log_buf_data); return ret; } diff --git a/plugins/ocp/ocp-telemetry-decode.c b/plugins/ocp/ocp-telemetry-decode.c index 2842dc16ef..11963be437 100644 --- a/plugins/ocp/ocp-telemetry-decode.c +++ b/plugins/ocp/ocp-telemetry-decode.c @@ -58,6 +58,7 @@ void print_telemetry_fifo_event(__u8 class_type, __u32 size = size_dw * 4; char time_str[40]; uint64_t timestamp = 0; + memset((void *)time_str, '\0', 40); if (class_type) { @@ -200,3 +201,1366 @@ void print_telemetry_fifo_event(__u8 class_type, break; } } + +struct statistic_entry statistic_identifiers_map[] = { + { 0x00, "Error, this entry does not exist." }, + { 0x01, "Outstanding Admin Commands" }, + { 0x02, "Host Write Bandwidth"}, + { 0x03, "GC Write Bandwidth"}, + { 0x04, "Active Namespaces"}, + { 0x05, "Internal Write Workload"}, + { 0x06, "Internal Read Workload"}, + { 0x07, "Internal Write Queue Depth"}, + { 0x08, "Internal Read Queue Depth"}, + { 0x09, "Pending Trim LBA Count"}, + { 0x0A, "Host Trim LBA Request Count"}, + { 0x0B, "Current NVMe Power State"}, + { 0x0C, "Current DSSD Power State"}, + { 0x0D, "Program Fail Count"}, + { 0x0E, "Erase Fail Count"}, + { 0x0F, "Read Disturb Writes"}, + { 0x10, "Retention Writes"}, + { 0x11, "Wear Leveling Writes"}, + { 0x12, "Read Recovery Writes"}, + { 0x13, "GC Writes"}, + { 0x14, "SRAM Correctable Count"}, + { 0x15, "DRAM Correctable Count"}, + { 0x16, "SRAM Uncorrectable Count"}, + { 0x17, "DRAM Uncorrectable Count"}, + { 0x18, "Data Integrity Error Count"}, + { 0x19, "Read Retry Error Count"}, + { 0x1A, "PERST Events Count"}, + { 0x1B, "Max Die Bad Block"}, + { 0x1C, "Max NAND Channel Bad Block"}, + { 0x1D, "Minimum NAND Channel Bad Block"} +}; + +struct request_data host_log_page_header[] = { + { "LogIdentifier", 1 }, + { "Reserved1", 4 }, + { "IEEE OUI Identifier", 3 }, + { "Telemetry Host-Initiated Data Area 1 Last Block", 2 }, + { "Telemetry Host-Initiated Data Area 2 Last Block", 2 }, + { "Telemetry Host-Initiated Data Area 3 Last Block", 2 }, + { "Reserved2", 2 }, + { "Telemetry Host-Initiated Data Area 4 Last Block", 4 }, + { "Reserved3", 360 }, + { "Telemetry Host-Initiated Scope", 1 }, + { "Telemetry Host Initiated Generation Number", 1 }, + { "Telemetry Host-Initiated Data Available", 1 }, + { "Telemetry Controller-Initiated Data Generation Number", 1 } +}; + +struct request_data controller_log_page_header[] = { + { "LogIdentifier", 1 }, + { "Reserved1", 4 }, + { "IEEE OUI Identifier", 3 }, + { "Telemetry Host-Initiated Data Area 1 Last Block", 2 }, + { "Telemetry Host-Initiated Data Area 2 Last Block", 2 }, + { "Telemetry Host-Initiated Data Area 3 Last Block", 2 }, + { "Reserved2", 2 }, + { "Telemetry Host-Initiated Data Area 4 Last Block", 4 }, + { "Reserved3", 361 }, + { "Telemetry Controller-Initiated Scope", 1 }, + { "Telemetry Controller-Initiated Data Available", 1 }, + { "Telemetry Controller-Initiated Data Generation Number", 1 } +}; + +struct request_data reason_identifier[] = { + { "Error ID", 64 }, + { "File ID", 8 }, + { "Line Number", 2 }, + { "Valid Flags", 1 }, + { "Reserved", 21 }, + { "VU Reason Extension", 32 } +}; + +struct request_data ocp_header_in_da1[] = { + { "Major Version", 2 }, + { "Minor Version", 2 }, + { "Reserved1", 4 }, + { "Timestamp", 8 }, + { "Log page GUID", 16 }, + { "Number Telemetry Profiles Supported", 1 }, + { "Telemetry Profile Selected", 1 }, + { "Reserved2", 6 }, + { "Telemetry String Log Size", 8 }, + { "Reserved3", 8 }, + { "Firmware Revision", 8 }, + { "Reserved4", 32 }, + { "Data Area 1 Statistic Start", 8 }, + { "Data Area 1 Statistic Size", 8 }, + { "Data Area 2 Statistic Start", 8 }, + { "Data Area 2 Statistic Size", 8 }, + { "Reserved5", 32 }, + { "Event FIFO 1 Data Area", 1 }, + { "Event FIFO 2 Data Area", 1 }, + { "Event FIFO 3 Data Area", 1 }, + { "Event FIFO 4 Data Area", 1 }, + { "Event FIFO 5 Data Area", 1 }, + { "Event FIFO 6 Data Area", 1 }, + { "Event FIFO 7 Data Area", 1 }, + { "Event FIFO 8 Data Area", 1 }, + { "Event FIFO 9 Data Area", 1 }, + { "Event FIFO 10 Data Area", 1 }, + { "Event FIFO 11 Data Area", 1 }, + { "Event FIFO 12 Data Area", 1 }, + { "Event FIFO 13 Data Area", 1 }, + { "Event FIFO 14 Data Area", 1 }, + { "Event FIFO 15 Data Area", 1 }, + { "Event FIFO 16 Data Area", 1 }, + { "Event FIFO 1 Start", 8 }, + { "Event FIFO 1 Size", 8 }, + { "Event FIFO 2 Start", 8 }, + { "Event FIFO 2 Size", 8 }, + { "Event FIFO 3 Start", 8 }, + { "Event FIFO 3 Size", 8 }, + { "Event FIFO 4 Start", 8 }, + { "Event FIFO 4 Size", 8 }, + { "Event FIFO 5 Start", 8 }, + { "Event FIFO 5 Size", 8 }, + { "Event FIFO 6 Start", 8 }, + { "Event FIFO 6 Size", 8 }, + { "Event FIFO 7 Start", 8 }, + { "Event FIFO 7 Size", 8 }, + { "Event FIFO 8 Start", 8 }, + { "Event FIFO 8 Size", 8 }, + { "Event FIFO 9 Start", 8 }, + { "Event FIFO 9 Size", 8 }, + { "Event FIFO 10 Start", 8 }, + { "Event FIFO 10 Size", 8 }, + { "Event FIFO 11 Start", 8 }, + { "Event FIFO 11 Size", 8 }, + { "Event FIFO 12 Start", 8 }, + { "Event FIFO 12 Size", 8 }, + { "Event FIFO 13 Start", 8 }, + { "Event FIFO 13 Size", 8 }, + { "Event FIFO 14 Start", 8 }, + { "Event FIFO 14 Size", 8 }, + { "Event FIFO 15 Start", 8 }, + { "Event FIFO 15 Size", 8 }, + { "Event FIFO 16 Start", 8 }, + { "Event FIFO 16 Size", 8 }, + { "Reserved6", 80 } +}; + +struct request_data smart[] = { + { "Critical Warning", 1 }, + { "Composite Temperature", 2 }, + { "Available Spare", 1 }, + { "Available Spare Threshold", 1 }, + { "Percentage Used", 1 }, + { "Reserved1", 26 }, + { "Data Units Read", 16 }, + { "Data Units Written", 16 }, + { "Host Read Commands", 16 }, + { "Host Write Commands", 16 }, + { "Controller Busy Time", 16 }, + { "Power Cycles", 16 }, + { "Power On Hours", 16 }, + { "Unsafe Shutdowns", 16 }, + { "Media and Data Integrity Errors", 16 }, + { "Number of Error Information Log Entries", 16 }, + { "Warning Composite Temperature Time", 4 }, + { "Critical Composite Temperature Time", 4 }, + { "Temperature Sensor 1", 2 }, + { "Temperature Sensor 2", 2 }, + { "Temperature Sensor 3", 2 }, + { "Temperature Sensor 4", 2 }, + { "Temperature Sensor 5", 2 }, + { "Temperature Sensor 6", 2 }, + { "Temperature Sensor 7", 2 }, + { "Temperature Sensor 8", 2 }, + { "Thermal Management Temperature 1 Transition Count", 4 }, + { "Thermal Management Temperature 2 Transition Count", 4 }, + { "Total Time for Thermal Management Temperature 1", 4 }, + { "Total Time for Thermal Management Temperature 2", 4 }, + { "Reserved2", 280 } +}; + +struct request_data smart_extended[] = { + { "Physical Media Units Written", 16 }, + { "Physical Media Units Read", 16 }, + { "Bad User NAND Blocks Raw Count", 6 }, + { "Bad User NAND Blocks Normalized Value", 2 }, + { "Bad System NAND Blocks Raw Count", 6 }, + { "Bad System NAND Blocks Normalized Value", 2 }, + { "XOR Recovery Count", 8 }, + { "Uncorrectable Read Error Count", 8 }, + { "Soft ECC Error Count", 8 }, + { "End to End Correction Counts Detected Errors", 4 }, + { "End to End Correction Counts Corrected Errors", 4 }, + { "System Data Percent Used", 1 }, + { "Refresh Counts", 7 }, + { "Maximum User Data Erase Count", 4 }, + { "Minimum User Data Erase Count", 4 }, + { "Number of thermal throttling events", 1 }, + { "Current Throttling Status", 1 }, + { "Errata Version Field", 1 }, + { "Point Version Field", 2 }, + { "Minor Version Field", 2 }, + { "Major Version Field", 1 }, + { "PCIe Correctable Error Count", 8 }, + { "Incomplete Shutdowns", 4 }, + { "Reserved1", 4 }, + { "Percent Free Blocks", 1 }, + { "Reserved2", 7 }, + { "Capacitor Health", 2 }, + { "NVMe Base Errata Version", 1 }, + { "NVMe Command Set Errata Version", 1 }, + { "Reserved3", 4 }, + { "Unaligned IO", 8 }, + { "Security Version Number", 8 }, + { "Total NUSE", 8 }, + { "PLP Start Count", 16 }, + { "Endurance Estimate", 16 }, + { "PCIe Link Retraining Count", 8 }, + { "Power State Change Count", 8 }, + { "Lowest Permitted Firmware Revision", 8 }, + { "Reserved4", 278 }, + { "Log Page Version", 2 }, + { "Log page GUID", 16 } +}; + +void json_add_formatted_u32_str(struct json_object *pobject, const char *msg, unsigned int pdata) +{ + char data_str[70] = { 0 }; + + sprintf(data_str, "0x%x", pdata); + json_object_add_value_string(pobject, msg, data_str); +} + +void json_add_formatted_var_size_str(struct json_object *pobject, const char *msg, __u8 *pdata, + unsigned int data_size) +{ + char description_str[256] = ""; + char temp_buffer[3] = { 0 }; + + for (size_t i = 0; i < data_size; ++i) { + sprintf(temp_buffer, "%02X", pdata[i]); + strcat(description_str, temp_buffer); + } + + json_object_add_value_string(pobject, msg, description_str); +} + +int get_telemetry_das_offset_and_size( + struct nvme_ocp_telemetry_common_header *ptelemetry_common_header, + struct nvme_ocp_telemetry_offsets *ptelemetry_das_offset) +{ + if (NULL == ptelemetry_common_header || NULL == ptelemetry_das_offset) { + nvme_show_error("Invalid input arguments."); + return -1; + } + + if (ptelemetry_common_header->log_id == NVME_LOG_LID_TELEMETRY_HOST) + ptelemetry_das_offset->header_size = + sizeof(struct nvme_ocp_telemetry_host_initiated_header); + else if (ptelemetry_common_header->log_id == NVME_LOG_LID_TELEMETRY_CTRL) + ptelemetry_das_offset->header_size = + sizeof(struct nvme_ocp_telemetry_controller_initiated_header); + else + return -1; + + ptelemetry_das_offset->da1_start_offset = ptelemetry_das_offset->header_size; + ptelemetry_das_offset->da1_size = ptelemetry_common_header->da1_last_block * + OCP_TELEMETRY_DATA_BLOCK_SIZE; + + ptelemetry_das_offset->da2_start_offset = ptelemetry_das_offset->da1_start_offset + + ptelemetry_das_offset->da1_size; + ptelemetry_das_offset->da2_size = + (ptelemetry_common_header->da2_last_block - + ptelemetry_common_header->da1_last_block) * OCP_TELEMETRY_DATA_BLOCK_SIZE; + + ptelemetry_das_offset->da3_start_offset = ptelemetry_das_offset->da2_start_offset + + ptelemetry_das_offset->da2_size; + ptelemetry_das_offset->da3_size = + (ptelemetry_common_header->da3_last_block - + ptelemetry_common_header->da2_last_block) * OCP_TELEMETRY_DATA_BLOCK_SIZE; + + ptelemetry_das_offset->da4_start_offset = ptelemetry_das_offset->da3_start_offset + + ptelemetry_das_offset->da3_size; + ptelemetry_das_offset->da4_size = + (ptelemetry_common_header->da4_last_block - + ptelemetry_common_header->da3_last_block) * OCP_TELEMETRY_DATA_BLOCK_SIZE; + + return 0; +} + +int get_static_id_ascii_string(int identifier, char *description) +{ + if (pstring_buffer == NULL) + return -1; + + struct nvme_ocp_telemetry_string_header *pocp_ts_header = + (struct nvme_ocp_telemetry_string_header *)pstring_buffer; + + //Calculating the sizes of the tables. Note: Data is present in the form of DWORDS, + //So multiplying with sizeof(DWORD) + unsigned long long sits_table_size = (pocp_ts_header->sitsz) * SIZE_OF_DWORD; + + //Calculating number of entries present in all 3 tables + int sits_entries = (int)sits_table_size / + sizeof(struct nvme_ocp_statistics_identifier_string_table); + + for (int sits_entry = 0; sits_entry < sits_entries; sits_entry++) { + struct nvme_ocp_statistics_identifier_string_table + *peach_statistic_entry = + (struct nvme_ocp_statistics_identifier_string_table *) + (pstring_buffer + (pocp_ts_header->sits * SIZE_OF_DWORD) + + (sits_entry * + sizeof(struct nvme_ocp_statistics_identifier_string_table))); + + if (identifier == (int)peach_statistic_entry->vs_statistic_identifier) { + char *pdescription = (char *)(pstring_buffer + + (pocp_ts_header->ascts * SIZE_OF_DWORD) + + (peach_statistic_entry->ascii_id_offset * + SIZE_OF_DWORD)); + + memcpy(description, pdescription, + peach_statistic_entry->ascii_id_length + 1); + + // If ASCII string isn't found, see in our internal Map + // for 2.5 Spec defined strings (id < 0x1D). + if ((description == NULL) && (identifier < 0x1D)) + memcpy(description, + statistic_identifiers_map[identifier].description, + peach_statistic_entry->ascii_id_length + 1); + return 0; + } + } + + return -1; +} + +int get_event_id_ascii_string(int identifier, int debug_event_class, char *description) +{ + if (pstring_buffer == NULL) + return -1; + + struct nvme_ocp_telemetry_string_header *pocp_ts_header = + (struct nvme_ocp_telemetry_string_header *)pstring_buffer; + + //Calculating the sizes of the tables. Note: Data is present in the form of DWORDS, + //So multiplying with sizeof(DWORD) + unsigned long long ests_table_size = (pocp_ts_header->estsz) * SIZE_OF_DWORD; + + //Calculating number of entries present in all 3 tables + int ests_entries = (int)ests_table_size / sizeof(struct nvme_ocp_event_string_table); + + for (int ests_entry = 0; ests_entry < ests_entries; ests_entry++) { + struct nvme_ocp_event_string_table *peach_event_entry = + (struct nvme_ocp_event_string_table *) + (pstring_buffer + (pocp_ts_header->ests * SIZE_OF_DWORD) + + (ests_entry * sizeof(struct nvme_ocp_event_string_table))); + + if (identifier == (int)peach_event_entry->event_identifier && + debug_event_class == (int)peach_event_entry->debug_event_class) { + char *pdescription = (char *)(pstring_buffer + + (pocp_ts_header->ascts * SIZE_OF_DWORD) + + (peach_event_entry->ascii_id_offset * SIZE_OF_DWORD)); + + memcpy(description, pdescription, + peach_event_entry->ascii_id_length + 1); + return 0; + } + } + + return -1; +} + +int get_vu_event_id_ascii_string(int identifier, int debug_event_class, char *description) +{ + if (pstring_buffer == NULL) + return -1; + + struct nvme_ocp_telemetry_string_header *pocp_ts_header = + (struct nvme_ocp_telemetry_string_header *)pstring_buffer; + + //Calculating the sizes of the tables. Note: Data is present in the form of DWORDS, + //So multiplying with sizeof(DWORD) + unsigned long long vuests_table_size = (pocp_ts_header->vu_estsz) * SIZE_OF_DWORD; + + //Calculating number of entries present in all 3 tables + int vu_ests_entries = (int)vuests_table_size / + sizeof(struct nvme_ocp_vu_event_string_table); + + for (int vu_ests_entry = 0; vu_ests_entry < vu_ests_entries; vu_ests_entry++) { + struct nvme_ocp_vu_event_string_table *peach_vu_event_entry = + (struct nvme_ocp_vu_event_string_table *) + (pstring_buffer + (pocp_ts_header->vu_ests * SIZE_OF_DWORD) + + (vu_ests_entry * sizeof(struct nvme_ocp_vu_event_string_table))); + + if (identifier == (int)peach_vu_event_entry->vu_event_identifier && + debug_event_class == + (int)peach_vu_event_entry->debug_event_class) { + char *pdescription = (char *)(pstring_buffer + + (pocp_ts_header->ascts * SIZE_OF_DWORD) + + (peach_vu_event_entry->ascii_id_offset * SIZE_OF_DWORD)); + + memcpy(description, pdescription, + peach_vu_event_entry->ascii_id_length + 1); + return 0; + } + } + + return -1; +} + +int parse_ocp_telemetry_string_log(int event_fifo_num, int identifier, int debug_event_class, + enum ocp_telemetry_string_tables string_table, char *description) +{ + if (pstring_buffer == NULL) + return -1; + + if (event_fifo_num != 0) { + struct nvme_ocp_telemetry_string_header *pocp_ts_header = + (struct nvme_ocp_telemetry_string_header *)pstring_buffer; + + if (*pocp_ts_header->fifo_ascii_string[event_fifo_num-1] != '\0') + memcpy(description, pocp_ts_header->fifo_ascii_string[event_fifo_num-1], + 16); + else + description = ""; + + return 0; + } + + if (string_table == STATISTICS_IDENTIFIER_STRING) + get_static_id_ascii_string(identifier, description); + else if (string_table == EVENT_STRING) + get_event_id_ascii_string(identifier, debug_event_class, description); + else if (string_table == VU_EVENT_STRING) + get_vu_event_id_ascii_string(identifier, debug_event_class, description); + + return 0; +} + +void parse_time_stamp_event(struct nvme_ocp_telemetry_event_descriptor *pevent_descriptor, + struct json_object *pevent_descriptor_obj, __u8 *pevent_specific_data, + struct json_object *pevent_fifos_object, FILE *fp) +{ + struct nvme_ocp_time_stamp_dbg_evt_class_format *ptime_stamp_event = + (struct nvme_ocp_time_stamp_dbg_evt_class_format *) pevent_specific_data; + + int vu_event_id = (int)ptime_stamp_event->vu_event_identifier; + + unsigned int data_size = ((pevent_descriptor->event_data_size * SIZE_OF_DWORD)- + sizeof(struct nvme_ocp_time_stamp_dbg_evt_class_format)); + + __u8 *pdata = (__u8 *)ptime_stamp_event + + sizeof(struct nvme_ocp_time_stamp_dbg_evt_class_format); + + char description_str[256] = ""; + + parse_ocp_telemetry_string_log(0, ptime_stamp_event->vu_event_identifier, + pevent_descriptor->debug_event_class_type, + VU_EVENT_STRING, description_str); + + if (pevent_fifos_object != NULL) { + json_add_formatted_var_size_str(pevent_descriptor_obj, STR_CLASS_SPECIFIC_DATA, + ptime_stamp_event->time_stamp, DATA_SIZE_8); + json_add_formatted_u32_str(pevent_descriptor_obj, STR_VU_EVENT_ID_STRING, + vu_event_id); + json_object_add_value_string(pevent_descriptor_obj, STR_VU_EVENT_STRING, + description_str); + json_add_formatted_var_size_str(pevent_descriptor_obj, STR_VU_DATA, pdata, + data_size); + } else { + if (fp) { + print_formatted_var_size_str(STR_CLASS_SPECIFIC_DATA, + ptime_stamp_event->time_stamp, DATA_SIZE_8, fp); + fprintf(fp, "%s: 0x%x\n", STR_VU_EVENT_ID_STRING, vu_event_id); + fprintf(fp, "%s: %s\n", STR_VU_EVENT_STRING, description_str); + print_formatted_var_size_str(STR_VU_DATA, pdata, data_size, fp); + } else { + print_formatted_var_size_str(STR_CLASS_SPECIFIC_DATA, + ptime_stamp_event->time_stamp, DATA_SIZE_8, fp); + printf("%s: 0x%x\n", STR_VU_EVENT_ID_STRING, vu_event_id); + printf("%s: %s\n", STR_VU_EVENT_STRING, description_str); + print_formatted_var_size_str(STR_VU_DATA, pdata, data_size, fp); + } + } +} + +void parse_pcie_event(struct nvme_ocp_telemetry_event_descriptor *pevent_descriptor, + struct json_object *pevent_descriptor_obj, __u8 *pevent_specific_data, + struct json_object *pevent_fifos_object, FILE *fp) +{ + struct nvme_ocp_pcie_dbg_evt_class_format *ppcie_event = + (struct nvme_ocp_pcie_dbg_evt_class_format *) pevent_specific_data; + int vu_event_id = (int) ppcie_event->vu_event_identifier; + unsigned int data_size = ((pevent_descriptor->event_data_size * SIZE_OF_DWORD) - + sizeof(struct nvme_ocp_pcie_dbg_evt_class_format)); + __u8 *pdata = (__u8 *) ppcie_event + sizeof(struct nvme_ocp_pcie_dbg_evt_class_format); + char description_str[256] = ""; + + parse_ocp_telemetry_string_log(0, ppcie_event->vu_event_identifier, + pevent_descriptor->debug_event_class_type, VU_EVENT_STRING, description_str); + + if (pevent_fifos_object != NULL) { + json_add_formatted_var_size_str(pevent_descriptor_obj, STR_CLASS_SPECIFIC_DATA, + ppcie_event->pCIeDebugEventData, DATA_SIZE_4); + json_add_formatted_u32_str(pevent_descriptor_obj, STR_VU_EVENT_ID_STRING, + vu_event_id); + json_object_add_value_string(pevent_descriptor_obj, STR_VU_EVENT_STRING, + description_str); + json_add_formatted_var_size_str(pevent_descriptor_obj, STR_VU_DATA, pdata, + data_size); + } else { + if (fp) { + print_formatted_var_size_str(STR_CLASS_SPECIFIC_DATA, + ppcie_event->pCIeDebugEventData, DATA_SIZE_4, fp); + fprintf(fp, "%s: 0x%x\n", STR_VU_EVENT_ID_STRING, vu_event_id); + fprintf(fp, "%s: %s\n", STR_VU_EVENT_STRING, description_str); + print_formatted_var_size_str(STR_VU_DATA, pdata, data_size, fp); + } else { + print_formatted_var_size_str(STR_CLASS_SPECIFIC_DATA, + ppcie_event->pCIeDebugEventData, DATA_SIZE_4, fp); + printf("%s: 0x%x\n", STR_VU_EVENT_ID_STRING, vu_event_id); + printf("%s: %s\n", STR_VU_EVENT_STRING, description_str); + print_formatted_var_size_str(STR_VU_DATA, pdata, data_size, fp); + } + } +} + +void parse_nvme_event(struct nvme_ocp_telemetry_event_descriptor *pevent_descriptor, + struct json_object *pevent_descriptor_obj, __u8 *pevent_specific_data, + struct json_object *pevent_fifos_object, FILE *fp) +{ + struct nvme_ocp_nvme_dbg_evt_class_format *pnvme_event = + (struct nvme_ocp_nvme_dbg_evt_class_format *) pevent_specific_data; + int vu_event_id = (int) pnvme_event->vu_event_identifier; + unsigned int data_size = ((pevent_descriptor->event_data_size * + SIZE_OF_DWORD) - sizeof(struct nvme_ocp_nvme_dbg_evt_class_format)); + __u8 *pdata = (__u8 *) pnvme_event + sizeof(struct nvme_ocp_nvme_dbg_evt_class_format); + char description_str[256] = ""; + + parse_ocp_telemetry_string_log(0, pnvme_event->vu_event_identifier, + pevent_descriptor->debug_event_class_type, VU_EVENT_STRING, + description_str); + + if (pevent_fifos_object != NULL) { + json_add_formatted_var_size_str(pevent_descriptor_obj, STR_CLASS_SPECIFIC_DATA, + pnvme_event->nvmeDebugEventData, DATA_SIZE_8); + json_add_formatted_u32_str(pevent_descriptor_obj, STR_VU_EVENT_ID_STRING, + vu_event_id); + json_object_add_value_string(pevent_descriptor_obj, STR_VU_EVENT_STRING, + description_str); + json_add_formatted_var_size_str(pevent_descriptor_obj, STR_VU_DATA, pdata, + data_size); + } else { + if (fp) { + print_formatted_var_size_str(STR_CLASS_SPECIFIC_DATA, + pnvme_event->nvmeDebugEventData, DATA_SIZE_8, fp); + fprintf(fp, "%s: 0x%x\n", STR_VU_EVENT_ID_STRING, vu_event_id); + fprintf(fp, "%s: %s\n", STR_VU_EVENT_STRING, description_str); + print_formatted_var_size_str(STR_VU_DATA, pdata, data_size, fp); + } else { + print_formatted_var_size_str(STR_CLASS_SPECIFIC_DATA, + pnvme_event->nvmeDebugEventData, DATA_SIZE_8, fp); + printf("%s: 0x%x\n", STR_VU_EVENT_ID_STRING, vu_event_id); + printf("%s: %s\n", STR_VU_EVENT_STRING, description_str); + print_formatted_var_size_str(STR_VU_DATA, pdata, data_size, fp); + } + } +} + +void parse_common_event(struct nvme_ocp_telemetry_event_descriptor *pevent_descriptor, + struct json_object *pevent_descriptor_obj, __u8 *pevent_specific_data, + struct json_object *pevent_fifos_object, FILE *fp) +{ + struct nvme_ocp_common_dbg_evt_class_format *pcommon_debug_event = + (struct nvme_ocp_common_dbg_evt_class_format *) pevent_specific_data; + int vu_event_id = (int) pcommon_debug_event->vu_event_identifier; + unsigned int data_size = ((pevent_descriptor->event_data_size * + SIZE_OF_DWORD) - sizeof(struct nvme_ocp_common_dbg_evt_class_format)); + __u8 *pdata = (__u8 *) pcommon_debug_event + + sizeof(struct nvme_ocp_common_dbg_evt_class_format); + char description_str[256] = ""; + + parse_ocp_telemetry_string_log(0, pcommon_debug_event->vu_event_identifier, + pevent_descriptor->debug_event_class_type, VU_EVENT_STRING, description_str); + + if (pevent_fifos_object != NULL) { + json_add_formatted_u32_str(pevent_descriptor_obj, STR_VU_EVENT_ID_STRING, + vu_event_id); + json_object_add_value_string(pevent_descriptor_obj, STR_VU_EVENT_STRING, + description_str); + json_add_formatted_var_size_str(pevent_descriptor_obj, STR_VU_DATA, pdata, + data_size); + } else { + if (fp) { + fprintf(fp, "%s: 0x%x\n", STR_VU_EVENT_ID_STRING, vu_event_id); + fprintf(fp, "%s: %s\n", STR_VU_EVENT_STRING, description_str); + print_formatted_var_size_str(STR_VU_DATA, pdata, data_size, fp); + } else { + printf("%s: 0x%x\n", STR_VU_EVENT_ID_STRING, vu_event_id); + printf("%s: %s\n", STR_VU_EVENT_STRING, description_str); + print_formatted_var_size_str(STR_VU_DATA, pdata, data_size, fp); + } + } +} + +void parse_media_wear_event(struct nvme_ocp_telemetry_event_descriptor *pevent_descriptor, + struct json_object *pevent_descriptor_obj, __u8 *pevent_specific_data, + struct json_object *pevent_fifos_object, FILE *fp) +{ + struct nvme_ocp_media_wear_dbg_evt_class_format *pmedia_wear_event = + (struct nvme_ocp_media_wear_dbg_evt_class_format *) pevent_specific_data; + int vu_event_id = (int) pmedia_wear_event->vu_event_identifier; + unsigned int data_size = ((pevent_descriptor->event_data_size * SIZE_OF_DWORD) - + sizeof(struct nvme_ocp_media_wear_dbg_evt_class_format)); + __u8 *pdata = (__u8 *) pmedia_wear_event + + sizeof(struct nvme_ocp_media_wear_dbg_evt_class_format); + char description_str[256] = ""; + + parse_ocp_telemetry_string_log(0, pmedia_wear_event->vu_event_identifier, + pevent_descriptor->debug_event_class_type, VU_EVENT_STRING, + description_str); + + if (pevent_fifos_object != NULL) { + json_add_formatted_var_size_str(pevent_descriptor_obj, STR_CLASS_SPECIFIC_DATA, + pmedia_wear_event->currentMediaWear, DATA_SIZE_12); + json_add_formatted_u32_str(pevent_descriptor_obj, STR_VU_EVENT_ID_STRING, + vu_event_id); + json_object_add_value_string(pevent_descriptor_obj, STR_VU_EVENT_STRING, + description_str); + json_add_formatted_var_size_str(pevent_descriptor_obj, STR_VU_DATA, pdata, + data_size); + } else { + if (fp) { + print_formatted_var_size_str(STR_CLASS_SPECIFIC_DATA, + pmedia_wear_event->currentMediaWear, DATA_SIZE_12, fp); + fprintf(fp, "%s: 0x%x\n", STR_VU_EVENT_ID_STRING, vu_event_id); + fprintf(fp, "%s: %s\n", STR_VU_EVENT_STRING, description_str); + print_formatted_var_size_str(STR_VU_DATA, pdata, data_size, fp); + } else { + print_formatted_var_size_str(STR_CLASS_SPECIFIC_DATA, + pmedia_wear_event->currentMediaWear, DATA_SIZE_12, NULL); + printf("%s: 0x%x\n", STR_VU_EVENT_ID_STRING, vu_event_id); + printf("%s: %s\n", STR_VU_EVENT_STRING, description_str); + print_formatted_var_size_str(STR_VU_DATA, pdata, data_size, fp); + } + } +} + +int parse_event_fifo(unsigned int fifo_num, unsigned char *pfifo_start, + struct json_object *pevent_fifos_object, unsigned char *pstring_buffer, + struct nvme_ocp_telemetry_offsets *poffsets, __u64 fifo_size, FILE *fp) +{ + if (NULL == pfifo_start || NULL == poffsets) { + nvme_show_error("Input buffer was NULL"); + return -1; + } + + int status = 0; + unsigned int event_fifo_number = fifo_num + 1; + char *description = (char *)malloc((40 + 1) * sizeof(char)); + + memset(description, 0, sizeof(40)); + + status = + parse_ocp_telemetry_string_log(event_fifo_number, 0, 0, EVENT_STRING, description); + + if (status != 0) { + nvme_show_error("Failed to get C9 String. status: %d\n", status); + return -1; + } + + char event_fifo_name[100] = {0}; + + snprintf(event_fifo_name, sizeof(event_fifo_name), "%s%d%s%s", "EVENT FIFO ", + event_fifo_number, " - ", description); + + struct json_object *pevent_fifo_array = NULL; + + if (pevent_fifos_object != NULL) + pevent_fifo_array = json_create_array(); + else { + char buffer[1024] = {0}; + + sprintf(buffer, "%s%s\n%s", STR_LINE, event_fifo_name, STR_LINE); + if (fp) + fprintf(fp, "%s", buffer); + else + printf("%s", buffer); + } + + int offset_to_move = 0; + unsigned int event_des_size = sizeof(struct nvme_ocp_telemetry_event_descriptor); + + while ((fifo_size > 0) && (offset_to_move < fifo_size)) { + struct nvme_ocp_telemetry_event_descriptor *pevent_descriptor = + (struct nvme_ocp_telemetry_event_descriptor *) + (pfifo_start + offset_to_move); + + if (pevent_descriptor != NULL && pevent_descriptor->event_data_size >= 0) { + //Data is present in the form of DWORDS, So multiplying with sizeof(DWORD) + unsigned int data_size = pevent_descriptor->event_data_size * + SIZE_OF_DWORD; + + __u8 *pevent_specific_data = (__u8 *)pevent_descriptor + event_des_size; + + char description_str[256] = ""; + + parse_ocp_telemetry_string_log(0, pevent_descriptor->event_id, + pevent_descriptor->debug_event_class_type, EVENT_STRING, + description_str); + + struct json_object *pevent_descriptor_obj = + ((pevent_fifos_object != NULL)?json_create_object():NULL); + + if (pevent_descriptor_obj != NULL) { + json_add_formatted_u32_str(pevent_descriptor_obj, + STR_DBG_EVENT_CLASS_TYPE, + pevent_descriptor->debug_event_class_type); + json_add_formatted_u32_str(pevent_descriptor_obj, + STR_EVENT_IDENTIFIER, pevent_descriptor->event_id); + json_object_add_value_string(pevent_descriptor_obj, + STR_EVENT_STRING, description_str); + json_add_formatted_u32_str(pevent_descriptor_obj, + STR_EVENT_DATA_SIZE, pevent_descriptor->event_data_size); + + if (pevent_descriptor->debug_event_class_type >= 0x80) + json_add_formatted_var_size_str(pevent_descriptor_obj, + STR_VU_DATA, pevent_specific_data, data_size); + } else { + if (fp) { + fprintf(fp, "%s: 0x%x\n", STR_DBG_EVENT_CLASS_TYPE, + pevent_descriptor->debug_event_class_type); + fprintf(fp, "%s: 0x%x\n", STR_EVENT_IDENTIFIER, + pevent_descriptor->event_id); + fprintf(fp, "%s: %s\n", STR_EVENT_STRING, description_str); + fprintf(fp, "%s: 0x%x\n", STR_EVENT_DATA_SIZE, + pevent_descriptor->event_data_size); + } else { + printf("%s: 0x%x\n", STR_DBG_EVENT_CLASS_TYPE, + pevent_descriptor->debug_event_class_type); + printf("%s: 0x%x\n", STR_EVENT_IDENTIFIER, + pevent_descriptor->event_id); + printf("%s: %s\n", STR_EVENT_STRING, description_str); + printf("%s: 0x%x\n", STR_EVENT_DATA_SIZE, + pevent_descriptor->event_data_size); + } + + if (pevent_descriptor->debug_event_class_type >= 0x80) + print_formatted_var_size_str(STR_VU_DATA, + pevent_specific_data, data_size, fp); + } + + switch (pevent_descriptor->debug_event_class_type) { + case TIME_STAMP_CLASS_TYPE: + parse_time_stamp_event(pevent_descriptor, pevent_descriptor_obj, + pevent_specific_data, pevent_fifos_object, fp); + break; + case PCIE_CLASS_TYPE: + parse_pcie_event(pevent_descriptor, pevent_descriptor_obj, + pevent_specific_data, pevent_fifos_object, fp); + break; + case NVME_CLASS_TYPE: + parse_nvme_event(pevent_descriptor, pevent_descriptor_obj, + pevent_specific_data, pevent_fifos_object, fp); + break; + case RESET_CLASS_TYPE: + case BOOT_SEQUENCE_CLASS_TYPE: + case FIRMWARE_ASSERT_CLASS_TYPE: + case TEMPERATURE_CLASS_TYPE: + case MEDIA_CLASS_TYPE: + parse_common_event(pevent_descriptor, pevent_descriptor_obj, + pevent_specific_data, pevent_fifos_object, fp); + break; + case MEDIA_WEAR_CLASS_TYPE: + parse_media_wear_event(pevent_descriptor, pevent_descriptor_obj, + pevent_specific_data, pevent_fifos_object, fp); + break; + case STATISTIC_SNAPSHOT_CLASS_TYPE: { + struct nvme_ocp_statistic_snapshot_evt_class_format + *pStaticSnapshotEvent = + (struct nvme_ocp_statistic_snapshot_evt_class_format *) + pevent_specific_data; + struct nvme_ocp_telemetry_statistic_descriptor *pstatistic_entry = + (struct nvme_ocp_telemetry_statistic_descriptor *) + (&pStaticSnapshotEvent->statisticDescriptorData); + + parse_statistic(pstatistic_entry, pevent_descriptor_obj, fp); + break; + } + case RESERVED_CLASS_TYPE: + default: + break; + } + + if (pevent_descriptor_obj != NULL && pevent_fifo_array != NULL) + json_array_add_value_object(pevent_fifo_array, pevent_descriptor_obj); + else { + if (fp) + fprintf(fp, STR_LINE2); + else + printf(STR_LINE2); + } + } else + break; + + offset_to_move += (pevent_descriptor->event_data_size * SIZE_OF_DWORD + event_des_size); + } + + if (pevent_fifos_object != NULL && pevent_fifo_array != NULL) + json_object_add_value_array(pevent_fifos_object, event_fifo_name, + pevent_fifo_array); + + free(description); + return 0; +} + +int parse_event_fifos(struct json_object *root, struct nvme_ocp_telemetry_offsets *poffsets, + FILE *fp) +{ + if (poffsets == NULL) { + nvme_show_error("Input buffer was NULL"); + return -1; + } + + struct json_object *pevent_fifos_object = NULL; + + if (root != NULL) + pevent_fifos_object = json_create_object(); + + __u8 *pda1_header_offset = ptelemetry_buffer + poffsets->da1_start_offset;//512 + __u8 *pda2_offset = ptelemetry_buffer + poffsets->da2_start_offset; + struct nvme_ocp_header_in_da1 *pda1_header = (struct nvme_ocp_header_in_da1 *) + pda1_header_offset; + struct nvme_ocp_event_fifo_data event_fifo[MAX_NUM_FIFOS]; + + for (int fifo_num = 0; fifo_num < MAX_NUM_FIFOS; fifo_num++) { + event_fifo[fifo_num].event_fifo_num = fifo_num; + event_fifo[fifo_num].event_fifo_da = pda1_header->event_fifo_da[fifo_num]; + event_fifo[fifo_num].event_fifo_start = + pda1_header->fifo_offsets[fifo_num].event_fifo_start; + event_fifo[fifo_num].event_fifo_size = + pda1_header->fifo_offsets[fifo_num].event_fifo_size; + } + + //Parse all the FIFOs DA wise + for (int fifo_no = 0; fifo_no < MAX_NUM_FIFOS; fifo_no++) { + if (event_fifo[fifo_no].event_fifo_da == poffsets->data_area) { + __u64 fifo_offset = + (event_fifo[fifo_no].event_fifo_start * SIZE_OF_DWORD); + __u64 fifo_size = + (event_fifo[fifo_no].event_fifo_size * SIZE_OF_DWORD); + __u8 *pfifo_start = NULL; + + if (event_fifo[fifo_no].event_fifo_da == 1) + pfifo_start = pda1_header_offset + fifo_offset; + else if (event_fifo[fifo_no].event_fifo_da == 2) + pfifo_start = pda2_offset + fifo_offset; + else { + nvme_show_error("Unsupported Data Area:[%d]", poffsets->data_area); + return -1; + } + + int status = parse_event_fifo(fifo_no, pfifo_start, pevent_fifos_object, + pstring_buffer, poffsets, fifo_size, fp); + + if (status != 0) { + nvme_show_error("Failed to parse Event FIFO. status:%d\n", status); + return -1; + } + } + } + + if (pevent_fifos_object != NULL && root != NULL) { + const char *data_area = (poffsets->data_area == 1 ? STR_DA_1_EVENT_FIFO_INFO : + STR_DA_2_EVENT_FIFO_INFO); + + json_object_add_value_array(root, data_area, pevent_fifos_object); + } + + return 0; +} + +int parse_statistic(struct nvme_ocp_telemetry_statistic_descriptor *pstatistic_entry, + struct json_object *pstats_array, FILE *fp) +{ + if (pstatistic_entry == NULL) { + nvme_show_error("Input buffer was NULL"); + return -1; + } + + unsigned int data_size = pstatistic_entry->statistic_data_size * SIZE_OF_DWORD; + __u8 *pdata = (__u8 *)pstatistic_entry + + sizeof(struct nvme_ocp_telemetry_statistic_descriptor); + char description_str[256] = ""; + + parse_ocp_telemetry_string_log(0, pstatistic_entry->statistic_id, 0, + STATISTICS_IDENTIFIER_STRING, description_str); + + if (pstats_array != NULL) { + struct json_object *pstatistics_object = json_create_object(); + + json_add_formatted_u32_str(pstatistics_object, STR_STATISTICS_IDENTIFIER, + pstatistic_entry->statistic_id); + json_object_add_value_string(pstatistics_object, STR_STATISTICS_IDENTIFIER_STR, + description_str); + json_add_formatted_u32_str(pstatistics_object, + STR_STATISTICS_INFO_BEHAVIOUR_TYPE, + pstatistic_entry->statistic_info_behaviour_type); + json_add_formatted_u32_str(pstatistics_object, STR_STATISTICS_INFO_RESERVED, + pstatistic_entry->statistic_info_reserved); + json_add_formatted_u32_str(pstatistics_object, STR_NAMESPACE_IDENTIFIER, + pstatistic_entry->ns_info_nsid); + json_add_formatted_u32_str(pstatistics_object, STR_NAMESPACE_INFO_VALID, + pstatistic_entry->ns_info_ns_info_valid); + json_add_formatted_u32_str(pstatistics_object, STR_STATISTICS_DATA_SIZE, + pstatistic_entry->statistic_data_size); + json_add_formatted_u32_str(pstatistics_object, STR_RESERVED, + pstatistic_entry->reserved); + json_add_formatted_var_size_str(pstatistics_object, STR_STATISTICS_SPECIFIC_DATA, + pdata, data_size); + + if (pstatistics_object != NULL) + json_array_add_value_object(pstats_array, pstatistics_object); + } else { + if (fp) { + fprintf(fp, "%s: 0x%x\n", STR_STATISTICS_IDENTIFIER, + pstatistic_entry->statistic_id); + fprintf(fp, "%s: %s\n", STR_STATISTICS_IDENTIFIER_STR, description_str); + fprintf(fp, "%s: 0x%x\n", STR_STATISTICS_INFO_BEHAVIOUR_TYPE, + pstatistic_entry->statistic_info_behaviour_type); + fprintf(fp, "%s: 0x%x\n", STR_STATISTICS_INFO_RESERVED, + pstatistic_entry->statistic_info_reserved); + fprintf(fp, "%s: 0x%x\n", STR_NAMESPACE_IDENTIFIER, + pstatistic_entry->ns_info_nsid); + fprintf(fp, "%s: 0x%x\n", STR_NAMESPACE_INFO_VALID, + pstatistic_entry->ns_info_ns_info_valid); + fprintf(fp, "%s: 0x%x\n", STR_STATISTICS_DATA_SIZE, + pstatistic_entry->statistic_data_size); + fprintf(fp, "%s: 0x%x\n", STR_RESERVED, pstatistic_entry->reserved); + print_formatted_var_size_str(STR_STATISTICS_SPECIFIC_DATA, pdata, + data_size, fp); + fprintf(fp, STR_LINE2); + } else { + printf("%s: 0x%x\n", STR_STATISTICS_IDENTIFIER, + pstatistic_entry->statistic_id); + printf("%s: %s\n", STR_STATISTICS_IDENTIFIER_STR, description_str); + printf("%s: 0x%x\n", STR_STATISTICS_INFO_BEHAVIOUR_TYPE, + pstatistic_entry->statistic_info_behaviour_type); + printf("%s: 0x%x\n", STR_STATISTICS_INFO_RESERVED, + pstatistic_entry->statistic_info_reserved); + printf("%s: 0x%x\n", STR_NAMESPACE_IDENTIFIER, + pstatistic_entry->ns_info_nsid); + printf("%s: 0x%x\n", STR_NAMESPACE_INFO_VALID, + pstatistic_entry->ns_info_ns_info_valid); + printf("%s: 0x%x\n", STR_STATISTICS_DATA_SIZE, + pstatistic_entry->statistic_data_size); + printf("%s: 0x%x\n", STR_RESERVED, pstatistic_entry->reserved); + print_formatted_var_size_str(STR_STATISTICS_SPECIFIC_DATA, pdata, + data_size, fp); + printf(STR_LINE2); + } + } + + return 0; +} + +int parse_statistics(struct json_object *root, struct nvme_ocp_telemetry_offsets *poffsets, + FILE *fp) +{ + if (poffsets == NULL) { + nvme_show_error("Input buffer was NULL"); + return -1; + } + + __u8 *pda1_ocp_header_offset = ptelemetry_buffer + poffsets->header_size;//512 + __u32 statistics_size = 0; + __u32 stats_da_1_start_dw = 0, stats_da_1_size_dw = 0; + __u32 stats_da_2_start_dw = 0, stats_da_2_size_dw = 0; + __u8 *pstats_offset = NULL; + + if (poffsets->data_area == 1) { + __u32 stats_da_1_start = *(__u32 *)(pda1_ocp_header_offset + + offsetof(struct nvme_ocp_header_in_da1, da1_statistic_start)); + __u32 stats_da_1_size = *(__u32 *)(pda1_ocp_header_offset + + offsetof(struct nvme_ocp_header_in_da1, da1_statistic_size)); + + //Data is present in the form of DWORDS, So multiplying with sizeof(DWORD) + stats_da_1_start_dw = (stats_da_1_start * SIZE_OF_DWORD); + stats_da_1_size_dw = (stats_da_1_size * SIZE_OF_DWORD); + + pstats_offset = pda1_ocp_header_offset + stats_da_1_start_dw; + statistics_size = stats_da_1_size_dw; + } else if (poffsets->data_area == 2) { + __u32 stats_da_2_start = *(__u32 *)(pda1_ocp_header_offset + + offsetof(struct nvme_ocp_header_in_da1, da2_statistic_start)); + __u32 stats_da_2_size = *(__u32 *)(pda1_ocp_header_offset + + offsetof(struct nvme_ocp_header_in_da1, da2_statistic_size)); + + stats_da_2_start_dw = (stats_da_2_start * SIZE_OF_DWORD); + stats_da_2_size_dw = (stats_da_2_size * SIZE_OF_DWORD); + + pstats_offset = pda1_ocp_header_offset + poffsets->da1_size + stats_da_2_start_dw; + statistics_size = stats_da_2_size_dw; + } else { + nvme_show_error("Unsupported Data Area:[%d]", poffsets->data_area); + return -1; + } + + struct json_object *pstats_array = ((root != NULL) ? json_create_array() : NULL); + + __u32 stat_des_size = sizeof(struct nvme_ocp_telemetry_statistic_descriptor);//8 + __u32 offset_to_move = 0; + + while (((statistics_size > 0) && (offset_to_move < statistics_size))) { + struct nvme_ocp_telemetry_statistic_descriptor *pstatistic_entry = + (struct nvme_ocp_telemetry_statistic_descriptor *) + (pstats_offset + offset_to_move); + + parse_statistic(pstatistic_entry, pstats_array, fp); + offset_to_move += (pstatistic_entry->statistic_data_size * SIZE_OF_DWORD + + stat_des_size); + } + + if (root != NULL && pstats_array != NULL) { + const char *pdata_area = + (poffsets->data_area == 1 ? STR_DA_1_STATS : STR_DA_2_STATS); + + json_object_add_value_array(root, pdata_area, pstats_array); + } + + return 0; +} + +int print_ocp_telemetry_normal(struct ocp_telemetry_parse_options *options) +{ + int status = 0; + + if (options->output_file != NULL) { + FILE *fp = fopen(options->output_file, "w"); + + if (fp) { + fprintf(fp, STR_LINE); + fprintf(fp, "%s\n", STR_LOG_PAGE_HEADER); + fprintf(fp, STR_LINE); + if (!strcmp(options->telemetry_type, "host")) + generic_structure_parser(ptelemetry_buffer, host_log_page_header, + ARRAY_SIZE(host_log_page_header), NULL, 0, fp); + else if (!strcmp(options->telemetry_type, "controller")) + generic_structure_parser(ptelemetry_buffer, + controller_log_page_header, + ARRAY_SIZE(controller_log_page_header), NULL, 0, fp); + fprintf(fp, STR_LINE); + fprintf(fp, "%s\n", STR_REASON_IDENTIFIER); + fprintf(fp, STR_LINE); + __u8 *preason_identifier_offset = ptelemetry_buffer + + offsetof(struct nvme_ocp_telemetry_host_initiated_header, + reason_id); + + generic_structure_parser(preason_identifier_offset, reason_identifier, + ARRAY_SIZE(reason_identifier), NULL, 0, fp); + + fprintf(fp, STR_LINE); + fprintf(fp, "%s\n", STR_TELEMETRY_HOST_DATA_BLOCK_1); + fprintf(fp, STR_LINE); + + //Set DA to 1 and get offsets + struct nvme_ocp_telemetry_offsets offsets = { 0 }; + + offsets.data_area = 1;// Default DA - DA1 + + struct nvme_ocp_telemetry_common_header *ptelemetry_common_header = + (struct nvme_ocp_telemetry_common_header *) ptelemetry_buffer; + + get_telemetry_das_offset_and_size(ptelemetry_common_header, &offsets); + + __u8 *pda1_header_offset = ptelemetry_buffer + + offsets.da1_start_offset;//512 + + generic_structure_parser(pda1_header_offset, ocp_header_in_da1, + ARRAY_SIZE(ocp_header_in_da1), NULL, 0, fp); + + fprintf(fp, STR_LINE); + fprintf(fp, "%s\n", STR_SMART_HEALTH_INFO); + fprintf(fp, STR_LINE); + __u8 *pda1_smart_offset = pda1_header_offset + + offsetof(struct nvme_ocp_header_in_da1, smart_health_info); + //512+512 =1024 + + generic_structure_parser(pda1_smart_offset, smart, ARRAY_SIZE(smart), + NULL, 0, fp); + + fprintf(fp, STR_LINE); + fprintf(fp, "%s\n", STR_SMART_HEALTH_INTO_EXTENDED); + fprintf(fp, STR_LINE); + __u8 *pda1_smart_ext_offset = pda1_header_offset + + offsetof(struct nvme_ocp_header_in_da1, + smart_health_info_extended); + + generic_structure_parser(pda1_smart_ext_offset, smart_extended, + ARRAY_SIZE(smart_extended), NULL, 0, fp); + + fprintf(fp, STR_LINE); + fprintf(fp, "%s\n", STR_DA_1_STATS); + fprintf(fp, STR_LINE); + + status = parse_statistics(NULL, &offsets, fp); + if (status != 0) { + nvme_show_error("status: %d\n", status); + return -1; + } + + fprintf(fp, STR_LINE); + fprintf(fp, "%s\n", STR_DA_1_EVENT_FIFO_INFO); + fprintf(fp, STR_LINE); + status = parse_event_fifos(NULL, &offsets, fp); + if (status != 0) { + nvme_show_error("status: %d\n", status); + return -1; + } + + //Set the DA to 2 + if (options->data_area == 2) { + offsets.data_area = 2; + fprintf(fp, STR_LINE); + fprintf(fp, "%s\n", STR_DA_2_STATS); + fprintf(fp, STR_LINE); + status = parse_statistics(NULL, &offsets, fp); + + if (status != 0) { + nvme_show_error("status: %d\n", status); + return -1; + } + + fprintf(fp, STR_LINE); + fprintf(fp, "%s\n", STR_DA_2_EVENT_FIFO_INFO); + fprintf(fp, STR_LINE); + status = parse_event_fifos(NULL, &offsets, fp); + if (status != 0) { + nvme_show_error("status: %d\n", status); + return -1; + } + } + + fprintf(fp, STR_LINE); + fclose(fp); + } else { + nvme_show_error("Failed to open %s file.\n", options->output_file); + return -1; + } + } else { + printf(STR_LINE); + printf("%s\n", STR_LOG_PAGE_HEADER); + printf(STR_LINE); + if (!strcmp(options->telemetry_type, "host")) + generic_structure_parser(ptelemetry_buffer, host_log_page_header, + ARRAY_SIZE(host_log_page_header), NULL, 0, NULL); + else if (!strcmp(options->telemetry_type, "controller")) + generic_structure_parser(ptelemetry_buffer, controller_log_page_header, + ARRAY_SIZE(controller_log_page_header), NULL, 0, NULL); + + printf(STR_LINE); + printf("%s\n", STR_REASON_IDENTIFIER); + printf(STR_LINE); + __u8 *preason_identifier_offset = ptelemetry_buffer + + offsetof(struct nvme_ocp_telemetry_host_initiated_header, reason_id); + generic_structure_parser(preason_identifier_offset, reason_identifier, + ARRAY_SIZE(reason_identifier), NULL, 0, NULL); + + printf(STR_LINE); + printf("%s\n", STR_TELEMETRY_HOST_DATA_BLOCK_1); + printf(STR_LINE); + + //Set DA to 1 and get offsets + struct nvme_ocp_telemetry_offsets offsets = { 0 }; + + offsets.data_area = 1; + + struct nvme_ocp_telemetry_common_header *ptelemetry_common_header = + (struct nvme_ocp_telemetry_common_header *) ptelemetry_buffer; + + get_telemetry_das_offset_and_size(ptelemetry_common_header, &offsets); + + __u8 *pda1_header_offset = ptelemetry_buffer + offsets.da1_start_offset;//512 + + generic_structure_parser(pda1_header_offset, ocp_header_in_da1, + ARRAY_SIZE(ocp_header_in_da1), NULL, 0, NULL); + + printf(STR_LINE); + printf("%s\n", STR_SMART_HEALTH_INFO); + printf(STR_LINE); + __u8 *pda1_smart_offset = pda1_header_offset + + offsetof(struct nvme_ocp_header_in_da1, smart_health_info); + + generic_structure_parser(pda1_smart_offset, smart, ARRAY_SIZE(smart), NULL, 0, + NULL); + + printf(STR_LINE); + printf("%s\n", STR_SMART_HEALTH_INTO_EXTENDED); + printf(STR_LINE); + __u8 *pda1_smart_ext_offset = pda1_header_offset + + offsetof(struct nvme_ocp_header_in_da1, smart_health_info_extended); + + generic_structure_parser(pda1_smart_ext_offset, smart_extended, + ARRAY_SIZE(smart_extended), NULL, 0, NULL); + + printf(STR_LINE); + printf("%s\n", STR_DA_1_STATS); + printf(STR_LINE); + status = parse_statistics(NULL, &offsets, NULL); + if (status != 0) { + nvme_show_error("status: %d\n", status); + return -1; + } + + printf(STR_LINE); + printf("%s\n", STR_DA_1_EVENT_FIFO_INFO); + printf(STR_LINE); + status = parse_event_fifos(NULL, &offsets, NULL); + if (status != 0) { + nvme_show_error("status: %d\n", status); + return -1; + } + + //Set the DA to 2 + if (options->data_area == 2) { + offsets.data_area = 2; + printf(STR_LINE); + printf("%s\n", STR_DA_2_STATS); + printf(STR_LINE); + status = parse_statistics(NULL, &offsets, NULL); + if (status != 0) { + nvme_show_error("status: %d\n", status); + return -1; + } + + printf(STR_LINE); + printf("%s\n", STR_DA_2_EVENT_FIFO_INFO); + printf(STR_LINE); + status = parse_event_fifos(NULL, &offsets, NULL); + if (status != 0) { + nvme_show_error("status: %d\n", status); + return -1; + } + } + + printf(STR_LINE); + } + + return status; +} + +int print_ocp_telemetry_json(struct ocp_telemetry_parse_options *options) +{ + int status = 0; + + //create json objects + struct json_object *root, *pheader, *preason_identifier, *da1_header, *smart_obj, + *ext_smart_obj; + + root = json_create_object(); + + //Add data to root json object + + //"Log Page Header" + pheader = json_create_object(); + + generic_structure_parser(ptelemetry_buffer, host_log_page_header, + ARRAY_SIZE(host_log_page_header), pheader, 0, NULL); + json_object_add_value_object(root, STR_LOG_PAGE_HEADER, pheader); + + //"Reason Identifier" + preason_identifier = json_create_object(); + + __u8 *preason_identifier_offset = ptelemetry_buffer + + offsetof(struct nvme_ocp_telemetry_host_initiated_header, reason_id); + + generic_structure_parser(preason_identifier_offset, reason_identifier, + ARRAY_SIZE(reason_identifier), preason_identifier, 0, NULL); + json_object_add_value_object(pheader, STR_REASON_IDENTIFIER, preason_identifier); + + struct nvme_ocp_telemetry_offsets offsets = { 0 }; + + //Set DA to 1 and get offsets + offsets.data_area = 1; + struct nvme_ocp_telemetry_common_header *ptelemetry_common_header = + (struct nvme_ocp_telemetry_common_header *) ptelemetry_buffer; + + get_telemetry_das_offset_and_size(ptelemetry_common_header, &offsets); + + //"Telemetry Host-Initiated Data Block 1" + __u8 *pda1_header_offset = ptelemetry_buffer + offsets.da1_start_offset;//512 + + da1_header = json_create_object(); + + generic_structure_parser(pda1_header_offset, ocp_header_in_da1, + ARRAY_SIZE(ocp_header_in_da1), da1_header, 0, NULL); + json_object_add_value_object(root, STR_TELEMETRY_HOST_DATA_BLOCK_1, da1_header); + + //"SMART / Health Information Log(LID-02h)" + __u8 *pda1_smart_offset = pda1_header_offset + offsetof(struct nvme_ocp_header_in_da1, + smart_health_info); + smart_obj = json_create_object(); + + generic_structure_parser(pda1_smart_offset, smart, ARRAY_SIZE(smart), smart_obj, 0, NULL); + json_object_add_value_object(da1_header, STR_SMART_HEALTH_INFO, smart_obj); + + //"SMART / Health Information Extended(LID-C0h)" + __u8 *pda1_smart_ext_offset = pda1_header_offset + offsetof(struct nvme_ocp_header_in_da1, + smart_health_info_extended); + ext_smart_obj = json_create_object(); + + generic_structure_parser(pda1_smart_ext_offset, smart_extended, ARRAY_SIZE(smart_extended), + ext_smart_obj, 0, NULL); + json_object_add_value_object(da1_header, STR_SMART_HEALTH_INTO_EXTENDED, ext_smart_obj); + + //Data Area 1 Statistics + status = parse_statistics(root, &offsets, NULL); + if (status != 0) { + nvme_show_error("status: %d\n", status); + return -1; + } + + //Data Area 1 Event FIFOs + status = parse_event_fifos(root, &offsets, NULL); + if (status != 0) { + nvme_show_error("status: %d\n", status, NULL); + return -1; + } + + if (options->data_area == 2) { + //Set the DA to 2 + offsets.data_area = 2; + //Data Area 2 Statistics + status = parse_statistics(root, &offsets, NULL); + if (status != 0) { + nvme_show_error("status: %d\n", status); + return -1; + } + + //Data Area 2 Event FIFOs + status = parse_event_fifos(root, &offsets, NULL); + if (status != 0) { + nvme_show_error("status: %d\n", status); + return -1; + } + } + + if (options->output_file != NULL) { + const char *json_string = json_object_to_json_string(root); + FILE *fp = fopen(options->output_file, "w"); + + if (fp) { + fputs(json_string, fp); + fclose(fp); + } else { + nvme_show_error("Failed to open %s file.\n", options->output_file); + return -1; + } + } else { + //Print root json object + json_print_object(root, NULL); + nvme_show_result("\n"); + json_free_object(root); + } + + return status; +} diff --git a/plugins/ocp/ocp-telemetry-decode.h b/plugins/ocp/ocp-telemetry-decode.h index 312c41db57..ed31a6c91f 100644 --- a/plugins/ocp/ocp-telemetry-decode.h +++ b/plugins/ocp/ocp-telemetry-decode.h @@ -4,6 +4,14 @@ * Authors: Jeff Lien , */ +#include "nvme.h" +#include "nvme-print.h" +#include "util/utils.h" +#include "common.h" + +extern __u8 *ptelemetry_buffer; +extern __u8 *pstring_buffer; + /***************************************************************************** * Telemetry Statistics ID's and Strings *****************************************************************************/ @@ -411,6 +419,524 @@ struct telemetry_data_area_1 { __u8 smart_health_info_extended[512]; }; +#define DATA_SIZE_12 12 +#define DATA_SIZE_8 8 +#define DATA_SIZE_4 4 +#define MAX_BUFFER_32_KB 0x8000 +#define OCP_TELEMETRY_DATA_BLOCK_SIZE 512 +#define SIZE_OF_DWORD 4 +#define MAX_NUM_FIFOS 16 +#define DA1_OFFSET 512 +#define DEFAULT_ASCII_STRING_SIZE 16 + +#define DEFAULT_TELEMETRY_BIN "telemetry.bin" +#define DEFAULT_STRING_BIN "string.bin" +#define DEFAULT_OUTPUT_FORMAT_JSON "json" + +/* C9 Telemetry String Log Format Log Page */ +#define C9_GUID_LENGTH 16 +#define C9_TELEMETRY_STRING_LOG_ENABLE_OPCODE 0xC9 +#define C9_TELEMETRY_STR_LOG_LEN 432 +#define C9_TELEMETRY_STR_LOG_SIST_OFST 431 + +#define STR_LOG_PAGE_HEADER "Log Page Header" +#define STR_REASON_IDENTIFIER "Reason Identifier" +#define STR_TELEMETRY_HOST_DATA_BLOCK_1 "Telemetry Host-Initiated Data Block 1" +#define STR_SMART_HEALTH_INFO "SMART / Health Information Log(LID-02h)" +#define STR_SMART_HEALTH_INTO_EXTENDED "SMART / Health Information Extended(LID-C0h)" +#define STR_DA_1_STATS "Data Area 1 Statistics" +#define STR_DA_2_STATS "Data Area 2 Statistics" +#define STR_DA_1_EVENT_FIFO_INFO "Data Area 1 Event FIFO info" +#define STR_DA_2_EVENT_FIFO_INFO "Data Area 2 Event FIFO info" +#define STR_STATISTICS_IDENTIFIER "Statistics Identifier" +#define STR_STATISTICS_IDENTIFIER_STR "Statistic Identifier String" +#define STR_STATISTICS_INFO_BEHAVIOUR_TYPE "Statistics Info Behavior Type" +#define STR_STATISTICS_INFO_RESERVED "Statistics Info Reserved" +#define STR_NAMESPACE_IDENTIFIER "Namespace Identifier" +#define STR_NAMESPACE_INFO_VALID "Namespace Information Valid" +#define STR_STATISTICS_DATA_SIZE "Statistic Data Size" +#define STR_RESERVED "Reserved" +#define STR_STATISTICS_SPECIFIC_DATA "Statistic Specific Data" +#define STR_CLASS_SPECIFIC_DATA "Class Specific Data" +#define STR_DBG_EVENT_CLASS_TYPE "Debug Event Class type" +#define STR_EVENT_IDENTIFIER "Event Identifier" +#define STR_EVENT_STRING "Event String" +#define STR_EVENT_DATA_SIZE "Event Data Size" +#define STR_VU_EVENT_STRING "VU Event String" +#define STR_VU_EVENT_ID_STRING "VU Event Identifier" +#define STR_VU_DATA "VU Data" +#define STR_LINE "==============================================================================\n" +#define STR_LINE2 "-----------------------------------------------------------------------------\n" + +/** + * enum ocp_telemetry_data_area - Telemetry Data Areas + * @DATA_AREA_1: Data Area 1 + * @DATA_AREA_2: Data Area 2 + * @DATA_AREA_3: Data Area 3 + * @DATA_AREA_4: Data Area 4 + */ +enum ocp_telemetry_data_area { + DATA_AREA_1 = 0x01, + DATA_AREA_2 = 0x02, + DATA_AREA_3 = 0x03, + DATA_AREA_4 = 0x04, +}; + +/** + * enum ocp_telemetry_string_tables - OCP telemetry string tables + * @STATISTICS_IDENTIFIER_STRING: Statistic Identifier string + * @EVENT_STRING: Event String + * @VU_EVENT_STRING: VU Event String + */ +enum ocp_telemetry_string_tables { + STATISTICS_IDENTIFIER_STRING = 0, + EVENT_STRING, + VU_EVENT_STRING +}; + +/** + * enum ocp_telemetry_debug_event_class_types - OCP Debug Event Class types + * @RESERVED_CLASS_TYPE: Reserved class + * @TIME_STAMP_CLASS_TYPE: Time stamp class + * @PCIE_CLASS_TYPE: PCIe class + * @NVME_CLASS_TYPE: NVME class + * @RESET_CLASS_TYPE: Reset class + * @BOOT_SEQUENCE_CLASS_TYPE: Boot Sequence class + * @FIRMWARE_ASSERT_CLASS_TYPE: Firmware Assert class + * @TEMPERATURE_CLASS_TYPE: Temperature class + * @MEDIA_CLASS_TYPE: Media class + * @MEDIA_WEAR_CLASS_TYPE: Media wear class + * @STATISTIC_SNAPSHOT_CLASS_TYPE: Statistic snapshot class + * @RESERVED: Reserved class + * @VENDOR_UNIQUE_CLASS_TYPE: Vendor Unique class + */ +enum ocp_telemetry_debug_event_class_types { + RESERVED_CLASS_TYPE = 0x00, + TIME_STAMP_CLASS_TYPE = 0x01, + PCIE_CLASS_TYPE = 0x02, + NVME_CLASS_TYPE = 0x03, + RESET_CLASS_TYPE = 0x04, + BOOT_SEQUENCE_CLASS_TYPE = 0x05, + FIRMWARE_ASSERT_CLASS_TYPE = 0x06, + TEMPERATURE_CLASS_TYPE = 0x07, + MEDIA_CLASS_TYPE = 0x08, + MEDIA_WEAR_CLASS_TYPE = 0x09, + STATISTIC_SNAPSHOT_CLASS_TYPE = 0x0A, + //RESERVED = 7Fh-0Bh, + //VENDOR_UNIQUE_CLASS_TYPE = FFh-80h, +}; + +/** + * struct telemetry_str_log_format - Telemetry String Log Format + * @log_page_version: indicates the version of the mapping this log page uses + * Shall be set to 01h. + * @reserved1: Reserved. + * @log_page_guid: Shall be set to B13A83691A8F408B9EA495940057AA44h. + * @sls: Shall be set to the number of DWORDS in the String Log. + * @reserved2: reserved. + * @sits: shall be set to the number of DWORDS in the Statistics + * Identifier String Table + * @ests: Shall be set to the number of DWORDS from byte 0 of this + * log page to the start of the Event String Table + * @estsz: shall be set to the number of DWORDS in the Event String Table + * @vu_eve_sts: Shall be set to the number of DWORDS from byte 0 of this + * log page to the start of the VU Event String Table + * @vu_eve_st_sz: shall be set to the number of DWORDS in the VU Event String Table + * @ascts: the number of DWORDS from byte 0 of this log page until the + * ASCII Table Starts. + * @asctsz: the number of DWORDS in the ASCII Table + * @fifo1: FIFO 0 ASCII String + * @fifo2: FIFO 1 ASCII String + * @fifo3: FIFO 2 ASCII String + * @fifo4: FIFO 3 ASCII String + * @fif05: FIFO 4 ASCII String + * @fifo6: FIFO 5 ASCII String + * @fifo7: FIFO 6 ASCII String + * @fifo8: FIFO 7 ASCII String + * @fifo9: FIFO 8 ASCII String + * @fifo10: FIFO 9 ASCII String + * @fif011: FIFO 10 ASCII String + * @fif012: FIFO 11 ASCII String + * @fifo13: FIFO 12 ASCII String + * @fif014: FIFO 13 ASCII String + * @fif015: FIFO 14 ASCII String + * @fif016: FIFO 15 ASCII String + * @reserved3: reserved + */ +struct __packed telemetry_str_log_format { + __u8 log_page_version; + __u8 reserved1[15]; + __u8 log_page_guid[C9_GUID_LENGTH]; + __le64 sls; + __u8 reserved2[24]; + __le64 sits; + __le64 sitsz; + __le64 ests; + __le64 estsz; + __le64 vu_eve_sts; + __le64 vu_eve_st_sz; + __le64 ascts; + __le64 asctsz; + __u8 fifo1[16]; + __u8 fifo2[16]; + __u8 fifo3[16]; + __u8 fifo4[16]; + __u8 fifo5[16]; + __u8 fifo6[16]; + __u8 fifo7[16]; + __u8 fifo8[16]; + __u8 fifo9[16]; + __u8 fifo10[16]; + __u8 fifo11[16]; + __u8 fifo12[16]; + __u8 fifo13[16]; + __u8 fifo14[16]; + __u8 fifo15[16]; + __u8 fifo16[16]; + __u8 reserved3[48]; +}; + +/* + * struct statistics_id_str_table_entry - Statistics Identifier String Table Entry + * @vs_si: Shall be set the Vendor Unique Statistic Identifier number. + * @reserved1: Reserved + * @ascii_id_len: Shall be set the number of ASCII Characters that are valid. + * @ascii_id_ofst: Shall be set to the offset from DWORD 0/Byte 0 of the Start + * of the ASCII Table to the first character of the string for + * this Statistic Identifier string.. + * @reserved2 reserved + */ +struct __packed statistics_id_str_table_entry { + __le16 vs_si; + __u8 reserved1; + __u8 ascii_id_len; + __le64 ascii_id_ofst; + __le32 reserved2; +}; + +/* + * struct event_id_str_table_entry - Event Identifier String Table Entry + * @deb_eve_class: Shall be set the Debug Class. + * @ei: Shall be set to the Event Identifier + * @ascii_id_len: Shall be set the number of ASCII Characters that are valid. + * @ascii_id_ofst: This is the offset from DWORD 0/ Byte 0 of the start of the + * ASCII table to the ASCII data for this identifier + * @reserved2 reserved + */ +struct __packed event_id_str_table_entry { + __u8 deb_eve_class; + __le16 ei; + __u8 ascii_id_len; + __le64 ascii_id_ofst; + __le32 reserved2; +}; + +/* + * struct vu_event_id_str_table_entry - VU Event Identifier String Table Entry + * @deb_eve_class: Shall be set the Debug Class. + * @vu_ei: Shall be set to the VU Event Identifier + * @ascii_id_len: Shall be set the number of ASCII Characters that are valid. + * @ascii_id_ofst: This is the offset from DWORD 0/ Byte 0 of the start of the + * ASCII table to the ASCII data for this identifier + * @reserved reserved + */ +struct __packed vu_event_id_str_table_entry { + __u8 deb_eve_class; + __le16 vu_ei; + __u8 ascii_id_len; + __le64 ascii_id_ofst; + __le32 reserved; +}; + + +struct __packed ocp_telemetry_parse_options { + char *telemetry_log; + char *string_log; + char *output_file; + char *output_format; + int data_area; + char *telemetry_type; +}; + +struct __packed nvme_ocp_telemetry_reason_id +{ + __u8 error_id[64]; // Bytes 63:00 + __u8 file_id[8]; // Bytes 71:64 + __le16 line_number; // Bytes 73:72 + __u8 valid_flags; // Bytes 74 + __u8 reserved[21]; // Bytes 95:75 + __u8 vu_reason_ext[32]; // Bytes 127:96 +}; + +struct __packed nvme_ocp_telemetry_common_header +{ + __u8 log_id; // Byte 00 + __le32 reserved1; // Bytes 04:01 + __u8 ieee_oui_id[3]; // Bytes 07:05 + __le16 da1_last_block; // Bytes 09:08 + __le16 da2_last_block; // Bytes 11:10 + __le16 da3_last_block; // Bytes 13:12 + __le16 reserved2; // Bytes 15:14 + __le32 da4_last_block; // Bytes 19:16 +}; + +struct __packed nvme_ocp_telemetry_host_initiated_header +{ + struct nvme_ocp_telemetry_common_header commonHeader; // Bytes 19:00 + __u8 reserved3[360]; // Bytes 379:20 + __u8 host_initiated_scope; // Byte 380 + __u8 host_initiated_gen_number; // Byte 381 + __u8 host_initiated_data_available; // Byte 382 + __u8 ctrl_initiated_gen_number; // Byte 383 + struct nvme_ocp_telemetry_reason_id reason_id; // Bytes 511:384 +}; + +struct __packed nvme_ocp_telemetry_controller_initiated_header +{ + struct nvme_ocp_telemetry_common_header commonHeader; // Bytes 19:00 + __u8 reserved3[361]; // Bytes 380:20 + __u8 ctrl_initiated_scope; // Byte 381 + __u8 ctrl_initiated_data_available; // Byte 382 + __u8 ctrl_initiated_gen_number; // Byte 383 + struct nvme_ocp_telemetry_reason_id reason_id; // Bytes 511:384 +}; + +struct __packed nvme_ocp_telemetry_smart +{ + __u8 critical_warning; // Byte 0 + __le16 composite_temperature; // Bytes 2:1 + __u8 available_spare; // Bytes 3 + __u8 available_spare_threshold; // Bytes 4 + __u8 percentage_used; // Bytes 5 + __u8 reserved1[26]; // Bytes 31:6 + __u8 data_units_read[16]; // Bytes 47:32 + __u8 data_units_written[16]; // Bytes 63:48 + __u8 host_read_commands[16]; // Byte 79:64 + __u8 host_write_commands[16]; // Bytes 95:80 + __u8 controller_busy_time[16]; // Bytes 111:96 + __u8 power_cycles[16]; // Bytes 127:112 + __u8 power_on_hours[16]; // Bytes 143:128 + __u8 unsafe_shutdowns[16]; // Bytes 159:144 + __u8 media_and_data_integrity_errors[16]; // Bytes 175:160 + __u8 number_of_error_information_log_entries[16]; // Bytes 191:176 + __le32 warning_composite_temperature_time; // Byte 195:192 + __le32 critical_composite_temperature_time; // Bytes 199:196 + __le16 temperature_sensor1; // Bytes 201:200 + __le16 temperature_sensor2; // Byte 203:202 + __le16 temperature_sensor3; // Byte 205:204 + __le16 temperature_sensor4; // Bytes 207:206 + __le16 temperature_sensor5; // Bytes 209:208 + __le16 temperature_sensor6; // Bytes 211:210 + __le16 temperature_sensor7; // Bytes 213:212 + __le16 temperature_sensor8; // Bytes 215:214 + __le32 thermal_management_temperature1_transition_count; // Bytes 219:216 + __le32 thermal_management_temperature2_transition_count; // Bytes 223:220 + __le32 total_time_for_thermal_management_temperature1; // Bytes 227:224 + __le32 total_time_for_thermal_management_temperature2; // Bytes 231:228 + __u8 reserved2[280]; // Bytes 511:232 +}; + +struct __packed nvme_ocp_telemetry_smart_extended +{ + __u8 physical_media_units_written[16]; // Bytes 15:0 + __u8 physical_media_units_read[16]; // Bytes 31:16 + __u8 bad_user_nand_blocks_raw_count[6]; // Bytes 37:32 + __le16 bad_user_nand_blocks_normalized_value; // Bytes 39:38 + __u8 bad_system_nand_blocks_raw_count[6]; // Bytes 45:40 + __le16 bad_system_nand_blocks_normalized_value; // Bytes 47:46 + __le64 xor_recovery_count; // Bytes 55:48 + __le64 uncorrectable_read_error_count; // Bytes 63:56 + __le64 soft_ecc_error_count; // Bytes 71:64 + __le32 end_to_end_correction_counts_detected_errors; // Bytes 75:72 + __le32 end_to_end_correction_counts_corrected_errors; // Bytes 79:76 + __u8 system_data_percent_used; // Byte 80 + __u8 refresh_counts[7]; // Bytes 87:81 + __le32 max_user_data_erase_count; // Bytes 91:88 + __le32 min_user_data_erase_count; // Bytes 95:92 + __u8 num_thermal_throttling_events; // Bytes 96 + __u8 current_throttling_status; // Bytes 97 + __u8 errata_version_field; // Byte 98 + __le16 point_version_field; // Byte 100:99 + __le16 minor_version_field; // Byte 102:101 + __u8 major_version_field; // Byte 103 + __le64 pcie_correctable_error_count; // Bytes 111:104 + __le32 incomplete_shutdowns; // Bytes 115:112 + __le32 reserved1; // Bytes 119:116 + __u8 percent_free_blocks; // Byte 120 + __u8 reserved2[7]; // Bytes 127:121 + __le16 capacitor_health; // Bytes 129:128 + __u8 nvme_base_errata_version; // Byte 130 + __u8 nvme_command_set_errata_version; // Byte 131 + __le32 reserved3; // Bytes 135:132 + __le64 unaligned_io; // Bytes 143:136 + __le64 security_version_number; // Bytes 151:144 + __le64 total_nuse; // Bytes 159:152 + __u8 plp_start_count[16]; // Bytes 175:160 + __u8 endurance_estimate[16]; // Bytes 191:176 + __le64 pcie_link_retraining_count; // Bytes 199:192 + __le64 power_state_change_count; // Bytes 207:200 + __le64 lowest_permitted_firmware_revision; // Bytes 215:208 + __u8 reserved4[278]; // Bytes 493:216 + __le16 log_page_version; // Bytes 495:494 + __u8 log_page_guid[16]; // Bytes 511:496 +}; + +struct __packed nvme_ocp_event_fifo_data +{ + __le32 event_fifo_num; + __u8 event_fifo_da; + __le64 event_fifo_start; + __le64 event_fifo_size; +}; + +struct __packed nvme_ocp_telemetry_offsets +{ + __le32 data_area; + __le32 header_size; + __le32 da1_start_offset; + __le32 da1_size; + __le32 da2_start_offset; + __le32 da2_size; + __le32 da3_start_offset; + __le32 da3_size; + __le32 da4_start_offset; + __le32 da4_size; +}; + +struct __packed nvme_ocp_event_fifo_offsets +{ + __le64 event_fifo_start; + __le64 event_fifo_size; +}; + +struct __packed nvme_ocp_header_in_da1 +{ + __le16 major_version; // Bytes 1:0 + __le16 minor_version; // Bytes 3:2 + __le32 reserved1; // Bytes 7:4 + __le64 time_stamp; // Bytes 15:8 + __u8 log_page_guid[16]; // Bytes 31:16 + __u8 num_telemetry_profiles_supported; // Byte 32 + __u8 telemetry_profile_selected; // Byte 33 + __u8 reserved2[6]; // Bytes 39:34 + __le64 string_log_size; // Bytes 47:40 + __le64 reserved3; // Bytes 55:48 + __le64 firmware_revision; // Bytes 63:56 + __u8 reserved4[32]; // Bytes 95:64 + __le64 da1_statistic_start; // Bytes 103:96 + __le64 da1_statistic_size; // Bytes 111:104 + __le64 da2_statistic_start; // Bytes 119:112 + __le64 da2_statistic_size; // Bytes 127:120 + __u8 reserved5[32]; // Bytes 159:128 + __u8 event_fifo_da[16]; // Bytes 175:160 + struct nvme_ocp_event_fifo_offsets fifo_offsets[16]; // Bytes 431:176 + __u8 reserved6[80]; // Bytes 511:432 + struct nvme_ocp_telemetry_smart smart_health_info; // Bytes 1023:512 + struct nvme_ocp_telemetry_smart_extended smart_health_info_extended; // Bytes 1535:1024 +}; + +struct __packed nvme_ocp_telemetry_statistic_descriptor +{ + __le16 statistic_id; // Bytes 1:0 + __u8 statistic_info_behaviour_type : 4; // Byte 2(3:0) + __u8 statistic_info_reserved : 4; // Byte 2(7:4) + __u8 ns_info_nsid : 7; // Bytes 3(6:0) + __u8 ns_info_ns_info_valid : 1; // Bytes 3(7) + __le16 statistic_data_size; // Bytes 5:4 + __le16 reserved; // Bytes 7:6 +}; + +struct __packed nvme_ocp_telemetry_event_descriptor +{ + __u8 debug_event_class_type; // Byte 0 + __le16 event_id; // Bytes 2:1 + __u8 event_data_size; // Byte 3 +}; + +struct __packed nvme_ocp_time_stamp_dbg_evt_class_format +{ + __u8 time_stamp[DATA_SIZE_8]; // Bytes 11:4 + __le16 vu_event_identifier; // Bytes 13:12 +}; + +struct __packed nvme_ocp_pcie_dbg_evt_class_format +{ + __u8 pCIeDebugEventData[DATA_SIZE_4]; // Bytes 7:4 + __le16 vu_event_identifier; // Bytes 9:8 +}; + +struct __packed nvme_ocp_nvme_dbg_evt_class_format +{ + __u8 nvmeDebugEventData[DATA_SIZE_8]; // Bytes 11:4 + __le16 vu_event_identifier; // Bytes 13:12 +}; + +struct __packed nvme_ocp_common_dbg_evt_class_format +{ + __le16 vu_event_identifier; // Bytes 5:4 +}; + +struct __packed nvme_ocp_media_wear_dbg_evt_class_format +{ + __u8 currentMediaWear[DATA_SIZE_12]; // Bytes 15:4 + __le16 vu_event_identifier; // Bytes 17:16 +}; + +struct __packed nvme_ocp_statistic_snapshot_evt_class_format +{ + struct nvme_ocp_telemetry_statistic_descriptor statisticDescriptorData; // Bytes 11:10 +}; + +struct __packed nvme_ocp_statistics_identifier_string_table +{ + __le16 vs_statistic_identifier; //1:0 + __u8 reserved1; //2 + __u8 ascii_id_length; //3 + __le64 ascii_id_offset; //11:4 + __le32 reserved2; //15:12 +}; + +struct __packed nvme_ocp_event_string_table +{ + __u8 debug_event_class; //0 + __le16 event_identifier; //2:1 + __u8 ascii_id_length; //3 + __le64 ascii_id_offset; //11:4 + __le32 reserved; //15:12 +}; + +struct __packed nvme_ocp_vu_event_string_table +{ + __u8 debug_event_class; //0 + __le16 vu_event_identifier; //2:1 + __u8 ascii_id_length; //3 + __le64 ascii_id_offset; //11:4 + __le32 reserved; //15:12 +}; + +struct __packed nvme_ocp_telemetry_string_header +{ + __u8 version; //0:0 + __u8 reserved1[15]; //15:1 + __u8 guid[16]; //32:16 + __le64 string_log_size; //39:32 + __u8 reserved2[24]; //63:40 + __le64 sits; //71:64 Statistics Identifier String Table Start(SITS) + __le64 sitsz; //79:72 Statistics Identifier String Table Size (SITSZ) + __le64 ests; //87:80 Event String Table Start(ESTS) + __le64 estsz; //95:88 Event String Table Size(ESTSZ) + __le64 vu_ests; //103:96 VU Event String Table Start + __le64 vu_estsz; //111:104 VU Event String Table Size + __le64 ascts; //119:112 ASCII Table start + __le64 asctsz; //127:120 ASCII Table Size + __u8 fifo_ascii_string[16][16]; //383:128 + __u8 reserved3[48]; //431:384 +}; + +struct __packed statistic_entry { + int identifier; + char *description; +}; /************************************************************ * Telemetry Parsing Function Prototypes @@ -491,3 +1017,212 @@ static inline const char *telemetry_media_wear_event_id_to_string(int event_id) { return ARGSTR(telemetry_media_wear_event_id_str, event_id); } + +/** + * @brief parse the ocp telemetry host or controller log binary file + * into json or text + * + * @param options, input pointer for inputs like telemetry log bin file, + * string log bin file and output file etc. + * + * @return 0 success + */ +int parse_ocp_telemetry_log(struct ocp_telemetry_parse_options *options); + +/** + * @brief parse the ocp telemetry string log binary file to json or text + * + * @param event_fifo_num, input event FIFO number + * @param debug_event_class, input debug event class id + * @param string_table, input string table + * @param description, input description string + * + * @return 0 success + */ +int parse_ocp_telemetry_string_log(int event_fifo_num, int identifier, int debug_event_class, + enum ocp_telemetry_string_tables string_table, char *description); + +/** + * @brief gets the telemetry datas areas, offsets and sizes information + * + * @param ptelemetry_common_header, input telemetry common header pointer + * @param ptelemetry_das_offset, input telemetry offsets pointer + * + * @return 0 success + */ +int get_telemetry_das_offset_and_size( + struct nvme_ocp_telemetry_common_header *ptelemetry_common_header, + struct nvme_ocp_telemetry_offsets *ptelemetry_das_offset); + +/** + * @brief parses statistics data to text or json formats + * + * @param root, input time json root object pointer + * @param ptelemetry_das_offset, input telemetry offsets pointer + * @param fp, input file pointer + * + * @return 0 success + */ +int parse_statistics(struct json_object *root, struct nvme_ocp_telemetry_offsets *pOffsets, + FILE *fp); + +/** + * @brief parses a single statistic data to text or json formats + * + * @param pstatistic_entry, statistic entry pointer + * @param pstats_array, stats array pointer + * @param fp, input file pointer + * + * @return 0 success + */ +int parse_statistic(struct nvme_ocp_telemetry_statistic_descriptor *pstatistic_entry, + struct json_object *pstats_array, FILE *fp); + +/** + * @brief parses event fifos data to text or json formats + * + * @param root, input time json root object pointer + * @param poffsets, input telemetry offsets pointer + * @param fp, input file pointer + * + * @return 0 success + */ +int parse_event_fifos(struct json_object *root, struct nvme_ocp_telemetry_offsets *poffsets, + FILE *fp); + +/** + * @brief parses a single event fifo data to text or json formats + * + * @param fifo_num, input event fifo number + * @param pfifo_start, event fifo start pointer + * @param pevent_fifos_object, event fifos json object pointer + * @param ptelemetry_das_offset, input telemetry offsets pointer + * @param fifo_size, input event fifo size + * @param fp, input file pointer + * + * @return 0 success + */ +int parse_event_fifo(unsigned int fifo_num, unsigned char *pfifo_start, + struct json_object *pevent_fifos_object, unsigned char *pstring_buffer, + struct nvme_ocp_telemetry_offsets *poffsets, __u64 fifo_size, FILE *fp); + +/** + * @brief parses event fifos data to text or json formats + * + * @return 0 success + */ +int print_ocp_telemetry_normal(struct ocp_telemetry_parse_options *options); + +/** + * @brief parses event fifos data to text or json formats + * + * @return 0 success + */ +int print_ocp_telemetry_json(struct ocp_telemetry_parse_options *options); + +/** + * @brief gets statistic id ascii string + * + * @param identifier, string id + * @param description, string description + * + * @return 0 success + */ +int get_static_id_ascii_string(int identifier, char *description); + +/** + * @brief gets event id ascii string + * + * @param identifier, string id + * @param debug_event_class, debug event class + * @param description, string description + * + * @return 0 success + */ +int get_event_id_ascii_string(int identifier, int debug_event_class, char *description); + +/** + * @brief gets vu event id ascii string + * + * @param identifier, string id + * @param debug_event_class, debug event class + * @param description, string description + * + * @return 0 success + */ +int get_vu_event_id_ascii_string(int identifier, int debug_event_class, char *description); + +/** + * @brief parses a time-stamp event fifo data to text or json formats + * + * @param pevent_descriptor, input event descriptor data + * @param pevent_descriptor_obj, event descriptor json object pointer + * @param pevent_specific_data, input event specific data + * @param pevent_fifos_object, event fifos json object pointer + * @param fp, input file pointer + * + * @return + */ +void parse_time_stamp_event(struct nvme_ocp_telemetry_event_descriptor *pevent_descriptor, + struct json_object *pevent_descriptor_obj, __u8 *pevent_specific_data, + struct json_object *pevent_fifos_object, FILE *fp); + +/** + * @brief parses a pcie event fifo data to text or json formats + * + * @param pevent_descriptor, input event descriptor data + * @param pevent_descriptor_obj, event descriptor json object pointer + * @param pevent_specific_data, input event specific data + * @param pevent_fifos_object, event fifos json object pointer + * @param fp, input file pointer + * + * @return + */ +void parse_pcie_event(struct nvme_ocp_telemetry_event_descriptor *pevent_descriptor, + struct json_object *pevent_descriptor_obj, __u8 *pevent_specific_data, + struct json_object *pevent_fifos_object, FILE *fp); + +/** + * @brief parses a nvme event fifo data to text or json formats + * + * @param pevent_descriptor, input event descriptor data + * @param pevent_descriptor_obj, event descriptor json object pointer + * @param pevent_specific_data, input event specific data + * @param pevent_fifos_object, event fifos json object pointer + * @param fp, input file pointer + * + * @return + */ +void parse_nvme_event(struct nvme_ocp_telemetry_event_descriptor *pevent_descriptor, + struct json_object *pevent_descriptor_obj, __u8 *pevent_specific_data, + struct json_object *pevent_fifos_object, FILE *fp); + +/** + * @brief parses common event fifo data to text or json formats + * + * @param pevent_descriptor, input event descriptor data + * @param pevent_descriptor_obj, event descriptor json object pointer + * @param pevent_specific_data, input event specific data + * @param pevent_fifos_object, event fifos json object pointer + * @param fp, input file pointer + * + * @return + */ +void parse_common_event(struct nvme_ocp_telemetry_event_descriptor *pevent_descriptor, + struct json_object *pevent_descriptor_obj, __u8 *pevent_specific_data, + struct json_object *pevent_fifos_object, FILE *fp); + +/** + * @brief parses a media-wear event fifo data to text or json formats + * + * @param pevent_descriptor, input event descriptor data + * @param pevent_descriptor_obj, event descriptor json object pointer + * @param pevent_specific_data, input event specific data + * @param pevent_fifos_object, event fifos json object pointer + * @param fp, input file pointer + * + * @return + */ +void parse_media_wear_event(struct nvme_ocp_telemetry_event_descriptor *pevent_descriptor, + struct json_object *pevent_descriptor_obj, __u8 *pevent_specific_data, + struct json_object *pevent_fifos_object, FILE *fp); diff --git a/util/meson.build b/util/meson.build index 0065b863c5..f5474cdb38 100644 --- a/util/meson.build +++ b/util/meson.build @@ -8,6 +8,7 @@ sources += [ 'util/mem.c', 'util/suffix.c', 'util/types.c', + 'util/utils.c' ] if json_c_dep.found() diff --git a/plugins/micron/micron-utils.c b/util/utils.c similarity index 95% rename from plugins/micron/micron-utils.c rename to util/utils.c index e19b7c22f8..ca9a6bf98d 100644 --- a/plugins/micron/micron-utils.c +++ b/util/utils.c @@ -3,12 +3,11 @@ * Copyright (c) Micron, Inc 2024. * * @file: micron-utils.h - * @brief: This module contains all the utilities needed for micron nvme plugin - * and other micron modules. + * @brief: This module contains all the utilities needed for other modules. * @author: Chaithanya Shoba */ -#include "micron-utils.h" +#include "utils.h" int hex_to_int(char c) { @@ -247,15 +246,15 @@ void process_field_size_default(int offset, char *sfield, __u8 *buf, int size, c sprintf(datastr, "%s", description_str); } -void print_micron_vs_logs(__u8 *buf, struct micron_vs_logpage *log_page, int field_count, +void generic_structure_parser(__u8 *buf, struct request_data *req_data, int field_count, struct json_object *stats, __u8 spec, FILE *fp) { int offset = 0; for (int field = 0; field < field_count; field++) { char datastr[1024] = { 0 }; - char *sfield = log_page[field].field; - int size = !spec ? log_page[field].size : log_page[field].size2; + char *sfield = req_data[field].field; + int size = !spec ? req_data[field].size : req_data[field].size2; if (!size || sfield == NULL) continue; diff --git a/plugins/micron/micron-utils.h b/util/utils.h similarity index 89% rename from plugins/micron/micron-utils.h rename to util/utils.h index 289c836f38..9afa103ff3 100644 --- a/plugins/micron/micron-utils.h +++ b/util/utils.h @@ -3,8 +3,7 @@ * Copyright (c) Micron, Inc 2024. * * @file: micron-utils.h - * @brief: This module contains all the utilities needed for micron nvme plugin - * and other micron modules. + * @brief: This module contains all the utilities needed for other modules. * @author: Chaithanya Shoba */ @@ -29,11 +28,11 @@ #include "nvme-print.h" #include "util/cleanup.h" -/* OCP and Vendor specific log data format */ -struct __packed micron_vs_logpage { +/*Request data format*/ +struct __packed request_data { char *field; - int size; /* FB client spec version 1.0 sizes - M5410 models */ - int size2; /* FB client spec version 0.7 sizes - M5407 models */ + int size; + int size2; }; enum field_size { @@ -81,7 +80,7 @@ unsigned char *read_binary_file(char *data_dir_path, const char *bin_path, long int retry_count); /** - * @brief prints Micron VS log pages + * @brief prints generic structure parser * * @param buf, input raw log data * @param log_page, input format of the data @@ -92,7 +91,7 @@ unsigned char *read_binary_file(char *data_dir_path, const char *bin_path, long * * @return 0 success */ -void print_micron_vs_logs(__u8 *buf, struct micron_vs_logpage *log_page, int field_count, +void generic_structure_parser(__u8 *buf, struct request_data *req_data, int field_count, struct json_object *stats, __u8 spec, FILE *fp); /** From b17b2d9f895c6b182c850f1d759e99241b50eba2 Mon Sep 17 00:00:00 2001 From: Nitin Sao Date: Tue, 16 Jul 2024 11:58:18 +0530 Subject: [PATCH 085/281] nvme-print: Added print for two new fields for HMB feature As per TP4104, added print for two new fields for HMB feature HMNARE (Host Memory Non-operational Access Restriction Enable) and HMNAR (Host Memory Non-operational Access Restricted) with 1 bit each. Bit 1 is not used for Get Feature command and will be 0. And added print for HMBR field in stdout_id_ctrl_ctratt. Signed-off-by: Nitin Sao Reviewed-by: Steven Seungcheol Lee Reviewed-by: Mohit Kapoor --- nvme-print-json.c | 4 ++++ nvme-print-stdout.c | 13 ++++++++++--- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/nvme-print-json.c b/nvme-print-json.c index efd340a5ec..6c3e45f463 100644 --- a/nvme-print-json.c +++ b/nvme-print-json.c @@ -3425,6 +3425,10 @@ static void json_feature_show_fields_host_mem_buf(struct json_object *r, unsigne unsigned char *buf) { obj_add_str(r, "Enable Host Memory (EHM)", result & 1 ? "Enabled" : "Disabled"); + obj_add_str(r, "Host Memory Non-operational Access Restriction Enable (HMNARE)", + (result & 0x00000004) ? "True" : "False"); + obj_add_str(r, "Host Memory Non-operational Access Restricted (HMNAR)", + (result & 0x00000008) ? "True" : "False"); if (buf) json_host_mem_buffer((struct nvme_host_mem_buf_attrs *)buf, r); diff --git a/nvme-print-stdout.c b/nvme-print-stdout.c index 17461de1a8..57c9127b14 100644 --- a/nvme-print-stdout.c +++ b/nvme-print-stdout.c @@ -1714,7 +1714,8 @@ static void stdout_id_ctrl_ctratt(__le32 ctrl_ctratt) __u32 ctratt = le32_to_cpu(ctrl_ctratt); __u32 rsvd20 = (ctratt >> 20); __u32 fdps = (ctratt >> 19) & 0x1; - __u32 rsvd17 = (ctratt >> 17) & 0x3; + __u32 rsvd18 = (ctratt >> 18) & 0x1; + __u32 hmbr = (ctratt >> 17) & 0x1; __u32 mem = (ctratt >> 16) & 0x1; __u32 elbas = (ctratt >> 15) & 0x1; __u32 delnvmset = (ctratt >> 14) & 0x1; @@ -1737,8 +1738,10 @@ static void stdout_id_ctrl_ctratt(__le32 ctrl_ctratt) printf(" [31:20] : %#x\tReserved\n", rsvd20); printf(" [19:19] : %#x\tFlexible Data Placement %sSupported\n", fdps, fdps ? "" : "Not "); - if (rsvd17) - printf(" [18:17] : %#x\tReserved\n", rsvd17); + if (rsvd18) + printf(" [18:18] : %#x\tReserved\n", rsvd18); + printf(" [17:17] : %#x\tHMB Restrict Non-Operational Power State Access %sSupported\n", + hmbr, hmbr ? "" : "Not "); printf(" [16:16] : %#x\tMDTS and Size Limits Exclude Metadata %sSupported\n", mem, mem ? "" : "Not "); printf(" [15:15] : %#x\tExtended LBA Formats %sSupported\n", @@ -4511,6 +4514,10 @@ static void stdout_feature_show_fields(enum nvme_features_id fid, break; case NVME_FEAT_FID_HOST_MEM_BUF: printf("\tEnable Host Memory (EHM): %s\n", (result & 0x00000001) ? "Enabled" : "Disabled"); + printf("\tHost Memory Non-operational Access Restriction Enable (HMNARE): %s\n", + (result & 0x00000004) ? "True" : "False"); + printf("\tHost Memory Non-operational Access Restricted (HMNAR): %s\n", + (result & 0x00000008) ? "True" : "False"); if (buf) stdout_host_mem_buffer((struct nvme_host_mem_buf_attrs *)buf); break; From 8642be499d89d3b2ee92d4e75b4288579c5d2387 Mon Sep 17 00:00:00 2001 From: Daniel Wagner Date: Wed, 17 Jul 2024 17:24:32 +0200 Subject: [PATCH 086/281] utils: add missing header The build breaks because convert_ts is missing. Also utils.c depends on json_object_add_value_string, thus define one when we don't use json-c. Signed-off-by: Daniel Wagner --- util/json.h | 2 ++ util/utils.c | 2 ++ 2 files changed, 4 insertions(+) diff --git a/util/json.h b/util/json.h index 54e33e397e..3dd5b52869 100644 --- a/util/json.h +++ b/util/json.h @@ -56,6 +56,8 @@ uint64_t util_json_object_get_uint64(struct json_object *obj); struct json_object; +#define json_object_add_value_string(o, k, v) + #endif #endif diff --git a/util/utils.c b/util/utils.c index ca9a6bf98d..5e3038b945 100644 --- a/util/utils.c +++ b/util/utils.c @@ -8,6 +8,8 @@ */ #include "utils.h" +#include "types.h" +#include "json.h" int hex_to_int(char c) { From f9050af9d5d74e83eadeaf7b05e2fafe40fe2137 Mon Sep 17 00:00:00 2001 From: Daniel Wagner Date: Wed, 17 Jul 2024 17:25:18 +0200 Subject: [PATCH 087/281] utils: cleanup includes in utils.h There a plenty of includes which are not necessary. Remove them. Signed-off-by: Daniel Wagner --- util/utils.h | 20 +------------------- 1 file changed, 1 insertion(+), 19 deletions(-) diff --git a/util/utils.h b/util/utils.h index 9afa103ff3..35ba5506b3 100644 --- a/util/utils.h +++ b/util/utils.h @@ -2,31 +2,13 @@ /* * Copyright (c) Micron, Inc 2024. * - * @file: micron-utils.h + * @file: utils.h * @brief: This module contains all the utilities needed for other modules. * @author: Chaithanya Shoba */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include #include "common.h" -#include "nvme.h" -#include "libnvme.h" -#include -#include "linux/types.h" #include "nvme-print.h" -#include "util/cleanup.h" /*Request data format*/ struct __packed request_data { From 4e128046c4a89b2f8a1ae669a5f305d053ae4add Mon Sep 17 00:00:00 2001 From: Daniel Wagner Date: Wed, 17 Jul 2024 17:39:23 +0200 Subject: [PATCH 088/281] utils: fix print formatting option A 64bit value to print needs to use the PRIx macros to work on 32bit and 64bit platforms. Signed-off-by: Daniel Wagner --- util/utils.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/util/utils.c b/util/utils.c index 5e3038b945..5d776522fb 100644 --- a/util/utils.c +++ b/util/utils.c @@ -187,7 +187,7 @@ void process_field_size_8(int offset, char *sfield, __u8 *buf, char *datastr) lval_lo = *((__u64 *)(&buf[offset])); - sprintf(buffer, "%lx", __builtin_bswap64(lval_lo)); + sprintf(buffer, "%"PRIx64, __builtin_bswap64(lval_lo)); sprintf(datastr, "%s", hex_to_ascii(buffer)); } else if (strstr(sfield, "Timestamp")) { char ts_buf[128]; From ede9a5f87b57d67e92226eca1273abb657ebe6a4 Mon Sep 17 00:00:00 2001 From: Francis Pravin Date: Thu, 18 Jul 2024 15:35:44 +0530 Subject: [PATCH 089/281] nvme: use proper mask to get correct lbafu value The NVME_NS_FLBAS_HIGHER/LOWER_MASK is used to get the format index value from Formatted LBA Size (FLBAS) field of Identify Namespace Data Structure. But, We are not getting the proper lbafu value while using the same macro on user passed format index value. So, use the proper mask to get the correct lbafu value. Signed-off-by: Francis Pravin Reviewed-by: Steven Seungcheol Lee --- nvme.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nvme.c b/nvme.c index 4b0e2313b4..eddd617ea1 100644 --- a/nvme.c +++ b/nvme.c @@ -6264,8 +6264,8 @@ static int format_cmd(int argc, char **argv, struct command *cmd, struct plugin struct nvme_format_nvm_args args = { .args_size = sizeof(args), .nsid = cfg.namespace_id, - .lbafu = (cfg.lbaf & NVME_NS_FLBAS_HIGHER_MASK) >> 4, - .lbaf = cfg.lbaf & NVME_NS_FLBAS_LOWER_MASK, + .lbafu = (cfg.lbaf >> 4) & 0x3, + .lbaf = cfg.lbaf & 0xf, .mset = cfg.ms, .pi = cfg.pi, .pil = cfg.pil, From 0979f22fb7ec57f5c32a275a6e60c4ab90a2f563 Mon Sep 17 00:00:00 2001 From: zhangxiaoyuan Date: Fri, 19 Jul 2024 18:23:44 +0800 Subject: [PATCH 090/281] nvme: use argconfig_parse_seen to check conditions The value of NVME_FEAT_FID_TIMESTAMP cannot be set to 0 through 'set-feature /dev/nvmeX -f 0xe -v 0'. using argconfig_parse_seen() can fix this issue. Signed-off-by: Xiaoyuan Zhang --- nvme.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/nvme.c b/nvme.c index eddd617ea1..f866c58e57 100644 --- a/nvme.c +++ b/nvme.c @@ -6415,7 +6415,8 @@ static int set_feature(int argc, char **argv, struct command *cmd, struct plugin * should use the buffer method if the value exceeds this * length. */ - if (cfg.feature_id == NVME_FEAT_FID_TIMESTAMP && cfg.value) { + if (cfg.feature_id == NVME_FEAT_FID_TIMESTAMP && + argconfig_parse_seen(opts, "value")) { memcpy(buf, &cfg.value, NVME_FEAT_TIMESTAMP_DATA_SIZE); } else { if (strlen(cfg.file)) From e1108354eadf267acf9989446ba4fe9a5099ffb6 Mon Sep 17 00:00:00 2001 From: Tokunori Ikegami Date: Sun, 7 Jul 2024 23:37:43 +0900 Subject: [PATCH 091/281] ocp: add set-error-injection command The command injects error conditions. Signed-off-by: Tokunori Ikegami --- plugins/ocp/ocp-nvme.c | 106 +++++++++++++++++++++++++++++++++++++++++ plugins/ocp/ocp-nvme.h | 1 + 2 files changed, 107 insertions(+) diff --git a/plugins/ocp/ocp-nvme.c b/plugins/ocp/ocp-nvme.c index 8ea22896a2..b6394212c2 100644 --- a/plugins/ocp/ocp-nvme.c +++ b/plugins/ocp/ocp-nvme.c @@ -187,8 +187,19 @@ struct erri_get_cq_entry { __u32 rsvd7:25; }; +struct erri_config { + char *file; + __u8 number; + __u16 type; + __u16 nrtdp; +}; + static const char *sel = "[0-3]: current/default/saved/supported"; static const char *no_uuid = "Skip UUID index search (UUID index not required for OCP 1.0)"; +const char *data = "Error injection data structure entries"; +const char *number = "Number of valid error injection data entries"; +static const char *type = "Error injection type"; +static const char *nrtdp = "Number of reads to trigger device panic"; static int ocp_print_C3_log_normal(struct nvme_dev *dev, struct ssd_latency_monitor_log *log_data) @@ -4039,3 +4050,98 @@ static int get_error_injection(int argc, char **argv, struct command *cmd, struc return error_injection_get(dev, cfg.sel, !argconfig_parse_seen(opts, "no-uuid")); } + +static int error_injection_set(struct nvme_dev *dev, struct erri_config *cfg, bool uuid) +{ + int err; + __u32 result; + struct nvme_set_features_args args = { + .args_size = sizeof(args), + .fd = dev_fd(dev), + .fid = 0xc0, + .cdw11 = cfg->number, + .data_len = cfg->number * sizeof(struct erri_entry), + .timeout = nvme_cfg.timeout, + .result = &result, + }; + + _cleanup_fd_ int ffd = -1; + + _cleanup_free_ struct erri_entry *entry = NULL; + + if (uuid) { + /* OCP 2.0 requires UUID index support */ + err = ocp_get_uuid_index(dev, &args.uuidx); + if (err || !args.uuidx) { + nvme_show_error("ERROR: No OCP UUID index found"); + return err; + } + } + + entry = nvme_alloc(args.data_len); + if (!entry) { + nvme_show_error("malloc: %s", strerror(errno)); + return -errno; + } + + if (cfg->file && strlen(cfg->file)) { + ffd = open(cfg->file, O_RDONLY); + if (ffd < 0) { + nvme_show_error("Failed to open file %s: %s", cfg->file, strerror(errno)); + return -EINVAL; + } + err = read(ffd, entry, args.data_len); + if (err < 0) { + nvme_show_error("failed to read data buffer from input file: %s", + strerror(errno)); + return -errno; + } + } else { + entry->enable = 1; + entry->single = 1; + entry->type = cfg->type; + entry->nrtdp = cfg->nrtdp; + } + + args.data = entry; + + err = nvme_set_features(&args); + if (err) { + if (err < 0) + nvme_show_error("set-error-injection: %s", nvme_strerror(errno)); + else if (err > 0) + nvme_show_status(err); + return err; + } + + printf("set-error-injection, data: %s, number: %d, uuid: %d, type: %d, nrtdp: %d\n", + cfg->file, cfg->number, args.uuidx, cfg->type, cfg->nrtdp); + if (args.data) + d(args.data, args.data_len, 16, 1); + + return 0; +} + +static int set_error_injection(int argc, char **argv, struct command *cmd, struct plugin *plugin) +{ + const char *desc = "Inject error conditions"; + int err; + struct erri_config cfg = { + .number = 1, + }; + + _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; + + NVME_ARGS(opts, + OPT_FILE("data", 'd', &cfg.file, data), + OPT_BYTE("number", 'n', &cfg.number, number), + OPT_FLAG("no-uuid", 'N', NULL, no_uuid), + OPT_SHRT("type", 't', &cfg.type, type), + OPT_SHRT("nrtdp", 'r', &cfg.nrtdp, nrtdp)); + + err = parse_and_open(&dev, argc, argv, desc, opts); + if (err) + return err; + + return error_injection_set(dev, &cfg, !argconfig_parse_seen(opts, "no-uuid")); +} diff --git a/plugins/ocp/ocp-nvme.h b/plugins/ocp/ocp-nvme.h index ec4b4fa369..16d929d522 100644 --- a/plugins/ocp/ocp-nvme.h +++ b/plugins/ocp/ocp-nvme.h @@ -37,6 +37,7 @@ PLUGIN(NAME("ocp", "OCP cloud SSD extensions", OCP_PLUGIN_VERSION), ENTRY("get-dssd-async-event-config", "Get DSSD Async Event Config", get_dssd_async_event_config) ENTRY("tcg-configuration-log", "Retrieve TCG Configuration Log Page", ocp_tcg_configuration_log) ENTRY("get-error-injection", "Return set of error injection", get_error_injection) + ENTRY("set-error-injection", "Inject error conditions", set_error_injection) ) ); From 54f684cc4f6f23ee8f5ea797b65295e8f70fe210 Mon Sep 17 00:00:00 2001 From: Tokunori Ikegami Date: Sun, 21 Jul 2024 09:53:11 +0900 Subject: [PATCH 092/281] doc: add ocp set-error-injection command The command injects error conditions. Signed-off-by: Tokunori Ikegami --- .../nvme-ocp-set-error-injection.txt | 79 +++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 Documentation/nvme-ocp-set-error-injection.txt diff --git a/Documentation/nvme-ocp-set-error-injection.txt b/Documentation/nvme-ocp-set-error-injection.txt new file mode 100644 index 0000000000..ee8fcf58e8 --- /dev/null +++ b/Documentation/nvme-ocp-set-error-injection.txt @@ -0,0 +1,79 @@ +nvme-ocp-set-error-injection(1) +=============================== + +NAME +---- +nvme-ocp-set-error-injection - Inject error conditions + +SYNOPSIS +-------- +[verse] +'nvme ocp set-error-injection' [--data= | -d ] + [--number= | -n ] [--no-uuid | -N] + [--type= | -t ] [--nrtdp= | -r ] + [--verbose | -v] [--output-format= | -o ] + [--timeout=] + +DESCRIPTION +----------- +Inject error conditions. + +The parameter is mandatory NVMe character device (ex: /dev/nvme0). + +This will only work on OCP compliant devices supporting this feature. +Results for any other device are undefined. + +On success it returns 0, error code otherwise. + +OPTIONS +------- +-d :: +--data=:: + Error injection data structure entries + +-n :: +--number=:: + Number of valid error injection data entries + +-N:: +--no-uuid:: + Do not try to automatically detect UUID index for this command (required + for old OCP 1.0 support) + +-t :: +--type=:: + Error injection type + +-r :: +--nrtdp=:: + Number of reads to trigger device panic + +-v:: +--verbose:: + Increase the information detail in the output. + +-o :: +--output-format=:: + Set the reporting format to 'normal', 'json' or 'binary'. Only one + output format can be used at a time. + +--timeout=:: + Override default timeout value. In milliseconds. + +EXAMPLES +-------- +* Has the program issue a set-error-injection with the 2 entries data file. ++ +------------ +# nvme ocp set-error-injection /dev/nvme0 -d data.bin -n 2 +------------ + +* Has the program issue a set-error-injection with the 5 reads trigger NAND hang. ++ +------------ +# nvme ocp set-error-injection /dev/nvme0 -t 2 -r 5 +------------ + +NVME +---- +Part of the nvme-user suite. From 45644055f281453a0147d7f0a8f2db519add9b9c Mon Sep 17 00:00:00 2001 From: Tokunori Ikegami Date: Sun, 21 Jul 2024 10:16:28 +0900 Subject: [PATCH 093/281] completions: add ocp set-error-injection command The command injects error conditions. Signed-off-by: Tokunori Ikegami --- completions/_nvme | 24 ++++++++++++++++++++++++ completions/bash-nvme-completion.sh | 6 +++++- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/completions/_nvme b/completions/_nvme index fd8e5d5893..70ab9d3e89 100644 --- a/completions/_nvme +++ b/completions/_nvme @@ -335,6 +335,29 @@ _nvme () { _arguments '*:: :->subcmds' _describe -t commands "nvme ocp get-error-injection options" _get_error_injection ;; + (set-error-injection) + local _set_error_injection + _set_error_injection=( + /dev/nvme':supply a device to use (required)' + --data=':Error injection data structure entries' + -d':alias for --data' + --number=':Number of valid error injection data entries' + -n':alias for --number' + --no-uuid':Skip UUID index search' + -N':alias for --no-uuid' + --type=':Error injection type' + -t':alias for --type' + --nrtdp=':Number of reads to trigger device panic' + -r':alias for --nrtdp' + --verbose':Increase the information detail in the output.' + -v':alias for --verbose' + --output-format=':Output format: normal|json|binary' + -o ':alias for --output-format' + --timeout=':value for timeout' + ) + _arguments '*:: :->subcmds' + _describe -t commands "nvme ocp set-error-injection options" _set_error_injection + ;; (*) _files ;; @@ -2543,6 +2566,7 @@ _nvme () { set-telemetry-profile':Set Telemetry Profile' tcg-configuration-log':tcg configuration log' get-error-injection':get error injection' + set-error-injection':set error injection' ) _arguments '*:: :->subcmds' _describe -t commands "nvme ocp options" _ocp diff --git a/completions/bash-nvme-completion.sh b/completions/bash-nvme-completion.sh index 35149c196b..8e80ddbf84 100644 --- a/completions/bash-nvme-completion.sh +++ b/completions/bash-nvme-completion.sh @@ -1487,6 +1487,10 @@ plugin_ocp_opts () { "get-error-injection") opts+=" --sel= -s --no-uuid -n" ;; + "set-error-injection") + opts+=" --data= -d --number= -n --no-uuid -N --type= -t \ + --nrtdp= -r --verbose -v --output-format -o --timeout=" + ;; "help") opts+=$NO_OPTS ;; @@ -1565,7 +1569,7 @@ _nvme_subcmds () { set-dssd-power-state-feature get-dssd-power-state-feature \ telemetry-string-log set-telemetry-profile \ set-dssd-async-event-config get-dssd-async-event-config \ - get-error-injection" + get-error-injection set-error-injection" ) # Associative array mapping plugins to corresponding option completions From fa0296794e495ab3bc2cf258916c4da82038e417 Mon Sep 17 00:00:00 2001 From: Heitor Alves de Siqueira Date: Wed, 24 Jul 2024 13:15:35 -0300 Subject: [PATCH 094/281] plugins/virtium: use time_t for time_stamp values In the vtview_log structs, time_t should be used for any time_stamp values instead of long. This ensures correct builds on 32-bit architectures even with 64-bit time_t (e.g. armhf on Ubuntu). Signed-off-by: Heitor Alves de Siqueira --- plugins/virtium/virtium-nvme.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/virtium/virtium-nvme.c b/plugins/virtium/virtium-nvme.c index 0ba4b155e9..ad9938d45d 100644 --- a/plugins/virtium/virtium-nvme.c +++ b/plugins/virtium/virtium-nvme.c @@ -32,14 +32,14 @@ static char vt_default_log_file_name[256]; struct vtview_log_header { char path[256]; char test_name[256]; - long time_stamp; + time_t time_stamp; struct nvme_id_ctrl raw_ctrl; struct nvme_firmware_slot raw_fw; }; struct vtview_smart_log_entry { char path[256]; - long time_stamp; + time_t time_stamp; struct nvme_id_ns raw_ns; struct nvme_id_ctrl raw_ctrl; struct nvme_smart_log raw_smart; From f17afe1769269548b39b43735c3059b18aa6a228 Mon Sep 17 00:00:00 2001 From: Martin George Date: Wed, 17 Jul 2024 13:47:51 +0530 Subject: [PATCH 095/281] fabrics: print an error for ENOENT too Many nvme commands such as discover, connect, connect-all, etc. simply return to the prompt without printing any useful error message when the respective nvme driver modules are not loaded in the kernel. This is because nothing gets printed when nvme_scan_topology() returns an ENOENT due to missing nvme system files stemming from not loading the appropriate nvme modules. Fix the same. Signed-off-by: Martin George --- fabrics.c | 25 ++++++++++--------------- nvme.c | 9 +++------ 2 files changed, 13 insertions(+), 21 deletions(-) diff --git a/fabrics.c b/fabrics.c index 043a9b53d8..5215a23152 100644 --- a/fabrics.c +++ b/fabrics.c @@ -738,9 +738,8 @@ int nvmf_discover(const char *desc, int argc, char **argv, bool connect) nvme_root_skip_namespaces(r); ret = nvme_scan_topology(r, NULL, NULL); if (ret < 0) { - if (errno != ENOENT) - fprintf(stderr, "Failed to scan topology: %s\n", - nvme_strerror(errno)); + fprintf(stderr, "Failed to scan topology: %s\n", + nvme_strerror(errno)); return ret; } @@ -958,9 +957,8 @@ int nvmf_connect(const char *desc, int argc, char **argv) nvme_root_skip_namespaces(r); ret = nvme_scan_topology(r, NULL, NULL); if (ret < 0) { - if (errno != ENOENT) - fprintf(stderr, "Failed to scan topology: %s\n", - nvme_strerror(errno)); + fprintf(stderr, "Failed to scan topology: %s\n", + nvme_strerror(errno)); return ret; } @@ -1107,9 +1105,8 @@ int nvmf_disconnect(const char *desc, int argc, char **argv) nvme_root_skip_namespaces(r); ret = nvme_scan_topology(r, NULL, NULL); if (ret < 0) { - if (errno != ENOENT) - fprintf(stderr, "Failed to scan topology: %s\n", - nvme_strerror(errno)); + fprintf(stderr, "Failed to scan topology: %s\n", + nvme_strerror(errno)); nvme_free_tree(r); return ret; } @@ -1255,9 +1252,8 @@ int nvmf_config(const char *desc, int argc, char **argv) nvme_root_skip_namespaces(r); ret = nvme_scan_topology(r, NULL, NULL); if (ret < 0) { - if (errno != ENOENT) - fprintf(stderr, "Failed to scan topology: %s\n", - nvme_strerror(errno)); + fprintf(stderr, "Failed to scan topology: %s\n", + nvme_strerror(errno)); nvme_free_tree(r); return ret; } @@ -1409,9 +1405,8 @@ int nvmf_dim(const char *desc, int argc, char **argv) nvme_root_skip_namespaces(r); ret = nvme_scan_topology(r, NULL, NULL); if (ret < 0) { - if (errno != ENOENT) - fprintf(stderr, "Failed to scan topology: %s\n", - nvme_strerror(errno)); + fprintf(stderr, "Failed to scan topology: %s\n", + nvme_strerror(errno)); nvme_free_tree(r); return ret; } diff --git a/nvme.c b/nvme.c index f866c58e57..dad7161062 100644 --- a/nvme.c +++ b/nvme.c @@ -3324,8 +3324,7 @@ static int list_subsys(int argc, char **argv, struct command *cmd, err = nvme_scan_topology(r, filter, (void *)devname); if (err) { - if (errno != ENOENT) - nvme_show_error("Failed to scan topology: %s", nvme_strerror(errno)); + nvme_show_error("Failed to scan topology: %s", nvme_strerror(errno)); return -errno; } @@ -3363,8 +3362,7 @@ static int list(int argc, char **argv, struct command *cmd, struct plugin *plugi } err = nvme_scan_topology(r, NULL, NULL); if (err < 0) { - if (errno != ENOENT) - nvme_show_error("Failed to scan topology: %s", nvme_strerror(errno)); + nvme_show_error("Failed to scan topology: %s", nvme_strerror(errno)); return err; } @@ -9582,8 +9580,7 @@ static int show_topology_cmd(int argc, char **argv, struct command *command, str err = nvme_scan_topology(r, NULL, NULL); if (err < 0) { - if (errno != ENOENT) - nvme_show_error("Failed to scan topology: %s", nvme_strerror(errno)); + nvme_show_error("Failed to scan topology: %s", nvme_strerror(errno)); nvme_free_tree(r); return err; } From c8612d3fae32f401b4f2d09d475fd65124ddad4b Mon Sep 17 00:00:00 2001 From: Daniel Wagner Date: Fri, 26 Jul 2024 14:14:16 +0200 Subject: [PATCH 096/281] fabrics: use cleanup helper where possible Let's make the error path shorter and simpler by using the cleanup helpers. Signed-off-by: Daniel Wagner --- fabrics.c | 43 +++++++++++++++---------------------------- 1 file changed, 15 insertions(+), 28 deletions(-) diff --git a/fabrics.c b/fabrics.c index 5215a23152..e52fcd0ab6 100644 --- a/fabrics.c +++ b/fabrics.c @@ -45,6 +45,7 @@ #include "nbft.h" #include "nvme-print.h" #include "fabrics.h" +#include "util/cleanup.h" #include "util/logging.h" #define PATH_NVMF_DISC SYSCONFDIR "/nvme/discovery.conf" @@ -1064,7 +1065,7 @@ static void nvmf_disconnect_nqn(nvme_root_t r, char *nqn) int nvmf_disconnect(const char *desc, int argc, char **argv) { const char *device = "nvme device handle"; - nvme_root_t r; + _cleanup_nvme_root_ nvme_root_t r = NULL; nvme_ctrl_t c; char *p; int ret; @@ -1107,8 +1108,7 @@ int nvmf_disconnect(const char *desc, int argc, char **argv) if (ret < 0) { fprintf(stderr, "Failed to scan topology: %s\n", nvme_strerror(errno)); - nvme_free_tree(r); - return ret; + return -errno; } if (cfg.nqn) @@ -1125,7 +1125,6 @@ int nvmf_disconnect(const char *desc, int argc, char **argv) if (!c) { fprintf(stderr, "Did not find device %s\n", p); - nvme_free_tree(r); return -errno; } ret = nvme_disconnect_ctrl(c); @@ -1135,16 +1134,15 @@ int nvmf_disconnect(const char *desc, int argc, char **argv) p, nvme_strerror(errno)); } } - nvme_free_tree(r); return 0; } int nvmf_disconnect_all(const char *desc, int argc, char **argv) { + _cleanup_nvme_root_ nvme_root_t r = NULL; nvme_host_t h; nvme_subsystem_t s; - nvme_root_t r; nvme_ctrl_t c; int ret; @@ -1179,8 +1177,7 @@ int nvmf_disconnect_all(const char *desc, int argc, char **argv) if (errno != ENOENT) fprintf(stderr, "Failed to scan topology: %s\n", nvme_strerror(errno)); - nvme_free_tree(r); - return ret; + return -errno; } nvme_for_each_host(r, h) { @@ -1200,7 +1197,6 @@ int nvmf_disconnect_all(const char *desc, int argc, char **argv) } } } - nvme_free_tree(r); return 0; } @@ -1210,11 +1206,12 @@ int nvmf_config(const char *desc, int argc, char **argv) char *subsysnqn = NULL; char *transport = NULL, *traddr = NULL; char *trsvcid = NULL, *hostnqn = NULL, *hostid = NULL; - char *hnqn = NULL, *hid = NULL; + _cleanup_free_ char *hnqn = NULL; + _cleanup_free_ char *hid = NULL; char *hostkey = NULL, *ctrlkey = NULL; char *config_file = PATH_NVMF_CONFIG; unsigned int verbose = 0; - nvme_root_t r; + _cleanup_nvme_root_ nvme_root_t r = NULL; int ret; struct nvme_fabrics_config cfg; bool scan_tree = false, modify_config = false, update_config = false; @@ -1254,8 +1251,7 @@ int nvmf_config(const char *desc, int argc, char **argv) if (ret < 0) { fprintf(stderr, "Failed to scan topology: %s\n", nvme_strerror(errno)); - nvme_free_tree(r); - return ret; + return -errno; } } @@ -1284,7 +1280,7 @@ int nvmf_config(const char *desc, int argc, char **argv) if (!h) { fprintf(stderr, "Failed to lookup host '%s': %s\n", hostnqn, nvme_strerror(errno)); - goto out; + return -errno; } if (hostkey) nvme_host_set_dhchap_key(h, hostkey); @@ -1292,7 +1288,7 @@ int nvmf_config(const char *desc, int argc, char **argv) if (!s) { fprintf(stderr, "Failed to lookup subsystem '%s': %s\n", subsysnqn, nvme_strerror(errno)); - goto out; + return -errno; } c = nvme_lookup_ctrl(s, transport, traddr, cfg.host_traddr, cfg.host_iface, @@ -1300,7 +1296,7 @@ int nvmf_config(const char *desc, int argc, char **argv) if (!c) { fprintf(stderr, "Failed to lookup controller: %s\n", nvme_strerror(errno)); - goto out; + return -errno; } nvmf_update_config(c, &cfg); if (ctrlkey) @@ -1313,13 +1309,7 @@ int nvmf_config(const char *desc, int argc, char **argv) if (dump_config) nvme_dump_config(r); -out: - if (hid) - free(hid); - if (hnqn) - free(hnqn); - nvme_free_tree(r); - return -errno; + return 0; } static void dim_operation(nvme_ctrl_t c, enum nvmf_dim_tas tas, const char *name) @@ -1347,8 +1337,8 @@ static void dim_operation(nvme_ctrl_t c, enum nvmf_dim_tas tas, const char *name int nvmf_dim(const char *desc, int argc, char **argv) { + _cleanup_nvme_root_ nvme_root_t r = NULL; enum nvmf_dim_tas tas; - nvme_root_t r; nvme_ctrl_t c; char *p; int ret; @@ -1407,8 +1397,7 @@ int nvmf_dim(const char *desc, int argc, char **argv) if (ret < 0) { fprintf(stderr, "Failed to scan topology: %s\n", nvme_strerror(errno)); - nvme_free_tree(r); - return ret; + return -errno; } if (cfg.nqn) { @@ -1449,7 +1438,5 @@ int nvmf_dim(const char *desc, int argc, char **argv) } } - nvme_free_tree(r); - return 0; } From a11a96f471033dc7e03ccad6e71f443e08fdfe13 Mon Sep 17 00:00:00 2001 From: Daniel Wagner Date: Fri, 26 Jul 2024 14:20:09 +0200 Subject: [PATCH 097/281] fabrics: do not report error when no modules are loaded when disconnecting Do not report an error when the libnvme reports that the subsystem is not available when the user tries to disconnect. This allows the user to call disconnect without filtering this special case. The result is the same, after this call the host is not connected anymore. Signed-off-by: Daniel Wagner --- fabrics.c | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/fabrics.c b/fabrics.c index e52fcd0ab6..6e27ee3e9f 100644 --- a/fabrics.c +++ b/fabrics.c @@ -1106,6 +1106,14 @@ int nvmf_disconnect(const char *desc, int argc, char **argv) nvme_root_skip_namespaces(r); ret = nvme_scan_topology(r, NULL, NULL); if (ret < 0) { + /* + * Do not report an error when the modules are not + * loaded, this allows the user to unconditionally call + * disconnect. + */ + if (errno == ENOENT) + return 0; + fprintf(stderr, "Failed to scan topology: %s\n", nvme_strerror(errno)); return -errno; @@ -1174,9 +1182,16 @@ int nvmf_disconnect_all(const char *desc, int argc, char **argv) nvme_root_skip_namespaces(r); ret = nvme_scan_topology(r, NULL, NULL); if (ret < 0) { - if (errno != ENOENT) - fprintf(stderr, "Failed to scan topology: %s\n", - nvme_strerror(errno)); + /* + * Do not report an error when the modules are not + * loaded, this allows the user to unconditionally call + * disconnect. + */ + if (errno == ENOENT) + return 0; + + fprintf(stderr, "Failed to scan topology: %s\n", + nvme_strerror(errno)); return -errno; } From 9e137f074328a5a5e45eaf2bb0c8d0e7ba661481 Mon Sep 17 00:00:00 2001 From: Xiaoyuan Zhang Date: Sat, 27 Jul 2024 15:46:30 +0800 Subject: [PATCH 098/281] nvme-print-stdout: fix persistent-event-log set feature event output Refer to FDP Events Set Feature Data Structure: the number of FDP Event Types is only Dword11 bits [23:16]. the buffer only contains FDP Event Type. The value of mem_buf is incorrect: the pointer 'set_feat_event' should be converted to 'unsigned char *' first Signed-off-by: Xiaoyuan Zhang --- nvme-print-stdout.c | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/nvme-print-stdout.c b/nvme-print-stdout.c index 57c9127b14..0d7514b42c 100644 --- a/nvme-print-stdout.c +++ b/nvme-print-stdout.c @@ -246,13 +246,25 @@ static void stdout_add_bitmap(int i, __u8 seb) } } +static void stdout_persistent_event_log_fdp_events(unsigned int cdw11, + unsigned int cdw12, + unsigned char *buf) +{ + unsigned int num = (cdw11 >> 16) & 0xff; + + for (unsigned int i = 0; i < num; i++) { + printf("\t%-53s: %sEnabled\n", nvme_fdp_event_to_string(buf[0]), + cdw12 & 0x1 ? "" : "Not "); + } +} + static void stdout_persistent_event_log(void *pevent_log_info, __u8 action, __u32 size, const char *devname) { __u32 offset, por_info_len, por_info_list; __u64 *fw_rev; - int fid, cdw11, dword_cnt; + int fid, cdw11, cdw12, dword_cnt; unsigned char *mem_buf = NULL; struct nvme_smart_log *smart_event; struct nvme_fw_commit_event *fw_commit_event; @@ -488,8 +500,13 @@ static void stdout_persistent_event_log(void *pevent_log_info, printf("Set Feature ID :%#02x (%s), value:%#08x\n", fid, nvme_feature_to_string(fid), cdw11); if (NVME_SET_FEAT_EVENT_MB_COUNT(set_feat_event->layout)) { - mem_buf = (unsigned char *)(set_feat_event + 4 + dword_cnt * 4); - stdout_feature_show_fields(fid, cdw11, mem_buf); + mem_buf = (unsigned char *)set_feat_event + 4 + dword_cnt * 4; + if (fid == NVME_FEAT_FID_FDP_EVENTS) { + cdw12 = le32_to_cpu(set_feat_event->cdw_mem[2]); + stdout_persistent_event_log_fdp_events(cdw11, cdw12, + mem_buf); + } else + stdout_feature_show_fields(fid, cdw11, mem_buf); } break; case NVME_PEL_TELEMETRY_CRT: From 1bc46a01aafdb9e3f43ba25e895821023ec5dbd4 Mon Sep 17 00:00:00 2001 From: Vigneshwaran Saravanan/Vigneshwaran Saravanan Date: Tue, 30 Jul 2024 19:15:52 +0530 Subject: [PATCH 099/281] plugins/ocp: fix UAF when printing telemetry log Take care the below failures for "telemetry-string-log". Resolved the Segmentation Fault issue while printing. Signed-off-by: Vigneshwaran Saravanan/Vigneshwaran Saravanan Reviewed-by: Karthik Balan Reviewed-by: Arunpandian J --- plugins/ocp/ocp-nvme.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/plugins/ocp/ocp-nvme.c b/plugins/ocp/ocp-nvme.c index b6394212c2..91f4083b17 100644 --- a/plugins/ocp/ocp-nvme.c +++ b/plugins/ocp/ocp-nvme.c @@ -902,6 +902,7 @@ static int eol_plp_failure_mode(int argc, char **argv, struct command *cmd, /// Telemetry Log //global buffers static __le64 total_log_page_sz; +static __u8 *header_data; static struct telemetry_str_log_format *log_data; __u8 *ptelemetry_buffer; @@ -1588,8 +1589,6 @@ static int get_telemetry_log_page_data(struct nvme_dev *dev, int tele_type) static int get_c9_log_page_data(struct nvme_dev *dev, int print_data, int save_bin) { int ret = 0, fd; - __u8 *header_data; - struct telemetry_str_log_format *log_data; __le64 stat_id_str_table_ofst = 0; __le64 event_str_table_ofst = 0; __le64 vu_event_str_table_ofst = 0; @@ -1663,7 +1662,6 @@ static int get_c9_log_page_data(struct nvme_dev *dev, int print_data, int save_b } exit_status: - free(header_data); return 0; } @@ -3621,7 +3619,7 @@ static int get_c9_log_page(struct nvme_dev *dev, char *format) } } else fprintf(stderr, "ERROR : OCP : Unable to read C9 data from buffer\n"); - + free(header_data); return ret; } From 55f980a34e4b5684f1f567808ac89b0b293df88a Mon Sep 17 00:00:00 2001 From: Daniel Wagner Date: Thu, 11 Jul 2024 18:42:23 +0200 Subject: [PATCH 100/281] fabrics: check if json config is existing nvme_read_config will return success even if the file doesn't exist. This leads to the situation that we always execute discover_from_json_config_file even though there is no json config file. One side effect of this is that when executing 'nvme discover -d /dev/nvmeXXX' we will always do a discover for the first controller we find. Signed-off-by: Daniel Wagner --- fabrics.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/fabrics.c b/fabrics.c index 6e27ee3e9f..e204287dcd 100644 --- a/fabrics.c +++ b/fabrics.c @@ -667,6 +667,15 @@ static int nvme_read_volatile_config(nvme_root_t r) return ret; } +static int nvme_read_config_checked(nvme_root_t r, const char *filename) +{ + if (!access(filename, F_OK)) + return -ENOENT; + if (nvme_read_config(r, filename)) + return -errno; + return 0; +} + int nvmf_discover(const char *desc, int argc, char **argv, bool connect) { char *subsysnqn = NVME_DISC_SUBSYS_NAME; @@ -731,7 +740,7 @@ int nvmf_discover(const char *desc, int argc, char **argv, bool connect) if (context) nvme_root_set_application(r, context); - if (!nvme_read_config(r, config_file)) + if (!nvme_read_config_checked(r, config_file)) json_config = true; if (!nvme_read_volatile_config(r)) json_config = true; From 9aaa137f86160cce90b7692ba40f0a938a54bf83 Mon Sep 17 00:00:00 2001 From: Daniel Wagner Date: Thu, 11 Jul 2024 18:53:36 +0200 Subject: [PATCH 101/281] fabrics: drop --disable-sqflow alias -d The alias for --disable-sqflow -d clashes with --device for the discover command. Since the --disable-sqflow is not so commonly used, let's free -d for other uses. Fixes: 18de3a6d61a7 ("Convert to libnvme") Signed-off-by: Daniel Wagner --- Documentation/nvme-config.txt | 3 +-- Documentation/nvme-connect.txt | 3 +-- completions/_nvme | 3 --- completions/bash-nvme-completion.sh | 2 +- fabrics.c | 2 +- 5 files changed, 4 insertions(+), 9 deletions(-) diff --git a/Documentation/nvme-config.txt b/Documentation/nvme-config.txt index 8a66644754..98009e4d8e 100644 --- a/Documentation/nvme-config.txt +++ b/Documentation/nvme-config.txt @@ -27,7 +27,7 @@ SYNOPSIS [--keep-alive-tmo=<#> | -k <#>] [--reconnect-delay=<#> | -c <#>] [--ctrl-loss-tmo=<#> | -l <#>] - [--duplicate-connect | -D] [--disable-sqflow | -d] + [--duplicate-connect | -D] [--disable-sqflow ] [--hdr-digest | -g] [--data-digest | -G] [--output-format= | -o ] [--verbose | -v] @@ -168,7 +168,6 @@ OPTIONS Allows duplicated connections between same transport host and subsystem port. --d:: --disable-sqflow:: Disables SQ flow control to omit head doorbell update for submission queues when sending nvme completions. diff --git a/Documentation/nvme-connect.txt b/Documentation/nvme-connect.txt index 72b80007e9..0112e110be 100644 --- a/Documentation/nvme-connect.txt +++ b/Documentation/nvme-connect.txt @@ -27,7 +27,7 @@ SYNOPSIS [--reconnect-delay=<#> | -c <#>] [--ctrl-loss-tmo=<#> | -l <#>] [--tos=<#> | -T <#>] [--keyring=<#>] [--tls_key=<#>] - [--duplicate-connect | -D] [--disable-sqflow | -d] + [--duplicate-connect | -D] [--disable-sqflow ] [--hdr-digest | -g] [--data-digest | -G] [--tls] [--concat] [--dump-config | -O] [--application=] [--output-format= | -o ] [--verbose | -v] @@ -162,7 +162,6 @@ OPTIONS Allows duplicated connections between same transport host and subsystem port. --d:: --disable-sqflow:: Disables SQ flow control to omit head doorbell update for submission queues when sending nvme completions. diff --git a/completions/_nvme b/completions/_nvme index 70ab9d3e89..0d3ce93c28 100644 --- a/completions/_nvme +++ b/completions/_nvme @@ -2020,7 +2020,6 @@ _nvme () { --duplicate-connect':allow duplicate connections between same transport host and subsystem port' -D':alias for --duplicate-connect' --disable-sqflow':disable controller sq flow control (default false)' - -d':alias for --disable-sqflow' --hdr-digest':enable transport protocol header digest (TCP transport)' -g':alias for --hdr-digest' --data-digest':enable transport protocol data digest (TCP transport)' @@ -2092,7 +2091,6 @@ _nvme () { --duplicate-connect':allow duplicate connections between same transport host and subsystem port' -D':alias for --duplicate-connect' --disable-sqflow':disable controller sq flow control (default false)' - -d':alias for --disable-sqflow' --hdr-digest':enable transport protocol header digest (TCP transport)' -g':alias for --hdr-digest' --data-digest':enable transport protocol data digest (TCP transport)' @@ -2162,7 +2160,6 @@ _nvme () { --duplicate-connect':allow duplicate connections between same transport host and subsystem port' -D':alias for --duplicate-connect' --disable-sqflow':disable controller sq flow control (default false)' - -d':alias for --disable-sqflow' --hdr-digest':enable transport protocol header digest (TCP transport)' -g':alias for --hdr-digest' --data-digest':enable transport protocol data digest (TCP transport)' diff --git a/completions/bash-nvme-completion.sh b/completions/bash-nvme-completion.sh index 8e80ddbf84..bf534bd3b7 100644 --- a/completions/bash-nvme-completion.sh +++ b/completions/bash-nvme-completion.sh @@ -409,7 +409,7 @@ nvme_list_opts () { --nr-poll-queues= -P --queue-size= -Q \ --keep-alive-tmo= -k --reconnect-delay= -r \ --ctrl-loss-tmo= -l --fast-io-fail-tmo= -f \ - --tos= -T --duplicate-connect -D --disable-sqflow -d\ + --tos= -T --duplicate-connect -D --disable-sqflow \ --hdr-digest -g --data-digest -G --output-format= -o" ;; "dim") diff --git a/fabrics.c b/fabrics.c index e204287dcd..035bdf3893 100644 --- a/fabrics.c +++ b/fabrics.c @@ -115,7 +115,7 @@ static const char *nvmf_context = "execution context identification string"; OPT_INT("keyring", 0, &c.keyring, nvmf_keyring), \ OPT_INT("tls_key", 0, &c.tls_key, nvmf_tls_key), \ OPT_FLAG("duplicate-connect", 'D', &c.duplicate_connect, nvmf_dup_connect), \ - OPT_FLAG("disable-sqflow", 'd', &c.disable_sqflow, nvmf_disable_sqflow), \ + OPT_FLAG("disable-sqflow", 0, &c.disable_sqflow, nvmf_disable_sqflow), \ OPT_FLAG("hdr-digest", 'g', &c.hdr_digest, nvmf_hdr_digest), \ OPT_FLAG("data-digest", 'G', &c.data_digest, nvmf_data_digest), \ OPT_FLAG("tls", 0, &c.tls, nvmf_tls), \ From 72f96040f1a9142bbc1ed7f52847be8fda9443c5 Mon Sep 17 00:00:00 2001 From: Daniel Wagner Date: Thu, 11 Jul 2024 19:06:29 +0200 Subject: [PATCH 102/281] fabrics: drop --quiet alias -S -S has been allocated for the global dhchap secret option. It's likely that the --quiet option is less used, thus drop the -S alias for it. Fixes: 0571307d3af0 ("nvme-connect: Add 'dhchap-secret' and 'dhchap-ctrl-secret' arguments") Signed-off-by: Daniel Wagner --- Documentation/nvme-connect-all.txt | 3 +-- Documentation/nvme-discover.txt | 3 +-- completions/_nvme | 2 -- completions/bash-nvme-completion.sh | 4 ++-- fabrics.c | 4 ++-- 5 files changed, 6 insertions(+), 10 deletions(-) diff --git a/Documentation/nvme-connect-all.txt b/Documentation/nvme-connect-all.txt index 4cd1873426..68708e5ffb 100644 --- a/Documentation/nvme-connect-all.txt +++ b/Documentation/nvme-connect-all.txt @@ -27,7 +27,7 @@ SYNOPSIS [--nr-poll-queues=<#> | -P <#>] [--queue-size=<#> | -Q <#>] [--keyring=<#>] [--tls_key=<#>] [--hdr-digest | -g] [--data-digest | -G] - [--persistent | -p] [--tls] [--concat] [--quiet | -S] + [--persistent | -p] [--tls] [--concat] [--quiet] [--dump-config | -O] [--nbft] [--no-nbft] [--nbft-path=] [--context=] [--output-format= | -o ] [--verbose | -v] @@ -189,7 +189,6 @@ OPTIONS --concat:: Enable secure concatenation (TCP). --S:: --quiet:: Suppress error messages. diff --git a/Documentation/nvme-discover.txt b/Documentation/nvme-discover.txt index 1069d3cea1..e3017eb964 100644 --- a/Documentation/nvme-discover.txt +++ b/Documentation/nvme-discover.txt @@ -27,7 +27,7 @@ SYNOPSIS [--nr-poll-queues=<#> | -P <#>] [--queue-size=<#> | -Q <#>] [--keyring=<#>] [--tls_key=<#>] [--hdr-digest | -g] [--data-digest | -G] - [--persistent | -p] [--quiet | -S] [--tls] [--concat] + [--persistent | -p] [--quiet] [--tls] [--concat] [--dump-config | -O] [--output-format= | -o ] [--force] [--nbft] [--no-nbft] [--nbft-path=] [--context=] @@ -209,7 +209,6 @@ OPTIONS --concat:: Enable secure concatenation (TCP). --S:: --quiet:: Suppress already connected errors. diff --git a/completions/_nvme b/completions/_nvme index 0d3ce93c28..47fdd9d330 100644 --- a/completions/_nvme +++ b/completions/_nvme @@ -2032,7 +2032,6 @@ _nvme () { --persistent':' -p':alias for --' --quiet':' - -S':alias for --' --config=':Use specified JSON configuration file or none to disable' -J':alias for --config' --verbose':Increase logging verbosity' @@ -2103,7 +2102,6 @@ _nvme () { --persistent':' -p':alias for --' --quiet':' - -S':alias for --' --config=':Use specified JSON configuration file or none to disable' -J':alias for --config' --verbose':Increase logging verbosity' diff --git a/completions/bash-nvme-completion.sh b/completions/bash-nvme-completion.sh index bf534bd3b7..9e2e2770bd 100644 --- a/completions/bash-nvme-completion.sh +++ b/completions/bash-nvme-completion.sh @@ -388,7 +388,7 @@ nvme_list_opts () { --tos= -T --hdr-digest= -g --data-digest -G \ --nr-io-queues= -i --nr-write-queues= -W \ --nr-poll-queues= -P --queue-size= -Q \ - --persistent -p --quiet -S \ + --persistent -p --quiet \ --output-format= -o" ;; "connect-all") @@ -400,7 +400,7 @@ nvme_list_opts () { --tos= -T --hdr-digest= -g --data-digest -G \ --nr-io-queues= -i --nr-write-queues= -W \ --nr-poll-queues= -P --queue-size= -Q \ - --persistent -p --quiet -S \ + --persistent -p --quiet \ --output-format= -o" ;; "connect") diff --git a/fabrics.c b/fabrics.c index 035bdf3893..1adaa8099f 100644 --- a/fabrics.c +++ b/fabrics.c @@ -421,7 +421,7 @@ static int discover_from_conf_file(nvme_root_t r, nvme_host_t h, OPT_FMT("output-format", 'o', &format, output_format), OPT_FILE("raw", 'r', &raw, "save raw output to file"), OPT_FLAG("persistent", 'p', &persistent, "persistent discovery connection"), - OPT_FLAG("quiet", 'S', &quiet, "suppress already connected errors"), + OPT_FLAG("quiet", 0, &quiet, "suppress already connected errors"), OPT_INCR("verbose", 'v', &verbose, "Increase logging verbosity"), OPT_FLAG("force", 0, &force, "Force persistent discovery controller creation")); @@ -704,7 +704,7 @@ int nvmf_discover(const char *desc, int argc, char **argv, bool connect) OPT_FMT("output-format", 'o', &format, output_format), OPT_FILE("raw", 'r', &raw, "save raw output to file"), OPT_FLAG("persistent", 'p', &persistent, "persistent discovery connection"), - OPT_FLAG("quiet", 'S', &quiet, "suppress already connected errors"), + OPT_FLAG("quiet", 0, &quiet, "suppress already connected errors"), OPT_STRING("config", 'J', "FILE", &config_file, nvmf_config_file), OPT_INCR("verbose", 'v', &verbose, "Increase logging verbosity"), OPT_FLAG("dump-config", 'O', &dump_config, "Dump configuration file to stdout"), From 58f04d731ed92a0dc1caf84f98cfa2345b523d2f Mon Sep 17 00:00:00 2001 From: jeff-lien-wdc Date: Tue, 16 Jul 2024 15:26:49 -0500 Subject: [PATCH 103/281] wdc: OCP 2.5 Log Page Updates Add panic count and prev panic id to Error Recovery log page (0xC1) Add debug telemetry log size to Latency Monitor log page (0xc3) Signed-off-by: jeff-lien-wdc --- plugins/wdc/wdc-nvme.c | 143 +++++++++++++++++++++++++++-------------- plugins/wdc/wdc-nvme.h | 2 +- 2 files changed, 97 insertions(+), 48 deletions(-) diff --git a/plugins/wdc/wdc-nvme.c b/plugins/wdc/wdc-nvme.c index ac6e75c427..fa4157d237 100644 --- a/plugins/wdc/wdc-nvme.c +++ b/plugins/wdc/wdc-nvme.c @@ -1119,14 +1119,14 @@ struct __packed wdc_bd_ca_log_format { __u8 raw_value[8]; }; -#define LATENCY_LOG_BUCKET_READ 3 -#define LATENCY_LOG_BUCKET_WRITE 2 -#define LATENCY_LOG_BUCKET_TRIM 1 -#define LATENCY_LOG_BUCKET_RESERVED 0 +#define WDC_LATENCY_LOG_BUCKET_READ 3 +#define WDC_LATENCY_LOG_BUCKET_WRITE 2 +#define WDC_LATENCY_LOG_BUCKET_TRIM 1 +#define WDC_LATENCY_LOG_BUCKET_RESERVED 0 -#define LATENCY_LOG_MEASURED_LAT_READ 2 -#define LATENCY_LOG_MEASURED_LAT_WRITE 1 -#define LATENCY_LOG_MEASURED_LAT_TRIM 0 +#define WDC_LATENCY_LOG_MEASURED_LAT_READ 2 +#define WDC_LATENCY_LOG_MEASURED_LAT_WRITE 1 +#define WDC_LATENCY_LOG_MEASURED_LAT_TRIM 0 struct __packed wdc_ssd_latency_monitor_log { __u8 feature_status; /* 0x00 */ @@ -1151,8 +1151,9 @@ struct __packed wdc_ssd_latency_monitor_log { __le64 static_latency_timestamp[4][3]; /* 0x130 - 0x18F */ __le16 static_measured_latency[4][3]; /* 0x190 - 0x1A7 */ __le16 static_latency_stamp_units; /* 0x1A8 */ - __u8 rsvd4[0x16]; /* 0x1AA */ + __u8 rsvd4[10]; /* 0x1AA */ + __u8 debug_telemetry_log_size[12]; /* 0x1B4 */ __le16 debug_log_trigger_enable; /* 0x1C0 */ __le16 debug_log_measured_latency; /* 0x1C2 */ __le64 debug_log_latency_stamp; /* 0x1C4 */ @@ -1220,25 +1221,29 @@ struct __packed wdc_ssd_d0_smart_log { #define WDC_OCP_C1_GUID_LENGTH 16 #define WDC_ERROR_REC_LOG_BUF_LEN 512 #define WDC_ERROR_REC_LOG_ID 0xC1 -#define WDC_ERROR_REC_LOG_VERSION1 0001 -#define WDC_ERROR_REC_LOG_VERSION2 0002 struct __packed wdc_ocp_c1_error_recovery_log { - __le16 panic_reset_wait_time; /* 000 - Panic Reset Wait Time */ - __u8 panic_reset_action; /* 002 - Panic Reset Action */ - __u8 dev_recovery_action1; /* 003 - Device Recovery Action 1 */ - __le64 panic_id; /* 004 - Panic ID */ - __le32 dev_capabilities; /* 012 - Device Capabilities */ - __u8 vs_recovery_opc; /* 016 - Vendor Specific Recovery Opcode */ - __u8 rsvd1[3]; /* 017 - 3 Reserved Bytes */ - __le32 vs_cmd_cdw12; /* 020 - Vendor Specific Command CDW12 */ - __le32 vs_cmd_cdw13; /* 024 - Vendor Specific Command CDW13 */ - __u8 vs_cmd_to; /* 028 - Vendor Specific Command Timeout V2 */ - __u8 dev_recovery_action2; /* 029 - Device Recovery Action 2 V2 */ - __u8 dev_recovery_action2_to; /* 030 - Device Recovery Action 2 Timeout V2 */ - __u8 rsvd2[463]; /* 031 - 463 Reserved Bytes */ - __le16 log_page_version; /* 494 - Log Page Version */ - __u8 log_page_guid[WDC_OCP_C1_GUID_LENGTH]; /* 496 - Log Page GUID */ + __le16 panic_reset_wait_time; /* 000 - Panic Reset Wait Time */ + __u8 panic_reset_action; /* 002 - Panic Reset Action */ + __u8 dev_recovery_action1; /* 003 - Device Recovery Action 1 */ + __le64 panic_id; /* 004 - Panic ID */ + __le32 dev_capabilities; /* 012 - Device Capabilities */ + __u8 vs_recovery_opc; /* 016 - Vendor Specific Recovery Opcode */ + __u8 rsvd1[3]; /* 017 - 3 Reserved Bytes */ + __le32 vs_cmd_cdw12; /* 020 - Vendor Specific Command CDW12 */ + __le32 vs_cmd_cdw13; /* 024 - Vendor Specific Command CDW13 */ + __u8 vs_cmd_to; /* 028 - Vendor Specific Command Timeout V2 */ + __u8 dev_recovery_action2; /* 029 - Device Recovery Action 2 V2 */ + __u8 dev_recovery_action2_to; /* 030 - Device Recovery Action 2 Timeout V2 */ + __u8 panic_count; /* 031 - Number of panics encountered */ + __le64 prev_panic_ids[4]; /* 032 - 063 Previous Panic ID's */ + __u8 rsvd2[430]; /* 064 - 493 Reserved Bytes */ + /* 430 reserved bytes aligns with the rest */ + /* of the data structure. The size of 463 */ + /* bytes mentioned in the OCP spec */ + /* (version 2.5) would not fit here. */ + __le16 log_page_version; /* 494 - Log Page Version */ + __u8 log_page_guid[WDC_OCP_C1_GUID_LENGTH]; /* 496 - Log Page GUID */ }; static __u8 wdc_ocp_c1_guid[WDC_OCP_C1_GUID_LENGTH] = { 0x44, 0xD9, 0x31, 0x21, 0xFE, 0x30, 0x34, 0xAE, @@ -4652,20 +4657,30 @@ static int wdc_print_latency_monitor_log_normal(struct nvme_dev *dev, printf(" Active Latency Minimum Window %d ms\n", 100*log_data->active_latency_min_window); printf(" Active Latency Stamp Units %d\n", le16_to_cpu(log_data->active_latency_stamp_units)); printf(" Static Latency Stamp Units %d\n", le16_to_cpu(log_data->static_latency_stamp_units)); - printf(" Debug Log Trigger Enable %d\n", le16_to_cpu(log_data->debug_log_trigger_enable)); + if (le16_to_cpu(log_data->log_page_version) >= 4) + printf(" Debug Telemetry Log Size %"PRIu64"\n", + le64_to_cpu(*(uint64_t *)log_data->debug_telemetry_log_size)); + printf(" Debug Log Trigger Enable %d\n", + le16_to_cpu(log_data->debug_log_trigger_enable)); + printf(" Log Page Version %d\n", + le16_to_cpu(log_data->log_page_version)); + printf(" Log page GUID 0x"); + for (j = 0; j < WDC_C3_GUID_LENGTH; j++) + printf("%x", log_data->log_page_guid[j]); + printf("\n"); printf(" Read Write Deallocate/Trim\n"); for (i = 0; i <= 3; i++) printf(" Active Bucket Counter: Bucket %d %27d %27d %27d\n", - i, le32_to_cpu(log_data->active_bucket_counter[i][LATENCY_LOG_BUCKET_READ]), - le32_to_cpu(log_data->active_bucket_counter[i][LATENCY_LOG_BUCKET_WRITE]), - le32_to_cpu(log_data->active_bucket_counter[i][LATENCY_LOG_BUCKET_TRIM])); + i, le32_to_cpu(log_data->active_bucket_counter[i][WDC_LATENCY_LOG_BUCKET_READ]), + le32_to_cpu(log_data->active_bucket_counter[i][WDC_LATENCY_LOG_BUCKET_WRITE]), + le32_to_cpu(log_data->active_bucket_counter[i][WDC_LATENCY_LOG_BUCKET_TRIM])); for (i = 3; i >= 0; i--) printf(" Active Measured Latency: Bucket %d %27d ms %27d ms %27d ms\n", - 3-i, le16_to_cpu(log_data->active_measured_latency[i][LATENCY_LOG_MEASURED_LAT_READ]), - le16_to_cpu(log_data->active_measured_latency[i][LATENCY_LOG_MEASURED_LAT_WRITE]), - le16_to_cpu(log_data->active_measured_latency[i][LATENCY_LOG_MEASURED_LAT_TRIM])); + 3-i, le16_to_cpu(log_data->active_measured_latency[i][WDC_LATENCY_LOG_MEASURED_LAT_READ]), + le16_to_cpu(log_data->active_measured_latency[i][WDC_LATENCY_LOG_MEASURED_LAT_WRITE]), + le16_to_cpu(log_data->active_measured_latency[i][WDC_LATENCY_LOG_MEASURED_LAT_TRIM])); for (i = 3; i >= 0; i--) { printf(" Active Latency Time Stamp: Bucket %d ", 3-i); @@ -4682,15 +4697,15 @@ static int wdc_print_latency_monitor_log_normal(struct nvme_dev *dev, for (i = 0; i <= 3; i++) printf(" Static Bucket Counter: Bucket %d %27d %27d %27d\n", - i, le32_to_cpu(log_data->static_bucket_counter[i][LATENCY_LOG_BUCKET_READ]), - le32_to_cpu(log_data->static_bucket_counter[i][LATENCY_LOG_BUCKET_WRITE]), - le32_to_cpu(log_data->static_bucket_counter[i][LATENCY_LOG_BUCKET_TRIM])); + i, le32_to_cpu(log_data->static_bucket_counter[i][WDC_LATENCY_LOG_BUCKET_READ]), + le32_to_cpu(log_data->static_bucket_counter[i][WDC_LATENCY_LOG_BUCKET_WRITE]), + le32_to_cpu(log_data->static_bucket_counter[i][WDC_LATENCY_LOG_BUCKET_TRIM])); for (i = 3; i >= 0; i--) printf(" Static Measured Latency: Bucket %d %27d ms %27d ms %27d ms\n", - 3-i, le16_to_cpu(log_data->static_measured_latency[i][LATENCY_LOG_MEASURED_LAT_READ]), - le16_to_cpu(log_data->static_measured_latency[i][LATENCY_LOG_MEASURED_LAT_WRITE]), - le16_to_cpu(log_data->static_measured_latency[i][LATENCY_LOG_MEASURED_LAT_TRIM])); + 3-i, le16_to_cpu(log_data->static_measured_latency[i][WDC_LATENCY_LOG_MEASURED_LAT_READ]), + le16_to_cpu(log_data->static_measured_latency[i][WDC_LATENCY_LOG_MEASURED_LAT_WRITE]), + le16_to_cpu(log_data->static_measured_latency[i][WDC_LATENCY_LOG_MEASURED_LAT_TRIM])); for (i = 3; i >= 0; i--) { printf(" Static Latency Time Stamp: Bucket %d ", 3-i); @@ -4726,7 +4741,22 @@ static void wdc_print_latency_monitor_log_json(struct wdc_ssd_latency_monitor_lo json_object_add_value_int(root, "Active Lantency Minimum Window", 100*log_data->active_latency_min_window); json_object_add_value_int(root, "Active Latency Stamp Units", le16_to_cpu(log_data->active_latency_stamp_units)); json_object_add_value_int(root, "Static Latency Stamp Units", le16_to_cpu(log_data->static_latency_stamp_units)); - json_object_add_value_int(root, "Debug Log Trigger Enable", le16_to_cpu(log_data->debug_log_trigger_enable)); + if (le16_to_cpu(log_data->log_page_version) >= 4) { + json_object_add_value_int(root, "Debug Telemetry Log Size", + le64_to_cpu(*(uint64_t *)log_data->debug_telemetry_log_size)); + } + json_object_add_value_int(root, "Debug Log Trigger Enable", + le16_to_cpu(log_data->debug_log_trigger_enable)); + json_object_add_value_int(root, "Log Page Version", + le16_to_cpu(log_data->log_page_version)); + + char guid[40]; + + memset((void *)guid, 0, 40); + sprintf((char *)guid, "0x%"PRIx64"%"PRIx64"", + (uint64_t)le64_to_cpu(*(uint64_t *)&log_data->log_page_guid[8]), + (uint64_t)le64_to_cpu(*(uint64_t *)&log_data->log_page_guid[0])); + json_object_add_value_string(root, "Log page GUID", guid); for (i = 0; i <= 3; i++) { for (j = 2; j >= 0; j--) { @@ -4785,13 +4815,20 @@ static void wdc_print_error_rec_log_normal(struct wdc_ocp_c1_error_recovery_log printf(" Vendor Specific Recovery Opcode : 0x%x\n", log_data->vs_recovery_opc); printf(" Vendor Specific Command CDW12 : 0x%x\n", le32_to_cpu(log_data->vs_cmd_cdw12)); printf(" Vendor Specific Command CDW13 : 0x%x\n", le32_to_cpu(log_data->vs_cmd_cdw13)); - if (le16_to_cpu(log_data->log_page_version) == WDC_ERROR_REC_LOG_VERSION2) { + if (le16_to_cpu(log_data->log_page_version) >= 2) { printf(" Vendor Specific Command Timeout : 0x%x\n", log_data->vs_cmd_to); printf(" Device Recovery Action 2 : 0x%x\n", log_data->dev_recovery_action2); printf(" Device Recovery Action 2 Timeout : 0x%x\n", log_data->dev_recovery_action2_to); } - printf(" Log Page Version : 0x%x\n", le16_to_cpu(log_data->log_page_version)); - printf(" Log page GUID : 0x"); + if (le16_to_cpu(log_data->log_page_version) >= 3) { + printf(" Panic Count : 0x%x\n", log_data->panic_count); + for (j = 0; j < 4; j++) + printf(" Previous Panic ID N-%d : 0x%"PRIx64"\n", + j+1, le64_to_cpu(log_data->prev_panic_ids[j])); + } + printf(" Log Page Version : 0x%x\n", + le16_to_cpu(log_data->log_page_version)); + printf(" Log page GUID : 0x"); for (j = 0; j < WDC_OCP_C1_GUID_LENGTH; j++) printf("%x", log_data->log_page_guid[j]); printf("\n"); @@ -4799,6 +4836,8 @@ static void wdc_print_error_rec_log_normal(struct wdc_ocp_c1_error_recovery_log static void wdc_print_error_rec_log_json(struct wdc_ocp_c1_error_recovery_log *log_data) { + int j; + char buf[128]; struct json_object *root = json_create_object(); json_object_add_value_int(root, "Panic Reset Wait Time", le16_to_cpu(log_data->panic_reset_wait_time)); @@ -4809,12 +4848,21 @@ static void wdc_print_error_rec_log_json(struct wdc_ocp_c1_error_recovery_log *l json_object_add_value_int(root, "Vendor Specific Recovery Opcode", log_data->vs_recovery_opc); json_object_add_value_int(root, "Vendor Specific Command CDW12", le32_to_cpu(log_data->vs_cmd_cdw12)); json_object_add_value_int(root, "Vendor Specific Command CDW13", le32_to_cpu(log_data->vs_cmd_cdw13)); - if (le16_to_cpu(log_data->log_page_version) == WDC_ERROR_REC_LOG_VERSION2) { + if (le16_to_cpu(log_data->log_page_version) >= 2) { json_object_add_value_int(root, "Vendor Specific Command Timeout", log_data->vs_cmd_to); json_object_add_value_int(root, "Device Recovery Action 2", log_data->dev_recovery_action2); json_object_add_value_int(root, "Device Recovery Action 2 Timeout", log_data->dev_recovery_action2_to); } - json_object_add_value_int(root, "Log Page Version", le16_to_cpu(log_data->log_page_version)); + if (le16_to_cpu(log_data->log_page_version) >= 3) { + json_object_add_value_int(root, "Panic Count", log_data->panic_count); + for (j = 0; j < 4; j++) { + sprintf(buf, "Previous Panic ID N-%d", j+1); + json_object_add_value_int(root, buf, + le64_to_cpu(log_data->prev_panic_ids[j])); + } + } + json_object_add_value_int(root, "Log Page Version", + le16_to_cpu(log_data->log_page_version)); char guid[40]; @@ -7351,9 +7399,10 @@ static int wdc_get_ocp_c1_log_page(nvme_root_t r, struct nvme_dev *dev, char *fo log_data = (struct wdc_ocp_c1_error_recovery_log *)data; /* check log page version */ - if ((log_data->log_page_version != WDC_ERROR_REC_LOG_VERSION1) && - (log_data->log_page_version != WDC_ERROR_REC_LOG_VERSION2)) { - fprintf(stderr, "ERROR: WDC: invalid error recovery log version - %d\n", log_data->log_page_version); + if ((log_data->log_page_version < 1) || + (log_data->log_page_version > 3)) { + fprintf(stderr, "ERROR: WDC: invalid error recovery log version - %d\n", + log_data->log_page_version); ret = -1; goto out; } diff --git a/plugins/wdc/wdc-nvme.h b/plugins/wdc/wdc-nvme.h index e2343b7656..a18da16501 100644 --- a/plugins/wdc/wdc-nvme.h +++ b/plugins/wdc/wdc-nvme.h @@ -5,7 +5,7 @@ #if !defined(WDC_NVME) || defined(CMD_HEADER_MULTI_READ) #define WDC_NVME -#define WDC_PLUGIN_VERSION "2.9.0" +#define WDC_PLUGIN_VERSION "2.9.1" #include "cmd.h" PLUGIN(NAME("wdc", "Western Digital vendor specific extensions", WDC_PLUGIN_VERSION), From 8259e8ff1255fe3e72b478103f399b2b0bd641d6 Mon Sep 17 00:00:00 2001 From: Tokunori Ikegami Date: Fri, 19 Jul 2024 00:11:10 +0900 Subject: [PATCH 104/281] nvme: return -ENXIO value to open device if errno not set The APIs may not set errno so set errno to ENXIO before the device open. Signed-off-by: Tokunori Ikegami --- nvme.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/nvme.c b/nvme.c index dad7161062..e33a048df4 100644 --- a/nvme.c +++ b/nvme.c @@ -417,13 +417,14 @@ static int get_dev(struct nvme_dev **dev, int argc, char **argv, int flags) return ret; devname = argv[optind]; + errno = ENXIO; if (!strncmp(devname, "mctp:", strlen("mctp:"))) ret = open_dev_mi_mctp(dev, devname); else ret = open_dev_direct(dev, devname, flags); - return ret != 0 ? -errno : 0; + return ret ? -errno : 0; } static int parse_args(int argc, char *argv[], const char *desc, From 0598cd639c5e0935d7224162a06f6508f3a7c6f7 Mon Sep 17 00:00:00 2001 From: Daniel Wagner Date: Thu, 1 Aug 2024 13:23:28 +0200 Subject: [PATCH 105/281] nvme: extend help message when mmap regs fails Newer kernels enable the lockdown feature when secure boot is enabled. This feature also prevents the register mapping into userspace. Thus it is not enough to have CONFIG_IO_STRICT_DEVMEM disabled. Extend the message with the hint also to disable secure boot. While at it, also lower the reporting level to INFO, so that one single '-v' is enough to get this information. Signed-off-by: Daniel Wagner --- nvme.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/nvme.c b/nvme.c index e33a048df4..3c144698f4 100644 --- a/nvme.c +++ b/nvme.c @@ -5353,7 +5353,7 @@ static void *mmap_registers(struct nvme_dev *dev, bool writable) sprintf(path, "/sys/class/nvme/%s/device/resource0", dev->name); fd = open(path, writable ? O_RDWR : O_RDONLY); if (fd < 0) { - if (log_level >= LOG_DEBUG) + if (log_level >= LOG_INFO) nvme_show_error("%s did not find a pci resource, open failed %s", dev->name, strerror(errno)); return NULL; @@ -5361,9 +5361,12 @@ static void *mmap_registers(struct nvme_dev *dev, bool writable) membase = mmap(NULL, getpagesize(), prot, MAP_SHARED, fd, 0); if (membase == MAP_FAILED) { - if (log_level >= LOG_DEBUG) { - fprintf(stderr, "%s failed to map. ", dev->name); - fprintf(stderr, "Did your kernel enable CONFIG_IO_STRICT_DEVMEM?\n"); + if (log_level >= LOG_INFO) { + fprintf(stderr, "Failed to map registers to userspace.\n\n" + "Did your kernel enable CONFIG_IO_STRICT_DEVMEM?\n" + "You can disable this feature with command line argument\n\n" + "\tio_memory=relaxed\n\n" + "Also ensure secure boot is disabled.\n\n"); } membase = NULL; } From 353e0fb908beb80fd4fdeb7057b3a9cc90474c3d Mon Sep 17 00:00:00 2001 From: Daniel Wagner Date: Thu, 1 Aug 2024 15:08:06 +0200 Subject: [PATCH 106/281] fabrics: do not leak nvme_ctrl_t object on connect valgrinds reports that the nvme_ctrl_t is leaked in the connect command. Let's introduced a new cleanup helper for this. Signed-off-by: Daniel Wagner --- fabrics.c | 2 +- util/cleanup.h | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/fabrics.c b/fabrics.c index 1adaa8099f..438604ac7a 100644 --- a/fabrics.c +++ b/fabrics.c @@ -899,7 +899,7 @@ int nvmf_connect(const char *desc, int argc, char **argv) unsigned int verbose = 0; _cleanup_nvme_root_ nvme_root_t r = NULL; nvme_host_t h; - nvme_ctrl_t c; + _cleanup_nvme_ctrl_ nvme_ctrl_t c = NULL; int ret; nvme_print_flags_t flags; struct nvme_fabrics_config cfg = { 0 }; diff --git a/util/cleanup.h b/util/cleanup.h index f2acde0d3d..ff26cda3e9 100644 --- a/util/cleanup.h +++ b/util/cleanup.h @@ -42,6 +42,9 @@ static inline void cleanup_nvme_root(nvme_root_t *r) } #define _cleanup_nvme_root_ __cleanup__(cleanup_nvme_root) +static inline DEFINE_CLEANUP_FUNC(cleanup_nvme_ctrl, nvme_ctrl_t, nvme_free_ctrl) +#define _cleanup_nvme_ctrl_ __cleanup__(cleanup_nvme_ctrl) + static inline void free_uri(struct nvme_fabrics_uri **uri) { if (*uri) From ea015e9b6cb10527e55bbf0f7b01640a370632d4 Mon Sep 17 00:00:00 2001 From: Martin George Date: Fri, 2 Aug 2024 00:32:27 +0530 Subject: [PATCH 107/281] nvme: avoid segfault in show-topology The show-topology command currently ends in a segfault for ENOENT scenarios: nvme show-topology Failed to scan topology: No such file or directory Segmentation fault (core dumped) Fix this by eliminating the call to nvme_free_tree() since the cleanup helper is already available here. Signed-off-by: Martin George --- nvme.c | 1 - 1 file changed, 1 deletion(-) diff --git a/nvme.c b/nvme.c index 3c144698f4..20dfee6489 100644 --- a/nvme.c +++ b/nvme.c @@ -9585,7 +9585,6 @@ static int show_topology_cmd(int argc, char **argv, struct command *command, str err = nvme_scan_topology(r, NULL, NULL); if (err < 0) { nvme_show_error("Failed to scan topology: %s", nvme_strerror(errno)); - nvme_free_tree(r); return err; } From 2f091d9bacd5d771d468678ccce2ea7f49beba7a Mon Sep 17 00:00:00 2001 From: Martin George Date: Fri, 2 Aug 2024 00:37:12 +0530 Subject: [PATCH 108/281] fabrics: avoid potential segfault in nvmf_dim() Eliminate the call to nvme_free_tree() in nvmf_dim() since the cleanup helper is already available here. Signed-off-by: Martin George --- fabrics.c | 1 - 1 file changed, 1 deletion(-) diff --git a/fabrics.c b/fabrics.c index 438604ac7a..db1b7cb041 100644 --- a/fabrics.c +++ b/fabrics.c @@ -1455,7 +1455,6 @@ int nvmf_dim(const char *desc, int argc, char **argv) fprintf(stderr, "Did not find device %s: %s\n", p, nvme_strerror(errno)); - nvme_free_tree(r); return -errno; } dim_operation(c, tas, p); From eeea85c97c11825c244dd6afcc6292c4f37c34e4 Mon Sep 17 00:00:00 2001 From: Milan Broz Date: Thu, 1 Aug 2024 10:41:50 +0200 Subject: [PATCH 109/281] sed: Fix parsing of Discovery0 features TCG SED features have variable sizes, so the code needs to use stored length to move the offset for the next feature. Otherwise, it checks the code at the wrong offset. Signed-off-by: Milan Broz --- plugins/sed/sedopal_cmd.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/plugins/sed/sedopal_cmd.c b/plugins/sed/sedopal_cmd.c index c55d3d0b6d..d9a789c017 100644 --- a/plugins/sed/sedopal_cmd.c +++ b/plugins/sed/sedopal_cmd.c @@ -474,7 +474,7 @@ void sedopal_print_locking_features(uint8_t features) int sedopal_cmd_discover(int fd) { #ifdef IOC_OPAL_DISCOVERY - int rc; + int rc, feat_length; bool sedopal_locking_supported = false; struct opal_discovery discover; struct level_0_discovery_header *dh; @@ -509,6 +509,7 @@ int sedopal_cmd_discover(int fd) */ while (feat < feat_end) { code = be16toh(feat->code); + feat_length = feat->length + 4 /* hdr */; switch (code) { case OPAL_FEATURE_CODE_LOCKING: locking_flags = feat->feature; @@ -520,7 +521,7 @@ int sedopal_cmd_discover(int fd) break; } - feat++; + feat = (struct level_0_discovery_features *)((char *)feat + feat_length); } rc = 0; From 7ace3983733141952681c0ec0fd9a7f389609ff2 Mon Sep 17 00:00:00 2001 From: Daniel Wagner Date: Fri, 2 Aug 2024 09:54:53 +0200 Subject: [PATCH 110/281] build: bump libnvme wrap Update to libnvme v1.10 release. Signed-off-by: Daniel Wagner --- subprojects/libnvme.wrap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subprojects/libnvme.wrap b/subprojects/libnvme.wrap index 85e83ac083..76f1ebc9d5 100644 --- a/subprojects/libnvme.wrap +++ b/subprojects/libnvme.wrap @@ -1,6 +1,6 @@ [wrap-git] url = https://github.com/linux-nvme/libnvme.git -revision = f39802f9e6a9bc90cd7d45fcb1a5195d1890e74d +revision = dd51fa8550564c93436423a4d8ed4be92ae50290 [provide] libnvme = libnvme_dep From c9e8ec48cf0307d3bb6f46c5bd67e3357fc61f61 Mon Sep 17 00:00:00 2001 From: Daniel Wagner Date: Fri, 2 Aug 2024 09:58:11 +0200 Subject: [PATCH 111/281] doc: Regenerate all docs for v2.10 Signed-off-by: Daniel Wagner --- Documentation/nvme-admin-passthru.1 | 11 +- Documentation/nvme-admin-passthru.html | 15 +- Documentation/nvme-ana-log.1 | 4 +- Documentation/nvme-ana-log.html | 2 +- Documentation/nvme-attach-ns.1 | 4 +- Documentation/nvme-attach-ns.html | 2 +- Documentation/nvme-boot-part-log.1 | 4 +- Documentation/nvme-boot-part-log.html | 2 +- Documentation/nvme-capacity-mgmt.1 | 10 +- Documentation/nvme-capacity-mgmt.html | 16 +- Documentation/nvme-changed-ns-list-log.1 | 4 +- Documentation/nvme-changed-ns-list-log.html | 2 +- Documentation/nvme-cmdset-ind-id-ns.1 | 4 +- Documentation/nvme-cmdset-ind-id-ns.html | 2 +- Documentation/nvme-compare.1 | 10 +- Documentation/nvme-compare.html | 13 +- Documentation/nvme-connect-all.1 | 8 +- Documentation/nvme-connect-all.html | 7 +- Documentation/nvme-connect.1 | 12 +- Documentation/nvme-connect.html | 9 +- Documentation/nvme-copy.1 | 10 +- Documentation/nvme-copy.html | 16 +- Documentation/nvme-create-ns.1 | 9 +- Documentation/nvme-create-ns.html | 13 +- Documentation/nvme-delete-ns.1 | 10 +- Documentation/nvme-delete-ns.html | 16 +- Documentation/nvme-dera-stat.1 | 4 +- Documentation/nvme-dera-stat.html | 2 +- Documentation/nvme-detach-ns.1 | 4 +- Documentation/nvme-detach-ns.html | 2 +- Documentation/nvme-device-self-test.1 | 10 +- Documentation/nvme-device-self-test.html | 16 +- Documentation/nvme-dim.1 | 4 +- Documentation/nvme-dim.html | 2 +- Documentation/nvme-dir-receive.1 | 10 +- Documentation/nvme-dir-receive.html | 16 +- Documentation/nvme-dir-send.1 | 10 +- Documentation/nvme-dir-send.html | 16 +- Documentation/nvme-disconnect-all.1 | 4 +- Documentation/nvme-disconnect-all.html | 2 +- Documentation/nvme-disconnect.1 | 4 +- Documentation/nvme-disconnect.html | 2 +- Documentation/nvme-discover.1 | 8 +- Documentation/nvme-discover.html | 7 +- Documentation/nvme-dsm.1 | 10 +- Documentation/nvme-dsm.html | 16 +- Documentation/nvme-effects-log.1 | 10 +- Documentation/nvme-effects-log.html | 16 +- Documentation/nvme-endurance-event-agg-log.1 | 4 +- .../nvme-endurance-event-agg-log.html | 2 +- Documentation/nvme-endurance-log.1 | 4 +- Documentation/nvme-endurance-log.html | 2 +- Documentation/nvme-error-log.1 | 4 +- Documentation/nvme-error-log.html | 2 +- Documentation/nvme-fdp-configs.1 | 4 +- Documentation/nvme-fdp-configs.html | 2 +- Documentation/nvme-fdp-events.1 | 4 +- Documentation/nvme-fdp-events.html | 2 +- Documentation/nvme-fdp-set-events.1 | 4 +- Documentation/nvme-fdp-set-events.html | 2 +- Documentation/nvme-fdp-stats.1 | 4 +- Documentation/nvme-fdp-stats.html | 2 +- Documentation/nvme-fdp-status.1 | 4 +- Documentation/nvme-fdp-status.html | 2 +- Documentation/nvme-fdp-update.1 | 4 +- Documentation/nvme-fdp-update.html | 2 +- Documentation/nvme-fdp-usage.1 | 4 +- Documentation/nvme-fdp-usage.html | 2 +- Documentation/nvme-fid-support-effects-log.1 | 4 +- .../nvme-fid-support-effects-log.html | 2 +- Documentation/nvme-flush.1 | 4 +- Documentation/nvme-flush.html | 2 +- Documentation/nvme-format.1 | 8 +- Documentation/nvme-format.html | 8 +- Documentation/nvme-fw-commit.1 | 10 +- Documentation/nvme-fw-commit.html | 16 +- Documentation/nvme-fw-download.1 | 10 +- Documentation/nvme-fw-download.html | 16 +- Documentation/nvme-fw-log.1 | 4 +- Documentation/nvme-fw-log.html | 2 +- Documentation/nvme-gen-hostnqn.1 | 4 +- Documentation/nvme-gen-hostnqn.html | 2 +- Documentation/nvme-get-feature.1 | 10 +- Documentation/nvme-get-feature.html | 16 +- Documentation/nvme-get-lba-status.1 | 4 +- Documentation/nvme-get-lba-status.html | 2 +- Documentation/nvme-get-log.1 | 4 +- Documentation/nvme-get-log.html | 2 +- Documentation/nvme-get-ns-id.1 | 4 +- Documentation/nvme-get-ns-id.html | 2 +- Documentation/nvme-get-property.1 | 10 +- Documentation/nvme-get-property.html | 16 +- Documentation/nvme-help.1 | 4 +- Documentation/nvme-help.html | 2 +- Documentation/nvme-huawei-id-ctrl.1 | 4 +- Documentation/nvme-huawei-id-ctrl.html | 2 +- Documentation/nvme-huawei-list.1 | 4 +- Documentation/nvme-huawei-list.html | 2 +- Documentation/nvme-id-ctrl.1 | 4 +- Documentation/nvme-id-ctrl.html | 2 +- Documentation/nvme-id-domain.1 | 4 +- Documentation/nvme-id-domain.html | 2 +- Documentation/nvme-id-iocs.1 | 4 +- Documentation/nvme-id-iocs.html | 2 +- Documentation/nvme-id-ns.1 | 4 +- Documentation/nvme-id-ns.html | 2 +- Documentation/nvme-id-nvmset.1 | 4 +- Documentation/nvme-id-nvmset.html | 2 +- Documentation/nvme-inspur-nvme-vendor-log.1 | 4 +- .../nvme-inspur-nvme-vendor-log.html | 2 +- Documentation/nvme-intel-id-ctrl.1 | 4 +- Documentation/nvme-intel-id-ctrl.html | 2 +- Documentation/nvme-intel-internal-log.1 | 4 +- Documentation/nvme-intel-internal-log.html | 2 +- Documentation/nvme-intel-lat-stats.1 | 4 +- Documentation/nvme-intel-lat-stats.html | 2 +- Documentation/nvme-intel-market-name.1 | 4 +- Documentation/nvme-intel-market-name.html | 2 +- Documentation/nvme-intel-smart-log-add.1 | 4 +- Documentation/nvme-intel-smart-log-add.html | 2 +- Documentation/nvme-intel-temp-stats.1 | 4 +- Documentation/nvme-intel-temp-stats.html | 2 +- Documentation/nvme-io-mgmt-recv.1 | 10 +- Documentation/nvme-io-mgmt-recv.html | 16 +- Documentation/nvme-io-mgmt-send.1 | 10 +- Documentation/nvme-io-mgmt-send.html | 16 +- Documentation/nvme-io-passthru.1 | 11 +- Documentation/nvme-io-passthru.html | 15 +- Documentation/nvme-lba-status-log.1 | 4 +- Documentation/nvme-lba-status-log.html | 2 +- Documentation/nvme-list-ctrl.1 | 4 +- Documentation/nvme-list-ctrl.html | 2 +- Documentation/nvme-list-endgrp.1 | 4 +- Documentation/nvme-list-endgrp.html | 2 +- Documentation/nvme-list-ns.1 | 10 +- Documentation/nvme-list-ns.html | 16 +- Documentation/nvme-list-subsys.1 | 4 +- Documentation/nvme-list-subsys.html | 2 +- Documentation/nvme-list.1 | 4 +- Documentation/nvme-list.html | 2 +- Documentation/nvme-lockdown.1 | 10 +- Documentation/nvme-lockdown.html | 16 +- .../nvme-mi-cmd-support-effects-log.1 | 4 +- .../nvme-mi-cmd-support-effects-log.html | 2 +- Documentation/nvme-micron-clear-pcie-errors.1 | 4 +- .../nvme-micron-clear-pcie-errors.html | 2 +- Documentation/nvme-micron-internal-log.1 | 4 +- Documentation/nvme-micron-internal-log.html | 2 +- Documentation/nvme-micron-nand-stats.1 | 4 +- Documentation/nvme-micron-nand-stats.html | 2 +- Documentation/nvme-micron-pcie-stats.1 | 4 +- Documentation/nvme-micron-pcie-stats.html | 2 +- .../nvme-micron-selective-download.1 | 4 +- .../nvme-micron-selective-download.html | 2 +- Documentation/nvme-micron-smart-add-log.1 | 4 +- Documentation/nvme-micron-smart-add-log.html | 2 +- Documentation/nvme-micron-temperature-stats.1 | 4 +- .../nvme-micron-temperature-stats.html | 2 +- Documentation/nvme-netapp-ontapdevices.1 | 4 +- Documentation/nvme-netapp-ontapdevices.html | 2 +- Documentation/nvme-netapp-smdevices.1 | 4 +- Documentation/nvme-netapp-smdevices.html | 2 +- Documentation/nvme-ns-descs.1 | 4 +- Documentation/nvme-ns-descs.html | 2 +- Documentation/nvme-ns-rescan.1 | 4 +- Documentation/nvme-ns-rescan.html | 2 +- Documentation/nvme-nvm-id-ctrl.1 | 4 +- Documentation/nvme-nvm-id-ctrl.html | 2 +- Documentation/nvme-nvme-mi-recv.1 | 4 +- Documentation/nvme-nvme-mi-recv.html | 2 +- Documentation/nvme-nvme-mi-send.1 | 4 +- Documentation/nvme-nvme-mi-send.html | 2 +- .../nvme-ocp-clear-fw-activate-history.1 | 4 +- .../nvme-ocp-clear-fw-activate-history.html | 2 +- ...cp-clear-pcie-correctable-error-counters.1 | 4 +- ...clear-pcie-correctable-error-counters.html | 2 +- .../nvme-ocp-device-capability-log.1 | 81 ++ .../nvme-ocp-device-capability-log.html | 818 +++++++++++++++ Documentation/nvme-ocp-eol-plp-failure-mode.1 | 6 +- .../nvme-ocp-eol-plp-failure-mode.html | 4 +- Documentation/nvme-ocp-error-recovery-log.1 | 81 ++ .../nvme-ocp-error-recovery-log.html | 818 +++++++++++++++ .../nvme-ocp-get-dssd-async-event-config.1 | 116 +++ .../nvme-ocp-get-dssd-async-event-config.html | 853 ++++++++++++++++ .../nvme-ocp-get-dssd-power-state-feature.1 | 149 +++ ...nvme-ocp-get-dssd-power-state-feature.html | 890 ++++++++++++++++ .../nvme-ocp-get-plp-health-check-interval.1 | 116 +++ ...vme-ocp-get-plp-health-check-interval.html | 854 ++++++++++++++++ Documentation/nvme-ocp-internal-log.1 | 177 ++++ Documentation/nvme-ocp-internal-log.html | 925 +++++++++++++++++ Documentation/nvme-ocp-latency-monitor-log.1 | 4 +- .../nvme-ocp-latency-monitor-log.html | 2 +- .../nvme-ocp-set-dssd-async-event-config.1 | 81 ++ .../nvme-ocp-set-dssd-async-event-config.html | 829 +++++++++++++++ .../nvme-ocp-set-dssd-power-state-feature.1 | 78 ++ ...nvme-ocp-set-dssd-power-state-feature.html | 819 +++++++++++++++ .../nvme-ocp-set-plp-health-check-interval.1 | 86 ++ ...vme-ocp-set-plp-health-check-interval.html | 841 +++++++++++++++ .../nvme-ocp-set-telemetry-profile.1 | 77 ++ .../nvme-ocp-set-telemetry-profile.html | 819 +++++++++++++++ Documentation/nvme-ocp-smart-add-log.1 | 4 +- Documentation/nvme-ocp-smart-add-log.html | 2 +- .../nvme-ocp-tcg-configuration-log.html | 819 +++++++++++++++ .../nvme-ocp-telemetry-string-log-page.1 | 76 ++ .../nvme-ocp-telemetry-string-log-page.html | 818 +++++++++++++++ .../nvme-ocp-unsupported-reqs-log-pages.html | 819 +++++++++++++++ Documentation/nvme-ocp-unsupported-reqs-log.1 | 76 ++ Documentation/nvme-persistent-event-log.1 | 4 +- Documentation/nvme-persistent-event-log.html | 2 +- Documentation/nvme-pred-lat-event-agg-log.1 | 4 +- .../nvme-pred-lat-event-agg-log.html | 2 +- Documentation/nvme-predictable-lat-log.1 | 4 +- Documentation/nvme-predictable-lat-log.html | 2 +- Documentation/nvme-primary-ctrl-caps.1 | 4 +- Documentation/nvme-primary-ctrl-caps.html | 2 +- Documentation/nvme-read.1 | 10 +- Documentation/nvme-read.html | 13 +- Documentation/nvme-reset.1 | 4 +- Documentation/nvme-reset.html | 2 +- Documentation/nvme-resv-acquire.1 | 10 +- Documentation/nvme-resv-acquire.html | 13 +- Documentation/nvme-resv-notif-log.1 | 4 +- Documentation/nvme-resv-notif-log.html | 2 +- Documentation/nvme-resv-register.1 | 10 +- Documentation/nvme-resv-register.html | 16 +- Documentation/nvme-resv-release.1 | 10 +- Documentation/nvme-resv-release.html | 13 +- Documentation/nvme-resv-report.1 | 10 +- Documentation/nvme-resv-report.html | 16 +- Documentation/nvme-rpmb.1 | 4 +- Documentation/nvme-rpmb.html | 2 +- Documentation/nvme-sanitize-log.1 | 4 +- Documentation/nvme-sanitize-log.html | 2 +- Documentation/nvme-sanitize.1 | 4 +- Documentation/nvme-sanitize.html | 2 +- .../nvme-seagate-clear-fw-activate-history.1 | 4 +- ...vme-seagate-clear-fw-activate-history.html | 2 +- ...me-seagate-clear-pcie-correctable-errors.1 | 4 +- ...seagate-clear-pcie-correctable-errors.html | 2 +- .../nvme-seagate-cloud-SSD-plugin-version.1 | 4 +- ...nvme-seagate-cloud-SSD-plugin-version.html | 2 +- Documentation/nvme-seagate-get-ctrl-tele.1 | 4 +- Documentation/nvme-seagate-get-ctrl-tele.html | 2 +- Documentation/nvme-seagate-get-host-tele.1 | 4 +- Documentation/nvme-seagate-get-host-tele.html | 2 +- Documentation/nvme-seagate-help.1 | 4 +- Documentation/nvme-seagate-help.html | 2 +- Documentation/nvme-seagate-plugin-version.1 | 4 +- .../nvme-seagate-plugin-version.html | 2 +- Documentation/nvme-seagate-version.1 | 4 +- Documentation/nvme-seagate-version.html | 2 +- .../nvme-seagate-vs-fw-activate-history.1 | 4 +- .../nvme-seagate-vs-fw-activate-history.html | 2 +- Documentation/nvme-seagate-vs-internal-log.1 | 4 +- .../nvme-seagate-vs-internal-log.html | 2 +- Documentation/nvme-seagate-vs-log-page-sup.1 | 4 +- .../nvme-seagate-vs-log-page-sup.html | 2 +- Documentation/nvme-seagate-vs-pcie-stats.1 | 4 +- Documentation/nvme-seagate-vs-pcie-stats.html | 2 +- Documentation/nvme-seagate-vs-smart-add-log.1 | 4 +- .../nvme-seagate-vs-smart-add-log.html | 2 +- .../nvme-seagate-vs-temperature-stats.1 | 4 +- .../nvme-seagate-vs-temperature-stats.html | 2 +- Documentation/nvme-security-recv.1 | 10 +- Documentation/nvme-security-recv.html | 13 +- Documentation/nvme-security-send.1 | 10 +- Documentation/nvme-security-send.html | 13 +- Documentation/nvme-self-test-log.1 | 4 +- Documentation/nvme-self-test-log.html | 2 +- Documentation/nvme-set-feature.1 | 10 +- Documentation/nvme-set-feature.html | 16 +- Documentation/nvme-set-property.1 | 10 +- Documentation/nvme-set-property.html | 16 +- Documentation/nvme-show-hostnqn.1 | 4 +- Documentation/nvme-show-hostnqn.html | 2 +- Documentation/nvme-show-regs.1 | 10 +- Documentation/nvme-show-regs.html | 16 +- Documentation/nvme-show-topology.1 | 4 +- Documentation/nvme-show-topology.html | 2 +- Documentation/nvme-smart-log.1 | 4 +- Documentation/nvme-smart-log.html | 2 +- Documentation/nvme-subsystem-reset.1 | 4 +- Documentation/nvme-subsystem-reset.html | 2 +- Documentation/nvme-supported-log-pages.1 | 4 +- Documentation/nvme-supported-log-pages.html | 2 +- Documentation/nvme-telemetry-log.1 | 4 +- Documentation/nvme-telemetry-log.html | 2 +- Documentation/nvme-tls-key.1 | 225 ++++ Documentation/nvme-tls-key.html | 958 ++++++++++++++++++ ...me-toshiba-clear-pcie-correctable-errors.1 | 4 +- ...toshiba-clear-pcie-correctable-errors.html | 2 +- Documentation/nvme-toshiba-vs-internal-log.1 | 4 +- .../nvme-toshiba-vs-internal-log.html | 2 +- Documentation/nvme-toshiba-vs-smart-add-log.1 | 4 +- .../nvme-toshiba-vs-smart-add-log.html | 2 +- Documentation/nvme-transcend-badblock.1 | 4 +- Documentation/nvme-transcend-badblock.html | 2 +- Documentation/nvme-transcend-healthvalue.1 | 4 +- Documentation/nvme-transcend-healthvalue.html | 2 +- Documentation/nvme-verify.1 | 10 +- Documentation/nvme-verify.html | 16 +- .../nvme-virtium-save-smart-to-vtview-log.1 | 4 +- ...nvme-virtium-save-smart-to-vtview-log.html | 2 +- Documentation/nvme-virtium-show-identify.1 | 4 +- Documentation/nvme-virtium-show-identify.html | 2 +- Documentation/nvme-wdc-cap-diag.1 | 4 +- Documentation/nvme-wdc-cap-diag.html | 2 +- Documentation/nvme-wdc-capabilities.1 | 4 +- Documentation/nvme-wdc-capabilities.html | 2 +- Documentation/nvme-wdc-clear-assert-dump.1 | 4 +- Documentation/nvme-wdc-clear-assert-dump.html | 2 +- .../nvme-wdc-clear-fw-activate-history.1 | 4 +- .../nvme-wdc-clear-fw-activate-history.html | 2 +- .../nvme-wdc-clear-pcie-correctable-errors.1 | 4 +- ...vme-wdc-clear-pcie-correctable-errors.html | 2 +- .../nvme-wdc-cloud-SSD-plugin-version.1 | 4 +- .../nvme-wdc-cloud-SSD-plugin-version.html | 2 +- .../nvme-wdc-cloud-boot-SSD-version.1 | 4 +- .../nvme-wdc-cloud-boot-SSD-version.html | 2 +- Documentation/nvme-wdc-drive-essentials.1 | 4 +- Documentation/nvme-wdc-drive-essentials.html | 2 +- Documentation/nvme-wdc-drive-log.1 | 4 +- Documentation/nvme-wdc-drive-log.html | 2 +- Documentation/nvme-wdc-drive-resize.1 | 4 +- Documentation/nvme-wdc-drive-resize.html | 2 +- Documentation/nvme-wdc-enc-get-log.1 | 4 +- Documentation/nvme-wdc-enc-get-log.html | 2 +- Documentation/nvme-wdc-get-crash-dump.1 | 4 +- Documentation/nvme-wdc-get-crash-dump.html | 2 +- .../nvme-wdc-get-dev-capabilities-log.1 | 4 +- .../nvme-wdc-get-dev-capabilities-log.html | 2 +- Documentation/nvme-wdc-get-drive-status.1 | 4 +- Documentation/nvme-wdc-get-drive-status.html | 2 +- .../nvme-wdc-get-error-recovery-log.1 | 4 +- .../nvme-wdc-get-error-recovery-log.html | 2 +- .../nvme-wdc-get-latency-monitor-log.1 | 4 +- .../nvme-wdc-get-latency-monitor-log.html | 2 +- Documentation/nvme-wdc-get-pfail-dump.1 | 4 +- Documentation/nvme-wdc-get-pfail-dump.html | 2 +- .../nvme-wdc-get-unsupported-reqs-log.1 | 4 +- .../nvme-wdc-get-unsupported-reqs-log.html | 2 +- Documentation/nvme-wdc-id-ctrl.1 | 4 +- Documentation/nvme-wdc-id-ctrl.html | 2 +- Documentation/nvme-wdc-log-page-directory.1 | 4 +- .../nvme-wdc-log-page-directory.html | 2 +- Documentation/nvme-wdc-namespace-resize.1 | 4 +- Documentation/nvme-wdc-namespace-resize.html | 2 +- Documentation/nvme-wdc-purge-monitor.1 | 4 +- Documentation/nvme-wdc-purge-monitor.html | 2 +- Documentation/nvme-wdc-purge.1 | 4 +- Documentation/nvme-wdc-purge.html | 2 +- Documentation/nvme-wdc-vs-cloud-log.1 | 4 +- Documentation/nvme-wdc-vs-cloud-log.html | 2 +- Documentation/nvme-wdc-vs-device-waf.1 | 4 +- Documentation/nvme-wdc-vs-device-waf.html | 2 +- Documentation/nvme-wdc-vs-drive-info.1 | 4 +- Documentation/nvme-wdc-vs-drive-info.html | 2 +- .../nvme-wdc-vs-error-reason-identifier.1 | 4 +- .../nvme-wdc-vs-error-reason-identifier.html | 2 +- .../nvme-wdc-vs-fw-activate-history.1 | 4 +- .../nvme-wdc-vs-fw-activate-history.html | 2 +- Documentation/nvme-wdc-vs-hw-rev-log.1 | 4 +- Documentation/nvme-wdc-vs-hw-rev-log.html | 2 +- Documentation/nvme-wdc-vs-internal-log.1 | 4 +- Documentation/nvme-wdc-vs-internal-log.html | 2 +- Documentation/nvme-wdc-vs-nand-stats.1 | 4 +- Documentation/nvme-wdc-vs-nand-stats.html | 2 +- Documentation/nvme-wdc-vs-smart-add-log.1 | 4 +- Documentation/nvme-wdc-vs-smart-add-log.html | 2 +- .../nvme-wdc-vs-telemetry-controller-option.1 | 4 +- ...me-wdc-vs-telemetry-controller-option.html | 2 +- Documentation/nvme-wdc-vs-temperature-stats.1 | 4 +- .../nvme-wdc-vs-temperature-stats.html | 2 +- Documentation/nvme-write-uncor.1 | 10 +- Documentation/nvme-write-uncor.html | 16 +- Documentation/nvme-write-zeroes.1 | 10 +- Documentation/nvme-write-zeroes.html | 16 +- Documentation/nvme-write.1 | 10 +- Documentation/nvme-write.html | 13 +- Documentation/nvme-zns-changed-zone-list.1 | 4 +- Documentation/nvme-zns-changed-zone-list.html | 2 +- Documentation/nvme-zns-close-zone.1 | 4 +- Documentation/nvme-zns-close-zone.html | 2 +- Documentation/nvme-zns-finish-zone.1 | 4 +- Documentation/nvme-zns-finish-zone.html | 2 +- Documentation/nvme-zns-id-ctrl.1 | 4 +- Documentation/nvme-zns-id-ctrl.html | 2 +- Documentation/nvme-zns-id-ns.1 | 4 +- Documentation/nvme-zns-id-ns.html | 2 +- Documentation/nvme-zns-offline-zone.1 | 4 +- Documentation/nvme-zns-offline-zone.html | 2 +- Documentation/nvme-zns-open-zone.1 | 4 +- Documentation/nvme-zns-open-zone.html | 2 +- Documentation/nvme-zns-report-zones.1 | 4 +- Documentation/nvme-zns-report-zones.html | 2 +- Documentation/nvme-zns-reset-zone.1 | 4 +- Documentation/nvme-zns-reset-zone.html | 2 +- Documentation/nvme-zns-set-zone-desc.1 | 4 +- Documentation/nvme-zns-set-zone-desc.html | 2 +- Documentation/nvme-zns-zone-append.1 | 4 +- Documentation/nvme-zns-zone-append.html | 2 +- Documentation/nvme-zns-zone-mgmt-recv.1 | 4 +- Documentation/nvme-zns-zone-mgmt-recv.html | 2 +- Documentation/nvme-zns-zone-mgmt-send.1 | 4 +- Documentation/nvme-zns-zone-mgmt-send.html | 2 +- Documentation/nvme.1 | 9 +- Documentation/nvme.html | 10 +- 407 files changed, 14523 insertions(+), 631 deletions(-) create mode 100644 Documentation/nvme-ocp-device-capability-log.1 create mode 100644 Documentation/nvme-ocp-device-capability-log.html create mode 100644 Documentation/nvme-ocp-error-recovery-log.1 create mode 100644 Documentation/nvme-ocp-error-recovery-log.html create mode 100644 Documentation/nvme-ocp-get-dssd-async-event-config.1 create mode 100644 Documentation/nvme-ocp-get-dssd-async-event-config.html create mode 100644 Documentation/nvme-ocp-get-dssd-power-state-feature.1 create mode 100644 Documentation/nvme-ocp-get-dssd-power-state-feature.html create mode 100644 Documentation/nvme-ocp-get-plp-health-check-interval.1 create mode 100644 Documentation/nvme-ocp-get-plp-health-check-interval.html create mode 100644 Documentation/nvme-ocp-internal-log.1 create mode 100644 Documentation/nvme-ocp-internal-log.html create mode 100644 Documentation/nvme-ocp-set-dssd-async-event-config.1 create mode 100644 Documentation/nvme-ocp-set-dssd-async-event-config.html create mode 100644 Documentation/nvme-ocp-set-dssd-power-state-feature.1 create mode 100644 Documentation/nvme-ocp-set-dssd-power-state-feature.html create mode 100644 Documentation/nvme-ocp-set-plp-health-check-interval.1 create mode 100644 Documentation/nvme-ocp-set-plp-health-check-interval.html create mode 100644 Documentation/nvme-ocp-set-telemetry-profile.1 create mode 100644 Documentation/nvme-ocp-set-telemetry-profile.html create mode 100644 Documentation/nvme-ocp-tcg-configuration-log.html create mode 100644 Documentation/nvme-ocp-telemetry-string-log-page.1 create mode 100644 Documentation/nvme-ocp-telemetry-string-log-page.html create mode 100644 Documentation/nvme-ocp-unsupported-reqs-log-pages.html create mode 100644 Documentation/nvme-ocp-unsupported-reqs-log.1 create mode 100644 Documentation/nvme-tls-key.1 create mode 100644 Documentation/nvme-tls-key.html diff --git a/Documentation/nvme-admin-passthru.1 b/Documentation/nvme-admin-passthru.1 index dfdc6d501a..ca80f9f9fc 100644 --- a/Documentation/nvme-admin-passthru.1 +++ b/Documentation/nvme-admin-passthru.1 @@ -2,12 +2,12 @@ .\" Title: nvme-admin-passthru .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ADMIN\-PASSTHR" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-ADMIN\-PASSTHR" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -43,7 +43,7 @@ nvme-admin-passthru \- Submit an arbitrary admin command, return results [\-\-metadata\-len= | \-m ] [\-\-input\-file= | \-i ] [\-\-read | \-r] [\-\-write | \-w] - [\-\-timeout= | \-t ] + [\-\-timeout= | \-t ] [\-\-show\-command | \-s] [\-\-dry\-run | \-d] [\-\-raw\-binary | \-b] @@ -146,6 +146,11 @@ or .RS 4 Increase the information detail in the output\&. .RE +.PP +\-t , \-\-timeout= +.RS 4 +Override default timeout value\&. In milliseconds\&. +.RE .SH "EXAMPLES" .sp .RS 4 diff --git a/Documentation/nvme-admin-passthru.html b/Documentation/nvme-admin-passthru.html index 9b0e6fec53..d3a69d6ac9 100644 --- a/Documentation/nvme-admin-passthru.html +++ b/Documentation/nvme-admin-passthru.html @@ -760,7 +760,7 @@

SYNOPSIS

[--metadata-len=<len> | -m <len>] [--input-file=<file> | -i <file>] [--read | -r] [--write | -w] - [--timeout=<to> | -t <to>] + [--timeout=<timeout> | -t <timeout>] [--show-command | -s] [--dry-run | -d] [--raw-binary | -b] @@ -985,6 +985,17 @@

OPTIONS

Increase the information detail in the output.

+
+-t <timeout> +
+
+--timeout=<timeout> +
+
+

+ Override default timeout value. In milliseconds. +

+
@@ -1027,7 +1038,7 @@

NVME

diff --git a/Documentation/nvme-ana-log.1 b/Documentation/nvme-ana-log.1 index a3be9dcb6e..db1c41d1ba 100644 --- a/Documentation/nvme-ana-log.1 +++ b/Documentation/nvme-ana-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-ana-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ANA\-LOG" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-ANA\-LOG" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-ana-log.html b/Documentation/nvme-ana-log.html index 758400deaf..9e58b7cdb0 100644 --- a/Documentation/nvme-ana-log.html +++ b/Documentation/nvme-ana-log.html @@ -835,7 +835,7 @@

NVME

diff --git a/Documentation/nvme-attach-ns.1 b/Documentation/nvme-attach-ns.1 index 89ce4e6882..3312fb5855 100644 --- a/Documentation/nvme-attach-ns.1 +++ b/Documentation/nvme-attach-ns.1 @@ -2,12 +2,12 @@ .\" Title: nvme-attach-ns .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ATTACH\-NS" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-ATTACH\-NS" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-attach-ns.html b/Documentation/nvme-attach-ns.html index 04eba16da8..b8eaf2961c 100644 --- a/Documentation/nvme-attach-ns.html +++ b/Documentation/nvme-attach-ns.html @@ -841,7 +841,7 @@

NVME

diff --git a/Documentation/nvme-boot-part-log.1 b/Documentation/nvme-boot-part-log.1 index 59a8aa4fdf..c4e83031fe 100644 --- a/Documentation/nvme-boot-part-log.1 +++ b/Documentation/nvme-boot-part-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-boot-part-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-BOOT\-PART\-LO" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-BOOT\-PART\-LO" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-boot-part-log.html b/Documentation/nvme-boot-part-log.html index 66eba37915..77c3a1ce9a 100644 --- a/Documentation/nvme-boot-part-log.html +++ b/Documentation/nvme-boot-part-log.html @@ -846,7 +846,7 @@

NVME

diff --git a/Documentation/nvme-capacity-mgmt.1 b/Documentation/nvme-capacity-mgmt.1 index d5827a47ae..702c6baaed 100644 --- a/Documentation/nvme-capacity-mgmt.1 +++ b/Documentation/nvme-capacity-mgmt.1 @@ -2,12 +2,12 @@ .\" Title: nvme-capacity-mgmt .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-CAPACITY\-MGMT" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-CAPACITY\-MGMT" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -37,6 +37,7 @@ nvme-capacity-mgmt \- Send capacity management command to configure/create/delet [\-\-cap\-lower= | \-l ] [\-\-cap\-upper= | \-u ] [\-\-output\-format= | \-o ] [\-\-verbose | \-v] + [\-\-timeout= | \-t ] .fi .SH "DESCRIPTION" .sp @@ -78,6 +79,11 @@ or .RS 4 Increase the information detail in the output\&. .RE +.PP +\-t , \-\-timeout= +.RS 4 +Override default timeout value\&. In milliseconds\&. +.RE .SH "EXAMPLES" .sp No examples provided yet\&. diff --git a/Documentation/nvme-capacity-mgmt.html b/Documentation/nvme-capacity-mgmt.html index 6c61b6c840..9bcf48bbb5 100644 --- a/Documentation/nvme-capacity-mgmt.html +++ b/Documentation/nvme-capacity-mgmt.html @@ -753,7 +753,8 @@

SYNOPSIS

[--element-id=<element-id> | -i <element-id>] [--cap-lower=<cap-lower> | -l <cap-lower>] [--cap-upper=<cap-upper> | -u <cap-upper>] - [--output-format=<fmt> | -o <fmt>] [--verbose | -v] + [--output-format=<fmt> | -o <fmt>] [--verbose | -v] + [--timeout=<timeout> | -t <timeout>]
@@ -843,6 +844,17 @@

OPTIONS

Increase the information detail in the output.

+
+-t <timeout> +
+
+--timeout=<timeout> +
+
+

+ Override default timeout value. In milliseconds. +

+
@@ -863,7 +875,7 @@

NVME

diff --git a/Documentation/nvme-changed-ns-list-log.1 b/Documentation/nvme-changed-ns-list-log.1 index 2856bd2e3c..6fd24f46d2 100644 --- a/Documentation/nvme-changed-ns-list-log.1 +++ b/Documentation/nvme-changed-ns-list-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-changed-ns-list-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-CHANGED\-NS\-L" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-CHANGED\-NS\-L" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-changed-ns-list-log.html b/Documentation/nvme-changed-ns-list-log.html index c63e40a836..59b916f9eb 100644 --- a/Documentation/nvme-changed-ns-list-log.html +++ b/Documentation/nvme-changed-ns-list-log.html @@ -846,7 +846,7 @@

NVME

diff --git a/Documentation/nvme-cmdset-ind-id-ns.1 b/Documentation/nvme-cmdset-ind-id-ns.1 index eff07d165e..6310d5f211 100644 --- a/Documentation/nvme-cmdset-ind-id-ns.1 +++ b/Documentation/nvme-cmdset-ind-id-ns.1 @@ -2,12 +2,12 @@ .\" Title: nvme-cmdset-ind-id-ns .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-CMDSET\-IND\-I" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-CMDSET\-IND\-I" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-cmdset-ind-id-ns.html b/Documentation/nvme-cmdset-ind-id-ns.html index 86766ccafd..d1f0fc5a63 100644 --- a/Documentation/nvme-cmdset-ind-id-ns.html +++ b/Documentation/nvme-cmdset-ind-id-ns.html @@ -889,7 +889,7 @@

NVME

diff --git a/Documentation/nvme-compare.1 b/Documentation/nvme-compare.1 index 0448c1310d..fed76b699c 100644 --- a/Documentation/nvme-compare.1 +++ b/Documentation/nvme-compare.1 @@ -2,12 +2,12 @@ .\" Title: nvme-compare .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-COMPARE" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-COMPARE" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -54,6 +54,7 @@ nvme-compare \- Send an NVMe Compare command, provide results [\-\-storage\-tag\-check | \-C] [\-\-force] [\-\-output\-format= | \-o ] [\-\-verbose | \-v] + [\-\-timeout=] .fi .SH "DESCRIPTION" .sp @@ -221,6 +222,11 @@ or .RS 4 Increase the information detail in the output\&. .RE +.PP +\-\-timeout= +.RS 4 +Override default timeout value\&. In milliseconds\&. +.RE .SH "EXAMPLES" .sp No examples yet\&. diff --git a/Documentation/nvme-compare.html b/Documentation/nvme-compare.html index 76a5ac6099..9c8604c16f 100644 --- a/Documentation/nvme-compare.html +++ b/Documentation/nvme-compare.html @@ -770,7 +770,8 @@

SYNOPSIS

[--storage-tag<storage-tag> | -g <storage-tag>] [--storage-tag-check | -C] [--force] - [--output-format=<fmt> | -o <fmt>] [--verbose | -v] + [--output-format=<fmt> | -o <fmt>] [--verbose | -v] + [--timeout=<timeout>]
@@ -1096,6 +1097,14 @@

OPTIONS

Increase the information detail in the output.

+
+--timeout=<timeout> +
+
+

+ Override default timeout value. In milliseconds. +

+
@@ -1116,7 +1125,7 @@

NVME

diff --git a/Documentation/nvme-connect-all.1 b/Documentation/nvme-connect-all.1 index 996276f723..012af88e46 100644 --- a/Documentation/nvme-connect-all.1 +++ b/Documentation/nvme-connect-all.1 @@ -2,12 +2,12 @@ .\" Title: nvme-connect-all .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-CONNECT\-ALL" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-CONNECT\-ALL" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -51,7 +51,7 @@ nvme-connect-all \- Discover and Connect to Fabrics controllers\&. [\-\-nr\-poll\-queues=<#> | \-P <#>] [\-\-queue\-size=<#> | \-Q <#>] [\-\-keyring=<#>] [\-\-tls_key=<#>] [\-\-hdr\-digest | \-g] [\-\-data\-digest | \-G] - [\-\-persistent | \-p] [\-\-tls] [\-\-concat] [\-\-quiet | \-S] + [\-\-persistent | \-p] [\-\-tls] [\-\-concat] [\-\-quiet] [\-\-dump\-config | \-O] [\-\-nbft] [\-\-no\-nbft] [\-\-nbft\-path=] [\-\-context=] [\-\-output\-format= | \-o ] [\-\-verbose | \-v] @@ -234,7 +234,7 @@ Enable TLS encryption (TCP)\&. Enable secure concatenation (TCP)\&. .RE .PP -\-S, \-\-quiet +\-\-quiet .RS 4 Suppress error messages\&. .RE diff --git a/Documentation/nvme-connect-all.html b/Documentation/nvme-connect-all.html index 8e544ec441..31aca99fe9 100644 --- a/Documentation/nvme-connect-all.html +++ b/Documentation/nvme-connect-all.html @@ -768,7 +768,7 @@

SYNOPSIS

[--nr-poll-queues=<#> | -P <#>] [--queue-size=<#> | -Q <#>] [--keyring=<#>] [--tls_key=<#>] [--hdr-digest | -g] [--data-digest | -G] - [--persistent | -p] [--tls] [--concat] [--quiet | -S] + [--persistent | -p] [--tls] [--concat] [--quiet] [--dump-config | -O] [--nbft] [--no-nbft] [--nbft-path=<STR>] [--context=<STR>] [--output-format=<fmt> | -o <fmt>] [--verbose | -v] @@ -1124,9 +1124,6 @@

OPTIONS

--S -
-
--quiet
@@ -1276,7 +1273,7 @@

NVME

diff --git a/Documentation/nvme-connect.1 b/Documentation/nvme-connect.1 index d52f721fef..76ce9f2c1f 100644 --- a/Documentation/nvme-connect.1 +++ b/Documentation/nvme-connect.1 @@ -2,12 +2,12 @@ .\" Title: nvme-connect .\" Author: [see the "AUTHORS" section] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-CONNECT" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-CONNECT" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -51,7 +51,7 @@ nvme-connect \- Connect to a Fabrics controller\&. [\-\-reconnect\-delay=<#> | \-c <#>] [\-\-ctrl\-loss\-tmo=<#> | \-l <#>] [\-\-tos=<#> | \-T <#>] [\-\-keyring=<#>] [\-\-tls_key=<#>] - [\-\-duplicate\-connect | \-D] [\-\-disable\-sqflow | \-d] + [\-\-duplicate\-connect | \-D] [\-\-disable\-sqflow ] [\-\-hdr\-digest | \-g] [\-\-data\-digest | \-G] [\-\-tls] [\-\-concat] [\-\-dump\-config | \-O] [\-\-application=] [\-\-output\-format= | \-o ] [\-\-verbose | \-v] @@ -188,7 +188,9 @@ Overrides the default delay (in seconds) before reconnect is attempted after a c .PP \-l <#>, \-\-ctrl\-loss\-tmo=<#> .RS 4 -Overrides the default controller loss timeout period (in seconds)\&. +Overrides the default controller loss timeout period (in seconds)\&. This is the maximum time the kernel will retry a connection, where each retry will be issued after +\fIreconnect\-delay\fR +seconds\&. .RE .PP \-T <#>, \-\-tos=<#> @@ -211,7 +213,7 @@ TLS key for the connection (TCP)\&. Allows duplicated connections between same transport host and subsystem port\&. .RE .PP -\-d, \-\-disable\-sqflow +\-\-disable\-sqflow .RS 4 Disables SQ flow control to omit head doorbell update for submission queues when sending nvme completions\&. .RE diff --git a/Documentation/nvme-connect.html b/Documentation/nvme-connect.html index 0b13a38482..36511d76c1 100644 --- a/Documentation/nvme-connect.html +++ b/Documentation/nvme-connect.html @@ -768,7 +768,7 @@

SYNOPSIS

[--reconnect-delay=<#> | -c <#>] [--ctrl-loss-tmo=<#> | -l <#>] [--tos=<#> | -T <#>] [--keyring=<#>] [--tls_key=<#>] - [--duplicate-connect | -D] [--disable-sqflow | -d] + [--duplicate-connect | -D] [--disable-sqflow ] [--hdr-digest | -g] [--data-digest | -G] [--tls] [--concat] [--dump-config | -O] [--application=<id>] [--output-format=<fmt> | -o <fmt>] [--verbose | -v] @@ -1039,6 +1039,8 @@

OPTIONS

Overrides the default controller loss timeout period (in seconds). + This is the maximum time the kernel will retry a connection, where each + retry will be issued after reconnect-delay seconds.

@@ -1081,9 +1083,6 @@

OPTIONS

--d -
-
--disable-sqflow
@@ -1219,7 +1218,7 @@

NVME

diff --git a/Documentation/nvme-copy.1 b/Documentation/nvme-copy.1 index 75e9068245..c024452bec 100644 --- a/Documentation/nvme-copy.1 +++ b/Documentation/nvme-copy.1 @@ -2,12 +2,12 @@ .\" Title: nvme-copy .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-COPY" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-COPY" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -51,6 +51,7 @@ nvme-copy \- Send an NVMe Simple Copy command, provide results [\-\-dir\-spec= | \-S ] [\-\-format= | \-F ] [\-\-output\-format= | \-o ] [\-\-verbose | \-v] + [\-\-timeout= | \-t ] .fi .SH "DESCRIPTION" .sp @@ -160,6 +161,11 @@ or .RS 4 Increase the information detail in the output\&. .RE +.PP +\-t , \-\-timeout= +.RS 4 +Override default timeout value\&. In milliseconds\&. +.RE .SH "EXAMPLES" .sp No examples yet\&. diff --git a/Documentation/nvme-copy.html b/Documentation/nvme-copy.html index bcd1f4e097..255a3a91b0 100644 --- a/Documentation/nvme-copy.html +++ b/Documentation/nvme-copy.html @@ -767,7 +767,8 @@

SYNOPSIS

[--dir-type=<type> | -T <type>] [--dir-spec=<spec> | -S <spec>] [--format=<entry-format> | -F <entry-format>] - [--output-format=<fmt> | -o <fmt>] [--verbose | -v] + [--output-format=<fmt> | -o <fmt>] [--verbose | -v] + [--timeout=<timeout> | -t <timeout>]
@@ -1010,6 +1011,17 @@

OPTIONS

Increase the information detail in the output.

+
+-t <timeout> +
+
+--timeout=<timeout> +
+
+

+ Override default timeout value. In milliseconds. +

+
@@ -1030,7 +1042,7 @@

NVME

diff --git a/Documentation/nvme-create-ns.1 b/Documentation/nvme-create-ns.1 index 85fd6c42e2..c4d12ab022 100644 --- a/Documentation/nvme-create-ns.1 +++ b/Documentation/nvme-create-ns.1 @@ -2,12 +2,12 @@ .\" Title: nvme-create-ns .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-CREATE\-NS" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-CREATE\-NS" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -169,6 +169,11 @@ or .RS 4 Increase the information detail in the output\&. .RE +.PP +\-t , \-\-timeout= +.RS 4 +Override default timeout value 120,000\&. In milliseconds\&. +.RE .SH "EXAMPLES" .sp .RS 4 diff --git a/Documentation/nvme-create-ns.html b/Documentation/nvme-create-ns.html index dcdeb3b11f..8a8b8b386d 100644 --- a/Documentation/nvme-create-ns.html +++ b/Documentation/nvme-create-ns.html @@ -1040,6 +1040,17 @@

OPTIONS

Increase the information detail in the output.

+
+-t <timeout> +
+
+--timeout=<timeout> +
+
+

+ Override default timeout value 120,000. In milliseconds. +

+
@@ -1071,7 +1082,7 @@

NVME

diff --git a/Documentation/nvme-delete-ns.1 b/Documentation/nvme-delete-ns.1 index 15451d1e03..b55169c0f8 100644 --- a/Documentation/nvme-delete-ns.1 +++ b/Documentation/nvme-delete-ns.1 @@ -2,12 +2,12 @@ .\" Title: nvme-id-ns .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ID\-NS" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-ID\-NS" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -34,6 +34,7 @@ nvme-delete-ns \- Send NVMe Namespace Management delete namespace command, retur .nf \fInvme delete\-ns\fR [\-\-namespace\-id= | \-n ] [\-\-output\-format= | \-o ] [\-\-verbose | \-v] + [\-\-timeout= | \-t ] .fi .SH "DESCRIPTION" .sp @@ -60,6 +61,11 @@ or .RS 4 Increase the information detail in the output\&. .RE +.PP +\-t , \-\-timeout= +.RS 4 +Override default timeout value 120,000\&. In milliseconds\&. +.RE .SH "EXAMPLES" .sp No examples yet\&. diff --git a/Documentation/nvme-delete-ns.html b/Documentation/nvme-delete-ns.html index abc5c6f1db..0b608a3349 100644 --- a/Documentation/nvme-delete-ns.html +++ b/Documentation/nvme-delete-ns.html @@ -750,7 +750,8 @@

SYNOPSIS

nvme delete-ns <device> [--namespace-id=<nsid> | -n <nsid>]
-                        [--output-format=<fmt> | -o <fmt>] [--verbose | -v]
+ [--output-format=<fmt> | -o <fmt>] [--verbose | -v] + [--timeout=<timeout> | -t <timeout>]
@@ -803,6 +804,17 @@

OPTIONS

Increase the information detail in the output.

+
+-t <timeout> +
+
+--timeout=<timeout> +
+
+

+ Override default timeout value 120,000. In milliseconds. +

+
@@ -823,7 +835,7 @@

NVME

diff --git a/Documentation/nvme-dera-stat.1 b/Documentation/nvme-dera-stat.1 index 4c769ef7f6..1f2f90db12 100644 --- a/Documentation/nvme-dera-stat.1 +++ b/Documentation/nvme-dera-stat.1 @@ -2,12 +2,12 @@ .\" Title: nvme-dera-stat .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-DERA\-STAT" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-DERA\-STAT" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-dera-stat.html b/Documentation/nvme-dera-stat.html index ed01f01ce6..7cb3244d96 100644 --- a/Documentation/nvme-dera-stat.html +++ b/Documentation/nvme-dera-stat.html @@ -797,7 +797,7 @@

NVME

diff --git a/Documentation/nvme-detach-ns.1 b/Documentation/nvme-detach-ns.1 index 35a40d5d43..545c61935c 100644 --- a/Documentation/nvme-detach-ns.1 +++ b/Documentation/nvme-detach-ns.1 @@ -2,12 +2,12 @@ .\" Title: nvme-detach-ns .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-DETACH\-NS" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-DETACH\-NS" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-detach-ns.html b/Documentation/nvme-detach-ns.html index 79e524b033..66d16a1bcf 100644 --- a/Documentation/nvme-detach-ns.html +++ b/Documentation/nvme-detach-ns.html @@ -834,7 +834,7 @@

NVME

diff --git a/Documentation/nvme-device-self-test.1 b/Documentation/nvme-device-self-test.1 index a97f4fb1f6..43c0aa179b 100644 --- a/Documentation/nvme-device-self-test.1 +++ b/Documentation/nvme-device-self-test.1 @@ -2,12 +2,12 @@ .\" Title: nvme-device-self-test .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-DEVICE\-SELF\-" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-DEVICE\-SELF\-" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -35,6 +35,7 @@ nvme-device-self-test \- Perform the necessary tests to observe the performance \fInvme device\-self\-test\fR [\-\-namespace\-id= | \-n ] [\-\-self\-test\-code= | \-s ] [\-\-wait | \-w] [\-\-output\-format= | \-o ] [\-\-verbose | \-v] + [\-\-timeout= | \-t ] .fi .SH "DESCRIPTION" .sp @@ -73,6 +74,11 @@ or .RS 4 Increase the information detail in the output\&. .RE +.PP +\-t , \-\-timeout= +.RS 4 +Override default timeout value\&. In milliseconds\&. +.RE .SH "EXAMPLES" .sp .RS 4 diff --git a/Documentation/nvme-device-self-test.html b/Documentation/nvme-device-self-test.html index 468765c6ba..94665276fd 100644 --- a/Documentation/nvme-device-self-test.html +++ b/Documentation/nvme-device-self-test.html @@ -751,7 +751,8 @@

SYNOPSIS

nvme device-self-test <device> [--namespace-id=<NUM> | -n <NUM>]
                         [--self-test-code=<NUM> | -s <NUM>] [--wait | -w]
-                        [--output-format=<fmt> | -o <fmt>] [--verbose | -v]
+ [--output-format=<fmt> | -o <fmt>] [--verbose | -v] + [--timeout=<timeout> | -t <timeout>]
@@ -833,6 +834,17 @@

OPTIONS

Increase the information detail in the output.

+
+-t <timeout> +
+
+--timeout=<timeout> +
+
+

+ Override default timeout value. In milliseconds. +

+
@@ -872,7 +884,7 @@

NVME

diff --git a/Documentation/nvme-dim.1 b/Documentation/nvme-dim.1 index 5ae4d80197..f763ccefb3 100644 --- a/Documentation/nvme-dim.1 +++ b/Documentation/nvme-dim.1 @@ -2,12 +2,12 @@ .\" Title: nvme-dim .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-DIM" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-DIM" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-dim.html b/Documentation/nvme-dim.html index 1561b7819e..e3de906a71 100644 --- a/Documentation/nvme-dim.html +++ b/Documentation/nvme-dim.html @@ -885,7 +885,7 @@

NVME

diff --git a/Documentation/nvme-dir-receive.1 b/Documentation/nvme-dir-receive.1 index 0eaeb417a4..b61db0397e 100644 --- a/Documentation/nvme-dir-receive.1 +++ b/Documentation/nvme-dir-receive.1 @@ -2,12 +2,12 @@ .\" Title: nvme-dir-receive .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-DIR\-RECEIVE" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-DIR\-RECEIVE" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -40,6 +40,7 @@ nvme-dir-receive \- Send a directive receive command, returns applicable results [\-\-req\-resource= | \-r ] [\-\-human\-readable | \-H] [\-\-raw\-binary | \-b] [\-\-output\-format= | \-o ] [\-\-verbose | \-v] + [\-\-timeout= | \-t ] .fi .SH "DESCRIPTION" .sp @@ -143,6 +144,11 @@ or .RS 4 Increase the information detail in the output\&. .RE +.PP +\-t , \-\-timeout= +.RS 4 +Override default timeout value\&. In milliseconds\&. +.RE .SH "EXAMPLES" .sp .RS 4 diff --git a/Documentation/nvme-dir-receive.html b/Documentation/nvme-dir-receive.html index 07c49d281e..7ede777dd0 100644 --- a/Documentation/nvme-dir-receive.html +++ b/Documentation/nvme-dir-receive.html @@ -756,7 +756,8 @@

SYNOPSIS

[--dir-oper=<doper> | -O <doper>] [--req-resource=<nsr> | -r <nsr>] [--human-readable | -H] [--raw-binary | -b] - [--output-format=<fmt> | -o <fmt>] [--verbose | -v] + [--output-format=<fmt> | -o <fmt>] [--verbose | -v] + [--timeout=<timeout> | -t <timeout>]
@@ -931,6 +932,17 @@

OPTIONS

Increase the information detail in the output.

+
+-t <timeout> +
+
+--timeout=<timeout> +
+
+

+ Override default timeout value. In milliseconds. +

+
@@ -989,7 +1001,7 @@

NVME

diff --git a/Documentation/nvme-dir-send.1 b/Documentation/nvme-dir-send.1 index 2655e9ffd8..e274189963 100644 --- a/Documentation/nvme-dir-send.1 +++ b/Documentation/nvme-dir-send.1 @@ -2,12 +2,12 @@ .\" Title: nvme-dir-send .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-DIR\-SEND" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-DIR\-SEND" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -41,6 +41,7 @@ nvme-dir-send \- Issue a directive send command, returns applicable results [\-\-target\-dir= | \-T ] [\-\-human\-readable | \-H] [\-\-raw\-binary | \-b] [\-\-output\-format= | \-o ] [\-\-verbose | \-v] + [\-\-timeout= | \-t ] .fi .SH "DESCRIPTION" .sp @@ -149,6 +150,11 @@ or .RS 4 Increase the information detail in the output\&. .RE +.PP +\-t , \-\-timeout= +.RS 4 +Override default timeout value\&. In milliseconds\&. +.RE .SH "EXAMPLES" .sp .RS 4 diff --git a/Documentation/nvme-dir-send.html b/Documentation/nvme-dir-send.html index 63c7e69769..444cf0e3a4 100644 --- a/Documentation/nvme-dir-send.html +++ b/Documentation/nvme-dir-send.html @@ -757,7 +757,8 @@

SYNOPSIS

[--endir=<endir> | -e <endir>] [--target-dir=<tdir> | -T <tdir>] [--human-readable | -H] [--raw-binary | -b] - [--output-format=<fmt> | -o <fmt>] [--verbose | -v] + [--output-format=<fmt> | -o <fmt>] [--verbose | -v] + [--timeout=<timeout> | -t <timeout>]
@@ -944,6 +945,17 @@

OPTIONS

Increase the information detail in the output.

+
+-t <timeout> +
+
+--timeout=<timeout> +
+
+

+ Override default timeout value. In milliseconds. +

+
@@ -1002,7 +1014,7 @@

NVME

diff --git a/Documentation/nvme-disconnect-all.1 b/Documentation/nvme-disconnect-all.1 index 4af7e9d5b5..39843bb238 100644 --- a/Documentation/nvme-disconnect-all.1 +++ b/Documentation/nvme-disconnect-all.1 @@ -2,12 +2,12 @@ .\" Title: nvme-disconnect-all .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-DISCONNECT\-AL" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-DISCONNECT\-AL" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-disconnect-all.html b/Documentation/nvme-disconnect-all.html index 9b286ad160..1160acb403 100644 --- a/Documentation/nvme-disconnect-all.html +++ b/Documentation/nvme-disconnect-all.html @@ -825,7 +825,7 @@

NVME

diff --git a/Documentation/nvme-disconnect.1 b/Documentation/nvme-disconnect.1 index 85f31aa064..a86ada4325 100644 --- a/Documentation/nvme-disconnect.1 +++ b/Documentation/nvme-disconnect.1 @@ -2,12 +2,12 @@ .\" Title: nvme-disconnect .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-DISCONNECT" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-DISCONNECT" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-disconnect.html b/Documentation/nvme-disconnect.html index 019dfa1ada..ad634f71e1 100644 --- a/Documentation/nvme-disconnect.html +++ b/Documentation/nvme-disconnect.html @@ -862,7 +862,7 @@

NVME

diff --git a/Documentation/nvme-discover.1 b/Documentation/nvme-discover.1 index cdb694e0cf..879673c932 100644 --- a/Documentation/nvme-discover.1 +++ b/Documentation/nvme-discover.1 @@ -2,12 +2,12 @@ .\" Title: nvme-discover .\" Author: [see the "AUTHORS" section] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-DISCOVER" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-DISCOVER" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -51,7 +51,7 @@ nvme-discover \- Send Get Log Page request to Discovery Controller\&. [\-\-nr\-poll\-queues=<#> | \-P <#>] [\-\-queue\-size=<#> | \-Q <#>] [\-\-keyring=<#>] [\-\-tls_key=<#>] [\-\-hdr\-digest | \-g] [\-\-data\-digest | \-G] - [\-\-persistent | \-p] [\-\-quiet | \-S] [\-\-tls] [\-\-concat] + [\-\-persistent | \-p] [\-\-quiet] [\-\-tls] [\-\-concat] [\-\-dump\-config | \-O] [\-\-output\-format= | \-o ] [\-\-force] [\-\-nbft] [\-\-no\-nbft] [\-\-nbft\-path=] [\-\-context=] @@ -240,7 +240,7 @@ Enable TLS encryption (TCP)\&. Enable secure concatenation (TCP)\&. .RE .PP -\-S, \-\-quiet +\-\-quiet .RS 4 Suppress already connected errors\&. .RE diff --git a/Documentation/nvme-discover.html b/Documentation/nvme-discover.html index 53fe875cb2..0c80665f95 100644 --- a/Documentation/nvme-discover.html +++ b/Documentation/nvme-discover.html @@ -768,7 +768,7 @@

SYNOPSIS

[--nr-poll-queues=<#> | -P <#>] [--queue-size=<#> | -Q <#>] [--keyring=<#>] [--tls_key=<#>] [--hdr-digest | -g] [--data-digest | -G] - [--persistent | -p] [--quiet | -S] [--tls] [--concat] + [--persistent | -p] [--quiet] [--tls] [--concat] [--dump-config | -O] [--output-format=<fmt> | -o <fmt>] [--force] [--nbft] [--no-nbft] [--nbft-path=<STR>] [--context=<STR>] @@ -1145,9 +1145,6 @@

OPTIONS

--S -
-
--quiet
@@ -1325,7 +1322,7 @@

NVME

diff --git a/Documentation/nvme-dsm.1 b/Documentation/nvme-dsm.1 index 6681d5fca6..02f83bf8c5 100644 --- a/Documentation/nvme-dsm.1 +++ b/Documentation/nvme-dsm.1 @@ -2,12 +2,12 @@ .\" Title: nvme-dsm .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-DSM" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-DSM" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -40,6 +40,7 @@ nvme-dsm \- Send NVMe Data Set Management, return results [\-\-idw= | \-w ] [\-\-idr= | \-r ] [\-\-cdw11= | \-c ] [\-\-output\-format= | \-o ] [\-\-verbose | \-v] + [\-\-timeout= | \-t ] .fi .SH "DESCRIPTION" .sp @@ -105,6 +106,11 @@ or .RS 4 Increase the information detail in the output\&. .RE +.PP +\-t , \-\-timeout= +.RS 4 +Override default timeout value\&. In milliseconds\&. +.RE .SH "EXAMPLES" .sp No examples yet diff --git a/Documentation/nvme-dsm.html b/Documentation/nvme-dsm.html index b4af212777..5b56c1e29b 100644 --- a/Documentation/nvme-dsm.html +++ b/Documentation/nvme-dsm.html @@ -756,7 +756,8 @@

SYNOPSIS

[--ad=<deallocate> | -d <deallocate>] [--idw=<write> | -w <write>] [--idr=<read> | -r <read>] [--cdw11=<cdw11> | -c <cdw11>] - [--output-format=<fmt> | -o <fmt>] [--verbose | -v] + [--output-format=<fmt> | -o <fmt>] [--verbose | -v] + [--timeout=<timeout> | -t <timeout>]
@@ -898,6 +899,17 @@

OPTIONS

Increase the information detail in the output.

+
+-t <timeout> +
+
+--timeout=<timeout> +
+
+

+ Override default timeout value. In milliseconds. +

+
@@ -918,7 +930,7 @@

NVME

diff --git a/Documentation/nvme-effects-log.1 b/Documentation/nvme-effects-log.1 index 4adf0bd859..8b28776c9d 100644 --- a/Documentation/nvme-effects-log.1 +++ b/Documentation/nvme-effects-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-effects-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-EFFECTS\-LOG" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-EFFECTS\-LOG" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -34,6 +34,7 @@ nvme-effects-log \- Send NVMe Command Effects log page request, returns result a .nf \fInvme effects\-log\fR [\-\-human\-readable | \-H] [\-\-raw\-binary | \-b] [\-\-output\-format= | \-o ] [\-\-verbose | \-v] + [\-\-timeout= | \-t ] .fi .SH "DESCRIPTION" .sp @@ -67,6 +68,11 @@ or .RS 4 Increase the information detail in the output\&. .RE +.PP +\-t , \-\-timeout= +.RS 4 +Override default timeout value\&. In milliseconds\&. +.RE .SH "EXAMPLES" .sp .RS 4 diff --git a/Documentation/nvme-effects-log.html b/Documentation/nvme-effects-log.html index effc5d8b56..7ac963c710 100644 --- a/Documentation/nvme-effects-log.html +++ b/Documentation/nvme-effects-log.html @@ -750,7 +750,8 @@

SYNOPSIS

nvme effects-log <device> [--human-readable | -H] [--raw-binary | -b]
-                        [--output-format=<fmt> | -o <fmt>] [--verbose | -v]
+ [--output-format=<fmt> | -o <fmt>] [--verbose | -v] + [--timeout=<timeout> | -t <timeout>]
@@ -817,6 +818,17 @@

OPTIONS

Increase the information detail in the output.

+
+-t <timeout> +
+
+--timeout=<timeout> +
+
+

+ Override default timeout value. In milliseconds. +

+
@@ -857,7 +869,7 @@

NVME

diff --git a/Documentation/nvme-endurance-event-agg-log.1 b/Documentation/nvme-endurance-event-agg-log.1 index ec21f43e5b..9dd8672db1 100644 --- a/Documentation/nvme-endurance-event-agg-log.1 +++ b/Documentation/nvme-endurance-event-agg-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-endurance-event-agg-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ENDURANCE\-EVE" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-ENDURANCE\-EVE" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-endurance-event-agg-log.html b/Documentation/nvme-endurance-event-agg-log.html index b990748b41..ce0050b5a0 100644 --- a/Documentation/nvme-endurance-event-agg-log.html +++ b/Documentation/nvme-endurance-event-agg-log.html @@ -862,7 +862,7 @@

NVME

diff --git a/Documentation/nvme-endurance-log.1 b/Documentation/nvme-endurance-log.1 index 5ec9a682f0..7d67c2735d 100644 --- a/Documentation/nvme-endurance-log.1 +++ b/Documentation/nvme-endurance-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-endurance-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ENDURANCE\-LOG" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-ENDURANCE\-LOG" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-endurance-log.html b/Documentation/nvme-endurance-log.html index b59945bb02..5d107973dc 100644 --- a/Documentation/nvme-endurance-log.html +++ b/Documentation/nvme-endurance-log.html @@ -845,7 +845,7 @@

NVME

diff --git a/Documentation/nvme-error-log.1 b/Documentation/nvme-error-log.1 index 7758f3e664..edb700346e 100644 --- a/Documentation/nvme-error-log.1 +++ b/Documentation/nvme-error-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-error-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ERROR\-LOG" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-ERROR\-LOG" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-error-log.html b/Documentation/nvme-error-log.html index 54267ebe51..d1658cbe7d 100644 --- a/Documentation/nvme-error-log.html +++ b/Documentation/nvme-error-log.html @@ -860,7 +860,7 @@

NVME

diff --git a/Documentation/nvme-fdp-configs.1 b/Documentation/nvme-fdp-configs.1 index 61d1250568..30b36a1c17 100644 --- a/Documentation/nvme-fdp-configs.1 +++ b/Documentation/nvme-fdp-configs.1 @@ -2,12 +2,12 @@ .\" Title: nvme-fdp-configs .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-FDP\-CONFIGS" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-FDP\-CONFIGS" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-fdp-configs.html b/Documentation/nvme-fdp-configs.html index 50c71c45c6..d96e0bd228 100644 --- a/Documentation/nvme-fdp-configs.html +++ b/Documentation/nvme-fdp-configs.html @@ -826,7 +826,7 @@

NVME

diff --git a/Documentation/nvme-fdp-events.1 b/Documentation/nvme-fdp-events.1 index 91a782495c..acc1d9c5ab 100644 --- a/Documentation/nvme-fdp-events.1 +++ b/Documentation/nvme-fdp-events.1 @@ -2,12 +2,12 @@ .\" Title: nvme-fdp-events .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-FDP\-EVENTS" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-FDP\-EVENTS" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-fdp-events.html b/Documentation/nvme-fdp-events.html index 36de06ac9e..adc816473d 100644 --- a/Documentation/nvme-fdp-events.html +++ b/Documentation/nvme-fdp-events.html @@ -825,7 +825,7 @@

NVME

diff --git a/Documentation/nvme-fdp-set-events.1 b/Documentation/nvme-fdp-set-events.1 index d6fb3c5136..68f86ffe9f 100644 --- a/Documentation/nvme-fdp-set-events.1 +++ b/Documentation/nvme-fdp-set-events.1 @@ -2,12 +2,12 @@ .\" Title: nvme-fdp-set-events .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-FDP\-SET\-EVEN" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-FDP\-SET\-EVEN" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-fdp-set-events.html b/Documentation/nvme-fdp-set-events.html index c3ee010f45..5005c048f8 100644 --- a/Documentation/nvme-fdp-set-events.html +++ b/Documentation/nvme-fdp-set-events.html @@ -816,7 +816,7 @@

NVME

diff --git a/Documentation/nvme-fdp-stats.1 b/Documentation/nvme-fdp-stats.1 index 2ac48b50e7..4a5e44d8ed 100644 --- a/Documentation/nvme-fdp-stats.1 +++ b/Documentation/nvme-fdp-stats.1 @@ -2,12 +2,12 @@ .\" Title: nvme-fdp-stats .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-FDP\-STATS" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-FDP\-STATS" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-fdp-stats.html b/Documentation/nvme-fdp-stats.html index 3f671d82a0..24781c927d 100644 --- a/Documentation/nvme-fdp-stats.html +++ b/Documentation/nvme-fdp-stats.html @@ -814,7 +814,7 @@

NVME

diff --git a/Documentation/nvme-fdp-status.1 b/Documentation/nvme-fdp-status.1 index abe49af28c..58d6c4e8f1 100644 --- a/Documentation/nvme-fdp-status.1 +++ b/Documentation/nvme-fdp-status.1 @@ -2,12 +2,12 @@ .\" Title: nvme-fdp-status .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-FDP\-STATUS" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-FDP\-STATUS" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-fdp-status.html b/Documentation/nvme-fdp-status.html index bbc4d87a01..93151eb5d5 100644 --- a/Documentation/nvme-fdp-status.html +++ b/Documentation/nvme-fdp-status.html @@ -814,7 +814,7 @@

NVME

diff --git a/Documentation/nvme-fdp-update.1 b/Documentation/nvme-fdp-update.1 index 371c4f4485..0f50f296e1 100644 --- a/Documentation/nvme-fdp-update.1 +++ b/Documentation/nvme-fdp-update.1 @@ -2,12 +2,12 @@ .\" Title: nvme-fdp-update .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-FDP\-UPDATE" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-FDP\-UPDATE" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-fdp-update.html b/Documentation/nvme-fdp-update.html index 8fd528c577..5113584948 100644 --- a/Documentation/nvme-fdp-update.html +++ b/Documentation/nvme-fdp-update.html @@ -802,7 +802,7 @@

NVME

diff --git a/Documentation/nvme-fdp-usage.1 b/Documentation/nvme-fdp-usage.1 index 6ac434b7c6..fd10638d62 100644 --- a/Documentation/nvme-fdp-usage.1 +++ b/Documentation/nvme-fdp-usage.1 @@ -2,12 +2,12 @@ .\" Title: nvme-fdp-usage .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-FDP\-USAGE" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-FDP\-USAGE" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-fdp-usage.html b/Documentation/nvme-fdp-usage.html index 3b3d858695..11a34e3ba8 100644 --- a/Documentation/nvme-fdp-usage.html +++ b/Documentation/nvme-fdp-usage.html @@ -815,7 +815,7 @@

NVME

diff --git a/Documentation/nvme-fid-support-effects-log.1 b/Documentation/nvme-fid-support-effects-log.1 index c7147e66b5..8fdc3ecd22 100644 --- a/Documentation/nvme-fid-support-effects-log.1 +++ b/Documentation/nvme-fid-support-effects-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-fid-support-effects-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-FID\-SUPPORT\-" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-FID\-SUPPORT\-" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-fid-support-effects-log.html b/Documentation/nvme-fid-support-effects-log.html index 9041531e07..85110a1913 100644 --- a/Documentation/nvme-fid-support-effects-log.html +++ b/Documentation/nvme-fid-support-effects-log.html @@ -825,7 +825,7 @@

NVME

diff --git a/Documentation/nvme-flush.1 b/Documentation/nvme-flush.1 index 1528b6df23..5cb1204d8c 100644 --- a/Documentation/nvme-flush.1 +++ b/Documentation/nvme-flush.1 @@ -2,12 +2,12 @@ .\" Title: nvme-flush .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-FLUSH" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-FLUSH" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-flush.html b/Documentation/nvme-flush.html index a7aa1a8093..e598f52fd9 100644 --- a/Documentation/nvme-flush.html +++ b/Documentation/nvme-flush.html @@ -824,7 +824,7 @@

NVME

diff --git a/Documentation/nvme-format.1 b/Documentation/nvme-format.1 index 5e3ab4f018..9abc1195f3 100644 --- a/Documentation/nvme-format.1 +++ b/Documentation/nvme-format.1 @@ -2,12 +2,12 @@ .\" Title: nvme-format .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-FORMAT" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-FORMAT" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -108,7 +108,7 @@ T} .PP \-p , \-\-pil= .RS 4 -Protection Information Location: If set to \(oq1\(cq and protection information is enabled, then protection information is transferred as the first eight bytes of metadata\&. If cleared to \(oq0\(cq and protection information is enabled, then protection information is transferred as the last eight bytes of metadata\&. Defaults to 0\&. +Protection Information Location: If set to \(oq1\(cq and protection information is enabled, then protection information is transferred as the first bytes of metadata\&. If cleared to \(oq0\(cq and protection information is enabled, then protection information is transferred as the last bytes of metadata\&. Defaults to 0\&. .RE .PP \-i , \-\-pi= @@ -173,7 +173,7 @@ Just send the command immediately without warning of the implications\&. .PP \-t , \-\-timeout= .RS 4 -Override default timeout value\&. In milliseconds\&. +Override default timeout value 600,000\&. In milliseconds\&. .RE .PP \-o , \-\-output\-format= diff --git a/Documentation/nvme-format.html b/Documentation/nvme-format.html index eb73f4e870..ac616ac557 100644 --- a/Documentation/nvme-format.html +++ b/Documentation/nvme-format.html @@ -894,9 +894,9 @@

OPTIONS

Protection Information Location: If set to ‘1’ and protection information is enabled, then protection information is transferred - as the first eight bytes of metadata. If cleared to ‘0’ and + as the first bytes of metadata. If cleared to ‘0’ and protection information is enabled, then protection information - is transferred as the last eight bytes of metadata. Defaults to 0. + is transferred as the last bytes of metadata. Defaults to 0.

@@ -990,7 +990,7 @@

OPTIONS

- Override default timeout value. In milliseconds. + Override default timeout value 600,000. In milliseconds.

@@ -1056,7 +1056,7 @@

NVME

diff --git a/Documentation/nvme-fw-commit.1 b/Documentation/nvme-fw-commit.1 index f97ecdc8bc..3c04f1b2e5 100644 --- a/Documentation/nvme-fw-commit.1 +++ b/Documentation/nvme-fw-commit.1 @@ -2,12 +2,12 @@ .\" Title: nvme-fw-commit .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-FW\-COMMIT" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-FW\-COMMIT" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -36,6 +36,7 @@ nvme-fw-commit \- Used to verify and commit a firmware image\&. [\-\-action= | \-a ] [\-\-bpid= | \-b ] [\-\-output\-format= | \-o ] [\-\-verbose | \-v] + [\-\-timeout= | \-t ] .fi .SH "DESCRIPTION" .sp @@ -132,6 +133,11 @@ or .RS 4 Increase the information detail in the output\&. .RE +.PP +\-t , \-\-timeout= +.RS 4 +Override default timeout value\&. In milliseconds\&. +.RE .SH "EXAMPLES" .sp .RS 4 diff --git a/Documentation/nvme-fw-commit.html b/Documentation/nvme-fw-commit.html index 772d65821f..39ac136a2a 100644 --- a/Documentation/nvme-fw-commit.html +++ b/Documentation/nvme-fw-commit.html @@ -752,7 +752,8 @@

SYNOPSIS

nvme fw-commit <device> [--slot=<slot> | -s <slot>]
                         [--action=<action> | -a <action>]
                         [--bpid=<boot-partid> | -b <boot-partid>]
-                        [--output-format=<fmt> | -o <fmt>] [--verbose | -v]
+ [--output-format=<fmt> | -o <fmt>] [--verbose | -v] + [--timeout=<timeout> | -t <timeout>]
@@ -893,6 +894,17 @@

OPTIONS

Increase the information detail in the output.

+
+-t <timeout> +
+
+--timeout=<timeout> +
+
+

+ Override default timeout value. In milliseconds. +

+
@@ -929,7 +941,7 @@

NVME

diff --git a/Documentation/nvme-fw-download.1 b/Documentation/nvme-fw-download.1 index b13b4c84d8..e40647a8c3 100644 --- a/Documentation/nvme-fw-download.1 +++ b/Documentation/nvme-fw-download.1 @@ -2,12 +2,12 @@ .\" Title: nvme-fw-download .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-FW\-DOWNLOAD" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-FW\-DOWNLOAD" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -36,6 +36,7 @@ nvme-fw-download \- Download all or a portion of an nvme firmware image\&. [\-\-xfer= | \-x ] [\-\-offset= | \-O ] [\-\-output\-format= | \-o ] [\-\-verbose | \-v] + [\-\-timeout= | \-t ] .fi .SH "DESCRIPTION" .sp @@ -76,6 +77,11 @@ or .RS 4 Increase the information detail in the output\&. .RE +.PP +\-t , \-\-timeout= +.RS 4 +Override default timeout value\&. In milliseconds\&. +.RE .SH "EXAMPLES" .sp .RS 4 diff --git a/Documentation/nvme-fw-download.html b/Documentation/nvme-fw-download.html index cc49e87606..68cc9a3a3a 100644 --- a/Documentation/nvme-fw-download.html +++ b/Documentation/nvme-fw-download.html @@ -752,7 +752,8 @@

SYNOPSIS

nvme fw-download <device> [--fw=<firmware-file> | -f <firmware-file>]
                         [--xfer=<transfer-size> | -x <transfer-size>]
                         [--offset=<offset> | -O <offset>]
-                        [--output-format=<fmt> | -o <fmt>] [--verbose | -v]
+ [--output-format=<fmt> | -o <fmt>] [--verbose | -v] + [--timeout=<timeout> | -t <timeout>]
@@ -846,6 +847,17 @@

OPTIONS

Increase the information detail in the output.

+
+-t <timeout> +
+
+--timeout=<timeout> +
+
+

+ Override default timeout value. In milliseconds. +

+
@@ -876,7 +888,7 @@

NVME

diff --git a/Documentation/nvme-fw-log.1 b/Documentation/nvme-fw-log.1 index 23eef951de..5b947bc9c4 100644 --- a/Documentation/nvme-fw-log.1 +++ b/Documentation/nvme-fw-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-fw-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-FW\-LOG" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-FW\-LOG" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-fw-log.html b/Documentation/nvme-fw-log.html index e3b8a9a708..b5235d7075 100644 --- a/Documentation/nvme-fw-log.html +++ b/Documentation/nvme-fw-log.html @@ -846,7 +846,7 @@

NVME

diff --git a/Documentation/nvme-gen-hostnqn.1 b/Documentation/nvme-gen-hostnqn.1 index 62976044e7..7b04592022 100644 --- a/Documentation/nvme-gen-hostnqn.1 +++ b/Documentation/nvme-gen-hostnqn.1 @@ -2,12 +2,12 @@ .\" Title: nvme-gen-hostnqn .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-GEN\-HOSTNQN" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-GEN\-HOSTNQN" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-gen-hostnqn.html b/Documentation/nvme-gen-hostnqn.html index d322bdab8a..3e98cd86ff 100644 --- a/Documentation/nvme-gen-hostnqn.html +++ b/Documentation/nvme-gen-hostnqn.html @@ -809,7 +809,7 @@

NVME

diff --git a/Documentation/nvme-get-feature.1 b/Documentation/nvme-get-feature.1 index 1968c814ab..15bd7d5d4b 100644 --- a/Documentation/nvme-get-feature.1 +++ b/Documentation/nvme-get-feature.1 @@ -2,12 +2,12 @@ .\" Title: nvme-get-feature .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-GET\-FEATURE" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-GET\-FEATURE" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -40,6 +40,7 @@ nvme-get-feature \- Gets an NVMe feature, returns applicable results [\-\-raw\-binary | \-b] [\-\-cdw11= | \-c ] [\-\-human\-readable | \-H] [\-\-output\-format= | \-o ] [\-\-verbose | \-v] + [\-\-timeout= | \-t ] .fi .SH "DESCRIPTION" .sp @@ -143,6 +144,11 @@ or .RS 4 Increase the information detail in the output\&. .RE +.PP +\-t , \-\-timeout= +.RS 4 +Override default timeout value\&. In milliseconds\&. +.RE .SH "EXAMPLES" .sp .RS 4 diff --git a/Documentation/nvme-get-feature.html b/Documentation/nvme-get-feature.html index 387c51b763..88606824f9 100644 --- a/Documentation/nvme-get-feature.html +++ b/Documentation/nvme-get-feature.html @@ -756,7 +756,8 @@

SYNOPSIS

[--sel=<select> | -s <select>] [--raw-binary | -b] [--cdw11=<cdw11> | -c <cdw11>] [--human-readable | -H] - [--output-format=<fmt> | -o <fmt>] [--verbose | -v] + [--output-format=<fmt> | -o <fmt>] [--verbose | -v] + [--timeout=<timeout> | -t <timeout>]
@@ -933,6 +934,17 @@

OPTIONS

Increase the information detail in the output.

+
+-t <timeout> +
+
+--timeout=<timeout> +
+
+

+ Override default timeout value. In milliseconds. +

+
@@ -1004,7 +1016,7 @@

NVME

diff --git a/Documentation/nvme-get-lba-status.1 b/Documentation/nvme-get-lba-status.1 index 244400da10..6f494b1456 100644 --- a/Documentation/nvme-get-lba-status.1 +++ b/Documentation/nvme-get-lba-status.1 @@ -2,12 +2,12 @@ .\" Title: nvme-get-lba-status .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-GET\-LBA\-STAT" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-GET\-LBA\-STAT" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-get-lba-status.html b/Documentation/nvme-get-lba-status.html index 39a42df1b9..0c083cdbe6 100644 --- a/Documentation/nvme-get-lba-status.html +++ b/Documentation/nvme-get-lba-status.html @@ -907,7 +907,7 @@

NVME

diff --git a/Documentation/nvme-get-log.1 b/Documentation/nvme-get-log.1 index a6d7e16513..7c01640fbe 100644 --- a/Documentation/nvme-get-log.1 +++ b/Documentation/nvme-get-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-get-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-GET\-LOG" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-GET\-LOG" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-get-log.html b/Documentation/nvme-get-log.html index 11a5bdbafb..97f7bb2062 100644 --- a/Documentation/nvme-get-log.html +++ b/Documentation/nvme-get-log.html @@ -997,7 +997,7 @@

NVME

diff --git a/Documentation/nvme-get-ns-id.1 b/Documentation/nvme-get-ns-id.1 index a25d52a688..2894842b79 100644 --- a/Documentation/nvme-get-ns-id.1 +++ b/Documentation/nvme-get-ns-id.1 @@ -2,12 +2,12 @@ .\" Title: nvme-get-ns-id .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-GET\-NS\-ID" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-GET\-NS\-ID" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-get-ns-id.html b/Documentation/nvme-get-ns-id.html index 7975554b2e..36ca5c9742 100644 --- a/Documentation/nvme-get-ns-id.html +++ b/Documentation/nvme-get-ns-id.html @@ -818,7 +818,7 @@

NVME

diff --git a/Documentation/nvme-get-property.1 b/Documentation/nvme-get-property.1 index 18db4ad8a3..c49d92fcae 100644 --- a/Documentation/nvme-get-property.1 +++ b/Documentation/nvme-get-property.1 @@ -2,12 +2,12 @@ .\" Title: nvme-get-property .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-GET\-PROPERTY" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-GET\-PROPERTY" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -35,6 +35,7 @@ nvme-get-property \- Reads and shows the defined NVMe controller property for NV \fInvme get\-property\fR [\-\-offset= | \-O ] [\-\-human\-readable | \-H] [\-\-output\-format= | \-o ] [\-\-verbose | \-v] + [\-\-timeout= | \-t ] .fi .SH "DESCRIPTION" .sp @@ -64,6 +65,11 @@ or .RS 4 Increase the information detail in the output\&. .RE +.PP +\-t , \-\-timeout= +.RS 4 +Override default timeout value\&. In milliseconds\&. +.RE .SH "EXAMPLES" .sp .RS 4 diff --git a/Documentation/nvme-get-property.html b/Documentation/nvme-get-property.html index 165273c361..9c808d1bee 100644 --- a/Documentation/nvme-get-property.html +++ b/Documentation/nvme-get-property.html @@ -751,7 +751,8 @@

SYNOPSIS

nvme get-property <device> [--offset=<offset> | -O <offset>]
                         [--human-readable | -H]
-                        [--output-format=<fmt> | -o <fmt>] [--verbose | -v]
+ [--output-format=<fmt> | -o <fmt>] [--verbose | -v] + [--timeout=<timeout> | -t <timeout>]
@@ -809,6 +810,17 @@

OPTIONS

Increase the information detail in the output.

+
+-t <timeout> +
+
+--timeout=<timeout> +
+
+

+ Override default timeout value. In milliseconds. +

+
@@ -867,7 +879,7 @@

NVME

diff --git a/Documentation/nvme-help.1 b/Documentation/nvme-help.1 index 8071ddc1f8..d4b3f46196 100644 --- a/Documentation/nvme-help.1 +++ b/Documentation/nvme-help.1 @@ -2,12 +2,12 @@ .\" Title: nvme-help .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-HELP" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-HELP" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-help.html b/Documentation/nvme-help.html index d34afd863b..ef2d50f6f8 100644 --- a/Documentation/nvme-help.html +++ b/Documentation/nvme-help.html @@ -794,7 +794,7 @@

NVME

diff --git a/Documentation/nvme-huawei-id-ctrl.1 b/Documentation/nvme-huawei-id-ctrl.1 index b32f3eb6fe..7e544ffba7 100644 --- a/Documentation/nvme-huawei-id-ctrl.1 +++ b/Documentation/nvme-huawei-id-ctrl.1 @@ -2,12 +2,12 @@ .\" Title: nvme-huawei-id-ctrl .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-HUAWEI\-ID\-CT" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-HUAWEI\-ID\-CT" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-huawei-id-ctrl.html b/Documentation/nvme-huawei-id-ctrl.html index fdb66526ea..8e31df90ad 100644 --- a/Documentation/nvme-huawei-id-ctrl.html +++ b/Documentation/nvme-huawei-id-ctrl.html @@ -855,7 +855,7 @@

NVME

diff --git a/Documentation/nvme-huawei-list.1 b/Documentation/nvme-huawei-list.1 index e66aef2da3..514184e084 100644 --- a/Documentation/nvme-huawei-list.1 +++ b/Documentation/nvme-huawei-list.1 @@ -2,12 +2,12 @@ .\" Title: nvme-list .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-LIST" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-LIST" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-huawei-list.html b/Documentation/nvme-huawei-list.html index a3c7b83b32..367cdafeb2 100644 --- a/Documentation/nvme-huawei-list.html +++ b/Documentation/nvme-huawei-list.html @@ -797,7 +797,7 @@

NVME

diff --git a/Documentation/nvme-id-ctrl.1 b/Documentation/nvme-id-ctrl.1 index bdd522f74a..a2e03dc254 100644 --- a/Documentation/nvme-id-ctrl.1 +++ b/Documentation/nvme-id-ctrl.1 @@ -2,12 +2,12 @@ .\" Title: nvme-id-ctrl .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ID\-CTRL" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-ID\-CTRL" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-id-ctrl.html b/Documentation/nvme-id-ctrl.html index 01c107a5fc..6ee61b478d 100644 --- a/Documentation/nvme-id-ctrl.html +++ b/Documentation/nvme-id-ctrl.html @@ -921,7 +921,7 @@

NVME

diff --git a/Documentation/nvme-id-domain.1 b/Documentation/nvme-id-domain.1 index e51f4a008c..3c5eaa16fe 100644 --- a/Documentation/nvme-id-domain.1 +++ b/Documentation/nvme-id-domain.1 @@ -2,12 +2,12 @@ .\" Title: nvme-id-domain .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ID\-DOMAIN" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-ID\-DOMAIN" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-id-domain.html b/Documentation/nvme-id-domain.html index 3d6b411875..8652a36332 100644 --- a/Documentation/nvme-id-domain.html +++ b/Documentation/nvme-id-domain.html @@ -823,7 +823,7 @@

NVME

diff --git a/Documentation/nvme-id-iocs.1 b/Documentation/nvme-id-iocs.1 index 58ffade9f1..890db48354 100644 --- a/Documentation/nvme-id-iocs.1 +++ b/Documentation/nvme-id-iocs.1 @@ -2,12 +2,12 @@ .\" Title: nvme-id-iocs .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ID\-IOCS" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-ID\-IOCS" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-id-iocs.html b/Documentation/nvme-id-iocs.html index 5e7caae6b4..e6f6a1fd72 100644 --- a/Documentation/nvme-id-iocs.html +++ b/Documentation/nvme-id-iocs.html @@ -855,7 +855,7 @@

NVME

diff --git a/Documentation/nvme-id-ns.1 b/Documentation/nvme-id-ns.1 index 0d1d4b8390..55f89759e1 100644 --- a/Documentation/nvme-id-ns.1 +++ b/Documentation/nvme-id-ns.1 @@ -2,12 +2,12 @@ .\" Title: nvme-id-ns .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ID\-NS" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-ID\-NS" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-id-ns.html b/Documentation/nvme-id-ns.html index 57657f815b..663b683d7b 100644 --- a/Documentation/nvme-id-ns.html +++ b/Documentation/nvme-id-ns.html @@ -966,7 +966,7 @@

NVME

diff --git a/Documentation/nvme-id-nvmset.1 b/Documentation/nvme-id-nvmset.1 index 0cf58ce780..920376f3f7 100644 --- a/Documentation/nvme-id-nvmset.1 +++ b/Documentation/nvme-id-nvmset.1 @@ -2,12 +2,12 @@ .\" Title: nvme-id-nvmset .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ID\-NVMSET" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-ID\-NVMSET" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-id-nvmset.html b/Documentation/nvme-id-nvmset.html index 29238d4687..3bb1667ff7 100644 --- a/Documentation/nvme-id-nvmset.html +++ b/Documentation/nvme-id-nvmset.html @@ -862,7 +862,7 @@

EXAMPLES

diff --git a/Documentation/nvme-inspur-nvme-vendor-log.1 b/Documentation/nvme-inspur-nvme-vendor-log.1 index 9b17f19004..5f3b1afb20 100644 --- a/Documentation/nvme-inspur-nvme-vendor-log.1 +++ b/Documentation/nvme-inspur-nvme-vendor-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-inspur-nvme-vendor-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-INSPUR\-NVME\-" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-INSPUR\-NVME\-" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-inspur-nvme-vendor-log.html b/Documentation/nvme-inspur-nvme-vendor-log.html index cb9f85fb78..b7879ca66b 100644 --- a/Documentation/nvme-inspur-nvme-vendor-log.html +++ b/Documentation/nvme-inspur-nvme-vendor-log.html @@ -796,7 +796,7 @@

NVME

diff --git a/Documentation/nvme-intel-id-ctrl.1 b/Documentation/nvme-intel-id-ctrl.1 index 0ad6f17ce0..6295548512 100644 --- a/Documentation/nvme-intel-id-ctrl.1 +++ b/Documentation/nvme-intel-id-ctrl.1 @@ -2,12 +2,12 @@ .\" Title: nvme-intel-id-ctrl .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-INTEL\-ID\-CTR" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-INTEL\-ID\-CTR" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-intel-id-ctrl.html b/Documentation/nvme-intel-id-ctrl.html index d22113edd7..b416638788 100644 --- a/Documentation/nvme-intel-id-ctrl.html +++ b/Documentation/nvme-intel-id-ctrl.html @@ -853,7 +853,7 @@

NVME

diff --git a/Documentation/nvme-intel-internal-log.1 b/Documentation/nvme-intel-internal-log.1 index b477eb5c0f..f8a9e7cbe8 100644 --- a/Documentation/nvme-intel-internal-log.1 +++ b/Documentation/nvme-intel-internal-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-intel-internal-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-INTEL\-INTERNA" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-INTEL\-INTERNA" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-intel-internal-log.html b/Documentation/nvme-intel-internal-log.html index adec8f40a0..361b65e035 100644 --- a/Documentation/nvme-intel-internal-log.html +++ b/Documentation/nvme-intel-internal-log.html @@ -873,7 +873,7 @@

NVME

diff --git a/Documentation/nvme-intel-lat-stats.1 b/Documentation/nvme-intel-lat-stats.1 index 2a90ec1f8d..30db467958 100644 --- a/Documentation/nvme-intel-lat-stats.1 +++ b/Documentation/nvme-intel-lat-stats.1 @@ -2,12 +2,12 @@ .\" Title: nvme-intel-lat-stats .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-INTEL\-LAT\-ST" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-INTEL\-LAT\-ST" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-intel-lat-stats.html b/Documentation/nvme-intel-lat-stats.html index db8470b11e..ff3c150eda 100644 --- a/Documentation/nvme-intel-lat-stats.html +++ b/Documentation/nvme-intel-lat-stats.html @@ -832,7 +832,7 @@

NVME

diff --git a/Documentation/nvme-intel-market-name.1 b/Documentation/nvme-intel-market-name.1 index 76752f1cd8..6a5d104828 100644 --- a/Documentation/nvme-intel-market-name.1 +++ b/Documentation/nvme-intel-market-name.1 @@ -2,12 +2,12 @@ .\" Title: nvme-intel-market-name .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-INTEL\-MARKET\" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-INTEL\-MARKET\" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-intel-market-name.html b/Documentation/nvme-intel-market-name.html index 1a2cb40148..b8ca9e0b3e 100644 --- a/Documentation/nvme-intel-market-name.html +++ b/Documentation/nvme-intel-market-name.html @@ -813,7 +813,7 @@

NVME

diff --git a/Documentation/nvme-intel-smart-log-add.1 b/Documentation/nvme-intel-smart-log-add.1 index ace0e713b3..65e9c6158a 100644 --- a/Documentation/nvme-intel-smart-log-add.1 +++ b/Documentation/nvme-intel-smart-log-add.1 @@ -2,12 +2,12 @@ .\" Title: nvme-intel-smart-log-add .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-INTEL\-SMART\-" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-INTEL\-SMART\-" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-intel-smart-log-add.html b/Documentation/nvme-intel-smart-log-add.html index 9b0b8bb243..ebfe48f5c3 100644 --- a/Documentation/nvme-intel-smart-log-add.html +++ b/Documentation/nvme-intel-smart-log-add.html @@ -849,7 +849,7 @@

NVME

diff --git a/Documentation/nvme-intel-temp-stats.1 b/Documentation/nvme-intel-temp-stats.1 index c359d874bf..a52e88e108 100644 --- a/Documentation/nvme-intel-temp-stats.1 +++ b/Documentation/nvme-intel-temp-stats.1 @@ -2,12 +2,12 @@ .\" Title: nvme-intel-temp-stats .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-INTEL\-TEMP\-S" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-INTEL\-TEMP\-S" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-intel-temp-stats.html b/Documentation/nvme-intel-temp-stats.html index 6093d9d9c6..f4c526a0b9 100644 --- a/Documentation/nvme-intel-temp-stats.html +++ b/Documentation/nvme-intel-temp-stats.html @@ -822,7 +822,7 @@

NVME

diff --git a/Documentation/nvme-io-mgmt-recv.1 b/Documentation/nvme-io-mgmt-recv.1 index aa0b5879b6..cf194aac64 100644 --- a/Documentation/nvme-io-mgmt-recv.1 +++ b/Documentation/nvme-io-mgmt-recv.1 @@ -2,12 +2,12 @@ .\" Title: nvme-io-mgmt-recv .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-IO\-MGMT\-RECV" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-IO\-MGMT\-RECV" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -37,6 +37,7 @@ nvme-io-mgmt-recv \- I/O Management Receive command [\-\-data= | \-d ] [\-\-data\-len= | \-l ] [\-\-output\-format= | \-o ] [\-\-verbose | \-v] + [\-\-timeout= | \-t ] .fi .SH "DESCRIPTION" .sp @@ -81,6 +82,11 @@ or .RS 4 Increase the information detail in the output\&. .RE +.PP +\-t , \-\-timeout= +.RS 4 +Override default timeout value\&. In milliseconds\&. +.RE .SH "NVME" .sp Part of nvme\-cli diff --git a/Documentation/nvme-io-mgmt-recv.html b/Documentation/nvme-io-mgmt-recv.html index a1df10e9fa..aedf30c029 100644 --- a/Documentation/nvme-io-mgmt-recv.html +++ b/Documentation/nvme-io-mgmt-recv.html @@ -753,7 +753,8 @@

SYNOPSIS

[--mos=<NUM> | -s <NUM>] [--mo=<NUM> | -m <NUM>] [--data=<FILE> | -d <FILE>] [--data-len=<NUM> | -l <NUM>] - [--output-format=<fmt> | -o <fmt>] [--verbose | -v] + [--output-format=<fmt> | -o <fmt>] [--verbose | -v] + [--timeout=<timeout> | -t <timeout>]
@@ -855,6 +856,17 @@

OPTIONS

Increase the information detail in the output.

+
+-t <timeout> +
+
+--timeout=<timeout> +
+
+

+ Override default timeout value. In milliseconds. +

+
@@ -869,7 +881,7 @@

NVME

diff --git a/Documentation/nvme-io-mgmt-send.1 b/Documentation/nvme-io-mgmt-send.1 index 6cb17a1822..80593ed975 100644 --- a/Documentation/nvme-io-mgmt-send.1 +++ b/Documentation/nvme-io-mgmt-send.1 @@ -2,12 +2,12 @@ .\" Title: nvme-io-mgmt-send .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-IO\-MGMT\-SEND" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-IO\-MGMT\-SEND" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -37,6 +37,7 @@ nvme-io-mgmt-send \- I/O Management Send command [\-\-data= | \-d ] [\-\-data\-len= | \-l ] [\-\-output\-format= | \-o ] [\-\-verbose | \-v] + [\-\-timeout= | \-t ] .fi .SH "DESCRIPTION" .sp @@ -81,6 +82,11 @@ or .RS 4 Increase the information detail in the output\&. .RE +.PP +\-t , \-\-timeout= +.RS 4 +Override default timeout value\&. In milliseconds\&. +.RE .SH "NVME" .sp Part of nvme\-cli diff --git a/Documentation/nvme-io-mgmt-send.html b/Documentation/nvme-io-mgmt-send.html index 2614bf0f0f..d77257fbbd 100644 --- a/Documentation/nvme-io-mgmt-send.html +++ b/Documentation/nvme-io-mgmt-send.html @@ -753,7 +753,8 @@

SYNOPSIS

[--mos=<NUM> | -s <NUM>] [--mo=<NUM> | -m <NUM>] [--data=<FILE> | -d <FILE>] [--data-len=<NUM> | -l <NUM>] - [--output-format=<fmt> | -o <fmt>] [--verbose | -v] + [--output-format=<fmt> | -o <fmt>] [--verbose | -v] + [--timeout=<timeout> | -t <timeout>]
@@ -854,6 +855,17 @@

OPTIONS

Increase the information detail in the output.

+
+-t <timeout> +
+
+--timeout=<timeout> +
+
+

+ Override default timeout value. In milliseconds. +

+
@@ -868,7 +880,7 @@

NVME

diff --git a/Documentation/nvme-io-passthru.1 b/Documentation/nvme-io-passthru.1 index 909b74c0d8..dc7c573866 100644 --- a/Documentation/nvme-io-passthru.1 +++ b/Documentation/nvme-io-passthru.1 @@ -2,12 +2,12 @@ .\" Title: nvme-io-passthru .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-IO\-PASSTHRU" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-IO\-PASSTHRU" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -44,7 +44,7 @@ nvme-io-passthru \- Submit an arbitrary io command, return results [\-\-read | \-r] [\-\-write | \-w] [\-\-input\-file= | \-i ] [\-\-metadata= | \-M ] - [\-\-timeout= | \-t ] [\-\-show\-command | \-s] + [\-\-timeout= | \-t ] [\-\-show\-command | \-s] [\-\-dry\-run | \-d] [\-\-raw\-binary | \-b] [\-\-prefill= | \-p ] [\-\-latency | \-T] @@ -151,6 +151,11 @@ or .RS 4 Increase the information detail in the output\&. .RE +.PP +\-t , \-\-timeout= +.RS 4 +Override default timeout value\&. In milliseconds\&. +.RE .SH "EXAMPLES" .sp nvme io\-passthru /dev/nvme0n1 \-\-opcode=2 \-\-namespace\-id=1 \-\-data\-len=4096 \-\-read \-\-cdw10=0 \-\-cdw11=0 \-\-cdw12=0x70000 \-\-raw\-binary diff --git a/Documentation/nvme-io-passthru.html b/Documentation/nvme-io-passthru.html index ff08fdd0cb..18b8de7cd3 100644 --- a/Documentation/nvme-io-passthru.html +++ b/Documentation/nvme-io-passthru.html @@ -761,7 +761,7 @@

SYNOPSIS

[--read | -r] [--write | -w] [--input-file=<file> | -i <file>] [--metadata=<file> | -M <file>] - [--timeout=<to> | -t <to>] [--show-command | -s] + [--timeout=<timeout> | -t <timeout>] [--show-command | -s] [--dry-run | -d] [--raw-binary | -b] [--prefill=<prefill> | -p <prefill>] [--latency | -T] @@ -999,6 +999,17 @@

OPTIONS

Increase the information detail in the output.

+
+-t <timeout> +
+
+--timeout=<timeout> +
+
+

+ Override default timeout value. In milliseconds. +

+
@@ -1019,7 +1030,7 @@

NVME

diff --git a/Documentation/nvme-lba-status-log.1 b/Documentation/nvme-lba-status-log.1 index 54d410b2ce..69fdc47ef5 100644 --- a/Documentation/nvme-lba-status-log.1 +++ b/Documentation/nvme-lba-status-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-lba-status-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-LBA\-STATUS\-L" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-LBA\-STATUS\-L" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-lba-status-log.html b/Documentation/nvme-lba-status-log.html index d63139f510..35e97a4ce6 100644 --- a/Documentation/nvme-lba-status-log.html +++ b/Documentation/nvme-lba-status-log.html @@ -843,7 +843,7 @@

EXAMPLES

diff --git a/Documentation/nvme-list-ctrl.1 b/Documentation/nvme-list-ctrl.1 index 0695802821..fe2cd7eeed 100644 --- a/Documentation/nvme-list-ctrl.1 +++ b/Documentation/nvme-list-ctrl.1 @@ -2,12 +2,12 @@ .\" Title: nvme-list-ctrl .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-LIST\-CTRL" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-LIST\-CTRL" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-list-ctrl.html b/Documentation/nvme-list-ctrl.html index cb77b1f6c8..cdc82961f4 100644 --- a/Documentation/nvme-list-ctrl.html +++ b/Documentation/nvme-list-ctrl.html @@ -842,7 +842,7 @@

NVME

diff --git a/Documentation/nvme-list-endgrp.1 b/Documentation/nvme-list-endgrp.1 index 883f75ca3c..83bec731f9 100644 --- a/Documentation/nvme-list-endgrp.1 +++ b/Documentation/nvme-list-endgrp.1 @@ -2,12 +2,12 @@ .\" Title: nvme-list-endgrp .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-LIST\-ENDGRP" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-LIST\-ENDGRP" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-list-endgrp.html b/Documentation/nvme-list-endgrp.html index 0e0079af9b..33183142e1 100644 --- a/Documentation/nvme-list-endgrp.html +++ b/Documentation/nvme-list-endgrp.html @@ -826,7 +826,7 @@

NVME

diff --git a/Documentation/nvme-list-ns.1 b/Documentation/nvme-list-ns.1 index 1146a98515..429b2bb33d 100644 --- a/Documentation/nvme-list-ns.1 +++ b/Documentation/nvme-list-ns.1 @@ -2,12 +2,12 @@ .\" Title: nvme-id-ns .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ID\-NS" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-ID\-NS" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -36,6 +36,7 @@ nvme-list-ns \- Send NVMe Identify List Namespaces, return result and structure [\-\-csi= | \-y ] [\-\-all | \-a] [\-\-output\-format= | \-o ] [\-\-verbose | \-v] + [\-\-timeout= | \-t ] .fi .SH "DESCRIPTION" .sp @@ -74,6 +75,11 @@ or .RS 4 Increase the information detail in the output\&. .RE +.PP +\-t , \-\-timeout= +.RS 4 +Override default timeout value\&. In milliseconds\&. +.RE .SH "EXAMPLES" .sp .RS 4 diff --git a/Documentation/nvme-list-ns.html b/Documentation/nvme-list-ns.html index 1fa0e56f05..e5612ae937 100644 --- a/Documentation/nvme-list-ns.html +++ b/Documentation/nvme-list-ns.html @@ -752,7 +752,8 @@

SYNOPSIS

nvme list-ns <device> [--namespace-id=<nsid> | -n <nsid>]
                         [--csi=<command_set_identifier> | -y <command_set_identifier>]
                         [--all | -a]
-                        [--output-format=<fmt> | -o <fmt>] [--verbose | -v]
+ [--output-format=<fmt> | -o <fmt>] [--verbose | -v] + [--timeout=<timeout> | -t <timeout>]
@@ -832,6 +833,17 @@

OPTIONS

Increase the information detail in the output.

+
+-t <timeout> +
+
+--timeout=<timeout> +
+
+

+ Override default timeout value. In milliseconds. +

+
@@ -871,7 +883,7 @@

NVME

diff --git a/Documentation/nvme-list-subsys.1 b/Documentation/nvme-list-subsys.1 index 1bf21ea2ef..281ef34b00 100644 --- a/Documentation/nvme-list-subsys.1 +++ b/Documentation/nvme-list-subsys.1 @@ -2,12 +2,12 @@ .\" Title: nvme-list-subsys .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-LIST\-SUBSYS" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-LIST\-SUBSYS" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-list-subsys.html b/Documentation/nvme-list-subsys.html index 525c079476..22b40ea9eb 100644 --- a/Documentation/nvme-list-subsys.html +++ b/Documentation/nvme-list-subsys.html @@ -865,7 +865,7 @@

NVME

diff --git a/Documentation/nvme-list.1 b/Documentation/nvme-list.1 index 60623b4035..7b72a8fde0 100644 --- a/Documentation/nvme-list.1 +++ b/Documentation/nvme-list.1 @@ -2,12 +2,12 @@ .\" Title: nvme-list .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-LIST" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-LIST" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-list.html b/Documentation/nvme-list.html index 1d87621b88..290ad778f8 100644 --- a/Documentation/nvme-list.html +++ b/Documentation/nvme-list.html @@ -816,7 +816,7 @@

NVME

diff --git a/Documentation/nvme-lockdown.1 b/Documentation/nvme-lockdown.1 index 0e47f9a3bf..073f644472 100644 --- a/Documentation/nvme-lockdown.1 +++ b/Documentation/nvme-lockdown.1 @@ -2,12 +2,12 @@ .\" Title: nvme-lockdown .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-LOCKDOWN" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-LOCKDOWN" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -38,6 +38,7 @@ nvme-lockdown \- Send an NVMe Lockdown command to prohibit or allow the executio [\-\-scp= | \-s ] [\-\-uuid= | \-U ] [\-\-output\-format= | \-o ] [\-\-verbose | \-v] + [\-\-timeout= | \-t ] .fi .SH "DESCRIPTION" .sp @@ -82,6 +83,11 @@ or .RS 4 Increase the information detail in the output\&. .RE +.PP +\-t , \-\-timeout= +.RS 4 +Override default timeout value\&. In milliseconds\&. +.RE .SH "EXAMPLES" .sp No examples yet\&. diff --git a/Documentation/nvme-lockdown.html b/Documentation/nvme-lockdown.html index 089c65f7f0..fc27352065 100644 --- a/Documentation/nvme-lockdown.html +++ b/Documentation/nvme-lockdown.html @@ -754,7 +754,8 @@

SYNOPSIS

[--prhbt=<prhbt> | -p <prhbt>] [--scp=<scp> | -s <scp>] [--uuid=<UUID_Index> | -U <UUID_Index>] - [--output-format=<fmt> | -o <fmt>] [--verbose | -v] + [--output-format=<fmt> | -o <fmt>] [--verbose | -v] + [--timeout=<timeout> | -t <timeout>]
@@ -854,6 +855,17 @@

OPTIONS

Increase the information detail in the output.

+
+-t <timeout> +
+
+--timeout=<timeout> +
+
+

+ Override default timeout value. In milliseconds. +

+
@@ -874,7 +886,7 @@

NVME

diff --git a/Documentation/nvme-mi-cmd-support-effects-log.1 b/Documentation/nvme-mi-cmd-support-effects-log.1 index 2d22dc2d49..3d331d39e4 100644 --- a/Documentation/nvme-mi-cmd-support-effects-log.1 +++ b/Documentation/nvme-mi-cmd-support-effects-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-mi-cmd-support-effects-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-MI\-CMD\-SUPPO" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-MI\-CMD\-SUPPO" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-mi-cmd-support-effects-log.html b/Documentation/nvme-mi-cmd-support-effects-log.html index e85baf2213..1bead85c43 100644 --- a/Documentation/nvme-mi-cmd-support-effects-log.html +++ b/Documentation/nvme-mi-cmd-support-effects-log.html @@ -826,7 +826,7 @@

NVME

diff --git a/Documentation/nvme-micron-clear-pcie-errors.1 b/Documentation/nvme-micron-clear-pcie-errors.1 index f3ca7b72dd..495b63aaf2 100644 --- a/Documentation/nvme-micron-clear-pcie-errors.1 +++ b/Documentation/nvme-micron-clear-pcie-errors.1 @@ -2,12 +2,12 @@ .\" Title: nvme-micron-clear-pcie-errors .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-MICRON\-CLEAR\" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-MICRON\-CLEAR\" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-micron-clear-pcie-errors.html b/Documentation/nvme-micron-clear-pcie-errors.html index 868586d3f8..6d9defbfc8 100644 --- a/Documentation/nvme-micron-clear-pcie-errors.html +++ b/Documentation/nvme-micron-clear-pcie-errors.html @@ -798,7 +798,7 @@

NVME

diff --git a/Documentation/nvme-micron-internal-log.1 b/Documentation/nvme-micron-internal-log.1 index 76f64154c7..32fa2b088f 100644 --- a/Documentation/nvme-micron-internal-log.1 +++ b/Documentation/nvme-micron-internal-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-micron-internal-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-MICRON\-INTERN" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-MICRON\-INTERN" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-micron-internal-log.html b/Documentation/nvme-micron-internal-log.html index 74fc15ebbe..891b7aabe0 100644 --- a/Documentation/nvme-micron-internal-log.html +++ b/Documentation/nvme-micron-internal-log.html @@ -814,7 +814,7 @@

NVME

diff --git a/Documentation/nvme-micron-nand-stats.1 b/Documentation/nvme-micron-nand-stats.1 index c79c942d89..b286941c53 100644 --- a/Documentation/nvme-micron-nand-stats.1 +++ b/Documentation/nvme-micron-nand-stats.1 @@ -2,12 +2,12 @@ .\" Title: nvme-micron-nand-stats .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-MICRON\-NAND\-" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-MICRON\-NAND\-" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-micron-nand-stats.html b/Documentation/nvme-micron-nand-stats.html index 5ea78c0068..f0fbc1d67c 100644 --- a/Documentation/nvme-micron-nand-stats.html +++ b/Documentation/nvme-micron-nand-stats.html @@ -799,7 +799,7 @@

NVME

diff --git a/Documentation/nvme-micron-pcie-stats.1 b/Documentation/nvme-micron-pcie-stats.1 index 4ba3b159fa..20ffe04880 100644 --- a/Documentation/nvme-micron-pcie-stats.1 +++ b/Documentation/nvme-micron-pcie-stats.1 @@ -2,12 +2,12 @@ .\" Title: nvme-micron-pcie-stats .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-MICRON\-PCIE\-" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-MICRON\-PCIE\-" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-micron-pcie-stats.html b/Documentation/nvme-micron-pcie-stats.html index 0dfc554f23..a6dacd514d 100644 --- a/Documentation/nvme-micron-pcie-stats.html +++ b/Documentation/nvme-micron-pcie-stats.html @@ -799,7 +799,7 @@

NVME

diff --git a/Documentation/nvme-micron-selective-download.1 b/Documentation/nvme-micron-selective-download.1 index 03d66ff1f4..a0f72f10f4 100644 --- a/Documentation/nvme-micron-selective-download.1 +++ b/Documentation/nvme-micron-selective-download.1 @@ -2,12 +2,12 @@ .\" Title: nvme-micron-selective-download .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-MICRON\-SELECT" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-MICRON\-SELECT" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-micron-selective-download.html b/Documentation/nvme-micron-selective-download.html index 1f492f9b12..d904c31885 100644 --- a/Documentation/nvme-micron-selective-download.html +++ b/Documentation/nvme-micron-selective-download.html @@ -869,7 +869,7 @@

NVME

diff --git a/Documentation/nvme-micron-smart-add-log.1 b/Documentation/nvme-micron-smart-add-log.1 index 33a23df30d..aa8c5fb006 100644 --- a/Documentation/nvme-micron-smart-add-log.1 +++ b/Documentation/nvme-micron-smart-add-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-micron-smart-add-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-MICRON\-SMART\" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-MICRON\-SMART\" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-micron-smart-add-log.html b/Documentation/nvme-micron-smart-add-log.html index 611657eb6b..92d42467cc 100644 --- a/Documentation/nvme-micron-smart-add-log.html +++ b/Documentation/nvme-micron-smart-add-log.html @@ -817,7 +817,7 @@

EXAMPLES

diff --git a/Documentation/nvme-micron-temperature-stats.1 b/Documentation/nvme-micron-temperature-stats.1 index 8a9dda1a56..159c7d12e8 100644 --- a/Documentation/nvme-micron-temperature-stats.1 +++ b/Documentation/nvme-micron-temperature-stats.1 @@ -2,12 +2,12 @@ .\" Title: nvme-micron-temperature-stats .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-MICRON\-TEMPER" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-MICRON\-TEMPER" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-micron-temperature-stats.html b/Documentation/nvme-micron-temperature-stats.html index fabb51b921..67de4f8fbd 100644 --- a/Documentation/nvme-micron-temperature-stats.html +++ b/Documentation/nvme-micron-temperature-stats.html @@ -799,7 +799,7 @@

NVME

diff --git a/Documentation/nvme-netapp-ontapdevices.1 b/Documentation/nvme-netapp-ontapdevices.1 index 8fc6864216..bbb602be99 100644 --- a/Documentation/nvme-netapp-ontapdevices.1 +++ b/Documentation/nvme-netapp-ontapdevices.1 @@ -2,12 +2,12 @@ .\" Title: nvme-netapp-ontapdevices .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-NETAPP\-ONTAPD" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-NETAPP\-ONTAPD" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-netapp-ontapdevices.html b/Documentation/nvme-netapp-ontapdevices.html index 4697207179..2d843be6ef 100644 --- a/Documentation/nvme-netapp-ontapdevices.html +++ b/Documentation/nvme-netapp-ontapdevices.html @@ -807,7 +807,7 @@

NVME

diff --git a/Documentation/nvme-netapp-smdevices.1 b/Documentation/nvme-netapp-smdevices.1 index 12b8039f2e..a7da4f0154 100644 --- a/Documentation/nvme-netapp-smdevices.1 +++ b/Documentation/nvme-netapp-smdevices.1 @@ -2,12 +2,12 @@ .\" Title: nvme-netapp-smdevices .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-NETAPP\-SMDEVI" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-NETAPP\-SMDEVI" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-netapp-smdevices.html b/Documentation/nvme-netapp-smdevices.html index ac6d3a2a71..754f0aaf8a 100644 --- a/Documentation/nvme-netapp-smdevices.html +++ b/Documentation/nvme-netapp-smdevices.html @@ -809,7 +809,7 @@

NVME

diff --git a/Documentation/nvme-ns-descs.1 b/Documentation/nvme-ns-descs.1 index f28e33abe5..8899d534ab 100644 --- a/Documentation/nvme-ns-descs.1 +++ b/Documentation/nvme-ns-descs.1 @@ -2,12 +2,12 @@ .\" Title: nvme-ns-descs .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-NS\-DESCS" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-NS\-DESCS" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-ns-descs.html b/Documentation/nvme-ns-descs.html index f6e1421782..a9623862ce 100644 --- a/Documentation/nvme-ns-descs.html +++ b/Documentation/nvme-ns-descs.html @@ -867,7 +867,7 @@

NVME

diff --git a/Documentation/nvme-ns-rescan.1 b/Documentation/nvme-ns-rescan.1 index 19ce268b0f..f9feaaa661 100644 --- a/Documentation/nvme-ns-rescan.1 +++ b/Documentation/nvme-ns-rescan.1 @@ -2,12 +2,12 @@ .\" Title: nvme-ns-rescan .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-NS\-RESCAN" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-NS\-RESCAN" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-ns-rescan.html b/Documentation/nvme-ns-rescan.html index c3732d5f58..5a45a52d24 100644 --- a/Documentation/nvme-ns-rescan.html +++ b/Documentation/nvme-ns-rescan.html @@ -818,7 +818,7 @@

NVME

diff --git a/Documentation/nvme-nvm-id-ctrl.1 b/Documentation/nvme-nvm-id-ctrl.1 index ef198d9ee4..db81501a05 100644 --- a/Documentation/nvme-nvm-id-ctrl.1 +++ b/Documentation/nvme-nvm-id-ctrl.1 @@ -2,12 +2,12 @@ .\" Title: nvme-nvm-id-ctrl .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-NVM\-ID\-CTRL" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-NVM\-ID\-CTRL" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-nvm-id-ctrl.html b/Documentation/nvme-nvm-id-ctrl.html index e4bdd735a8..9c9f4fcbb5 100644 --- a/Documentation/nvme-nvm-id-ctrl.html +++ b/Documentation/nvme-nvm-id-ctrl.html @@ -832,7 +832,7 @@

NVME

diff --git a/Documentation/nvme-nvme-mi-recv.1 b/Documentation/nvme-nvme-mi-recv.1 index 2c40649897..189a8a2315 100644 --- a/Documentation/nvme-nvme-mi-recv.1 +++ b/Documentation/nvme-nvme-mi-recv.1 @@ -2,12 +2,12 @@ .\" Title: nvme-nvme-mi-recv .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-NVME\-MI\-RECV" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-NVME\-MI\-RECV" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-nvme-mi-recv.html b/Documentation/nvme-nvme-mi-recv.html index e9ca3025b0..5be0b28dc2 100644 --- a/Documentation/nvme-nvme-mi-recv.html +++ b/Documentation/nvme-nvme-mi-recv.html @@ -905,7 +905,7 @@

NVME

diff --git a/Documentation/nvme-nvme-mi-send.1 b/Documentation/nvme-nvme-mi-send.1 index c62416b5b5..a6c5f9abd2 100644 --- a/Documentation/nvme-nvme-mi-send.1 +++ b/Documentation/nvme-nvme-mi-send.1 @@ -2,12 +2,12 @@ .\" Title: nvme-nvme-mi-send .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-NVME\-MI\-SEND" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-NVME\-MI\-SEND" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-nvme-mi-send.html b/Documentation/nvme-nvme-mi-send.html index 4f05adc3fa..069011e378 100644 --- a/Documentation/nvme-nvme-mi-send.html +++ b/Documentation/nvme-nvme-mi-send.html @@ -905,7 +905,7 @@

NVME

diff --git a/Documentation/nvme-ocp-clear-fw-activate-history.1 b/Documentation/nvme-ocp-clear-fw-activate-history.1 index 7c5625877c..70738feddc 100644 --- a/Documentation/nvme-ocp-clear-fw-activate-history.1 +++ b/Documentation/nvme-ocp-clear-fw-activate-history.1 @@ -2,12 +2,12 @@ .\" Title: nvme-ocp-clear-fw-activate-history .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-OCP\-CLEAR\-FW" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-OCP\-CLEAR\-FW" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-ocp-clear-fw-activate-history.html b/Documentation/nvme-ocp-clear-fw-activate-history.html index 5448629452..41f71a8140 100644 --- a/Documentation/nvme-ocp-clear-fw-activate-history.html +++ b/Documentation/nvme-ocp-clear-fw-activate-history.html @@ -817,7 +817,7 @@

NVME

diff --git a/Documentation/nvme-ocp-clear-pcie-correctable-error-counters.1 b/Documentation/nvme-ocp-clear-pcie-correctable-error-counters.1 index a833306d5f..60ca92eefe 100644 --- a/Documentation/nvme-ocp-clear-pcie-correctable-error-counters.1 +++ b/Documentation/nvme-ocp-clear-pcie-correctable-error-counters.1 @@ -2,12 +2,12 @@ .\" Title: nvme-ocp-clear-pcie-correctable-error-counters .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-OCP\-CLEAR\-PC" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-OCP\-CLEAR\-PC" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-ocp-clear-pcie-correctable-error-counters.html b/Documentation/nvme-ocp-clear-pcie-correctable-error-counters.html index dc7788e7fd..50a9648f7e 100644 --- a/Documentation/nvme-ocp-clear-pcie-correctable-error-counters.html +++ b/Documentation/nvme-ocp-clear-pcie-correctable-error-counters.html @@ -817,7 +817,7 @@

NVME

diff --git a/Documentation/nvme-ocp-device-capability-log.1 b/Documentation/nvme-ocp-device-capability-log.1 new file mode 100644 index 0000000000..36a2b82844 --- /dev/null +++ b/Documentation/nvme-ocp-device-capability-log.1 @@ -0,0 +1,81 @@ +'\" t +.\" Title: nvme-ocp-device-capability-log +.\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] +.\" Generator: DocBook XSL Stylesheets vsnapshot +.\" Date: 08/02/2024 +.\" Manual: NVMe Manual +.\" Source: NVMe +.\" Language: English +.\" +.TH "NVME\-OCP\-DEVICE\-C" "1" "08/02/2024" "NVMe" "NVMe Manual" +.\" ----------------------------------------------------------------- +.\" * Define some portability stuff +.\" ----------------------------------------------------------------- +.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.\" http://bugs.debian.org/507673 +.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html +.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.ie \n(.g .ds Aq \(aq +.el .ds Aq ' +.\" ----------------------------------------------------------------- +.\" * set default formatting +.\" ----------------------------------------------------------------- +.\" disable hyphenation +.nh +.\" disable justification (adjust text to left margin only) +.ad l +.\" ----------------------------------------------------------------- +.\" * MAIN CONTENT STARTS HERE * +.\" ----------------------------------------------------------------- +.SH "NAME" +nvme-ocp-device-capability-log \- Retrieves OCP Device Capability Log Page +.SH "SYNOPSIS" +.sp +.nf +\fInvme ocp device\-capability\-log\fR [\-\-output\-format= | \-o ] +.fi +.SH "DESCRIPTION" +.sp +For the NVMe device given, retrieves OCP Device Capability Log Page +.sp +The parameter is mandatory and may be either the NVMe character device (ex: /dev/nvme0) or block device (ex: /dev/nvme0n1)\&. +.sp +This will only work on OCP compliant devices supporting this feature\&. Results for any other device are undefined\&. +.sp +On success it returns 0, error code otherwise\&. +.SH "OPTIONS" +.PP +\-o , \-\-output\-format= +.RS 4 +Set the reporting format to +\fInormal\fR +or +\fIjson\fR +or +\fIbinary\fR\&. Only one output format can be used at a time\&. The default is normal\&. +.RE +.SH "EXAMPLES" +.sp +.RS 4 +.ie n \{\ +\h'-04'\(bu\h'+03'\c +.\} +.el \{\ +.sp -1 +.IP \(bu 2.3 +.\} +Has the program issue a device\-capability\-log command to retrieve the 0xC4 log page\&. +.sp +.if n \{\ +.RS 4 +.\} +.nf +# nvme ocp device\-capability\-log /dev/nvme0 \-o normal +.fi +.if n \{\ +.RE +.\} +.RE +.SH "NVME" +.sp +Part of the nvme\-user suite\&. diff --git a/Documentation/nvme-ocp-device-capability-log.html b/Documentation/nvme-ocp-device-capability-log.html new file mode 100644 index 0000000000..06bf894c34 --- /dev/null +++ b/Documentation/nvme-ocp-device-capability-log.html @@ -0,0 +1,818 @@ + + + + + + +nvme-ocp-device-capability-log(1) + + + + + +
+
+

SYNOPSIS

+
+
+
nvme ocp device-capability-log <device> [--output-format=<fmt> | -o <fmt>]
+
+
+
+
+
+

DESCRIPTION

+
+

For the NVMe device given, retrieves OCP Device Capability Log Page

+

The <device> parameter is mandatory and may be either the NVMe character +device (ex: /dev/nvme0) or block device (ex: /dev/nvme0n1).

+

This will only work on OCP compliant devices supporting this feature. +Results for any other device are undefined.

+

On success it returns 0, error code otherwise.

+
+
+
+

OPTIONS

+
+
+
+-o <fmt> +
+
+--output-format=<fmt> +
+
+

+ Set the reporting format to normal or json or binary. + Only one output format can be used at a time. The default is normal. +

+
+
+
+
+
+

EXAMPLES

+
+
    +
  • +

    +Has the program issue a device-capability-log command to retrieve the 0xC4 log page. +

    +
    +
    +
    # nvme ocp device-capability-log /dev/nvme0 -o normal
    +
    +
  • +
+
+
+
+

NVME

+
+

Part of the nvme-user suite.

+
+
+
+

+ + + diff --git a/Documentation/nvme-ocp-eol-plp-failure-mode.1 b/Documentation/nvme-ocp-eol-plp-failure-mode.1 index 6ff639e99f..823efce123 100644 --- a/Documentation/nvme-ocp-eol-plp-failure-mode.1 +++ b/Documentation/nvme-ocp-eol-plp-failure-mode.1 @@ -2,12 +2,12 @@ .\" Title: nvme-ocp-eol-plp-failure-mode .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-OCP\-EOL\-PLP\" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-OCP\-EOL\-PLP\" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -34,7 +34,7 @@ nvme-ocp-eol-plp-failure-mode \- Define and print EOL or PLP circuitry failure m .nf \fInvme ocp eol\-plp\-failure\-mode\fR [\-\-mode= | \-m ] [\-\-no\-uuid | \-n] [\-\-save | \-s] - [\-\-sel=] + [\-\-sel=] .fi .SH "DESCRIPTION" .sp diff --git a/Documentation/nvme-ocp-eol-plp-failure-mode.html b/Documentation/nvme-ocp-eol-plp-failure-mode.html index f99cfd1eb3..6b404334c8 100644 --- a/Documentation/nvme-ocp-eol-plp-failure-mode.html +++ b/Documentation/nvme-ocp-eol-plp-failure-mode.html @@ -751,7 +751,7 @@

SYNOPSIS

nvme ocp eol-plp-failure-mode <device> [--mode=<mode> | -m <mode>]
                         [--no-uuid | -n] [--save | -s]
-                        [--sel=<select> | -s <select>]
+ [--sel=<select> | -S <select>]
@@ -886,7 +886,7 @@

NVME

diff --git a/Documentation/nvme-ocp-error-recovery-log.1 b/Documentation/nvme-ocp-error-recovery-log.1 new file mode 100644 index 0000000000..512bf9ecaf --- /dev/null +++ b/Documentation/nvme-ocp-error-recovery-log.1 @@ -0,0 +1,81 @@ +'\" t +.\" Title: nvme-ocp-error-recovery-log +.\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] +.\" Generator: DocBook XSL Stylesheets vsnapshot +.\" Date: 08/02/2024 +.\" Manual: NVMe Manual +.\" Source: NVMe +.\" Language: English +.\" +.TH "NVME\-OCP\-ERROR\-RE" "1" "08/02/2024" "NVMe" "NVMe Manual" +.\" ----------------------------------------------------------------- +.\" * Define some portability stuff +.\" ----------------------------------------------------------------- +.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.\" http://bugs.debian.org/507673 +.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html +.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.ie \n(.g .ds Aq \(aq +.el .ds Aq ' +.\" ----------------------------------------------------------------- +.\" * set default formatting +.\" ----------------------------------------------------------------- +.\" disable hyphenation +.nh +.\" disable justification (adjust text to left margin only) +.ad l +.\" ----------------------------------------------------------------- +.\" * MAIN CONTENT STARTS HERE * +.\" ----------------------------------------------------------------- +.SH "NAME" +nvme-ocp-error-recovery-log \- Retrieves OCP Error Recovery Log Page +.SH "SYNOPSIS" +.sp +.nf +\fInvme ocp error\-recovery\-log\fR [\-\-output\-format= | \-o ] +.fi +.SH "DESCRIPTION" +.sp +For the NVMe device given, retrieves OCP Error Recovery Log Page +.sp +The parameter is mandatory and may be either the NVMe character device (ex: /dev/nvme0) or block device (ex: /dev/nvme0n1)\&. +.sp +This will only work on OCP compliant devices supporting this feature\&. Results for any other device are undefined\&. +.sp +On success it returns 0, error code otherwise\&. +.SH "OPTIONS" +.PP +\-o , \-\-output\-format= +.RS 4 +Set the reporting format to +\fInormal\fR +or +\fIjson\fR +or +\fIbinary\fR\&. Only one output format can be used at a time\&. The default is normal\&. +.RE +.SH "EXAMPLES" +.sp +.RS 4 +.ie n \{\ +\h'-04'\(bu\h'+03'\c +.\} +.el \{\ +.sp -1 +.IP \(bu 2.3 +.\} +Has the program issue a error\-recovery\-log command to retrieve the 0xC1 log page\&. +.sp +.if n \{\ +.RS 4 +.\} +.nf +# nvme ocp error\-recovery\-log /dev/nvme0 \-o normal +.fi +.if n \{\ +.RE +.\} +.RE +.SH "NVME" +.sp +Part of the nvme\-user suite\&. diff --git a/Documentation/nvme-ocp-error-recovery-log.html b/Documentation/nvme-ocp-error-recovery-log.html new file mode 100644 index 0000000000..690a179dc0 --- /dev/null +++ b/Documentation/nvme-ocp-error-recovery-log.html @@ -0,0 +1,818 @@ + + + + + + +nvme-ocp-error-recovery-log(1) + + + + + +
+
+

SYNOPSIS

+
+
+
nvme ocp error-recovery-log <device> [--output-format=<fmt> | -o <fmt>]
+
+
+
+
+
+

DESCRIPTION

+
+

For the NVMe device given, retrieves OCP Error Recovery Log Page

+

The <device> parameter is mandatory and may be either the NVMe character +device (ex: /dev/nvme0) or block device (ex: /dev/nvme0n1).

+

This will only work on OCP compliant devices supporting this feature. +Results for any other device are undefined.

+

On success it returns 0, error code otherwise.

+
+
+
+

OPTIONS

+
+
+
+-o <fmt> +
+
+--output-format=<fmt> +
+
+

+ Set the reporting format to normal or json or binary. + Only one output format can be used at a time. The default is normal. +

+
+
+
+
+
+

EXAMPLES

+
+
    +
  • +

    +Has the program issue a error-recovery-log command to retrieve the 0xC1 log page. +

    +
    +
    +
    # nvme ocp error-recovery-log /dev/nvme0 -o normal
    +
    +
  • +
+
+
+
+

NVME

+
+

Part of the nvme-user suite.

+
+
+
+

+ + + diff --git a/Documentation/nvme-ocp-get-dssd-async-event-config.1 b/Documentation/nvme-ocp-get-dssd-async-event-config.1 new file mode 100644 index 0000000000..a8424db861 --- /dev/null +++ b/Documentation/nvme-ocp-get-dssd-async-event-config.1 @@ -0,0 +1,116 @@ +'\" t +.\" Title: nvme-ocp-get-dssd-async-event-config +.\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] +.\" Generator: DocBook XSL Stylesheets vsnapshot +.\" Date: 08/02/2024 +.\" Manual: NVMe Manual +.\" Source: NVMe +.\" Language: English +.\" +.TH "NVME\-OCP\-GET\-DSSD" "1" "08/02/2024" "NVMe" "NVMe Manual" +.\" ----------------------------------------------------------------- +.\" * Define some portability stuff +.\" ----------------------------------------------------------------- +.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.\" http://bugs.debian.org/507673 +.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html +.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.ie \n(.g .ds Aq \(aq +.el .ds Aq ' +.\" ----------------------------------------------------------------- +.\" * set default formatting +.\" ----------------------------------------------------------------- +.\" disable hyphenation +.nh +.\" disable justification (adjust text to left margin only) +.ad l +.\" ----------------------------------------------------------------- +.\" * MAIN CONTENT STARTS HERE * +.\" ----------------------------------------------------------------- +.SH "NAME" +nvme-ocp-get-dssd-async-event-config \- Get dssd\-async\-event\-config value +.SH "SYNOPSIS" +.sp +.nf +\fInvme ocp get\-dssd\-async\-event\-config\fR [\-\-sel=] +.fi +.SH "DESCRIPTION" +.sp +Get dssd\-async\-event\-config\&. +.sp +The parameter is mandatory and may be either the NVMe character device (ex: /dev/nvme0) or block device (ex: /dev/nvme0n1)\&. +.sp +This will only work on OCP compliant devices supporting this feature\&. Results for any other device are undefined\&. +.sp +On success it returns 0, error code otherwise\&. +.SH "OPTIONS" +.PP +\-s +.RS 4 +Select (SEL): This field specifies which value of the attributes to return in the provided data: +.TS +allbox tab(:); +lt lt +lt lt +lt lt +lt lt +lt lt +lt lt. +T{ +Select +T}:T{ +Description +T} +T{ +0 +T}:T{ +Current +T} +T{ +1 +T}:T{ +Default +T} +T{ +2 +T}:T{ +Saved +T} +T{ +3 +T}:T{ +Supported capabilities +T} +T{ +4\-7 +T}:T{ +Reserved +T} +.TE +.sp 1 +.RE +.SH "EXAMPLES" +.sp +.RS 4 +.ie n \{\ +\h'-04'\(bu\h'+03'\c +.\} +.el \{\ +.sp -1 +.IP \(bu 2.3 +.\} +Has the program issue a get\-dssd\-async\-event\-config to retrieve the saved 0xC9 get features\&. +.sp +.if n \{\ +.RS 4 +.\} +.nf +# nvme ocp get\-dssd\-async\-event\-config /dev/nvme0 \-s 2 +.fi +.if n \{\ +.RE +.\} +.RE +.SH "NVME" +.sp +Part of the nvme\-user suite\&. diff --git a/Documentation/nvme-ocp-get-dssd-async-event-config.html b/Documentation/nvme-ocp-get-dssd-async-event-config.html new file mode 100644 index 0000000000..c3d7a96d40 --- /dev/null +++ b/Documentation/nvme-ocp-get-dssd-async-event-config.html @@ -0,0 +1,853 @@ + + + + + + +nvme-ocp-get-dssd-async-event-config(1) + + + + + +
+
+

SYNOPSIS

+
+
+
nvme ocp get-dssd-async-event-config <device> [--sel=<select> | -s <select>]
+
+
+
+
+
+

DESCRIPTION

+
+

Get dssd-async-event-config.

+

The <device> parameter is mandatory and may be either the NVMe character +device (ex: /dev/nvme0) or block device (ex: /dev/nvme0n1).

+

This will only work on OCP compliant devices supporting this feature. +Results for any other device are undefined.

+

On success it returns 0, error code otherwise.

+
+
+
+

OPTIONS

+
+
+
+-s <select> +
+
+--sel=<select> +
+
+

+ Select (SEL): This field specifies which value of the attributes + to return in the provided data: +

+
+ +++ + + + + + + + + + + + + + + + + + + + + + + + + + +

Select

Description

0

Current

1

Default

2

Saved

3

Supported capabilities

4-7

Reserved

+
+
+
+
+
+
+

EXAMPLES

+
+
    +
  • +

    +Has the program issue a get-dssd-async-event-config to retrieve the saved 0xC9 get features. +

    +
    +
    +
    # nvme ocp get-dssd-async-event-config /dev/nvme0 -s 2
    +
    +
  • +
+
+
+
+

NVME

+
+

Part of the nvme-user suite.

+
+
+
+

+ + + diff --git a/Documentation/nvme-ocp-get-dssd-power-state-feature.1 b/Documentation/nvme-ocp-get-dssd-power-state-feature.1 new file mode 100644 index 0000000000..b46e431014 --- /dev/null +++ b/Documentation/nvme-ocp-get-dssd-power-state-feature.1 @@ -0,0 +1,149 @@ +'\" t +.\" Title: get-dssd-power-state-feature +.\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] +.\" Generator: DocBook XSL Stylesheets vsnapshot +.\" Date: 08/02/2024 +.\" Manual: NVMe Manual +.\" Source: NVMe +.\" Language: English +.\" +.TH "GET\-DSSD\-POWER\-ST" "1" "08/02/2024" "NVMe" "NVMe Manual" +.\" ----------------------------------------------------------------- +.\" * Define some portability stuff +.\" ----------------------------------------------------------------- +.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.\" http://bugs.debian.org/507673 +.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html +.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.ie \n(.g .ds Aq \(aq +.el .ds Aq ' +.\" ----------------------------------------------------------------- +.\" * set default formatting +.\" ----------------------------------------------------------------- +.\" disable hyphenation +.nh +.\" disable justification (adjust text to left margin only) +.ad l +.\" ----------------------------------------------------------------- +.\" * MAIN CONTENT STARTS HERE * +.\" ----------------------------------------------------------------- +.SH "NAME" +nvme-ocp-get-dssd-power-state-feature \- Get DSSD Power State +.SH "SYNOPSIS" +.sp +.nf +\fInvme ocp get\-dssd\-power\-state\-feature\fR + [\-\-sel=] [\-\-all | \-a] + [\-\-no\-uuid | \-n] +.fi +.SH "DESCRIPTION" +.sp +For the NVMe device given, retrieves OCP DSSD Power State\&. Passing \-\-all calls NVMe Get Feature three times, returning all three of the Current, Default, and Saved values\&. +.sp +The parameter is mandatory and may be either the NVMe character device (ex: /dev/nvme0) or block device (ex: /dev/nvme0n1)\&. +.sp +This will only work on OCP compliant devices supporting this feature\&. Results for any other device are undefined\&. +.sp +On success it returns 0, error code otherwise\&. +.SH "OPTIONS" +.PP +\-S +.RS 4 +Select (SEL): This field specifies which value of the attributes to return in the provided data: +.TS +allbox tab(:); +lt lt +lt lt +lt lt +lt lt +lt lt +lt lt. +T{ +Select +T}:T{ +Description +T} +T{ +0 +T}:T{ +Current +T} +T{ +1 +T}:T{ +Default +T} +T{ +2 +T}:T{ +Saved +T} +T{ +3 +T}:T{ +Supported capabilities +T} +T{ +4\-7 +T}:T{ +Reserved +T} +.TE +.sp 1 +.RE +.PP +\-a, \-\-all +.RS 4 +Print out all 3 values at once \- Current DSSD Power State, Default DSSD Power State, and Saved DSSD Power State +.RE +.PP +\-n, \-\-no\-uuid +.RS 4 +Do not try to automatically detect UUID index for this command (required for old OCP 1\&.0 support) +.RE +.SH "EXAMPLES" +.sp +.RS 4 +.ie n \{\ +\h'-04'\(bu\h'+03'\c +.\} +.el \{\ +.sp -1 +.IP \(bu 2.3 +.\} +Has the program issue a get\-dssd\-power\-state\-feature command to get the Curent DSSD Power State in watts\&. +.sp +.if n \{\ +.RS 4 +.\} +.nf +# nvme ocp get\-dssd\-power\-state\-feature /dev/nvme0 \-S 0 +.fi +.if n \{\ +.RE +.\} +.RE +.sp +.RS 4 +.ie n \{\ +\h'-04'\(bu\h'+03'\c +.\} +.el \{\ +.sp -1 +.IP \(bu 2.3 +.\} +Has the program issue a get\-dssd\-power\-state\-feature command to get all three DSSD Power States in watts\&. +.sp +.if n \{\ +.RS 4 +.\} +.nf +# nvme ocp get\-dssd\-power\-state\-feature /dev/nvme0 \-a +.fi +.if n \{\ +.RE +.\} +.RE +.SH "NVME" +.sp +Part of the nvme\-user suite\&. diff --git a/Documentation/nvme-ocp-get-dssd-power-state-feature.html b/Documentation/nvme-ocp-get-dssd-power-state-feature.html new file mode 100644 index 0000000000..4c09df2fff --- /dev/null +++ b/Documentation/nvme-ocp-get-dssd-power-state-feature.html @@ -0,0 +1,890 @@ + + + + + + +get-dssd-power-state-feature(1) + + + + + +
+
+

SYNOPSIS

+
+
+
nvme ocp get-dssd-power-state-feature <device>
+                        [--sel=<select> | -S <select>] [--all | -a]
+                        [--no-uuid | -n]
+
+
+
+
+
+

DESCRIPTION

+
+

For the NVMe device given, retrieves OCP DSSD Power State. +Passing --all calls NVMe Get Feature three times, returning all three of +the Current, Default, and Saved values.

+

The <device> parameter is mandatory and may be either the NVMe character +device (ex: /dev/nvme0) or block device (ex: /dev/nvme0n1).

+

This will only work on OCP compliant devices supporting this feature. +Results for any other device are undefined.

+

On success it returns 0, error code otherwise.

+
+
+
+

OPTIONS

+
+
+
+-S <select> +
+
+--sel=<select> +
+
+

+ Select (SEL): This field specifies which value of the attributes + to return in the provided data: +

+
+ +++ + + + + + + + + + + + + + + + + + + + + + + + + + +

Select

Description

0

Current

1

Default

2

Saved

3

Supported capabilities

4-7

Reserved

+
+
+
+-a +
+
+--all +
+
+

+ Print out all 3 values at once - Current DSSD Power State, + Default DSSD Power State, and Saved DSSD Power State +

+
+
+-n +
+
+--no-uuid +
+
+

+ Do not try to automatically detect UUID index for this command (required + for old OCP 1.0 support) +

+
+
+
+
+
+

EXAMPLES

+
+
    +
  • +

    +Has the program issue a get-dssd-power-state-feature command to get the Curent DSSD Power State in watts. +

    +
    +
    +
    # nvme ocp get-dssd-power-state-feature /dev/nvme0 -S 0
    +
    +
  • +
  • +

    +Has the program issue a get-dssd-power-state-feature command to get all three DSSD Power States in watts. +

    +
    +
    +
    # nvme ocp get-dssd-power-state-feature /dev/nvme0 -a
    +
    +
  • +
+
+
+
+

NVME

+
+

Part of the nvme-user suite.

+
+
+
+

+ + + diff --git a/Documentation/nvme-ocp-get-plp-health-check-interval.1 b/Documentation/nvme-ocp-get-plp-health-check-interval.1 new file mode 100644 index 0000000000..8fc102125d --- /dev/null +++ b/Documentation/nvme-ocp-get-plp-health-check-interval.1 @@ -0,0 +1,116 @@ +'\" t +.\" Title: nvme-ocp-get-plp-health-check-interval +.\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] +.\" Generator: DocBook XSL Stylesheets vsnapshot +.\" Date: 08/02/2024 +.\" Manual: NVMe Manual +.\" Source: NVMe +.\" Language: English +.\" +.TH "NVME\-OCP\-GET\-PLP\" "1" "08/02/2024" "NVMe" "NVMe Manual" +.\" ----------------------------------------------------------------- +.\" * Define some portability stuff +.\" ----------------------------------------------------------------- +.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.\" http://bugs.debian.org/507673 +.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html +.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.ie \n(.g .ds Aq \(aq +.el .ds Aq ' +.\" ----------------------------------------------------------------- +.\" * set default formatting +.\" ----------------------------------------------------------------- +.\" disable hyphenation +.nh +.\" disable justification (adjust text to left margin only) +.ad l +.\" ----------------------------------------------------------------- +.\" * MAIN CONTENT STARTS HERE * +.\" ----------------------------------------------------------------- +.SH "NAME" +nvme-ocp-get-plp-health-check-interval \- Define and print plp\-health\-check\-interval value +.SH "SYNOPSIS" +.sp +.nf +\fInvme ocp get\-plp\-health\-check\-interval\fR [\-\-sel=] +.fi +.SH "DESCRIPTION" +.sp +Define plp\-health\-check\-interval\&. No argument prints current mode\&. +.sp +The parameter is mandatory and may be either the NVMe character device (ex: /dev/nvme0) or block device (ex: /dev/nvme0n1)\&. +.sp +This will only work on OCP compliant devices supporting this feature\&. Results for any other device are undefined\&. +.sp +On success it returns 0, error code otherwise\&. +.SH "OPTIONS" +.PP +\-s +.RS 4 +Select (SEL): This field specifies which value of the attributes to return in the provided data: +.TS +allbox tab(:); +lt lt +lt lt +lt lt +lt lt +lt lt +lt lt. +T{ +Select +T}:T{ +Description +T} +T{ +0 +T}:T{ +Current +T} +T{ +1 +T}:T{ +Default +T} +T{ +2 +T}:T{ +Saved +T} +T{ +3 +T}:T{ +Supported capabilities +T} +T{ +4\-7 +T}:T{ +Reserved +T} +.TE +.sp 1 +.RE +.SH "EXAMPLES" +.sp +.RS 4 +.ie n \{\ +\h'-04'\(bu\h'+03'\c +.\} +.el \{\ +.sp -1 +.IP \(bu 2.3 +.\} +Has the program issue a get\-plp\-health\-check\-interval to retrieve the 0xC6 get features\&. +.sp +.if n \{\ +.RS 4 +.\} +.nf +# nvme ocp get\-plp\-health\-check\-interval /dev/nvme0 +.fi +.if n \{\ +.RE +.\} +.RE +.SH "NVME" +.sp +Part of the nvme\-user suite\&. diff --git a/Documentation/nvme-ocp-get-plp-health-check-interval.html b/Documentation/nvme-ocp-get-plp-health-check-interval.html new file mode 100644 index 0000000000..f3d70b6007 --- /dev/null +++ b/Documentation/nvme-ocp-get-plp-health-check-interval.html @@ -0,0 +1,854 @@ + + + + + + +nvme-ocp-get-plp-health-check-interval(1) + + + + + +
+
+

SYNOPSIS

+
+
+
nvme ocp get-plp-health-check-interval <device> [--sel=<select> | -s <select>]
+
+
+
+
+
+

DESCRIPTION

+
+

Define plp-health-check-interval. +No argument prints current mode.

+

The <device> parameter is mandatory and may be either the NVMe character +device (ex: /dev/nvme0) or block device (ex: /dev/nvme0n1).

+

This will only work on OCP compliant devices supporting this feature. +Results for any other device are undefined.

+

On success it returns 0, error code otherwise.

+
+
+
+

OPTIONS

+
+
+
+-s <select> +
+
+--sel=<select> +
+
+

+ Select (SEL): This field specifies which value of the attributes + to return in the provided data: +

+
+ +++ + + + + + + + + + + + + + + + + + + + + + + + + + +

Select

Description

0

Current

1

Default

2

Saved

3

Supported capabilities

4-7

Reserved

+
+
+
+
+
+
+

EXAMPLES

+
+
    +
  • +

    +Has the program issue a get-plp-health-check-interval to retrieve the 0xC6 get features. +

    +
    +
    +
    # nvme ocp get-plp-health-check-interval /dev/nvme0
    +
    +
  • +
+
+
+
+

NVME

+
+

Part of the nvme-user suite.

+
+
+
+

+ + + diff --git a/Documentation/nvme-ocp-internal-log.1 b/Documentation/nvme-ocp-internal-log.1 new file mode 100644 index 0000000000..2badb51c56 --- /dev/null +++ b/Documentation/nvme-ocp-internal-log.1 @@ -0,0 +1,177 @@ +'\" t +.\" Title: nvme-ocp-internal-log +.\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] +.\" Generator: DocBook XSL Stylesheets vsnapshot +.\" Date: 08/02/2024 +.\" Manual: NVMe Manual +.\" Source: NVMe +.\" Language: English +.\" +.TH "NVME\-OCP\-INTERNAL\" "1" "08/02/2024" "NVMe" "NVMe Manual" +.\" ----------------------------------------------------------------- +.\" * Define some portability stuff +.\" ----------------------------------------------------------------- +.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.\" http://bugs.debian.org/507673 +.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html +.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.ie \n(.g .ds Aq \(aq +.el .ds Aq ' +.\" ----------------------------------------------------------------- +.\" * set default formatting +.\" ----------------------------------------------------------------- +.\" disable hyphenation +.nh +.\" disable justification (adjust text to left margin only) +.ad l +.\" ----------------------------------------------------------------- +.\" * MAIN CONTENT STARTS HERE * +.\" ----------------------------------------------------------------- +.SH "NAME" +nvme-ocp-internal-log \- Conditionally retrieves 07h Telemetry Host\-Initiated log, C9h OCP Strings Log from an NVMe device or from user\-specified file path\&. Takes retrieved logs and decodes into human\-readable output format specified by user\&. +.SH "SYNOPSIS" +.sp +.nf +\fInvme ocp internal\-log\fR + [\-\-telemetry\-log= | \-l ] + [\-\-string\-log= | \-s ] + [\-\-output\-file= | \-o ] + [\-\-output\-format= | \-f ] + [\-\-data\-area= | \-a ] + [\-\-telemetry\-type= | \-t ] +.fi +.SH "DESCRIPTION" +.sp +Conditionally retrieves 07h Telemetry Host\-Initiated log, C9h OCP Strings Log from an NVMe device or from user\-specified file path\&. Takes retrieved logs and decodes (or) parses into human\-readable output format specified by user\&. +.sp +The parameter is mandatory and may be either the NVMe character device (ex: /dev/nvme0), or a namespace block device (ex: /dev/nvme0n1)\&. +.sp +This will only work on OCP compliant devices supporting this feature\&. Results for any other device are undefined\&. +.sp +On success it returns 0, error code otherwise\&. +.SH "OPTIONS" +.PP +\-l , \-\-telemetry\-log= +.RS 4 +File name to existing Telemetry Host\-Initiated raw binary data to be used\&. If no path is specified, a live retrieval of payload on will be performed\&. +.RE +.PP +\-s , \-\-string\-log= +.RS 4 +File name to existing OCP String Log raw binary data to be used\&. If no path is specified, a live retrieval of payload on will be performed\&. +.RE +.PP +\-o , \-\-output\-file= +.RS 4 +Filepath name to where human\-readable output data will be saved to\&. +.RE +.PP +\-f , \-\-output\-format= +.RS 4 +Set the reporting format to +\fInormal\fR, +\fIjson\fR\&. Only one output format can be used at a time, the default value is +\fIjson\fR\&. +.RE +.PP +\-a , \-\-data\-area= +.RS 4 +Retrieves the specific data area requested\&. Valid inputs are 1,2\&. If this option is not specified, the default value is 1\&. +.RE +.PP +\-t , \-\-telemetry\-type= +.RS 4 +If set to 1, controller shall capture the Telemetry Host\-Initiated data representing the internal state of the controller at the time the associated Get Log Page command is processed\&. If cleared to 0, controller shall not update this data\&. +.RE +.SH "EXAMPLES" +.sp +.RS 4 +.ie n \{\ +\h'-04'\(bu\h'+03'\c +.\} +.el \{\ +.sp -1 +.IP \(bu 2.3 +.\} +Retrieve in both OCP String Log and Telemetry Host\-Initiated Log from device\&. Decode default data\-area(s) in default format and output to console\&. +.sp +.if n \{\ +.RS 4 +.\} +.nf +# nvme ocp internal\-log /dev/nvme0 +.fi +.if n \{\ +.RE +.\} +.RE +.sp +.RS 4 +.ie n \{\ +\h'-04'\(bu\h'+03'\c +.\} +.el \{\ +.sp -1 +.IP \(bu 2.3 +.\} +Retrieve Telemetry Host\-Initiated data, reads in the OCP String Log locally\&. Decode default data\-area(s) in default format\&. +.sp +.if n \{\ +.RS 4 +.\} +.nf +# nvme ocp internal\-log /dev/nvme0 \-\-string\-log=ocp_string_log\&.bin + \-\-output\-file=output_file\&.json +.fi +.if n \{\ +.RE +.\} +.RE +.sp +.RS 4 +.ie n \{\ +\h'-04'\(bu\h'+03'\c +.\} +.el \{\ +.sp -1 +.IP \(bu 2.3 +.\} +Retrieve OCP String Log, reads in the Telemetry Host\-Initiated Log locally\&. Decode data\-areas 1 and 2, and output in json format\&. +.sp +.if n \{\ +.RS 4 +.\} +.nf +# nvme ocp internal\-log /dev/nvme0 \-\-telemetry\-log=host_telemetry\&.bin + \-\-output\-format=json \-\-output\-file=output_file\&.json \-\-data\-area=2 +.fi +.if n \{\ +.RE +.\} +.RE +.sp +.RS 4 +.ie n \{\ +\h'-04'\(bu\h'+03'\c +.\} +.el \{\ +.sp -1 +.IP \(bu 2.3 +.\} +Reads in both OCP String Log and Telemetry Host\-Initiated Log locally\&. Decode data\-areas 1 and 2, and output in normal text format\&. +.sp +.if n \{\ +.RS 4 +.\} +.nf +# nvme ocp internal\-log /dev/nvme0 \-\-string\-log=ocp_string_log\&.bin + \-\-telemetry\-log=host_telemetry\&.bin \-\-output\-format=normal + \-\-output\-file=output_file\&.txt \-\-data\-area=2 +.fi +.if n \{\ +.RE +.\} +.RE +.SH "NVME" +.sp +Part of the nvme\-user suite diff --git a/Documentation/nvme-ocp-internal-log.html b/Documentation/nvme-ocp-internal-log.html new file mode 100644 index 0000000000..03c14734a5 --- /dev/null +++ b/Documentation/nvme-ocp-internal-log.html @@ -0,0 +1,925 @@ + + + + + + +nvme-ocp-internal-log(1) + + + + + +
+
+

SYNOPSIS

+
+
+
nvme ocp internal-log <device>
+                        [--telemetry-log=<file> | -l <file>]
+                        [--string-log=<file> | -s <file>]
+                        [--output-file=<file> | -o <file>]
+                        [--output-format=<fmt> | -f <fmt>]
+                        [--data-area=<da> | -a <da>]
+                        [--telemetry-type=<type> | -t <type>]
+
+
+
+
+
+

DESCRIPTION

+
+

Conditionally retrieves 07h Telemetry Host-Initiated log, C9h OCP Strings Log +from an NVMe device or from user-specified file path. Takes retrieved logs and +decodes (or) parses into human-readable output format specified by user.

+

The <device> parameter is mandatory and may be either the NVMe +character device (ex: /dev/nvme0), or a namespace block device (ex: +/dev/nvme0n1).

+

This will only work on OCP compliant devices supporting this feature. +Results for any other device are undefined.

+

On success it returns 0, error code otherwise.

+
+
+
+

OPTIONS

+
+
+
+-l <file> +
+
+--telemetry-log=<file> +
+
+

+ File name to existing Telemetry Host-Initiated raw binary data to be used. + If no path is specified, a live retrieval of payload on <device> will be + performed. +

+
+
+-s <file> +
+
+--string-log=<file> +
+
+

+ File name to existing OCP String Log raw binary data to be used. If no path + is specified, a live retrieval of payload on <device> will be + performed. +

+
+
+-o <file> +
+
+--output-file=<file> +
+
+

+ Filepath name to where human-readable output data will be saved to. +

+
+
+-f <fmt> +
+
+--output-format=<fmt> +
+
+

+ Set the reporting format to normal, json. Only one output format can be + used at a time, the default value is json. +

+
+
+-a <da> +
+
+--data-area=<da> +
+
+

+ Retrieves the specific data area requested. Valid inputs are 1,2. If this + option is not specified, the default value is 1. +

+
+
+-t <type> +
+
+--telemetry-type=<type> +
+
+

+ If set to 1, controller shall capture the Telemetry Host-Initiated data + representing the internal state of the controller at the time the associated + Get Log Page command is processed. If cleared to 0, controller shall not + update this data. +

+
+
+
+
+
+

EXAMPLES

+
+
    +
  • +

    +Retrieve in both OCP String Log and Telemetry Host-Initiated Log from +device. Decode default data-area(s) in default format and output to console. +

    +
    +
    +
    # nvme ocp internal-log /dev/nvme0
    +
    +
  • +
  • +

    +Retrieve Telemetry Host-Initiated data, reads in the OCP String Log locally. +Decode default data-area(s) in default format. +

    +
    +
    +
    # nvme ocp internal-log /dev/nvme0 --string-log=ocp_string_log.bin
    + --output-file=output_file.json
    +
    +
  • +
  • +

    +Retrieve OCP String Log, reads in the Telemetry Host-Initiated Log locally. +Decode data-areas 1 and 2, and output in json format. +

    +
    +
    +
    # nvme ocp internal-log /dev/nvme0 --telemetry-log=host_telemetry.bin
    + --output-format=json --output-file=output_file.json --data-area=2
    +
    +
  • +
  • +

    +Reads in both OCP String Log and Telemetry Host-Initiated Log locally. +Decode data-areas 1 and 2, and output in normal text format. +

    +
    +
    +
    # nvme ocp internal-log /dev/nvme0 --string-log=ocp_string_log.bin
    + --telemetry-log=host_telemetry.bin --output-format=normal
    + --output-file=output_file.txt --data-area=2
    +
    +
  • +
+
+
+
+

NVME

+
+

Part of the nvme-user suite

+
+
+
+

+ + + diff --git a/Documentation/nvme-ocp-latency-monitor-log.1 b/Documentation/nvme-ocp-latency-monitor-log.1 index 1433343419..383a0c6f37 100644 --- a/Documentation/nvme-ocp-latency-monitor-log.1 +++ b/Documentation/nvme-ocp-latency-monitor-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-ocp-latency-monitor-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-OCP\-LATENCY\-" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-OCP\-LATENCY\-" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-ocp-latency-monitor-log.html b/Documentation/nvme-ocp-latency-monitor-log.html index 94dd5c1a3b..6155a0fd3a 100644 --- a/Documentation/nvme-ocp-latency-monitor-log.html +++ b/Documentation/nvme-ocp-latency-monitor-log.html @@ -811,7 +811,7 @@

NVME

diff --git a/Documentation/nvme-ocp-set-dssd-async-event-config.1 b/Documentation/nvme-ocp-set-dssd-async-event-config.1 new file mode 100644 index 0000000000..703083772e --- /dev/null +++ b/Documentation/nvme-ocp-set-dssd-async-event-config.1 @@ -0,0 +1,81 @@ +'\" t +.\" Title: nvme-ocp-set-dssd-async-event-config +.\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] +.\" Generator: DocBook XSL Stylesheets vsnapshot +.\" Date: 08/02/2024 +.\" Manual: NVMe Manual +.\" Source: NVMe +.\" Language: English +.\" +.TH "NVME\-OCP\-SET\-DSSD" "1" "08/02/2024" "NVMe" "NVMe Manual" +.\" ----------------------------------------------------------------- +.\" * Define some portability stuff +.\" ----------------------------------------------------------------- +.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.\" http://bugs.debian.org/507673 +.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html +.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.ie \n(.g .ds Aq \(aq +.el .ds Aq ' +.\" ----------------------------------------------------------------- +.\" * set default formatting +.\" ----------------------------------------------------------------- +.\" disable hyphenation +.nh +.\" disable justification (adjust text to left margin only) +.ad l +.\" ----------------------------------------------------------------- +.\" * MAIN CONTENT STARTS HERE * +.\" ----------------------------------------------------------------- +.SH "NAME" +nvme-ocp-set-dssd-async-event-config \- Set DSSD asynchronous event configuration +.SH "SYNOPSIS" +.sp +.nf +\fInvme ocp set\-dssd\-async\-event\-config\fR [\-\-enable\-panic\-notices | \-e] [\-\-save | \-s] +.fi +.SH "DESCRIPTION" +.sp +Set DSSD asynchronous event configuration +.sp +The parameter is mandatory and may be either the NVMe character device (ex: /dev/nvme0) or block device (ex: /dev/nvme0n1)\&. +.sp +This will only work on OCP compliant devices supporting this feature\&. Results for any other device are undefined\&. +.sp +On success it returns 0, error code otherwise\&. +.SH "OPTIONS" +.PP +\-e, \-\-enable\-panic\-notices +.RS 4 +Set enable panic notices [0] +.RE +.PP +\-s, \-\-save +.RS 4 +Save the attribute so that it persists through all power states and resets\&. +.RE +.SH "EXAMPLES" +.sp +.RS 4 +.ie n \{\ +\h'-04'\(bu\h'+03'\c +.\} +.el \{\ +.sp -1 +.IP \(bu 2.3 +.\} +Has the program issue a set\-dssd\-async\-event\-config to enable panic notices, persisting through power states\&. +.sp +.if n \{\ +.RS 4 +.\} +.nf +# nvme ocp set\-dssd\-async\-event\-config /dev/nvme0 \-e \-s +.fi +.if n \{\ +.RE +.\} +.RE +.SH "NVME" +.sp +Part of the nvme\-user suite\&. diff --git a/Documentation/nvme-ocp-set-dssd-async-event-config.html b/Documentation/nvme-ocp-set-dssd-async-event-config.html new file mode 100644 index 0000000000..b726d7874b --- /dev/null +++ b/Documentation/nvme-ocp-set-dssd-async-event-config.html @@ -0,0 +1,829 @@ + + + + + + +nvme-ocp-set-dssd-async-event-config(1) + + + + + +
+
+

SYNOPSIS

+
+
+
nvme ocp set-dssd-async-event-config <device> [--enable-panic-notices | -e] [--save | -s]
+
+
+
+
+
+

DESCRIPTION

+
+

Set DSSD asynchronous event configuration

+

The <device> parameter is mandatory and may be either the NVMe character +device (ex: /dev/nvme0) or block device (ex: /dev/nvme0n1).

+

This will only work on OCP compliant devices supporting this feature. +Results for any other device are undefined.

+

On success it returns 0, error code otherwise.

+
+
+
+

OPTIONS

+
+
+
+-e +
+
+--enable-panic-notices +
+
+

+ Set enable panic notices [0] +

+
+
+-s +
+
+--save +
+
+

+ Save the attribute so that it persists through all power states and resets. +

+
+
+
+
+
+

EXAMPLES

+
+
    +
  • +

    +Has the program issue a set-dssd-async-event-config to enable panic notices, +persisting through power states. +

    +
    +
    +
    # nvme ocp set-dssd-async-event-config /dev/nvme0 -e -s
    +
    +
  • +
+
+
+
+

NVME

+
+

Part of the nvme-user suite.

+
+
+
+

+ + + diff --git a/Documentation/nvme-ocp-set-dssd-power-state-feature.1 b/Documentation/nvme-ocp-set-dssd-power-state-feature.1 new file mode 100644 index 0000000000..991d4b14b2 --- /dev/null +++ b/Documentation/nvme-ocp-set-dssd-power-state-feature.1 @@ -0,0 +1,78 @@ +'\" t +.\" Title: set-dssd-power-state-feature +.\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] +.\" Generator: DocBook XSL Stylesheets vsnapshot +.\" Date: 08/02/2024 +.\" Manual: NVMe Manual +.\" Source: NVMe +.\" Language: English +.\" +.TH "SET\-DSSD\-POWER\-ST" "1" "08/02/2024" "NVMe" "NVMe Manual" +.\" ----------------------------------------------------------------- +.\" * Define some portability stuff +.\" ----------------------------------------------------------------- +.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.\" http://bugs.debian.org/507673 +.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html +.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.ie \n(.g .ds Aq \(aq +.el .ds Aq ' +.\" ----------------------------------------------------------------- +.\" * set default formatting +.\" ----------------------------------------------------------------- +.\" disable hyphenation +.nh +.\" disable justification (adjust text to left margin only) +.ad l +.\" ----------------------------------------------------------------- +.\" * MAIN CONTENT STARTS HERE * +.\" ----------------------------------------------------------------- +.SH "NAME" +nvme-ocp-set-dssd-power-state-feature \- Set DSSD Power State +.SH "SYNOPSIS" +.sp +.nf +\fInvme ocp set\-dssd\-power\-state\-feature\fR + [\-\-power\-state= | \-p ] [\-\-no\-uuid | \-n] + [\-\-save | \-s] +.fi +.SH "DESCRIPTION" +.sp +For the NVMe device given, retrieves OCP DSSD Power state Feature +.sp +The parameter is mandatory and may be either the NVMe character device (ex: /dev/nvme0) or block device (ex: /dev/nvme0n1)\&. +.sp +This will only work on OCP compliant devices supporting this feature\&. Results for any other device are undefined\&. +.sp +On success it returns 0, error code otherwise\&. +.SH "OPTIONS" +.PP +\-p , \-\-power\-state= +.RS 4 +DSSD Power State to set in watts\&. +.RE +.SH "EXAMPLES" +.sp +.RS 4 +.ie n \{\ +\h'-04'\(bu\h'+03'\c +.\} +.el \{\ +.sp -1 +.IP \(bu 2.3 +.\} +Has the program issue a set\-dssd\-power\-state\-feature command to set DSSD Power State to set in watts\&. +.sp +.if n \{\ +.RS 4 +.\} +.nf +# nvme ocp set\-dssd\-power\-state\-feature /dev/nvme0 \-p \-s \-n +.fi +.if n \{\ +.RE +.\} +.RE +.SH "NVME" +.sp +Part of the nvme\-user suite\&. diff --git a/Documentation/nvme-ocp-set-dssd-power-state-feature.html b/Documentation/nvme-ocp-set-dssd-power-state-feature.html new file mode 100644 index 0000000000..e574361c31 --- /dev/null +++ b/Documentation/nvme-ocp-set-dssd-power-state-feature.html @@ -0,0 +1,819 @@ + + + + + + +set-dssd-power-state-feature(1) + + + + + +
+
+

SYNOPSIS

+
+
+
nvme ocp set-dssd-power-state-feature <device>
+                        [--power-state=<fmt> | -p <fmt>] [--no-uuid | -n]
+                        [--save | -s]
+
+
+
+
+
+

DESCRIPTION

+
+

For the NVMe device given, retrieves OCP DSSD Power state Feature

+

The <device> parameter is mandatory and may be either the NVMe character +device (ex: /dev/nvme0) or block device (ex: /dev/nvme0n1).

+

This will only work on OCP compliant devices supporting this feature. +Results for any other device are undefined.

+

On success it returns 0, error code otherwise.

+
+
+
+

OPTIONS

+
+
+
+-p <fmt> +
+
+--power-state=<fmt> +
+
+

+ DSSD Power State to set in watts. +

+
+
+
+
+
+

EXAMPLES

+
+
    +
  • +

    +Has the program issue a set-dssd-power-state-feature command to set DSSD Power State to set in watts. +

    +
    +
    +
    # nvme ocp set-dssd-power-state-feature /dev/nvme0 -p <value> -s <value> -n <value>
    +
    +
  • +
+
+
+
+

NVME

+
+

Part of the nvme-user suite.

+
+
+
+

+ + + diff --git a/Documentation/nvme-ocp-set-plp-health-check-interval.1 b/Documentation/nvme-ocp-set-plp-health-check-interval.1 new file mode 100644 index 0000000000..4f65e5650a --- /dev/null +++ b/Documentation/nvme-ocp-set-plp-health-check-interval.1 @@ -0,0 +1,86 @@ +'\" t +.\" Title: nvme-ocp-set-plp-health-check-interval +.\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] +.\" Generator: DocBook XSL Stylesheets vsnapshot +.\" Date: 08/02/2024 +.\" Manual: NVMe Manual +.\" Source: NVMe +.\" Language: English +.\" +.TH "NVME\-OCP\-SET\-PLP\" "1" "08/02/2024" "NVMe" "NVMe Manual" +.\" ----------------------------------------------------------------- +.\" * Define some portability stuff +.\" ----------------------------------------------------------------- +.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.\" http://bugs.debian.org/507673 +.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html +.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.ie \n(.g .ds Aq \(aq +.el .ds Aq ' +.\" ----------------------------------------------------------------- +.\" * set default formatting +.\" ----------------------------------------------------------------- +.\" disable hyphenation +.nh +.\" disable justification (adjust text to left margin only) +.ad l +.\" ----------------------------------------------------------------- +.\" * MAIN CONTENT STARTS HERE * +.\" ----------------------------------------------------------------- +.SH "NAME" +nvme-ocp-set-plp-health-check-interval \- Define and set PLP health check interval +.SH "SYNOPSIS" +.sp +.nf +\fInvme ocp set\-plp\-health\-check\-interval\fR [\-\-plp_health_interval= | \-p ] [\-\-save | \-s] [\-\-no\-uuid | \-n] +.fi +.SH "DESCRIPTION" +.sp +Define Set PLP health check interval\&. No argument prints current mode\&. +.sp +The parameter is mandatory and may be either the NVMe character device (ex: /dev/nvme0) or block device (ex: /dev/nvme0n1)\&. +.sp +This will only work on OCP compliant devices supporting this feature\&. Results for any other device are undefined\&. +.sp +On success it returns 0, error code otherwise\&. +.SH "OPTIONS" +.PP +\-p , \-\-plp_health_interval= +.RS 4 +Set the plp health check interval [31:16] +.RE +.PP +\-n, \-\-no\-uuid +.RS 4 +Do not try to automatically detect UUID index for this command (required for old OCP 1\&.0 support) +.RE +.PP +\-s, \-\-save +.RS 4 +Save the attribute so that it persists through all power states and resets\&. +.RE +.SH "EXAMPLES" +.sp +.RS 4 +.ie n \{\ +\h'-04'\(bu\h'+03'\c +.\} +.el \{\ +.sp -1 +.IP \(bu 2.3 +.\} +Has the program issue a set\-plp\-health\-check\-interval to retrieve the 0xC6 set features\&. +.sp +.if n \{\ +.RS 4 +.\} +.nf +# nvme ocp eol\-plp\-failure\-mode /dev/nvme0 +.fi +.if n \{\ +.RE +.\} +.RE +.SH "NVME" +.sp +Part of the nvme\-user suite\&. diff --git a/Documentation/nvme-ocp-set-plp-health-check-interval.html b/Documentation/nvme-ocp-set-plp-health-check-interval.html new file mode 100644 index 0000000000..fb9fe70d32 --- /dev/null +++ b/Documentation/nvme-ocp-set-plp-health-check-interval.html @@ -0,0 +1,841 @@ + + + + + + +nvme-ocp-set-plp-health-check-interval(1) + + + + + +
+
+

SYNOPSIS

+
+
+
nvme ocp set-plp-health-check-interval <device> [--plp_health_interval=<plp_health_interval> | -p <plp_health_interval>] [--save | -s] [--no-uuid | -n]
+
+
+
+
+
+

DESCRIPTION

+
+

Define Set PLP health check interval. +No argument prints current mode.

+

The <device> parameter is mandatory and may be either the NVMe character +device (ex: /dev/nvme0) or block device (ex: /dev/nvme0n1).

+

This will only work on OCP compliant devices supporting this feature. +Results for any other device are undefined.

+

On success it returns 0, error code otherwise.

+
+
+
+

OPTIONS

+
+
+
+-p <plp_health_interval> +
+
+--plp_health_interval=<plp_health_interval> +
+
+

+ Set the plp health check interval [31:16] +

+
+
+-n +
+
+--no-uuid +
+
+

+ Do not try to automatically detect UUID index for this command (required + for old OCP 1.0 support) +

+
+
+-s +
+
+--save +
+
+

+ Save the attribute so that it persists through all power states and resets. +

+
+
+
+
+
+

EXAMPLES

+
+
    +
  • +

    +Has the program issue a set-plp-health-check-interval to retrieve the 0xC6 set features. +

    +
    +
    +
    # nvme ocp eol-plp-failure-mode /dev/nvme0
    +
    +
  • +
+
+
+
+

NVME

+
+

Part of the nvme-user suite.

+
+
+
+

+ + + diff --git a/Documentation/nvme-ocp-set-telemetry-profile.1 b/Documentation/nvme-ocp-set-telemetry-profile.1 new file mode 100644 index 0000000000..020d38aefa --- /dev/null +++ b/Documentation/nvme-ocp-set-telemetry-profile.1 @@ -0,0 +1,77 @@ +'\" t +.\" Title: nvme-ocp-set-telemetry-profile +.\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] +.\" Generator: DocBook XSL Stylesheets vsnapshot +.\" Date: 08/02/2024 +.\" Manual: NVMe Manual +.\" Source: NVMe +.\" Language: English +.\" +.TH "NVME\-OCP\-SET\-TELE" "1" "08/02/2024" "NVMe" "NVMe Manual" +.\" ----------------------------------------------------------------- +.\" * Define some portability stuff +.\" ----------------------------------------------------------------- +.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.\" http://bugs.debian.org/507673 +.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html +.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.ie \n(.g .ds Aq \(aq +.el .ds Aq ' +.\" ----------------------------------------------------------------- +.\" * set default formatting +.\" ----------------------------------------------------------------- +.\" disable hyphenation +.nh +.\" disable justification (adjust text to left margin only) +.ad l +.\" ----------------------------------------------------------------- +.\" * MAIN CONTENT STARTS HERE * +.\" ----------------------------------------------------------------- +.SH "NAME" +nvme-ocp-set-telemetry-profile \- Set Telemetry Profile +.SH "SYNOPSIS" +.sp +.nf +\fInvme ocp set\-telemetry\-profile\fR + [\-\-telemetry\-profile\-select= | \-t ] +.fi +.SH "DESCRIPTION" +.sp +For the NVMe device given, sets the OCP Set Telemetry Profile Feature +.sp +The parameter is mandatory and may be either the NVMe character device (ex: /dev/nvme0) or block device (ex: /dev/nvme0n1)\&. +.sp +This will only work on OCP compliant devices supporting this feature\&. Results for any other device are undefined\&. +.sp +On success it returns 0, error code otherwise\&. +.SH "OPTIONS" +.PP +\-t , \-\-tps= +.RS 4 +Telemetry Profile Select\&. The device shall collect debug data per the specified profile number\&. +.RE +.SH "EXAMPLES" +.sp +.RS 4 +.ie n \{\ +\h'-04'\(bu\h'+03'\c +.\} +.el \{\ +.sp -1 +.IP \(bu 2.3 +.\} +Has the program issue a set\-telemetry\-profile command to use profile five\&. +.sp +.if n \{\ +.RS 4 +.\} +.nf +# nvme ocp set\-telemetry\-profile /dev/nvme0 \-t 5 +.fi +.if n \{\ +.RE +.\} +.RE +.SH "NVME" +.sp +Part of the nvme\-user suite\&. diff --git a/Documentation/nvme-ocp-set-telemetry-profile.html b/Documentation/nvme-ocp-set-telemetry-profile.html new file mode 100644 index 0000000000..9fff1ac54f --- /dev/null +++ b/Documentation/nvme-ocp-set-telemetry-profile.html @@ -0,0 +1,819 @@ + + + + + + +nvme-ocp-set-telemetry-profile(1) + + + + + +
+
+

SYNOPSIS

+
+
+
nvme ocp set-telemetry-profile <device>
+                        [--telemetry-profile-select=<tps> | -t <tps>]
+
+
+
+
+
+

DESCRIPTION

+
+

For the NVMe device given, sets the OCP Set Telemetry Profile Feature

+

The <device> parameter is mandatory and may be either the NVMe character +device (ex: /dev/nvme0) or block device (ex: /dev/nvme0n1).

+

This will only work on OCP compliant devices supporting this feature. +Results for any other device are undefined.

+

On success it returns 0, error code otherwise.

+
+
+
+

OPTIONS

+
+
+
+-t <tps> +
+
+--tps=<tps> +
+
+

+ Telemetry Profile Select. The device shall collect debug data per the + specified profile number. +

+
+
+
+
+
+

EXAMPLES

+
+
    +
  • +

    +Has the program issue a set-telemetry-profile command to use profile five. +

    +
    +
    +
    # nvme ocp set-telemetry-profile /dev/nvme0 -t 5
    +
    +
  • +
+
+
+
+

NVME

+
+

Part of the nvme-user suite.

+
+
+
+

+ + + diff --git a/Documentation/nvme-ocp-smart-add-log.1 b/Documentation/nvme-ocp-smart-add-log.1 index 354718cbe5..ce480cfb6c 100644 --- a/Documentation/nvme-ocp-smart-add-log.1 +++ b/Documentation/nvme-ocp-smart-add-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-ocp-smart-add-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-OCP\-SMART\-AD" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-OCP\-SMART\-AD" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-ocp-smart-add-log.html b/Documentation/nvme-ocp-smart-add-log.html index 73c7a1470b..e9d39afa1e 100644 --- a/Documentation/nvme-ocp-smart-add-log.html +++ b/Documentation/nvme-ocp-smart-add-log.html @@ -812,7 +812,7 @@

NVME

diff --git a/Documentation/nvme-ocp-tcg-configuration-log.html b/Documentation/nvme-ocp-tcg-configuration-log.html new file mode 100644 index 0000000000..56331de6bb --- /dev/null +++ b/Documentation/nvme-ocp-tcg-configuration-log.html @@ -0,0 +1,819 @@ + + + + + + +nvme-ocp-tcg-configuration-log(1) + + + + + +
+
+

SYNOPSIS

+
+
+
nvme ocp tcg-configuration-log <device> [--output-format=<fmt> | -o <fmt>]
+
+
+
+
+
+

DESCRIPTION

+
+

For the NVMe device given, send a tcg-configuration-log command and +provide the tcg configuration log.

+

The <device> parameter is mandatory and may be either the NVMe character +device (ex: /dev/nvme0) or block device (ex: /dev/nvme0n1).

+

This will only work on OCP compliant devices supporting this feature. +Results for any other device are undefined.

+

On success it returns 0, error code otherwise.

+
+
+
+

OPTIONS

+
+
+
+-o <fmt> +
+
+--output-format=<fmt> +
+
+

+ Set the reporting format to normal or json. Only one output format + can be used at a time. The default is normal. +

+
+
+
+
+
+

EXAMPLES

+
+
    +
  • +

    +Has the program issue a tcg-configuration-log command to retrieve the 0xC7 log page. +

    +
    +
    +
    # nvme ocp tcg-configuration-log /dev/nvme0
    +
    +
  • +
+
+
+
+

NVME

+
+

Part of the nvme-user suite.

+
+
+
+

+ + + diff --git a/Documentation/nvme-ocp-telemetry-string-log-page.1 b/Documentation/nvme-ocp-telemetry-string-log-page.1 new file mode 100644 index 0000000000..cb2c14bd6c --- /dev/null +++ b/Documentation/nvme-ocp-telemetry-string-log-page.1 @@ -0,0 +1,76 @@ +'\" t +.\" Title: nvme-ocp-telemetry-string-log-page +.\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] +.\" Generator: DocBook XSL Stylesheets vsnapshot +.\" Date: 08/02/2024 +.\" Manual: NVMe Manual +.\" Source: NVMe +.\" Language: English +.\" +.TH "NVME\-OCP\-TELEMETRY" "1" "08/02/2024" "NVMe" "NVMe Manual" +.\" ----------------------------------------------------------------- +.\" * Define some portability stuff +.\" ----------------------------------------------------------------- +.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.\" http://bugs.debian.org/507673 +.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html +.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.ie \n(.g .ds Aq \(aq +.el .ds Aq ' +.\" ----------------------------------------------------------------- +.\" * set default formatting +.\" ----------------------------------------------------------------- +.\" disable hyphenation +.nh +.\" disable justification (adjust text to left margin only) +.ad l +.\" ----------------------------------------------------------------- +.\" * MAIN CONTENT STARTS HERE * +.\" ----------------------------------------------------------------- +.SH "NAME" +nvme-ocp-telemetry-string-log-page \- Retrieve OCP Telemetry String Log page +.SH "SYNOPSIS" +.sp +.nf +\fInvme ocp telemetry\-str\-log\fR [\-\-output\-format= | \-o ] +.fi +.SH "DESCRIPTION" +.sp +For the NVMe device given, Retrieve OCP Telemetry String Log page +.sp +The parameter is mandatory and may be either the NVMe character device (ex: /dev/nvme0) or block device (ex: /dev/nvme0n1)\&. +.sp +This will only work on OCP compliant devices supporting this feature\&. Results for any other device are undefined\&. +.sp +On success it returns 0, error code otherwise\&. +.SH "OPTIONS" +.PP +\-o , \-\-output\-format= +.RS 4 +This option will set the reporting format to normal, json, or binary\&. Only one output format can be used at a time\&. +.RE +.SH "EXAMPLES" +.sp +.RS 4 +.ie n \{\ +\h'-04'\(bu\h'+03'\c +.\} +.el \{\ +.sp -1 +.IP \(bu 2.3 +.\} +Has the program issue a telemetry\-string\-log command to get the log page data from bin file\&. +.sp +.if n \{\ +.RS 4 +.\} +.nf +# nvme ocp telemetry\-string\-log /dev/nvme0n1 +.fi +.if n \{\ +.RE +.\} +.RE +.SH "NVME" +.sp +Part of the nvme\-user suite\&. diff --git a/Documentation/nvme-ocp-telemetry-string-log-page.html b/Documentation/nvme-ocp-telemetry-string-log-page.html new file mode 100644 index 0000000000..c67135ed26 --- /dev/null +++ b/Documentation/nvme-ocp-telemetry-string-log-page.html @@ -0,0 +1,818 @@ + + + + + + +nvme-ocp-telemetry-string-log-page(1) + + + + + +
+
+

SYNOPSIS

+
+
+
nvme ocp telemetry-str-log <device> [--output-format=<fmt> | -o <fmt>]
+
+
+
+
+
+

DESCRIPTION

+
+

For the NVMe device given, Retrieve OCP Telemetry String Log page

+

The <device> parameter is mandatory and may be either the NVMe character +device (ex: /dev/nvme0) or block device (ex: /dev/nvme0n1).

+

This will only work on OCP compliant devices supporting this feature. +Results for any other device are undefined.

+

On success it returns 0, error code otherwise.

+
+
+
+

OPTIONS

+
+
+
+-o <fmt> +
+
+--output-format=<fmt> +
+
+

+ This option will set the reporting format to normal, json, or binary. + Only one output format can be used at a time. +

+
+
+
+
+
+

EXAMPLES

+
+
    +
  • +

    +Has the program issue a telemetry-string-log command to get the log page data from bin file. +

    +
    +
    +
    # nvme ocp telemetry-string-log /dev/nvme0n1
    +
    +
  • +
+
+
+
+

NVME

+
+

Part of the nvme-user suite.

+
+
+
+

+ + + diff --git a/Documentation/nvme-ocp-unsupported-reqs-log-pages.html b/Documentation/nvme-ocp-unsupported-reqs-log-pages.html new file mode 100644 index 0000000000..ccf7dd82bb --- /dev/null +++ b/Documentation/nvme-ocp-unsupported-reqs-log-pages.html @@ -0,0 +1,819 @@ + + + + + + +nvme-ocp-unsupported-reqs-log(1) + + + + + +
+
+

SYNOPSIS

+
+
+
nvme ocp unsupported-reqs-log <device> [--output-format=<fmt> | -o <fmt>]
+
+
+
+
+
+

DESCRIPTION

+
+

For the NVMe device given, send a unsupported-reqs-log command and +provide the unsupported requirements log page.

+

The <device> parameter is mandatory and may be either the NVMe character +device (ex: /dev/nvme0) or block device (ex: /dev/nvme0n1).

+

This will only work on OCP compliant devices supporting this feature. +Results for any other device are undefined.

+

On success it returns 0, error code otherwise.

+
+
+
+

OPTIONS

+
+
+
+-o <fmt> +
+
+--output-format=<fmt> +
+
+

+ This option will set the reporting format to normal, json, or binary. + Only one output format can be used at a time. +

+
+
+
+
+
+

EXAMPLES

+
+
    +
  • +

    +Has the program issue a unsupported-reqs-log command to retrieve the 0xC5 log page. +

    +
    +
    +
    # nvme ocp unsupported-reqs-log /dev/nvme0
    +
    +
  • +
+
+
+
+

NVME

+
+

Part of the nvme-user suite

+
+
+
+

+ + + diff --git a/Documentation/nvme-ocp-unsupported-reqs-log.1 b/Documentation/nvme-ocp-unsupported-reqs-log.1 new file mode 100644 index 0000000000..e3d633c66b --- /dev/null +++ b/Documentation/nvme-ocp-unsupported-reqs-log.1 @@ -0,0 +1,76 @@ +'\" t +.\" Title: nvme-ocp-unsupported-reqs-log +.\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] +.\" Generator: DocBook XSL Stylesheets vsnapshot +.\" Date: 08/02/2024 +.\" Manual: NVMe Manual +.\" Source: NVMe +.\" Language: English +.\" +.TH "NVME\-OCP\-UNSUPPORT" "1" "08/02/2024" "NVMe" "NVMe Manual" +.\" ----------------------------------------------------------------- +.\" * Define some portability stuff +.\" ----------------------------------------------------------------- +.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.\" http://bugs.debian.org/507673 +.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html +.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.ie \n(.g .ds Aq \(aq +.el .ds Aq ' +.\" ----------------------------------------------------------------- +.\" * set default formatting +.\" ----------------------------------------------------------------- +.\" disable hyphenation +.nh +.\" disable justification (adjust text to left margin only) +.ad l +.\" ----------------------------------------------------------------- +.\" * MAIN CONTENT STARTS HERE * +.\" ----------------------------------------------------------------- +.SH "NAME" +nvme-ocp-unsupported-reqs-log \- Retrieves unsupported requirements log page of given OCP compliant device +.SH "SYNOPSIS" +.sp +.nf +\fInvme ocp unsupported\-reqs\-log\fR [\-\-output\-format= | \-o ] +.fi +.SH "DESCRIPTION" +.sp +For the NVMe device given, send a unsupported\-reqs\-log command and provide the unsupported requirements log page\&. +.sp +The parameter is mandatory and may be either the NVMe character device (ex: /dev/nvme0) or block device (ex: /dev/nvme0n1)\&. +.sp +This will only work on OCP compliant devices supporting this feature\&. Results for any other device are undefined\&. +.sp +On success it returns 0, error code otherwise\&. +.SH "OPTIONS" +.PP +\-o , \-\-output\-format= +.RS 4 +This option will set the reporting format to normal, json, or binary\&. Only one output format can be used at a time\&. +.RE +.SH "EXAMPLES" +.sp +.RS 4 +.ie n \{\ +\h'-04'\(bu\h'+03'\c +.\} +.el \{\ +.sp -1 +.IP \(bu 2.3 +.\} +Has the program issue a unsupported\-reqs\-log command to retrieve the 0xC5 log page\&. +.sp +.if n \{\ +.RS 4 +.\} +.nf +# nvme ocp unsupported\-reqs\-log /dev/nvme0 +.fi +.if n \{\ +.RE +.\} +.RE +.SH "NVME" +.sp +Part of the nvme\-user suite diff --git a/Documentation/nvme-persistent-event-log.1 b/Documentation/nvme-persistent-event-log.1 index 035efcf591..15db44b92c 100644 --- a/Documentation/nvme-persistent-event-log.1 +++ b/Documentation/nvme-persistent-event-log.1 @@ -2,12 +2,12 @@ .\" Title: persistent-event-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "PERSISTENT\-EVENT\-L" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "PERSISTENT\-EVENT\-L" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-persistent-event-log.html b/Documentation/nvme-persistent-event-log.html index 5059770e53..8b2b765f7b 100644 --- a/Documentation/nvme-persistent-event-log.html +++ b/Documentation/nvme-persistent-event-log.html @@ -877,7 +877,7 @@

NVME

diff --git a/Documentation/nvme-pred-lat-event-agg-log.1 b/Documentation/nvme-pred-lat-event-agg-log.1 index 3119771245..a534b443f1 100644 --- a/Documentation/nvme-pred-lat-event-agg-log.1 +++ b/Documentation/nvme-pred-lat-event-agg-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-pred-lat-event-agg-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-PRED\-LAT\-EVE" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-PRED\-LAT\-EVE" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-pred-lat-event-agg-log.html b/Documentation/nvme-pred-lat-event-agg-log.html index bfdba6e422..bf098fe8b3 100644 --- a/Documentation/nvme-pred-lat-event-agg-log.html +++ b/Documentation/nvme-pred-lat-event-agg-log.html @@ -864,7 +864,7 @@

NVME

diff --git a/Documentation/nvme-predictable-lat-log.1 b/Documentation/nvme-predictable-lat-log.1 index 9dce5f82f0..d58b42a9be 100644 --- a/Documentation/nvme-predictable-lat-log.1 +++ b/Documentation/nvme-predictable-lat-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-predictable-lat-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-PREDICTABLE\-L" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-PREDICTABLE\-L" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-predictable-lat-log.html b/Documentation/nvme-predictable-lat-log.html index cacd2b2b84..eb6e97f290 100644 --- a/Documentation/nvme-predictable-lat-log.html +++ b/Documentation/nvme-predictable-lat-log.html @@ -861,7 +861,7 @@

NVME

diff --git a/Documentation/nvme-primary-ctrl-caps.1 b/Documentation/nvme-primary-ctrl-caps.1 index 6746009bc3..f30f05b3e9 100644 --- a/Documentation/nvme-primary-ctrl-caps.1 +++ b/Documentation/nvme-primary-ctrl-caps.1 @@ -2,12 +2,12 @@ .\" Title: nvme-primary-ctrl-caps .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-PRIMARY\-CTRL\" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-PRIMARY\-CTRL\" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-primary-ctrl-caps.html b/Documentation/nvme-primary-ctrl-caps.html index 7ad2609115..a532e5a4ea 100644 --- a/Documentation/nvme-primary-ctrl-caps.html +++ b/Documentation/nvme-primary-ctrl-caps.html @@ -846,7 +846,7 @@

NVME

diff --git a/Documentation/nvme-read.1 b/Documentation/nvme-read.1 index 1d4a002f3b..7f81950c33 100644 --- a/Documentation/nvme-read.1 +++ b/Documentation/nvme-read.1 @@ -2,12 +2,12 @@ .\" Title: nvme-read .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-READ" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-READ" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -49,6 +49,7 @@ nvme-read \- Send an NVMe Read command, provide results [\-\-storage\-tag | \-g ] [\-\-storage\-tag\-check | \-C] [\-\-force] [\-\-output\-format= | \-o ] [\-\-verbose | \-v] + [\-\-timeout=] .fi .SH "DESCRIPTION" .sp @@ -206,6 +207,11 @@ or .RS 4 Increase the information detail in the output\&. .RE +.PP +\-\-timeout= +.RS 4 +Override default timeout value\&. In milliseconds\&. +.RE .SH "EXAMPLES" .sp No examples yet\&. diff --git a/Documentation/nvme-read.html b/Documentation/nvme-read.html index 1a2ef572af..4b1dec70c6 100644 --- a/Documentation/nvme-read.html +++ b/Documentation/nvme-read.html @@ -765,7 +765,8 @@

SYNOPSIS

[--show-command | -V] [--dry-run | -w] [--latency | -t] [--storage-tag<storage-tag> | -g <storage-tag>] [--storage-tag-check | -C] [--force] - [--output-format=<fmt> | -o <fmt>] [--verbose | -v] + [--output-format=<fmt> | -o <fmt>] [--verbose | -v] + [--timeout=<timeout>]
@@ -1067,6 +1068,14 @@

OPTIONS

Increase the information detail in the output.

+
+--timeout=<timeout> +
+
+

+ Override default timeout value. In milliseconds. +

+
@@ -1087,7 +1096,7 @@

NVME

diff --git a/Documentation/nvme-reset.1 b/Documentation/nvme-reset.1 index 0e871df207..da435472a6 100644 --- a/Documentation/nvme-reset.1 +++ b/Documentation/nvme-reset.1 @@ -2,12 +2,12 @@ .\" Title: nvme-reset .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-RESET" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-RESET" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-reset.html b/Documentation/nvme-reset.html index 7a0a9d15dd..e72e6aea34 100644 --- a/Documentation/nvme-reset.html +++ b/Documentation/nvme-reset.html @@ -818,7 +818,7 @@

NVME

diff --git a/Documentation/nvme-resv-acquire.1 b/Documentation/nvme-resv-acquire.1 index 8967d2ac1d..807c7c2ab2 100644 --- a/Documentation/nvme-resv-acquire.1 +++ b/Documentation/nvme-resv-acquire.1 @@ -2,12 +2,12 @@ .\" Title: nvme-resv-acquire .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-RESV\-ACQUIRE" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-RESV\-ACQUIRE" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -38,6 +38,7 @@ nvme-resv-acquire \- Acquire an nvme reservation [\-\-rtype= | \-t ] [\-\-racqa= | \-a ] [\-\-iekey | \-i] [\-\-output\-format= | \-o ] [\-\-verbose | \-v] + [\-\-timeout=] .fi .SH "DESCRIPTION" .sp @@ -183,6 +184,11 @@ or .RS 4 Increase the information detail in the output\&. .RE +.PP +\-\-timeout= +.RS 4 +Override default timeout value\&. In milliseconds\&. +.RE .SH "EXAMPLES" .sp No examples yet diff --git a/Documentation/nvme-resv-acquire.html b/Documentation/nvme-resv-acquire.html index 5571095cde..f340d1492c 100644 --- a/Documentation/nvme-resv-acquire.html +++ b/Documentation/nvme-resv-acquire.html @@ -754,7 +754,8 @@

SYNOPSIS

[--prkey=<prkey> | -p <prkey>] [--rtype=<rtype> | -t <rtype>] [--racqa=<racqa> | -a <racqa>] [--iekey | -i] - [--output-format=<fmt> | -o <fmt>] [--verbose | -v] + [--output-format=<fmt> | -o <fmt>] [--verbose | -v] + [--timeout=<timeout>]
@@ -951,6 +952,14 @@

OPTIONS

Increase the information detail in the output.

+
+--timeout=<timeout> +
+
+

+ Override default timeout value. In milliseconds. +

+
@@ -971,7 +980,7 @@

NVME

diff --git a/Documentation/nvme-resv-notif-log.1 b/Documentation/nvme-resv-notif-log.1 index 4e7a5e5aeb..4462df016b 100644 --- a/Documentation/nvme-resv-notif-log.1 +++ b/Documentation/nvme-resv-notif-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-resv-notif-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-RESV\-NOTIF\-L" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-RESV\-NOTIF\-L" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-resv-notif-log.html b/Documentation/nvme-resv-notif-log.html index 25cc8382f7..b39e9ea9e3 100644 --- a/Documentation/nvme-resv-notif-log.html +++ b/Documentation/nvme-resv-notif-log.html @@ -833,7 +833,7 @@

NVME

diff --git a/Documentation/nvme-resv-register.1 b/Documentation/nvme-resv-register.1 index 4bd8b8fbc2..c637055a6f 100644 --- a/Documentation/nvme-resv-register.1 +++ b/Documentation/nvme-resv-register.1 @@ -2,12 +2,12 @@ .\" Title: nvme-resv-register .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-RESV\-REGISTER" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-RESV\-REGISTER" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -38,6 +38,7 @@ nvme-resv-register \- Register an nvme reservation [\-\-rrega= | \-r ] [\-\-cptpl= | \-p ] [\-\-iekey | \-i] [\-\-output\-format= | \-o ] [\-\-verbose | \-v] + [\-\-timeout= | \-t ] .fi .SH "DESCRIPTION" .sp @@ -159,6 +160,11 @@ or .RS 4 Increase the information detail in the output\&. .RE +.PP +\-t , \-\-timeout= +.RS 4 +Override default timeout value\&. In milliseconds\&. +.RE .SH "EXAMPLES" .sp No examples yet diff --git a/Documentation/nvme-resv-register.html b/Documentation/nvme-resv-register.html index 8ebc682945..2390da590d 100644 --- a/Documentation/nvme-resv-register.html +++ b/Documentation/nvme-resv-register.html @@ -754,7 +754,8 @@

SYNOPSIS

[--nrkey=<nrkey> | -k <nrkey>] [--rrega=<rrega> | -r <rrega>] [--cptpl=<cptpl> | -p <cptpl>] [--iekey | -i] - [--output-format=<fmt> | -o <fmt>] [--verbose | -v] + [--output-format=<fmt> | -o <fmt>] [--verbose | -v] + [--timeout=<timeout> | -t <timeout>]
@@ -940,6 +941,17 @@

OPTIONS

Increase the information detail in the output.

+
+-t <timeout> +
+
+--timeout=<timeout> +
+
+

+ Override default timeout value. In milliseconds. +

+
@@ -960,7 +972,7 @@

NVME

diff --git a/Documentation/nvme-resv-release.1 b/Documentation/nvme-resv-release.1 index efa7da37c8..aa969452fb 100644 --- a/Documentation/nvme-resv-release.1 +++ b/Documentation/nvme-resv-release.1 @@ -2,12 +2,12 @@ .\" Title: nvme-resv-release .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-RESV\-RELEASE" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-RESV\-RELEASE" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -37,6 +37,7 @@ nvme-resv-release \- Release an nvme reservation [\-\-rtype= | \-t ] [\-\-rrela= | \-a ] [\-\-iekey | \-i] [\-\-output\-format= | \-o ] [\-\-verbose | \-v] + [\-\-timeout=] .fi .SH "DESCRIPTION" .sp @@ -171,6 +172,11 @@ or .RS 4 Increase the information detail in the output\&. .RE +.PP +\-\-timeout= +.RS 4 +Override default timeout value\&. In milliseconds\&. +.RE .SH "EXAMPLES" .sp No examples yet diff --git a/Documentation/nvme-resv-release.html b/Documentation/nvme-resv-release.html index 9b44606948..b3b10e3957 100644 --- a/Documentation/nvme-resv-release.html +++ b/Documentation/nvme-resv-release.html @@ -753,7 +753,8 @@

SYNOPSIS

[--crkey=<crkey> | -c <crkey>] [--rtype=<rtype> | -t <rtype>] [--rrela=<rrela> | -a <rrela>] [--iekey | -i] - [--output-format=<fmt> | -o <fmt>] [--verbose | -v] + [--output-format=<fmt> | -o <fmt>] [--verbose | -v] + [--timeout=<timeout>]
@@ -933,6 +934,14 @@

OPTIONS

Increase the information detail in the output.

+
+--timeout=<timeout> +
+
+

+ Override default timeout value. In milliseconds. +

+
@@ -953,7 +962,7 @@

NVME

diff --git a/Documentation/nvme-resv-report.1 b/Documentation/nvme-resv-report.1 index ae74f7c40d..bc94471d4c 100644 --- a/Documentation/nvme-resv-report.1 +++ b/Documentation/nvme-resv-report.1 @@ -2,12 +2,12 @@ .\" Title: nvme-resv-report .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-RESV\-REPORT" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-RESV\-REPORT" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -36,6 +36,7 @@ nvme-resv-report \- Send NVMe Reservation Report, parse the result [\-\-numd= | \-d ] [\-\-eds | \-e] [\-\-raw\-binary | \-b] [\-\-output\-format= | \-o ] [\-\-verbose | \-v] + [\-\-timeout= | \-t ] .fi .SH "DESCRIPTION" .sp @@ -78,6 +79,11 @@ or .RS 4 Increase the information detail in the output\&. .RE +.PP +\-t , \-\-timeout= +.RS 4 +Override default timeout value\&. In milliseconds\&. +.RE .SH "EXAMPLES" .sp No examples yet\&. diff --git a/Documentation/nvme-resv-report.html b/Documentation/nvme-resv-report.html index 7f8519859a..d4bfabca48 100644 --- a/Documentation/nvme-resv-report.html +++ b/Documentation/nvme-resv-report.html @@ -752,7 +752,8 @@

SYNOPSIS

nvme resv-report <device> [--namespace-id=<nsid> | -n <nsid>]
                         [--numd=<num-dwords> | -d <num-dwords>] [--eds | -e]
                         [--raw-binary | -b]
-                        [--output-format=<fmt> | -o <fmt>] [--verbose | -v]
+ [--output-format=<fmt> | -o <fmt>] [--verbose | -v] + [--timeout=<timeout> | -t <timeout>]
@@ -845,6 +846,17 @@

OPTIONS

Increase the information detail in the output.

+
+-t <timeout> +
+
+--timeout=<timeout> +
+
+

+ Override default timeout value. In milliseconds. +

+
@@ -865,7 +877,7 @@

NVME

diff --git a/Documentation/nvme-rpmb.1 b/Documentation/nvme-rpmb.1 index bac244e691..ef6fd99a29 100644 --- a/Documentation/nvme-rpmb.1 +++ b/Documentation/nvme-rpmb.1 @@ -2,12 +2,12 @@ .\" Title: nvme-rpmb .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-RPMB" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-RPMB" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-rpmb.html b/Documentation/nvme-rpmb.html index d11772c9f4..46f6b5b1cd 100644 --- a/Documentation/nvme-rpmb.html +++ b/Documentation/nvme-rpmb.html @@ -1024,7 +1024,7 @@

NVME

diff --git a/Documentation/nvme-sanitize-log.1 b/Documentation/nvme-sanitize-log.1 index bd45bedaad..afbe322e16 100644 --- a/Documentation/nvme-sanitize-log.1 +++ b/Documentation/nvme-sanitize-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-sanitize-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SANITIZE\-LOG" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SANITIZE\-LOG" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-sanitize-log.html b/Documentation/nvme-sanitize-log.html index d5074e78c9..41d2e12f1b 100644 --- a/Documentation/nvme-sanitize-log.html +++ b/Documentation/nvme-sanitize-log.html @@ -903,7 +903,7 @@

NVME

diff --git a/Documentation/nvme-sanitize.1 b/Documentation/nvme-sanitize.1 index 945a98c2b0..18dc1424a2 100644 --- a/Documentation/nvme-sanitize.1 +++ b/Documentation/nvme-sanitize.1 @@ -2,12 +2,12 @@ .\" Title: nvme-sanitize .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SANITIZE" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SANITIZE" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-sanitize.html b/Documentation/nvme-sanitize.html index c4f19d44ef..d67d6c4660 100644 --- a/Documentation/nvme-sanitize.html +++ b/Documentation/nvme-sanitize.html @@ -960,7 +960,7 @@

NVME

diff --git a/Documentation/nvme-seagate-clear-fw-activate-history.1 b/Documentation/nvme-seagate-clear-fw-activate-history.1 index c800cafe38..d5c4c7dfc1 100644 --- a/Documentation/nvme-seagate-clear-fw-activate-history.1 +++ b/Documentation/nvme-seagate-clear-fw-activate-history.1 @@ -2,12 +2,12 @@ .\" Title: nvme-seagate-clear-fw-activate-history .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SEAGATE\-CLEAR" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SEAGATE\-CLEAR" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-seagate-clear-fw-activate-history.html b/Documentation/nvme-seagate-clear-fw-activate-history.html index ec6f0ae2a5..df962d3bf1 100644 --- a/Documentation/nvme-seagate-clear-fw-activate-history.html +++ b/Documentation/nvme-seagate-clear-fw-activate-history.html @@ -792,7 +792,7 @@

NVME

diff --git a/Documentation/nvme-seagate-clear-pcie-correctable-errors.1 b/Documentation/nvme-seagate-clear-pcie-correctable-errors.1 index d316f98bad..88c2aa7634 100644 --- a/Documentation/nvme-seagate-clear-pcie-correctable-errors.1 +++ b/Documentation/nvme-seagate-clear-pcie-correctable-errors.1 @@ -2,12 +2,12 @@ .\" Title: nvme-seagate-clear-pcie-correctable-errors .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SEAGATE\-CLEAR" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SEAGATE\-CLEAR" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-seagate-clear-pcie-correctable-errors.html b/Documentation/nvme-seagate-clear-pcie-correctable-errors.html index bbfa6ea526..3803032db4 100644 --- a/Documentation/nvme-seagate-clear-pcie-correctable-errors.html +++ b/Documentation/nvme-seagate-clear-pcie-correctable-errors.html @@ -802,7 +802,7 @@

NVME

diff --git a/Documentation/nvme-seagate-cloud-SSD-plugin-version.1 b/Documentation/nvme-seagate-cloud-SSD-plugin-version.1 index 3a25d20f8f..9f3d024c0e 100644 --- a/Documentation/nvme-seagate-cloud-SSD-plugin-version.1 +++ b/Documentation/nvme-seagate-cloud-SSD-plugin-version.1 @@ -2,12 +2,12 @@ .\" Title: nvme-seagate-cloud-SSD-plugin-version .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SEAGATE\-CLOUD" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SEAGATE\-CLOUD" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-seagate-cloud-SSD-plugin-version.html b/Documentation/nvme-seagate-cloud-SSD-plugin-version.html index 0ce76a1e52..604cd6b5dc 100644 --- a/Documentation/nvme-seagate-cloud-SSD-plugin-version.html +++ b/Documentation/nvme-seagate-cloud-SSD-plugin-version.html @@ -787,7 +787,7 @@

NVME

diff --git a/Documentation/nvme-seagate-get-ctrl-tele.1 b/Documentation/nvme-seagate-get-ctrl-tele.1 index 16aa347ab4..531fd921c3 100644 --- a/Documentation/nvme-seagate-get-ctrl-tele.1 +++ b/Documentation/nvme-seagate-get-ctrl-tele.1 @@ -2,12 +2,12 @@ .\" Title: nvme-seagate-get-ctrl-tele .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SEAGATE\-GET\-" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SEAGATE\-GET\-" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-seagate-get-ctrl-tele.html b/Documentation/nvme-seagate-get-ctrl-tele.html index c29bcd43c7..db21dc83ce 100644 --- a/Documentation/nvme-seagate-get-ctrl-tele.html +++ b/Documentation/nvme-seagate-get-ctrl-tele.html @@ -813,7 +813,7 @@

NVME

diff --git a/Documentation/nvme-seagate-get-host-tele.1 b/Documentation/nvme-seagate-get-host-tele.1 index f97752c295..41151626bb 100644 --- a/Documentation/nvme-seagate-get-host-tele.1 +++ b/Documentation/nvme-seagate-get-host-tele.1 @@ -2,12 +2,12 @@ .\" Title: nvme-seagate-get-host-tele .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SEAGATE\-GET\-" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SEAGATE\-GET\-" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-seagate-get-host-tele.html b/Documentation/nvme-seagate-get-host-tele.html index 0aa20a41ec..f6142e3f72 100644 --- a/Documentation/nvme-seagate-get-host-tele.html +++ b/Documentation/nvme-seagate-get-host-tele.html @@ -826,7 +826,7 @@

NVME

diff --git a/Documentation/nvme-seagate-help.1 b/Documentation/nvme-seagate-help.1 index 5dc4755a25..ace139069e 100644 --- a/Documentation/nvme-seagate-help.1 +++ b/Documentation/nvme-seagate-help.1 @@ -2,12 +2,12 @@ .\" Title: nvme-seagate-help .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SEAGATE\-HELP" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SEAGATE\-HELP" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-seagate-help.html b/Documentation/nvme-seagate-help.html index 997cdd8f11..6a2e1e3542 100644 --- a/Documentation/nvme-seagate-help.html +++ b/Documentation/nvme-seagate-help.html @@ -812,7 +812,7 @@

NVME

diff --git a/Documentation/nvme-seagate-plugin-version.1 b/Documentation/nvme-seagate-plugin-version.1 index f0f5ab8203..826995e109 100644 --- a/Documentation/nvme-seagate-plugin-version.1 +++ b/Documentation/nvme-seagate-plugin-version.1 @@ -2,12 +2,12 @@ .\" Title: nvme-seagate-plugin-version .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SEAGATE\-PLUGI" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SEAGATE\-PLUGI" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-seagate-plugin-version.html b/Documentation/nvme-seagate-plugin-version.html index b0adb8c814..8c0aad4ce7 100644 --- a/Documentation/nvme-seagate-plugin-version.html +++ b/Documentation/nvme-seagate-plugin-version.html @@ -787,7 +787,7 @@

NVME

diff --git a/Documentation/nvme-seagate-version.1 b/Documentation/nvme-seagate-version.1 index 97924959c8..4667dcb388 100644 --- a/Documentation/nvme-seagate-version.1 +++ b/Documentation/nvme-seagate-version.1 @@ -2,12 +2,12 @@ .\" Title: nvme-seagate-version .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SEAGATE\-VERSI" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SEAGATE\-VERSI" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-seagate-version.html b/Documentation/nvme-seagate-version.html index 7ad801ade0..1f5ef6d7a0 100644 --- a/Documentation/nvme-seagate-version.html +++ b/Documentation/nvme-seagate-version.html @@ -787,7 +787,7 @@

NVME

diff --git a/Documentation/nvme-seagate-vs-fw-activate-history.1 b/Documentation/nvme-seagate-vs-fw-activate-history.1 index 938b2a4254..ecf1c02670 100644 --- a/Documentation/nvme-seagate-vs-fw-activate-history.1 +++ b/Documentation/nvme-seagate-vs-fw-activate-history.1 @@ -2,12 +2,12 @@ .\" Title: nvme-seagate-vs-fw-activate-history .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SEAGATE\-VS\-F" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SEAGATE\-VS\-F" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-seagate-vs-fw-activate-history.html b/Documentation/nvme-seagate-vs-fw-activate-history.html index e8fbb7fcd5..0fd29fe64d 100644 --- a/Documentation/nvme-seagate-vs-fw-activate-history.html +++ b/Documentation/nvme-seagate-vs-fw-activate-history.html @@ -813,7 +813,7 @@

NVME

diff --git a/Documentation/nvme-seagate-vs-internal-log.1 b/Documentation/nvme-seagate-vs-internal-log.1 index af85939fc7..eee0dcecaa 100644 --- a/Documentation/nvme-seagate-vs-internal-log.1 +++ b/Documentation/nvme-seagate-vs-internal-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-seagate-vs-internal-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SEAGATE\-VS\-I" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SEAGATE\-VS\-I" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-seagate-vs-internal-log.html b/Documentation/nvme-seagate-vs-internal-log.html index d7d3e9c3c8..5cec2a78c2 100644 --- a/Documentation/nvme-seagate-vs-internal-log.html +++ b/Documentation/nvme-seagate-vs-internal-log.html @@ -814,7 +814,7 @@

NVME

diff --git a/Documentation/nvme-seagate-vs-log-page-sup.1 b/Documentation/nvme-seagate-vs-log-page-sup.1 index 811a82f7e2..1aff60ad1d 100644 --- a/Documentation/nvme-seagate-vs-log-page-sup.1 +++ b/Documentation/nvme-seagate-vs-log-page-sup.1 @@ -2,12 +2,12 @@ .\" Title: nvme-seagate-vs-log-page-sup .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SEAGATE\-VS\-L" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SEAGATE\-VS\-L" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-seagate-vs-log-page-sup.html b/Documentation/nvme-seagate-vs-log-page-sup.html index d6aba9d023..133b179ae5 100644 --- a/Documentation/nvme-seagate-vs-log-page-sup.html +++ b/Documentation/nvme-seagate-vs-log-page-sup.html @@ -814,7 +814,7 @@

NVME

diff --git a/Documentation/nvme-seagate-vs-pcie-stats.1 b/Documentation/nvme-seagate-vs-pcie-stats.1 index d971dfca74..097e057a56 100644 --- a/Documentation/nvme-seagate-vs-pcie-stats.1 +++ b/Documentation/nvme-seagate-vs-pcie-stats.1 @@ -2,12 +2,12 @@ .\" Title: nvme-seagate-vs-pcie-stats .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SEAGATE\-VS\-P" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SEAGATE\-VS\-P" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-seagate-vs-pcie-stats.html b/Documentation/nvme-seagate-vs-pcie-stats.html index 91e8ea295e..7b249bde79 100644 --- a/Documentation/nvme-seagate-vs-pcie-stats.html +++ b/Documentation/nvme-seagate-vs-pcie-stats.html @@ -802,7 +802,7 @@

NVME

diff --git a/Documentation/nvme-seagate-vs-smart-add-log.1 b/Documentation/nvme-seagate-vs-smart-add-log.1 index 537c3a325a..a2c9cb2c94 100644 --- a/Documentation/nvme-seagate-vs-smart-add-log.1 +++ b/Documentation/nvme-seagate-vs-smart-add-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-seagate-vs-smart-add-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SEAGATE\-VS\-S" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SEAGATE\-VS\-S" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-seagate-vs-smart-add-log.html b/Documentation/nvme-seagate-vs-smart-add-log.html index 5ba2e6d100..f4864afe45 100644 --- a/Documentation/nvme-seagate-vs-smart-add-log.html +++ b/Documentation/nvme-seagate-vs-smart-add-log.html @@ -830,7 +830,7 @@

NVME

diff --git a/Documentation/nvme-seagate-vs-temperature-stats.1 b/Documentation/nvme-seagate-vs-temperature-stats.1 index bd935b0e9f..86c67df3e8 100644 --- a/Documentation/nvme-seagate-vs-temperature-stats.1 +++ b/Documentation/nvme-seagate-vs-temperature-stats.1 @@ -2,12 +2,12 @@ .\" Title: nvme-seagate-vs-temperature-stats .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SEAGATE\-VS\-T" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SEAGATE\-VS\-T" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-seagate-vs-temperature-stats.html b/Documentation/nvme-seagate-vs-temperature-stats.html index 3aa105604b..7eef88232e 100644 --- a/Documentation/nvme-seagate-vs-temperature-stats.html +++ b/Documentation/nvme-seagate-vs-temperature-stats.html @@ -802,7 +802,7 @@

NVME

diff --git a/Documentation/nvme-security-recv.1 b/Documentation/nvme-security-recv.1 index 027fa4c638..80fdca6916 100644 --- a/Documentation/nvme-security-recv.1 +++ b/Documentation/nvme-security-recv.1 @@ -2,12 +2,12 @@ .\" Title: nvme-security-recv .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SECURITY\-RECV" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SECURITY\-RECV" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -39,6 +39,7 @@ nvme-security-recv \- Security Recv command [\-\-al= | \-t ] [\-\-namespace\-id= | \-n ] [\-\-raw\-binary | \-b] [\-\-output\-format= | \-o ] [\-\-verbose | \-v] + [\-\-timeout=] .fi .SH "DESCRIPTION" .sp @@ -97,6 +98,11 @@ or .RS 4 Increase the information detail in the output\&. .RE +.PP +\-\-timeout= +.RS 4 +Override default timeout value\&. In milliseconds\&. +.RE .SH "EXAMPLES" .sp No Examples diff --git a/Documentation/nvme-security-recv.html b/Documentation/nvme-security-recv.html index d701690906..e282a19c3c 100644 --- a/Documentation/nvme-security-recv.html +++ b/Documentation/nvme-security-recv.html @@ -755,7 +755,8 @@

SYNOPSIS

[--nssf=<nvme-specific> | -N <nvme-specific>] [--al=<allocation-length> | -t <allocation-length>] [--namespace-id=<nsid> | -n <nsid>] [--raw-binary | -b] - [--output-format=<fmt> | -o <fmt>] [--verbose | -v] + [--output-format=<fmt> | -o <fmt>] [--verbose | -v] + [--timeout=<timeout>]
@@ -889,6 +890,14 @@

OPTIONS

Increase the information detail in the output.

+
+--timeout=<timeout> +
+
+

+ Override default timeout value. In milliseconds. +

+
@@ -909,7 +918,7 @@

NVME

diff --git a/Documentation/nvme-security-send.1 b/Documentation/nvme-security-send.1 index ec0cc20dad..c2ab5a2592 100644 --- a/Documentation/nvme-security-send.1 +++ b/Documentation/nvme-security-send.1 @@ -2,12 +2,12 @@ .\" Title: nvme-security-send .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SECURITY\-SEND" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SECURITY\-SEND" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -39,6 +39,7 @@ nvme-security-send \- Security Send command [\-\-nssf= | \-N ] [\-\-namespace\-id= | \-n ] [\-\-output\-format= | \-o ] [\-\-verbose | \-v] + [\-\-timeout=] .fi .SH "DESCRIPTION" .sp @@ -90,6 +91,11 @@ or .RS 4 Increase the information detail in the output\&. .RE +.PP +\-\-timeout= +.RS 4 +Override default timeout value\&. In milliseconds\&. +.RE .SH "EXAMPLES" .sp No Examples diff --git a/Documentation/nvme-security-send.html b/Documentation/nvme-security-send.html index 3b560fc392..c9890a7210 100644 --- a/Documentation/nvme-security-send.html +++ b/Documentation/nvme-security-send.html @@ -755,7 +755,8 @@

SYNOPSIS

[--tl=<transfer-length> | -t <transfer-length>] [--nssf=<nvme-specific> | -N <nvme-specific>] [--namespace-id=<nsid> | -n <nsid>] - [--output-format=<fmt> | -o <fmt>] [--verbose | -v] + [--output-format=<fmt> | -o <fmt>] [--verbose | -v] + [--timeout=<timeout>]
@@ -876,6 +877,14 @@

OPTIONS

Increase the information detail in the output.

+
+--timeout=<timeout> +
+
+

+ Override default timeout value. In milliseconds. +

+
@@ -896,7 +905,7 @@

NVME

diff --git a/Documentation/nvme-self-test-log.1 b/Documentation/nvme-self-test-log.1 index b7db93f294..aca88a6a48 100644 --- a/Documentation/nvme-self-test-log.1 +++ b/Documentation/nvme-self-test-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-self-test-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SELF\-TEST\-LO" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SELF\-TEST\-LO" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-self-test-log.html b/Documentation/nvme-self-test-log.html index f27533f545..623b392756 100644 --- a/Documentation/nvme-self-test-log.html +++ b/Documentation/nvme-self-test-log.html @@ -858,7 +858,7 @@

NVME

diff --git a/Documentation/nvme-set-feature.1 b/Documentation/nvme-set-feature.1 index 3a149de788..fffb543736 100644 --- a/Documentation/nvme-set-feature.1 +++ b/Documentation/nvme-set-feature.1 @@ -2,12 +2,12 @@ .\" Title: nvme-set-feature .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SET\-FEATURE" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SET\-FEATURE" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -39,6 +39,7 @@ nvme-set-feature \- Sets an NVMe feature, returns applicable results [\-\-data= | \-d ] [\-\-save | \-s] [\-\-output\-format= | \-o ] [\-\-verbose | \-v] [\-\-cdw12= | \-c ] + [\-\-timeout= | \-t ] .fi .SH "DESCRIPTION" .sp @@ -102,6 +103,11 @@ Increase the information detail in the output\&. .RS 4 The value for command dword 12, if applicable\&. .RE +.PP +\-t , \-\-timeout= +.RS 4 +Override default timeout value\&. In milliseconds\&. +.RE .SH "EXAMPLES" .sp .RS 4 diff --git a/Documentation/nvme-set-feature.html b/Documentation/nvme-set-feature.html index d7b044b535..be57ed6205 100644 --- a/Documentation/nvme-set-feature.html +++ b/Documentation/nvme-set-feature.html @@ -755,7 +755,8 @@

SYNOPSIS

[--data-len=<data-len> | -l <data-len>] [--data=<data-file> | -d <data-file>] [--save | -s] [--output-format=<fmt> | -o <fmt>] [--verbose | -v] - [--cdw12=<cdw12> | -c <cdw12>] + [--cdw12=<cdw12> | -c <cdw12>] + [--timeout=<timeout> | -t <timeout>]
@@ -894,6 +895,17 @@

OPTIONS

The value for command dword 12, if applicable.

+
+-t <timeout> +
+
+--timeout=<timeout> +
+
+

+ Override default timeout value. In milliseconds. +

+
@@ -934,7 +946,7 @@

NVME

diff --git a/Documentation/nvme-set-property.1 b/Documentation/nvme-set-property.1 index 8821376cc0..377df24756 100644 --- a/Documentation/nvme-set-property.1 +++ b/Documentation/nvme-set-property.1 @@ -2,12 +2,12 @@ .\" Title: nvme-set-property .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SET\-PROPERTY" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SET\-PROPERTY" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -35,6 +35,7 @@ nvme-set-property \- Writes and shows the defined NVMe controller property for N \fInvme set\-property\fR [\-\-offset= | \-O ] [\-\-value= | \-V ] [\-\-output\-format= | \-o ] [\-\-verbose | \-v] + [\-\-timeout= | \-t ] .fi .SH "DESCRIPTION" .sp @@ -64,6 +65,11 @@ or .RS 4 Increase the information detail in the output\&. .RE +.PP +\-t , \-\-timeout= +.RS 4 +Override default timeout value\&. In milliseconds\&. +.RE .SH "EXAMPLES" .sp No examples (yet)\&. diff --git a/Documentation/nvme-set-property.html b/Documentation/nvme-set-property.html index 3686ef5530..0be4250e32 100644 --- a/Documentation/nvme-set-property.html +++ b/Documentation/nvme-set-property.html @@ -751,7 +751,8 @@

SYNOPSIS

nvme set-property <device> [--offset=<offset> | -O <offset>]
                         [--value=<val> | -V <val>]
-                        [--output-format=<fmt> | -o <fmt>] [--verbose | -v]
+ [--output-format=<fmt> | -o <fmt>] [--verbose | -v] + [--timeout=<timeout> | -t <timeout>]
@@ -811,6 +812,17 @@

OPTIONS

Increase the information detail in the output.

+
+-t <timeout> +
+
+--timeout=<timeout> +
+
+

+ Override default timeout value. In milliseconds. +

+
@@ -831,7 +843,7 @@

NVME

diff --git a/Documentation/nvme-show-hostnqn.1 b/Documentation/nvme-show-hostnqn.1 index ed83aed6cc..04bacc7a35 100644 --- a/Documentation/nvme-show-hostnqn.1 +++ b/Documentation/nvme-show-hostnqn.1 @@ -2,12 +2,12 @@ .\" Title: nvme-show-hostnqn .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SHOW\-HOSTNQN" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SHOW\-HOSTNQN" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-show-hostnqn.html b/Documentation/nvme-show-hostnqn.html index a7e7277cd7..52467a90b0 100644 --- a/Documentation/nvme-show-hostnqn.html +++ b/Documentation/nvme-show-hostnqn.html @@ -809,7 +809,7 @@

NVME

diff --git a/Documentation/nvme-show-regs.1 b/Documentation/nvme-show-regs.1 index c60e88da84..2453b272d9 100644 --- a/Documentation/nvme-show-regs.1 +++ b/Documentation/nvme-show-regs.1 @@ -2,12 +2,12 @@ .\" Title: nvme-id-ns .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ID\-NS" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-ID\-NS" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -34,6 +34,7 @@ nvme-show-regs \- Reads and shows the defined NVMe controller registers for NVMe .nf \fInvme show\-regs\fR [\-\-human\-readable | \-H] [\-\-output\-format= | \-o ] [\-\-verbose | \-v] + [\-\-timeout= | \-t ] .fi .SH "DESCRIPTION" .sp @@ -60,6 +61,11 @@ or .RS 4 Increase the information detail in the output\&. .RE +.PP +\-t , \-\-timeout= +.RS 4 +Override default timeout value\&. In milliseconds\&. +.RE .SH "EXAMPLES" .sp .RS 4 diff --git a/Documentation/nvme-show-regs.html b/Documentation/nvme-show-regs.html index bf1c3b7039..a629bd5876 100644 --- a/Documentation/nvme-show-regs.html +++ b/Documentation/nvme-show-regs.html @@ -750,7 +750,8 @@

SYNOPSIS

nvme show-regs <device> [--human-readable | -H]
-                        [--output-format=<fmt> | -o <fmt>] [--verbose | -v]
+ [--output-format=<fmt> | -o <fmt>] [--verbose | -v] + [--timeout=<timeout> | -t <timeout>]
@@ -808,6 +809,17 @@

OPTIONS

Increase the information detail in the output.

+
+-t <timeout> +
+
+--timeout=<timeout> +
+
+

+ Override default timeout value. In milliseconds. +

+
@@ -859,7 +871,7 @@

NVME

diff --git a/Documentation/nvme-show-topology.1 b/Documentation/nvme-show-topology.1 index f50418f84d..002d0558a7 100644 --- a/Documentation/nvme-show-topology.1 +++ b/Documentation/nvme-show-topology.1 @@ -2,12 +2,12 @@ .\" Title: nvme-show-topology .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SHOW\-TOPOLOGY" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SHOW\-TOPOLOGY" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-show-topology.html b/Documentation/nvme-show-topology.html index 9807124a4d..805cc4d113 100644 --- a/Documentation/nvme-show-topology.html +++ b/Documentation/nvme-show-topology.html @@ -845,7 +845,7 @@

NVME

diff --git a/Documentation/nvme-smart-log.1 b/Documentation/nvme-smart-log.1 index 7a6cbf01fc..9c03b2ee60 100644 --- a/Documentation/nvme-smart-log.1 +++ b/Documentation/nvme-smart-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-smart-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SMART\-LOG" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SMART\-LOG" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-smart-log.html b/Documentation/nvme-smart-log.html index 228dee6619..9fec87e838 100644 --- a/Documentation/nvme-smart-log.html +++ b/Documentation/nvme-smart-log.html @@ -861,7 +861,7 @@

NVME

diff --git a/Documentation/nvme-subsystem-reset.1 b/Documentation/nvme-subsystem-reset.1 index 80404e66b5..0213d31f8f 100644 --- a/Documentation/nvme-subsystem-reset.1 +++ b/Documentation/nvme-subsystem-reset.1 @@ -2,12 +2,12 @@ .\" Title: nvme-subsystem-reset .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SUBSYSTEM\-RES" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SUBSYSTEM\-RES" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-subsystem-reset.html b/Documentation/nvme-subsystem-reset.html index 17ce8ea76b..d88683f243 100644 --- a/Documentation/nvme-subsystem-reset.html +++ b/Documentation/nvme-subsystem-reset.html @@ -819,7 +819,7 @@

NVME

diff --git a/Documentation/nvme-supported-log-pages.1 b/Documentation/nvme-supported-log-pages.1 index 11f08f8a8b..790fd675ce 100644 --- a/Documentation/nvme-supported-log-pages.1 +++ b/Documentation/nvme-supported-log-pages.1 @@ -2,12 +2,12 @@ .\" Title: nvme-supported-log-pages .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SUPPORTED\-LOG" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SUPPORTED\-LOG" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-supported-log-pages.html b/Documentation/nvme-supported-log-pages.html index 3c5075df6b..6fb84902be 100644 --- a/Documentation/nvme-supported-log-pages.html +++ b/Documentation/nvme-supported-log-pages.html @@ -813,7 +813,7 @@

NVME

diff --git a/Documentation/nvme-telemetry-log.1 b/Documentation/nvme-telemetry-log.1 index b125757bdc..4e3f00b594 100644 --- a/Documentation/nvme-telemetry-log.1 +++ b/Documentation/nvme-telemetry-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-telemetry-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-TELEMETRY\-LOG" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-TELEMETRY\-LOG" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-telemetry-log.html b/Documentation/nvme-telemetry-log.html index 263a22adad..cbb7707c5b 100644 --- a/Documentation/nvme-telemetry-log.html +++ b/Documentation/nvme-telemetry-log.html @@ -862,7 +862,7 @@

NVME

diff --git a/Documentation/nvme-tls-key.1 b/Documentation/nvme-tls-key.1 new file mode 100644 index 0000000000..9430e21598 --- /dev/null +++ b/Documentation/nvme-tls-key.1 @@ -0,0 +1,225 @@ +'\" t +.\" Title: nvme-tls-key +.\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] +.\" Generator: DocBook XSL Stylesheets vsnapshot +.\" Date: 08/02/2024 +.\" Manual: NVMe Manual +.\" Source: NVMe +.\" Language: English +.\" +.TH "NVME\-TLS\-KEY" "1" "08/02/2024" "NVMe" "NVMe Manual" +.\" ----------------------------------------------------------------- +.\" * Define some portability stuff +.\" ----------------------------------------------------------------- +.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.\" http://bugs.debian.org/507673 +.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html +.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.ie \n(.g .ds Aq \(aq +.el .ds Aq ' +.\" ----------------------------------------------------------------- +.\" * set default formatting +.\" ----------------------------------------------------------------- +.\" disable hyphenation +.nh +.\" disable justification (adjust text to left margin only) +.ad l +.\" ----------------------------------------------------------------- +.\" * MAIN CONTENT STARTS HERE * +.\" ----------------------------------------------------------------- +.SH "NAME" +nvme-tls-key \- Manage NVMe TLS PSKs +.SH "SYNOPSIS" +.sp +.nf +\fInvme tls\-key\fR [\-\-keyring= | \-k ] + [\-\-keytype= | \-t ] + [\-\-keyfile= | \-f ] + [\-\-import | \-i] [\-\-export | \-e] + [\-\-revoke=| \-r ] + [\-\-verbose | \-v] +.fi +.SH "DESCRIPTION" +.sp +Import, export or remove NVMe TLS pre\-shared keys (PSKs) from the system keystore\&. When the \fI\-\-export\fR option is given, all NVMe TLS PSKs are exported in the form +.sp + +.sp +where \fI\fR is the key description from the exported key and \fI\fR is the key data in PSK interchange format \fINVMeTLSkey\-1:01::\fR\&. Each key is exported in a single line\&. When the \fI\-\-import\fR option is given key data is read in the same format and imported into the kernel keystore\&. +.SH "OPTIONS" +.PP +\-k , \-\-keyring= +.RS 4 +Name of the keyring into which the +\fIretained\fR +TLS key should be stored\&. Default is +\fI\&.nvme\fR\&. +.RE +.PP +\-t , \-\-keytype= +.RS 4 +Type of the key for resulting TLS key\&. Default is +\fIpsk\fR\&. +.RE +.PP +\-f , \-\-keyfile= +.RS 4 +File to read the keys from or write the keys to instead of stdin / stdout\&. +.RE +.PP +\-i, \-\-import +.RS 4 +Read the key data from the file specified by +\fI\-\-keyfile\fR +or stdin if not present\&. +.RE +.PP +\-e, \-\-export +.RS 4 +Write the key data to the file specified by +\fI\-\-keyfile\fR +or stdout if not present\&. +.RE +.PP +\-r , \-\-revoke= +.RS 4 +Revoke a key from a keyring\&. +.RE +.PP +\-v, \-\-verbose +.RS 4 +Increase the information detail in the output\&. +.RE +.SH "EXAMPLES" +.sp +.RS 4 +.ie n \{\ +\h'-04'\(bu\h'+03'\c +.\} +.el \{\ +.sp -1 +.IP \(bu 2.3 +.\} +Create a new TLS key and insert it directly into the \&.nvme keyring: +.sp +.if n \{\ +.RS 4 +.\} +.nf +# nvme gen\-tls\-key \-i \-n hostnqn0 \-c subsys0 +NVMeTLSkey\-1:01:/b9tVz2OXJVISnoFgrPAygyS86XYJWkAapQeULns6PMpM8wv: +Inserted TLS key 26b3260e +.fi +.if n \{\ +.RE +.\} +.RE +.sp +.RS 4 +.ie n \{\ +\h'-04'\(bu\h'+03'\c +.\} +.el \{\ +.sp -1 +.IP \(bu 2.3 +.\} +Export previously created key from the kernel keyring and store it into a file +.sp +.if n \{\ +.RS 4 +.\} +.nf +# nvme tls\-key \-e \-f nvme\-tls\-keys\&.txt +.fi +.if n \{\ +.RE +.\} +.RE +.sp +.RS 4 +.ie n \{\ +\h'-04'\(bu\h'+03'\c +.\} +.el \{\ +.sp -1 +.IP \(bu 2.3 +.\} +Export/list all keys from the \&.nvme keyring using nvme and keyctl +.sp +.if n \{\ +.RS 4 +.\} +.nf +# nvme tls\-key \-\-export +NVMe0R01 hostnqn0 subsys0 NVMeTLSkey\-1:01:/b9tVz2OXJVISnoFgrPAygyS86XYJWkAapQeULns6PMpM8wv: + +# keyctl show +Session Keyring + 573249525 \-\-alswrv 0 0 keyring: _ses + 353599402 \-\-alswrv 0 65534 \e_ keyring: _uid\&.0 + 475911922 \-\-\-lswrv 0 0 \e_ keyring: \&.nvme + 649274894 \-\-als\-rv 0 0 \e_ psk: NVMe0R01 hostnqn0 subsys0 +.fi +.if n \{\ +.RE +.\} +.RE +.sp +.RS 4 +.ie n \{\ +\h'-04'\(bu\h'+03'\c +.\} +.el \{\ +.sp -1 +.IP \(bu 2.3 +.\} +Revoke a key using the description and verifying with keyctl the operation +.sp +.if n \{\ +.RS 4 +.\} +.nf +# nvme tls\-key \-\-revoke="NVMe0R01 hostnqn0 subsys0" + +# keyctl show +Session Keyring + 573249525 \-\-alswrv 0 0 keyring: _ses + 353599402 \-\-alswrv 0 65534 \e_ keyring: _uid\&.0 + 475911922 \-\-\-lswrv 0 0 \e_ keyring: \&.nvme +649274894: key inaccessible (Key has been revoked) +.fi +.if n \{\ +.RE +.\} +.RE +.sp +.RS 4 +.ie n \{\ +\h'-04'\(bu\h'+03'\c +.\} +.el \{\ +.sp -1 +.IP \(bu 2.3 +.\} +Import back previously generated key from file and verify with keyctl +.sp +.if n \{\ +.RS 4 +.\} +.nf +# nvme tls\-key \-\-import \-f nvme\-tls\-keys\&.txt + +# keyctl show +Session Keyring + 573249525 \-\-alswrv 0 0 keyring: _ses + 353599402 \-\-alswrv 0 65534 \e_ keyring: _uid\&.0 + 475911922 \-\-\-lswrv 0 0 \e_ keyring: \&.nvme + 734343968 \-\-als\-rv 0 0 \e_ psk: NVMe0R01 hostnqn0 subsys0 +.fi +.if n \{\ +.RE +.\} +.RE +.SH "NVME" +.sp +Part of the nvme\-user suite diff --git a/Documentation/nvme-tls-key.html b/Documentation/nvme-tls-key.html new file mode 100644 index 0000000000..6803edf83d --- /dev/null +++ b/Documentation/nvme-tls-key.html @@ -0,0 +1,958 @@ + + + + + + +nvme-tls-key(1) + + + + + +
+
+

SYNOPSIS

+
+
+
nvme tls-key [--keyring=<name> | -k <name>]
+                        [--keytype=<type> | -t <type>]
+                        [--keyfile=<file> | -f <file>]
+                        [--import | -i] [--export | -e]
+                        [--revoke=<description>| -r <description>]
+                        [--verbose | -v]
+
+
+
+
+
+

DESCRIPTION

+
+

Import, export or remove NVMe TLS pre-shared keys (PSKs) from the system +keystore. When the --export option is given, all NVMe TLS PSKs are +exported in the form

+

<descriptions> <psk>

+

where <description> is the key description from the +exported key and <psk> is the key data in PSK interchange +format NVMeTLSkey-1:01:<base64 encoded data>:. +Each key is exported in a single line. +When the --import option is given key data is read in the +same format and imported into the kernel keystore.

+
+
+
+

OPTIONS

+
+
+
+-k <name> +
+
+--keyring=<name> +
+
+

+ Name of the keyring into which the retained TLS key should be + stored. Default is .nvme. +

+
+
+-t <type> +
+
+--keytype=<type> +
+
+

+ Type of the key for resulting TLS key. + Default is psk. +

+
+
+-f <file> +
+
+--keyfile=<file> +
+
+

+ File to read the keys from or write the keys to instead of + stdin / stdout. +

+
+
+-i +
+
+--import +
+
+

+ Read the key data from the file specified by --keyfile + or stdin if not present. +

+
+
+-e +
+
+--export +
+
+

+ Write the key data to the file specified by --keyfile + or stdout if not present. +

+
+
+-r <description> +
+
+--revoke=<description> +
+
+

+ Revoke a key from a keyring. +

+
+
+-v +
+
+--verbose +
+
+

+ Increase the information detail in the output. +

+
+
+
+
+
+

EXAMPLES

+
+
    +
  • +

    +Create a new TLS key and insert it directly into the .nvme keyring: +

    +
    +
    +
    # nvme gen-tls-key -i -n hostnqn0 -c subsys0
    +NVMeTLSkey-1:01:/b9tVz2OXJVISnoFgrPAygyS86XYJWkAapQeULns6PMpM8wv:
    +Inserted TLS key 26b3260e
    +
    +
  • +
  • +

    +Export previously created key from the kernel keyring and store it into a file +

    +
    +
    +
    # nvme tls-key -e -f nvme-tls-keys.txt
    +
    +
  • +
  • +

    +Export/list all keys from the .nvme keyring using nvme and keyctl +

    +
    +
    +
    # nvme tls-key --export
    +NVMe0R01 hostnqn0 subsys0 NVMeTLSkey-1:01:/b9tVz2OXJVISnoFgrPAygyS86XYJWkAapQeULns6PMpM8wv:
    +
    +# keyctl show
    +Session Keyring
    + 573249525 --alswrv      0     0  keyring: _ses
    + 353599402 --alswrv      0 65534   \_ keyring: _uid.0
    + 475911922 ---lswrv      0     0   \_ keyring: .nvme
    + 649274894 --als-rv      0     0       \_ psk: NVMe0R01 hostnqn0 subsys0
    +
    +
  • +
  • +

    +Revoke a key using the description and verifying with +keyctl the operation +

    +
    +
    +
    # nvme tls-key --revoke="NVMe0R01 hostnqn0 subsys0"
    +
    +# keyctl show
    +Session Keyring
    + 573249525 --alswrv      0     0  keyring: _ses
    + 353599402 --alswrv      0 65534   \_ keyring: _uid.0
    + 475911922 ---lswrv      0     0   \_ keyring: .nvme
    +649274894: key inaccessible (Key has been revoked)
    +
    +
  • +
  • +

    +Import back previously generated key from file and verify with keyctl +

    +
    +
    +
    # nvme tls-key --import -f nvme-tls-keys.txt
    +
    +# keyctl show
    +Session Keyring
    + 573249525 --alswrv      0     0  keyring: _ses
    + 353599402 --alswrv      0 65534   \_ keyring: _uid.0
    + 475911922 ---lswrv      0     0   \_ keyring: .nvme
    + 734343968 --als-rv      0     0       \_ psk: NVMe0R01 hostnqn0 subsys0
    +
    +
  • +
+
+
+
+

NVME

+
+

Part of the nvme-user suite

+
+
+
+

+ + + diff --git a/Documentation/nvme-toshiba-clear-pcie-correctable-errors.1 b/Documentation/nvme-toshiba-clear-pcie-correctable-errors.1 index b64f30a91e..9edac7904a 100644 --- a/Documentation/nvme-toshiba-clear-pcie-correctable-errors.1 +++ b/Documentation/nvme-toshiba-clear-pcie-correctable-errors.1 @@ -2,12 +2,12 @@ .\" Title: nvme-toshiba-clear-pcie-correctable-errors .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-TOSHIBA\-CLEAR" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-TOSHIBA\-CLEAR" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-toshiba-clear-pcie-correctable-errors.html b/Documentation/nvme-toshiba-clear-pcie-correctable-errors.html index 50bb8c3eef..0e898533fe 100644 --- a/Documentation/nvme-toshiba-clear-pcie-correctable-errors.html +++ b/Documentation/nvme-toshiba-clear-pcie-correctable-errors.html @@ -791,7 +791,7 @@

NVME

diff --git a/Documentation/nvme-toshiba-vs-internal-log.1 b/Documentation/nvme-toshiba-vs-internal-log.1 index 6b0ff47284..2b925018f6 100644 --- a/Documentation/nvme-toshiba-vs-internal-log.1 +++ b/Documentation/nvme-toshiba-vs-internal-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-toshiba-vs-internal-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-TOSHIBA\-VS\-I" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-TOSHIBA\-VS\-I" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-toshiba-vs-internal-log.html b/Documentation/nvme-toshiba-vs-internal-log.html index 639ba7c5ee..3dc7e15f90 100644 --- a/Documentation/nvme-toshiba-vs-internal-log.html +++ b/Documentation/nvme-toshiba-vs-internal-log.html @@ -837,7 +837,7 @@

NVME

diff --git a/Documentation/nvme-toshiba-vs-smart-add-log.1 b/Documentation/nvme-toshiba-vs-smart-add-log.1 index 4b4cd3987a..f4ea60d5d7 100644 --- a/Documentation/nvme-toshiba-vs-smart-add-log.1 +++ b/Documentation/nvme-toshiba-vs-smart-add-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-toshiba-vs-smart-add-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-TOSHIBA\-VS\-S" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-TOSHIBA\-VS\-S" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-toshiba-vs-smart-add-log.html b/Documentation/nvme-toshiba-vs-smart-add-log.html index 286bed05c8..37edf9d3e5 100644 --- a/Documentation/nvme-toshiba-vs-smart-add-log.html +++ b/Documentation/nvme-toshiba-vs-smart-add-log.html @@ -841,7 +841,7 @@

NVME

diff --git a/Documentation/nvme-transcend-badblock.1 b/Documentation/nvme-transcend-badblock.1 index 4b08e27699..9c3c8982c3 100644 --- a/Documentation/nvme-transcend-badblock.1 +++ b/Documentation/nvme-transcend-badblock.1 @@ -2,12 +2,12 @@ .\" Title: nvme-transcend-badblock .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-TRANSCEND\-BAD" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-TRANSCEND\-BAD" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-transcend-badblock.html b/Documentation/nvme-transcend-badblock.html index 6f7bc96828..641f09426e 100644 --- a/Documentation/nvme-transcend-badblock.html +++ b/Documentation/nvme-transcend-badblock.html @@ -796,7 +796,7 @@

NVME

diff --git a/Documentation/nvme-transcend-healthvalue.1 b/Documentation/nvme-transcend-healthvalue.1 index d041bae54d..09c0ef08b3 100644 --- a/Documentation/nvme-transcend-healthvalue.1 +++ b/Documentation/nvme-transcend-healthvalue.1 @@ -2,12 +2,12 @@ .\" Title: nvme-transcend-healthvalue .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-TRANSCEND\-HEA" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-TRANSCEND\-HEA" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-transcend-healthvalue.html b/Documentation/nvme-transcend-healthvalue.html index a8044faf25..554cc1a9fc 100644 --- a/Documentation/nvme-transcend-healthvalue.html +++ b/Documentation/nvme-transcend-healthvalue.html @@ -797,7 +797,7 @@

NVME

diff --git a/Documentation/nvme-verify.1 b/Documentation/nvme-verify.1 index 6d43ef57f0..76343ff0a2 100644 --- a/Documentation/nvme-verify.1 +++ b/Documentation/nvme-verify.1 @@ -2,12 +2,12 @@ .\" Title: nvme-verify .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-VERIFY" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-VERIFY" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -43,6 +43,7 @@ nvme-verify \- Send an NVMe Verify command, return results [\-\-storage\-tag | \-S ] [\-\-storage\-tag\-check | \-C] [\-\-output\-format= | \-o ] [\-\-verbose | \-v] + [\-\-timeout= | \-t ] .fi .SH "DESCRIPTION" .sp @@ -157,6 +158,11 @@ or .RS 4 Increase the information detail in the output\&. .RE +.PP +\-t , \-\-timeout= +.RS 4 +Override default timeout value\&. In milliseconds\&. +.RE .SH "EXAMPLES" .sp No examples yet\&. diff --git a/Documentation/nvme-verify.html b/Documentation/nvme-verify.html index 1cc3f2b25f..58c985e8d0 100644 --- a/Documentation/nvme-verify.html +++ b/Documentation/nvme-verify.html @@ -759,7 +759,8 @@

SYNOPSIS

[--app-tag=<apptag> | -a <apptag>] [--storage-tag<storage-tag> | -S <storage-tag>] [--storage-tag-check | -C] - [--output-format=<fmt> | -o <fmt>] [--verbose | -v] + [--output-format=<fmt> | -o <fmt>] [--verbose | -v] + [--timeout=<timeout> | -t <timeout>]
@@ -956,6 +957,17 @@

OPTIONS

Increase the information detail in the output.

+
+-t <timeout> +
+
+--timeout=<timeout> +
+
+

+ Override default timeout value. In milliseconds. +

+
@@ -976,7 +988,7 @@

NVME

diff --git a/Documentation/nvme-virtium-save-smart-to-vtview-log.1 b/Documentation/nvme-virtium-save-smart-to-vtview-log.1 index 56c634e1c5..d1bf71bbc9 100644 --- a/Documentation/nvme-virtium-save-smart-to-vtview-log.1 +++ b/Documentation/nvme-virtium-save-smart-to-vtview-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-virtium-save-smart-to-vtview-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-VIRTIUM\-SAVE\" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-VIRTIUM\-SAVE\" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-virtium-save-smart-to-vtview-log.html b/Documentation/nvme-virtium-save-smart-to-vtview-log.html index 7f00b3d3b7..45a2827ae6 100644 --- a/Documentation/nvme-virtium-save-smart-to-vtview-log.html +++ b/Documentation/nvme-virtium-save-smart-to-vtview-log.html @@ -878,7 +878,7 @@

NVME

diff --git a/Documentation/nvme-virtium-show-identify.1 b/Documentation/nvme-virtium-show-identify.1 index 87b28fdc6d..5d7d26ac97 100644 --- a/Documentation/nvme-virtium-show-identify.1 +++ b/Documentation/nvme-virtium-show-identify.1 @@ -2,12 +2,12 @@ .\" Title: nvme-virtium-show-identify .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-VIRTIUM\-SHOW\" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-VIRTIUM\-SHOW\" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-virtium-show-identify.html b/Documentation/nvme-virtium-show-identify.html index 62e5247c5f..707c0d310f 100644 --- a/Documentation/nvme-virtium-show-identify.html +++ b/Documentation/nvme-virtium-show-identify.html @@ -798,7 +798,7 @@

NVME

diff --git a/Documentation/nvme-wdc-cap-diag.1 b/Documentation/nvme-wdc-cap-diag.1 index d9be7d8b15..64bc39b498 100644 --- a/Documentation/nvme-wdc-cap-diag.1 +++ b/Documentation/nvme-wdc-cap-diag.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-cap-diag .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-CAP\-DIAG" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-CAP\-DIAG" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-cap-diag.html b/Documentation/nvme-wdc-cap-diag.html index a5b1910298..23af87156b 100644 --- a/Documentation/nvme-wdc-cap-diag.html +++ b/Documentation/nvme-wdc-cap-diag.html @@ -856,7 +856,7 @@

NVME

diff --git a/Documentation/nvme-wdc-capabilities.1 b/Documentation/nvme-wdc-capabilities.1 index 6c8f80ccf4..c4e97eac11 100644 --- a/Documentation/nvme-wdc-capabilities.1 +++ b/Documentation/nvme-wdc-capabilities.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-capabilities .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-CAPABILIT" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-CAPABILIT" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-capabilities.html b/Documentation/nvme-wdc-capabilities.html index f2df9ec279..ce569d5e85 100644 --- a/Documentation/nvme-wdc-capabilities.html +++ b/Documentation/nvme-wdc-capabilities.html @@ -789,7 +789,7 @@

NVME

diff --git a/Documentation/nvme-wdc-clear-assert-dump.1 b/Documentation/nvme-wdc-clear-assert-dump.1 index 07917a08df..0336fa16fd 100644 --- a/Documentation/nvme-wdc-clear-assert-dump.1 +++ b/Documentation/nvme-wdc-clear-assert-dump.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-clear-assert-dump .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-CLEAR\-AS" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-CLEAR\-AS" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-clear-assert-dump.html b/Documentation/nvme-wdc-clear-assert-dump.html index e436bccf53..7a710143cd 100644 --- a/Documentation/nvme-wdc-clear-assert-dump.html +++ b/Documentation/nvme-wdc-clear-assert-dump.html @@ -798,7 +798,7 @@

NVME

diff --git a/Documentation/nvme-wdc-clear-fw-activate-history.1 b/Documentation/nvme-wdc-clear-fw-activate-history.1 index 906d43f92c..b567ccee3a 100644 --- a/Documentation/nvme-wdc-clear-fw-activate-history.1 +++ b/Documentation/nvme-wdc-clear-fw-activate-history.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-clear-fw-activate-history .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-CLEAR\-FW" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-CLEAR\-FW" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-clear-fw-activate-history.html b/Documentation/nvme-wdc-clear-fw-activate-history.html index fcc0f6192e..ae4dcb272a 100644 --- a/Documentation/nvme-wdc-clear-fw-activate-history.html +++ b/Documentation/nvme-wdc-clear-fw-activate-history.html @@ -797,7 +797,7 @@

NVME

diff --git a/Documentation/nvme-wdc-clear-pcie-correctable-errors.1 b/Documentation/nvme-wdc-clear-pcie-correctable-errors.1 index 29443262f4..37a74e829b 100644 --- a/Documentation/nvme-wdc-clear-pcie-correctable-errors.1 +++ b/Documentation/nvme-wdc-clear-pcie-correctable-errors.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-clear-pcie-correctable-errors .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-CLEAR\-PC" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-CLEAR\-PC" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-clear-pcie-correctable-errors.html b/Documentation/nvme-wdc-clear-pcie-correctable-errors.html index 5a3ee58a02..3a7d1b6795 100644 --- a/Documentation/nvme-wdc-clear-pcie-correctable-errors.html +++ b/Documentation/nvme-wdc-clear-pcie-correctable-errors.html @@ -799,7 +799,7 @@

NVME

diff --git a/Documentation/nvme-wdc-cloud-SSD-plugin-version.1 b/Documentation/nvme-wdc-cloud-SSD-plugin-version.1 index 18752d0a45..f1e6067c6e 100644 --- a/Documentation/nvme-wdc-cloud-SSD-plugin-version.1 +++ b/Documentation/nvme-wdc-cloud-SSD-plugin-version.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-cloud-SSD-plugin-version .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-CLOUD\-SS" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-CLOUD\-SS" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-cloud-SSD-plugin-version.html b/Documentation/nvme-wdc-cloud-SSD-plugin-version.html index f8084aa2a8..d643452ad7 100644 --- a/Documentation/nvme-wdc-cloud-SSD-plugin-version.html +++ b/Documentation/nvme-wdc-cloud-SSD-plugin-version.html @@ -790,7 +790,7 @@

NVME

diff --git a/Documentation/nvme-wdc-cloud-boot-SSD-version.1 b/Documentation/nvme-wdc-cloud-boot-SSD-version.1 index c8f506b2f7..a79cda63c5 100644 --- a/Documentation/nvme-wdc-cloud-boot-SSD-version.1 +++ b/Documentation/nvme-wdc-cloud-boot-SSD-version.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-cloud-boot-SSD-version .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-CLOUD\-BO" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-CLOUD\-BO" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-cloud-boot-SSD-version.html b/Documentation/nvme-wdc-cloud-boot-SSD-version.html index 5633d020d7..8c1353ce21 100644 --- a/Documentation/nvme-wdc-cloud-boot-SSD-version.html +++ b/Documentation/nvme-wdc-cloud-boot-SSD-version.html @@ -790,7 +790,7 @@

NVME

diff --git a/Documentation/nvme-wdc-drive-essentials.1 b/Documentation/nvme-wdc-drive-essentials.1 index 4f66c4e86b..75ee8f9506 100644 --- a/Documentation/nvme-wdc-drive-essentials.1 +++ b/Documentation/nvme-wdc-drive-essentials.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-drive-essentials .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-DRIVE\-ES" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-DRIVE\-ES" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-drive-essentials.html b/Documentation/nvme-wdc-drive-essentials.html index 18e384425e..daa486de8b 100644 --- a/Documentation/nvme-wdc-drive-essentials.html +++ b/Documentation/nvme-wdc-drive-essentials.html @@ -822,7 +822,7 @@

NVME

diff --git a/Documentation/nvme-wdc-drive-log.1 b/Documentation/nvme-wdc-drive-log.1 index f92e9f76ab..0c3cd20c5d 100644 --- a/Documentation/nvme-wdc-drive-log.1 +++ b/Documentation/nvme-wdc-drive-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-drive-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-DRIVE\-LO" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-DRIVE\-LO" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-drive-log.html b/Documentation/nvme-wdc-drive-log.html index 57fe1dedbe..a0c0847a83 100644 --- a/Documentation/nvme-wdc-drive-log.html +++ b/Documentation/nvme-wdc-drive-log.html @@ -829,7 +829,7 @@

NVME

diff --git a/Documentation/nvme-wdc-drive-resize.1 b/Documentation/nvme-wdc-drive-resize.1 index 9e6f46b8ad..779a7842e7 100644 --- a/Documentation/nvme-wdc-drive-resize.1 +++ b/Documentation/nvme-wdc-drive-resize.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-drive-resize .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-DRIVE\-RE" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-DRIVE\-RE" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-drive-resize.html b/Documentation/nvme-wdc-drive-resize.html index 5915777eb6..cc776764ef 100644 --- a/Documentation/nvme-wdc-drive-resize.html +++ b/Documentation/nvme-wdc-drive-resize.html @@ -810,7 +810,7 @@

NVME

diff --git a/Documentation/nvme-wdc-enc-get-log.1 b/Documentation/nvme-wdc-enc-get-log.1 index 6de5dd733d..b6f62640c6 100644 --- a/Documentation/nvme-wdc-enc-get-log.1 +++ b/Documentation/nvme-wdc-enc-get-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-enc-get-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-ENC\-GET\" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-ENC\-GET\" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-enc-get-log.html b/Documentation/nvme-wdc-enc-get-log.html index d04d8a5037..8321216db2 100644 --- a/Documentation/nvme-wdc-enc-get-log.html +++ b/Documentation/nvme-wdc-enc-get-log.html @@ -837,7 +837,7 @@

NVME

diff --git a/Documentation/nvme-wdc-get-crash-dump.1 b/Documentation/nvme-wdc-get-crash-dump.1 index a6e7cf8e84..b212e486aa 100644 --- a/Documentation/nvme-wdc-get-crash-dump.1 +++ b/Documentation/nvme-wdc-get-crash-dump.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-get-crash-dump .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-GET\-CRAS" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-GET\-CRAS" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-get-crash-dump.html b/Documentation/nvme-wdc-get-crash-dump.html index 2516997400..846af69568 100644 --- a/Documentation/nvme-wdc-get-crash-dump.html +++ b/Documentation/nvme-wdc-get-crash-dump.html @@ -830,7 +830,7 @@

NVME

diff --git a/Documentation/nvme-wdc-get-dev-capabilities-log.1 b/Documentation/nvme-wdc-get-dev-capabilities-log.1 index ea4d9c6772..a173c696ea 100644 --- a/Documentation/nvme-wdc-get-dev-capabilities-log.1 +++ b/Documentation/nvme-wdc-get-dev-capabilities-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-get-dev-capabilities-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-GET\-DEV\" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-GET\-DEV\" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-get-dev-capabilities-log.html b/Documentation/nvme-wdc-get-dev-capabilities-log.html index c391d2dbf2..268f2b7798 100644 --- a/Documentation/nvme-wdc-get-dev-capabilities-log.html +++ b/Documentation/nvme-wdc-get-dev-capabilities-log.html @@ -815,7 +815,7 @@

NVME

diff --git a/Documentation/nvme-wdc-get-drive-status.1 b/Documentation/nvme-wdc-get-drive-status.1 index 32e82f5914..8c6cc7b0af 100644 --- a/Documentation/nvme-wdc-get-drive-status.1 +++ b/Documentation/nvme-wdc-get-drive-status.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-get-drive-status .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-GET\-DRIV" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-GET\-DRIV" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-get-drive-status.html b/Documentation/nvme-wdc-get-drive-status.html index 529a4080f4..7e5cb2d534 100644 --- a/Documentation/nvme-wdc-get-drive-status.html +++ b/Documentation/nvme-wdc-get-drive-status.html @@ -836,7 +836,7 @@

NVME

diff --git a/Documentation/nvme-wdc-get-error-recovery-log.1 b/Documentation/nvme-wdc-get-error-recovery-log.1 index 6cd0acb655..e63b54b809 100644 --- a/Documentation/nvme-wdc-get-error-recovery-log.1 +++ b/Documentation/nvme-wdc-get-error-recovery-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-get-error-recovery-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-GET\-ERRO" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-GET\-ERRO" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-get-error-recovery-log.html b/Documentation/nvme-wdc-get-error-recovery-log.html index 719bbee15e..5847029608 100644 --- a/Documentation/nvme-wdc-get-error-recovery-log.html +++ b/Documentation/nvme-wdc-get-error-recovery-log.html @@ -816,7 +816,7 @@

NVME

diff --git a/Documentation/nvme-wdc-get-latency-monitor-log.1 b/Documentation/nvme-wdc-get-latency-monitor-log.1 index c3c3014c4e..1857abc441 100644 --- a/Documentation/nvme-wdc-get-latency-monitor-log.1 +++ b/Documentation/nvme-wdc-get-latency-monitor-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-get-latency-monitor-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-GET\-LATE" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-GET\-LATE" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-get-latency-monitor-log.html b/Documentation/nvme-wdc-get-latency-monitor-log.html index e0f6101b2f..b53ce05c31 100644 --- a/Documentation/nvme-wdc-get-latency-monitor-log.html +++ b/Documentation/nvme-wdc-get-latency-monitor-log.html @@ -810,7 +810,7 @@

NVME

diff --git a/Documentation/nvme-wdc-get-pfail-dump.1 b/Documentation/nvme-wdc-get-pfail-dump.1 index aaeb42968e..0ebab5e269 100644 --- a/Documentation/nvme-wdc-get-pfail-dump.1 +++ b/Documentation/nvme-wdc-get-pfail-dump.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-get-pfail-dump .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-GET\-PFAI" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-GET\-PFAI" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-get-pfail-dump.html b/Documentation/nvme-wdc-get-pfail-dump.html index 4b08016c92..d25e6aaee6 100644 --- a/Documentation/nvme-wdc-get-pfail-dump.html +++ b/Documentation/nvme-wdc-get-pfail-dump.html @@ -832,7 +832,7 @@

NVME

diff --git a/Documentation/nvme-wdc-get-unsupported-reqs-log.1 b/Documentation/nvme-wdc-get-unsupported-reqs-log.1 index 462f025c9f..fd22bf661d 100644 --- a/Documentation/nvme-wdc-get-unsupported-reqs-log.1 +++ b/Documentation/nvme-wdc-get-unsupported-reqs-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-get-unsupported-reqs-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-GET\-UNSU" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-GET\-UNSU" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-get-unsupported-reqs-log.html b/Documentation/nvme-wdc-get-unsupported-reqs-log.html index 8aa5aabe03..6517bacc70 100644 --- a/Documentation/nvme-wdc-get-unsupported-reqs-log.html +++ b/Documentation/nvme-wdc-get-unsupported-reqs-log.html @@ -816,7 +816,7 @@

NVME

diff --git a/Documentation/nvme-wdc-id-ctrl.1 b/Documentation/nvme-wdc-id-ctrl.1 index e7e7d4291d..3783e7cc84 100644 --- a/Documentation/nvme-wdc-id-ctrl.1 +++ b/Documentation/nvme-wdc-id-ctrl.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-id-ctrl .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-ID\-CTRL" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-ID\-CTRL" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-id-ctrl.html b/Documentation/nvme-wdc-id-ctrl.html index 375e2c4a9b..be7235fdd1 100644 --- a/Documentation/nvme-wdc-id-ctrl.html +++ b/Documentation/nvme-wdc-id-ctrl.html @@ -856,7 +856,7 @@

NVME

diff --git a/Documentation/nvme-wdc-log-page-directory.1 b/Documentation/nvme-wdc-log-page-directory.1 index adf4078111..759cdd2478 100644 --- a/Documentation/nvme-wdc-log-page-directory.1 +++ b/Documentation/nvme-wdc-log-page-directory.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-log-page-directory .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-LOG\-PAGE" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-LOG\-PAGE" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-log-page-directory.html b/Documentation/nvme-wdc-log-page-directory.html index 96beb3db61..9207935a5e 100644 --- a/Documentation/nvme-wdc-log-page-directory.html +++ b/Documentation/nvme-wdc-log-page-directory.html @@ -812,7 +812,7 @@

NVME

diff --git a/Documentation/nvme-wdc-namespace-resize.1 b/Documentation/nvme-wdc-namespace-resize.1 index f78a96a370..1437a803c0 100644 --- a/Documentation/nvme-wdc-namespace-resize.1 +++ b/Documentation/nvme-wdc-namespace-resize.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-namespace-resize .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-NAMESPACE" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-NAMESPACE" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-namespace-resize.html b/Documentation/nvme-wdc-namespace-resize.html index cc38baa808..4831d2490b 100644 --- a/Documentation/nvme-wdc-namespace-resize.html +++ b/Documentation/nvme-wdc-namespace-resize.html @@ -836,7 +836,7 @@

NVME

diff --git a/Documentation/nvme-wdc-purge-monitor.1 b/Documentation/nvme-wdc-purge-monitor.1 index 253d3c9e92..37aaf3927a 100644 --- a/Documentation/nvme-wdc-purge-monitor.1 +++ b/Documentation/nvme-wdc-purge-monitor.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-purge-monitor .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-PURGE\-MO" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-PURGE\-MO" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-purge-monitor.html b/Documentation/nvme-wdc-purge-monitor.html index a64dc22165..52ce11752e 100644 --- a/Documentation/nvme-wdc-purge-monitor.html +++ b/Documentation/nvme-wdc-purge-monitor.html @@ -837,7 +837,7 @@

NVME

diff --git a/Documentation/nvme-wdc-purge.1 b/Documentation/nvme-wdc-purge.1 index d007fa3587..878ee9bf9b 100644 --- a/Documentation/nvme-wdc-purge.1 +++ b/Documentation/nvme-wdc-purge.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-purge .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-PURGE" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-PURGE" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-purge.html b/Documentation/nvme-wdc-purge.html index 433fd3b427..fc2b3622ee 100644 --- a/Documentation/nvme-wdc-purge.html +++ b/Documentation/nvme-wdc-purge.html @@ -799,7 +799,7 @@

NVME

diff --git a/Documentation/nvme-wdc-vs-cloud-log.1 b/Documentation/nvme-wdc-vs-cloud-log.1 index 5cde88f15a..fd14a1a2aa 100644 --- a/Documentation/nvme-wdc-vs-cloud-log.1 +++ b/Documentation/nvme-wdc-vs-cloud-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-vs-cloud-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-VS\-CLOUD" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-VS\-CLOUD" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-vs-cloud-log.html b/Documentation/nvme-wdc-vs-cloud-log.html index 75aa3e36d0..aa05c49090 100644 --- a/Documentation/nvme-wdc-vs-cloud-log.html +++ b/Documentation/nvme-wdc-vs-cloud-log.html @@ -828,7 +828,7 @@

NVME

diff --git a/Documentation/nvme-wdc-vs-device-waf.1 b/Documentation/nvme-wdc-vs-device-waf.1 index 372d4d883f..8fcfaebf65 100644 --- a/Documentation/nvme-wdc-vs-device-waf.1 +++ b/Documentation/nvme-wdc-vs-device-waf.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-vs-device-waf .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-VS\-DEVIC" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-VS\-DEVIC" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-vs-device-waf.html b/Documentation/nvme-wdc-vs-device-waf.html index a882eaa73d..97ede06cf3 100644 --- a/Documentation/nvme-wdc-vs-device-waf.html +++ b/Documentation/nvme-wdc-vs-device-waf.html @@ -828,7 +828,7 @@

NVME

diff --git a/Documentation/nvme-wdc-vs-drive-info.1 b/Documentation/nvme-wdc-vs-drive-info.1 index 583ca236e4..2cf6a463e7 100644 --- a/Documentation/nvme-wdc-vs-drive-info.1 +++ b/Documentation/nvme-wdc-vs-drive-info.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-vs-drive-info .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-VS\-DRIVE" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-VS\-DRIVE" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-vs-drive-info.html b/Documentation/nvme-wdc-vs-drive-info.html index 08f19180b6..134ae52fe0 100644 --- a/Documentation/nvme-wdc-vs-drive-info.html +++ b/Documentation/nvme-wdc-vs-drive-info.html @@ -795,7 +795,7 @@

NVME

diff --git a/Documentation/nvme-wdc-vs-error-reason-identifier.1 b/Documentation/nvme-wdc-vs-error-reason-identifier.1 index ba6fe3b89a..d29eb26d88 100644 --- a/Documentation/nvme-wdc-vs-error-reason-identifier.1 +++ b/Documentation/nvme-wdc-vs-error-reason-identifier.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-vs-error-reason-identifier .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-VS\-ERROR" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-VS\-ERROR" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-vs-error-reason-identifier.html b/Documentation/nvme-wdc-vs-error-reason-identifier.html index 606ab4efc6..caca97eda5 100644 --- a/Documentation/nvme-wdc-vs-error-reason-identifier.html +++ b/Documentation/nvme-wdc-vs-error-reason-identifier.html @@ -836,7 +836,7 @@

NVME

diff --git a/Documentation/nvme-wdc-vs-fw-activate-history.1 b/Documentation/nvme-wdc-vs-fw-activate-history.1 index d904117be9..36ca07b38f 100644 --- a/Documentation/nvme-wdc-vs-fw-activate-history.1 +++ b/Documentation/nvme-wdc-vs-fw-activate-history.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-vs-fw-activate-history .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-VS\-FW\-A" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-VS\-FW\-A" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-vs-fw-activate-history.html b/Documentation/nvme-wdc-vs-fw-activate-history.html index 4b133ce20e..55a1ee4155 100644 --- a/Documentation/nvme-wdc-vs-fw-activate-history.html +++ b/Documentation/nvme-wdc-vs-fw-activate-history.html @@ -868,7 +868,7 @@

NVME

diff --git a/Documentation/nvme-wdc-vs-hw-rev-log.1 b/Documentation/nvme-wdc-vs-hw-rev-log.1 index dd7cdf5301..f345e14cc2 100644 --- a/Documentation/nvme-wdc-vs-hw-rev-log.1 +++ b/Documentation/nvme-wdc-vs-hw-rev-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-vs-hw-rev-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-VS\-HW\-R" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-VS\-HW\-R" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-vs-hw-rev-log.html b/Documentation/nvme-wdc-vs-hw-rev-log.html index f46d71fdd2..7a4e501468 100644 --- a/Documentation/nvme-wdc-vs-hw-rev-log.html +++ b/Documentation/nvme-wdc-vs-hw-rev-log.html @@ -827,7 +827,7 @@

NVME

diff --git a/Documentation/nvme-wdc-vs-internal-log.1 b/Documentation/nvme-wdc-vs-internal-log.1 index feb27489f9..0c38521df2 100644 --- a/Documentation/nvme-wdc-vs-internal-log.1 +++ b/Documentation/nvme-wdc-vs-internal-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-vs-internal-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-VS\-INTER" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-VS\-INTER" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-vs-internal-log.html b/Documentation/nvme-wdc-vs-internal-log.html index 12c387e9db..312486a734 100644 --- a/Documentation/nvme-wdc-vs-internal-log.html +++ b/Documentation/nvme-wdc-vs-internal-log.html @@ -958,7 +958,7 @@

NVME

diff --git a/Documentation/nvme-wdc-vs-nand-stats.1 b/Documentation/nvme-wdc-vs-nand-stats.1 index 6c6a17b38e..f9dd70f8c0 100644 --- a/Documentation/nvme-wdc-vs-nand-stats.1 +++ b/Documentation/nvme-wdc-vs-nand-stats.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-vs-nand-stats .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-VS\-NAND\" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-VS\-NAND\" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-vs-nand-stats.html b/Documentation/nvme-wdc-vs-nand-stats.html index 498bf22a67..3056c169dc 100644 --- a/Documentation/nvme-wdc-vs-nand-stats.html +++ b/Documentation/nvme-wdc-vs-nand-stats.html @@ -814,7 +814,7 @@

NVME

diff --git a/Documentation/nvme-wdc-vs-smart-add-log.1 b/Documentation/nvme-wdc-vs-smart-add-log.1 index 57d15b9929..49ec60113d 100644 --- a/Documentation/nvme-wdc-vs-smart-add-log.1 +++ b/Documentation/nvme-wdc-vs-smart-add-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-vs-smart-add-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-VS\-SMART" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-VS\-SMART" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-vs-smart-add-log.html b/Documentation/nvme-wdc-vs-smart-add-log.html index 1d720af7f2..cc410fedeb 100644 --- a/Documentation/nvme-wdc-vs-smart-add-log.html +++ b/Documentation/nvme-wdc-vs-smart-add-log.html @@ -928,7 +928,7 @@

NVME

diff --git a/Documentation/nvme-wdc-vs-telemetry-controller-option.1 b/Documentation/nvme-wdc-vs-telemetry-controller-option.1 index 6aad2f9008..d3e0ec2d22 100644 --- a/Documentation/nvme-wdc-vs-telemetry-controller-option.1 +++ b/Documentation/nvme-wdc-vs-telemetry-controller-option.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-vs-telemetry-controller-option .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-VS\-TELEM" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-VS\-TELEM" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-vs-telemetry-controller-option.html b/Documentation/nvme-wdc-vs-telemetry-controller-option.html index e9ddca1924..baf4a22ea6 100644 --- a/Documentation/nvme-wdc-vs-telemetry-controller-option.html +++ b/Documentation/nvme-wdc-vs-telemetry-controller-option.html @@ -855,7 +855,7 @@

NVME

diff --git a/Documentation/nvme-wdc-vs-temperature-stats.1 b/Documentation/nvme-wdc-vs-temperature-stats.1 index b7131d914a..a928d0c67a 100644 --- a/Documentation/nvme-wdc-vs-temperature-stats.1 +++ b/Documentation/nvme-wdc-vs-temperature-stats.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-vs-temperature-stats .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-VS\-TEMPE" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-VS\-TEMPE" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-vs-temperature-stats.html b/Documentation/nvme-wdc-vs-temperature-stats.html index b075ca09c9..27b83d17c5 100644 --- a/Documentation/nvme-wdc-vs-temperature-stats.html +++ b/Documentation/nvme-wdc-vs-temperature-stats.html @@ -857,7 +857,7 @@

NVME

diff --git a/Documentation/nvme-write-uncor.1 b/Documentation/nvme-write-uncor.1 index 3475367f14..014ff82d44 100644 --- a/Documentation/nvme-write-uncor.1 +++ b/Documentation/nvme-write-uncor.1 @@ -2,12 +2,12 @@ .\" Title: nvme-uncor .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-UNCOR" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-UNCOR" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -38,6 +38,7 @@ nvme-write-uncor \- Send an NVMe write uncorrectable command, return results [\-\-dir\-type= | \-T ] [\-\-dir\-spec= | \-S ] [\-\-output\-format= | \-o ] [\-\-verbose | \-v] + [\-\-timeout= | \-t ] .fi .SH "DESCRIPTION" .sp @@ -82,6 +83,11 @@ or .RS 4 Increase the information detail in the output\&. .RE +.PP +\-t , \-\-timeout= +.RS 4 +Override default timeout value\&. In milliseconds\&. +.RE .SH "EXAMPLES" .sp No examples yet\&. diff --git a/Documentation/nvme-write-uncor.html b/Documentation/nvme-write-uncor.html index 96cb97a6df..1d6d2594ea 100644 --- a/Documentation/nvme-write-uncor.html +++ b/Documentation/nvme-write-uncor.html @@ -754,7 +754,8 @@

SYNOPSIS

[--namespace-id=<nsid> | -n <nsid>] [--dir-type=<dtype> | -T <dtype>] [--dir-spec=<dspec> | -S <dspec>] - [--output-format=<fmt> | -o <fmt>] [--verbose | -v] + [--output-format=<fmt> | -o <fmt>] [--verbose | -v] + [--timeout=<timeout> | -t <timeout>]
@@ -848,6 +849,17 @@

OPTIONS

Increase the information detail in the output.

+
+-t <timeout> +
+
+--timeout=<timeout> +
+
+

+ Override default timeout value. In milliseconds. +

+
@@ -868,7 +880,7 @@

NVME

diff --git a/Documentation/nvme-write-zeroes.1 b/Documentation/nvme-write-zeroes.1 index b210cae0ea..90e561d8e9 100644 --- a/Documentation/nvme-write-zeroes.1 +++ b/Documentation/nvme-write-zeroes.1 @@ -2,12 +2,12 @@ .\" Title: nvme-write-zeroes .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WRITE\-ZEROES" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WRITE\-ZEROES" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -45,6 +45,7 @@ nvme-write-zeroes \- Send an NVMe write zeroes command, return results [\-\-dir\-type= | \-T ] [\-\-dir\-spec= | \-D ] [\-\-output\-format= | \-o ] [\-\-verbose | \-v] + [\-\-timeout= | \-t ] .fi .SH "DESCRIPTION" .sp @@ -174,6 +175,11 @@ or .RS 4 Increase the information detail in the output\&. .RE +.PP +\-t , \-\-timeout= +.RS 4 +Override default timeout value\&. In milliseconds\&. +.RE .SH "EXAMPLES" .sp No examples yet\&. diff --git a/Documentation/nvme-write-zeroes.html b/Documentation/nvme-write-zeroes.html index f8d21595b7..015438812c 100644 --- a/Documentation/nvme-write-zeroes.html +++ b/Documentation/nvme-write-zeroes.html @@ -761,7 +761,8 @@

SYNOPSIS

[--storage-tag-check<storage-tag-check> | -C <storage-tag-check>] [--dir-type=<dtype> | -T <dtype>] [--dir-spec=<dspec> | -D <dspec>] - [--output-format=<fmt> | -o <fmt>] [--verbose | -v] + [--output-format=<fmt> | -o <fmt>] [--verbose | -v] + [--timeout=<timeout> | -t <timeout>]
@@ -991,6 +992,17 @@

OPTIONS

Increase the information detail in the output.

+
+-t <timeout> +
+
+--timeout=<timeout> +
+
+

+ Override default timeout value. In milliseconds. +

+
@@ -1011,7 +1023,7 @@

NVME

diff --git a/Documentation/nvme-write.1 b/Documentation/nvme-write.1 index 88824a3a1d..383120e3c9 100644 --- a/Documentation/nvme-write.1 +++ b/Documentation/nvme-write.1 @@ -2,12 +2,12 @@ .\" Title: nvme-write .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WRITE" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WRITE" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -49,6 +49,7 @@ nvme-write \- Send an NVMe write command, provide results [\-\-storage\-tag | \-g ] [\-\-storage\-tag\-check | \-C] [\-\-force] [\-\-output\-format= | \-o ] [\-\-verbose | \-v] + [\-\-timeout=] .fi .SH "DESCRIPTION" .sp @@ -216,6 +217,11 @@ or .RS 4 Increase the information detail in the output\&. .RE +.PP +\-\-timeout= +.RS 4 +Override default timeout value\&. In milliseconds\&. +.RE .SH "EXAMPLES" .sp No examples yet\&. diff --git a/Documentation/nvme-write.html b/Documentation/nvme-write.html index a148b82f58..f6d9a07877 100644 --- a/Documentation/nvme-write.html +++ b/Documentation/nvme-write.html @@ -765,7 +765,8 @@

SYNOPSIS

[--show-command | -V] [--dry-run | -w] [--latency | -t] [--storage-tag<storage-tag> | -g <storage-tag>] [--storage-tag-check | -C] [--force] - [--output-format=<fmt> | -o <fmt>] [--verbose | -v] + [--output-format=<fmt> | -o <fmt>] [--verbose | -v] + [--timeout=<timeout>]
@@ -1089,6 +1090,14 @@

OPTIONS

Increase the information detail in the output.

+
+--timeout=<timeout> +
+
+

+ Override default timeout value. In milliseconds. +

+
@@ -1109,7 +1118,7 @@

NVME

diff --git a/Documentation/nvme-zns-changed-zone-list.1 b/Documentation/nvme-zns-changed-zone-list.1 index 12cb781e21..11d8c8704f 100644 --- a/Documentation/nvme-zns-changed-zone-list.1 +++ b/Documentation/nvme-zns-changed-zone-list.1 @@ -2,12 +2,12 @@ .\" Title: nvme-zns-changed-zone-list .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ZNS\-CHANGED\-" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-ZNS\-CHANGED\-" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-zns-changed-zone-list.html b/Documentation/nvme-zns-changed-zone-list.html index 0f9b2b0491..3be8d05354 100644 --- a/Documentation/nvme-zns-changed-zone-list.html +++ b/Documentation/nvme-zns-changed-zone-list.html @@ -832,7 +832,7 @@

NVME

diff --git a/Documentation/nvme-zns-close-zone.1 b/Documentation/nvme-zns-close-zone.1 index 304b43ed84..a47a413e27 100644 --- a/Documentation/nvme-zns-close-zone.1 +++ b/Documentation/nvme-zns-close-zone.1 @@ -2,12 +2,12 @@ .\" Title: nvme-zns-close-zone .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ZNS\-CLOSE\-ZO" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-ZNS\-CLOSE\-ZO" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-zns-close-zone.html b/Documentation/nvme-zns-close-zone.html index 6c31f89e98..acc4e494ae 100644 --- a/Documentation/nvme-zns-close-zone.html +++ b/Documentation/nvme-zns-close-zone.html @@ -846,7 +846,7 @@

NVME

diff --git a/Documentation/nvme-zns-finish-zone.1 b/Documentation/nvme-zns-finish-zone.1 index a75a64d4f3..3ae99fe305 100644 --- a/Documentation/nvme-zns-finish-zone.1 +++ b/Documentation/nvme-zns-finish-zone.1 @@ -2,12 +2,12 @@ .\" Title: nvme-zns-finish-zone .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ZNS\-FINISH\-Z" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-ZNS\-FINISH\-Z" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-zns-finish-zone.html b/Documentation/nvme-zns-finish-zone.html index 4b454507e1..aef2d6f2de 100644 --- a/Documentation/nvme-zns-finish-zone.html +++ b/Documentation/nvme-zns-finish-zone.html @@ -847,7 +847,7 @@

NVME

diff --git a/Documentation/nvme-zns-id-ctrl.1 b/Documentation/nvme-zns-id-ctrl.1 index 2930fffae6..a4b22f2822 100644 --- a/Documentation/nvme-zns-id-ctrl.1 +++ b/Documentation/nvme-zns-id-ctrl.1 @@ -2,12 +2,12 @@ .\" Title: nvme-zns-id-ctrl .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ZNS\-ID\-CTRL" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-ZNS\-ID\-CTRL" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-zns-id-ctrl.html b/Documentation/nvme-zns-id-ctrl.html index 62de67456d..33c1fd3cae 100644 --- a/Documentation/nvme-zns-id-ctrl.html +++ b/Documentation/nvme-zns-id-ctrl.html @@ -821,7 +821,7 @@

NVME

diff --git a/Documentation/nvme-zns-id-ns.1 b/Documentation/nvme-zns-id-ns.1 index 778ddcb6ae..b943584152 100644 --- a/Documentation/nvme-zns-id-ns.1 +++ b/Documentation/nvme-zns-id-ns.1 @@ -2,12 +2,12 @@ .\" Title: nvme-zns-id-ns .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ZNS\-ID\-NS" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-ZNS\-ID\-NS" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-zns-id-ns.html b/Documentation/nvme-zns-id-ns.html index 2ed1566464..a8e23a54c7 100644 --- a/Documentation/nvme-zns-id-ns.html +++ b/Documentation/nvme-zns-id-ns.html @@ -846,7 +846,7 @@

NVME

diff --git a/Documentation/nvme-zns-offline-zone.1 b/Documentation/nvme-zns-offline-zone.1 index b994985c5c..56554b6b44 100644 --- a/Documentation/nvme-zns-offline-zone.1 +++ b/Documentation/nvme-zns-offline-zone.1 @@ -2,12 +2,12 @@ .\" Title: nvme-zns-offline-zone .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ZNS\-OFFLINE\-" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-ZNS\-OFFLINE\-" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-zns-offline-zone.html b/Documentation/nvme-zns-offline-zone.html index ffdd91f686..8b900ade95 100644 --- a/Documentation/nvme-zns-offline-zone.html +++ b/Documentation/nvme-zns-offline-zone.html @@ -846,7 +846,7 @@

NVME

diff --git a/Documentation/nvme-zns-open-zone.1 b/Documentation/nvme-zns-open-zone.1 index 3aa47a0bf3..1ff351f42f 100644 --- a/Documentation/nvme-zns-open-zone.1 +++ b/Documentation/nvme-zns-open-zone.1 @@ -2,12 +2,12 @@ .\" Title: nvme-zns-open-zone .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ZNS\-OPEN\-ZON" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-ZNS\-OPEN\-ZON" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-zns-open-zone.html b/Documentation/nvme-zns-open-zone.html index 79937f01f3..bd152bb27d 100644 --- a/Documentation/nvme-zns-open-zone.html +++ b/Documentation/nvme-zns-open-zone.html @@ -856,7 +856,7 @@

NVME

diff --git a/Documentation/nvme-zns-report-zones.1 b/Documentation/nvme-zns-report-zones.1 index 3567b092df..65cde3ceba 100644 --- a/Documentation/nvme-zns-report-zones.1 +++ b/Documentation/nvme-zns-report-zones.1 @@ -2,12 +2,12 @@ .\" Title: nvme-zns-report-zones .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ZNS\-REPORT\-Z" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-ZNS\-REPORT\-Z" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-zns-report-zones.html b/Documentation/nvme-zns-report-zones.html index 539635c192..a25af6548f 100644 --- a/Documentation/nvme-zns-report-zones.html +++ b/Documentation/nvme-zns-report-zones.html @@ -957,7 +957,7 @@

NVME

diff --git a/Documentation/nvme-zns-reset-zone.1 b/Documentation/nvme-zns-reset-zone.1 index c62ba0e42f..7031e3ad92 100644 --- a/Documentation/nvme-zns-reset-zone.1 +++ b/Documentation/nvme-zns-reset-zone.1 @@ -2,12 +2,12 @@ .\" Title: nvme-zns-reset-zone .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ZNS\-RESET\-ZO" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-ZNS\-RESET\-ZO" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-zns-reset-zone.html b/Documentation/nvme-zns-reset-zone.html index d67563f2fd..777eed63de 100644 --- a/Documentation/nvme-zns-reset-zone.html +++ b/Documentation/nvme-zns-reset-zone.html @@ -847,7 +847,7 @@

NVME

diff --git a/Documentation/nvme-zns-set-zone-desc.1 b/Documentation/nvme-zns-set-zone-desc.1 index 101d20f379..edb3e56c01 100644 --- a/Documentation/nvme-zns-set-zone-desc.1 +++ b/Documentation/nvme-zns-set-zone-desc.1 @@ -2,12 +2,12 @@ .\" Title: nvme-zns-set-zone-desc .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ZNS\-SET\-ZONE" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-ZNS\-SET\-ZONE" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-zns-set-zone-desc.html b/Documentation/nvme-zns-set-zone-desc.html index d79d1f2c9d..600f25883b 100644 --- a/Documentation/nvme-zns-set-zone-desc.html +++ b/Documentation/nvme-zns-set-zone-desc.html @@ -859,7 +859,7 @@

NVME

diff --git a/Documentation/nvme-zns-zone-append.1 b/Documentation/nvme-zns-zone-append.1 index affdcca3c9..9bd72babb3 100644 --- a/Documentation/nvme-zns-zone-append.1 +++ b/Documentation/nvme-zns-zone-append.1 @@ -2,12 +2,12 @@ .\" Title: nvme-zns-zone-append .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ZNS\-ZONE\-APP" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-ZNS\-ZONE\-APP" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-zns-zone-append.html b/Documentation/nvme-zns-zone-append.html index 2584091c75..d899b8e516 100644 --- a/Documentation/nvme-zns-zone-append.html +++ b/Documentation/nvme-zns-zone-append.html @@ -940,7 +940,7 @@

NVME

diff --git a/Documentation/nvme-zns-zone-mgmt-recv.1 b/Documentation/nvme-zns-zone-mgmt-recv.1 index 5e01783bb7..a2232be162 100644 --- a/Documentation/nvme-zns-zone-mgmt-recv.1 +++ b/Documentation/nvme-zns-zone-mgmt-recv.1 @@ -2,12 +2,12 @@ .\" Title: nvme-zns-zone-mgmt-recv .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ZNS\-ZONE\-MGM" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-ZNS\-ZONE\-MGM" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-zns-zone-mgmt-recv.html b/Documentation/nvme-zns-zone-mgmt-recv.html index a998b16374..13ae50d625 100644 --- a/Documentation/nvme-zns-zone-mgmt-recv.html +++ b/Documentation/nvme-zns-zone-mgmt-recv.html @@ -880,7 +880,7 @@

NVME

diff --git a/Documentation/nvme-zns-zone-mgmt-send.1 b/Documentation/nvme-zns-zone-mgmt-send.1 index d8d819e34f..b8d9e762a9 100644 --- a/Documentation/nvme-zns-zone-mgmt-send.1 +++ b/Documentation/nvme-zns-zone-mgmt-send.1 @@ -2,12 +2,12 @@ .\" Title: nvme-zns-zone-mgmt-send .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ZNS\-ZONE\-MGM" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME\-ZNS\-ZONE\-MGM" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-zns-zone-mgmt-send.html b/Documentation/nvme-zns-zone-mgmt-send.html index c679fdbbdb..bbeba229e7 100644 --- a/Documentation/nvme-zns-zone-mgmt-send.html +++ b/Documentation/nvme-zns-zone-mgmt-send.html @@ -914,7 +914,7 @@

NVME

diff --git a/Documentation/nvme.1 b/Documentation/nvme.1 index 9430ca2f2d..f3df1916b9 100644 --- a/Documentation/nvme.1 +++ b/Documentation/nvme.1 @@ -2,12 +2,12 @@ .\" Title: nvme .\" Author: [see the "Authors" section] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 05/03/2024 +.\" Date: 08/02/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME" "1" "05/03/2024" "NVMe" "NVMe Manual" +.TH "NVME" "1" "08/02/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -594,6 +594,11 @@ Retrieves NAND statistics Retrieves temperature information of given micron device .RE .PP +\fBnvme-ocp-internal-log\fR(1) +.RS 4 +Retrieves and parses OCP Telemetry DA1 and DA2 logs\&. +.RE +.PP \fBnvme-netapp-ontapdevices\fR(1) .RS 4 Display information about ONTAP devices diff --git a/Documentation/nvme.html b/Documentation/nvme.html index 1adcce524b..73c5acb903 100644 --- a/Documentation/nvme.html +++ b/Documentation/nvme.html @@ -1656,6 +1656,14 @@

Plugins/Vendor extension commands
+nvme-ocp-internal-log(1) +
+
+

+ Retrieves and parses OCP Telemetry DA1 and DA2 logs. +

+
+
nvme-netapp-ontapdevices(1)
@@ -2114,7 +2122,7 @@

NVME

From 7960a126c2cbada3c65aac1f3381539987cf54b1 Mon Sep 17 00:00:00 2001 From: Daniel Wagner Date: Fri, 2 Aug 2024 09:58:11 +0200 Subject: [PATCH 112/281] Release v2.10 Signed-off-by: Daniel Wagner --- meson.build | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/meson.build b/meson.build index a53fec24d6..af1835e937 100644 --- a/meson.build +++ b/meson.build @@ -4,7 +4,7 @@ project( 'nvme-cli', ['c'], meson_version: '>= 0.50.0', license: 'GPL-2.0-only', - version: '2.9.1', + version: '2.10', default_options: [ 'c_std=gnu99', 'buildtype=debugoptimized', @@ -48,7 +48,7 @@ conf.set('SYSCONFDIR', '"@0@"'.format(sysconfdir)) conf.set('RUNDIR', '"@0@"'.format(rundir)) # Check for libnvme availability -libnvme_dep = dependency('libnvme', version: '>=1.9', required: true, +libnvme_dep = dependency('libnvme', version: '>=1.10', required: true, fallback : ['libnvme', 'libnvme_dep']) libnvme_mi_dep = dependency('libnvme-mi', required: true, fallback : ['libnvme', 'libnvme_mi_dep']) From 4c1e89f14474efc01e41e9c45d2bfa8467b9c1e5 Mon Sep 17 00:00:00 2001 From: Daniel Wagner Date: Fri, 2 Aug 2024 11:46:49 +0200 Subject: [PATCH 113/281] docs: rename ocp-unsupported-req-log file The filename has to match the command name, thus rename the filename. Signed-off-by: Daniel Wagner --- Documentation/meson.build | 2 +- ...ted-reqs-log-pages.txt => nvme-ocp-unsupported-reqs-log.txt} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename Documentation/{nvme-ocp-unsupported-reqs-log-pages.txt => nvme-ocp-unsupported-reqs-log.txt} (100%) diff --git a/Documentation/meson.build b/Documentation/meson.build index 30c0efc418..1478134175 100644 --- a/Documentation/meson.build +++ b/Documentation/meson.build @@ -103,7 +103,7 @@ adoc_sources = [ 'nvme-ocp-set-telemetry-profile', 'nvme-ocp-smart-add-log', 'nvme-ocp-telemetry-string-log-page', - 'nvme-ocp-unsupported-reqs-log-pages', + 'nvme-ocp-unsupported-reqs-log', 'nvme-ocp-internal-log', 'nvme-persistent-event-log', 'nvme-pred-lat-event-agg-log', diff --git a/Documentation/nvme-ocp-unsupported-reqs-log-pages.txt b/Documentation/nvme-ocp-unsupported-reqs-log.txt similarity index 100% rename from Documentation/nvme-ocp-unsupported-reqs-log-pages.txt rename to Documentation/nvme-ocp-unsupported-reqs-log.txt From 9dd886a027a46b1166be4d415882643e04f3364f Mon Sep 17 00:00:00 2001 From: Daniel Wagner Date: Fri, 2 Aug 2024 13:08:13 +0200 Subject: [PATCH 114/281] build: add install step to doc CI build We had some fallouts which were happened at the install step when the documentation was build. Let's add this step, so we catch those errors in future. Signed-off-by: Daniel Wagner --- scripts/build.sh | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/scripts/build.sh b/scripts/build.sh index a88336fb90..1c2df5086d 100755 --- a/scripts/build.sh +++ b/scripts/build.sh @@ -123,6 +123,7 @@ config_meson_docs() { -Ddocs=all \ -Ddocs-build=true \ --force-fallback-for=libnvme \ + --prefix=/tmp/usr \ -Dlibnvme:werror=false \ "${BUILDDIR}" } @@ -154,7 +155,12 @@ test_meson_coverage() { } install_meson_appimage() { - "${MESON}" install \ + "${MESON}" install \ + -C "${BUILDDIR}" +} + +install_meson_docs() { + "${MESON}" install \ -C "${BUILDDIR}" } From 66df29f8d28d2a3c280cfb7838eaa79b825b408f Mon Sep 17 00:00:00 2001 From: Daniel Wagner Date: Mon, 5 Aug 2024 15:33:31 +0200 Subject: [PATCH 115/281] doc: Regenerate all docs for v2.10.1 Signed-off-by: Daniel Wagner --- Documentation/nvme-admin-passthru.1 | 4 +- Documentation/nvme-admin-passthru.html | 2 +- Documentation/nvme-ana-log.1 | 4 +- Documentation/nvme-ana-log.html | 2 +- Documentation/nvme-attach-ns.1 | 4 +- Documentation/nvme-attach-ns.html | 2 +- Documentation/nvme-boot-part-log.1 | 4 +- Documentation/nvme-boot-part-log.html | 2 +- Documentation/nvme-capacity-mgmt.1 | 4 +- Documentation/nvme-capacity-mgmt.html | 2 +- Documentation/nvme-changed-ns-list-log.1 | 4 +- Documentation/nvme-changed-ns-list-log.html | 2 +- Documentation/nvme-cmdset-ind-id-ns.1 | 4 +- Documentation/nvme-cmdset-ind-id-ns.html | 2 +- Documentation/nvme-compare.1 | 4 +- Documentation/nvme-compare.html | 2 +- Documentation/nvme-connect-all.1 | 4 +- Documentation/nvme-connect-all.html | 2 +- Documentation/nvme-connect.1 | 4 +- Documentation/nvme-connect.html | 2 +- Documentation/nvme-copy.1 | 4 +- Documentation/nvme-copy.html | 2 +- Documentation/nvme-create-ns.1 | 4 +- Documentation/nvme-create-ns.html | 2 +- Documentation/nvme-delete-ns.1 | 4 +- Documentation/nvme-delete-ns.html | 2 +- Documentation/nvme-dera-stat.1 | 4 +- Documentation/nvme-dera-stat.html | 2 +- Documentation/nvme-detach-ns.1 | 4 +- Documentation/nvme-detach-ns.html | 2 +- Documentation/nvme-device-self-test.1 | 4 +- Documentation/nvme-device-self-test.html | 2 +- Documentation/nvme-dim.1 | 4 +- Documentation/nvme-dim.html | 2 +- Documentation/nvme-dir-receive.1 | 4 +- Documentation/nvme-dir-receive.html | 2 +- Documentation/nvme-dir-send.1 | 4 +- Documentation/nvme-dir-send.html | 2 +- Documentation/nvme-disconnect-all.1 | 4 +- Documentation/nvme-disconnect-all.html | 2 +- Documentation/nvme-disconnect.1 | 4 +- Documentation/nvme-disconnect.html | 2 +- Documentation/nvme-discover.1 | 4 +- Documentation/nvme-discover.html | 2 +- Documentation/nvme-dsm.1 | 4 +- Documentation/nvme-dsm.html | 2 +- Documentation/nvme-effects-log.1 | 4 +- Documentation/nvme-effects-log.html | 2 +- Documentation/nvme-endurance-event-agg-log.1 | 4 +- .../nvme-endurance-event-agg-log.html | 2 +- Documentation/nvme-endurance-log.1 | 4 +- Documentation/nvme-endurance-log.html | 2 +- Documentation/nvme-error-log.1 | 4 +- Documentation/nvme-error-log.html | 2 +- Documentation/nvme-fdp-configs.1 | 4 +- Documentation/nvme-fdp-configs.html | 2 +- Documentation/nvme-fdp-events.1 | 4 +- Documentation/nvme-fdp-events.html | 2 +- Documentation/nvme-fdp-set-events.1 | 4 +- Documentation/nvme-fdp-set-events.html | 2 +- Documentation/nvme-fdp-stats.1 | 4 +- Documentation/nvme-fdp-stats.html | 2 +- Documentation/nvme-fdp-status.1 | 4 +- Documentation/nvme-fdp-status.html | 2 +- Documentation/nvme-fdp-update.1 | 4 +- Documentation/nvme-fdp-update.html | 2 +- Documentation/nvme-fdp-usage.1 | 4 +- Documentation/nvme-fdp-usage.html | 2 +- Documentation/nvme-fid-support-effects-log.1 | 4 +- .../nvme-fid-support-effects-log.html | 2 +- Documentation/nvme-flush.1 | 4 +- Documentation/nvme-flush.html | 2 +- Documentation/nvme-format.1 | 4 +- Documentation/nvme-format.html | 2 +- Documentation/nvme-fw-commit.1 | 4 +- Documentation/nvme-fw-commit.html | 2 +- Documentation/nvme-fw-download.1 | 4 +- Documentation/nvme-fw-download.html | 2 +- Documentation/nvme-fw-log.1 | 4 +- Documentation/nvme-fw-log.html | 2 +- Documentation/nvme-gen-hostnqn.1 | 4 +- Documentation/nvme-gen-hostnqn.html | 2 +- Documentation/nvme-get-feature.1 | 4 +- Documentation/nvme-get-feature.html | 2 +- Documentation/nvme-get-lba-status.1 | 4 +- Documentation/nvme-get-lba-status.html | 2 +- Documentation/nvme-get-log.1 | 4 +- Documentation/nvme-get-log.html | 2 +- Documentation/nvme-get-ns-id.1 | 4 +- Documentation/nvme-get-ns-id.html | 2 +- Documentation/nvme-get-property.1 | 4 +- Documentation/nvme-get-property.html | 2 +- Documentation/nvme-help.1 | 4 +- Documentation/nvme-help.html | 2 +- Documentation/nvme-huawei-id-ctrl.1 | 4 +- Documentation/nvme-huawei-id-ctrl.html | 2 +- Documentation/nvme-huawei-list.1 | 4 +- Documentation/nvme-huawei-list.html | 2 +- Documentation/nvme-id-ctrl.1 | 4 +- Documentation/nvme-id-ctrl.html | 2 +- Documentation/nvme-id-domain.1 | 4 +- Documentation/nvme-id-domain.html | 2 +- Documentation/nvme-id-iocs.1 | 4 +- Documentation/nvme-id-iocs.html | 2 +- Documentation/nvme-id-ns.1 | 4 +- Documentation/nvme-id-ns.html | 2 +- Documentation/nvme-id-nvmset.1 | 4 +- Documentation/nvme-id-nvmset.html | 2 +- Documentation/nvme-inspur-nvme-vendor-log.1 | 4 +- .../nvme-inspur-nvme-vendor-log.html | 2 +- Documentation/nvme-intel-id-ctrl.1 | 4 +- Documentation/nvme-intel-id-ctrl.html | 2 +- Documentation/nvme-intel-internal-log.1 | 4 +- Documentation/nvme-intel-internal-log.html | 2 +- Documentation/nvme-intel-lat-stats.1 | 4 +- Documentation/nvme-intel-lat-stats.html | 2 +- Documentation/nvme-intel-market-name.1 | 4 +- Documentation/nvme-intel-market-name.html | 2 +- Documentation/nvme-intel-smart-log-add.1 | 4 +- Documentation/nvme-intel-smart-log-add.html | 2 +- Documentation/nvme-intel-temp-stats.1 | 4 +- Documentation/nvme-intel-temp-stats.html | 2 +- Documentation/nvme-io-mgmt-recv.1 | 4 +- Documentation/nvme-io-mgmt-recv.html | 2 +- Documentation/nvme-io-mgmt-send.1 | 4 +- Documentation/nvme-io-mgmt-send.html | 2 +- Documentation/nvme-io-passthru.1 | 4 +- Documentation/nvme-io-passthru.html | 2 +- Documentation/nvme-lba-status-log.1 | 4 +- Documentation/nvme-lba-status-log.html | 2 +- Documentation/nvme-list-ctrl.1 | 4 +- Documentation/nvme-list-ctrl.html | 2 +- Documentation/nvme-list-endgrp.1 | 4 +- Documentation/nvme-list-endgrp.html | 2 +- Documentation/nvme-list-ns.1 | 4 +- Documentation/nvme-list-ns.html | 2 +- Documentation/nvme-list-subsys.1 | 4 +- Documentation/nvme-list-subsys.html | 2 +- Documentation/nvme-list.1 | 4 +- Documentation/nvme-list.html | 2 +- Documentation/nvme-lockdown.1 | 4 +- Documentation/nvme-lockdown.html | 2 +- .../nvme-mi-cmd-support-effects-log.1 | 4 +- .../nvme-mi-cmd-support-effects-log.html | 2 +- Documentation/nvme-micron-clear-pcie-errors.1 | 4 +- .../nvme-micron-clear-pcie-errors.html | 2 +- Documentation/nvme-micron-internal-log.1 | 4 +- Documentation/nvme-micron-internal-log.html | 2 +- Documentation/nvme-micron-nand-stats.1 | 4 +- Documentation/nvme-micron-nand-stats.html | 2 +- Documentation/nvme-micron-pcie-stats.1 | 4 +- Documentation/nvme-micron-pcie-stats.html | 2 +- .../nvme-micron-selective-download.1 | 4 +- .../nvme-micron-selective-download.html | 2 +- Documentation/nvme-micron-smart-add-log.1 | 4 +- Documentation/nvme-micron-smart-add-log.html | 2 +- Documentation/nvme-micron-temperature-stats.1 | 4 +- .../nvme-micron-temperature-stats.html | 2 +- Documentation/nvme-netapp-ontapdevices.1 | 4 +- Documentation/nvme-netapp-ontapdevices.html | 2 +- Documentation/nvme-netapp-smdevices.1 | 4 +- Documentation/nvme-netapp-smdevices.html | 2 +- Documentation/nvme-ns-descs.1 | 4 +- Documentation/nvme-ns-descs.html | 2 +- Documentation/nvme-ns-rescan.1 | 4 +- Documentation/nvme-ns-rescan.html | 2 +- Documentation/nvme-nvm-id-ctrl.1 | 4 +- Documentation/nvme-nvm-id-ctrl.html | 2 +- Documentation/nvme-nvme-mi-recv.1 | 4 +- Documentation/nvme-nvme-mi-recv.html | 2 +- Documentation/nvme-nvme-mi-send.1 | 4 +- Documentation/nvme-nvme-mi-send.html | 2 +- .../nvme-ocp-clear-fw-activate-history.1 | 4 +- .../nvme-ocp-clear-fw-activate-history.html | 2 +- ...cp-clear-pcie-correctable-error-counters.1 | 4 +- ...clear-pcie-correctable-error-counters.html | 2 +- .../nvme-ocp-device-capability-log.1 | 4 +- .../nvme-ocp-device-capability-log.html | 2 +- Documentation/nvme-ocp-eol-plp-failure-mode.1 | 4 +- .../nvme-ocp-eol-plp-failure-mode.html | 2 +- Documentation/nvme-ocp-error-recovery-log.1 | 4 +- .../nvme-ocp-error-recovery-log.html | 2 +- .../nvme-ocp-get-dssd-async-event-config.1 | 4 +- .../nvme-ocp-get-dssd-async-event-config.html | 2 +- .../nvme-ocp-get-dssd-power-state-feature.1 | 4 +- ...nvme-ocp-get-dssd-power-state-feature.html | 2 +- .../nvme-ocp-get-plp-health-check-interval.1 | 4 +- ...vme-ocp-get-plp-health-check-interval.html | 2 +- Documentation/nvme-ocp-internal-log.1 | 4 +- Documentation/nvme-ocp-internal-log.html | 2 +- Documentation/nvme-ocp-latency-monitor-log.1 | 4 +- .../nvme-ocp-latency-monitor-log.html | 2 +- .../nvme-ocp-set-dssd-async-event-config.1 | 4 +- .../nvme-ocp-set-dssd-async-event-config.html | 2 +- .../nvme-ocp-set-dssd-power-state-feature.1 | 4 +- ...nvme-ocp-set-dssd-power-state-feature.html | 2 +- .../nvme-ocp-set-plp-health-check-interval.1 | 4 +- ...vme-ocp-set-plp-health-check-interval.html | 2 +- .../nvme-ocp-set-telemetry-profile.1 | 4 +- .../nvme-ocp-set-telemetry-profile.html | 2 +- Documentation/nvme-ocp-smart-add-log.1 | 4 +- Documentation/nvme-ocp-smart-add-log.html | 2 +- .../nvme-ocp-telemetry-string-log-page.1 | 4 +- .../nvme-ocp-telemetry-string-log-page.html | 2 +- Documentation/nvme-ocp-unsupported-reqs-log.1 | 4 +- .../nvme-ocp-unsupported-reqs-log.html | 819 ++++++++++++++++++ Documentation/nvme-persistent-event-log.1 | 4 +- Documentation/nvme-persistent-event-log.html | 2 +- Documentation/nvme-pred-lat-event-agg-log.1 | 4 +- .../nvme-pred-lat-event-agg-log.html | 2 +- Documentation/nvme-predictable-lat-log.1 | 4 +- Documentation/nvme-predictable-lat-log.html | 2 +- Documentation/nvme-primary-ctrl-caps.1 | 4 +- Documentation/nvme-primary-ctrl-caps.html | 2 +- Documentation/nvme-read.1 | 4 +- Documentation/nvme-read.html | 2 +- Documentation/nvme-reset.1 | 4 +- Documentation/nvme-reset.html | 2 +- Documentation/nvme-resv-acquire.1 | 4 +- Documentation/nvme-resv-acquire.html | 2 +- Documentation/nvme-resv-notif-log.1 | 4 +- Documentation/nvme-resv-notif-log.html | 2 +- Documentation/nvme-resv-register.1 | 4 +- Documentation/nvme-resv-register.html | 2 +- Documentation/nvme-resv-release.1 | 4 +- Documentation/nvme-resv-release.html | 2 +- Documentation/nvme-resv-report.1 | 4 +- Documentation/nvme-resv-report.html | 2 +- Documentation/nvme-rpmb.1 | 4 +- Documentation/nvme-rpmb.html | 2 +- Documentation/nvme-sanitize-log.1 | 4 +- Documentation/nvme-sanitize-log.html | 2 +- Documentation/nvme-sanitize.1 | 4 +- Documentation/nvme-sanitize.html | 2 +- .../nvme-seagate-clear-fw-activate-history.1 | 4 +- ...vme-seagate-clear-fw-activate-history.html | 2 +- ...me-seagate-clear-pcie-correctable-errors.1 | 4 +- ...seagate-clear-pcie-correctable-errors.html | 2 +- .../nvme-seagate-cloud-SSD-plugin-version.1 | 4 +- ...nvme-seagate-cloud-SSD-plugin-version.html | 2 +- Documentation/nvme-seagate-get-ctrl-tele.1 | 4 +- Documentation/nvme-seagate-get-ctrl-tele.html | 2 +- Documentation/nvme-seagate-get-host-tele.1 | 4 +- Documentation/nvme-seagate-get-host-tele.html | 2 +- Documentation/nvme-seagate-help.1 | 4 +- Documentation/nvme-seagate-help.html | 2 +- Documentation/nvme-seagate-plugin-version.1 | 4 +- .../nvme-seagate-plugin-version.html | 2 +- Documentation/nvme-seagate-version.1 | 4 +- Documentation/nvme-seagate-version.html | 2 +- .../nvme-seagate-vs-fw-activate-history.1 | 4 +- .../nvme-seagate-vs-fw-activate-history.html | 2 +- Documentation/nvme-seagate-vs-internal-log.1 | 4 +- .../nvme-seagate-vs-internal-log.html | 2 +- Documentation/nvme-seagate-vs-log-page-sup.1 | 4 +- .../nvme-seagate-vs-log-page-sup.html | 2 +- Documentation/nvme-seagate-vs-pcie-stats.1 | 4 +- Documentation/nvme-seagate-vs-pcie-stats.html | 2 +- Documentation/nvme-seagate-vs-smart-add-log.1 | 4 +- .../nvme-seagate-vs-smart-add-log.html | 2 +- .../nvme-seagate-vs-temperature-stats.1 | 4 +- .../nvme-seagate-vs-temperature-stats.html | 2 +- Documentation/nvme-security-recv.1 | 4 +- Documentation/nvme-security-recv.html | 2 +- Documentation/nvme-security-send.1 | 4 +- Documentation/nvme-security-send.html | 2 +- Documentation/nvme-self-test-log.1 | 4 +- Documentation/nvme-self-test-log.html | 2 +- Documentation/nvme-set-feature.1 | 4 +- Documentation/nvme-set-feature.html | 2 +- Documentation/nvme-set-property.1 | 4 +- Documentation/nvme-set-property.html | 2 +- Documentation/nvme-show-hostnqn.1 | 4 +- Documentation/nvme-show-hostnqn.html | 2 +- Documentation/nvme-show-regs.1 | 4 +- Documentation/nvme-show-regs.html | 2 +- Documentation/nvme-show-topology.1 | 4 +- Documentation/nvme-show-topology.html | 2 +- Documentation/nvme-smart-log.1 | 4 +- Documentation/nvme-smart-log.html | 2 +- Documentation/nvme-subsystem-reset.1 | 4 +- Documentation/nvme-subsystem-reset.html | 2 +- Documentation/nvme-supported-log-pages.1 | 4 +- Documentation/nvme-supported-log-pages.html | 2 +- Documentation/nvme-telemetry-log.1 | 4 +- Documentation/nvme-telemetry-log.html | 2 +- Documentation/nvme-tls-key.1 | 4 +- Documentation/nvme-tls-key.html | 2 +- ...me-toshiba-clear-pcie-correctable-errors.1 | 4 +- ...toshiba-clear-pcie-correctable-errors.html | 2 +- Documentation/nvme-toshiba-vs-internal-log.1 | 4 +- .../nvme-toshiba-vs-internal-log.html | 2 +- Documentation/nvme-toshiba-vs-smart-add-log.1 | 4 +- .../nvme-toshiba-vs-smart-add-log.html | 2 +- Documentation/nvme-transcend-badblock.1 | 4 +- Documentation/nvme-transcend-badblock.html | 2 +- Documentation/nvme-transcend-healthvalue.1 | 4 +- Documentation/nvme-transcend-healthvalue.html | 2 +- Documentation/nvme-verify.1 | 4 +- Documentation/nvme-verify.html | 2 +- .../nvme-virtium-save-smart-to-vtview-log.1 | 4 +- ...nvme-virtium-save-smart-to-vtview-log.html | 2 +- Documentation/nvme-virtium-show-identify.1 | 4 +- Documentation/nvme-virtium-show-identify.html | 2 +- Documentation/nvme-wdc-cap-diag.1 | 4 +- Documentation/nvme-wdc-cap-diag.html | 2 +- Documentation/nvme-wdc-capabilities.1 | 4 +- Documentation/nvme-wdc-capabilities.html | 2 +- Documentation/nvme-wdc-clear-assert-dump.1 | 4 +- Documentation/nvme-wdc-clear-assert-dump.html | 2 +- .../nvme-wdc-clear-fw-activate-history.1 | 4 +- .../nvme-wdc-clear-fw-activate-history.html | 2 +- .../nvme-wdc-clear-pcie-correctable-errors.1 | 4 +- ...vme-wdc-clear-pcie-correctable-errors.html | 2 +- .../nvme-wdc-cloud-SSD-plugin-version.1 | 4 +- .../nvme-wdc-cloud-SSD-plugin-version.html | 2 +- .../nvme-wdc-cloud-boot-SSD-version.1 | 4 +- .../nvme-wdc-cloud-boot-SSD-version.html | 2 +- Documentation/nvme-wdc-drive-essentials.1 | 4 +- Documentation/nvme-wdc-drive-essentials.html | 2 +- Documentation/nvme-wdc-drive-log.1 | 4 +- Documentation/nvme-wdc-drive-log.html | 2 +- Documentation/nvme-wdc-drive-resize.1 | 4 +- Documentation/nvme-wdc-drive-resize.html | 2 +- Documentation/nvme-wdc-enc-get-log.1 | 4 +- Documentation/nvme-wdc-enc-get-log.html | 2 +- Documentation/nvme-wdc-get-crash-dump.1 | 4 +- Documentation/nvme-wdc-get-crash-dump.html | 2 +- .../nvme-wdc-get-dev-capabilities-log.1 | 4 +- .../nvme-wdc-get-dev-capabilities-log.html | 2 +- Documentation/nvme-wdc-get-drive-status.1 | 4 +- Documentation/nvme-wdc-get-drive-status.html | 2 +- .../nvme-wdc-get-error-recovery-log.1 | 4 +- .../nvme-wdc-get-error-recovery-log.html | 2 +- .../nvme-wdc-get-latency-monitor-log.1 | 4 +- .../nvme-wdc-get-latency-monitor-log.html | 2 +- Documentation/nvme-wdc-get-pfail-dump.1 | 4 +- Documentation/nvme-wdc-get-pfail-dump.html | 2 +- .../nvme-wdc-get-unsupported-reqs-log.1 | 4 +- .../nvme-wdc-get-unsupported-reqs-log.html | 2 +- Documentation/nvme-wdc-id-ctrl.1 | 4 +- Documentation/nvme-wdc-id-ctrl.html | 2 +- Documentation/nvme-wdc-log-page-directory.1 | 4 +- .../nvme-wdc-log-page-directory.html | 2 +- Documentation/nvme-wdc-namespace-resize.1 | 4 +- Documentation/nvme-wdc-namespace-resize.html | 2 +- Documentation/nvme-wdc-purge-monitor.1 | 4 +- Documentation/nvme-wdc-purge-monitor.html | 2 +- Documentation/nvme-wdc-purge.1 | 4 +- Documentation/nvme-wdc-purge.html | 2 +- Documentation/nvme-wdc-vs-cloud-log.1 | 4 +- Documentation/nvme-wdc-vs-cloud-log.html | 2 +- Documentation/nvme-wdc-vs-device-waf.1 | 4 +- Documentation/nvme-wdc-vs-device-waf.html | 2 +- Documentation/nvme-wdc-vs-drive-info.1 | 4 +- Documentation/nvme-wdc-vs-drive-info.html | 2 +- .../nvme-wdc-vs-error-reason-identifier.1 | 4 +- .../nvme-wdc-vs-error-reason-identifier.html | 2 +- .../nvme-wdc-vs-fw-activate-history.1 | 4 +- .../nvme-wdc-vs-fw-activate-history.html | 2 +- Documentation/nvme-wdc-vs-hw-rev-log.1 | 4 +- Documentation/nvme-wdc-vs-hw-rev-log.html | 2 +- Documentation/nvme-wdc-vs-internal-log.1 | 4 +- Documentation/nvme-wdc-vs-internal-log.html | 2 +- Documentation/nvme-wdc-vs-nand-stats.1 | 4 +- Documentation/nvme-wdc-vs-nand-stats.html | 2 +- Documentation/nvme-wdc-vs-smart-add-log.1 | 4 +- Documentation/nvme-wdc-vs-smart-add-log.html | 2 +- .../nvme-wdc-vs-telemetry-controller-option.1 | 4 +- ...me-wdc-vs-telemetry-controller-option.html | 2 +- Documentation/nvme-wdc-vs-temperature-stats.1 | 4 +- .../nvme-wdc-vs-temperature-stats.html | 2 +- Documentation/nvme-write-uncor.1 | 4 +- Documentation/nvme-write-uncor.html | 2 +- Documentation/nvme-write-zeroes.1 | 4 +- Documentation/nvme-write-zeroes.html | 2 +- Documentation/nvme-write.1 | 4 +- Documentation/nvme-write.html | 2 +- Documentation/nvme-zns-changed-zone-list.1 | 4 +- Documentation/nvme-zns-changed-zone-list.html | 2 +- Documentation/nvme-zns-close-zone.1 | 4 +- Documentation/nvme-zns-close-zone.html | 2 +- Documentation/nvme-zns-finish-zone.1 | 4 +- Documentation/nvme-zns-finish-zone.html | 2 +- Documentation/nvme-zns-id-ctrl.1 | 4 +- Documentation/nvme-zns-id-ctrl.html | 2 +- Documentation/nvme-zns-id-ns.1 | 4 +- Documentation/nvme-zns-id-ns.html | 2 +- Documentation/nvme-zns-offline-zone.1 | 4 +- Documentation/nvme-zns-offline-zone.html | 2 +- Documentation/nvme-zns-open-zone.1 | 4 +- Documentation/nvme-zns-open-zone.html | 2 +- Documentation/nvme-zns-report-zones.1 | 4 +- Documentation/nvme-zns-report-zones.html | 2 +- Documentation/nvme-zns-reset-zone.1 | 4 +- Documentation/nvme-zns-reset-zone.html | 2 +- Documentation/nvme-zns-set-zone-desc.1 | 4 +- Documentation/nvme-zns-set-zone-desc.html | 2 +- Documentation/nvme-zns-zone-append.1 | 4 +- Documentation/nvme-zns-zone-append.html | 2 +- Documentation/nvme-zns-zone-mgmt-recv.1 | 4 +- Documentation/nvme-zns-zone-mgmt-recv.html | 2 +- Documentation/nvme-zns-zone-mgmt-send.1 | 4 +- Documentation/nvme-zns-zone-mgmt-send.html | 2 +- Documentation/nvme.1 | 4 +- Documentation/nvme.html | 2 +- 406 files changed, 1427 insertions(+), 608 deletions(-) create mode 100644 Documentation/nvme-ocp-unsupported-reqs-log.html diff --git a/Documentation/nvme-admin-passthru.1 b/Documentation/nvme-admin-passthru.1 index ca80f9f9fc..a1d33c67c0 100644 --- a/Documentation/nvme-admin-passthru.1 +++ b/Documentation/nvme-admin-passthru.1 @@ -2,12 +2,12 @@ .\" Title: nvme-admin-passthru .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ADMIN\-PASSTHR" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-ADMIN\-PASSTHR" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-admin-passthru.html b/Documentation/nvme-admin-passthru.html index d3a69d6ac9..dbef97963a 100644 --- a/Documentation/nvme-admin-passthru.html +++ b/Documentation/nvme-admin-passthru.html @@ -1038,7 +1038,7 @@

NVME

diff --git a/Documentation/nvme-ana-log.1 b/Documentation/nvme-ana-log.1 index db1c41d1ba..6223dea548 100644 --- a/Documentation/nvme-ana-log.1 +++ b/Documentation/nvme-ana-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-ana-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ANA\-LOG" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-ANA\-LOG" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-ana-log.html b/Documentation/nvme-ana-log.html index 9e58b7cdb0..62021e8ff8 100644 --- a/Documentation/nvme-ana-log.html +++ b/Documentation/nvme-ana-log.html @@ -835,7 +835,7 @@

NVME

diff --git a/Documentation/nvme-attach-ns.1 b/Documentation/nvme-attach-ns.1 index 3312fb5855..8efbc987a4 100644 --- a/Documentation/nvme-attach-ns.1 +++ b/Documentation/nvme-attach-ns.1 @@ -2,12 +2,12 @@ .\" Title: nvme-attach-ns .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ATTACH\-NS" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-ATTACH\-NS" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-attach-ns.html b/Documentation/nvme-attach-ns.html index b8eaf2961c..d0e4bab4bc 100644 --- a/Documentation/nvme-attach-ns.html +++ b/Documentation/nvme-attach-ns.html @@ -841,7 +841,7 @@

NVME

diff --git a/Documentation/nvme-boot-part-log.1 b/Documentation/nvme-boot-part-log.1 index c4e83031fe..bee3f7e8dd 100644 --- a/Documentation/nvme-boot-part-log.1 +++ b/Documentation/nvme-boot-part-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-boot-part-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-BOOT\-PART\-LO" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-BOOT\-PART\-LO" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-boot-part-log.html b/Documentation/nvme-boot-part-log.html index 77c3a1ce9a..415123280e 100644 --- a/Documentation/nvme-boot-part-log.html +++ b/Documentation/nvme-boot-part-log.html @@ -846,7 +846,7 @@

NVME

diff --git a/Documentation/nvme-capacity-mgmt.1 b/Documentation/nvme-capacity-mgmt.1 index 702c6baaed..bcfc1bb488 100644 --- a/Documentation/nvme-capacity-mgmt.1 +++ b/Documentation/nvme-capacity-mgmt.1 @@ -2,12 +2,12 @@ .\" Title: nvme-capacity-mgmt .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-CAPACITY\-MGMT" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-CAPACITY\-MGMT" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-capacity-mgmt.html b/Documentation/nvme-capacity-mgmt.html index 9bcf48bbb5..5a6b17547c 100644 --- a/Documentation/nvme-capacity-mgmt.html +++ b/Documentation/nvme-capacity-mgmt.html @@ -875,7 +875,7 @@

NVME

diff --git a/Documentation/nvme-changed-ns-list-log.1 b/Documentation/nvme-changed-ns-list-log.1 index 6fd24f46d2..5f71202c61 100644 --- a/Documentation/nvme-changed-ns-list-log.1 +++ b/Documentation/nvme-changed-ns-list-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-changed-ns-list-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-CHANGED\-NS\-L" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-CHANGED\-NS\-L" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-changed-ns-list-log.html b/Documentation/nvme-changed-ns-list-log.html index 59b916f9eb..1c41d27fe6 100644 --- a/Documentation/nvme-changed-ns-list-log.html +++ b/Documentation/nvme-changed-ns-list-log.html @@ -846,7 +846,7 @@

NVME

diff --git a/Documentation/nvme-cmdset-ind-id-ns.1 b/Documentation/nvme-cmdset-ind-id-ns.1 index 6310d5f211..89d673788d 100644 --- a/Documentation/nvme-cmdset-ind-id-ns.1 +++ b/Documentation/nvme-cmdset-ind-id-ns.1 @@ -2,12 +2,12 @@ .\" Title: nvme-cmdset-ind-id-ns .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-CMDSET\-IND\-I" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-CMDSET\-IND\-I" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-cmdset-ind-id-ns.html b/Documentation/nvme-cmdset-ind-id-ns.html index d1f0fc5a63..55f944d81d 100644 --- a/Documentation/nvme-cmdset-ind-id-ns.html +++ b/Documentation/nvme-cmdset-ind-id-ns.html @@ -889,7 +889,7 @@

NVME

diff --git a/Documentation/nvme-compare.1 b/Documentation/nvme-compare.1 index fed76b699c..98c34809db 100644 --- a/Documentation/nvme-compare.1 +++ b/Documentation/nvme-compare.1 @@ -2,12 +2,12 @@ .\" Title: nvme-compare .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-COMPARE" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-COMPARE" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-compare.html b/Documentation/nvme-compare.html index 9c8604c16f..3de498874e 100644 --- a/Documentation/nvme-compare.html +++ b/Documentation/nvme-compare.html @@ -1125,7 +1125,7 @@

NVME

diff --git a/Documentation/nvme-connect-all.1 b/Documentation/nvme-connect-all.1 index 012af88e46..955c43b193 100644 --- a/Documentation/nvme-connect-all.1 +++ b/Documentation/nvme-connect-all.1 @@ -2,12 +2,12 @@ .\" Title: nvme-connect-all .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-CONNECT\-ALL" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-CONNECT\-ALL" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-connect-all.html b/Documentation/nvme-connect-all.html index 31aca99fe9..0ebb4837f8 100644 --- a/Documentation/nvme-connect-all.html +++ b/Documentation/nvme-connect-all.html @@ -1273,7 +1273,7 @@

NVME

diff --git a/Documentation/nvme-connect.1 b/Documentation/nvme-connect.1 index 76ce9f2c1f..4477f4ce14 100644 --- a/Documentation/nvme-connect.1 +++ b/Documentation/nvme-connect.1 @@ -2,12 +2,12 @@ .\" Title: nvme-connect .\" Author: [see the "AUTHORS" section] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-CONNECT" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-CONNECT" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-connect.html b/Documentation/nvme-connect.html index 36511d76c1..7fc1de4f4a 100644 --- a/Documentation/nvme-connect.html +++ b/Documentation/nvme-connect.html @@ -1218,7 +1218,7 @@

NVME

diff --git a/Documentation/nvme-copy.1 b/Documentation/nvme-copy.1 index c024452bec..5981733da6 100644 --- a/Documentation/nvme-copy.1 +++ b/Documentation/nvme-copy.1 @@ -2,12 +2,12 @@ .\" Title: nvme-copy .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-COPY" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-COPY" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-copy.html b/Documentation/nvme-copy.html index 255a3a91b0..825e71302b 100644 --- a/Documentation/nvme-copy.html +++ b/Documentation/nvme-copy.html @@ -1042,7 +1042,7 @@

NVME

diff --git a/Documentation/nvme-create-ns.1 b/Documentation/nvme-create-ns.1 index c4d12ab022..1c51bf543c 100644 --- a/Documentation/nvme-create-ns.1 +++ b/Documentation/nvme-create-ns.1 @@ -2,12 +2,12 @@ .\" Title: nvme-create-ns .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-CREATE\-NS" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-CREATE\-NS" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-create-ns.html b/Documentation/nvme-create-ns.html index 8a8b8b386d..9ca496ae03 100644 --- a/Documentation/nvme-create-ns.html +++ b/Documentation/nvme-create-ns.html @@ -1082,7 +1082,7 @@

NVME

diff --git a/Documentation/nvme-delete-ns.1 b/Documentation/nvme-delete-ns.1 index b55169c0f8..fdf9f7aa1d 100644 --- a/Documentation/nvme-delete-ns.1 +++ b/Documentation/nvme-delete-ns.1 @@ -2,12 +2,12 @@ .\" Title: nvme-id-ns .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ID\-NS" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-ID\-NS" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-delete-ns.html b/Documentation/nvme-delete-ns.html index 0b608a3349..f472d0586b 100644 --- a/Documentation/nvme-delete-ns.html +++ b/Documentation/nvme-delete-ns.html @@ -835,7 +835,7 @@

NVME

diff --git a/Documentation/nvme-dera-stat.1 b/Documentation/nvme-dera-stat.1 index 1f2f90db12..eafe4ab2bb 100644 --- a/Documentation/nvme-dera-stat.1 +++ b/Documentation/nvme-dera-stat.1 @@ -2,12 +2,12 @@ .\" Title: nvme-dera-stat .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-DERA\-STAT" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-DERA\-STAT" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-dera-stat.html b/Documentation/nvme-dera-stat.html index 7cb3244d96..5654a6708c 100644 --- a/Documentation/nvme-dera-stat.html +++ b/Documentation/nvme-dera-stat.html @@ -797,7 +797,7 @@

NVME

diff --git a/Documentation/nvme-detach-ns.1 b/Documentation/nvme-detach-ns.1 index 545c61935c..632ec29cd2 100644 --- a/Documentation/nvme-detach-ns.1 +++ b/Documentation/nvme-detach-ns.1 @@ -2,12 +2,12 @@ .\" Title: nvme-detach-ns .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-DETACH\-NS" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-DETACH\-NS" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-detach-ns.html b/Documentation/nvme-detach-ns.html index 66d16a1bcf..d6aa96fee0 100644 --- a/Documentation/nvme-detach-ns.html +++ b/Documentation/nvme-detach-ns.html @@ -834,7 +834,7 @@

NVME

diff --git a/Documentation/nvme-device-self-test.1 b/Documentation/nvme-device-self-test.1 index 43c0aa179b..0897f65ec2 100644 --- a/Documentation/nvme-device-self-test.1 +++ b/Documentation/nvme-device-self-test.1 @@ -2,12 +2,12 @@ .\" Title: nvme-device-self-test .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-DEVICE\-SELF\-" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-DEVICE\-SELF\-" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-device-self-test.html b/Documentation/nvme-device-self-test.html index 94665276fd..24df69bad2 100644 --- a/Documentation/nvme-device-self-test.html +++ b/Documentation/nvme-device-self-test.html @@ -884,7 +884,7 @@

NVME

diff --git a/Documentation/nvme-dim.1 b/Documentation/nvme-dim.1 index f763ccefb3..b5184555fa 100644 --- a/Documentation/nvme-dim.1 +++ b/Documentation/nvme-dim.1 @@ -2,12 +2,12 @@ .\" Title: nvme-dim .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-DIM" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-DIM" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-dim.html b/Documentation/nvme-dim.html index e3de906a71..31362dfaab 100644 --- a/Documentation/nvme-dim.html +++ b/Documentation/nvme-dim.html @@ -885,7 +885,7 @@

NVME

diff --git a/Documentation/nvme-dir-receive.1 b/Documentation/nvme-dir-receive.1 index b61db0397e..549581e748 100644 --- a/Documentation/nvme-dir-receive.1 +++ b/Documentation/nvme-dir-receive.1 @@ -2,12 +2,12 @@ .\" Title: nvme-dir-receive .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-DIR\-RECEIVE" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-DIR\-RECEIVE" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-dir-receive.html b/Documentation/nvme-dir-receive.html index 7ede777dd0..df80793db9 100644 --- a/Documentation/nvme-dir-receive.html +++ b/Documentation/nvme-dir-receive.html @@ -1001,7 +1001,7 @@

NVME

diff --git a/Documentation/nvme-dir-send.1 b/Documentation/nvme-dir-send.1 index e274189963..be16cd8761 100644 --- a/Documentation/nvme-dir-send.1 +++ b/Documentation/nvme-dir-send.1 @@ -2,12 +2,12 @@ .\" Title: nvme-dir-send .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-DIR\-SEND" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-DIR\-SEND" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-dir-send.html b/Documentation/nvme-dir-send.html index 444cf0e3a4..f85e0aef0a 100644 --- a/Documentation/nvme-dir-send.html +++ b/Documentation/nvme-dir-send.html @@ -1014,7 +1014,7 @@

NVME

diff --git a/Documentation/nvme-disconnect-all.1 b/Documentation/nvme-disconnect-all.1 index 39843bb238..eeb209f7c8 100644 --- a/Documentation/nvme-disconnect-all.1 +++ b/Documentation/nvme-disconnect-all.1 @@ -2,12 +2,12 @@ .\" Title: nvme-disconnect-all .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-DISCONNECT\-AL" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-DISCONNECT\-AL" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-disconnect-all.html b/Documentation/nvme-disconnect-all.html index 1160acb403..9ad129d6a0 100644 --- a/Documentation/nvme-disconnect-all.html +++ b/Documentation/nvme-disconnect-all.html @@ -825,7 +825,7 @@

NVME

diff --git a/Documentation/nvme-disconnect.1 b/Documentation/nvme-disconnect.1 index a86ada4325..eb76da5c34 100644 --- a/Documentation/nvme-disconnect.1 +++ b/Documentation/nvme-disconnect.1 @@ -2,12 +2,12 @@ .\" Title: nvme-disconnect .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-DISCONNECT" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-DISCONNECT" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-disconnect.html b/Documentation/nvme-disconnect.html index ad634f71e1..6eb2b8fdff 100644 --- a/Documentation/nvme-disconnect.html +++ b/Documentation/nvme-disconnect.html @@ -862,7 +862,7 @@

NVME

diff --git a/Documentation/nvme-discover.1 b/Documentation/nvme-discover.1 index 879673c932..a2057f3539 100644 --- a/Documentation/nvme-discover.1 +++ b/Documentation/nvme-discover.1 @@ -2,12 +2,12 @@ .\" Title: nvme-discover .\" Author: [see the "AUTHORS" section] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-DISCOVER" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-DISCOVER" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-discover.html b/Documentation/nvme-discover.html index 0c80665f95..2ff6c7ac93 100644 --- a/Documentation/nvme-discover.html +++ b/Documentation/nvme-discover.html @@ -1322,7 +1322,7 @@

NVME

diff --git a/Documentation/nvme-dsm.1 b/Documentation/nvme-dsm.1 index 02f83bf8c5..2086ce274d 100644 --- a/Documentation/nvme-dsm.1 +++ b/Documentation/nvme-dsm.1 @@ -2,12 +2,12 @@ .\" Title: nvme-dsm .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-DSM" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-DSM" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-dsm.html b/Documentation/nvme-dsm.html index 5b56c1e29b..e60a602ce2 100644 --- a/Documentation/nvme-dsm.html +++ b/Documentation/nvme-dsm.html @@ -930,7 +930,7 @@

NVME

diff --git a/Documentation/nvme-effects-log.1 b/Documentation/nvme-effects-log.1 index 8b28776c9d..b48a691337 100644 --- a/Documentation/nvme-effects-log.1 +++ b/Documentation/nvme-effects-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-effects-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-EFFECTS\-LOG" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-EFFECTS\-LOG" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-effects-log.html b/Documentation/nvme-effects-log.html index 7ac963c710..4ad970b7a0 100644 --- a/Documentation/nvme-effects-log.html +++ b/Documentation/nvme-effects-log.html @@ -869,7 +869,7 @@

NVME

diff --git a/Documentation/nvme-endurance-event-agg-log.1 b/Documentation/nvme-endurance-event-agg-log.1 index 9dd8672db1..5667c19a67 100644 --- a/Documentation/nvme-endurance-event-agg-log.1 +++ b/Documentation/nvme-endurance-event-agg-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-endurance-event-agg-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ENDURANCE\-EVE" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-ENDURANCE\-EVE" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-endurance-event-agg-log.html b/Documentation/nvme-endurance-event-agg-log.html index ce0050b5a0..9a2e0ae981 100644 --- a/Documentation/nvme-endurance-event-agg-log.html +++ b/Documentation/nvme-endurance-event-agg-log.html @@ -862,7 +862,7 @@

NVME

diff --git a/Documentation/nvme-endurance-log.1 b/Documentation/nvme-endurance-log.1 index 7d67c2735d..314664833a 100644 --- a/Documentation/nvme-endurance-log.1 +++ b/Documentation/nvme-endurance-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-endurance-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ENDURANCE\-LOG" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-ENDURANCE\-LOG" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-endurance-log.html b/Documentation/nvme-endurance-log.html index 5d107973dc..4f04d61ec8 100644 --- a/Documentation/nvme-endurance-log.html +++ b/Documentation/nvme-endurance-log.html @@ -845,7 +845,7 @@

NVME

diff --git a/Documentation/nvme-error-log.1 b/Documentation/nvme-error-log.1 index edb700346e..e1d0612ac9 100644 --- a/Documentation/nvme-error-log.1 +++ b/Documentation/nvme-error-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-error-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ERROR\-LOG" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-ERROR\-LOG" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-error-log.html b/Documentation/nvme-error-log.html index d1658cbe7d..24ccfe03ab 100644 --- a/Documentation/nvme-error-log.html +++ b/Documentation/nvme-error-log.html @@ -860,7 +860,7 @@

NVME

diff --git a/Documentation/nvme-fdp-configs.1 b/Documentation/nvme-fdp-configs.1 index 30b36a1c17..0807385f6e 100644 --- a/Documentation/nvme-fdp-configs.1 +++ b/Documentation/nvme-fdp-configs.1 @@ -2,12 +2,12 @@ .\" Title: nvme-fdp-configs .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-FDP\-CONFIGS" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-FDP\-CONFIGS" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-fdp-configs.html b/Documentation/nvme-fdp-configs.html index d96e0bd228..1069d582c5 100644 --- a/Documentation/nvme-fdp-configs.html +++ b/Documentation/nvme-fdp-configs.html @@ -826,7 +826,7 @@

NVME

diff --git a/Documentation/nvme-fdp-events.1 b/Documentation/nvme-fdp-events.1 index acc1d9c5ab..1351d0fb6d 100644 --- a/Documentation/nvme-fdp-events.1 +++ b/Documentation/nvme-fdp-events.1 @@ -2,12 +2,12 @@ .\" Title: nvme-fdp-events .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-FDP\-EVENTS" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-FDP\-EVENTS" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-fdp-events.html b/Documentation/nvme-fdp-events.html index adc816473d..b1398ee727 100644 --- a/Documentation/nvme-fdp-events.html +++ b/Documentation/nvme-fdp-events.html @@ -825,7 +825,7 @@

NVME

diff --git a/Documentation/nvme-fdp-set-events.1 b/Documentation/nvme-fdp-set-events.1 index 68f86ffe9f..8a4f9bbd3e 100644 --- a/Documentation/nvme-fdp-set-events.1 +++ b/Documentation/nvme-fdp-set-events.1 @@ -2,12 +2,12 @@ .\" Title: nvme-fdp-set-events .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-FDP\-SET\-EVEN" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-FDP\-SET\-EVEN" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-fdp-set-events.html b/Documentation/nvme-fdp-set-events.html index 5005c048f8..91e5d9ad6f 100644 --- a/Documentation/nvme-fdp-set-events.html +++ b/Documentation/nvme-fdp-set-events.html @@ -816,7 +816,7 @@

NVME

diff --git a/Documentation/nvme-fdp-stats.1 b/Documentation/nvme-fdp-stats.1 index 4a5e44d8ed..246a0c5635 100644 --- a/Documentation/nvme-fdp-stats.1 +++ b/Documentation/nvme-fdp-stats.1 @@ -2,12 +2,12 @@ .\" Title: nvme-fdp-stats .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-FDP\-STATS" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-FDP\-STATS" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-fdp-stats.html b/Documentation/nvme-fdp-stats.html index 24781c927d..45eeca1b1f 100644 --- a/Documentation/nvme-fdp-stats.html +++ b/Documentation/nvme-fdp-stats.html @@ -814,7 +814,7 @@

NVME

diff --git a/Documentation/nvme-fdp-status.1 b/Documentation/nvme-fdp-status.1 index 58d6c4e8f1..8354d86ac7 100644 --- a/Documentation/nvme-fdp-status.1 +++ b/Documentation/nvme-fdp-status.1 @@ -2,12 +2,12 @@ .\" Title: nvme-fdp-status .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-FDP\-STATUS" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-FDP\-STATUS" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-fdp-status.html b/Documentation/nvme-fdp-status.html index 93151eb5d5..a35f371688 100644 --- a/Documentation/nvme-fdp-status.html +++ b/Documentation/nvme-fdp-status.html @@ -814,7 +814,7 @@

NVME

diff --git a/Documentation/nvme-fdp-update.1 b/Documentation/nvme-fdp-update.1 index 0f50f296e1..18e5537f11 100644 --- a/Documentation/nvme-fdp-update.1 +++ b/Documentation/nvme-fdp-update.1 @@ -2,12 +2,12 @@ .\" Title: nvme-fdp-update .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-FDP\-UPDATE" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-FDP\-UPDATE" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-fdp-update.html b/Documentation/nvme-fdp-update.html index 5113584948..fdf17ac4aa 100644 --- a/Documentation/nvme-fdp-update.html +++ b/Documentation/nvme-fdp-update.html @@ -802,7 +802,7 @@

NVME

diff --git a/Documentation/nvme-fdp-usage.1 b/Documentation/nvme-fdp-usage.1 index fd10638d62..65abdd694f 100644 --- a/Documentation/nvme-fdp-usage.1 +++ b/Documentation/nvme-fdp-usage.1 @@ -2,12 +2,12 @@ .\" Title: nvme-fdp-usage .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-FDP\-USAGE" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-FDP\-USAGE" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-fdp-usage.html b/Documentation/nvme-fdp-usage.html index 11a34e3ba8..f6a92bd337 100644 --- a/Documentation/nvme-fdp-usage.html +++ b/Documentation/nvme-fdp-usage.html @@ -815,7 +815,7 @@

NVME

diff --git a/Documentation/nvme-fid-support-effects-log.1 b/Documentation/nvme-fid-support-effects-log.1 index 8fdc3ecd22..f433c3ff6e 100644 --- a/Documentation/nvme-fid-support-effects-log.1 +++ b/Documentation/nvme-fid-support-effects-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-fid-support-effects-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-FID\-SUPPORT\-" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-FID\-SUPPORT\-" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-fid-support-effects-log.html b/Documentation/nvme-fid-support-effects-log.html index 85110a1913..6ccffef271 100644 --- a/Documentation/nvme-fid-support-effects-log.html +++ b/Documentation/nvme-fid-support-effects-log.html @@ -825,7 +825,7 @@

NVME

diff --git a/Documentation/nvme-flush.1 b/Documentation/nvme-flush.1 index 5cb1204d8c..0b68d53e69 100644 --- a/Documentation/nvme-flush.1 +++ b/Documentation/nvme-flush.1 @@ -2,12 +2,12 @@ .\" Title: nvme-flush .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-FLUSH" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-FLUSH" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-flush.html b/Documentation/nvme-flush.html index e598f52fd9..1c930b60f3 100644 --- a/Documentation/nvme-flush.html +++ b/Documentation/nvme-flush.html @@ -824,7 +824,7 @@

NVME

diff --git a/Documentation/nvme-format.1 b/Documentation/nvme-format.1 index 9abc1195f3..0c1f6d081a 100644 --- a/Documentation/nvme-format.1 +++ b/Documentation/nvme-format.1 @@ -2,12 +2,12 @@ .\" Title: nvme-format .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-FORMAT" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-FORMAT" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-format.html b/Documentation/nvme-format.html index ac616ac557..7dce135583 100644 --- a/Documentation/nvme-format.html +++ b/Documentation/nvme-format.html @@ -1056,7 +1056,7 @@

NVME

diff --git a/Documentation/nvme-fw-commit.1 b/Documentation/nvme-fw-commit.1 index 3c04f1b2e5..bcfaf19e7a 100644 --- a/Documentation/nvme-fw-commit.1 +++ b/Documentation/nvme-fw-commit.1 @@ -2,12 +2,12 @@ .\" Title: nvme-fw-commit .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-FW\-COMMIT" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-FW\-COMMIT" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-fw-commit.html b/Documentation/nvme-fw-commit.html index 39ac136a2a..0c8bf5a0c4 100644 --- a/Documentation/nvme-fw-commit.html +++ b/Documentation/nvme-fw-commit.html @@ -941,7 +941,7 @@

NVME

diff --git a/Documentation/nvme-fw-download.1 b/Documentation/nvme-fw-download.1 index e40647a8c3..da7bc818a5 100644 --- a/Documentation/nvme-fw-download.1 +++ b/Documentation/nvme-fw-download.1 @@ -2,12 +2,12 @@ .\" Title: nvme-fw-download .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-FW\-DOWNLOAD" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-FW\-DOWNLOAD" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-fw-download.html b/Documentation/nvme-fw-download.html index 68cc9a3a3a..950a88cd74 100644 --- a/Documentation/nvme-fw-download.html +++ b/Documentation/nvme-fw-download.html @@ -888,7 +888,7 @@

NVME

diff --git a/Documentation/nvme-fw-log.1 b/Documentation/nvme-fw-log.1 index 5b947bc9c4..300d13e549 100644 --- a/Documentation/nvme-fw-log.1 +++ b/Documentation/nvme-fw-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-fw-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-FW\-LOG" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-FW\-LOG" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-fw-log.html b/Documentation/nvme-fw-log.html index b5235d7075..787c8e3342 100644 --- a/Documentation/nvme-fw-log.html +++ b/Documentation/nvme-fw-log.html @@ -846,7 +846,7 @@

NVME

diff --git a/Documentation/nvme-gen-hostnqn.1 b/Documentation/nvme-gen-hostnqn.1 index 7b04592022..a784a3f930 100644 --- a/Documentation/nvme-gen-hostnqn.1 +++ b/Documentation/nvme-gen-hostnqn.1 @@ -2,12 +2,12 @@ .\" Title: nvme-gen-hostnqn .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-GEN\-HOSTNQN" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-GEN\-HOSTNQN" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-gen-hostnqn.html b/Documentation/nvme-gen-hostnqn.html index 3e98cd86ff..cc2bc4adde 100644 --- a/Documentation/nvme-gen-hostnqn.html +++ b/Documentation/nvme-gen-hostnqn.html @@ -809,7 +809,7 @@

NVME

diff --git a/Documentation/nvme-get-feature.1 b/Documentation/nvme-get-feature.1 index 15bd7d5d4b..20d8141fe1 100644 --- a/Documentation/nvme-get-feature.1 +++ b/Documentation/nvme-get-feature.1 @@ -2,12 +2,12 @@ .\" Title: nvme-get-feature .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-GET\-FEATURE" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-GET\-FEATURE" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-get-feature.html b/Documentation/nvme-get-feature.html index 88606824f9..83d97c1cf0 100644 --- a/Documentation/nvme-get-feature.html +++ b/Documentation/nvme-get-feature.html @@ -1016,7 +1016,7 @@

NVME

diff --git a/Documentation/nvme-get-lba-status.1 b/Documentation/nvme-get-lba-status.1 index 6f494b1456..95e73c072e 100644 --- a/Documentation/nvme-get-lba-status.1 +++ b/Documentation/nvme-get-lba-status.1 @@ -2,12 +2,12 @@ .\" Title: nvme-get-lba-status .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-GET\-LBA\-STAT" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-GET\-LBA\-STAT" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-get-lba-status.html b/Documentation/nvme-get-lba-status.html index 0c083cdbe6..51b477b90a 100644 --- a/Documentation/nvme-get-lba-status.html +++ b/Documentation/nvme-get-lba-status.html @@ -907,7 +907,7 @@

NVME

diff --git a/Documentation/nvme-get-log.1 b/Documentation/nvme-get-log.1 index 7c01640fbe..fa93896e0a 100644 --- a/Documentation/nvme-get-log.1 +++ b/Documentation/nvme-get-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-get-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-GET\-LOG" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-GET\-LOG" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-get-log.html b/Documentation/nvme-get-log.html index 97f7bb2062..26c036efac 100644 --- a/Documentation/nvme-get-log.html +++ b/Documentation/nvme-get-log.html @@ -997,7 +997,7 @@

NVME

diff --git a/Documentation/nvme-get-ns-id.1 b/Documentation/nvme-get-ns-id.1 index 2894842b79..1c0ed6c32c 100644 --- a/Documentation/nvme-get-ns-id.1 +++ b/Documentation/nvme-get-ns-id.1 @@ -2,12 +2,12 @@ .\" Title: nvme-get-ns-id .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-GET\-NS\-ID" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-GET\-NS\-ID" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-get-ns-id.html b/Documentation/nvme-get-ns-id.html index 36ca5c9742..1800c7e5bd 100644 --- a/Documentation/nvme-get-ns-id.html +++ b/Documentation/nvme-get-ns-id.html @@ -818,7 +818,7 @@

NVME

diff --git a/Documentation/nvme-get-property.1 b/Documentation/nvme-get-property.1 index c49d92fcae..2ccdf84e51 100644 --- a/Documentation/nvme-get-property.1 +++ b/Documentation/nvme-get-property.1 @@ -2,12 +2,12 @@ .\" Title: nvme-get-property .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-GET\-PROPERTY" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-GET\-PROPERTY" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-get-property.html b/Documentation/nvme-get-property.html index 9c808d1bee..755234d0bd 100644 --- a/Documentation/nvme-get-property.html +++ b/Documentation/nvme-get-property.html @@ -879,7 +879,7 @@

NVME

diff --git a/Documentation/nvme-help.1 b/Documentation/nvme-help.1 index d4b3f46196..0214fdf89b 100644 --- a/Documentation/nvme-help.1 +++ b/Documentation/nvme-help.1 @@ -2,12 +2,12 @@ .\" Title: nvme-help .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-HELP" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-HELP" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-help.html b/Documentation/nvme-help.html index ef2d50f6f8..72b8e27d00 100644 --- a/Documentation/nvme-help.html +++ b/Documentation/nvme-help.html @@ -794,7 +794,7 @@

NVME

diff --git a/Documentation/nvme-huawei-id-ctrl.1 b/Documentation/nvme-huawei-id-ctrl.1 index 7e544ffba7..c0e65431eb 100644 --- a/Documentation/nvme-huawei-id-ctrl.1 +++ b/Documentation/nvme-huawei-id-ctrl.1 @@ -2,12 +2,12 @@ .\" Title: nvme-huawei-id-ctrl .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-HUAWEI\-ID\-CT" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-HUAWEI\-ID\-CT" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-huawei-id-ctrl.html b/Documentation/nvme-huawei-id-ctrl.html index 8e31df90ad..c34721082c 100644 --- a/Documentation/nvme-huawei-id-ctrl.html +++ b/Documentation/nvme-huawei-id-ctrl.html @@ -855,7 +855,7 @@

NVME

diff --git a/Documentation/nvme-huawei-list.1 b/Documentation/nvme-huawei-list.1 index 514184e084..b479bec5f9 100644 --- a/Documentation/nvme-huawei-list.1 +++ b/Documentation/nvme-huawei-list.1 @@ -2,12 +2,12 @@ .\" Title: nvme-list .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-LIST" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-LIST" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-huawei-list.html b/Documentation/nvme-huawei-list.html index 367cdafeb2..951a5ce4d5 100644 --- a/Documentation/nvme-huawei-list.html +++ b/Documentation/nvme-huawei-list.html @@ -797,7 +797,7 @@

NVME

diff --git a/Documentation/nvme-id-ctrl.1 b/Documentation/nvme-id-ctrl.1 index a2e03dc254..357298b2df 100644 --- a/Documentation/nvme-id-ctrl.1 +++ b/Documentation/nvme-id-ctrl.1 @@ -2,12 +2,12 @@ .\" Title: nvme-id-ctrl .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ID\-CTRL" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-ID\-CTRL" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-id-ctrl.html b/Documentation/nvme-id-ctrl.html index 6ee61b478d..e57ee1b7ed 100644 --- a/Documentation/nvme-id-ctrl.html +++ b/Documentation/nvme-id-ctrl.html @@ -921,7 +921,7 @@

NVME

diff --git a/Documentation/nvme-id-domain.1 b/Documentation/nvme-id-domain.1 index 3c5eaa16fe..c103e4fc44 100644 --- a/Documentation/nvme-id-domain.1 +++ b/Documentation/nvme-id-domain.1 @@ -2,12 +2,12 @@ .\" Title: nvme-id-domain .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ID\-DOMAIN" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-ID\-DOMAIN" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-id-domain.html b/Documentation/nvme-id-domain.html index 8652a36332..df4abd7a49 100644 --- a/Documentation/nvme-id-domain.html +++ b/Documentation/nvme-id-domain.html @@ -823,7 +823,7 @@

NVME

diff --git a/Documentation/nvme-id-iocs.1 b/Documentation/nvme-id-iocs.1 index 890db48354..d8a7ccd763 100644 --- a/Documentation/nvme-id-iocs.1 +++ b/Documentation/nvme-id-iocs.1 @@ -2,12 +2,12 @@ .\" Title: nvme-id-iocs .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ID\-IOCS" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-ID\-IOCS" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-id-iocs.html b/Documentation/nvme-id-iocs.html index e6f6a1fd72..82cdef061d 100644 --- a/Documentation/nvme-id-iocs.html +++ b/Documentation/nvme-id-iocs.html @@ -855,7 +855,7 @@

NVME

diff --git a/Documentation/nvme-id-ns.1 b/Documentation/nvme-id-ns.1 index 55f89759e1..1524526cef 100644 --- a/Documentation/nvme-id-ns.1 +++ b/Documentation/nvme-id-ns.1 @@ -2,12 +2,12 @@ .\" Title: nvme-id-ns .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ID\-NS" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-ID\-NS" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-id-ns.html b/Documentation/nvme-id-ns.html index 663b683d7b..04dc6003c8 100644 --- a/Documentation/nvme-id-ns.html +++ b/Documentation/nvme-id-ns.html @@ -966,7 +966,7 @@

NVME

diff --git a/Documentation/nvme-id-nvmset.1 b/Documentation/nvme-id-nvmset.1 index 920376f3f7..f60c089882 100644 --- a/Documentation/nvme-id-nvmset.1 +++ b/Documentation/nvme-id-nvmset.1 @@ -2,12 +2,12 @@ .\" Title: nvme-id-nvmset .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ID\-NVMSET" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-ID\-NVMSET" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-id-nvmset.html b/Documentation/nvme-id-nvmset.html index 3bb1667ff7..ba691fa6bd 100644 --- a/Documentation/nvme-id-nvmset.html +++ b/Documentation/nvme-id-nvmset.html @@ -862,7 +862,7 @@

EXAMPLES

diff --git a/Documentation/nvme-inspur-nvme-vendor-log.1 b/Documentation/nvme-inspur-nvme-vendor-log.1 index 5f3b1afb20..8f6132942c 100644 --- a/Documentation/nvme-inspur-nvme-vendor-log.1 +++ b/Documentation/nvme-inspur-nvme-vendor-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-inspur-nvme-vendor-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-INSPUR\-NVME\-" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-INSPUR\-NVME\-" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-inspur-nvme-vendor-log.html b/Documentation/nvme-inspur-nvme-vendor-log.html index b7879ca66b..9e80244617 100644 --- a/Documentation/nvme-inspur-nvme-vendor-log.html +++ b/Documentation/nvme-inspur-nvme-vendor-log.html @@ -796,7 +796,7 @@

NVME

diff --git a/Documentation/nvme-intel-id-ctrl.1 b/Documentation/nvme-intel-id-ctrl.1 index 6295548512..7ca144ac6f 100644 --- a/Documentation/nvme-intel-id-ctrl.1 +++ b/Documentation/nvme-intel-id-ctrl.1 @@ -2,12 +2,12 @@ .\" Title: nvme-intel-id-ctrl .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-INTEL\-ID\-CTR" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-INTEL\-ID\-CTR" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-intel-id-ctrl.html b/Documentation/nvme-intel-id-ctrl.html index b416638788..1133c42b01 100644 --- a/Documentation/nvme-intel-id-ctrl.html +++ b/Documentation/nvme-intel-id-ctrl.html @@ -853,7 +853,7 @@

NVME

diff --git a/Documentation/nvme-intel-internal-log.1 b/Documentation/nvme-intel-internal-log.1 index f8a9e7cbe8..3cd0ab757c 100644 --- a/Documentation/nvme-intel-internal-log.1 +++ b/Documentation/nvme-intel-internal-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-intel-internal-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-INTEL\-INTERNA" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-INTEL\-INTERNA" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-intel-internal-log.html b/Documentation/nvme-intel-internal-log.html index 361b65e035..5cd11e6559 100644 --- a/Documentation/nvme-intel-internal-log.html +++ b/Documentation/nvme-intel-internal-log.html @@ -873,7 +873,7 @@

NVME

diff --git a/Documentation/nvme-intel-lat-stats.1 b/Documentation/nvme-intel-lat-stats.1 index 30db467958..af90cd37b4 100644 --- a/Documentation/nvme-intel-lat-stats.1 +++ b/Documentation/nvme-intel-lat-stats.1 @@ -2,12 +2,12 @@ .\" Title: nvme-intel-lat-stats .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-INTEL\-LAT\-ST" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-INTEL\-LAT\-ST" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-intel-lat-stats.html b/Documentation/nvme-intel-lat-stats.html index ff3c150eda..3cd4835a0f 100644 --- a/Documentation/nvme-intel-lat-stats.html +++ b/Documentation/nvme-intel-lat-stats.html @@ -832,7 +832,7 @@

NVME

diff --git a/Documentation/nvme-intel-market-name.1 b/Documentation/nvme-intel-market-name.1 index 6a5d104828..492f0ed1f8 100644 --- a/Documentation/nvme-intel-market-name.1 +++ b/Documentation/nvme-intel-market-name.1 @@ -2,12 +2,12 @@ .\" Title: nvme-intel-market-name .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-INTEL\-MARKET\" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-INTEL\-MARKET\" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-intel-market-name.html b/Documentation/nvme-intel-market-name.html index b8ca9e0b3e..4d55336570 100644 --- a/Documentation/nvme-intel-market-name.html +++ b/Documentation/nvme-intel-market-name.html @@ -813,7 +813,7 @@

NVME

diff --git a/Documentation/nvme-intel-smart-log-add.1 b/Documentation/nvme-intel-smart-log-add.1 index 65e9c6158a..87373a7f60 100644 --- a/Documentation/nvme-intel-smart-log-add.1 +++ b/Documentation/nvme-intel-smart-log-add.1 @@ -2,12 +2,12 @@ .\" Title: nvme-intel-smart-log-add .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-INTEL\-SMART\-" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-INTEL\-SMART\-" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-intel-smart-log-add.html b/Documentation/nvme-intel-smart-log-add.html index ebfe48f5c3..d0816cf56b 100644 --- a/Documentation/nvme-intel-smart-log-add.html +++ b/Documentation/nvme-intel-smart-log-add.html @@ -849,7 +849,7 @@

NVME

diff --git a/Documentation/nvme-intel-temp-stats.1 b/Documentation/nvme-intel-temp-stats.1 index a52e88e108..cc6647bc5e 100644 --- a/Documentation/nvme-intel-temp-stats.1 +++ b/Documentation/nvme-intel-temp-stats.1 @@ -2,12 +2,12 @@ .\" Title: nvme-intel-temp-stats .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-INTEL\-TEMP\-S" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-INTEL\-TEMP\-S" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-intel-temp-stats.html b/Documentation/nvme-intel-temp-stats.html index f4c526a0b9..905b81e2ec 100644 --- a/Documentation/nvme-intel-temp-stats.html +++ b/Documentation/nvme-intel-temp-stats.html @@ -822,7 +822,7 @@

NVME

diff --git a/Documentation/nvme-io-mgmt-recv.1 b/Documentation/nvme-io-mgmt-recv.1 index cf194aac64..d35d4e37b6 100644 --- a/Documentation/nvme-io-mgmt-recv.1 +++ b/Documentation/nvme-io-mgmt-recv.1 @@ -2,12 +2,12 @@ .\" Title: nvme-io-mgmt-recv .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-IO\-MGMT\-RECV" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-IO\-MGMT\-RECV" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-io-mgmt-recv.html b/Documentation/nvme-io-mgmt-recv.html index aedf30c029..eb6ea2f1ba 100644 --- a/Documentation/nvme-io-mgmt-recv.html +++ b/Documentation/nvme-io-mgmt-recv.html @@ -881,7 +881,7 @@

NVME

diff --git a/Documentation/nvme-io-mgmt-send.1 b/Documentation/nvme-io-mgmt-send.1 index 80593ed975..555015d997 100644 --- a/Documentation/nvme-io-mgmt-send.1 +++ b/Documentation/nvme-io-mgmt-send.1 @@ -2,12 +2,12 @@ .\" Title: nvme-io-mgmt-send .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-IO\-MGMT\-SEND" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-IO\-MGMT\-SEND" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-io-mgmt-send.html b/Documentation/nvme-io-mgmt-send.html index d77257fbbd..a8e8b4a9a4 100644 --- a/Documentation/nvme-io-mgmt-send.html +++ b/Documentation/nvme-io-mgmt-send.html @@ -880,7 +880,7 @@

NVME

diff --git a/Documentation/nvme-io-passthru.1 b/Documentation/nvme-io-passthru.1 index dc7c573866..7bbe392206 100644 --- a/Documentation/nvme-io-passthru.1 +++ b/Documentation/nvme-io-passthru.1 @@ -2,12 +2,12 @@ .\" Title: nvme-io-passthru .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-IO\-PASSTHRU" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-IO\-PASSTHRU" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-io-passthru.html b/Documentation/nvme-io-passthru.html index 18b8de7cd3..06190b33a5 100644 --- a/Documentation/nvme-io-passthru.html +++ b/Documentation/nvme-io-passthru.html @@ -1030,7 +1030,7 @@

NVME

diff --git a/Documentation/nvme-lba-status-log.1 b/Documentation/nvme-lba-status-log.1 index 69fdc47ef5..f75bcca688 100644 --- a/Documentation/nvme-lba-status-log.1 +++ b/Documentation/nvme-lba-status-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-lba-status-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-LBA\-STATUS\-L" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-LBA\-STATUS\-L" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-lba-status-log.html b/Documentation/nvme-lba-status-log.html index 35e97a4ce6..0b9db2555d 100644 --- a/Documentation/nvme-lba-status-log.html +++ b/Documentation/nvme-lba-status-log.html @@ -843,7 +843,7 @@

EXAMPLES

diff --git a/Documentation/nvme-list-ctrl.1 b/Documentation/nvme-list-ctrl.1 index fe2cd7eeed..37e4936730 100644 --- a/Documentation/nvme-list-ctrl.1 +++ b/Documentation/nvme-list-ctrl.1 @@ -2,12 +2,12 @@ .\" Title: nvme-list-ctrl .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-LIST\-CTRL" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-LIST\-CTRL" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-list-ctrl.html b/Documentation/nvme-list-ctrl.html index cdc82961f4..f98f0715ea 100644 --- a/Documentation/nvme-list-ctrl.html +++ b/Documentation/nvme-list-ctrl.html @@ -842,7 +842,7 @@

NVME

diff --git a/Documentation/nvme-list-endgrp.1 b/Documentation/nvme-list-endgrp.1 index 83bec731f9..ddec6f394d 100644 --- a/Documentation/nvme-list-endgrp.1 +++ b/Documentation/nvme-list-endgrp.1 @@ -2,12 +2,12 @@ .\" Title: nvme-list-endgrp .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-LIST\-ENDGRP" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-LIST\-ENDGRP" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-list-endgrp.html b/Documentation/nvme-list-endgrp.html index 33183142e1..80065cc4cb 100644 --- a/Documentation/nvme-list-endgrp.html +++ b/Documentation/nvme-list-endgrp.html @@ -826,7 +826,7 @@

NVME

diff --git a/Documentation/nvme-list-ns.1 b/Documentation/nvme-list-ns.1 index 429b2bb33d..6081da5b46 100644 --- a/Documentation/nvme-list-ns.1 +++ b/Documentation/nvme-list-ns.1 @@ -2,12 +2,12 @@ .\" Title: nvme-id-ns .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ID\-NS" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-ID\-NS" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-list-ns.html b/Documentation/nvme-list-ns.html index e5612ae937..d81b381250 100644 --- a/Documentation/nvme-list-ns.html +++ b/Documentation/nvme-list-ns.html @@ -883,7 +883,7 @@

NVME

diff --git a/Documentation/nvme-list-subsys.1 b/Documentation/nvme-list-subsys.1 index 281ef34b00..5cfc8e6342 100644 --- a/Documentation/nvme-list-subsys.1 +++ b/Documentation/nvme-list-subsys.1 @@ -2,12 +2,12 @@ .\" Title: nvme-list-subsys .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-LIST\-SUBSYS" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-LIST\-SUBSYS" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-list-subsys.html b/Documentation/nvme-list-subsys.html index 22b40ea9eb..9e47ee52d6 100644 --- a/Documentation/nvme-list-subsys.html +++ b/Documentation/nvme-list-subsys.html @@ -865,7 +865,7 @@

NVME

diff --git a/Documentation/nvme-list.1 b/Documentation/nvme-list.1 index 7b72a8fde0..0fcbdf82ec 100644 --- a/Documentation/nvme-list.1 +++ b/Documentation/nvme-list.1 @@ -2,12 +2,12 @@ .\" Title: nvme-list .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-LIST" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-LIST" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-list.html b/Documentation/nvme-list.html index 290ad778f8..8b6d6488ad 100644 --- a/Documentation/nvme-list.html +++ b/Documentation/nvme-list.html @@ -816,7 +816,7 @@

NVME

diff --git a/Documentation/nvme-lockdown.1 b/Documentation/nvme-lockdown.1 index 073f644472..1403b766f9 100644 --- a/Documentation/nvme-lockdown.1 +++ b/Documentation/nvme-lockdown.1 @@ -2,12 +2,12 @@ .\" Title: nvme-lockdown .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-LOCKDOWN" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-LOCKDOWN" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-lockdown.html b/Documentation/nvme-lockdown.html index fc27352065..acb01c47a1 100644 --- a/Documentation/nvme-lockdown.html +++ b/Documentation/nvme-lockdown.html @@ -886,7 +886,7 @@

NVME

diff --git a/Documentation/nvme-mi-cmd-support-effects-log.1 b/Documentation/nvme-mi-cmd-support-effects-log.1 index 3d331d39e4..f2f2d5289d 100644 --- a/Documentation/nvme-mi-cmd-support-effects-log.1 +++ b/Documentation/nvme-mi-cmd-support-effects-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-mi-cmd-support-effects-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-MI\-CMD\-SUPPO" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-MI\-CMD\-SUPPO" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-mi-cmd-support-effects-log.html b/Documentation/nvme-mi-cmd-support-effects-log.html index 1bead85c43..3228579694 100644 --- a/Documentation/nvme-mi-cmd-support-effects-log.html +++ b/Documentation/nvme-mi-cmd-support-effects-log.html @@ -826,7 +826,7 @@

NVME

diff --git a/Documentation/nvme-micron-clear-pcie-errors.1 b/Documentation/nvme-micron-clear-pcie-errors.1 index 495b63aaf2..551aae07f9 100644 --- a/Documentation/nvme-micron-clear-pcie-errors.1 +++ b/Documentation/nvme-micron-clear-pcie-errors.1 @@ -2,12 +2,12 @@ .\" Title: nvme-micron-clear-pcie-errors .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-MICRON\-CLEAR\" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-MICRON\-CLEAR\" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-micron-clear-pcie-errors.html b/Documentation/nvme-micron-clear-pcie-errors.html index 6d9defbfc8..e91c06161b 100644 --- a/Documentation/nvme-micron-clear-pcie-errors.html +++ b/Documentation/nvme-micron-clear-pcie-errors.html @@ -798,7 +798,7 @@

NVME

diff --git a/Documentation/nvme-micron-internal-log.1 b/Documentation/nvme-micron-internal-log.1 index 32fa2b088f..a1cfc9c340 100644 --- a/Documentation/nvme-micron-internal-log.1 +++ b/Documentation/nvme-micron-internal-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-micron-internal-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-MICRON\-INTERN" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-MICRON\-INTERN" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-micron-internal-log.html b/Documentation/nvme-micron-internal-log.html index 891b7aabe0..fae6d57f02 100644 --- a/Documentation/nvme-micron-internal-log.html +++ b/Documentation/nvme-micron-internal-log.html @@ -814,7 +814,7 @@

NVME

diff --git a/Documentation/nvme-micron-nand-stats.1 b/Documentation/nvme-micron-nand-stats.1 index b286941c53..95d3fe136f 100644 --- a/Documentation/nvme-micron-nand-stats.1 +++ b/Documentation/nvme-micron-nand-stats.1 @@ -2,12 +2,12 @@ .\" Title: nvme-micron-nand-stats .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-MICRON\-NAND\-" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-MICRON\-NAND\-" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-micron-nand-stats.html b/Documentation/nvme-micron-nand-stats.html index f0fbc1d67c..6d1ec6789d 100644 --- a/Documentation/nvme-micron-nand-stats.html +++ b/Documentation/nvme-micron-nand-stats.html @@ -799,7 +799,7 @@

NVME

diff --git a/Documentation/nvme-micron-pcie-stats.1 b/Documentation/nvme-micron-pcie-stats.1 index 20ffe04880..fd736d48d9 100644 --- a/Documentation/nvme-micron-pcie-stats.1 +++ b/Documentation/nvme-micron-pcie-stats.1 @@ -2,12 +2,12 @@ .\" Title: nvme-micron-pcie-stats .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-MICRON\-PCIE\-" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-MICRON\-PCIE\-" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-micron-pcie-stats.html b/Documentation/nvme-micron-pcie-stats.html index a6dacd514d..4002edf7b2 100644 --- a/Documentation/nvme-micron-pcie-stats.html +++ b/Documentation/nvme-micron-pcie-stats.html @@ -799,7 +799,7 @@

NVME

diff --git a/Documentation/nvme-micron-selective-download.1 b/Documentation/nvme-micron-selective-download.1 index a0f72f10f4..4478040198 100644 --- a/Documentation/nvme-micron-selective-download.1 +++ b/Documentation/nvme-micron-selective-download.1 @@ -2,12 +2,12 @@ .\" Title: nvme-micron-selective-download .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-MICRON\-SELECT" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-MICRON\-SELECT" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-micron-selective-download.html b/Documentation/nvme-micron-selective-download.html index d904c31885..057cd28f10 100644 --- a/Documentation/nvme-micron-selective-download.html +++ b/Documentation/nvme-micron-selective-download.html @@ -869,7 +869,7 @@

NVME

diff --git a/Documentation/nvme-micron-smart-add-log.1 b/Documentation/nvme-micron-smart-add-log.1 index aa8c5fb006..fd0de1cc41 100644 --- a/Documentation/nvme-micron-smart-add-log.1 +++ b/Documentation/nvme-micron-smart-add-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-micron-smart-add-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-MICRON\-SMART\" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-MICRON\-SMART\" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-micron-smart-add-log.html b/Documentation/nvme-micron-smart-add-log.html index 92d42467cc..16c8944e41 100644 --- a/Documentation/nvme-micron-smart-add-log.html +++ b/Documentation/nvme-micron-smart-add-log.html @@ -817,7 +817,7 @@

EXAMPLES

diff --git a/Documentation/nvme-micron-temperature-stats.1 b/Documentation/nvme-micron-temperature-stats.1 index 159c7d12e8..a25b9f6421 100644 --- a/Documentation/nvme-micron-temperature-stats.1 +++ b/Documentation/nvme-micron-temperature-stats.1 @@ -2,12 +2,12 @@ .\" Title: nvme-micron-temperature-stats .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-MICRON\-TEMPER" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-MICRON\-TEMPER" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-micron-temperature-stats.html b/Documentation/nvme-micron-temperature-stats.html index 67de4f8fbd..2bb5caac0a 100644 --- a/Documentation/nvme-micron-temperature-stats.html +++ b/Documentation/nvme-micron-temperature-stats.html @@ -799,7 +799,7 @@

NVME

diff --git a/Documentation/nvme-netapp-ontapdevices.1 b/Documentation/nvme-netapp-ontapdevices.1 index bbb602be99..cff7abb9dc 100644 --- a/Documentation/nvme-netapp-ontapdevices.1 +++ b/Documentation/nvme-netapp-ontapdevices.1 @@ -2,12 +2,12 @@ .\" Title: nvme-netapp-ontapdevices .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-NETAPP\-ONTAPD" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-NETAPP\-ONTAPD" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-netapp-ontapdevices.html b/Documentation/nvme-netapp-ontapdevices.html index 2d843be6ef..0a54b0b317 100644 --- a/Documentation/nvme-netapp-ontapdevices.html +++ b/Documentation/nvme-netapp-ontapdevices.html @@ -807,7 +807,7 @@

NVME

diff --git a/Documentation/nvme-netapp-smdevices.1 b/Documentation/nvme-netapp-smdevices.1 index a7da4f0154..1fba6f34e2 100644 --- a/Documentation/nvme-netapp-smdevices.1 +++ b/Documentation/nvme-netapp-smdevices.1 @@ -2,12 +2,12 @@ .\" Title: nvme-netapp-smdevices .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-NETAPP\-SMDEVI" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-NETAPP\-SMDEVI" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-netapp-smdevices.html b/Documentation/nvme-netapp-smdevices.html index 754f0aaf8a..cf39fce8b4 100644 --- a/Documentation/nvme-netapp-smdevices.html +++ b/Documentation/nvme-netapp-smdevices.html @@ -809,7 +809,7 @@

NVME

diff --git a/Documentation/nvme-ns-descs.1 b/Documentation/nvme-ns-descs.1 index 8899d534ab..ef540b9692 100644 --- a/Documentation/nvme-ns-descs.1 +++ b/Documentation/nvme-ns-descs.1 @@ -2,12 +2,12 @@ .\" Title: nvme-ns-descs .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-NS\-DESCS" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-NS\-DESCS" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-ns-descs.html b/Documentation/nvme-ns-descs.html index a9623862ce..a80e751095 100644 --- a/Documentation/nvme-ns-descs.html +++ b/Documentation/nvme-ns-descs.html @@ -867,7 +867,7 @@

NVME

diff --git a/Documentation/nvme-ns-rescan.1 b/Documentation/nvme-ns-rescan.1 index f9feaaa661..8c5c73793a 100644 --- a/Documentation/nvme-ns-rescan.1 +++ b/Documentation/nvme-ns-rescan.1 @@ -2,12 +2,12 @@ .\" Title: nvme-ns-rescan .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-NS\-RESCAN" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-NS\-RESCAN" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-ns-rescan.html b/Documentation/nvme-ns-rescan.html index 5a45a52d24..2588877381 100644 --- a/Documentation/nvme-ns-rescan.html +++ b/Documentation/nvme-ns-rescan.html @@ -818,7 +818,7 @@

NVME

diff --git a/Documentation/nvme-nvm-id-ctrl.1 b/Documentation/nvme-nvm-id-ctrl.1 index db81501a05..a027a17db4 100644 --- a/Documentation/nvme-nvm-id-ctrl.1 +++ b/Documentation/nvme-nvm-id-ctrl.1 @@ -2,12 +2,12 @@ .\" Title: nvme-nvm-id-ctrl .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-NVM\-ID\-CTRL" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-NVM\-ID\-CTRL" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-nvm-id-ctrl.html b/Documentation/nvme-nvm-id-ctrl.html index 9c9f4fcbb5..b16d440742 100644 --- a/Documentation/nvme-nvm-id-ctrl.html +++ b/Documentation/nvme-nvm-id-ctrl.html @@ -832,7 +832,7 @@

NVME

diff --git a/Documentation/nvme-nvme-mi-recv.1 b/Documentation/nvme-nvme-mi-recv.1 index 189a8a2315..7e0368cb39 100644 --- a/Documentation/nvme-nvme-mi-recv.1 +++ b/Documentation/nvme-nvme-mi-recv.1 @@ -2,12 +2,12 @@ .\" Title: nvme-nvme-mi-recv .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-NVME\-MI\-RECV" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-NVME\-MI\-RECV" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-nvme-mi-recv.html b/Documentation/nvme-nvme-mi-recv.html index 5be0b28dc2..6a30a20289 100644 --- a/Documentation/nvme-nvme-mi-recv.html +++ b/Documentation/nvme-nvme-mi-recv.html @@ -905,7 +905,7 @@

NVME

diff --git a/Documentation/nvme-nvme-mi-send.1 b/Documentation/nvme-nvme-mi-send.1 index a6c5f9abd2..ae273de503 100644 --- a/Documentation/nvme-nvme-mi-send.1 +++ b/Documentation/nvme-nvme-mi-send.1 @@ -2,12 +2,12 @@ .\" Title: nvme-nvme-mi-send .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-NVME\-MI\-SEND" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-NVME\-MI\-SEND" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-nvme-mi-send.html b/Documentation/nvme-nvme-mi-send.html index 069011e378..0fd94b0c03 100644 --- a/Documentation/nvme-nvme-mi-send.html +++ b/Documentation/nvme-nvme-mi-send.html @@ -905,7 +905,7 @@

NVME

diff --git a/Documentation/nvme-ocp-clear-fw-activate-history.1 b/Documentation/nvme-ocp-clear-fw-activate-history.1 index 70738feddc..f6ccd4b520 100644 --- a/Documentation/nvme-ocp-clear-fw-activate-history.1 +++ b/Documentation/nvme-ocp-clear-fw-activate-history.1 @@ -2,12 +2,12 @@ .\" Title: nvme-ocp-clear-fw-activate-history .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-OCP\-CLEAR\-FW" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-OCP\-CLEAR\-FW" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-ocp-clear-fw-activate-history.html b/Documentation/nvme-ocp-clear-fw-activate-history.html index 41f71a8140..29e8be6f52 100644 --- a/Documentation/nvme-ocp-clear-fw-activate-history.html +++ b/Documentation/nvme-ocp-clear-fw-activate-history.html @@ -817,7 +817,7 @@

NVME

diff --git a/Documentation/nvme-ocp-clear-pcie-correctable-error-counters.1 b/Documentation/nvme-ocp-clear-pcie-correctable-error-counters.1 index 60ca92eefe..4d73d9908c 100644 --- a/Documentation/nvme-ocp-clear-pcie-correctable-error-counters.1 +++ b/Documentation/nvme-ocp-clear-pcie-correctable-error-counters.1 @@ -2,12 +2,12 @@ .\" Title: nvme-ocp-clear-pcie-correctable-error-counters .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-OCP\-CLEAR\-PC" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-OCP\-CLEAR\-PC" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-ocp-clear-pcie-correctable-error-counters.html b/Documentation/nvme-ocp-clear-pcie-correctable-error-counters.html index 50a9648f7e..92cfa7ada3 100644 --- a/Documentation/nvme-ocp-clear-pcie-correctable-error-counters.html +++ b/Documentation/nvme-ocp-clear-pcie-correctable-error-counters.html @@ -817,7 +817,7 @@

NVME

diff --git a/Documentation/nvme-ocp-device-capability-log.1 b/Documentation/nvme-ocp-device-capability-log.1 index 36a2b82844..4dd8535baa 100644 --- a/Documentation/nvme-ocp-device-capability-log.1 +++ b/Documentation/nvme-ocp-device-capability-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-ocp-device-capability-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-OCP\-DEVICE\-C" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-OCP\-DEVICE\-C" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-ocp-device-capability-log.html b/Documentation/nvme-ocp-device-capability-log.html index 06bf894c34..5f4fcafc8b 100644 --- a/Documentation/nvme-ocp-device-capability-log.html +++ b/Documentation/nvme-ocp-device-capability-log.html @@ -811,7 +811,7 @@

NVME

diff --git a/Documentation/nvme-ocp-eol-plp-failure-mode.1 b/Documentation/nvme-ocp-eol-plp-failure-mode.1 index 823efce123..95959ca0de 100644 --- a/Documentation/nvme-ocp-eol-plp-failure-mode.1 +++ b/Documentation/nvme-ocp-eol-plp-failure-mode.1 @@ -2,12 +2,12 @@ .\" Title: nvme-ocp-eol-plp-failure-mode .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-OCP\-EOL\-PLP\" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-OCP\-EOL\-PLP\" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-ocp-eol-plp-failure-mode.html b/Documentation/nvme-ocp-eol-plp-failure-mode.html index 6b404334c8..1057ab7645 100644 --- a/Documentation/nvme-ocp-eol-plp-failure-mode.html +++ b/Documentation/nvme-ocp-eol-plp-failure-mode.html @@ -886,7 +886,7 @@

NVME

diff --git a/Documentation/nvme-ocp-error-recovery-log.1 b/Documentation/nvme-ocp-error-recovery-log.1 index 512bf9ecaf..0a9feadcce 100644 --- a/Documentation/nvme-ocp-error-recovery-log.1 +++ b/Documentation/nvme-ocp-error-recovery-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-ocp-error-recovery-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-OCP\-ERROR\-RE" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-OCP\-ERROR\-RE" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-ocp-error-recovery-log.html b/Documentation/nvme-ocp-error-recovery-log.html index 690a179dc0..6a0dba0a8f 100644 --- a/Documentation/nvme-ocp-error-recovery-log.html +++ b/Documentation/nvme-ocp-error-recovery-log.html @@ -811,7 +811,7 @@

NVME

diff --git a/Documentation/nvme-ocp-get-dssd-async-event-config.1 b/Documentation/nvme-ocp-get-dssd-async-event-config.1 index a8424db861..857a5fed34 100644 --- a/Documentation/nvme-ocp-get-dssd-async-event-config.1 +++ b/Documentation/nvme-ocp-get-dssd-async-event-config.1 @@ -2,12 +2,12 @@ .\" Title: nvme-ocp-get-dssd-async-event-config .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-OCP\-GET\-DSSD" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-OCP\-GET\-DSSD" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-ocp-get-dssd-async-event-config.html b/Documentation/nvme-ocp-get-dssd-async-event-config.html index c3d7a96d40..e2372f1cdf 100644 --- a/Documentation/nvme-ocp-get-dssd-async-event-config.html +++ b/Documentation/nvme-ocp-get-dssd-async-event-config.html @@ -846,7 +846,7 @@

NVME

diff --git a/Documentation/nvme-ocp-get-dssd-power-state-feature.1 b/Documentation/nvme-ocp-get-dssd-power-state-feature.1 index b46e431014..8be3c017f0 100644 --- a/Documentation/nvme-ocp-get-dssd-power-state-feature.1 +++ b/Documentation/nvme-ocp-get-dssd-power-state-feature.1 @@ -2,12 +2,12 @@ .\" Title: get-dssd-power-state-feature .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "GET\-DSSD\-POWER\-ST" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "GET\-DSSD\-POWER\-ST" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-ocp-get-dssd-power-state-feature.html b/Documentation/nvme-ocp-get-dssd-power-state-feature.html index 4c09df2fff..93f94bf400 100644 --- a/Documentation/nvme-ocp-get-dssd-power-state-feature.html +++ b/Documentation/nvme-ocp-get-dssd-power-state-feature.html @@ -883,7 +883,7 @@

NVME

diff --git a/Documentation/nvme-ocp-get-plp-health-check-interval.1 b/Documentation/nvme-ocp-get-plp-health-check-interval.1 index 8fc102125d..48c6830429 100644 --- a/Documentation/nvme-ocp-get-plp-health-check-interval.1 +++ b/Documentation/nvme-ocp-get-plp-health-check-interval.1 @@ -2,12 +2,12 @@ .\" Title: nvme-ocp-get-plp-health-check-interval .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-OCP\-GET\-PLP\" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-OCP\-GET\-PLP\" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-ocp-get-plp-health-check-interval.html b/Documentation/nvme-ocp-get-plp-health-check-interval.html index f3d70b6007..241969adc5 100644 --- a/Documentation/nvme-ocp-get-plp-health-check-interval.html +++ b/Documentation/nvme-ocp-get-plp-health-check-interval.html @@ -847,7 +847,7 @@

NVME

diff --git a/Documentation/nvme-ocp-internal-log.1 b/Documentation/nvme-ocp-internal-log.1 index 2badb51c56..0e8413ac69 100644 --- a/Documentation/nvme-ocp-internal-log.1 +++ b/Documentation/nvme-ocp-internal-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-ocp-internal-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-OCP\-INTERNAL\" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-OCP\-INTERNAL\" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-ocp-internal-log.html b/Documentation/nvme-ocp-internal-log.html index 03c14734a5..b2b4ca3bc3 100644 --- a/Documentation/nvme-ocp-internal-log.html +++ b/Documentation/nvme-ocp-internal-log.html @@ -918,7 +918,7 @@

NVME

diff --git a/Documentation/nvme-ocp-latency-monitor-log.1 b/Documentation/nvme-ocp-latency-monitor-log.1 index 383a0c6f37..2fff4f84c6 100644 --- a/Documentation/nvme-ocp-latency-monitor-log.1 +++ b/Documentation/nvme-ocp-latency-monitor-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-ocp-latency-monitor-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-OCP\-LATENCY\-" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-OCP\-LATENCY\-" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-ocp-latency-monitor-log.html b/Documentation/nvme-ocp-latency-monitor-log.html index 6155a0fd3a..b271e1b6e7 100644 --- a/Documentation/nvme-ocp-latency-monitor-log.html +++ b/Documentation/nvme-ocp-latency-monitor-log.html @@ -811,7 +811,7 @@

NVME

diff --git a/Documentation/nvme-ocp-set-dssd-async-event-config.1 b/Documentation/nvme-ocp-set-dssd-async-event-config.1 index 703083772e..67c2d4417e 100644 --- a/Documentation/nvme-ocp-set-dssd-async-event-config.1 +++ b/Documentation/nvme-ocp-set-dssd-async-event-config.1 @@ -2,12 +2,12 @@ .\" Title: nvme-ocp-set-dssd-async-event-config .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-OCP\-SET\-DSSD" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-OCP\-SET\-DSSD" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-ocp-set-dssd-async-event-config.html b/Documentation/nvme-ocp-set-dssd-async-event-config.html index b726d7874b..286dc8418f 100644 --- a/Documentation/nvme-ocp-set-dssd-async-event-config.html +++ b/Documentation/nvme-ocp-set-dssd-async-event-config.html @@ -822,7 +822,7 @@

NVME

diff --git a/Documentation/nvme-ocp-set-dssd-power-state-feature.1 b/Documentation/nvme-ocp-set-dssd-power-state-feature.1 index 991d4b14b2..42341409ab 100644 --- a/Documentation/nvme-ocp-set-dssd-power-state-feature.1 +++ b/Documentation/nvme-ocp-set-dssd-power-state-feature.1 @@ -2,12 +2,12 @@ .\" Title: set-dssd-power-state-feature .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "SET\-DSSD\-POWER\-ST" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "SET\-DSSD\-POWER\-ST" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-ocp-set-dssd-power-state-feature.html b/Documentation/nvme-ocp-set-dssd-power-state-feature.html index e574361c31..7c026cff9c 100644 --- a/Documentation/nvme-ocp-set-dssd-power-state-feature.html +++ b/Documentation/nvme-ocp-set-dssd-power-state-feature.html @@ -812,7 +812,7 @@

NVME

diff --git a/Documentation/nvme-ocp-set-plp-health-check-interval.1 b/Documentation/nvme-ocp-set-plp-health-check-interval.1 index 4f65e5650a..b34834f53c 100644 --- a/Documentation/nvme-ocp-set-plp-health-check-interval.1 +++ b/Documentation/nvme-ocp-set-plp-health-check-interval.1 @@ -2,12 +2,12 @@ .\" Title: nvme-ocp-set-plp-health-check-interval .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-OCP\-SET\-PLP\" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-OCP\-SET\-PLP\" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-ocp-set-plp-health-check-interval.html b/Documentation/nvme-ocp-set-plp-health-check-interval.html index fb9fe70d32..168bd20f27 100644 --- a/Documentation/nvme-ocp-set-plp-health-check-interval.html +++ b/Documentation/nvme-ocp-set-plp-health-check-interval.html @@ -834,7 +834,7 @@

NVME

diff --git a/Documentation/nvme-ocp-set-telemetry-profile.1 b/Documentation/nvme-ocp-set-telemetry-profile.1 index 020d38aefa..74be43550a 100644 --- a/Documentation/nvme-ocp-set-telemetry-profile.1 +++ b/Documentation/nvme-ocp-set-telemetry-profile.1 @@ -2,12 +2,12 @@ .\" Title: nvme-ocp-set-telemetry-profile .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-OCP\-SET\-TELE" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-OCP\-SET\-TELE" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-ocp-set-telemetry-profile.html b/Documentation/nvme-ocp-set-telemetry-profile.html index 9fff1ac54f..06e297de96 100644 --- a/Documentation/nvme-ocp-set-telemetry-profile.html +++ b/Documentation/nvme-ocp-set-telemetry-profile.html @@ -812,7 +812,7 @@

NVME

diff --git a/Documentation/nvme-ocp-smart-add-log.1 b/Documentation/nvme-ocp-smart-add-log.1 index ce480cfb6c..0de19c0c93 100644 --- a/Documentation/nvme-ocp-smart-add-log.1 +++ b/Documentation/nvme-ocp-smart-add-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-ocp-smart-add-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-OCP\-SMART\-AD" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-OCP\-SMART\-AD" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-ocp-smart-add-log.html b/Documentation/nvme-ocp-smart-add-log.html index e9d39afa1e..a7c610bf3a 100644 --- a/Documentation/nvme-ocp-smart-add-log.html +++ b/Documentation/nvme-ocp-smart-add-log.html @@ -812,7 +812,7 @@

NVME

diff --git a/Documentation/nvme-ocp-telemetry-string-log-page.1 b/Documentation/nvme-ocp-telemetry-string-log-page.1 index cb2c14bd6c..934d7d6170 100644 --- a/Documentation/nvme-ocp-telemetry-string-log-page.1 +++ b/Documentation/nvme-ocp-telemetry-string-log-page.1 @@ -2,12 +2,12 @@ .\" Title: nvme-ocp-telemetry-string-log-page .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-OCP\-TELEMETRY" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-OCP\-TELEMETRY" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-ocp-telemetry-string-log-page.html b/Documentation/nvme-ocp-telemetry-string-log-page.html index c67135ed26..7c0ddb7c74 100644 --- a/Documentation/nvme-ocp-telemetry-string-log-page.html +++ b/Documentation/nvme-ocp-telemetry-string-log-page.html @@ -811,7 +811,7 @@

NVME

diff --git a/Documentation/nvme-ocp-unsupported-reqs-log.1 b/Documentation/nvme-ocp-unsupported-reqs-log.1 index e3d633c66b..94dc062278 100644 --- a/Documentation/nvme-ocp-unsupported-reqs-log.1 +++ b/Documentation/nvme-ocp-unsupported-reqs-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-ocp-unsupported-reqs-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-OCP\-UNSUPPORT" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-OCP\-UNSUPPORT" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-ocp-unsupported-reqs-log.html b/Documentation/nvme-ocp-unsupported-reqs-log.html new file mode 100644 index 0000000000..60dd359baa --- /dev/null +++ b/Documentation/nvme-ocp-unsupported-reqs-log.html @@ -0,0 +1,819 @@ + + + + + + +nvme-ocp-unsupported-reqs-log(1) + + + + + +
+
+

SYNOPSIS

+
+
+
nvme ocp unsupported-reqs-log <device> [--output-format=<fmt> | -o <fmt>]
+
+
+
+
+
+

DESCRIPTION

+
+

For the NVMe device given, send a unsupported-reqs-log command and +provide the unsupported requirements log page.

+

The <device> parameter is mandatory and may be either the NVMe character +device (ex: /dev/nvme0) or block device (ex: /dev/nvme0n1).

+

This will only work on OCP compliant devices supporting this feature. +Results for any other device are undefined.

+

On success it returns 0, error code otherwise.

+
+
+
+

OPTIONS

+
+
+
+-o <fmt> +
+
+--output-format=<fmt> +
+
+

+ This option will set the reporting format to normal, json, or binary. + Only one output format can be used at a time. +

+
+
+
+
+
+

EXAMPLES

+
+
    +
  • +

    +Has the program issue a unsupported-reqs-log command to retrieve the 0xC5 log page. +

    +
    +
    +
    # nvme ocp unsupported-reqs-log /dev/nvme0
    +
    +
  • +
+
+
+
+

NVME

+
+

Part of the nvme-user suite

+
+
+
+

+ + + diff --git a/Documentation/nvme-persistent-event-log.1 b/Documentation/nvme-persistent-event-log.1 index 15db44b92c..b1966af51e 100644 --- a/Documentation/nvme-persistent-event-log.1 +++ b/Documentation/nvme-persistent-event-log.1 @@ -2,12 +2,12 @@ .\" Title: persistent-event-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "PERSISTENT\-EVENT\-L" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "PERSISTENT\-EVENT\-L" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-persistent-event-log.html b/Documentation/nvme-persistent-event-log.html index 8b2b765f7b..613937177f 100644 --- a/Documentation/nvme-persistent-event-log.html +++ b/Documentation/nvme-persistent-event-log.html @@ -877,7 +877,7 @@

NVME

diff --git a/Documentation/nvme-pred-lat-event-agg-log.1 b/Documentation/nvme-pred-lat-event-agg-log.1 index a534b443f1..0e6d9136c1 100644 --- a/Documentation/nvme-pred-lat-event-agg-log.1 +++ b/Documentation/nvme-pred-lat-event-agg-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-pred-lat-event-agg-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-PRED\-LAT\-EVE" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-PRED\-LAT\-EVE" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-pred-lat-event-agg-log.html b/Documentation/nvme-pred-lat-event-agg-log.html index bf098fe8b3..3823cda89e 100644 --- a/Documentation/nvme-pred-lat-event-agg-log.html +++ b/Documentation/nvme-pred-lat-event-agg-log.html @@ -864,7 +864,7 @@

NVME

diff --git a/Documentation/nvme-predictable-lat-log.1 b/Documentation/nvme-predictable-lat-log.1 index d58b42a9be..7e58674900 100644 --- a/Documentation/nvme-predictable-lat-log.1 +++ b/Documentation/nvme-predictable-lat-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-predictable-lat-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-PREDICTABLE\-L" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-PREDICTABLE\-L" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-predictable-lat-log.html b/Documentation/nvme-predictable-lat-log.html index eb6e97f290..6f92f2a286 100644 --- a/Documentation/nvme-predictable-lat-log.html +++ b/Documentation/nvme-predictable-lat-log.html @@ -861,7 +861,7 @@

NVME

diff --git a/Documentation/nvme-primary-ctrl-caps.1 b/Documentation/nvme-primary-ctrl-caps.1 index f30f05b3e9..318e223516 100644 --- a/Documentation/nvme-primary-ctrl-caps.1 +++ b/Documentation/nvme-primary-ctrl-caps.1 @@ -2,12 +2,12 @@ .\" Title: nvme-primary-ctrl-caps .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-PRIMARY\-CTRL\" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-PRIMARY\-CTRL\" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-primary-ctrl-caps.html b/Documentation/nvme-primary-ctrl-caps.html index a532e5a4ea..5459747ae3 100644 --- a/Documentation/nvme-primary-ctrl-caps.html +++ b/Documentation/nvme-primary-ctrl-caps.html @@ -846,7 +846,7 @@

NVME

diff --git a/Documentation/nvme-read.1 b/Documentation/nvme-read.1 index 7f81950c33..5e8f900daf 100644 --- a/Documentation/nvme-read.1 +++ b/Documentation/nvme-read.1 @@ -2,12 +2,12 @@ .\" Title: nvme-read .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-READ" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-READ" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-read.html b/Documentation/nvme-read.html index 4b1dec70c6..033ca3e99d 100644 --- a/Documentation/nvme-read.html +++ b/Documentation/nvme-read.html @@ -1096,7 +1096,7 @@

NVME

diff --git a/Documentation/nvme-reset.1 b/Documentation/nvme-reset.1 index da435472a6..3a5ddb7be6 100644 --- a/Documentation/nvme-reset.1 +++ b/Documentation/nvme-reset.1 @@ -2,12 +2,12 @@ .\" Title: nvme-reset .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-RESET" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-RESET" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-reset.html b/Documentation/nvme-reset.html index e72e6aea34..8b4f205b9f 100644 --- a/Documentation/nvme-reset.html +++ b/Documentation/nvme-reset.html @@ -818,7 +818,7 @@

NVME

diff --git a/Documentation/nvme-resv-acquire.1 b/Documentation/nvme-resv-acquire.1 index 807c7c2ab2..2864b66106 100644 --- a/Documentation/nvme-resv-acquire.1 +++ b/Documentation/nvme-resv-acquire.1 @@ -2,12 +2,12 @@ .\" Title: nvme-resv-acquire .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-RESV\-ACQUIRE" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-RESV\-ACQUIRE" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-resv-acquire.html b/Documentation/nvme-resv-acquire.html index f340d1492c..7ba956a954 100644 --- a/Documentation/nvme-resv-acquire.html +++ b/Documentation/nvme-resv-acquire.html @@ -980,7 +980,7 @@

NVME

diff --git a/Documentation/nvme-resv-notif-log.1 b/Documentation/nvme-resv-notif-log.1 index 4462df016b..3df7cba8a3 100644 --- a/Documentation/nvme-resv-notif-log.1 +++ b/Documentation/nvme-resv-notif-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-resv-notif-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-RESV\-NOTIF\-L" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-RESV\-NOTIF\-L" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-resv-notif-log.html b/Documentation/nvme-resv-notif-log.html index b39e9ea9e3..8d36930758 100644 --- a/Documentation/nvme-resv-notif-log.html +++ b/Documentation/nvme-resv-notif-log.html @@ -833,7 +833,7 @@

NVME

diff --git a/Documentation/nvme-resv-register.1 b/Documentation/nvme-resv-register.1 index c637055a6f..ee2e687fb2 100644 --- a/Documentation/nvme-resv-register.1 +++ b/Documentation/nvme-resv-register.1 @@ -2,12 +2,12 @@ .\" Title: nvme-resv-register .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-RESV\-REGISTER" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-RESV\-REGISTER" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-resv-register.html b/Documentation/nvme-resv-register.html index 2390da590d..c5892e50f5 100644 --- a/Documentation/nvme-resv-register.html +++ b/Documentation/nvme-resv-register.html @@ -972,7 +972,7 @@

NVME

diff --git a/Documentation/nvme-resv-release.1 b/Documentation/nvme-resv-release.1 index aa969452fb..710555570c 100644 --- a/Documentation/nvme-resv-release.1 +++ b/Documentation/nvme-resv-release.1 @@ -2,12 +2,12 @@ .\" Title: nvme-resv-release .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-RESV\-RELEASE" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-RESV\-RELEASE" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-resv-release.html b/Documentation/nvme-resv-release.html index b3b10e3957..ca7f39abd1 100644 --- a/Documentation/nvme-resv-release.html +++ b/Documentation/nvme-resv-release.html @@ -962,7 +962,7 @@

NVME

diff --git a/Documentation/nvme-resv-report.1 b/Documentation/nvme-resv-report.1 index bc94471d4c..2c8d8986b5 100644 --- a/Documentation/nvme-resv-report.1 +++ b/Documentation/nvme-resv-report.1 @@ -2,12 +2,12 @@ .\" Title: nvme-resv-report .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-RESV\-REPORT" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-RESV\-REPORT" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-resv-report.html b/Documentation/nvme-resv-report.html index d4bfabca48..a9ad343c6a 100644 --- a/Documentation/nvme-resv-report.html +++ b/Documentation/nvme-resv-report.html @@ -877,7 +877,7 @@

NVME

diff --git a/Documentation/nvme-rpmb.1 b/Documentation/nvme-rpmb.1 index ef6fd99a29..71fa72a3e0 100644 --- a/Documentation/nvme-rpmb.1 +++ b/Documentation/nvme-rpmb.1 @@ -2,12 +2,12 @@ .\" Title: nvme-rpmb .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-RPMB" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-RPMB" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-rpmb.html b/Documentation/nvme-rpmb.html index 46f6b5b1cd..b8c4d4b536 100644 --- a/Documentation/nvme-rpmb.html +++ b/Documentation/nvme-rpmb.html @@ -1024,7 +1024,7 @@

NVME

diff --git a/Documentation/nvme-sanitize-log.1 b/Documentation/nvme-sanitize-log.1 index afbe322e16..798a92cdd9 100644 --- a/Documentation/nvme-sanitize-log.1 +++ b/Documentation/nvme-sanitize-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-sanitize-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SANITIZE\-LOG" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SANITIZE\-LOG" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-sanitize-log.html b/Documentation/nvme-sanitize-log.html index 41d2e12f1b..db6cdf0454 100644 --- a/Documentation/nvme-sanitize-log.html +++ b/Documentation/nvme-sanitize-log.html @@ -903,7 +903,7 @@

NVME

diff --git a/Documentation/nvme-sanitize.1 b/Documentation/nvme-sanitize.1 index 18dc1424a2..1e25b2359a 100644 --- a/Documentation/nvme-sanitize.1 +++ b/Documentation/nvme-sanitize.1 @@ -2,12 +2,12 @@ .\" Title: nvme-sanitize .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SANITIZE" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SANITIZE" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-sanitize.html b/Documentation/nvme-sanitize.html index d67d6c4660..dbdf1f6ef0 100644 --- a/Documentation/nvme-sanitize.html +++ b/Documentation/nvme-sanitize.html @@ -960,7 +960,7 @@

NVME

diff --git a/Documentation/nvme-seagate-clear-fw-activate-history.1 b/Documentation/nvme-seagate-clear-fw-activate-history.1 index d5c4c7dfc1..25c516cc5e 100644 --- a/Documentation/nvme-seagate-clear-fw-activate-history.1 +++ b/Documentation/nvme-seagate-clear-fw-activate-history.1 @@ -2,12 +2,12 @@ .\" Title: nvme-seagate-clear-fw-activate-history .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SEAGATE\-CLEAR" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SEAGATE\-CLEAR" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-seagate-clear-fw-activate-history.html b/Documentation/nvme-seagate-clear-fw-activate-history.html index df962d3bf1..88c5fd7f7c 100644 --- a/Documentation/nvme-seagate-clear-fw-activate-history.html +++ b/Documentation/nvme-seagate-clear-fw-activate-history.html @@ -792,7 +792,7 @@

NVME

diff --git a/Documentation/nvme-seagate-clear-pcie-correctable-errors.1 b/Documentation/nvme-seagate-clear-pcie-correctable-errors.1 index 88c2aa7634..35f5af0cdc 100644 --- a/Documentation/nvme-seagate-clear-pcie-correctable-errors.1 +++ b/Documentation/nvme-seagate-clear-pcie-correctable-errors.1 @@ -2,12 +2,12 @@ .\" Title: nvme-seagate-clear-pcie-correctable-errors .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SEAGATE\-CLEAR" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SEAGATE\-CLEAR" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-seagate-clear-pcie-correctable-errors.html b/Documentation/nvme-seagate-clear-pcie-correctable-errors.html index 3803032db4..587cfd51a3 100644 --- a/Documentation/nvme-seagate-clear-pcie-correctable-errors.html +++ b/Documentation/nvme-seagate-clear-pcie-correctable-errors.html @@ -802,7 +802,7 @@

NVME

diff --git a/Documentation/nvme-seagate-cloud-SSD-plugin-version.1 b/Documentation/nvme-seagate-cloud-SSD-plugin-version.1 index 9f3d024c0e..544ecaddae 100644 --- a/Documentation/nvme-seagate-cloud-SSD-plugin-version.1 +++ b/Documentation/nvme-seagate-cloud-SSD-plugin-version.1 @@ -2,12 +2,12 @@ .\" Title: nvme-seagate-cloud-SSD-plugin-version .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SEAGATE\-CLOUD" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SEAGATE\-CLOUD" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-seagate-cloud-SSD-plugin-version.html b/Documentation/nvme-seagate-cloud-SSD-plugin-version.html index 604cd6b5dc..97c96a56d5 100644 --- a/Documentation/nvme-seagate-cloud-SSD-plugin-version.html +++ b/Documentation/nvme-seagate-cloud-SSD-plugin-version.html @@ -787,7 +787,7 @@

NVME

diff --git a/Documentation/nvme-seagate-get-ctrl-tele.1 b/Documentation/nvme-seagate-get-ctrl-tele.1 index 531fd921c3..701821036d 100644 --- a/Documentation/nvme-seagate-get-ctrl-tele.1 +++ b/Documentation/nvme-seagate-get-ctrl-tele.1 @@ -2,12 +2,12 @@ .\" Title: nvme-seagate-get-ctrl-tele .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SEAGATE\-GET\-" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SEAGATE\-GET\-" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-seagate-get-ctrl-tele.html b/Documentation/nvme-seagate-get-ctrl-tele.html index db21dc83ce..999558d626 100644 --- a/Documentation/nvme-seagate-get-ctrl-tele.html +++ b/Documentation/nvme-seagate-get-ctrl-tele.html @@ -813,7 +813,7 @@

NVME

diff --git a/Documentation/nvme-seagate-get-host-tele.1 b/Documentation/nvme-seagate-get-host-tele.1 index 41151626bb..a0f47dcabe 100644 --- a/Documentation/nvme-seagate-get-host-tele.1 +++ b/Documentation/nvme-seagate-get-host-tele.1 @@ -2,12 +2,12 @@ .\" Title: nvme-seagate-get-host-tele .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SEAGATE\-GET\-" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SEAGATE\-GET\-" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-seagate-get-host-tele.html b/Documentation/nvme-seagate-get-host-tele.html index f6142e3f72..6c3e69df1c 100644 --- a/Documentation/nvme-seagate-get-host-tele.html +++ b/Documentation/nvme-seagate-get-host-tele.html @@ -826,7 +826,7 @@

NVME

diff --git a/Documentation/nvme-seagate-help.1 b/Documentation/nvme-seagate-help.1 index ace139069e..95835dc6c4 100644 --- a/Documentation/nvme-seagate-help.1 +++ b/Documentation/nvme-seagate-help.1 @@ -2,12 +2,12 @@ .\" Title: nvme-seagate-help .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SEAGATE\-HELP" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SEAGATE\-HELP" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-seagate-help.html b/Documentation/nvme-seagate-help.html index 6a2e1e3542..9471fd67ec 100644 --- a/Documentation/nvme-seagate-help.html +++ b/Documentation/nvme-seagate-help.html @@ -812,7 +812,7 @@

NVME

diff --git a/Documentation/nvme-seagate-plugin-version.1 b/Documentation/nvme-seagate-plugin-version.1 index 826995e109..ad66a4a5d7 100644 --- a/Documentation/nvme-seagate-plugin-version.1 +++ b/Documentation/nvme-seagate-plugin-version.1 @@ -2,12 +2,12 @@ .\" Title: nvme-seagate-plugin-version .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SEAGATE\-PLUGI" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SEAGATE\-PLUGI" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-seagate-plugin-version.html b/Documentation/nvme-seagate-plugin-version.html index 8c0aad4ce7..796974adfa 100644 --- a/Documentation/nvme-seagate-plugin-version.html +++ b/Documentation/nvme-seagate-plugin-version.html @@ -787,7 +787,7 @@

NVME

diff --git a/Documentation/nvme-seagate-version.1 b/Documentation/nvme-seagate-version.1 index 4667dcb388..53984760f6 100644 --- a/Documentation/nvme-seagate-version.1 +++ b/Documentation/nvme-seagate-version.1 @@ -2,12 +2,12 @@ .\" Title: nvme-seagate-version .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SEAGATE\-VERSI" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SEAGATE\-VERSI" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-seagate-version.html b/Documentation/nvme-seagate-version.html index 1f5ef6d7a0..16a951081a 100644 --- a/Documentation/nvme-seagate-version.html +++ b/Documentation/nvme-seagate-version.html @@ -787,7 +787,7 @@

NVME

diff --git a/Documentation/nvme-seagate-vs-fw-activate-history.1 b/Documentation/nvme-seagate-vs-fw-activate-history.1 index ecf1c02670..8770fc2108 100644 --- a/Documentation/nvme-seagate-vs-fw-activate-history.1 +++ b/Documentation/nvme-seagate-vs-fw-activate-history.1 @@ -2,12 +2,12 @@ .\" Title: nvme-seagate-vs-fw-activate-history .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SEAGATE\-VS\-F" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SEAGATE\-VS\-F" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-seagate-vs-fw-activate-history.html b/Documentation/nvme-seagate-vs-fw-activate-history.html index 0fd29fe64d..b008b3cde9 100644 --- a/Documentation/nvme-seagate-vs-fw-activate-history.html +++ b/Documentation/nvme-seagate-vs-fw-activate-history.html @@ -813,7 +813,7 @@

NVME

diff --git a/Documentation/nvme-seagate-vs-internal-log.1 b/Documentation/nvme-seagate-vs-internal-log.1 index eee0dcecaa..74dd1d8966 100644 --- a/Documentation/nvme-seagate-vs-internal-log.1 +++ b/Documentation/nvme-seagate-vs-internal-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-seagate-vs-internal-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SEAGATE\-VS\-I" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SEAGATE\-VS\-I" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-seagate-vs-internal-log.html b/Documentation/nvme-seagate-vs-internal-log.html index 5cec2a78c2..a7b3c67e34 100644 --- a/Documentation/nvme-seagate-vs-internal-log.html +++ b/Documentation/nvme-seagate-vs-internal-log.html @@ -814,7 +814,7 @@

NVME

diff --git a/Documentation/nvme-seagate-vs-log-page-sup.1 b/Documentation/nvme-seagate-vs-log-page-sup.1 index 1aff60ad1d..33e52fc042 100644 --- a/Documentation/nvme-seagate-vs-log-page-sup.1 +++ b/Documentation/nvme-seagate-vs-log-page-sup.1 @@ -2,12 +2,12 @@ .\" Title: nvme-seagate-vs-log-page-sup .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SEAGATE\-VS\-L" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SEAGATE\-VS\-L" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-seagate-vs-log-page-sup.html b/Documentation/nvme-seagate-vs-log-page-sup.html index 133b179ae5..45d1e46026 100644 --- a/Documentation/nvme-seagate-vs-log-page-sup.html +++ b/Documentation/nvme-seagate-vs-log-page-sup.html @@ -814,7 +814,7 @@

NVME

diff --git a/Documentation/nvme-seagate-vs-pcie-stats.1 b/Documentation/nvme-seagate-vs-pcie-stats.1 index 097e057a56..17aca8fae4 100644 --- a/Documentation/nvme-seagate-vs-pcie-stats.1 +++ b/Documentation/nvme-seagate-vs-pcie-stats.1 @@ -2,12 +2,12 @@ .\" Title: nvme-seagate-vs-pcie-stats .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SEAGATE\-VS\-P" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SEAGATE\-VS\-P" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-seagate-vs-pcie-stats.html b/Documentation/nvme-seagate-vs-pcie-stats.html index 7b249bde79..75ec980050 100644 --- a/Documentation/nvme-seagate-vs-pcie-stats.html +++ b/Documentation/nvme-seagate-vs-pcie-stats.html @@ -802,7 +802,7 @@

NVME

diff --git a/Documentation/nvme-seagate-vs-smart-add-log.1 b/Documentation/nvme-seagate-vs-smart-add-log.1 index a2c9cb2c94..97c2bfde80 100644 --- a/Documentation/nvme-seagate-vs-smart-add-log.1 +++ b/Documentation/nvme-seagate-vs-smart-add-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-seagate-vs-smart-add-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SEAGATE\-VS\-S" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SEAGATE\-VS\-S" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-seagate-vs-smart-add-log.html b/Documentation/nvme-seagate-vs-smart-add-log.html index f4864afe45..619d85a5f8 100644 --- a/Documentation/nvme-seagate-vs-smart-add-log.html +++ b/Documentation/nvme-seagate-vs-smart-add-log.html @@ -830,7 +830,7 @@

NVME

diff --git a/Documentation/nvme-seagate-vs-temperature-stats.1 b/Documentation/nvme-seagate-vs-temperature-stats.1 index 86c67df3e8..90c37e04b4 100644 --- a/Documentation/nvme-seagate-vs-temperature-stats.1 +++ b/Documentation/nvme-seagate-vs-temperature-stats.1 @@ -2,12 +2,12 @@ .\" Title: nvme-seagate-vs-temperature-stats .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SEAGATE\-VS\-T" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SEAGATE\-VS\-T" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-seagate-vs-temperature-stats.html b/Documentation/nvme-seagate-vs-temperature-stats.html index 7eef88232e..1cae57700d 100644 --- a/Documentation/nvme-seagate-vs-temperature-stats.html +++ b/Documentation/nvme-seagate-vs-temperature-stats.html @@ -802,7 +802,7 @@

NVME

diff --git a/Documentation/nvme-security-recv.1 b/Documentation/nvme-security-recv.1 index 80fdca6916..d43aa4f00b 100644 --- a/Documentation/nvme-security-recv.1 +++ b/Documentation/nvme-security-recv.1 @@ -2,12 +2,12 @@ .\" Title: nvme-security-recv .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SECURITY\-RECV" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SECURITY\-RECV" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-security-recv.html b/Documentation/nvme-security-recv.html index e282a19c3c..0943e911b7 100644 --- a/Documentation/nvme-security-recv.html +++ b/Documentation/nvme-security-recv.html @@ -918,7 +918,7 @@

NVME

diff --git a/Documentation/nvme-security-send.1 b/Documentation/nvme-security-send.1 index c2ab5a2592..4179c31f93 100644 --- a/Documentation/nvme-security-send.1 +++ b/Documentation/nvme-security-send.1 @@ -2,12 +2,12 @@ .\" Title: nvme-security-send .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SECURITY\-SEND" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SECURITY\-SEND" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-security-send.html b/Documentation/nvme-security-send.html index c9890a7210..81ce63be2e 100644 --- a/Documentation/nvme-security-send.html +++ b/Documentation/nvme-security-send.html @@ -905,7 +905,7 @@

NVME

diff --git a/Documentation/nvme-self-test-log.1 b/Documentation/nvme-self-test-log.1 index aca88a6a48..907d481c0f 100644 --- a/Documentation/nvme-self-test-log.1 +++ b/Documentation/nvme-self-test-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-self-test-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SELF\-TEST\-LO" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SELF\-TEST\-LO" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-self-test-log.html b/Documentation/nvme-self-test-log.html index 623b392756..8b2dda4dec 100644 --- a/Documentation/nvme-self-test-log.html +++ b/Documentation/nvme-self-test-log.html @@ -858,7 +858,7 @@

NVME

diff --git a/Documentation/nvme-set-feature.1 b/Documentation/nvme-set-feature.1 index fffb543736..5e48ff4247 100644 --- a/Documentation/nvme-set-feature.1 +++ b/Documentation/nvme-set-feature.1 @@ -2,12 +2,12 @@ .\" Title: nvme-set-feature .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SET\-FEATURE" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SET\-FEATURE" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-set-feature.html b/Documentation/nvme-set-feature.html index be57ed6205..28d2bdb7f7 100644 --- a/Documentation/nvme-set-feature.html +++ b/Documentation/nvme-set-feature.html @@ -946,7 +946,7 @@

NVME

diff --git a/Documentation/nvme-set-property.1 b/Documentation/nvme-set-property.1 index 377df24756..8b97dfb30d 100644 --- a/Documentation/nvme-set-property.1 +++ b/Documentation/nvme-set-property.1 @@ -2,12 +2,12 @@ .\" Title: nvme-set-property .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SET\-PROPERTY" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SET\-PROPERTY" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-set-property.html b/Documentation/nvme-set-property.html index 0be4250e32..954322ef99 100644 --- a/Documentation/nvme-set-property.html +++ b/Documentation/nvme-set-property.html @@ -843,7 +843,7 @@

NVME

diff --git a/Documentation/nvme-show-hostnqn.1 b/Documentation/nvme-show-hostnqn.1 index 04bacc7a35..15745bcea9 100644 --- a/Documentation/nvme-show-hostnqn.1 +++ b/Documentation/nvme-show-hostnqn.1 @@ -2,12 +2,12 @@ .\" Title: nvme-show-hostnqn .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SHOW\-HOSTNQN" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SHOW\-HOSTNQN" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-show-hostnqn.html b/Documentation/nvme-show-hostnqn.html index 52467a90b0..b5cadf0636 100644 --- a/Documentation/nvme-show-hostnqn.html +++ b/Documentation/nvme-show-hostnqn.html @@ -809,7 +809,7 @@

NVME

diff --git a/Documentation/nvme-show-regs.1 b/Documentation/nvme-show-regs.1 index 2453b272d9..c100298ef5 100644 --- a/Documentation/nvme-show-regs.1 +++ b/Documentation/nvme-show-regs.1 @@ -2,12 +2,12 @@ .\" Title: nvme-id-ns .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ID\-NS" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-ID\-NS" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-show-regs.html b/Documentation/nvme-show-regs.html index a629bd5876..b4439a5170 100644 --- a/Documentation/nvme-show-regs.html +++ b/Documentation/nvme-show-regs.html @@ -871,7 +871,7 @@

NVME

diff --git a/Documentation/nvme-show-topology.1 b/Documentation/nvme-show-topology.1 index 002d0558a7..8aca6d6c9a 100644 --- a/Documentation/nvme-show-topology.1 +++ b/Documentation/nvme-show-topology.1 @@ -2,12 +2,12 @@ .\" Title: nvme-show-topology .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SHOW\-TOPOLOGY" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SHOW\-TOPOLOGY" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-show-topology.html b/Documentation/nvme-show-topology.html index 805cc4d113..ee373af4af 100644 --- a/Documentation/nvme-show-topology.html +++ b/Documentation/nvme-show-topology.html @@ -845,7 +845,7 @@

NVME

diff --git a/Documentation/nvme-smart-log.1 b/Documentation/nvme-smart-log.1 index 9c03b2ee60..4132d07543 100644 --- a/Documentation/nvme-smart-log.1 +++ b/Documentation/nvme-smart-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-smart-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SMART\-LOG" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SMART\-LOG" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-smart-log.html b/Documentation/nvme-smart-log.html index 9fec87e838..858a6cf30d 100644 --- a/Documentation/nvme-smart-log.html +++ b/Documentation/nvme-smart-log.html @@ -861,7 +861,7 @@

NVME

diff --git a/Documentation/nvme-subsystem-reset.1 b/Documentation/nvme-subsystem-reset.1 index 0213d31f8f..53eeed819c 100644 --- a/Documentation/nvme-subsystem-reset.1 +++ b/Documentation/nvme-subsystem-reset.1 @@ -2,12 +2,12 @@ .\" Title: nvme-subsystem-reset .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SUBSYSTEM\-RES" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SUBSYSTEM\-RES" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-subsystem-reset.html b/Documentation/nvme-subsystem-reset.html index d88683f243..388298a1ce 100644 --- a/Documentation/nvme-subsystem-reset.html +++ b/Documentation/nvme-subsystem-reset.html @@ -819,7 +819,7 @@

NVME

diff --git a/Documentation/nvme-supported-log-pages.1 b/Documentation/nvme-supported-log-pages.1 index 790fd675ce..2d80cf9ca1 100644 --- a/Documentation/nvme-supported-log-pages.1 +++ b/Documentation/nvme-supported-log-pages.1 @@ -2,12 +2,12 @@ .\" Title: nvme-supported-log-pages .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SUPPORTED\-LOG" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SUPPORTED\-LOG" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-supported-log-pages.html b/Documentation/nvme-supported-log-pages.html index 6fb84902be..e1675565b9 100644 --- a/Documentation/nvme-supported-log-pages.html +++ b/Documentation/nvme-supported-log-pages.html @@ -813,7 +813,7 @@

NVME

diff --git a/Documentation/nvme-telemetry-log.1 b/Documentation/nvme-telemetry-log.1 index 4e3f00b594..4703d1c8aa 100644 --- a/Documentation/nvme-telemetry-log.1 +++ b/Documentation/nvme-telemetry-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-telemetry-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-TELEMETRY\-LOG" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-TELEMETRY\-LOG" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-telemetry-log.html b/Documentation/nvme-telemetry-log.html index cbb7707c5b..f34627c52d 100644 --- a/Documentation/nvme-telemetry-log.html +++ b/Documentation/nvme-telemetry-log.html @@ -862,7 +862,7 @@

NVME

diff --git a/Documentation/nvme-tls-key.1 b/Documentation/nvme-tls-key.1 index 9430e21598..97c2e7eecd 100644 --- a/Documentation/nvme-tls-key.1 +++ b/Documentation/nvme-tls-key.1 @@ -2,12 +2,12 @@ .\" Title: nvme-tls-key .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-TLS\-KEY" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-TLS\-KEY" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-tls-key.html b/Documentation/nvme-tls-key.html index 6803edf83d..6ccd3a1d42 100644 --- a/Documentation/nvme-tls-key.html +++ b/Documentation/nvme-tls-key.html @@ -951,7 +951,7 @@

NVME

diff --git a/Documentation/nvme-toshiba-clear-pcie-correctable-errors.1 b/Documentation/nvme-toshiba-clear-pcie-correctable-errors.1 index 9edac7904a..8cfa41b2e0 100644 --- a/Documentation/nvme-toshiba-clear-pcie-correctable-errors.1 +++ b/Documentation/nvme-toshiba-clear-pcie-correctable-errors.1 @@ -2,12 +2,12 @@ .\" Title: nvme-toshiba-clear-pcie-correctable-errors .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-TOSHIBA\-CLEAR" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-TOSHIBA\-CLEAR" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-toshiba-clear-pcie-correctable-errors.html b/Documentation/nvme-toshiba-clear-pcie-correctable-errors.html index 0e898533fe..5b35ad9d43 100644 --- a/Documentation/nvme-toshiba-clear-pcie-correctable-errors.html +++ b/Documentation/nvme-toshiba-clear-pcie-correctable-errors.html @@ -791,7 +791,7 @@

NVME

diff --git a/Documentation/nvme-toshiba-vs-internal-log.1 b/Documentation/nvme-toshiba-vs-internal-log.1 index 2b925018f6..73b4870e1b 100644 --- a/Documentation/nvme-toshiba-vs-internal-log.1 +++ b/Documentation/nvme-toshiba-vs-internal-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-toshiba-vs-internal-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-TOSHIBA\-VS\-I" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-TOSHIBA\-VS\-I" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-toshiba-vs-internal-log.html b/Documentation/nvme-toshiba-vs-internal-log.html index 3dc7e15f90..c6b0480623 100644 --- a/Documentation/nvme-toshiba-vs-internal-log.html +++ b/Documentation/nvme-toshiba-vs-internal-log.html @@ -837,7 +837,7 @@

NVME

diff --git a/Documentation/nvme-toshiba-vs-smart-add-log.1 b/Documentation/nvme-toshiba-vs-smart-add-log.1 index f4ea60d5d7..299da6152f 100644 --- a/Documentation/nvme-toshiba-vs-smart-add-log.1 +++ b/Documentation/nvme-toshiba-vs-smart-add-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-toshiba-vs-smart-add-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-TOSHIBA\-VS\-S" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-TOSHIBA\-VS\-S" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-toshiba-vs-smart-add-log.html b/Documentation/nvme-toshiba-vs-smart-add-log.html index 37edf9d3e5..ce97be3a7a 100644 --- a/Documentation/nvme-toshiba-vs-smart-add-log.html +++ b/Documentation/nvme-toshiba-vs-smart-add-log.html @@ -841,7 +841,7 @@

NVME

diff --git a/Documentation/nvme-transcend-badblock.1 b/Documentation/nvme-transcend-badblock.1 index 9c3c8982c3..b3e07b2587 100644 --- a/Documentation/nvme-transcend-badblock.1 +++ b/Documentation/nvme-transcend-badblock.1 @@ -2,12 +2,12 @@ .\" Title: nvme-transcend-badblock .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-TRANSCEND\-BAD" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-TRANSCEND\-BAD" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-transcend-badblock.html b/Documentation/nvme-transcend-badblock.html index 641f09426e..a0da565f63 100644 --- a/Documentation/nvme-transcend-badblock.html +++ b/Documentation/nvme-transcend-badblock.html @@ -796,7 +796,7 @@

NVME

diff --git a/Documentation/nvme-transcend-healthvalue.1 b/Documentation/nvme-transcend-healthvalue.1 index 09c0ef08b3..1176227d86 100644 --- a/Documentation/nvme-transcend-healthvalue.1 +++ b/Documentation/nvme-transcend-healthvalue.1 @@ -2,12 +2,12 @@ .\" Title: nvme-transcend-healthvalue .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-TRANSCEND\-HEA" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-TRANSCEND\-HEA" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-transcend-healthvalue.html b/Documentation/nvme-transcend-healthvalue.html index 554cc1a9fc..33482b3358 100644 --- a/Documentation/nvme-transcend-healthvalue.html +++ b/Documentation/nvme-transcend-healthvalue.html @@ -797,7 +797,7 @@

NVME

diff --git a/Documentation/nvme-verify.1 b/Documentation/nvme-verify.1 index 76343ff0a2..3976dba4cb 100644 --- a/Documentation/nvme-verify.1 +++ b/Documentation/nvme-verify.1 @@ -2,12 +2,12 @@ .\" Title: nvme-verify .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-VERIFY" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-VERIFY" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-verify.html b/Documentation/nvme-verify.html index 58c985e8d0..d213bdb8a5 100644 --- a/Documentation/nvme-verify.html +++ b/Documentation/nvme-verify.html @@ -988,7 +988,7 @@

NVME

diff --git a/Documentation/nvme-virtium-save-smart-to-vtview-log.1 b/Documentation/nvme-virtium-save-smart-to-vtview-log.1 index d1bf71bbc9..97b97ae068 100644 --- a/Documentation/nvme-virtium-save-smart-to-vtview-log.1 +++ b/Documentation/nvme-virtium-save-smart-to-vtview-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-virtium-save-smart-to-vtview-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-VIRTIUM\-SAVE\" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-VIRTIUM\-SAVE\" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-virtium-save-smart-to-vtview-log.html b/Documentation/nvme-virtium-save-smart-to-vtview-log.html index 45a2827ae6..62c36c7995 100644 --- a/Documentation/nvme-virtium-save-smart-to-vtview-log.html +++ b/Documentation/nvme-virtium-save-smart-to-vtview-log.html @@ -878,7 +878,7 @@

NVME

diff --git a/Documentation/nvme-virtium-show-identify.1 b/Documentation/nvme-virtium-show-identify.1 index 5d7d26ac97..e0ba64a035 100644 --- a/Documentation/nvme-virtium-show-identify.1 +++ b/Documentation/nvme-virtium-show-identify.1 @@ -2,12 +2,12 @@ .\" Title: nvme-virtium-show-identify .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-VIRTIUM\-SHOW\" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-VIRTIUM\-SHOW\" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-virtium-show-identify.html b/Documentation/nvme-virtium-show-identify.html index 707c0d310f..9bf1ce9865 100644 --- a/Documentation/nvme-virtium-show-identify.html +++ b/Documentation/nvme-virtium-show-identify.html @@ -798,7 +798,7 @@

NVME

diff --git a/Documentation/nvme-wdc-cap-diag.1 b/Documentation/nvme-wdc-cap-diag.1 index 64bc39b498..bada9e44d3 100644 --- a/Documentation/nvme-wdc-cap-diag.1 +++ b/Documentation/nvme-wdc-cap-diag.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-cap-diag .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-CAP\-DIAG" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-CAP\-DIAG" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-cap-diag.html b/Documentation/nvme-wdc-cap-diag.html index 23af87156b..c64c757f27 100644 --- a/Documentation/nvme-wdc-cap-diag.html +++ b/Documentation/nvme-wdc-cap-diag.html @@ -856,7 +856,7 @@

NVME

diff --git a/Documentation/nvme-wdc-capabilities.1 b/Documentation/nvme-wdc-capabilities.1 index c4e97eac11..593b5508ab 100644 --- a/Documentation/nvme-wdc-capabilities.1 +++ b/Documentation/nvme-wdc-capabilities.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-capabilities .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-CAPABILIT" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-CAPABILIT" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-capabilities.html b/Documentation/nvme-wdc-capabilities.html index ce569d5e85..7035c9972e 100644 --- a/Documentation/nvme-wdc-capabilities.html +++ b/Documentation/nvme-wdc-capabilities.html @@ -789,7 +789,7 @@

NVME

diff --git a/Documentation/nvme-wdc-clear-assert-dump.1 b/Documentation/nvme-wdc-clear-assert-dump.1 index 0336fa16fd..b2884239b3 100644 --- a/Documentation/nvme-wdc-clear-assert-dump.1 +++ b/Documentation/nvme-wdc-clear-assert-dump.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-clear-assert-dump .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-CLEAR\-AS" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-CLEAR\-AS" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-clear-assert-dump.html b/Documentation/nvme-wdc-clear-assert-dump.html index 7a710143cd..467fbc597b 100644 --- a/Documentation/nvme-wdc-clear-assert-dump.html +++ b/Documentation/nvme-wdc-clear-assert-dump.html @@ -798,7 +798,7 @@

NVME

diff --git a/Documentation/nvme-wdc-clear-fw-activate-history.1 b/Documentation/nvme-wdc-clear-fw-activate-history.1 index b567ccee3a..60f3a5ab70 100644 --- a/Documentation/nvme-wdc-clear-fw-activate-history.1 +++ b/Documentation/nvme-wdc-clear-fw-activate-history.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-clear-fw-activate-history .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-CLEAR\-FW" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-CLEAR\-FW" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-clear-fw-activate-history.html b/Documentation/nvme-wdc-clear-fw-activate-history.html index ae4dcb272a..de299f6ed4 100644 --- a/Documentation/nvme-wdc-clear-fw-activate-history.html +++ b/Documentation/nvme-wdc-clear-fw-activate-history.html @@ -797,7 +797,7 @@

NVME

diff --git a/Documentation/nvme-wdc-clear-pcie-correctable-errors.1 b/Documentation/nvme-wdc-clear-pcie-correctable-errors.1 index 37a74e829b..9502196f10 100644 --- a/Documentation/nvme-wdc-clear-pcie-correctable-errors.1 +++ b/Documentation/nvme-wdc-clear-pcie-correctable-errors.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-clear-pcie-correctable-errors .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-CLEAR\-PC" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-CLEAR\-PC" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-clear-pcie-correctable-errors.html b/Documentation/nvme-wdc-clear-pcie-correctable-errors.html index 3a7d1b6795..d5a4627a88 100644 --- a/Documentation/nvme-wdc-clear-pcie-correctable-errors.html +++ b/Documentation/nvme-wdc-clear-pcie-correctable-errors.html @@ -799,7 +799,7 @@

NVME

diff --git a/Documentation/nvme-wdc-cloud-SSD-plugin-version.1 b/Documentation/nvme-wdc-cloud-SSD-plugin-version.1 index f1e6067c6e..4e937ec0cf 100644 --- a/Documentation/nvme-wdc-cloud-SSD-plugin-version.1 +++ b/Documentation/nvme-wdc-cloud-SSD-plugin-version.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-cloud-SSD-plugin-version .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-CLOUD\-SS" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-CLOUD\-SS" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-cloud-SSD-plugin-version.html b/Documentation/nvme-wdc-cloud-SSD-plugin-version.html index d643452ad7..d730554aff 100644 --- a/Documentation/nvme-wdc-cloud-SSD-plugin-version.html +++ b/Documentation/nvme-wdc-cloud-SSD-plugin-version.html @@ -790,7 +790,7 @@

NVME

diff --git a/Documentation/nvme-wdc-cloud-boot-SSD-version.1 b/Documentation/nvme-wdc-cloud-boot-SSD-version.1 index a79cda63c5..8292946a72 100644 --- a/Documentation/nvme-wdc-cloud-boot-SSD-version.1 +++ b/Documentation/nvme-wdc-cloud-boot-SSD-version.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-cloud-boot-SSD-version .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-CLOUD\-BO" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-CLOUD\-BO" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-cloud-boot-SSD-version.html b/Documentation/nvme-wdc-cloud-boot-SSD-version.html index 8c1353ce21..e16e5774e4 100644 --- a/Documentation/nvme-wdc-cloud-boot-SSD-version.html +++ b/Documentation/nvme-wdc-cloud-boot-SSD-version.html @@ -790,7 +790,7 @@

NVME

diff --git a/Documentation/nvme-wdc-drive-essentials.1 b/Documentation/nvme-wdc-drive-essentials.1 index 75ee8f9506..b1170b5f62 100644 --- a/Documentation/nvme-wdc-drive-essentials.1 +++ b/Documentation/nvme-wdc-drive-essentials.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-drive-essentials .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-DRIVE\-ES" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-DRIVE\-ES" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-drive-essentials.html b/Documentation/nvme-wdc-drive-essentials.html index daa486de8b..47fe9ff761 100644 --- a/Documentation/nvme-wdc-drive-essentials.html +++ b/Documentation/nvme-wdc-drive-essentials.html @@ -822,7 +822,7 @@

NVME

diff --git a/Documentation/nvme-wdc-drive-log.1 b/Documentation/nvme-wdc-drive-log.1 index 0c3cd20c5d..c2126854f7 100644 --- a/Documentation/nvme-wdc-drive-log.1 +++ b/Documentation/nvme-wdc-drive-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-drive-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-DRIVE\-LO" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-DRIVE\-LO" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-drive-log.html b/Documentation/nvme-wdc-drive-log.html index a0c0847a83..48117e0201 100644 --- a/Documentation/nvme-wdc-drive-log.html +++ b/Documentation/nvme-wdc-drive-log.html @@ -829,7 +829,7 @@

NVME

diff --git a/Documentation/nvme-wdc-drive-resize.1 b/Documentation/nvme-wdc-drive-resize.1 index 779a7842e7..2846206b84 100644 --- a/Documentation/nvme-wdc-drive-resize.1 +++ b/Documentation/nvme-wdc-drive-resize.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-drive-resize .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-DRIVE\-RE" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-DRIVE\-RE" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-drive-resize.html b/Documentation/nvme-wdc-drive-resize.html index cc776764ef..4f4e5e14f0 100644 --- a/Documentation/nvme-wdc-drive-resize.html +++ b/Documentation/nvme-wdc-drive-resize.html @@ -810,7 +810,7 @@

NVME

diff --git a/Documentation/nvme-wdc-enc-get-log.1 b/Documentation/nvme-wdc-enc-get-log.1 index b6f62640c6..d265788841 100644 --- a/Documentation/nvme-wdc-enc-get-log.1 +++ b/Documentation/nvme-wdc-enc-get-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-enc-get-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-ENC\-GET\" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-ENC\-GET\" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-enc-get-log.html b/Documentation/nvme-wdc-enc-get-log.html index 8321216db2..81c6653ed3 100644 --- a/Documentation/nvme-wdc-enc-get-log.html +++ b/Documentation/nvme-wdc-enc-get-log.html @@ -837,7 +837,7 @@

NVME

diff --git a/Documentation/nvme-wdc-get-crash-dump.1 b/Documentation/nvme-wdc-get-crash-dump.1 index b212e486aa..67d6f61bdc 100644 --- a/Documentation/nvme-wdc-get-crash-dump.1 +++ b/Documentation/nvme-wdc-get-crash-dump.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-get-crash-dump .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-GET\-CRAS" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-GET\-CRAS" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-get-crash-dump.html b/Documentation/nvme-wdc-get-crash-dump.html index 846af69568..919638dca7 100644 --- a/Documentation/nvme-wdc-get-crash-dump.html +++ b/Documentation/nvme-wdc-get-crash-dump.html @@ -830,7 +830,7 @@

NVME

diff --git a/Documentation/nvme-wdc-get-dev-capabilities-log.1 b/Documentation/nvme-wdc-get-dev-capabilities-log.1 index a173c696ea..b897701386 100644 --- a/Documentation/nvme-wdc-get-dev-capabilities-log.1 +++ b/Documentation/nvme-wdc-get-dev-capabilities-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-get-dev-capabilities-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-GET\-DEV\" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-GET\-DEV\" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-get-dev-capabilities-log.html b/Documentation/nvme-wdc-get-dev-capabilities-log.html index 268f2b7798..c0a61a02cc 100644 --- a/Documentation/nvme-wdc-get-dev-capabilities-log.html +++ b/Documentation/nvme-wdc-get-dev-capabilities-log.html @@ -815,7 +815,7 @@

NVME

diff --git a/Documentation/nvme-wdc-get-drive-status.1 b/Documentation/nvme-wdc-get-drive-status.1 index 8c6cc7b0af..9151029665 100644 --- a/Documentation/nvme-wdc-get-drive-status.1 +++ b/Documentation/nvme-wdc-get-drive-status.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-get-drive-status .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-GET\-DRIV" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-GET\-DRIV" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-get-drive-status.html b/Documentation/nvme-wdc-get-drive-status.html index 7e5cb2d534..783dd97232 100644 --- a/Documentation/nvme-wdc-get-drive-status.html +++ b/Documentation/nvme-wdc-get-drive-status.html @@ -836,7 +836,7 @@

NVME

diff --git a/Documentation/nvme-wdc-get-error-recovery-log.1 b/Documentation/nvme-wdc-get-error-recovery-log.1 index e63b54b809..59c10e7dfd 100644 --- a/Documentation/nvme-wdc-get-error-recovery-log.1 +++ b/Documentation/nvme-wdc-get-error-recovery-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-get-error-recovery-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-GET\-ERRO" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-GET\-ERRO" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-get-error-recovery-log.html b/Documentation/nvme-wdc-get-error-recovery-log.html index 5847029608..adbe5fc442 100644 --- a/Documentation/nvme-wdc-get-error-recovery-log.html +++ b/Documentation/nvme-wdc-get-error-recovery-log.html @@ -816,7 +816,7 @@

NVME

diff --git a/Documentation/nvme-wdc-get-latency-monitor-log.1 b/Documentation/nvme-wdc-get-latency-monitor-log.1 index 1857abc441..04e226a231 100644 --- a/Documentation/nvme-wdc-get-latency-monitor-log.1 +++ b/Documentation/nvme-wdc-get-latency-monitor-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-get-latency-monitor-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-GET\-LATE" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-GET\-LATE" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-get-latency-monitor-log.html b/Documentation/nvme-wdc-get-latency-monitor-log.html index b53ce05c31..c966c36ee2 100644 --- a/Documentation/nvme-wdc-get-latency-monitor-log.html +++ b/Documentation/nvme-wdc-get-latency-monitor-log.html @@ -810,7 +810,7 @@

NVME

diff --git a/Documentation/nvme-wdc-get-pfail-dump.1 b/Documentation/nvme-wdc-get-pfail-dump.1 index 0ebab5e269..c8a9160d90 100644 --- a/Documentation/nvme-wdc-get-pfail-dump.1 +++ b/Documentation/nvme-wdc-get-pfail-dump.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-get-pfail-dump .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-GET\-PFAI" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-GET\-PFAI" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-get-pfail-dump.html b/Documentation/nvme-wdc-get-pfail-dump.html index d25e6aaee6..eef13f1023 100644 --- a/Documentation/nvme-wdc-get-pfail-dump.html +++ b/Documentation/nvme-wdc-get-pfail-dump.html @@ -832,7 +832,7 @@

NVME

diff --git a/Documentation/nvme-wdc-get-unsupported-reqs-log.1 b/Documentation/nvme-wdc-get-unsupported-reqs-log.1 index fd22bf661d..87c55c31cc 100644 --- a/Documentation/nvme-wdc-get-unsupported-reqs-log.1 +++ b/Documentation/nvme-wdc-get-unsupported-reqs-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-get-unsupported-reqs-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-GET\-UNSU" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-GET\-UNSU" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-get-unsupported-reqs-log.html b/Documentation/nvme-wdc-get-unsupported-reqs-log.html index 6517bacc70..0e7e3c4122 100644 --- a/Documentation/nvme-wdc-get-unsupported-reqs-log.html +++ b/Documentation/nvme-wdc-get-unsupported-reqs-log.html @@ -816,7 +816,7 @@

NVME

diff --git a/Documentation/nvme-wdc-id-ctrl.1 b/Documentation/nvme-wdc-id-ctrl.1 index 3783e7cc84..ea99a19463 100644 --- a/Documentation/nvme-wdc-id-ctrl.1 +++ b/Documentation/nvme-wdc-id-ctrl.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-id-ctrl .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-ID\-CTRL" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-ID\-CTRL" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-id-ctrl.html b/Documentation/nvme-wdc-id-ctrl.html index be7235fdd1..b30c935b86 100644 --- a/Documentation/nvme-wdc-id-ctrl.html +++ b/Documentation/nvme-wdc-id-ctrl.html @@ -856,7 +856,7 @@

NVME

diff --git a/Documentation/nvme-wdc-log-page-directory.1 b/Documentation/nvme-wdc-log-page-directory.1 index 759cdd2478..ca8d1452af 100644 --- a/Documentation/nvme-wdc-log-page-directory.1 +++ b/Documentation/nvme-wdc-log-page-directory.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-log-page-directory .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-LOG\-PAGE" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-LOG\-PAGE" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-log-page-directory.html b/Documentation/nvme-wdc-log-page-directory.html index 9207935a5e..35ca13906d 100644 --- a/Documentation/nvme-wdc-log-page-directory.html +++ b/Documentation/nvme-wdc-log-page-directory.html @@ -812,7 +812,7 @@

NVME

diff --git a/Documentation/nvme-wdc-namespace-resize.1 b/Documentation/nvme-wdc-namespace-resize.1 index 1437a803c0..5b24e086f8 100644 --- a/Documentation/nvme-wdc-namespace-resize.1 +++ b/Documentation/nvme-wdc-namespace-resize.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-namespace-resize .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-NAMESPACE" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-NAMESPACE" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-namespace-resize.html b/Documentation/nvme-wdc-namespace-resize.html index 4831d2490b..b404a0f1eb 100644 --- a/Documentation/nvme-wdc-namespace-resize.html +++ b/Documentation/nvme-wdc-namespace-resize.html @@ -836,7 +836,7 @@

NVME

diff --git a/Documentation/nvme-wdc-purge-monitor.1 b/Documentation/nvme-wdc-purge-monitor.1 index 37aaf3927a..4086355070 100644 --- a/Documentation/nvme-wdc-purge-monitor.1 +++ b/Documentation/nvme-wdc-purge-monitor.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-purge-monitor .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-PURGE\-MO" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-PURGE\-MO" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-purge-monitor.html b/Documentation/nvme-wdc-purge-monitor.html index 52ce11752e..4ae950fe2a 100644 --- a/Documentation/nvme-wdc-purge-monitor.html +++ b/Documentation/nvme-wdc-purge-monitor.html @@ -837,7 +837,7 @@

NVME

diff --git a/Documentation/nvme-wdc-purge.1 b/Documentation/nvme-wdc-purge.1 index 878ee9bf9b..915c31e59e 100644 --- a/Documentation/nvme-wdc-purge.1 +++ b/Documentation/nvme-wdc-purge.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-purge .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-PURGE" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-PURGE" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-purge.html b/Documentation/nvme-wdc-purge.html index fc2b3622ee..509465c00a 100644 --- a/Documentation/nvme-wdc-purge.html +++ b/Documentation/nvme-wdc-purge.html @@ -799,7 +799,7 @@

NVME

diff --git a/Documentation/nvme-wdc-vs-cloud-log.1 b/Documentation/nvme-wdc-vs-cloud-log.1 index fd14a1a2aa..d691bde6f4 100644 --- a/Documentation/nvme-wdc-vs-cloud-log.1 +++ b/Documentation/nvme-wdc-vs-cloud-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-vs-cloud-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-VS\-CLOUD" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-VS\-CLOUD" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-vs-cloud-log.html b/Documentation/nvme-wdc-vs-cloud-log.html index aa05c49090..cfcc2c6eb3 100644 --- a/Documentation/nvme-wdc-vs-cloud-log.html +++ b/Documentation/nvme-wdc-vs-cloud-log.html @@ -828,7 +828,7 @@

NVME

diff --git a/Documentation/nvme-wdc-vs-device-waf.1 b/Documentation/nvme-wdc-vs-device-waf.1 index 8fcfaebf65..20cf75e6b3 100644 --- a/Documentation/nvme-wdc-vs-device-waf.1 +++ b/Documentation/nvme-wdc-vs-device-waf.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-vs-device-waf .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-VS\-DEVIC" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-VS\-DEVIC" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-vs-device-waf.html b/Documentation/nvme-wdc-vs-device-waf.html index 97ede06cf3..ac30160c8a 100644 --- a/Documentation/nvme-wdc-vs-device-waf.html +++ b/Documentation/nvme-wdc-vs-device-waf.html @@ -828,7 +828,7 @@

NVME

diff --git a/Documentation/nvme-wdc-vs-drive-info.1 b/Documentation/nvme-wdc-vs-drive-info.1 index 2cf6a463e7..d4e87e7ca7 100644 --- a/Documentation/nvme-wdc-vs-drive-info.1 +++ b/Documentation/nvme-wdc-vs-drive-info.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-vs-drive-info .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-VS\-DRIVE" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-VS\-DRIVE" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-vs-drive-info.html b/Documentation/nvme-wdc-vs-drive-info.html index 134ae52fe0..94e89335f2 100644 --- a/Documentation/nvme-wdc-vs-drive-info.html +++ b/Documentation/nvme-wdc-vs-drive-info.html @@ -795,7 +795,7 @@

NVME

diff --git a/Documentation/nvme-wdc-vs-error-reason-identifier.1 b/Documentation/nvme-wdc-vs-error-reason-identifier.1 index d29eb26d88..f75f9b53de 100644 --- a/Documentation/nvme-wdc-vs-error-reason-identifier.1 +++ b/Documentation/nvme-wdc-vs-error-reason-identifier.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-vs-error-reason-identifier .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-VS\-ERROR" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-VS\-ERROR" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-vs-error-reason-identifier.html b/Documentation/nvme-wdc-vs-error-reason-identifier.html index caca97eda5..8bc69119c9 100644 --- a/Documentation/nvme-wdc-vs-error-reason-identifier.html +++ b/Documentation/nvme-wdc-vs-error-reason-identifier.html @@ -836,7 +836,7 @@

NVME

diff --git a/Documentation/nvme-wdc-vs-fw-activate-history.1 b/Documentation/nvme-wdc-vs-fw-activate-history.1 index 36ca07b38f..85156f4d45 100644 --- a/Documentation/nvme-wdc-vs-fw-activate-history.1 +++ b/Documentation/nvme-wdc-vs-fw-activate-history.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-vs-fw-activate-history .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-VS\-FW\-A" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-VS\-FW\-A" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-vs-fw-activate-history.html b/Documentation/nvme-wdc-vs-fw-activate-history.html index 55a1ee4155..37d3a9fe17 100644 --- a/Documentation/nvme-wdc-vs-fw-activate-history.html +++ b/Documentation/nvme-wdc-vs-fw-activate-history.html @@ -868,7 +868,7 @@

NVME

diff --git a/Documentation/nvme-wdc-vs-hw-rev-log.1 b/Documentation/nvme-wdc-vs-hw-rev-log.1 index f345e14cc2..c512561a5f 100644 --- a/Documentation/nvme-wdc-vs-hw-rev-log.1 +++ b/Documentation/nvme-wdc-vs-hw-rev-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-vs-hw-rev-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-VS\-HW\-R" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-VS\-HW\-R" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-vs-hw-rev-log.html b/Documentation/nvme-wdc-vs-hw-rev-log.html index 7a4e501468..b35b46c639 100644 --- a/Documentation/nvme-wdc-vs-hw-rev-log.html +++ b/Documentation/nvme-wdc-vs-hw-rev-log.html @@ -827,7 +827,7 @@

NVME

diff --git a/Documentation/nvme-wdc-vs-internal-log.1 b/Documentation/nvme-wdc-vs-internal-log.1 index 0c38521df2..0809fac652 100644 --- a/Documentation/nvme-wdc-vs-internal-log.1 +++ b/Documentation/nvme-wdc-vs-internal-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-vs-internal-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-VS\-INTER" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-VS\-INTER" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-vs-internal-log.html b/Documentation/nvme-wdc-vs-internal-log.html index 312486a734..d37918e49c 100644 --- a/Documentation/nvme-wdc-vs-internal-log.html +++ b/Documentation/nvme-wdc-vs-internal-log.html @@ -958,7 +958,7 @@

NVME

diff --git a/Documentation/nvme-wdc-vs-nand-stats.1 b/Documentation/nvme-wdc-vs-nand-stats.1 index f9dd70f8c0..10be9b87c0 100644 --- a/Documentation/nvme-wdc-vs-nand-stats.1 +++ b/Documentation/nvme-wdc-vs-nand-stats.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-vs-nand-stats .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-VS\-NAND\" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-VS\-NAND\" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-vs-nand-stats.html b/Documentation/nvme-wdc-vs-nand-stats.html index 3056c169dc..b7fa8d5e2f 100644 --- a/Documentation/nvme-wdc-vs-nand-stats.html +++ b/Documentation/nvme-wdc-vs-nand-stats.html @@ -814,7 +814,7 @@

NVME

diff --git a/Documentation/nvme-wdc-vs-smart-add-log.1 b/Documentation/nvme-wdc-vs-smart-add-log.1 index 49ec60113d..40be6afecf 100644 --- a/Documentation/nvme-wdc-vs-smart-add-log.1 +++ b/Documentation/nvme-wdc-vs-smart-add-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-vs-smart-add-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-VS\-SMART" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-VS\-SMART" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-vs-smart-add-log.html b/Documentation/nvme-wdc-vs-smart-add-log.html index cc410fedeb..c68a2e6b5b 100644 --- a/Documentation/nvme-wdc-vs-smart-add-log.html +++ b/Documentation/nvme-wdc-vs-smart-add-log.html @@ -928,7 +928,7 @@

NVME

diff --git a/Documentation/nvme-wdc-vs-telemetry-controller-option.1 b/Documentation/nvme-wdc-vs-telemetry-controller-option.1 index d3e0ec2d22..a908eb98e3 100644 --- a/Documentation/nvme-wdc-vs-telemetry-controller-option.1 +++ b/Documentation/nvme-wdc-vs-telemetry-controller-option.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-vs-telemetry-controller-option .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-VS\-TELEM" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-VS\-TELEM" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-vs-telemetry-controller-option.html b/Documentation/nvme-wdc-vs-telemetry-controller-option.html index baf4a22ea6..be3f570a0f 100644 --- a/Documentation/nvme-wdc-vs-telemetry-controller-option.html +++ b/Documentation/nvme-wdc-vs-telemetry-controller-option.html @@ -855,7 +855,7 @@

NVME

diff --git a/Documentation/nvme-wdc-vs-temperature-stats.1 b/Documentation/nvme-wdc-vs-temperature-stats.1 index a928d0c67a..6d0654359f 100644 --- a/Documentation/nvme-wdc-vs-temperature-stats.1 +++ b/Documentation/nvme-wdc-vs-temperature-stats.1 @@ -2,12 +2,12 @@ .\" Title: nvme-wdc-vs-temperature-stats .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-VS\-TEMPE" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-VS\-TEMPE" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-vs-temperature-stats.html b/Documentation/nvme-wdc-vs-temperature-stats.html index 27b83d17c5..8e792064c9 100644 --- a/Documentation/nvme-wdc-vs-temperature-stats.html +++ b/Documentation/nvme-wdc-vs-temperature-stats.html @@ -857,7 +857,7 @@

NVME

diff --git a/Documentation/nvme-write-uncor.1 b/Documentation/nvme-write-uncor.1 index 014ff82d44..f08676c6e8 100644 --- a/Documentation/nvme-write-uncor.1 +++ b/Documentation/nvme-write-uncor.1 @@ -2,12 +2,12 @@ .\" Title: nvme-uncor .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-UNCOR" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-UNCOR" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-write-uncor.html b/Documentation/nvme-write-uncor.html index 1d6d2594ea..b69ff1a7e7 100644 --- a/Documentation/nvme-write-uncor.html +++ b/Documentation/nvme-write-uncor.html @@ -880,7 +880,7 @@

NVME

diff --git a/Documentation/nvme-write-zeroes.1 b/Documentation/nvme-write-zeroes.1 index 90e561d8e9..c9eb175984 100644 --- a/Documentation/nvme-write-zeroes.1 +++ b/Documentation/nvme-write-zeroes.1 @@ -2,12 +2,12 @@ .\" Title: nvme-write-zeroes .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WRITE\-ZEROES" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WRITE\-ZEROES" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-write-zeroes.html b/Documentation/nvme-write-zeroes.html index 015438812c..0d7d80bcce 100644 --- a/Documentation/nvme-write-zeroes.html +++ b/Documentation/nvme-write-zeroes.html @@ -1023,7 +1023,7 @@

NVME

diff --git a/Documentation/nvme-write.1 b/Documentation/nvme-write.1 index 383120e3c9..234c7bec0a 100644 --- a/Documentation/nvme-write.1 +++ b/Documentation/nvme-write.1 @@ -2,12 +2,12 @@ .\" Title: nvme-write .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WRITE" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WRITE" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-write.html b/Documentation/nvme-write.html index f6d9a07877..294b2b914f 100644 --- a/Documentation/nvme-write.html +++ b/Documentation/nvme-write.html @@ -1118,7 +1118,7 @@

NVME

diff --git a/Documentation/nvme-zns-changed-zone-list.1 b/Documentation/nvme-zns-changed-zone-list.1 index 11d8c8704f..c346900ec6 100644 --- a/Documentation/nvme-zns-changed-zone-list.1 +++ b/Documentation/nvme-zns-changed-zone-list.1 @@ -2,12 +2,12 @@ .\" Title: nvme-zns-changed-zone-list .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ZNS\-CHANGED\-" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-ZNS\-CHANGED\-" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-zns-changed-zone-list.html b/Documentation/nvme-zns-changed-zone-list.html index 3be8d05354..8dd6aa323c 100644 --- a/Documentation/nvme-zns-changed-zone-list.html +++ b/Documentation/nvme-zns-changed-zone-list.html @@ -832,7 +832,7 @@

NVME

diff --git a/Documentation/nvme-zns-close-zone.1 b/Documentation/nvme-zns-close-zone.1 index a47a413e27..7c6641c123 100644 --- a/Documentation/nvme-zns-close-zone.1 +++ b/Documentation/nvme-zns-close-zone.1 @@ -2,12 +2,12 @@ .\" Title: nvme-zns-close-zone .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ZNS\-CLOSE\-ZO" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-ZNS\-CLOSE\-ZO" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-zns-close-zone.html b/Documentation/nvme-zns-close-zone.html index acc4e494ae..4cdb120edf 100644 --- a/Documentation/nvme-zns-close-zone.html +++ b/Documentation/nvme-zns-close-zone.html @@ -846,7 +846,7 @@

NVME

diff --git a/Documentation/nvme-zns-finish-zone.1 b/Documentation/nvme-zns-finish-zone.1 index 3ae99fe305..785aac4bd5 100644 --- a/Documentation/nvme-zns-finish-zone.1 +++ b/Documentation/nvme-zns-finish-zone.1 @@ -2,12 +2,12 @@ .\" Title: nvme-zns-finish-zone .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ZNS\-FINISH\-Z" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-ZNS\-FINISH\-Z" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-zns-finish-zone.html b/Documentation/nvme-zns-finish-zone.html index aef2d6f2de..5dc97857f7 100644 --- a/Documentation/nvme-zns-finish-zone.html +++ b/Documentation/nvme-zns-finish-zone.html @@ -847,7 +847,7 @@

NVME

diff --git a/Documentation/nvme-zns-id-ctrl.1 b/Documentation/nvme-zns-id-ctrl.1 index a4b22f2822..e9893419cb 100644 --- a/Documentation/nvme-zns-id-ctrl.1 +++ b/Documentation/nvme-zns-id-ctrl.1 @@ -2,12 +2,12 @@ .\" Title: nvme-zns-id-ctrl .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ZNS\-ID\-CTRL" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-ZNS\-ID\-CTRL" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-zns-id-ctrl.html b/Documentation/nvme-zns-id-ctrl.html index 33c1fd3cae..744ecfdf60 100644 --- a/Documentation/nvme-zns-id-ctrl.html +++ b/Documentation/nvme-zns-id-ctrl.html @@ -821,7 +821,7 @@

NVME

diff --git a/Documentation/nvme-zns-id-ns.1 b/Documentation/nvme-zns-id-ns.1 index b943584152..00853b5a22 100644 --- a/Documentation/nvme-zns-id-ns.1 +++ b/Documentation/nvme-zns-id-ns.1 @@ -2,12 +2,12 @@ .\" Title: nvme-zns-id-ns .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ZNS\-ID\-NS" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-ZNS\-ID\-NS" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-zns-id-ns.html b/Documentation/nvme-zns-id-ns.html index a8e23a54c7..2a49ee8d32 100644 --- a/Documentation/nvme-zns-id-ns.html +++ b/Documentation/nvme-zns-id-ns.html @@ -846,7 +846,7 @@

NVME

diff --git a/Documentation/nvme-zns-offline-zone.1 b/Documentation/nvme-zns-offline-zone.1 index 56554b6b44..a0d1ce565e 100644 --- a/Documentation/nvme-zns-offline-zone.1 +++ b/Documentation/nvme-zns-offline-zone.1 @@ -2,12 +2,12 @@ .\" Title: nvme-zns-offline-zone .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ZNS\-OFFLINE\-" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-ZNS\-OFFLINE\-" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-zns-offline-zone.html b/Documentation/nvme-zns-offline-zone.html index 8b900ade95..c040633058 100644 --- a/Documentation/nvme-zns-offline-zone.html +++ b/Documentation/nvme-zns-offline-zone.html @@ -846,7 +846,7 @@

NVME

diff --git a/Documentation/nvme-zns-open-zone.1 b/Documentation/nvme-zns-open-zone.1 index 1ff351f42f..26d933e6f0 100644 --- a/Documentation/nvme-zns-open-zone.1 +++ b/Documentation/nvme-zns-open-zone.1 @@ -2,12 +2,12 @@ .\" Title: nvme-zns-open-zone .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ZNS\-OPEN\-ZON" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-ZNS\-OPEN\-ZON" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-zns-open-zone.html b/Documentation/nvme-zns-open-zone.html index bd152bb27d..bf134135ba 100644 --- a/Documentation/nvme-zns-open-zone.html +++ b/Documentation/nvme-zns-open-zone.html @@ -856,7 +856,7 @@

NVME

diff --git a/Documentation/nvme-zns-report-zones.1 b/Documentation/nvme-zns-report-zones.1 index 65cde3ceba..35a10088b6 100644 --- a/Documentation/nvme-zns-report-zones.1 +++ b/Documentation/nvme-zns-report-zones.1 @@ -2,12 +2,12 @@ .\" Title: nvme-zns-report-zones .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ZNS\-REPORT\-Z" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-ZNS\-REPORT\-Z" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-zns-report-zones.html b/Documentation/nvme-zns-report-zones.html index a25af6548f..997933eccf 100644 --- a/Documentation/nvme-zns-report-zones.html +++ b/Documentation/nvme-zns-report-zones.html @@ -957,7 +957,7 @@

NVME

diff --git a/Documentation/nvme-zns-reset-zone.1 b/Documentation/nvme-zns-reset-zone.1 index 7031e3ad92..b84fe832b0 100644 --- a/Documentation/nvme-zns-reset-zone.1 +++ b/Documentation/nvme-zns-reset-zone.1 @@ -2,12 +2,12 @@ .\" Title: nvme-zns-reset-zone .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ZNS\-RESET\-ZO" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-ZNS\-RESET\-ZO" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-zns-reset-zone.html b/Documentation/nvme-zns-reset-zone.html index 777eed63de..a4270620df 100644 --- a/Documentation/nvme-zns-reset-zone.html +++ b/Documentation/nvme-zns-reset-zone.html @@ -847,7 +847,7 @@

NVME

diff --git a/Documentation/nvme-zns-set-zone-desc.1 b/Documentation/nvme-zns-set-zone-desc.1 index edb3e56c01..b501734f36 100644 --- a/Documentation/nvme-zns-set-zone-desc.1 +++ b/Documentation/nvme-zns-set-zone-desc.1 @@ -2,12 +2,12 @@ .\" Title: nvme-zns-set-zone-desc .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ZNS\-SET\-ZONE" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-ZNS\-SET\-ZONE" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-zns-set-zone-desc.html b/Documentation/nvme-zns-set-zone-desc.html index 600f25883b..732a1b23a0 100644 --- a/Documentation/nvme-zns-set-zone-desc.html +++ b/Documentation/nvme-zns-set-zone-desc.html @@ -859,7 +859,7 @@

NVME

diff --git a/Documentation/nvme-zns-zone-append.1 b/Documentation/nvme-zns-zone-append.1 index 9bd72babb3..3d92160d18 100644 --- a/Documentation/nvme-zns-zone-append.1 +++ b/Documentation/nvme-zns-zone-append.1 @@ -2,12 +2,12 @@ .\" Title: nvme-zns-zone-append .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ZNS\-ZONE\-APP" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-ZNS\-ZONE\-APP" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-zns-zone-append.html b/Documentation/nvme-zns-zone-append.html index d899b8e516..7ac24a30ed 100644 --- a/Documentation/nvme-zns-zone-append.html +++ b/Documentation/nvme-zns-zone-append.html @@ -940,7 +940,7 @@

NVME

diff --git a/Documentation/nvme-zns-zone-mgmt-recv.1 b/Documentation/nvme-zns-zone-mgmt-recv.1 index a2232be162..91bb3fbd8e 100644 --- a/Documentation/nvme-zns-zone-mgmt-recv.1 +++ b/Documentation/nvme-zns-zone-mgmt-recv.1 @@ -2,12 +2,12 @@ .\" Title: nvme-zns-zone-mgmt-recv .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ZNS\-ZONE\-MGM" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-ZNS\-ZONE\-MGM" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-zns-zone-mgmt-recv.html b/Documentation/nvme-zns-zone-mgmt-recv.html index 13ae50d625..8c4e9f4d69 100644 --- a/Documentation/nvme-zns-zone-mgmt-recv.html +++ b/Documentation/nvme-zns-zone-mgmt-recv.html @@ -880,7 +880,7 @@

NVME

diff --git a/Documentation/nvme-zns-zone-mgmt-send.1 b/Documentation/nvme-zns-zone-mgmt-send.1 index b8d9e762a9..aa382ac00d 100644 --- a/Documentation/nvme-zns-zone-mgmt-send.1 +++ b/Documentation/nvme-zns-zone-mgmt-send.1 @@ -2,12 +2,12 @@ .\" Title: nvme-zns-zone-mgmt-send .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ZNS\-ZONE\-MGM" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME\-ZNS\-ZONE\-MGM" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-zns-zone-mgmt-send.html b/Documentation/nvme-zns-zone-mgmt-send.html index bbeba229e7..472d52cf4d 100644 --- a/Documentation/nvme-zns-zone-mgmt-send.html +++ b/Documentation/nvme-zns-zone-mgmt-send.html @@ -914,7 +914,7 @@

NVME

diff --git a/Documentation/nvme.1 b/Documentation/nvme.1 index f3df1916b9..a11021dd29 100644 --- a/Documentation/nvme.1 +++ b/Documentation/nvme.1 @@ -2,12 +2,12 @@ .\" Title: nvme .\" Author: [see the "Authors" section] .\" Generator: DocBook XSL Stylesheets vsnapshot -.\" Date: 08/02/2024 +.\" Date: 08/05/2024 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME" "1" "08/02/2024" "NVMe" "NVMe Manual" +.TH "NVME" "1" "08/05/2024" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme.html b/Documentation/nvme.html index 73c5acb903..2eb15dc9f7 100644 --- a/Documentation/nvme.html +++ b/Documentation/nvme.html @@ -2122,7 +2122,7 @@

NVME

From 09a350db412f5dd6685771962ad80d9b374a9c4a Mon Sep 17 00:00:00 2001 From: Daniel Wagner Date: Mon, 5 Aug 2024 15:33:31 +0200 Subject: [PATCH 116/281] Release v2.10.1 Signed-off-by: Daniel Wagner --- meson.build | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/meson.build b/meson.build index af1835e937..c657adf460 100644 --- a/meson.build +++ b/meson.build @@ -4,7 +4,7 @@ project( 'nvme-cli', ['c'], meson_version: '>= 0.50.0', license: 'GPL-2.0-only', - version: '2.10', + version: '2.10.1', default_options: [ 'c_std=gnu99', 'buildtype=debugoptimized', @@ -48,7 +48,7 @@ conf.set('SYSCONFDIR', '"@0@"'.format(sysconfdir)) conf.set('RUNDIR', '"@0@"'.format(rundir)) # Check for libnvme availability -libnvme_dep = dependency('libnvme', version: '>=1.10', required: true, +libnvme_dep = dependency('libnvme', version: '>=1.100', required: true, fallback : ['libnvme', 'libnvme_dep']) libnvme_mi_dep = dependency('libnvme-mi', required: true, fallback : ['libnvme', 'libnvme_mi_dep']) From abbe25479337f467bcefc048288b81ded08f2d5e Mon Sep 17 00:00:00 2001 From: Daniel Wagner Date: Mon, 5 Aug 2024 15:41:52 +0200 Subject: [PATCH 117/281] build: fix libnvme dependency Undo last libnvme dependency update which was done automatically done by the release script. Signed-off-by: Daniel Wagner --- meson.build | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meson.build b/meson.build index c657adf460..ef02747ccc 100644 --- a/meson.build +++ b/meson.build @@ -48,7 +48,7 @@ conf.set('SYSCONFDIR', '"@0@"'.format(sysconfdir)) conf.set('RUNDIR', '"@0@"'.format(rundir)) # Check for libnvme availability -libnvme_dep = dependency('libnvme', version: '>=1.100', required: true, +libnvme_dep = dependency('libnvme', version: '>=1.10', required: true, fallback : ['libnvme', 'libnvme_dep']) libnvme_mi_dep = dependency('libnvme-mi', required: true, fallback : ['libnvme', 'libnvme_mi_dep']) From 04036cda500b9fe689f9258428df06d9c90558be Mon Sep 17 00:00:00 2001 From: Daniel Wagner Date: Mon, 5 Aug 2024 15:42:49 +0200 Subject: [PATCH 118/281] doc: Regenerate all docs for v2.10.2 Signed-off-by: Daniel Wagner --- Documentation/nvme-admin-passthru.html | 2 +- Documentation/nvme-ana-log.html | 2 +- Documentation/nvme-attach-ns.html | 2 +- Documentation/nvme-boot-part-log.html | 2 +- Documentation/nvme-capacity-mgmt.html | 2 +- Documentation/nvme-changed-ns-list-log.html | 2 +- Documentation/nvme-cmdset-ind-id-ns.html | 2 +- Documentation/nvme-compare.html | 2 +- Documentation/nvme-connect-all.html | 2 +- Documentation/nvme-connect.html | 2 +- Documentation/nvme-copy.html | 2 +- Documentation/nvme-create-ns.html | 2 +- Documentation/nvme-delete-ns.html | 2 +- Documentation/nvme-dera-stat.html | 2 +- Documentation/nvme-detach-ns.html | 2 +- Documentation/nvme-device-self-test.html | 2 +- Documentation/nvme-dim.html | 2 +- Documentation/nvme-dir-receive.html | 2 +- Documentation/nvme-dir-send.html | 2 +- Documentation/nvme-disconnect-all.html | 2 +- Documentation/nvme-disconnect.html | 2 +- Documentation/nvme-discover.html | 2 +- Documentation/nvme-dsm.html | 2 +- Documentation/nvme-effects-log.html | 2 +- Documentation/nvme-endurance-event-agg-log.html | 2 +- Documentation/nvme-endurance-log.html | 2 +- Documentation/nvme-error-log.html | 2 +- Documentation/nvme-fdp-configs.html | 2 +- Documentation/nvme-fdp-events.html | 2 +- Documentation/nvme-fdp-set-events.html | 2 +- Documentation/nvme-fdp-stats.html | 2 +- Documentation/nvme-fdp-status.html | 2 +- Documentation/nvme-fdp-update.html | 2 +- Documentation/nvme-fdp-usage.html | 2 +- Documentation/nvme-fid-support-effects-log.html | 2 +- Documentation/nvme-flush.html | 2 +- Documentation/nvme-format.html | 2 +- Documentation/nvme-fw-commit.html | 2 +- Documentation/nvme-fw-download.html | 2 +- Documentation/nvme-fw-log.html | 2 +- Documentation/nvme-gen-hostnqn.html | 2 +- Documentation/nvme-get-feature.html | 2 +- Documentation/nvme-get-lba-status.html | 2 +- Documentation/nvme-get-log.html | 2 +- Documentation/nvme-get-ns-id.html | 2 +- Documentation/nvme-get-property.html | 2 +- Documentation/nvme-help.html | 2 +- Documentation/nvme-huawei-id-ctrl.html | 2 +- Documentation/nvme-huawei-list.html | 2 +- Documentation/nvme-id-ctrl.html | 2 +- Documentation/nvme-id-domain.html | 2 +- Documentation/nvme-id-iocs.html | 2 +- Documentation/nvme-id-ns.html | 2 +- Documentation/nvme-id-nvmset.html | 2 +- Documentation/nvme-inspur-nvme-vendor-log.html | 2 +- Documentation/nvme-intel-id-ctrl.html | 2 +- Documentation/nvme-intel-internal-log.html | 2 +- Documentation/nvme-intel-lat-stats.html | 2 +- Documentation/nvme-intel-market-name.html | 2 +- Documentation/nvme-intel-smart-log-add.html | 2 +- Documentation/nvme-intel-temp-stats.html | 2 +- Documentation/nvme-io-mgmt-recv.html | 2 +- Documentation/nvme-io-mgmt-send.html | 2 +- Documentation/nvme-io-passthru.html | 2 +- Documentation/nvme-lba-status-log.html | 2 +- Documentation/nvme-list-ctrl.html | 2 +- Documentation/nvme-list-endgrp.html | 2 +- Documentation/nvme-list-ns.html | 2 +- Documentation/nvme-list-subsys.html | 2 +- Documentation/nvme-list.html | 2 +- Documentation/nvme-lockdown.html | 2 +- Documentation/nvme-mi-cmd-support-effects-log.html | 2 +- Documentation/nvme-micron-clear-pcie-errors.html | 2 +- Documentation/nvme-micron-internal-log.html | 2 +- Documentation/nvme-micron-nand-stats.html | 2 +- Documentation/nvme-micron-pcie-stats.html | 2 +- Documentation/nvme-micron-selective-download.html | 2 +- Documentation/nvme-micron-smart-add-log.html | 2 +- Documentation/nvme-micron-temperature-stats.html | 2 +- Documentation/nvme-netapp-ontapdevices.html | 2 +- Documentation/nvme-netapp-smdevices.html | 2 +- Documentation/nvme-ns-descs.html | 2 +- Documentation/nvme-ns-rescan.html | 2 +- Documentation/nvme-nvm-id-ctrl.html | 2 +- Documentation/nvme-nvme-mi-recv.html | 2 +- Documentation/nvme-nvme-mi-send.html | 2 +- Documentation/nvme-ocp-clear-fw-activate-history.html | 2 +- .../nvme-ocp-clear-pcie-correctable-error-counters.html | 2 +- Documentation/nvme-ocp-device-capability-log.html | 2 +- Documentation/nvme-ocp-eol-plp-failure-mode.html | 2 +- Documentation/nvme-ocp-error-recovery-log.html | 2 +- Documentation/nvme-ocp-get-dssd-async-event-config.html | 2 +- Documentation/nvme-ocp-get-dssd-power-state-feature.html | 2 +- Documentation/nvme-ocp-get-plp-health-check-interval.html | 2 +- Documentation/nvme-ocp-internal-log.html | 2 +- Documentation/nvme-ocp-latency-monitor-log.html | 2 +- Documentation/nvme-ocp-set-dssd-async-event-config.html | 2 +- Documentation/nvme-ocp-set-dssd-power-state-feature.html | 2 +- Documentation/nvme-ocp-set-plp-health-check-interval.html | 2 +- Documentation/nvme-ocp-set-telemetry-profile.html | 2 +- Documentation/nvme-ocp-smart-add-log.html | 2 +- Documentation/nvme-ocp-telemetry-string-log-page.html | 2 +- Documentation/nvme-ocp-unsupported-reqs-log.html | 2 +- Documentation/nvme-persistent-event-log.html | 2 +- Documentation/nvme-pred-lat-event-agg-log.html | 2 +- Documentation/nvme-predictable-lat-log.html | 2 +- Documentation/nvme-primary-ctrl-caps.html | 2 +- Documentation/nvme-read.html | 2 +- Documentation/nvme-reset.html | 2 +- Documentation/nvme-resv-acquire.html | 2 +- Documentation/nvme-resv-notif-log.html | 2 +- Documentation/nvme-resv-register.html | 2 +- Documentation/nvme-resv-release.html | 2 +- Documentation/nvme-resv-report.html | 2 +- Documentation/nvme-rpmb.html | 2 +- Documentation/nvme-sanitize-log.html | 2 +- Documentation/nvme-sanitize.html | 2 +- Documentation/nvme-seagate-clear-fw-activate-history.html | 2 +- Documentation/nvme-seagate-clear-pcie-correctable-errors.html | 2 +- Documentation/nvme-seagate-cloud-SSD-plugin-version.html | 2 +- Documentation/nvme-seagate-get-ctrl-tele.html | 2 +- Documentation/nvme-seagate-get-host-tele.html | 2 +- Documentation/nvme-seagate-help.html | 2 +- Documentation/nvme-seagate-plugin-version.html | 2 +- Documentation/nvme-seagate-version.html | 2 +- Documentation/nvme-seagate-vs-fw-activate-history.html | 2 +- Documentation/nvme-seagate-vs-internal-log.html | 2 +- Documentation/nvme-seagate-vs-log-page-sup.html | 2 +- Documentation/nvme-seagate-vs-pcie-stats.html | 2 +- Documentation/nvme-seagate-vs-smart-add-log.html | 2 +- Documentation/nvme-seagate-vs-temperature-stats.html | 2 +- Documentation/nvme-security-recv.html | 2 +- Documentation/nvme-security-send.html | 2 +- Documentation/nvme-self-test-log.html | 2 +- Documentation/nvme-set-feature.html | 2 +- Documentation/nvme-set-property.html | 2 +- Documentation/nvme-show-hostnqn.html | 2 +- Documentation/nvme-show-regs.html | 2 +- Documentation/nvme-show-topology.html | 2 +- Documentation/nvme-smart-log.html | 2 +- Documentation/nvme-subsystem-reset.html | 2 +- Documentation/nvme-supported-log-pages.html | 2 +- Documentation/nvme-telemetry-log.html | 2 +- Documentation/nvme-tls-key.html | 2 +- Documentation/nvme-toshiba-clear-pcie-correctable-errors.html | 2 +- Documentation/nvme-toshiba-vs-internal-log.html | 2 +- Documentation/nvme-toshiba-vs-smart-add-log.html | 2 +- Documentation/nvme-transcend-badblock.html | 2 +- Documentation/nvme-transcend-healthvalue.html | 2 +- Documentation/nvme-verify.html | 2 +- Documentation/nvme-virtium-save-smart-to-vtview-log.html | 2 +- Documentation/nvme-virtium-show-identify.html | 2 +- Documentation/nvme-wdc-cap-diag.html | 2 +- Documentation/nvme-wdc-capabilities.html | 2 +- Documentation/nvme-wdc-clear-assert-dump.html | 2 +- Documentation/nvme-wdc-clear-fw-activate-history.html | 2 +- Documentation/nvme-wdc-clear-pcie-correctable-errors.html | 2 +- Documentation/nvme-wdc-cloud-SSD-plugin-version.html | 2 +- Documentation/nvme-wdc-cloud-boot-SSD-version.html | 2 +- Documentation/nvme-wdc-drive-essentials.html | 2 +- Documentation/nvme-wdc-drive-log.html | 2 +- Documentation/nvme-wdc-drive-resize.html | 2 +- Documentation/nvme-wdc-enc-get-log.html | 2 +- Documentation/nvme-wdc-get-crash-dump.html | 2 +- Documentation/nvme-wdc-get-dev-capabilities-log.html | 2 +- Documentation/nvme-wdc-get-drive-status.html | 2 +- Documentation/nvme-wdc-get-error-recovery-log.html | 2 +- Documentation/nvme-wdc-get-latency-monitor-log.html | 2 +- Documentation/nvme-wdc-get-pfail-dump.html | 2 +- Documentation/nvme-wdc-get-unsupported-reqs-log.html | 2 +- Documentation/nvme-wdc-id-ctrl.html | 2 +- Documentation/nvme-wdc-log-page-directory.html | 2 +- Documentation/nvme-wdc-namespace-resize.html | 2 +- Documentation/nvme-wdc-purge-monitor.html | 2 +- Documentation/nvme-wdc-purge.html | 2 +- Documentation/nvme-wdc-vs-cloud-log.html | 2 +- Documentation/nvme-wdc-vs-device-waf.html | 2 +- Documentation/nvme-wdc-vs-drive-info.html | 2 +- Documentation/nvme-wdc-vs-error-reason-identifier.html | 2 +- Documentation/nvme-wdc-vs-fw-activate-history.html | 2 +- Documentation/nvme-wdc-vs-hw-rev-log.html | 2 +- Documentation/nvme-wdc-vs-internal-log.html | 2 +- Documentation/nvme-wdc-vs-nand-stats.html | 2 +- Documentation/nvme-wdc-vs-smart-add-log.html | 2 +- Documentation/nvme-wdc-vs-telemetry-controller-option.html | 2 +- Documentation/nvme-wdc-vs-temperature-stats.html | 2 +- Documentation/nvme-write-uncor.html | 2 +- Documentation/nvme-write-zeroes.html | 2 +- Documentation/nvme-write.html | 2 +- Documentation/nvme-zns-changed-zone-list.html | 2 +- Documentation/nvme-zns-close-zone.html | 2 +- Documentation/nvme-zns-finish-zone.html | 2 +- Documentation/nvme-zns-id-ctrl.html | 2 +- Documentation/nvme-zns-id-ns.html | 2 +- Documentation/nvme-zns-offline-zone.html | 2 +- Documentation/nvme-zns-open-zone.html | 2 +- Documentation/nvme-zns-report-zones.html | 2 +- Documentation/nvme-zns-reset-zone.html | 2 +- Documentation/nvme-zns-set-zone-desc.html | 2 +- Documentation/nvme-zns-zone-append.html | 2 +- Documentation/nvme-zns-zone-mgmt-recv.html | 2 +- Documentation/nvme-zns-zone-mgmt-send.html | 2 +- Documentation/nvme.html | 2 +- 203 files changed, 203 insertions(+), 203 deletions(-) diff --git a/Documentation/nvme-admin-passthru.html b/Documentation/nvme-admin-passthru.html index dbef97963a..d9189992ea 100644 --- a/Documentation/nvme-admin-passthru.html +++ b/Documentation/nvme-admin-passthru.html @@ -1038,7 +1038,7 @@

NVME

diff --git a/Documentation/nvme-ana-log.html b/Documentation/nvme-ana-log.html index 62021e8ff8..25b0b3ebfc 100644 --- a/Documentation/nvme-ana-log.html +++ b/Documentation/nvme-ana-log.html @@ -835,7 +835,7 @@

NVME

diff --git a/Documentation/nvme-attach-ns.html b/Documentation/nvme-attach-ns.html index d0e4bab4bc..8c1225a925 100644 --- a/Documentation/nvme-attach-ns.html +++ b/Documentation/nvme-attach-ns.html @@ -841,7 +841,7 @@

NVME

diff --git a/Documentation/nvme-boot-part-log.html b/Documentation/nvme-boot-part-log.html index 415123280e..74ff42b1eb 100644 --- a/Documentation/nvme-boot-part-log.html +++ b/Documentation/nvme-boot-part-log.html @@ -846,7 +846,7 @@

NVME

diff --git a/Documentation/nvme-capacity-mgmt.html b/Documentation/nvme-capacity-mgmt.html index 5a6b17547c..83d85fdc2e 100644 --- a/Documentation/nvme-capacity-mgmt.html +++ b/Documentation/nvme-capacity-mgmt.html @@ -875,7 +875,7 @@

NVME

diff --git a/Documentation/nvme-changed-ns-list-log.html b/Documentation/nvme-changed-ns-list-log.html index 1c41d27fe6..b64feb4688 100644 --- a/Documentation/nvme-changed-ns-list-log.html +++ b/Documentation/nvme-changed-ns-list-log.html @@ -846,7 +846,7 @@

NVME

diff --git a/Documentation/nvme-cmdset-ind-id-ns.html b/Documentation/nvme-cmdset-ind-id-ns.html index 55f944d81d..e8237c9222 100644 --- a/Documentation/nvme-cmdset-ind-id-ns.html +++ b/Documentation/nvme-cmdset-ind-id-ns.html @@ -889,7 +889,7 @@

NVME

diff --git a/Documentation/nvme-compare.html b/Documentation/nvme-compare.html index 3de498874e..1256aafcf6 100644 --- a/Documentation/nvme-compare.html +++ b/Documentation/nvme-compare.html @@ -1125,7 +1125,7 @@

NVME

diff --git a/Documentation/nvme-connect-all.html b/Documentation/nvme-connect-all.html index 0ebb4837f8..4028273370 100644 --- a/Documentation/nvme-connect-all.html +++ b/Documentation/nvme-connect-all.html @@ -1273,7 +1273,7 @@

NVME

diff --git a/Documentation/nvme-connect.html b/Documentation/nvme-connect.html index 7fc1de4f4a..5d892b99d1 100644 --- a/Documentation/nvme-connect.html +++ b/Documentation/nvme-connect.html @@ -1218,7 +1218,7 @@

NVME

diff --git a/Documentation/nvme-copy.html b/Documentation/nvme-copy.html index 825e71302b..913bb52018 100644 --- a/Documentation/nvme-copy.html +++ b/Documentation/nvme-copy.html @@ -1042,7 +1042,7 @@

NVME

diff --git a/Documentation/nvme-create-ns.html b/Documentation/nvme-create-ns.html index 9ca496ae03..382883e3ef 100644 --- a/Documentation/nvme-create-ns.html +++ b/Documentation/nvme-create-ns.html @@ -1082,7 +1082,7 @@

NVME

diff --git a/Documentation/nvme-delete-ns.html b/Documentation/nvme-delete-ns.html index f472d0586b..4785dd1900 100644 --- a/Documentation/nvme-delete-ns.html +++ b/Documentation/nvme-delete-ns.html @@ -835,7 +835,7 @@

NVME

diff --git a/Documentation/nvme-dera-stat.html b/Documentation/nvme-dera-stat.html index 5654a6708c..27e35b6716 100644 --- a/Documentation/nvme-dera-stat.html +++ b/Documentation/nvme-dera-stat.html @@ -797,7 +797,7 @@

NVME

diff --git a/Documentation/nvme-detach-ns.html b/Documentation/nvme-detach-ns.html index d6aa96fee0..99de58536f 100644 --- a/Documentation/nvme-detach-ns.html +++ b/Documentation/nvme-detach-ns.html @@ -834,7 +834,7 @@

NVME

diff --git a/Documentation/nvme-device-self-test.html b/Documentation/nvme-device-self-test.html index 24df69bad2..5bed073085 100644 --- a/Documentation/nvme-device-self-test.html +++ b/Documentation/nvme-device-self-test.html @@ -884,7 +884,7 @@

NVME

diff --git a/Documentation/nvme-dim.html b/Documentation/nvme-dim.html index 31362dfaab..3ecf41ea46 100644 --- a/Documentation/nvme-dim.html +++ b/Documentation/nvme-dim.html @@ -885,7 +885,7 @@

NVME

diff --git a/Documentation/nvme-dir-receive.html b/Documentation/nvme-dir-receive.html index df80793db9..adbc9d2936 100644 --- a/Documentation/nvme-dir-receive.html +++ b/Documentation/nvme-dir-receive.html @@ -1001,7 +1001,7 @@

NVME

diff --git a/Documentation/nvme-dir-send.html b/Documentation/nvme-dir-send.html index f85e0aef0a..ba51be3bd4 100644 --- a/Documentation/nvme-dir-send.html +++ b/Documentation/nvme-dir-send.html @@ -1014,7 +1014,7 @@

NVME

diff --git a/Documentation/nvme-disconnect-all.html b/Documentation/nvme-disconnect-all.html index 9ad129d6a0..e326c994ee 100644 --- a/Documentation/nvme-disconnect-all.html +++ b/Documentation/nvme-disconnect-all.html @@ -825,7 +825,7 @@

NVME

diff --git a/Documentation/nvme-disconnect.html b/Documentation/nvme-disconnect.html index 6eb2b8fdff..e59cd2c799 100644 --- a/Documentation/nvme-disconnect.html +++ b/Documentation/nvme-disconnect.html @@ -862,7 +862,7 @@

NVME

diff --git a/Documentation/nvme-discover.html b/Documentation/nvme-discover.html index 2ff6c7ac93..7c5acd53d3 100644 --- a/Documentation/nvme-discover.html +++ b/Documentation/nvme-discover.html @@ -1322,7 +1322,7 @@

NVME

diff --git a/Documentation/nvme-dsm.html b/Documentation/nvme-dsm.html index e60a602ce2..e43d7c6e6d 100644 --- a/Documentation/nvme-dsm.html +++ b/Documentation/nvme-dsm.html @@ -930,7 +930,7 @@

NVME

diff --git a/Documentation/nvme-effects-log.html b/Documentation/nvme-effects-log.html index 4ad970b7a0..79d7619a05 100644 --- a/Documentation/nvme-effects-log.html +++ b/Documentation/nvme-effects-log.html @@ -869,7 +869,7 @@

NVME

diff --git a/Documentation/nvme-endurance-event-agg-log.html b/Documentation/nvme-endurance-event-agg-log.html index 9a2e0ae981..468067ca2c 100644 --- a/Documentation/nvme-endurance-event-agg-log.html +++ b/Documentation/nvme-endurance-event-agg-log.html @@ -862,7 +862,7 @@

NVME

diff --git a/Documentation/nvme-endurance-log.html b/Documentation/nvme-endurance-log.html index 4f04d61ec8..195a7a937d 100644 --- a/Documentation/nvme-endurance-log.html +++ b/Documentation/nvme-endurance-log.html @@ -845,7 +845,7 @@

NVME

diff --git a/Documentation/nvme-error-log.html b/Documentation/nvme-error-log.html index 24ccfe03ab..8ece59a620 100644 --- a/Documentation/nvme-error-log.html +++ b/Documentation/nvme-error-log.html @@ -860,7 +860,7 @@

NVME

diff --git a/Documentation/nvme-fdp-configs.html b/Documentation/nvme-fdp-configs.html index 1069d582c5..c68466eb3c 100644 --- a/Documentation/nvme-fdp-configs.html +++ b/Documentation/nvme-fdp-configs.html @@ -826,7 +826,7 @@

NVME

diff --git a/Documentation/nvme-fdp-events.html b/Documentation/nvme-fdp-events.html index b1398ee727..e140b9987c 100644 --- a/Documentation/nvme-fdp-events.html +++ b/Documentation/nvme-fdp-events.html @@ -825,7 +825,7 @@

NVME

diff --git a/Documentation/nvme-fdp-set-events.html b/Documentation/nvme-fdp-set-events.html index 91e5d9ad6f..b7870495ee 100644 --- a/Documentation/nvme-fdp-set-events.html +++ b/Documentation/nvme-fdp-set-events.html @@ -816,7 +816,7 @@

NVME

diff --git a/Documentation/nvme-fdp-stats.html b/Documentation/nvme-fdp-stats.html index 45eeca1b1f..c969e04dfd 100644 --- a/Documentation/nvme-fdp-stats.html +++ b/Documentation/nvme-fdp-stats.html @@ -814,7 +814,7 @@

NVME

diff --git a/Documentation/nvme-fdp-status.html b/Documentation/nvme-fdp-status.html index a35f371688..c16589c51e 100644 --- a/Documentation/nvme-fdp-status.html +++ b/Documentation/nvme-fdp-status.html @@ -814,7 +814,7 @@

NVME

diff --git a/Documentation/nvme-fdp-update.html b/Documentation/nvme-fdp-update.html index fdf17ac4aa..6afc7fda27 100644 --- a/Documentation/nvme-fdp-update.html +++ b/Documentation/nvme-fdp-update.html @@ -802,7 +802,7 @@

NVME

diff --git a/Documentation/nvme-fdp-usage.html b/Documentation/nvme-fdp-usage.html index f6a92bd337..a05baab5cd 100644 --- a/Documentation/nvme-fdp-usage.html +++ b/Documentation/nvme-fdp-usage.html @@ -815,7 +815,7 @@

NVME

diff --git a/Documentation/nvme-fid-support-effects-log.html b/Documentation/nvme-fid-support-effects-log.html index 6ccffef271..78c5bd0a25 100644 --- a/Documentation/nvme-fid-support-effects-log.html +++ b/Documentation/nvme-fid-support-effects-log.html @@ -825,7 +825,7 @@

NVME

diff --git a/Documentation/nvme-flush.html b/Documentation/nvme-flush.html index 1c930b60f3..981407a15d 100644 --- a/Documentation/nvme-flush.html +++ b/Documentation/nvme-flush.html @@ -824,7 +824,7 @@

NVME

diff --git a/Documentation/nvme-format.html b/Documentation/nvme-format.html index 7dce135583..b87ab105cd 100644 --- a/Documentation/nvme-format.html +++ b/Documentation/nvme-format.html @@ -1056,7 +1056,7 @@

NVME

diff --git a/Documentation/nvme-fw-commit.html b/Documentation/nvme-fw-commit.html index 0c8bf5a0c4..170b25bcb5 100644 --- a/Documentation/nvme-fw-commit.html +++ b/Documentation/nvme-fw-commit.html @@ -941,7 +941,7 @@

NVME

diff --git a/Documentation/nvme-fw-download.html b/Documentation/nvme-fw-download.html index 950a88cd74..f2f76f95ba 100644 --- a/Documentation/nvme-fw-download.html +++ b/Documentation/nvme-fw-download.html @@ -888,7 +888,7 @@

NVME

diff --git a/Documentation/nvme-fw-log.html b/Documentation/nvme-fw-log.html index 787c8e3342..324c004def 100644 --- a/Documentation/nvme-fw-log.html +++ b/Documentation/nvme-fw-log.html @@ -846,7 +846,7 @@

NVME

diff --git a/Documentation/nvme-gen-hostnqn.html b/Documentation/nvme-gen-hostnqn.html index cc2bc4adde..69afaf81fa 100644 --- a/Documentation/nvme-gen-hostnqn.html +++ b/Documentation/nvme-gen-hostnqn.html @@ -809,7 +809,7 @@

NVME

diff --git a/Documentation/nvme-get-feature.html b/Documentation/nvme-get-feature.html index 83d97c1cf0..58736d1abe 100644 --- a/Documentation/nvme-get-feature.html +++ b/Documentation/nvme-get-feature.html @@ -1016,7 +1016,7 @@

NVME

diff --git a/Documentation/nvme-get-lba-status.html b/Documentation/nvme-get-lba-status.html index 51b477b90a..481720dd6d 100644 --- a/Documentation/nvme-get-lba-status.html +++ b/Documentation/nvme-get-lba-status.html @@ -907,7 +907,7 @@

NVME

diff --git a/Documentation/nvme-get-log.html b/Documentation/nvme-get-log.html index 26c036efac..61625c01b5 100644 --- a/Documentation/nvme-get-log.html +++ b/Documentation/nvme-get-log.html @@ -997,7 +997,7 @@

NVME

diff --git a/Documentation/nvme-get-ns-id.html b/Documentation/nvme-get-ns-id.html index 1800c7e5bd..74606e22ad 100644 --- a/Documentation/nvme-get-ns-id.html +++ b/Documentation/nvme-get-ns-id.html @@ -818,7 +818,7 @@

NVME

diff --git a/Documentation/nvme-get-property.html b/Documentation/nvme-get-property.html index 755234d0bd..fd9c6493a8 100644 --- a/Documentation/nvme-get-property.html +++ b/Documentation/nvme-get-property.html @@ -879,7 +879,7 @@

NVME

diff --git a/Documentation/nvme-help.html b/Documentation/nvme-help.html index 72b8e27d00..335309dc66 100644 --- a/Documentation/nvme-help.html +++ b/Documentation/nvme-help.html @@ -794,7 +794,7 @@

NVME

diff --git a/Documentation/nvme-huawei-id-ctrl.html b/Documentation/nvme-huawei-id-ctrl.html index c34721082c..7f659feb79 100644 --- a/Documentation/nvme-huawei-id-ctrl.html +++ b/Documentation/nvme-huawei-id-ctrl.html @@ -855,7 +855,7 @@

NVME

diff --git a/Documentation/nvme-huawei-list.html b/Documentation/nvme-huawei-list.html index 951a5ce4d5..796ab5f720 100644 --- a/Documentation/nvme-huawei-list.html +++ b/Documentation/nvme-huawei-list.html @@ -797,7 +797,7 @@

NVME

diff --git a/Documentation/nvme-id-ctrl.html b/Documentation/nvme-id-ctrl.html index e57ee1b7ed..c961e640da 100644 --- a/Documentation/nvme-id-ctrl.html +++ b/Documentation/nvme-id-ctrl.html @@ -921,7 +921,7 @@

NVME

diff --git a/Documentation/nvme-id-domain.html b/Documentation/nvme-id-domain.html index df4abd7a49..d4fe6c92da 100644 --- a/Documentation/nvme-id-domain.html +++ b/Documentation/nvme-id-domain.html @@ -823,7 +823,7 @@

NVME

diff --git a/Documentation/nvme-id-iocs.html b/Documentation/nvme-id-iocs.html index 82cdef061d..aaf9d9646c 100644 --- a/Documentation/nvme-id-iocs.html +++ b/Documentation/nvme-id-iocs.html @@ -855,7 +855,7 @@

NVME

diff --git a/Documentation/nvme-id-ns.html b/Documentation/nvme-id-ns.html index 04dc6003c8..f7677c66ad 100644 --- a/Documentation/nvme-id-ns.html +++ b/Documentation/nvme-id-ns.html @@ -966,7 +966,7 @@

NVME

diff --git a/Documentation/nvme-id-nvmset.html b/Documentation/nvme-id-nvmset.html index ba691fa6bd..68ac4bd060 100644 --- a/Documentation/nvme-id-nvmset.html +++ b/Documentation/nvme-id-nvmset.html @@ -862,7 +862,7 @@

EXAMPLES

diff --git a/Documentation/nvme-inspur-nvme-vendor-log.html b/Documentation/nvme-inspur-nvme-vendor-log.html index 9e80244617..012425ee49 100644 --- a/Documentation/nvme-inspur-nvme-vendor-log.html +++ b/Documentation/nvme-inspur-nvme-vendor-log.html @@ -796,7 +796,7 @@

NVME

diff --git a/Documentation/nvme-intel-id-ctrl.html b/Documentation/nvme-intel-id-ctrl.html index 1133c42b01..0de9ae39da 100644 --- a/Documentation/nvme-intel-id-ctrl.html +++ b/Documentation/nvme-intel-id-ctrl.html @@ -853,7 +853,7 @@

NVME

diff --git a/Documentation/nvme-intel-internal-log.html b/Documentation/nvme-intel-internal-log.html index 5cd11e6559..34752849ae 100644 --- a/Documentation/nvme-intel-internal-log.html +++ b/Documentation/nvme-intel-internal-log.html @@ -873,7 +873,7 @@

NVME

diff --git a/Documentation/nvme-intel-lat-stats.html b/Documentation/nvme-intel-lat-stats.html index 3cd4835a0f..41a4ba395b 100644 --- a/Documentation/nvme-intel-lat-stats.html +++ b/Documentation/nvme-intel-lat-stats.html @@ -832,7 +832,7 @@

NVME

diff --git a/Documentation/nvme-intel-market-name.html b/Documentation/nvme-intel-market-name.html index 4d55336570..51db613d58 100644 --- a/Documentation/nvme-intel-market-name.html +++ b/Documentation/nvme-intel-market-name.html @@ -813,7 +813,7 @@

NVME

diff --git a/Documentation/nvme-intel-smart-log-add.html b/Documentation/nvme-intel-smart-log-add.html index d0816cf56b..f233ec34ec 100644 --- a/Documentation/nvme-intel-smart-log-add.html +++ b/Documentation/nvme-intel-smart-log-add.html @@ -849,7 +849,7 @@

NVME

diff --git a/Documentation/nvme-intel-temp-stats.html b/Documentation/nvme-intel-temp-stats.html index 905b81e2ec..2f2370a77a 100644 --- a/Documentation/nvme-intel-temp-stats.html +++ b/Documentation/nvme-intel-temp-stats.html @@ -822,7 +822,7 @@

NVME

diff --git a/Documentation/nvme-io-mgmt-recv.html b/Documentation/nvme-io-mgmt-recv.html index eb6ea2f1ba..add7f26df3 100644 --- a/Documentation/nvme-io-mgmt-recv.html +++ b/Documentation/nvme-io-mgmt-recv.html @@ -881,7 +881,7 @@

NVME

diff --git a/Documentation/nvme-io-mgmt-send.html b/Documentation/nvme-io-mgmt-send.html index a8e8b4a9a4..26ce4784fe 100644 --- a/Documentation/nvme-io-mgmt-send.html +++ b/Documentation/nvme-io-mgmt-send.html @@ -880,7 +880,7 @@

NVME

diff --git a/Documentation/nvme-io-passthru.html b/Documentation/nvme-io-passthru.html index 06190b33a5..220540d283 100644 --- a/Documentation/nvme-io-passthru.html +++ b/Documentation/nvme-io-passthru.html @@ -1030,7 +1030,7 @@

NVME

diff --git a/Documentation/nvme-lba-status-log.html b/Documentation/nvme-lba-status-log.html index 0b9db2555d..24873fb76d 100644 --- a/Documentation/nvme-lba-status-log.html +++ b/Documentation/nvme-lba-status-log.html @@ -843,7 +843,7 @@

EXAMPLES

diff --git a/Documentation/nvme-list-ctrl.html b/Documentation/nvme-list-ctrl.html index f98f0715ea..091aaab729 100644 --- a/Documentation/nvme-list-ctrl.html +++ b/Documentation/nvme-list-ctrl.html @@ -842,7 +842,7 @@

NVME

diff --git a/Documentation/nvme-list-endgrp.html b/Documentation/nvme-list-endgrp.html index 80065cc4cb..a1f6cb3f20 100644 --- a/Documentation/nvme-list-endgrp.html +++ b/Documentation/nvme-list-endgrp.html @@ -826,7 +826,7 @@

NVME

diff --git a/Documentation/nvme-list-ns.html b/Documentation/nvme-list-ns.html index d81b381250..e24d326b03 100644 --- a/Documentation/nvme-list-ns.html +++ b/Documentation/nvme-list-ns.html @@ -883,7 +883,7 @@

NVME

diff --git a/Documentation/nvme-list-subsys.html b/Documentation/nvme-list-subsys.html index 9e47ee52d6..239a34f270 100644 --- a/Documentation/nvme-list-subsys.html +++ b/Documentation/nvme-list-subsys.html @@ -865,7 +865,7 @@

NVME

diff --git a/Documentation/nvme-list.html b/Documentation/nvme-list.html index 8b6d6488ad..cd100906af 100644 --- a/Documentation/nvme-list.html +++ b/Documentation/nvme-list.html @@ -816,7 +816,7 @@

NVME

diff --git a/Documentation/nvme-lockdown.html b/Documentation/nvme-lockdown.html index acb01c47a1..e92f600263 100644 --- a/Documentation/nvme-lockdown.html +++ b/Documentation/nvme-lockdown.html @@ -886,7 +886,7 @@

NVME

diff --git a/Documentation/nvme-mi-cmd-support-effects-log.html b/Documentation/nvme-mi-cmd-support-effects-log.html index 3228579694..fb0b3710bc 100644 --- a/Documentation/nvme-mi-cmd-support-effects-log.html +++ b/Documentation/nvme-mi-cmd-support-effects-log.html @@ -826,7 +826,7 @@

NVME

diff --git a/Documentation/nvme-micron-clear-pcie-errors.html b/Documentation/nvme-micron-clear-pcie-errors.html index e91c06161b..20844f1958 100644 --- a/Documentation/nvme-micron-clear-pcie-errors.html +++ b/Documentation/nvme-micron-clear-pcie-errors.html @@ -798,7 +798,7 @@

NVME

diff --git a/Documentation/nvme-micron-internal-log.html b/Documentation/nvme-micron-internal-log.html index fae6d57f02..14e2f90d76 100644 --- a/Documentation/nvme-micron-internal-log.html +++ b/Documentation/nvme-micron-internal-log.html @@ -814,7 +814,7 @@

NVME

diff --git a/Documentation/nvme-micron-nand-stats.html b/Documentation/nvme-micron-nand-stats.html index 6d1ec6789d..94eeaee993 100644 --- a/Documentation/nvme-micron-nand-stats.html +++ b/Documentation/nvme-micron-nand-stats.html @@ -799,7 +799,7 @@

NVME

diff --git a/Documentation/nvme-micron-pcie-stats.html b/Documentation/nvme-micron-pcie-stats.html index 4002edf7b2..e6798282e0 100644 --- a/Documentation/nvme-micron-pcie-stats.html +++ b/Documentation/nvme-micron-pcie-stats.html @@ -799,7 +799,7 @@

NVME

diff --git a/Documentation/nvme-micron-selective-download.html b/Documentation/nvme-micron-selective-download.html index 057cd28f10..130d846c48 100644 --- a/Documentation/nvme-micron-selective-download.html +++ b/Documentation/nvme-micron-selective-download.html @@ -869,7 +869,7 @@

NVME

diff --git a/Documentation/nvme-micron-smart-add-log.html b/Documentation/nvme-micron-smart-add-log.html index 16c8944e41..6bae29e89b 100644 --- a/Documentation/nvme-micron-smart-add-log.html +++ b/Documentation/nvme-micron-smart-add-log.html @@ -817,7 +817,7 @@

EXAMPLES

diff --git a/Documentation/nvme-micron-temperature-stats.html b/Documentation/nvme-micron-temperature-stats.html index 2bb5caac0a..1a536c0509 100644 --- a/Documentation/nvme-micron-temperature-stats.html +++ b/Documentation/nvme-micron-temperature-stats.html @@ -799,7 +799,7 @@

NVME

diff --git a/Documentation/nvme-netapp-ontapdevices.html b/Documentation/nvme-netapp-ontapdevices.html index 0a54b0b317..54fd561718 100644 --- a/Documentation/nvme-netapp-ontapdevices.html +++ b/Documentation/nvme-netapp-ontapdevices.html @@ -807,7 +807,7 @@

NVME

diff --git a/Documentation/nvme-netapp-smdevices.html b/Documentation/nvme-netapp-smdevices.html index cf39fce8b4..3b55d94d28 100644 --- a/Documentation/nvme-netapp-smdevices.html +++ b/Documentation/nvme-netapp-smdevices.html @@ -809,7 +809,7 @@

NVME

diff --git a/Documentation/nvme-ns-descs.html b/Documentation/nvme-ns-descs.html index a80e751095..f5739b0a5b 100644 --- a/Documentation/nvme-ns-descs.html +++ b/Documentation/nvme-ns-descs.html @@ -867,7 +867,7 @@

NVME

diff --git a/Documentation/nvme-ns-rescan.html b/Documentation/nvme-ns-rescan.html index 2588877381..a09d1f66e2 100644 --- a/Documentation/nvme-ns-rescan.html +++ b/Documentation/nvme-ns-rescan.html @@ -818,7 +818,7 @@

NVME

diff --git a/Documentation/nvme-nvm-id-ctrl.html b/Documentation/nvme-nvm-id-ctrl.html index b16d440742..8eb3a292f3 100644 --- a/Documentation/nvme-nvm-id-ctrl.html +++ b/Documentation/nvme-nvm-id-ctrl.html @@ -832,7 +832,7 @@

NVME

diff --git a/Documentation/nvme-nvme-mi-recv.html b/Documentation/nvme-nvme-mi-recv.html index 6a30a20289..760bba4b06 100644 --- a/Documentation/nvme-nvme-mi-recv.html +++ b/Documentation/nvme-nvme-mi-recv.html @@ -905,7 +905,7 @@

NVME

diff --git a/Documentation/nvme-nvme-mi-send.html b/Documentation/nvme-nvme-mi-send.html index 0fd94b0c03..aeaa615de5 100644 --- a/Documentation/nvme-nvme-mi-send.html +++ b/Documentation/nvme-nvme-mi-send.html @@ -905,7 +905,7 @@

NVME

diff --git a/Documentation/nvme-ocp-clear-fw-activate-history.html b/Documentation/nvme-ocp-clear-fw-activate-history.html index 29e8be6f52..634676efe6 100644 --- a/Documentation/nvme-ocp-clear-fw-activate-history.html +++ b/Documentation/nvme-ocp-clear-fw-activate-history.html @@ -817,7 +817,7 @@

NVME

diff --git a/Documentation/nvme-ocp-clear-pcie-correctable-error-counters.html b/Documentation/nvme-ocp-clear-pcie-correctable-error-counters.html index 92cfa7ada3..3686ec70dc 100644 --- a/Documentation/nvme-ocp-clear-pcie-correctable-error-counters.html +++ b/Documentation/nvme-ocp-clear-pcie-correctable-error-counters.html @@ -817,7 +817,7 @@

NVME

diff --git a/Documentation/nvme-ocp-device-capability-log.html b/Documentation/nvme-ocp-device-capability-log.html index 5f4fcafc8b..64c1dc891f 100644 --- a/Documentation/nvme-ocp-device-capability-log.html +++ b/Documentation/nvme-ocp-device-capability-log.html @@ -811,7 +811,7 @@

NVME

diff --git a/Documentation/nvme-ocp-eol-plp-failure-mode.html b/Documentation/nvme-ocp-eol-plp-failure-mode.html index 1057ab7645..a6f8509cc9 100644 --- a/Documentation/nvme-ocp-eol-plp-failure-mode.html +++ b/Documentation/nvme-ocp-eol-plp-failure-mode.html @@ -886,7 +886,7 @@

NVME

diff --git a/Documentation/nvme-ocp-error-recovery-log.html b/Documentation/nvme-ocp-error-recovery-log.html index 6a0dba0a8f..bdacc176e0 100644 --- a/Documentation/nvme-ocp-error-recovery-log.html +++ b/Documentation/nvme-ocp-error-recovery-log.html @@ -811,7 +811,7 @@

NVME

diff --git a/Documentation/nvme-ocp-get-dssd-async-event-config.html b/Documentation/nvme-ocp-get-dssd-async-event-config.html index e2372f1cdf..03ddc89257 100644 --- a/Documentation/nvme-ocp-get-dssd-async-event-config.html +++ b/Documentation/nvme-ocp-get-dssd-async-event-config.html @@ -846,7 +846,7 @@

NVME

diff --git a/Documentation/nvme-ocp-get-dssd-power-state-feature.html b/Documentation/nvme-ocp-get-dssd-power-state-feature.html index 93f94bf400..e714876a27 100644 --- a/Documentation/nvme-ocp-get-dssd-power-state-feature.html +++ b/Documentation/nvme-ocp-get-dssd-power-state-feature.html @@ -883,7 +883,7 @@

NVME

diff --git a/Documentation/nvme-ocp-get-plp-health-check-interval.html b/Documentation/nvme-ocp-get-plp-health-check-interval.html index 241969adc5..e3a13ba2e6 100644 --- a/Documentation/nvme-ocp-get-plp-health-check-interval.html +++ b/Documentation/nvme-ocp-get-plp-health-check-interval.html @@ -847,7 +847,7 @@

NVME

diff --git a/Documentation/nvme-ocp-internal-log.html b/Documentation/nvme-ocp-internal-log.html index b2b4ca3bc3..07978f85d1 100644 --- a/Documentation/nvme-ocp-internal-log.html +++ b/Documentation/nvme-ocp-internal-log.html @@ -918,7 +918,7 @@

NVME

diff --git a/Documentation/nvme-ocp-latency-monitor-log.html b/Documentation/nvme-ocp-latency-monitor-log.html index b271e1b6e7..093640ab3b 100644 --- a/Documentation/nvme-ocp-latency-monitor-log.html +++ b/Documentation/nvme-ocp-latency-monitor-log.html @@ -811,7 +811,7 @@

NVME

diff --git a/Documentation/nvme-ocp-set-dssd-async-event-config.html b/Documentation/nvme-ocp-set-dssd-async-event-config.html index 286dc8418f..abedb8f719 100644 --- a/Documentation/nvme-ocp-set-dssd-async-event-config.html +++ b/Documentation/nvme-ocp-set-dssd-async-event-config.html @@ -822,7 +822,7 @@

NVME

diff --git a/Documentation/nvme-ocp-set-dssd-power-state-feature.html b/Documentation/nvme-ocp-set-dssd-power-state-feature.html index 7c026cff9c..bdf704c720 100644 --- a/Documentation/nvme-ocp-set-dssd-power-state-feature.html +++ b/Documentation/nvme-ocp-set-dssd-power-state-feature.html @@ -812,7 +812,7 @@

NVME

diff --git a/Documentation/nvme-ocp-set-plp-health-check-interval.html b/Documentation/nvme-ocp-set-plp-health-check-interval.html index 168bd20f27..972f773f06 100644 --- a/Documentation/nvme-ocp-set-plp-health-check-interval.html +++ b/Documentation/nvme-ocp-set-plp-health-check-interval.html @@ -834,7 +834,7 @@

NVME

diff --git a/Documentation/nvme-ocp-set-telemetry-profile.html b/Documentation/nvme-ocp-set-telemetry-profile.html index 06e297de96..866afd43c4 100644 --- a/Documentation/nvme-ocp-set-telemetry-profile.html +++ b/Documentation/nvme-ocp-set-telemetry-profile.html @@ -812,7 +812,7 @@

NVME

diff --git a/Documentation/nvme-ocp-smart-add-log.html b/Documentation/nvme-ocp-smart-add-log.html index a7c610bf3a..1c53f4cb12 100644 --- a/Documentation/nvme-ocp-smart-add-log.html +++ b/Documentation/nvme-ocp-smart-add-log.html @@ -812,7 +812,7 @@

NVME

diff --git a/Documentation/nvme-ocp-telemetry-string-log-page.html b/Documentation/nvme-ocp-telemetry-string-log-page.html index 7c0ddb7c74..2ecda61b5e 100644 --- a/Documentation/nvme-ocp-telemetry-string-log-page.html +++ b/Documentation/nvme-ocp-telemetry-string-log-page.html @@ -811,7 +811,7 @@

NVME

diff --git a/Documentation/nvme-ocp-unsupported-reqs-log.html b/Documentation/nvme-ocp-unsupported-reqs-log.html index 60dd359baa..2cb6a2896f 100644 --- a/Documentation/nvme-ocp-unsupported-reqs-log.html +++ b/Documentation/nvme-ocp-unsupported-reqs-log.html @@ -812,7 +812,7 @@

NVME

diff --git a/Documentation/nvme-persistent-event-log.html b/Documentation/nvme-persistent-event-log.html index 613937177f..6cf4cfbe01 100644 --- a/Documentation/nvme-persistent-event-log.html +++ b/Documentation/nvme-persistent-event-log.html @@ -877,7 +877,7 @@

NVME

diff --git a/Documentation/nvme-pred-lat-event-agg-log.html b/Documentation/nvme-pred-lat-event-agg-log.html index 3823cda89e..83f7c0643f 100644 --- a/Documentation/nvme-pred-lat-event-agg-log.html +++ b/Documentation/nvme-pred-lat-event-agg-log.html @@ -864,7 +864,7 @@

NVME

diff --git a/Documentation/nvme-predictable-lat-log.html b/Documentation/nvme-predictable-lat-log.html index 6f92f2a286..9552644360 100644 --- a/Documentation/nvme-predictable-lat-log.html +++ b/Documentation/nvme-predictable-lat-log.html @@ -861,7 +861,7 @@

NVME

diff --git a/Documentation/nvme-primary-ctrl-caps.html b/Documentation/nvme-primary-ctrl-caps.html index 5459747ae3..02ccca19b4 100644 --- a/Documentation/nvme-primary-ctrl-caps.html +++ b/Documentation/nvme-primary-ctrl-caps.html @@ -846,7 +846,7 @@

NVME

diff --git a/Documentation/nvme-read.html b/Documentation/nvme-read.html index 033ca3e99d..bf1992290e 100644 --- a/Documentation/nvme-read.html +++ b/Documentation/nvme-read.html @@ -1096,7 +1096,7 @@

NVME

diff --git a/Documentation/nvme-reset.html b/Documentation/nvme-reset.html index 8b4f205b9f..7f96396f19 100644 --- a/Documentation/nvme-reset.html +++ b/Documentation/nvme-reset.html @@ -818,7 +818,7 @@

NVME

diff --git a/Documentation/nvme-resv-acquire.html b/Documentation/nvme-resv-acquire.html index 7ba956a954..765f0b2b20 100644 --- a/Documentation/nvme-resv-acquire.html +++ b/Documentation/nvme-resv-acquire.html @@ -980,7 +980,7 @@

NVME

diff --git a/Documentation/nvme-resv-notif-log.html b/Documentation/nvme-resv-notif-log.html index 8d36930758..fc6c388ebb 100644 --- a/Documentation/nvme-resv-notif-log.html +++ b/Documentation/nvme-resv-notif-log.html @@ -833,7 +833,7 @@

NVME

diff --git a/Documentation/nvme-resv-register.html b/Documentation/nvme-resv-register.html index c5892e50f5..d2c828e161 100644 --- a/Documentation/nvme-resv-register.html +++ b/Documentation/nvme-resv-register.html @@ -972,7 +972,7 @@

NVME

diff --git a/Documentation/nvme-resv-release.html b/Documentation/nvme-resv-release.html index ca7f39abd1..2393128599 100644 --- a/Documentation/nvme-resv-release.html +++ b/Documentation/nvme-resv-release.html @@ -962,7 +962,7 @@

NVME

diff --git a/Documentation/nvme-resv-report.html b/Documentation/nvme-resv-report.html index a9ad343c6a..a7c5fca024 100644 --- a/Documentation/nvme-resv-report.html +++ b/Documentation/nvme-resv-report.html @@ -877,7 +877,7 @@

NVME

diff --git a/Documentation/nvme-rpmb.html b/Documentation/nvme-rpmb.html index b8c4d4b536..fbb54ba911 100644 --- a/Documentation/nvme-rpmb.html +++ b/Documentation/nvme-rpmb.html @@ -1024,7 +1024,7 @@

NVME

diff --git a/Documentation/nvme-sanitize-log.html b/Documentation/nvme-sanitize-log.html index db6cdf0454..e59abae55e 100644 --- a/Documentation/nvme-sanitize-log.html +++ b/Documentation/nvme-sanitize-log.html @@ -903,7 +903,7 @@

NVME

diff --git a/Documentation/nvme-sanitize.html b/Documentation/nvme-sanitize.html index dbdf1f6ef0..a153bc9088 100644 --- a/Documentation/nvme-sanitize.html +++ b/Documentation/nvme-sanitize.html @@ -960,7 +960,7 @@

NVME

diff --git a/Documentation/nvme-seagate-clear-fw-activate-history.html b/Documentation/nvme-seagate-clear-fw-activate-history.html index 88c5fd7f7c..14298ddd85 100644 --- a/Documentation/nvme-seagate-clear-fw-activate-history.html +++ b/Documentation/nvme-seagate-clear-fw-activate-history.html @@ -792,7 +792,7 @@

NVME

diff --git a/Documentation/nvme-seagate-clear-pcie-correctable-errors.html b/Documentation/nvme-seagate-clear-pcie-correctable-errors.html index 587cfd51a3..9235d57515 100644 --- a/Documentation/nvme-seagate-clear-pcie-correctable-errors.html +++ b/Documentation/nvme-seagate-clear-pcie-correctable-errors.html @@ -802,7 +802,7 @@

NVME

diff --git a/Documentation/nvme-seagate-cloud-SSD-plugin-version.html b/Documentation/nvme-seagate-cloud-SSD-plugin-version.html index 97c96a56d5..6b34ac6654 100644 --- a/Documentation/nvme-seagate-cloud-SSD-plugin-version.html +++ b/Documentation/nvme-seagate-cloud-SSD-plugin-version.html @@ -787,7 +787,7 @@

NVME

diff --git a/Documentation/nvme-seagate-get-ctrl-tele.html b/Documentation/nvme-seagate-get-ctrl-tele.html index 999558d626..fc7f6c4891 100644 --- a/Documentation/nvme-seagate-get-ctrl-tele.html +++ b/Documentation/nvme-seagate-get-ctrl-tele.html @@ -813,7 +813,7 @@

NVME

diff --git a/Documentation/nvme-seagate-get-host-tele.html b/Documentation/nvme-seagate-get-host-tele.html index 6c3e69df1c..5ed448952d 100644 --- a/Documentation/nvme-seagate-get-host-tele.html +++ b/Documentation/nvme-seagate-get-host-tele.html @@ -826,7 +826,7 @@

NVME

diff --git a/Documentation/nvme-seagate-help.html b/Documentation/nvme-seagate-help.html index 9471fd67ec..af973cb798 100644 --- a/Documentation/nvme-seagate-help.html +++ b/Documentation/nvme-seagate-help.html @@ -812,7 +812,7 @@

NVME

diff --git a/Documentation/nvme-seagate-plugin-version.html b/Documentation/nvme-seagate-plugin-version.html index 796974adfa..be1b5308a7 100644 --- a/Documentation/nvme-seagate-plugin-version.html +++ b/Documentation/nvme-seagate-plugin-version.html @@ -787,7 +787,7 @@

NVME

diff --git a/Documentation/nvme-seagate-version.html b/Documentation/nvme-seagate-version.html index 16a951081a..af0be7dbc7 100644 --- a/Documentation/nvme-seagate-version.html +++ b/Documentation/nvme-seagate-version.html @@ -787,7 +787,7 @@

NVME

diff --git a/Documentation/nvme-seagate-vs-fw-activate-history.html b/Documentation/nvme-seagate-vs-fw-activate-history.html index b008b3cde9..1b1eefcd04 100644 --- a/Documentation/nvme-seagate-vs-fw-activate-history.html +++ b/Documentation/nvme-seagate-vs-fw-activate-history.html @@ -813,7 +813,7 @@

NVME

diff --git a/Documentation/nvme-seagate-vs-internal-log.html b/Documentation/nvme-seagate-vs-internal-log.html index a7b3c67e34..c5109d6e72 100644 --- a/Documentation/nvme-seagate-vs-internal-log.html +++ b/Documentation/nvme-seagate-vs-internal-log.html @@ -814,7 +814,7 @@

NVME

diff --git a/Documentation/nvme-seagate-vs-log-page-sup.html b/Documentation/nvme-seagate-vs-log-page-sup.html index 45d1e46026..2deed2f2b8 100644 --- a/Documentation/nvme-seagate-vs-log-page-sup.html +++ b/Documentation/nvme-seagate-vs-log-page-sup.html @@ -814,7 +814,7 @@

NVME

diff --git a/Documentation/nvme-seagate-vs-pcie-stats.html b/Documentation/nvme-seagate-vs-pcie-stats.html index 75ec980050..a4cef95d0b 100644 --- a/Documentation/nvme-seagate-vs-pcie-stats.html +++ b/Documentation/nvme-seagate-vs-pcie-stats.html @@ -802,7 +802,7 @@

NVME

diff --git a/Documentation/nvme-seagate-vs-smart-add-log.html b/Documentation/nvme-seagate-vs-smart-add-log.html index 619d85a5f8..5e0a3eb6c5 100644 --- a/Documentation/nvme-seagate-vs-smart-add-log.html +++ b/Documentation/nvme-seagate-vs-smart-add-log.html @@ -830,7 +830,7 @@

NVME

diff --git a/Documentation/nvme-seagate-vs-temperature-stats.html b/Documentation/nvme-seagate-vs-temperature-stats.html index 1cae57700d..8d317baaee 100644 --- a/Documentation/nvme-seagate-vs-temperature-stats.html +++ b/Documentation/nvme-seagate-vs-temperature-stats.html @@ -802,7 +802,7 @@

NVME

diff --git a/Documentation/nvme-security-recv.html b/Documentation/nvme-security-recv.html index 0943e911b7..361dd4c99b 100644 --- a/Documentation/nvme-security-recv.html +++ b/Documentation/nvme-security-recv.html @@ -918,7 +918,7 @@

NVME

diff --git a/Documentation/nvme-security-send.html b/Documentation/nvme-security-send.html index 81ce63be2e..9c6668266f 100644 --- a/Documentation/nvme-security-send.html +++ b/Documentation/nvme-security-send.html @@ -905,7 +905,7 @@

NVME

diff --git a/Documentation/nvme-self-test-log.html b/Documentation/nvme-self-test-log.html index 8b2dda4dec..f1a5ca5c0a 100644 --- a/Documentation/nvme-self-test-log.html +++ b/Documentation/nvme-self-test-log.html @@ -858,7 +858,7 @@

NVME

diff --git a/Documentation/nvme-set-feature.html b/Documentation/nvme-set-feature.html index 28d2bdb7f7..c568aa72be 100644 --- a/Documentation/nvme-set-feature.html +++ b/Documentation/nvme-set-feature.html @@ -946,7 +946,7 @@

NVME

diff --git a/Documentation/nvme-set-property.html b/Documentation/nvme-set-property.html index 954322ef99..a0e560df26 100644 --- a/Documentation/nvme-set-property.html +++ b/Documentation/nvme-set-property.html @@ -843,7 +843,7 @@

NVME

diff --git a/Documentation/nvme-show-hostnqn.html b/Documentation/nvme-show-hostnqn.html index b5cadf0636..ce830d5c57 100644 --- a/Documentation/nvme-show-hostnqn.html +++ b/Documentation/nvme-show-hostnqn.html @@ -809,7 +809,7 @@

NVME

diff --git a/Documentation/nvme-show-regs.html b/Documentation/nvme-show-regs.html index b4439a5170..043d8b0162 100644 --- a/Documentation/nvme-show-regs.html +++ b/Documentation/nvme-show-regs.html @@ -871,7 +871,7 @@

NVME

diff --git a/Documentation/nvme-show-topology.html b/Documentation/nvme-show-topology.html index ee373af4af..03fafe7d5f 100644 --- a/Documentation/nvme-show-topology.html +++ b/Documentation/nvme-show-topology.html @@ -845,7 +845,7 @@

NVME

diff --git a/Documentation/nvme-smart-log.html b/Documentation/nvme-smart-log.html index 858a6cf30d..51309946cb 100644 --- a/Documentation/nvme-smart-log.html +++ b/Documentation/nvme-smart-log.html @@ -861,7 +861,7 @@

NVME

diff --git a/Documentation/nvme-subsystem-reset.html b/Documentation/nvme-subsystem-reset.html index 388298a1ce..b3476478de 100644 --- a/Documentation/nvme-subsystem-reset.html +++ b/Documentation/nvme-subsystem-reset.html @@ -819,7 +819,7 @@

NVME

diff --git a/Documentation/nvme-supported-log-pages.html b/Documentation/nvme-supported-log-pages.html index e1675565b9..52bb86ca39 100644 --- a/Documentation/nvme-supported-log-pages.html +++ b/Documentation/nvme-supported-log-pages.html @@ -813,7 +813,7 @@

NVME

diff --git a/Documentation/nvme-telemetry-log.html b/Documentation/nvme-telemetry-log.html index f34627c52d..830d9685c7 100644 --- a/Documentation/nvme-telemetry-log.html +++ b/Documentation/nvme-telemetry-log.html @@ -862,7 +862,7 @@

NVME

diff --git a/Documentation/nvme-tls-key.html b/Documentation/nvme-tls-key.html index 6ccd3a1d42..d3cf0da694 100644 --- a/Documentation/nvme-tls-key.html +++ b/Documentation/nvme-tls-key.html @@ -951,7 +951,7 @@

NVME

diff --git a/Documentation/nvme-toshiba-clear-pcie-correctable-errors.html b/Documentation/nvme-toshiba-clear-pcie-correctable-errors.html index 5b35ad9d43..deda2c7302 100644 --- a/Documentation/nvme-toshiba-clear-pcie-correctable-errors.html +++ b/Documentation/nvme-toshiba-clear-pcie-correctable-errors.html @@ -791,7 +791,7 @@

NVME

diff --git a/Documentation/nvme-toshiba-vs-internal-log.html b/Documentation/nvme-toshiba-vs-internal-log.html index c6b0480623..4d71073621 100644 --- a/Documentation/nvme-toshiba-vs-internal-log.html +++ b/Documentation/nvme-toshiba-vs-internal-log.html @@ -837,7 +837,7 @@

NVME

diff --git a/Documentation/nvme-toshiba-vs-smart-add-log.html b/Documentation/nvme-toshiba-vs-smart-add-log.html index ce97be3a7a..2bda8a5b6a 100644 --- a/Documentation/nvme-toshiba-vs-smart-add-log.html +++ b/Documentation/nvme-toshiba-vs-smart-add-log.html @@ -841,7 +841,7 @@

NVME

diff --git a/Documentation/nvme-transcend-badblock.html b/Documentation/nvme-transcend-badblock.html index a0da565f63..35dc9f7dff 100644 --- a/Documentation/nvme-transcend-badblock.html +++ b/Documentation/nvme-transcend-badblock.html @@ -796,7 +796,7 @@

NVME

diff --git a/Documentation/nvme-transcend-healthvalue.html b/Documentation/nvme-transcend-healthvalue.html index 33482b3358..7fb219e4f1 100644 --- a/Documentation/nvme-transcend-healthvalue.html +++ b/Documentation/nvme-transcend-healthvalue.html @@ -797,7 +797,7 @@

NVME

diff --git a/Documentation/nvme-verify.html b/Documentation/nvme-verify.html index d213bdb8a5..55fc404dc7 100644 --- a/Documentation/nvme-verify.html +++ b/Documentation/nvme-verify.html @@ -988,7 +988,7 @@

NVME

diff --git a/Documentation/nvme-virtium-save-smart-to-vtview-log.html b/Documentation/nvme-virtium-save-smart-to-vtview-log.html index 62c36c7995..7cec51609d 100644 --- a/Documentation/nvme-virtium-save-smart-to-vtview-log.html +++ b/Documentation/nvme-virtium-save-smart-to-vtview-log.html @@ -878,7 +878,7 @@

NVME

diff --git a/Documentation/nvme-virtium-show-identify.html b/Documentation/nvme-virtium-show-identify.html index 9bf1ce9865..8c1fa913be 100644 --- a/Documentation/nvme-virtium-show-identify.html +++ b/Documentation/nvme-virtium-show-identify.html @@ -798,7 +798,7 @@

NVME

diff --git a/Documentation/nvme-wdc-cap-diag.html b/Documentation/nvme-wdc-cap-diag.html index c64c757f27..aa5cbccdc5 100644 --- a/Documentation/nvme-wdc-cap-diag.html +++ b/Documentation/nvme-wdc-cap-diag.html @@ -856,7 +856,7 @@

NVME

diff --git a/Documentation/nvme-wdc-capabilities.html b/Documentation/nvme-wdc-capabilities.html index 7035c9972e..63b7f1365a 100644 --- a/Documentation/nvme-wdc-capabilities.html +++ b/Documentation/nvme-wdc-capabilities.html @@ -789,7 +789,7 @@

NVME

diff --git a/Documentation/nvme-wdc-clear-assert-dump.html b/Documentation/nvme-wdc-clear-assert-dump.html index 467fbc597b..8aff843df4 100644 --- a/Documentation/nvme-wdc-clear-assert-dump.html +++ b/Documentation/nvme-wdc-clear-assert-dump.html @@ -798,7 +798,7 @@

NVME

diff --git a/Documentation/nvme-wdc-clear-fw-activate-history.html b/Documentation/nvme-wdc-clear-fw-activate-history.html index de299f6ed4..c5fff275a9 100644 --- a/Documentation/nvme-wdc-clear-fw-activate-history.html +++ b/Documentation/nvme-wdc-clear-fw-activate-history.html @@ -797,7 +797,7 @@

NVME

diff --git a/Documentation/nvme-wdc-clear-pcie-correctable-errors.html b/Documentation/nvme-wdc-clear-pcie-correctable-errors.html index d5a4627a88..40db2f36d6 100644 --- a/Documentation/nvme-wdc-clear-pcie-correctable-errors.html +++ b/Documentation/nvme-wdc-clear-pcie-correctable-errors.html @@ -799,7 +799,7 @@

NVME

diff --git a/Documentation/nvme-wdc-cloud-SSD-plugin-version.html b/Documentation/nvme-wdc-cloud-SSD-plugin-version.html index d730554aff..c86e2933b2 100644 --- a/Documentation/nvme-wdc-cloud-SSD-plugin-version.html +++ b/Documentation/nvme-wdc-cloud-SSD-plugin-version.html @@ -790,7 +790,7 @@

NVME

diff --git a/Documentation/nvme-wdc-cloud-boot-SSD-version.html b/Documentation/nvme-wdc-cloud-boot-SSD-version.html index e16e5774e4..7e5ee04985 100644 --- a/Documentation/nvme-wdc-cloud-boot-SSD-version.html +++ b/Documentation/nvme-wdc-cloud-boot-SSD-version.html @@ -790,7 +790,7 @@

NVME

diff --git a/Documentation/nvme-wdc-drive-essentials.html b/Documentation/nvme-wdc-drive-essentials.html index 47fe9ff761..150a798d21 100644 --- a/Documentation/nvme-wdc-drive-essentials.html +++ b/Documentation/nvme-wdc-drive-essentials.html @@ -822,7 +822,7 @@

NVME

diff --git a/Documentation/nvme-wdc-drive-log.html b/Documentation/nvme-wdc-drive-log.html index 48117e0201..b487ffe48e 100644 --- a/Documentation/nvme-wdc-drive-log.html +++ b/Documentation/nvme-wdc-drive-log.html @@ -829,7 +829,7 @@

NVME

diff --git a/Documentation/nvme-wdc-drive-resize.html b/Documentation/nvme-wdc-drive-resize.html index 4f4e5e14f0..ec099635e5 100644 --- a/Documentation/nvme-wdc-drive-resize.html +++ b/Documentation/nvme-wdc-drive-resize.html @@ -810,7 +810,7 @@

NVME

diff --git a/Documentation/nvme-wdc-enc-get-log.html b/Documentation/nvme-wdc-enc-get-log.html index 81c6653ed3..cccb2efd5f 100644 --- a/Documentation/nvme-wdc-enc-get-log.html +++ b/Documentation/nvme-wdc-enc-get-log.html @@ -837,7 +837,7 @@

NVME

diff --git a/Documentation/nvme-wdc-get-crash-dump.html b/Documentation/nvme-wdc-get-crash-dump.html index 919638dca7..fc10120fc7 100644 --- a/Documentation/nvme-wdc-get-crash-dump.html +++ b/Documentation/nvme-wdc-get-crash-dump.html @@ -830,7 +830,7 @@

NVME

diff --git a/Documentation/nvme-wdc-get-dev-capabilities-log.html b/Documentation/nvme-wdc-get-dev-capabilities-log.html index c0a61a02cc..7b363cf93e 100644 --- a/Documentation/nvme-wdc-get-dev-capabilities-log.html +++ b/Documentation/nvme-wdc-get-dev-capabilities-log.html @@ -815,7 +815,7 @@

NVME

diff --git a/Documentation/nvme-wdc-get-drive-status.html b/Documentation/nvme-wdc-get-drive-status.html index 783dd97232..849c359a5d 100644 --- a/Documentation/nvme-wdc-get-drive-status.html +++ b/Documentation/nvme-wdc-get-drive-status.html @@ -836,7 +836,7 @@

NVME

diff --git a/Documentation/nvme-wdc-get-error-recovery-log.html b/Documentation/nvme-wdc-get-error-recovery-log.html index adbe5fc442..6f3f4b68e3 100644 --- a/Documentation/nvme-wdc-get-error-recovery-log.html +++ b/Documentation/nvme-wdc-get-error-recovery-log.html @@ -816,7 +816,7 @@

NVME

diff --git a/Documentation/nvme-wdc-get-latency-monitor-log.html b/Documentation/nvme-wdc-get-latency-monitor-log.html index c966c36ee2..9d52038f9e 100644 --- a/Documentation/nvme-wdc-get-latency-monitor-log.html +++ b/Documentation/nvme-wdc-get-latency-monitor-log.html @@ -810,7 +810,7 @@

NVME

diff --git a/Documentation/nvme-wdc-get-pfail-dump.html b/Documentation/nvme-wdc-get-pfail-dump.html index eef13f1023..a015d7e3b7 100644 --- a/Documentation/nvme-wdc-get-pfail-dump.html +++ b/Documentation/nvme-wdc-get-pfail-dump.html @@ -832,7 +832,7 @@

NVME

diff --git a/Documentation/nvme-wdc-get-unsupported-reqs-log.html b/Documentation/nvme-wdc-get-unsupported-reqs-log.html index 0e7e3c4122..c0a4a7cb1b 100644 --- a/Documentation/nvme-wdc-get-unsupported-reqs-log.html +++ b/Documentation/nvme-wdc-get-unsupported-reqs-log.html @@ -816,7 +816,7 @@

NVME

diff --git a/Documentation/nvme-wdc-id-ctrl.html b/Documentation/nvme-wdc-id-ctrl.html index b30c935b86..4722bb45da 100644 --- a/Documentation/nvme-wdc-id-ctrl.html +++ b/Documentation/nvme-wdc-id-ctrl.html @@ -856,7 +856,7 @@

NVME

diff --git a/Documentation/nvme-wdc-log-page-directory.html b/Documentation/nvme-wdc-log-page-directory.html index 35ca13906d..9e46ff500a 100644 --- a/Documentation/nvme-wdc-log-page-directory.html +++ b/Documentation/nvme-wdc-log-page-directory.html @@ -812,7 +812,7 @@

NVME

diff --git a/Documentation/nvme-wdc-namespace-resize.html b/Documentation/nvme-wdc-namespace-resize.html index b404a0f1eb..3820177458 100644 --- a/Documentation/nvme-wdc-namespace-resize.html +++ b/Documentation/nvme-wdc-namespace-resize.html @@ -836,7 +836,7 @@

NVME

diff --git a/Documentation/nvme-wdc-purge-monitor.html b/Documentation/nvme-wdc-purge-monitor.html index 4ae950fe2a..1dedc96fcb 100644 --- a/Documentation/nvme-wdc-purge-monitor.html +++ b/Documentation/nvme-wdc-purge-monitor.html @@ -837,7 +837,7 @@

NVME

diff --git a/Documentation/nvme-wdc-purge.html b/Documentation/nvme-wdc-purge.html index 509465c00a..e42c43f026 100644 --- a/Documentation/nvme-wdc-purge.html +++ b/Documentation/nvme-wdc-purge.html @@ -799,7 +799,7 @@

NVME

diff --git a/Documentation/nvme-wdc-vs-cloud-log.html b/Documentation/nvme-wdc-vs-cloud-log.html index cfcc2c6eb3..cdce8dbe23 100644 --- a/Documentation/nvme-wdc-vs-cloud-log.html +++ b/Documentation/nvme-wdc-vs-cloud-log.html @@ -828,7 +828,7 @@

NVME

diff --git a/Documentation/nvme-wdc-vs-device-waf.html b/Documentation/nvme-wdc-vs-device-waf.html index ac30160c8a..a476b30c12 100644 --- a/Documentation/nvme-wdc-vs-device-waf.html +++ b/Documentation/nvme-wdc-vs-device-waf.html @@ -828,7 +828,7 @@

NVME

diff --git a/Documentation/nvme-wdc-vs-drive-info.html b/Documentation/nvme-wdc-vs-drive-info.html index 94e89335f2..b4730f0a08 100644 --- a/Documentation/nvme-wdc-vs-drive-info.html +++ b/Documentation/nvme-wdc-vs-drive-info.html @@ -795,7 +795,7 @@

NVME

diff --git a/Documentation/nvme-wdc-vs-error-reason-identifier.html b/Documentation/nvme-wdc-vs-error-reason-identifier.html index 8bc69119c9..551e6cbbd9 100644 --- a/Documentation/nvme-wdc-vs-error-reason-identifier.html +++ b/Documentation/nvme-wdc-vs-error-reason-identifier.html @@ -836,7 +836,7 @@

NVME

diff --git a/Documentation/nvme-wdc-vs-fw-activate-history.html b/Documentation/nvme-wdc-vs-fw-activate-history.html index 37d3a9fe17..4db88c2307 100644 --- a/Documentation/nvme-wdc-vs-fw-activate-history.html +++ b/Documentation/nvme-wdc-vs-fw-activate-history.html @@ -868,7 +868,7 @@

NVME

diff --git a/Documentation/nvme-wdc-vs-hw-rev-log.html b/Documentation/nvme-wdc-vs-hw-rev-log.html index b35b46c639..1490e00cf3 100644 --- a/Documentation/nvme-wdc-vs-hw-rev-log.html +++ b/Documentation/nvme-wdc-vs-hw-rev-log.html @@ -827,7 +827,7 @@

NVME

diff --git a/Documentation/nvme-wdc-vs-internal-log.html b/Documentation/nvme-wdc-vs-internal-log.html index d37918e49c..6726a2eb9a 100644 --- a/Documentation/nvme-wdc-vs-internal-log.html +++ b/Documentation/nvme-wdc-vs-internal-log.html @@ -958,7 +958,7 @@

NVME

diff --git a/Documentation/nvme-wdc-vs-nand-stats.html b/Documentation/nvme-wdc-vs-nand-stats.html index b7fa8d5e2f..99ad282824 100644 --- a/Documentation/nvme-wdc-vs-nand-stats.html +++ b/Documentation/nvme-wdc-vs-nand-stats.html @@ -814,7 +814,7 @@

NVME

diff --git a/Documentation/nvme-wdc-vs-smart-add-log.html b/Documentation/nvme-wdc-vs-smart-add-log.html index c68a2e6b5b..cc20c60691 100644 --- a/Documentation/nvme-wdc-vs-smart-add-log.html +++ b/Documentation/nvme-wdc-vs-smart-add-log.html @@ -928,7 +928,7 @@

NVME

diff --git a/Documentation/nvme-wdc-vs-telemetry-controller-option.html b/Documentation/nvme-wdc-vs-telemetry-controller-option.html index be3f570a0f..c20eece8ea 100644 --- a/Documentation/nvme-wdc-vs-telemetry-controller-option.html +++ b/Documentation/nvme-wdc-vs-telemetry-controller-option.html @@ -855,7 +855,7 @@

NVME

diff --git a/Documentation/nvme-wdc-vs-temperature-stats.html b/Documentation/nvme-wdc-vs-temperature-stats.html index 8e792064c9..6f64f2387e 100644 --- a/Documentation/nvme-wdc-vs-temperature-stats.html +++ b/Documentation/nvme-wdc-vs-temperature-stats.html @@ -857,7 +857,7 @@

NVME

diff --git a/Documentation/nvme-write-uncor.html b/Documentation/nvme-write-uncor.html index b69ff1a7e7..3af998e180 100644 --- a/Documentation/nvme-write-uncor.html +++ b/Documentation/nvme-write-uncor.html @@ -880,7 +880,7 @@

NVME

diff --git a/Documentation/nvme-write-zeroes.html b/Documentation/nvme-write-zeroes.html index 0d7d80bcce..31bff4bc6e 100644 --- a/Documentation/nvme-write-zeroes.html +++ b/Documentation/nvme-write-zeroes.html @@ -1023,7 +1023,7 @@

NVME

diff --git a/Documentation/nvme-write.html b/Documentation/nvme-write.html index 294b2b914f..91d02ad99c 100644 --- a/Documentation/nvme-write.html +++ b/Documentation/nvme-write.html @@ -1118,7 +1118,7 @@

NVME

diff --git a/Documentation/nvme-zns-changed-zone-list.html b/Documentation/nvme-zns-changed-zone-list.html index 8dd6aa323c..686faae82b 100644 --- a/Documentation/nvme-zns-changed-zone-list.html +++ b/Documentation/nvme-zns-changed-zone-list.html @@ -832,7 +832,7 @@

NVME

diff --git a/Documentation/nvme-zns-close-zone.html b/Documentation/nvme-zns-close-zone.html index 4cdb120edf..665aba2494 100644 --- a/Documentation/nvme-zns-close-zone.html +++ b/Documentation/nvme-zns-close-zone.html @@ -846,7 +846,7 @@

NVME

diff --git a/Documentation/nvme-zns-finish-zone.html b/Documentation/nvme-zns-finish-zone.html index 5dc97857f7..677ea0d40e 100644 --- a/Documentation/nvme-zns-finish-zone.html +++ b/Documentation/nvme-zns-finish-zone.html @@ -847,7 +847,7 @@

NVME

diff --git a/Documentation/nvme-zns-id-ctrl.html b/Documentation/nvme-zns-id-ctrl.html index 744ecfdf60..74574bc7c4 100644 --- a/Documentation/nvme-zns-id-ctrl.html +++ b/Documentation/nvme-zns-id-ctrl.html @@ -821,7 +821,7 @@

NVME

diff --git a/Documentation/nvme-zns-id-ns.html b/Documentation/nvme-zns-id-ns.html index 2a49ee8d32..9763f143c2 100644 --- a/Documentation/nvme-zns-id-ns.html +++ b/Documentation/nvme-zns-id-ns.html @@ -846,7 +846,7 @@

NVME

diff --git a/Documentation/nvme-zns-offline-zone.html b/Documentation/nvme-zns-offline-zone.html index c040633058..1bf32cc324 100644 --- a/Documentation/nvme-zns-offline-zone.html +++ b/Documentation/nvme-zns-offline-zone.html @@ -846,7 +846,7 @@

NVME

diff --git a/Documentation/nvme-zns-open-zone.html b/Documentation/nvme-zns-open-zone.html index bf134135ba..2b9ebbb797 100644 --- a/Documentation/nvme-zns-open-zone.html +++ b/Documentation/nvme-zns-open-zone.html @@ -856,7 +856,7 @@

NVME

diff --git a/Documentation/nvme-zns-report-zones.html b/Documentation/nvme-zns-report-zones.html index 997933eccf..2c2460bd37 100644 --- a/Documentation/nvme-zns-report-zones.html +++ b/Documentation/nvme-zns-report-zones.html @@ -957,7 +957,7 @@

NVME

diff --git a/Documentation/nvme-zns-reset-zone.html b/Documentation/nvme-zns-reset-zone.html index a4270620df..2d9434b960 100644 --- a/Documentation/nvme-zns-reset-zone.html +++ b/Documentation/nvme-zns-reset-zone.html @@ -847,7 +847,7 @@

NVME

diff --git a/Documentation/nvme-zns-set-zone-desc.html b/Documentation/nvme-zns-set-zone-desc.html index 732a1b23a0..b21f0ba9b0 100644 --- a/Documentation/nvme-zns-set-zone-desc.html +++ b/Documentation/nvme-zns-set-zone-desc.html @@ -859,7 +859,7 @@

NVME

diff --git a/Documentation/nvme-zns-zone-append.html b/Documentation/nvme-zns-zone-append.html index 7ac24a30ed..eb88ccfb62 100644 --- a/Documentation/nvme-zns-zone-append.html +++ b/Documentation/nvme-zns-zone-append.html @@ -940,7 +940,7 @@

NVME

diff --git a/Documentation/nvme-zns-zone-mgmt-recv.html b/Documentation/nvme-zns-zone-mgmt-recv.html index 8c4e9f4d69..26561b7c85 100644 --- a/Documentation/nvme-zns-zone-mgmt-recv.html +++ b/Documentation/nvme-zns-zone-mgmt-recv.html @@ -880,7 +880,7 @@

NVME

diff --git a/Documentation/nvme-zns-zone-mgmt-send.html b/Documentation/nvme-zns-zone-mgmt-send.html index 472d52cf4d..f007e2f5c7 100644 --- a/Documentation/nvme-zns-zone-mgmt-send.html +++ b/Documentation/nvme-zns-zone-mgmt-send.html @@ -914,7 +914,7 @@

NVME

diff --git a/Documentation/nvme.html b/Documentation/nvme.html index 2eb15dc9f7..990d618a7f 100644 --- a/Documentation/nvme.html +++ b/Documentation/nvme.html @@ -2122,7 +2122,7 @@

NVME

From eeaa08c9a0e9184f3889df0bff3d2a23db6d6294 Mon Sep 17 00:00:00 2001 From: Daniel Wagner Date: Mon, 5 Aug 2024 15:42:49 +0200 Subject: [PATCH 119/281] Release v2.10.2 Signed-off-by: Daniel Wagner --- meson.build | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meson.build b/meson.build index ef02747ccc..48b271dfcf 100644 --- a/meson.build +++ b/meson.build @@ -4,7 +4,7 @@ project( 'nvme-cli', ['c'], meson_version: '>= 0.50.0', license: 'GPL-2.0-only', - version: '2.10.1', + version: '2.10.2', default_options: [ 'c_std=gnu99', 'buildtype=debugoptimized', From 5bb5100ae1d7a1d074872dfd6a4735a673b5356d Mon Sep 17 00:00:00 2001 From: Xiaoyuan Zhang Date: Tue, 6 Aug 2024 15:37:09 +0800 Subject: [PATCH 120/281] plugins: Add a new DapuStor plugin and the smart-log-add command Add the DapuStor plugin to support the retrieval and display of the Vendor Specific SMART logs: Additional SMART log page (0xCA) Extended Additional SMART log page (0xCB) Signed-off-by: Xiaoyuan Zhang --- plugins/dapustor/dapustor-nvme.c | 547 +++++++++++++++++++++++++++++++ plugins/dapustor/dapustor-nvme.h | 18 + plugins/meson.build | 1 + 3 files changed, 566 insertions(+) create mode 100644 plugins/dapustor/dapustor-nvme.c create mode 100644 plugins/dapustor/dapustor-nvme.h diff --git a/plugins/dapustor/dapustor-nvme.c b/plugins/dapustor/dapustor-nvme.c new file mode 100644 index 0000000000..57c59dc6a5 --- /dev/null +++ b/plugins/dapustor/dapustor-nvme.c @@ -0,0 +1,547 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "common.h" +#include "nvme.h" +#include "libnvme.h" +#include "plugin.h" +#include "nvme-print.h" + +#include "util/suffix.h" + +#define CREATE_CMD +#include "dapustor-nvme.h" + +struct __packed nvme_additional_smart_log_item { + __u8 key; + __u8 _kp[2]; + __u8 norm; + __u8 _np; + union __packed { + __u8 raw[6]; + struct __packed wear_level { + __le16 min; + __le16 max; + __le16 avg; + } wear_level; + struct __packed thermal_throttle { + __u8 pct; + __u32 count; + } thermal_throttle; + struct __packed temperature { + __le16 max; + __le16 min; + __le16 cur; + } temperature; + struct __packed power_consumption { + __le16 max; + __le16 min; + __le16 avg; + } power_consumption; + struct __packed thermal_throttle_time { + __u8 sts; + __u32 time; + __u8 rsv; + } thermal_throttle_time; + }; + __u8 _rp; +}; + +struct nvme_additional_smart_log { + struct nvme_additional_smart_log_item program_fail_cnt; + struct nvme_additional_smart_log_item erase_fail_cnt; + struct nvme_additional_smart_log_item wear_leveling_cnt; + struct nvme_additional_smart_log_item e2e_err_cnt; + struct nvme_additional_smart_log_item crc_err_cnt; + struct nvme_additional_smart_log_item timed_workload_media_wear; + struct nvme_additional_smart_log_item timed_workload_host_reads; + struct nvme_additional_smart_log_item timed_workload_timer; + struct nvme_additional_smart_log_item thermal_throttle_status; + struct nvme_additional_smart_log_item retry_buffer_overflow_cnt; + struct nvme_additional_smart_log_item pll_lock_loss_cnt; + struct nvme_additional_smart_log_item nand_bytes_written; + struct nvme_additional_smart_log_item host_bytes_written; +}; + +struct nvme_extended_additional_smart_log { + struct nvme_additional_smart_log_item sys_area_life_remain; + struct nvme_additional_smart_log_item nand_bytes_read; + struct nvme_additional_smart_log_item temperature; + struct nvme_additional_smart_log_item power_consumption; + struct nvme_additional_smart_log_item power_on_temperature; + struct nvme_additional_smart_log_item power_loss_protection; + struct nvme_additional_smart_log_item read_fail_count; + struct nvme_additional_smart_log_item thermal_throttle_time; + struct nvme_additional_smart_log_item flash_error_media_count; + struct nvme_additional_smart_log_item lifetime_write_amplification; + struct nvme_additional_smart_log_item firmware_update_count; + struct nvme_additional_smart_log_item dram_cecc_count; + struct nvme_additional_smart_log_item dram_uecc_count; + struct nvme_additional_smart_log_item xor_pass_count; + struct nvme_additional_smart_log_item xor_fail_count; + struct nvme_additional_smart_log_item xor_invoked_count; + struct nvme_additional_smart_log_item inflight_read_io_cmd; + struct nvme_additional_smart_log_item temp_since_born; + struct nvme_additional_smart_log_item temp_since_bootup; + struct nvme_additional_smart_log_item inflight_write_io_cmd; +}; + +static void show_dapustor_add_smart_log_jsn(struct nvme_additional_smart_log *smart, + struct json_object *dev_stats) +{ + struct json_object *entry_stats, *multi; + + entry_stats = json_create_object(); + json_object_add_value_int(entry_stats, "normalized", smart->program_fail_cnt.norm); + json_object_add_value_int(entry_stats, "raw", int48_to_long(smart->program_fail_cnt.raw)); + json_object_add_value_object(dev_stats, "program_fail_count", entry_stats); + + entry_stats = json_create_object(); + json_object_add_value_int(entry_stats, "normalized", smart->erase_fail_cnt.norm); + json_object_add_value_int(entry_stats, "raw", int48_to_long(smart->erase_fail_cnt.raw)); + json_object_add_value_object(dev_stats, "erase_fail_count", entry_stats); + + entry_stats = json_create_object(); + json_object_add_value_int(entry_stats, "normalized", smart->wear_leveling_cnt.norm); + multi = json_create_object(); + json_object_add_value_int(multi, "min", + le16_to_cpu(smart->wear_leveling_cnt.wear_level.min)); + json_object_add_value_int(multi, "max", + le16_to_cpu(smart->wear_leveling_cnt.wear_level.max)); + json_object_add_value_int(multi, "avg", + le16_to_cpu(smart->wear_leveling_cnt.wear_level.avg)); + json_object_add_value_object(entry_stats, "raw", multi); + json_object_add_value_object(dev_stats, "wear_leveling", entry_stats); + + entry_stats = json_create_object(); + json_object_add_value_int(entry_stats, "normalized", smart->e2e_err_cnt.norm); + json_object_add_value_int(entry_stats, "raw", int48_to_long(smart->e2e_err_cnt.raw)); + json_object_add_value_object(dev_stats, "end_to_end_error_detection_count", entry_stats); + + entry_stats = json_create_object(); + json_object_add_value_int(entry_stats, "normalized", smart->crc_err_cnt.norm); + json_object_add_value_int(entry_stats, "raw", int48_to_long(smart->crc_err_cnt.raw)); + json_object_add_value_object(dev_stats, "crc_error_count", entry_stats); + + entry_stats = json_create_object(); + json_object_add_value_int(entry_stats, "normalized", smart->timed_workload_media_wear.norm); + json_object_add_value_float(entry_stats, "raw", + ((long double)int48_to_long(smart->timed_workload_media_wear.raw)) / 1024); + json_object_add_value_object(dev_stats, "timed_workload_media_wear", entry_stats); + + entry_stats = json_create_object(); + json_object_add_value_int(entry_stats, "normalized", smart->timed_workload_host_reads.norm); + json_object_add_value_int(entry_stats, "raw", + int48_to_long(smart->timed_workload_host_reads.raw)); + json_object_add_value_object(dev_stats, "timed_workload_host_reads", entry_stats); + + entry_stats = json_create_object(); + json_object_add_value_int(entry_stats, "normalized", smart->timed_workload_timer.norm); + json_object_add_value_int(entry_stats, "raw", + int48_to_long(smart->timed_workload_timer.raw)); + json_object_add_value_object(dev_stats, "timed_workload_timer", entry_stats); + + entry_stats = json_create_object(); + json_object_add_value_int(entry_stats, "normalized", smart->thermal_throttle_status.norm); + multi = json_create_object(); + json_object_add_value_int(multi, "pct", + smart->thermal_throttle_status.thermal_throttle.pct); + json_object_add_value_int(multi, "cnt", + smart->thermal_throttle_status.thermal_throttle.count); + json_object_add_value_object(entry_stats, "raw", multi); + json_object_add_value_object(dev_stats, "thermal_throttle_status", entry_stats); + + entry_stats = json_create_object(); + json_object_add_value_int(entry_stats, "normalized", smart->retry_buffer_overflow_cnt.norm); + json_object_add_value_int(entry_stats, "raw", + int48_to_long(smart->retry_buffer_overflow_cnt.raw)); + json_object_add_value_object(dev_stats, "retry_buffer_overflow_count", entry_stats); + + entry_stats = json_create_object(); + json_object_add_value_int(entry_stats, "normalized", smart->pll_lock_loss_cnt.norm); + json_object_add_value_int(entry_stats, "raw", int48_to_long(smart->pll_lock_loss_cnt.raw)); + json_object_add_value_object(dev_stats, "pll_lock_loss_count", entry_stats); + + entry_stats = json_create_object(); + json_object_add_value_int(entry_stats, "normalized", smart->nand_bytes_written.norm); + json_object_add_value_int(entry_stats, "raw", int48_to_long(smart->nand_bytes_written.raw)); + json_object_add_value_object(dev_stats, "nand_bytes_written", entry_stats); + + entry_stats = json_create_object(); + json_object_add_value_int(entry_stats, "normalized", smart->host_bytes_written.norm); + json_object_add_value_int(entry_stats, "raw", int48_to_long(smart->host_bytes_written.raw)); + json_object_add_value_object(dev_stats, "host_bytes_written", entry_stats); +} + +static void show_dapustor_ext_add_smart_log_jsn(struct nvme_extended_additional_smart_log *smart, + struct json_object *dev_stats) +{ + struct json_object *entry_stats, *multi; + + entry_stats = json_create_object(); + json_object_add_value_int(entry_stats, "normalized", smart->sys_area_life_remain.norm); + json_object_add_value_int(entry_stats, "raw", + int48_to_long(smart->sys_area_life_remain.raw)); + json_object_add_value_object(dev_stats, "system_area_life_remaining", entry_stats); + + entry_stats = json_create_object(); + json_object_add_value_int(entry_stats, "normalized", smart->nand_bytes_read.norm); + json_object_add_value_int(entry_stats, "raw", int48_to_long(smart->nand_bytes_read.raw)); + json_object_add_value_object(dev_stats, "nand_bytes_read", entry_stats); + + entry_stats = json_create_object(); + json_object_add_value_int(entry_stats, "normalized", smart->temperature.norm); + multi = json_create_object(); + json_object_add_value_int(multi, "min", le16_to_cpu(smart->temperature.temperature.min)); + json_object_add_value_int(multi, "max", le16_to_cpu(smart->temperature.temperature.max)); + json_object_add_value_int(multi, "cur", le16_to_cpu(smart->temperature.temperature.cur)); + json_object_add_value_object(entry_stats, "raw", multi); + json_object_add_value_object(dev_stats, "temperature", entry_stats); + + entry_stats = json_create_object(); + json_object_add_value_int(entry_stats, "normalized", smart->power_consumption.norm); + multi = json_create_object(); + json_object_add_value_int(multi, "min", + le16_to_cpu(smart->power_consumption.power_consumption.min)); + json_object_add_value_int(multi, "max", + le16_to_cpu(smart->power_consumption.power_consumption.max)); + json_object_add_value_int(multi, "avg", + le16_to_cpu(smart->power_consumption.power_consumption.avg)); + json_object_add_value_object(entry_stats, "raw", multi); + json_object_add_value_object(dev_stats, "power_consumption", entry_stats); + + entry_stats = json_create_object(); + json_object_add_value_int(entry_stats, "normalized", smart->power_on_temperature.norm); + multi = json_create_object(); + json_object_add_value_int(multi, "min", + le16_to_cpu(smart->power_on_temperature.temperature.min)); + json_object_add_value_int(multi, "max", + le16_to_cpu(smart->power_on_temperature.temperature.max)); + json_object_add_value_int(multi, "cur", + le16_to_cpu(smart->power_on_temperature.temperature.cur)); + json_object_add_value_object(entry_stats, "raw", multi); + json_object_add_value_object(dev_stats, "power_on_temperature", entry_stats); + + entry_stats = json_create_object(); + json_object_add_value_int(entry_stats, "normalized", smart->power_loss_protection.norm); + json_object_add_value_int(entry_stats, "raw", + int48_to_long(smart->power_loss_protection.raw)); + json_object_add_value_object(dev_stats, "power_loss_protection", entry_stats); + + entry_stats = json_create_object(); + json_object_add_value_int(entry_stats, "normalized", smart->read_fail_count.norm); + json_object_add_value_int(entry_stats, "raw", int48_to_long(smart->read_fail_count.raw)); + json_object_add_value_object(dev_stats, "read_fail_count", entry_stats); + + entry_stats = json_create_object(); + json_object_add_value_int(entry_stats, "normalized", smart->thermal_throttle_time.norm); + json_object_add_value_int(entry_stats, "raw", + int48_to_long(smart->thermal_throttle_time.raw)); + json_object_add_value_object(dev_stats, "thermal_throttle_time", entry_stats); + + entry_stats = json_create_object(); + json_object_add_value_int(entry_stats, "normalized", smart->flash_error_media_count.norm); + json_object_add_value_int(entry_stats, "raw", + int48_to_long(smart->flash_error_media_count.raw)); + json_object_add_value_object(dev_stats, "flash_error_media_count", entry_stats); + + entry_stats = json_create_object(); + json_object_add_value_int(entry_stats, "normalized", + smart->lifetime_write_amplification.norm); + json_object_add_value_int(entry_stats, "raw", + int48_to_long(smart->lifetime_write_amplification.raw)); + json_object_add_value_object(dev_stats, "lifetime_write_amplification", entry_stats); + + entry_stats = json_create_object(); + json_object_add_value_int(entry_stats, "normalized", smart->firmware_update_count.norm); + json_object_add_value_int(entry_stats, "raw", + int48_to_long(smart->firmware_update_count.raw)); + json_object_add_value_object(dev_stats, "firmware_update_count", entry_stats); + + entry_stats = json_create_object(); + json_object_add_value_int(entry_stats, "normalized", smart->dram_cecc_count.norm); + json_object_add_value_int(entry_stats, "raw", int48_to_long(smart->dram_cecc_count.raw)); + json_object_add_value_object(dev_stats, "dram_cecc_count", entry_stats); + + entry_stats = json_create_object(); + json_object_add_value_int(entry_stats, "normalized", smart->dram_uecc_count.norm); + json_object_add_value_int(entry_stats, "raw", int48_to_long(smart->dram_uecc_count.raw)); + json_object_add_value_object(dev_stats, "dram_uecc_count", entry_stats); + + entry_stats = json_create_object(); + json_object_add_value_int(entry_stats, "normalized", smart->xor_pass_count.norm); + json_object_add_value_int(entry_stats, "raw", int48_to_long(smart->xor_pass_count.raw)); + json_object_add_value_object(dev_stats, "xor_pass_count", entry_stats); + + entry_stats = json_create_object(); + json_object_add_value_int(entry_stats, "normalized", smart->xor_fail_count.norm); + json_object_add_value_int(entry_stats, "raw", int48_to_long(smart->xor_fail_count.raw)); + json_object_add_value_object(dev_stats, "xor_fail_count", entry_stats); + + entry_stats = json_create_object(); + json_object_add_value_int(entry_stats, "normalized", smart->xor_invoked_count.norm); + json_object_add_value_int(entry_stats, "raw", int48_to_long(smart->xor_invoked_count.raw)); + json_object_add_value_object(dev_stats, "xor_invoked_count", entry_stats); + + entry_stats = json_create_object(); + json_object_add_value_int(entry_stats, "normalized", smart->inflight_read_io_cmd.norm); + json_object_add_value_int(entry_stats, "raw", + int48_to_long(smart->inflight_read_io_cmd.raw)); + json_object_add_value_object(dev_stats, "inflight_read_io_cmd", entry_stats); + + entry_stats = json_create_object(); + json_object_add_value_int(entry_stats, "normalized", smart->temp_since_born.norm); + multi = json_create_object(); + json_object_add_value_int(multi, "min", + le16_to_cpu(smart->temp_since_born.temperature.min)); + json_object_add_value_int(multi, "max", + le16_to_cpu(smart->temp_since_born.temperature.max)); + json_object_add_value_int(multi, "cur", + le16_to_cpu(smart->temp_since_born.temperature.cur)); + json_object_add_value_object(entry_stats, "raw", multi); + json_object_add_value_object(dev_stats, "temp_since_born", entry_stats); + + entry_stats = json_create_object(); + json_object_add_value_int(entry_stats, "normalized", smart->temp_since_born.norm); + multi = json_create_object(); + json_object_add_value_int(multi, "min", + le16_to_cpu(smart->temp_since_born.temperature.min)); + json_object_add_value_int(multi, "max", + le16_to_cpu(smart->temp_since_born.temperature.max)); + json_object_add_value_int(multi, "cur", + le16_to_cpu(smart->temp_since_born.temperature.cur)); + json_object_add_value_object(entry_stats, "raw", multi); + json_object_add_value_object(dev_stats, "temp_since_born", entry_stats); + + entry_stats = json_create_object(); + json_object_add_value_int(entry_stats, "normalized", smart->inflight_write_io_cmd.norm); + json_object_add_value_int(entry_stats, "raw", + int48_to_long(smart->inflight_write_io_cmd.raw)); + json_object_add_value_object(dev_stats, "inflight_write_io_cmd", entry_stats); +} + +static void show_dapustor_smart_log_jsn(struct nvme_additional_smart_log *smart, + struct nvme_extended_additional_smart_log *ext_smart, + unsigned int nsid, const char *devname) +{ + struct json_object *root, *dev_stats; + + root = json_create_object(); + json_object_add_value_string(root, "Intel Smart log", devname); + + dev_stats = json_create_object(); + show_dapustor_add_smart_log_jsn(smart, dev_stats); + show_dapustor_ext_add_smart_log_jsn(ext_smart, dev_stats); + json_object_add_value_object(root, "Device stats", dev_stats); + + json_print_object(root, NULL); + json_free_object(root); +} + +static void show_dapustor_add_smart_log(struct nvme_additional_smart_log *smart) +{ + printf("program_fail_count : %3d%% %"PRIu64"\n", + smart->program_fail_cnt.norm, + int48_to_long(smart->program_fail_cnt.raw)); + printf("erase_fail_count : %3d%% %"PRIu64"\n", + smart->erase_fail_cnt.norm, + int48_to_long(smart->erase_fail_cnt.raw)); + printf("wear_leveling : %3d%% min: %u, max: %u, avg: %u\n", + smart->wear_leveling_cnt.norm, + le16_to_cpu(smart->wear_leveling_cnt.wear_level.min), + le16_to_cpu(smart->wear_leveling_cnt.wear_level.max), + le16_to_cpu(smart->wear_leveling_cnt.wear_level.avg)); + printf("end_to_end_error_detection_count: %3d%% %"PRIu64"\n", + smart->e2e_err_cnt.norm, + int48_to_long(smart->e2e_err_cnt.raw)); + printf("crc_error_count : %3d%% %"PRIu64"\n", + smart->crc_err_cnt.norm, + int48_to_long(smart->crc_err_cnt.raw)); + printf("timed_workload_media_wear : %3d%% %.3f%%\n", + smart->timed_workload_media_wear.norm, + ((float)int48_to_long(smart->timed_workload_media_wear.raw)) / 1024); + printf("timed_workload_host_reads : %3d%% %"PRIu64"%%\n", + smart->timed_workload_host_reads.norm, + int48_to_long(smart->timed_workload_host_reads.raw)); + printf("timed_workload_timer : %3d%% %"PRIu64" min\n", + smart->timed_workload_timer.norm, + int48_to_long(smart->timed_workload_timer.raw)); + printf("thermal_throttle_status : %3d%% %u%%, cnt: %u\n", + smart->thermal_throttle_status.norm, + smart->thermal_throttle_status.thermal_throttle.pct, + smart->thermal_throttle_status.thermal_throttle.count); + printf("retry_buffer_overflow_count : %3d%% %"PRIu64"\n", + smart->retry_buffer_overflow_cnt.norm, + int48_to_long(smart->retry_buffer_overflow_cnt.raw)); + printf("pll_lock_loss_count : %3d%% %"PRIu64"\n", + smart->pll_lock_loss_cnt.norm, + int48_to_long(smart->pll_lock_loss_cnt.raw)); + printf("nand_bytes_written : %3d%% sectors: %"PRIu64"\n", + smart->nand_bytes_written.norm, + int48_to_long(smart->nand_bytes_written.raw)); + printf("host_bytes_written : %3d%% sectors: %"PRIu64"\n", + smart->host_bytes_written.norm, + int48_to_long(smart->host_bytes_written.raw)); +} + +static void show_dapustor_ext_add_smart_log(struct nvme_extended_additional_smart_log *smart) +{ + printf("system_area_life_remaining : %3d%% %"PRIu64"\n", + smart->sys_area_life_remain.norm, + int48_to_long(smart->sys_area_life_remain.raw)); + printf("nand_bytes_read : %3d%% %"PRIu64"\n", + smart->nand_bytes_read.norm, + int48_to_long(smart->nand_bytes_read.raw)); + printf("temperature : %3d%% min: %u, max: %u, cur: %u\n", + smart->temperature.norm, + le16_to_cpu(smart->temperature.temperature.min), + le16_to_cpu(smart->temperature.temperature.max), + le16_to_cpu(smart->temperature.temperature.cur)); + printf("power_consumption : %3d%% min: %u, max: %u, avg: %u\n", + smart->power_consumption.norm, + le16_to_cpu(smart->power_consumption.power_consumption.min), + le16_to_cpu(smart->power_consumption.power_consumption.max), + le16_to_cpu(smart->power_consumption.power_consumption.avg)); + printf("power_on_temperature : %3d%% min: %u, max: %u, cur: %u\n", + smart->power_on_temperature.norm, + le16_to_cpu(smart->power_on_temperature.temperature.min), + le16_to_cpu(smart->power_on_temperature.temperature.max), + le16_to_cpu(smart->power_on_temperature.temperature.cur)); + printf("power_loss_protection : %3d%% %"PRIu64"\n", + smart->power_loss_protection.norm, + int48_to_long(smart->power_loss_protection.raw)); + printf("read_fail_count : %3d%% %"PRIu64"\n", + smart->read_fail_count.norm, + int48_to_long(smart->read_fail_count.raw)); + printf("thermal_throttle_time : %3d%% %"PRIu64"\n", + smart->thermal_throttle_time.norm, + int48_to_long(smart->thermal_throttle_time.raw)); + printf("flash_error_media_count : %3d%% %"PRIu64"\n", + smart->flash_error_media_count.norm, + int48_to_long(smart->flash_error_media_count.raw)); + printf("lifetime_write_amplification : %3d%% %"PRIu64"\n", + smart->lifetime_write_amplification.norm, + int48_to_long(smart->lifetime_write_amplification.raw)); + printf("firmware_update_count : %3d%% %"PRIu64"\n", + smart->firmware_update_count.norm, + int48_to_long(smart->firmware_update_count.raw)); + printf("dram_cecc_count : %3d%% %"PRIu64"\n", + smart->dram_cecc_count.norm, + int48_to_long(smart->dram_cecc_count.raw)); + printf("dram_uecc_count : %3d%% %"PRIu64"\n", + smart->dram_uecc_count.norm, + int48_to_long(smart->dram_uecc_count.raw)); + printf("xor_pass_count : %3d%% %"PRIu64"\n", + smart->xor_pass_count.norm, + int48_to_long(smart->xor_pass_count.raw)); + printf("xor_fail_count : %3d%% %"PRIu64"\n", + smart->xor_fail_count.norm, + int48_to_long(smart->xor_fail_count.raw)); + printf("xor_invoked_count : %3d%% %"PRIu64"\n", + smart->xor_invoked_count.norm, + int48_to_long(smart->xor_invoked_count.raw)); + printf("inflight_read_io_cmd : %3d%% %"PRIu64"\n", + smart->inflight_read_io_cmd.norm, + int48_to_long(smart->inflight_read_io_cmd.raw)); + printf("temp_since_born : %3d%% min: %u, max: %u, cur: %u\n", + smart->temp_since_born.norm, + le16_to_cpu(smart->temp_since_born.temperature.min), + le16_to_cpu(smart->temp_since_born.temperature.max), + le16_to_cpu(smart->temp_since_born.temperature.cur)); + printf("temp_since_bootup : %3d%% min: %u, max: %u, cur: %u\n", + smart->temp_since_bootup.norm, + le16_to_cpu(smart->temp_since_bootup.temperature.min), + le16_to_cpu(smart->temp_since_bootup.temperature.max), + le16_to_cpu(smart->temp_since_bootup.temperature.cur)); + printf("inflight_write_io_cmd : %3d%% %"PRIu64"\n", + smart->inflight_write_io_cmd.norm, + int48_to_long(smart->inflight_write_io_cmd.raw)); +} + +static void show_dapustor_smart_log(struct nvme_additional_smart_log *smart, + struct nvme_extended_additional_smart_log *ext_smart, + unsigned int nsid, const char *devname) +{ + printf("Additional Smart Log for NVME device:%s namespace-id:%x\n", + devname, nsid); + printf("key normalized raw\n"); + show_dapustor_add_smart_log(smart); + show_dapustor_ext_add_smart_log(ext_smart); +} + +static int dapustor_additional_smart_log_data( + int dev_fd, + struct nvme_additional_smart_log *smart_log, + struct nvme_extended_additional_smart_log *ext_smart_log) +{ + int err; + + err = nvme_get_log_simple(dev_fd, 0xca, sizeof(*smart_log), smart_log); + if (err) { + nvme_show_status(err); + return err; + } + err = nvme_get_log_simple(dev_fd, 0xcb, sizeof(*ext_smart_log), ext_smart_log); + if (err) + nvme_show_status(err); + return err; +} + +static int dapustor_additional_smart_log(int argc, char **argv, struct command *cmd, + struct plugin *plugin) +{ + const char *desc = "Get DapuStor vendor specific additional smart log, and show it."; + const char *namespace = "(optional) desired namespace"; + const char *raw = "Dump output in binary format"; + const char *json = "Dump output in json format"; + + struct nvme_additional_smart_log smart_log; + struct nvme_extended_additional_smart_log ext_smart_log; + struct nvme_dev *dev; + int err; + + struct config { + uint32_t namespace_id; + bool raw_binary; + bool json; + }; + + struct config cfg = { + .namespace_id = NVME_NSID_ALL, + }; + + OPT_ARGS(opts) = { + OPT_UINT("namespace-id", 'n', &cfg.namespace_id, namespace), + OPT_FLAG("raw-binary", 'b', &cfg.raw_binary, raw), + OPT_FLAG("json", 'j', &cfg.json, json), + OPT_END() + }; + + err = parse_and_open(&dev, argc, argv, desc, opts); + if (err) + return err; + + err = dapustor_additional_smart_log_data(dev_fd(dev), &smart_log, &ext_smart_log); + if (!err) { + if (cfg.json) + show_dapustor_smart_log_jsn(&smart_log, &ext_smart_log, + cfg.namespace_id, dev->name); + else if (!cfg.raw_binary) + show_dapustor_smart_log(&smart_log, &ext_smart_log, + cfg.namespace_id, dev->name); + else + d_raw((unsigned char *)&smart_log, sizeof(smart_log)); + } + dev_close(dev); + return err; +} diff --git a/plugins/dapustor/dapustor-nvme.h b/plugins/dapustor/dapustor-nvme.h new file mode 100644 index 0000000000..9d0d332de8 --- /dev/null +++ b/plugins/dapustor/dapustor-nvme.h @@ -0,0 +1,18 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +#undef CMD_INC_FILE +#define CMD_INC_FILE plugins/dapustor/dapustor-nvme + +#if !defined(DAPUSTOR_NVME) || defined(CMD_HEADER_MULTI_READ) +#define DAPUSTOR_NVME + +#include "cmd.h" + +PLUGIN(NAME("dapustor", "DapuStor vendor specific extensions", NVME_VERSION), + COMMAND_LIST( + ENTRY("smart-log-add", "Retrieve DapuStor SMART Log, show it", dapustor_additional_smart_log) + ) +); + +#endif + +#include "define_cmd.h" diff --git a/plugins/meson.build b/plugins/meson.build index 146fa2a0ad..e82c94d5ed 100644 --- a/plugins/meson.build +++ b/plugins/meson.build @@ -3,6 +3,7 @@ if json_c_dep.found() sources += [ 'plugins/amzn/amzn-nvme.c', + 'plugins/dapustor/dapustor-nvme.c', 'plugins/dell/dell-nvme.c', 'plugins/dera/dera-nvme.c', 'plugins/fdp/fdp.c', From ba85f27290c75da9e8476bf22fbc42c3fba394db Mon Sep 17 00:00:00 2001 From: Nitin Sao Date: Tue, 6 Aug 2024 11:10:13 +0530 Subject: [PATCH 121/281] build: bump libnvme wrap fetch NVME_CMD_EFFECTS_CSER_MASK from enum nvme_cmd_effects Signed-off-by: Nitin Sao --- subprojects/libnvme.wrap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subprojects/libnvme.wrap b/subprojects/libnvme.wrap index 76f1ebc9d5..970e519aee 100644 --- a/subprojects/libnvme.wrap +++ b/subprojects/libnvme.wrap @@ -1,6 +1,6 @@ [wrap-git] url = https://github.com/linux-nvme/libnvme.git -revision = dd51fa8550564c93436423a4d8ed4be92ae50290 +revision = 55e29b85c9b85e69aff7b43dbd509b7be21b93ea [provide] libnvme = libnvme_dep From c19d90ab7a96f2c808e41a0f6185b77029078c86 Mon Sep 17 00:00:00 2001 From: Nitin Sao Date: Tue, 6 Aug 2024 11:15:11 +0530 Subject: [PATCH 122/281] nvme-print-stdout: Added print for new field CSER (TP4167) As per TP4167, added print for a new field CSER (Command Submission and Execution Relaxations) [15:14] added in Commands Supported and Effects Data Structure. Signed-off-by: Nitin Sao Reviewed-by: Mohit Kapoor --- nvme-print-stdout.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/nvme-print-stdout.c b/nvme-print-stdout.c index 0d7514b42c..568704a27f 100644 --- a/nvme-print-stdout.c +++ b/nvme-print-stdout.c @@ -3744,6 +3744,13 @@ static void stdout_effects_log_human(FILE *stream, __u32 effect) fprintf(stream, " CCC%s", (effect & NVME_CMD_EFFECTS_CCC) ? set : clr); fprintf(stream, " USS%s", (effect & NVME_CMD_EFFECTS_UUID_SEL) ? set : clr); + if ((effect & NVME_CMD_EFFECTS_CSER_MASK) >> 14 == 0) + fprintf(stream, " No CSER defined\n"); + else if ((effect & NVME_CMD_EFFECTS_CSER_MASK) >> 14 == 1) + fprintf(stream, " No admin command for any namespace\n"); + else + fprintf(stream, " Reserved CSER\n"); + if ((effect & NVME_CMD_EFFECTS_CSE_MASK) >> 16 == 0) fprintf(stream, " No command restriction\n"); else if ((effect & NVME_CMD_EFFECTS_CSE_MASK) >> 16 == 1) From 2634b41b71a340984e7cfc6e951548b1e171cf00 Mon Sep 17 00:00:00 2001 From: Xiaoyuan Zhang Date: Wed, 7 Aug 2024 18:24:58 +0800 Subject: [PATCH 123/281] plugins/dapustor: dapustor smart-log-add update Extended Additional SMART log is optional. If the collection fails, the command dose not stop. Add the manual of dapustor plugin. Update tab completion. Signed-off-by: Xiaoyuan Zhang --- Documentation/cmd-plugins.txt | 3 + Documentation/meson.build | 1 + Documentation/nvme-dapustor-smart-log-add.txt | 65 +++++++++++++++++++ completions/bash-nvme-completion.sh | 34 ++++++++++ plugins/dapustor/dapustor-nvme.c | 25 +++---- 5 files changed, 117 insertions(+), 11 deletions(-) create mode 100644 Documentation/nvme-dapustor-smart-log-add.txt diff --git a/Documentation/cmd-plugins.txt b/Documentation/cmd-plugins.txt index 338425efaa..2e80bfc98e 100644 --- a/Documentation/cmd-plugins.txt +++ b/Documentation/cmd-plugins.txt @@ -204,3 +204,6 @@ linknvme:nvme-zns-zrwa-flush-zone[1]:: linknvme:nvme-inspur-nvme-vendor-log[1]:: NVMe Inspur Device Vendor log page request + +linknvme:nvme-dapustor-smart-log-add[1]:: + NVMe DapuStor Additional SMART log page diff --git a/Documentation/meson.build b/Documentation/meson.build index 1478134175..4e8ffcad26 100644 --- a/Documentation/meson.build +++ b/Documentation/meson.build @@ -14,6 +14,7 @@ adoc_sources = [ 'nvme-connect-all', 'nvme-copy', 'nvme-create-ns', + 'nvme-dapustor-smart-log-add', 'nvme-delete-ns', 'nvme-dera-stat', 'nvme-detach-ns', diff --git a/Documentation/nvme-dapustor-smart-log-add.txt b/Documentation/nvme-dapustor-smart-log-add.txt new file mode 100644 index 0000000000..0c67a21dc4 --- /dev/null +++ b/Documentation/nvme-dapustor-smart-log-add.txt @@ -0,0 +1,65 @@ +nvme-dapustor-smart-log-add(1) +============================== + +NAME +---- +nvme-dapustor-smart-log-add - Send NVMe DapuStor Additional SMART log page request, +returns result and log + +SYNOPSIS +-------- +[verse] +'nvme dapustor smart-log-add' [--namespace-id= | -n ] + [--raw-binary | -b] [--json | -j] + +DESCRIPTION +----------- +Retrieves the NVMe DapuStor Additional SMART log page from the device and +provides the returned structure. + +The parameter is mandatory and may be either the NVMe character +device (ex: /dev/nvme0), or a namespace block device (ex: /dev/nvme0n1). + +On success, the returned smart log structure may be returned in one of +several ways depending on the option flags; the structure may parsed by +the program and printed in a readable format or the raw buffer may be +printed to stdout for another program to parse. + +OPTIONS +------- +-n :: +--namespace-id=:: + Retrieve the Additional SMART log for the given nsid. This is + optional and its success may depend on the device's capabilities + to provide this log on a per-namespace basis (see the NVMe + Identify Controller for this capability). The default nsid to + use is 0xffffffff for the device global SMART log. + +-b:: +--raw-binary:: + Print the raw DapuStor Additional SMART log buffer to stdout. + +-j:: +--json:: + Dump output in json format. + +EXAMPLES +-------- +* Print the DapuStor Additional SMART log page in a human readable format: ++ +------------ +# nvme dapustor smart-log-add /dev/nvme0 +------------ ++ + +* Print the raw DapuStor Additional SMART log to a file: ++ +------------ +# nvme dapustor smart-log-add /dev/nvme0 --raw-binary > smart_log.raw +------------ ++ +It is probably a bad idea to not redirect stdout when using this mode. + +NVME +---- +Part of the nvme-user suite diff --git a/completions/bash-nvme-completion.sh b/completions/bash-nvme-completion.sh index 9e2e2770bd..10f3ccde93 100644 --- a/completions/bash-nvme-completion.sh +++ b/completions/bash-nvme-completion.sh @@ -1228,6 +1228,38 @@ plugin_transcend_opts () { return 0 } +plugin_dapustor_opts () { + local opts="" + local compargs="" + + local nonopt_args=0 + for (( i=0; i < ${#words[@]}-1; i++ )); do + if [[ ${words[i]} != -* ]]; then + let nonopt_args+=1 + fi + done + + if [ $nonopt_args -eq 3 ]; then + opts="/dev/nvme* " + fi + + opts+=" " + + case "$1" in + "smart-log-add") + opts+=" --namespace-id= -n --raw-binary -b \ + --json -j" + ;; + "help") + opts+=$NO_OPTS + ;; + esac + + COMPREPLY+=( $( compgen $compargs -W "$opts" -- $cur ) ) + + return 0 +} + plugin_zns_opts () { local opts="" local compargs="" @@ -1554,6 +1586,7 @@ _nvme_subcmds () { vs-drive-info cloud-SSDplugin-version market-log \ smart-log-add temp-stats version help" [transcend]="healthvalue badblock" + [dapustor]="smart-log-add" [zns]="id-ctrl id-ns zone-mgmt-recv \ zone-mgmt-send report-zones close-zone \ finish-zone open-zone reset-zone offline-zone \ @@ -1588,6 +1621,7 @@ _nvme_subcmds () { [sfx]="plugin_sfx_opts" [solidigm]="plugin_solidigm_opts" [transcend]="plugin_transcend_opts" + [dapustor]="plugin_dapustor_opts" [zns]="plugin_zns_opts" [nvidia]="plugin_nvidia_opts" [ymtc]="plugin_ymtc_opts" diff --git a/plugins/dapustor/dapustor-nvme.c b/plugins/dapustor/dapustor-nvme.c index 57c59dc6a5..678ba99239 100644 --- a/plugins/dapustor/dapustor-nvme.c +++ b/plugins/dapustor/dapustor-nvme.c @@ -332,7 +332,7 @@ static void show_dapustor_ext_add_smart_log_jsn(struct nvme_extended_additional_ static void show_dapustor_smart_log_jsn(struct nvme_additional_smart_log *smart, struct nvme_extended_additional_smart_log *ext_smart, - unsigned int nsid, const char *devname) + unsigned int nsid, const char *devname, bool has_ext) { struct json_object *root, *dev_stats; @@ -341,7 +341,8 @@ static void show_dapustor_smart_log_jsn(struct nvme_additional_smart_log *smart, dev_stats = json_create_object(); show_dapustor_add_smart_log_jsn(smart, dev_stats); - show_dapustor_ext_add_smart_log_jsn(ext_smart, dev_stats); + if (has_ext) + show_dapustor_ext_add_smart_log_jsn(ext_smart, dev_stats); json_object_add_value_object(root, "Device stats", dev_stats); json_print_object(root, NULL); @@ -470,19 +471,21 @@ static void show_dapustor_ext_add_smart_log(struct nvme_extended_additional_smar static void show_dapustor_smart_log(struct nvme_additional_smart_log *smart, struct nvme_extended_additional_smart_log *ext_smart, - unsigned int nsid, const char *devname) + unsigned int nsid, const char *devname, bool has_ext) { printf("Additional Smart Log for NVME device:%s namespace-id:%x\n", devname, nsid); printf("key normalized raw\n"); show_dapustor_add_smart_log(smart); - show_dapustor_ext_add_smart_log(ext_smart); + if (has_ext) + show_dapustor_ext_add_smart_log(ext_smart); } static int dapustor_additional_smart_log_data( int dev_fd, struct nvme_additional_smart_log *smart_log, - struct nvme_extended_additional_smart_log *ext_smart_log) + struct nvme_extended_additional_smart_log *ext_smart_log, + bool *has_ext) { int err; @@ -492,9 +495,8 @@ static int dapustor_additional_smart_log_data( return err; } err = nvme_get_log_simple(dev_fd, 0xcb, sizeof(*ext_smart_log), ext_smart_log); - if (err) - nvme_show_status(err); - return err; + *has_ext = !err; + return 0; } static int dapustor_additional_smart_log(int argc, char **argv, struct command *cmd, @@ -509,6 +511,7 @@ static int dapustor_additional_smart_log(int argc, char **argv, struct command * struct nvme_extended_additional_smart_log ext_smart_log; struct nvme_dev *dev; int err; + bool has_ext = false; struct config { uint32_t namespace_id; @@ -531,14 +534,14 @@ static int dapustor_additional_smart_log(int argc, char **argv, struct command * if (err) return err; - err = dapustor_additional_smart_log_data(dev_fd(dev), &smart_log, &ext_smart_log); + err = dapustor_additional_smart_log_data(dev_fd(dev), &smart_log, &ext_smart_log, &has_ext); if (!err) { if (cfg.json) show_dapustor_smart_log_jsn(&smart_log, &ext_smart_log, - cfg.namespace_id, dev->name); + cfg.namespace_id, dev->name, has_ext); else if (!cfg.raw_binary) show_dapustor_smart_log(&smart_log, &ext_smart_log, - cfg.namespace_id, dev->name); + cfg.namespace_id, dev->name, has_ext); else d_raw((unsigned char *)&smart_log, sizeof(smart_log)); } From 103a27352b349f95ea06c9501ef3d770b0f8040d Mon Sep 17 00:00:00 2001 From: Francis Pravin Date: Wed, 7 Aug 2024 18:08:05 +0530 Subject: [PATCH 124/281] nvme-print: print the new fields added in TP4165 Print the new fields added in TP4165. Signed-off-by: Francis Pravin Reviewed-by: Steven Seungcheol Lee --- nvme-print-json.c | 2 ++ nvme-print-stdout.c | 18 ++++++++++++++++++ nvme.c | 3 +++ 3 files changed, 23 insertions(+) diff --git a/nvme-print-json.c b/nvme-print-json.c index 6c3e45f463..e71dea54f5 100644 --- a/nvme-print-json.c +++ b/nvme-print-json.c @@ -3033,6 +3033,7 @@ static void json_nvme_id_ctrl_nvm(struct nvme_id_ctrl_nvm *ctrl_nvm) obj_add_uint(r, "dmrl", ctrl_nvm->dmrl); obj_add_uint(r, "dmrsl", le32_to_cpu(ctrl_nvm->dmrsl)); obj_add_uint64(r, "dmsl", le64_to_cpu(ctrl_nvm->dmsl)); + obj_add_uint(r, "aocs", le16_to_cpu(ctrl_nvm->aocs)); json_print(r); } @@ -3066,6 +3067,7 @@ static void json_nvme_nvm_id_ns(struct nvme_nvm_id_ns *nvm_ns, } if (ns->nsfeat & 0x20) obj_add_int(r, "npdgl", le32_to_cpu(nvm_ns->npdgl)); + obj_add_uint(r, "tlbaag", le32_to_cpu(nvm_ns->tlbaag)); json_print(r); } diff --git a/nvme-print-stdout.c b/nvme-print-stdout.c index 568704a27f..b9d902abaa 100644 --- a/nvme-print-stdout.c +++ b/nvme-print-stdout.c @@ -3053,8 +3053,22 @@ static void stdout_id_ctrl(struct nvme_id_ctrl *ctrl, } } +static void stdout_id_ctrl_nvm_aocs(__u16 aocs) +{ + __u16 rsvd = (aocs & 0xfffe) >> 1; + __u8 ralbas = aocs & 0x1; + + if (rsvd) + printf(" [15:1] : %#x\tReserved\n", rsvd); + printf(" [0:0] : %#x\tReporting Allocated LBA %sSupported\n", ralbas, + ralbas ? "" : "Not "); + printf("\n"); +} + static void stdout_id_ctrl_nvm(struct nvme_id_ctrl_nvm *ctrl_nvm) { + int verbose = stdout_print_ops.flags & VERBOSE; + printf("NVMe Identify Controller NVM:\n"); printf("vsl : %u\n", ctrl_nvm->vsl); printf("wzsl : %u\n", ctrl_nvm->wzsl); @@ -3062,6 +3076,9 @@ static void stdout_id_ctrl_nvm(struct nvme_id_ctrl_nvm *ctrl_nvm) printf("dmrl : %u\n", ctrl_nvm->dmrl); printf("dmrsl : %u\n", le32_to_cpu(ctrl_nvm->dmrsl)); printf("dmsl : %"PRIu64"\n", le64_to_cpu(ctrl_nvm->dmsl)); + printf("aocs : %u\n", le16_to_cpu(ctrl_nvm->aocs)); + if (verbose) + stdout_id_ctrl_nvm_aocs(le16_to_cpu(ctrl_nvm->aocs)); } static void stdout_nvm_id_ns_pic(__u8 pic) @@ -3159,6 +3176,7 @@ static void stdout_nvm_id_ns(struct nvme_nvm_id_ns *nvm_ns, unsigned int nsid, } if (ns->nsfeat & 0x20) printf("npdgl : %#x\n", le32_to_cpu(nvm_ns->npdgl)); + printf("tlbaag: %#x\n", le32_to_cpu(nvm_ns->tlbaag)); } static void stdout_zns_id_ctrl(struct nvme_zns_id_ctrl *ctrl) diff --git a/nvme.c b/nvme.c index 20dfee6489..a69ac9cdf5 100644 --- a/nvme.c +++ b/nvme.c @@ -3467,6 +3467,9 @@ static int nvm_id_ctrl(int argc, char **argv, struct command *cmd, return err; } + if (argconfig_parse_seen(opts, "verbose")) + flags |= VERBOSE; + ctrl_nvm = nvme_alloc(sizeof(*ctrl_nvm)); if (!ctrl_nvm) return -ENOMEM; From 2d6bbb67c77d3827fca8b26f548634aeb990a352 Mon Sep 17 00:00:00 2001 From: Xiaoyuan Zhang Date: Thu, 8 Aug 2024 19:31:06 +0800 Subject: [PATCH 125/281] completions: add the zsh completion of the dapustor plugin add the zsh completion of the dapustor plugin Signed-off-by: Xiaoyuan Zhang --- completions/_nvme | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/completions/_nvme b/completions/_nvme index 47fdd9d330..6e80dd31b8 100644 --- a/completions/_nvme +++ b/completions/_nvme @@ -113,6 +113,7 @@ _nvme () { 'ocp:OCP cloud SSD extensions' 'solidigm:Solidigm plug-in extensions' 'micron:Micron plug-in extensions' + 'dapustor:DapuStor plug-in extensions' 'help:print brief descriptions of all nvme commands' 'json:dump output in json format' ) @@ -548,6 +549,26 @@ _nvme () { ;; esac ;; + (dapustor) + case ${words[2]} in + (smart-log-add) + local _smart_log_add + _smart_log_add=( + --namespace-id':(optional) desired namespace' + -n':alias for --namespace-id' + --output-format':Output format: normal|json|binary' + -o':alias for --output-format' + --raw-binary':dump log in binary format' + -b':alias of --raw-binary' + ) + _arguments '*:: :->subcmds' + _describe -t commands "nvme dapustor smart-log-add options" _smart_log_add + ;; + (*) + _files + ;; + esac + ;; (sanitize) case ${words[CURRENT-1]} in (--sanact=|-a) @@ -2618,6 +2639,16 @@ _nvme () { _arguments '*:: :->subcmds' _describe -t commands "nvme micron options" _micron ;; + (dapustor) + local _dapustor + _dapustor=( + smart-log-add':Retrieve DapuStor SMART Log' + version':Shows the program version' + help':Display this help' + ) + _arguments '*:: :->subcmds' + _describe -t commands "nvme dapustor options" _dapustor + ;; (help) local _h _h=( id-ctrl id-ns list-ns id-iocs create-ns delete-ns attach-ns detach-ns @@ -2635,7 +2666,7 @@ _nvme () { get-property write-zeroes write-uncor verify sanitize sanitize-log reset subsystem-reset ns-rescan get-lba-status dsm discover connect-all connect dim disconnect disconnect-all gen-hostnqn show-hostnqn tls-key dir-receive - dir-send virt-mgmt rpmb version ocp solidigm + dir-send virt-mgmt rpmb version ocp solidigm dapustor ) _arguments '*:: :->subcmds' _describe -t commands "help: infos on a specific nvme command, or provide no option to see a synopsis of all nvme commands" _h From 48bc3cf101d8bed015db45b74dfc8b7659a55ae6 Mon Sep 17 00:00:00 2001 From: Francis Pravin Date: Fri, 9 Aug 2024 16:13:43 +0530 Subject: [PATCH 126/281] build: update libnvme wrap 9bee8e1 - types: add new fields added in TP4142 df12de6 - types: Add enum for Completion Condition of Get LBA status command Signed-off-by: Francis Pravin --- subprojects/libnvme.wrap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subprojects/libnvme.wrap b/subprojects/libnvme.wrap index 970e519aee..b7688869ca 100644 --- a/subprojects/libnvme.wrap +++ b/subprojects/libnvme.wrap @@ -1,6 +1,6 @@ [wrap-git] url = https://github.com/linux-nvme/libnvme.git -revision = 55e29b85c9b85e69aff7b43dbd509b7be21b93ea +revision = df12de68816f341b36e24f46822c4f727ed3e636 [provide] libnvme = libnvme_dep From 3a1048e5de4184cc8e884a0afa11aac0c12d37f2 Mon Sep 17 00:00:00 2001 From: Francis Pravin Date: Fri, 9 Aug 2024 17:12:03 +0530 Subject: [PATCH 127/281] nvme-print: use Completion Condition enum Use the Completion Condition enum for LBA Status Descriptor. Also, modified the print statement of Completion Condition. Signed-off-by: Francis Pravin --- nvme-print-json.c | 15 +++++++++++---- nvme-print-stdout.c | 19 +++++++++++-------- 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/nvme-print-json.c b/nvme-print-json.c index e71dea54f5..ce094ec40b 100644 --- a/nvme-print-json.c +++ b/nvme-print-json.c @@ -1853,13 +1853,20 @@ static void json_lba_status(struct nvme_lba_status *list, obj_add_uint(r, "Completion Condition (CMPC)", list->cmpc); switch (list->cmpc) { - case 1: + case NVME_LBA_STATUS_CMPC_NO_CMPC: + obj_add_str(r, "cmpc-definition", "No indication of the completion condition"); + break; + case NVME_LBA_STATUS_CMPC_INCOMPLETE: obj_add_str(r, "cmpc-definition", - "Completed due to transferring the amount of data specified in the MNDW field"); + "Completed transferring the amount of data specified in the"\ + "MNDW field. But, additional LBA Status Descriptor Entries are"\ + "available to transfer or scan did not complete (if ATYPE = 10h)"); break; - case 2: + case NVME_LBA_STATUS_CMPC_COMPLETE: obj_add_str(r, "cmpc-definition", - "Completed due to having performed the action specified in the Action Type field over the number of logical blocks specified in the Range Length field"); + "Completed the specified action over the number of LBAs specified"\ + "in the Range Length field and transferred all available LBA Status"\ + "Descriptor Entries"); break; default: break; diff --git a/nvme-print-stdout.c b/nvme-print-stdout.c index b9d902abaa..acecd1ac3d 100644 --- a/nvme-print-stdout.c +++ b/nvme-print-stdout.c @@ -4685,15 +4685,18 @@ static void stdout_lba_status(struct nvme_lba_status *list, printf("Completion Condition(CMPC): %u\n", list->cmpc); switch (list->cmpc) { - case 1: - printf("\tCompleted due to transferring the amount of data"\ - " specified in the MNDW field\n"); + case NVME_LBA_STATUS_CMPC_NO_CMPC: + printf("\tNo indication of the completion condition\n"); break; - case 2: - printf("\tCompleted due to having performed the action\n"\ - "\tspecified in the Action Type field over the\n"\ - "\tnumber of logical blocks specified in the\n"\ - "\tRange Length field\n"); + case NVME_LBA_STATUS_CMPC_INCOMPLETE: + printf("\tCompleted transferring the amount of data specified in the\n"\ + "\tMNDW field. But, additional LBA Status Descriptor Entries are\n"\ + "\tavailable to transfer or scan did not complete (if ATYPE = 10h)\n"); + break; + case NVME_LBA_STATUS_CMPC_COMPLETE: + printf("\tCompleted the specified action over the number of LBAs specified\n"\ + "\tin the Range Length field and transferred all available LBA Status\n"\ + "\tDescriptor Entries\n"); break; default: break; From bfee2b227795a8303a312ad0ed6226aebddd3233 Mon Sep 17 00:00:00 2001 From: Tokunori Ikegami Date: Sun, 11 Aug 2024 13:29:17 +0900 Subject: [PATCH 128/281] nvme-print: use LC_MEASUREMENT to check fahrenheit temperature Previously used LC_ALL so not checked correctly if LC_MEASUREMENT set. Signed-off-by: Tokunori Ikegami --- nvme-print.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nvme-print.c b/nvme-print.c index 3165ab92bc..ab8d922160 100644 --- a/nvme-print.c +++ b/nvme-print.c @@ -789,8 +789,8 @@ static bool is_temperature_fahrenheit(void) const char *locale, *underscore; char country[3] = { 0 }; - setlocale(LC_ALL, ""); - locale = setlocale(LC_ALL, NULL); + setlocale(LC_MEASUREMENT, ""); + locale = setlocale(LC_MEASUREMENT, NULL); if (!locale || strlen(locale) < 2) return false; From a52205df054851c48e0371e3add89319883afd77 Mon Sep 17 00:00:00 2001 From: jeff-lien-wdc Date: Thu, 8 Aug 2024 14:59:50 -0500 Subject: [PATCH 129/281] wdc: Add Support for new SN-861 PCI device id A new form factor (EDSFF E3.S) of the SN-861 drive was added to the wdc plugin code. Signed-off-by: jeff-lien-wdc --- plugins/wdc/wdc-nvme.c | 6 +++++- plugins/wdc/wdc-nvme.h | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/plugins/wdc/wdc-nvme.c b/plugins/wdc/wdc-nvme.c index fa4157d237..d3b6ecbaa6 100644 --- a/plugins/wdc/wdc-nvme.c +++ b/plugins/wdc/wdc-nvme.c @@ -86,6 +86,7 @@ #define WDC_NVME_SN560_DEV_ID_3 0x2714 #define WDC_NVME_SN861_DEV_ID 0x2750 #define WDC_NVME_SN861_DEV_ID_1 0x2751 +#define WDC_NVME_SN861_DEV_ID_2 0x2752 /* This id's are no longer supported, delete ?? */ #define WDC_NVME_SN550_DEV_ID 0x2708 @@ -1530,7 +1531,8 @@ static int wdc_get_vendor_id(struct nvme_dev *dev, uint32_t *vendor_id) static bool wdc_is_sn861(__u32 device_id) { if ((device_id == WDC_NVME_SN861_DEV_ID) || - (device_id == WDC_NVME_SN861_DEV_ID_1)) + (device_id == WDC_NVME_SN861_DEV_ID_1) || + (device_id == WDC_NVME_SN861_DEV_ID_2)) return true; else return false; @@ -1872,6 +1874,7 @@ static __u64 wdc_get_drive_capabilities(nvme_root_t r, struct nvme_dev *dev) case WDC_NVME_SN861_DEV_ID: case WDC_NVME_SN861_DEV_ID_1: + case WDC_NVME_SN861_DEV_ID_2: capabilities |= (WDC_DRIVE_CAP_C0_LOG_PAGE | WDC_DRIVE_CAP_C3_LOG_PAGE | WDC_DRIVE_CAP_CA_LOG_PAGE | @@ -11429,6 +11432,7 @@ static int wdc_vs_drive_info(int argc, char **argv, break; case WDC_NVME_SN861_DEV_ID: case WDC_NVME_SN861_DEV_ID_1: + case WDC_NVME_SN861_DEV_ID_2: data_len = sizeof(info); num_dwords = data_len / 4; if (data_len % 4 != 0) diff --git a/plugins/wdc/wdc-nvme.h b/plugins/wdc/wdc-nvme.h index a18da16501..4ab5672039 100644 --- a/plugins/wdc/wdc-nvme.h +++ b/plugins/wdc/wdc-nvme.h @@ -5,7 +5,7 @@ #if !defined(WDC_NVME) || defined(CMD_HEADER_MULTI_READ) #define WDC_NVME -#define WDC_PLUGIN_VERSION "2.9.1" +#define WDC_PLUGIN_VERSION "2.9.2" #include "cmd.h" PLUGIN(NAME("wdc", "Western Digital vendor specific extensions", WDC_PLUGIN_VERSION), From 9e7f1712c4127d7492ecf743bca428468d503065 Mon Sep 17 00:00:00 2001 From: innogritkenny Date: Wed, 14 Aug 2024 12:50:28 +0800 Subject: [PATCH 130/281] plugins/innogrit: modify for project tacoma modify get-eventlog and remove smart-log-add function Signed-off-by: innogritkenny --- plugins/innogrit/innogrit-nvme.c | 501 +++++++++++++------------------ plugins/innogrit/innogrit-nvme.h | 3 +- plugins/innogrit/typedef.h | 87 +++--- 3 files changed, 248 insertions(+), 343 deletions(-) diff --git a/plugins/innogrit/innogrit-nvme.c b/plugins/innogrit/innogrit-nvme.c index cd47efa01a..9e7be483e2 100644 --- a/plugins/innogrit/innogrit-nvme.c +++ b/plugins/innogrit/innogrit-nvme.c @@ -16,176 +16,175 @@ #define CREATE_CMD #include "innogrit-nvme.h" -static int innogrit_smart_log_additional(int argc, char **argv, - struct command *command, - struct plugin *plugin) +static int nvme_vucmd(int fd, unsigned char opcode, unsigned int cdw12, + unsigned int cdw13, unsigned int cdw14, + unsigned int cdw15, char *data, int data_len) { - struct nvme_smart_log smart_log = { 0 }; - struct vsc_smart_log *pvsc_smart = (struct vsc_smart_log *)smart_log.rsvd232; - const char *desc = "Retrieve additional SMART log for the given device "; - const char *namespace = "(optional) desired namespace"; - struct nvme_dev *dev; - int err, i, iindex; - - struct config { - __u32 namespace_id; - }; + struct nvme_passthru_cmd cmd; - struct config cfg = { - .namespace_id = NVME_NSID_ALL, - }; + memset(&cmd, 0, sizeof(cmd)); + cmd.opcode = opcode; + cmd.cdw2 = IGVSC_SIG; + cmd.cdw10 = data_len / 4; + cmd.cdw12 = cdw12; + cmd.cdw13 = cdw13; + cmd.cdw14 = cdw14; + cmd.cdw15 = cdw15; + cmd.nsid = 0xffffffff; + cmd.addr = (__u64)(__u64)(uintptr_t)data; + cmd.data_len = data_len; + return nvme_submit_admin_passthru(fd, &cmd, NULL); +} - OPT_ARGS(opts) = { - OPT_UINT("namespace-id", 'n', &cfg.namespace_id, namespace), - OPT_END() +int getlogpage(struct nvme_dev *dev, unsigned char ilogid, unsigned char ilsp, + char *data, int data_len, unsigned int *result) +{ + struct nvme_get_log_args args = { + .args_size = sizeof(args), + .fd = dev_fd(dev), + .lid = ilogid, + .nsid = 0xffffffff, + .lpo = 0, + .lsp = ilsp, + .lsi = 0, + .rae = true, + .uuidx = 0, + .csi = NVME_CSI_NVM, + .ot = false, + .len = data_len, + .log = (void *)data, + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .result = result, }; - - err = parse_and_open(&dev, argc, argv, desc, opts); - if (err) - return err; - - nvme_get_log_smart(dev_fd(dev), cfg.namespace_id, false, &smart_log); - nvme_show_smart_log(&smart_log, cfg.namespace_id, dev->name, NORMAL); - - printf("DW0[0-1] Defect Cnt : %u\n", pvsc_smart->defect_cnt); - printf("DW0[2-3] Slc Spb Cnt : %u\n", pvsc_smart->slc_spb_cnt); - printf("DW1 Slc Total Ec Cnt : %u\n", pvsc_smart->slc_total_ec_cnt); - printf("DW2 Slc Max Ec Cnt : %u\n", pvsc_smart->slc_max_ec_cnt); - printf("DW3 Slc Min Ec Cnt : %u\n", pvsc_smart->slc_min_ec_cnt); - printf("DW4 Slc Avg Ec Cnt : %u\n", pvsc_smart->slc_avg_ec_cnt); - printf("DW5 Total Ec Cnt : %u\n", pvsc_smart->total_ec_cnt); - printf("DW6 Max Ec Cnt : %u\n", pvsc_smart->max_ec_cnt); - printf("DW7 Min Ec Cnt : %u\n", pvsc_smart->min_ec_cnt); - printf("DW8 Avg Ec Cnt : %u\n", pvsc_smart->avg_ec_cnt); - printf("DW9 Mrd Rr Good Cnt : %u\n", pvsc_smart->mrd_rr_good_cnt); - printf("DW10 Ard Rr Good Cnt : %u\n", pvsc_smart->ard_rr_good_cnt); - printf("DW11 Preset Cnt : %u\n", pvsc_smart->preset_cnt); - printf("DW12 Nvme Reset Cnt : %u\n", pvsc_smart->nvme_reset_cnt); - printf("DW13 Low Pwr Cnt : %u\n", pvsc_smart->low_pwr_cnt); - printf("DW14 Wa : %u\n", pvsc_smart->wa); - printf("DW15 Ps3 Entry Cnt : %u\n", pvsc_smart->ps3_entry_cnt); - printf("DW16[0] highest_temp[0] : %u\n", pvsc_smart->highest_temp[0]); - printf("DW16[1] highest_temp[1] : %u\n", pvsc_smart->highest_temp[1]); - printf("DW16[2] highest_temp[2] : %u\n", pvsc_smart->highest_temp[2]); - printf("DW16[3] highest_temp[3] : %u\n", pvsc_smart->highest_temp[3]); - printf("DW17 weight_ec : %u\n", pvsc_smart->weight_ec); - printf("DW18 slc_cap_mb : %u\n", pvsc_smart->slc_cap_mb); - printf("DW19-20 nand_page_write_cnt : %llu\n", pvsc_smart->nand_page_write_cnt); - printf("DW21 program_error_cnt : %u\n", pvsc_smart->program_error_cnt); - printf("DW22 erase_error_cnt : %u\n", pvsc_smart->erase_error_cnt); - printf("DW23[0] flash_type : %u\n", pvsc_smart->flash_type); - printf("DW24 hs_crc_err_cnt : %u\n", pvsc_smart->hs_crc_err_cnt); - printf("DW25 ddr_ecc_err_cnt : %u\n", pvsc_smart->ddr_ecc_err_cnt); - iindex = 26; - for (i = 0; i < (sizeof(pvsc_smart->reserved3)/4); i++) { - if (pvsc_smart->reserved3[i] != 0) - printf("DW%-37d : %u\n", iindex, pvsc_smart->reserved3[i]); - iindex++; - } - - return 0; + return nvme_get_log(&args); } -static int sort_eventlog_fn(const void *a, const void *b) +int getvsctype(struct nvme_dev *dev) { - const struct eventlog_addindex *l = a; - const struct eventlog_addindex *r = b; - int rc; - - if (l->ms > r->ms) { - rc = 1; - } else if (l->ms < r->ms) { - rc = -1; - } else { - if (l->iindex < r->iindex) - rc = -1; - else - rc = 1; + unsigned char ilogid; + char data[4096]; + struct drvinfo_t *pdrvinfo = (struct drvinfo_t *)data; + + memset(data, 0, 4096); + // pdrvinfo by getlogpage + for (ilogid = 0xe1; ilogid < 0xe2; ilogid++) { + getlogpage(dev, ilogid, 0, data, 4096, NULL); + if (pdrvinfo->signature == 0x5A) + return 1; } - return rc; + //pdrvinfo by vucmd + nvme_vucmd(dev_fd(dev), 0xfe, 0x82, 0X03, 0x00, 0, (char *)data, 4096); + if (pdrvinfo->signature == 0x5A) + return 1; + + return 0; } -static void sort_eventlog(struct eventlog *data16ksrc, unsigned int icount) +int getvsc_eventlog(struct nvme_dev *dev, FILE *fp) { - struct eventlog_addindex peventlogadd[512]; - unsigned int i; + char data[4096]; + unsigned int errcnt, rxlen, start_flag; + unsigned long long end_flag; + struct evlg_flush_hdr *pevlog = (struct evlg_flush_hdr *)data; + int ret = -1; + int ivsctype = getvsctype(dev); - for (i = 0; i < icount; i++) { - memcpy(&peventlogadd[i], &data16ksrc[i], sizeof(struct eventlog)); - peventlogadd[i].iindex = i; - } + start_flag = 0; + rxlen = 0; + errcnt = 0; - qsort(peventlogadd, icount, sizeof(struct eventlog_addindex), sort_eventlog_fn); + while (1) { + memset(data, 0, 4096); + if (ivsctype == 0) { + ret = nvme_vucmd(dev_fd(dev), NVME_VSC_GET_EVENT_LOG, 0, 0, + (SRB_SIGNATURE >> 32), + (SRB_SIGNATURE & 0xFFFFFFFF), + (char *)data, 4096); + } else { + ret = nvme_vucmd(dev_fd(dev), NVME_VSC_TYPE1_GET, 0x60, 0, + 0, 0, (char *)data, 4096); + } - for (i = 0; i < icount; i++) - memcpy(&data16ksrc[i], &peventlogadd[i], sizeof(struct eventlog)); -} + if (ret == -1) { + printf("(error)\n"); + return IG_ERROR; + } -static unsigned char setfilecontent(char *filenamea, unsigned char *buffer, - unsigned int buffersize) -{ - FILE *fp = NULL; - int rc; + if (pevlog->signature == EVLOG_SIG) { + errcnt = 0; + } else { + errcnt++; + if (errcnt > 16) { + printf("(invalid data error)\n"); + return IG_ERROR; + } + } - if (buffersize == 0) - return true; - fp = fopen(filenamea, "a+"); - rc = fwrite(buffer, 1, buffersize, fp); - fclose(fp); - if (rc != buffersize) - return false; - return true; + if (start_flag == 1) { + end_flag = *(unsigned long long *)&data[4096 - 32]; + if (end_flag == 0xffffffff00000000) + break; + fwrite(data, 1, 4096, fp); + rxlen += 4096; + printf("\rget eventlog : %d.%d MB ", rxlen / SIZE_MB, + (rxlen % SIZE_MB) * 100 / SIZE_MB); + } else if (errcnt == 0) { + printf("get eventlog by vsc command\n"); + start_flag = 1; + fwrite(data, 1, 4096, fp); + rxlen += 4096; + } + } + printf("\n"); + return IG_SUCCESS; } -static int nvme_vucmd(int fd, unsigned char opcode, unsigned int cdw12, - unsigned int cdw13, unsigned int cdw14, - unsigned int cdw15, char *data, int data_len) +int getlogpage_eventlog(struct nvme_dev *dev, FILE *fp) { - struct nvme_passthru_cmd cmd; + unsigned int i, result, total_size; + char data[4096]; + int ret = 0; - memset(&cmd, 0, sizeof(cmd)); - cmd.opcode = opcode; - cmd.cdw2 = IGVSC_SIG; - cmd.cdw10 = data_len / 4; - cmd.cdw12 = cdw12; - cmd.cdw13 = cdw13; - cmd.cdw14 = cdw14; - cmd.cdw15 = cdw15; - cmd.nsid = 0xffffffff; - cmd.addr = (__u64)(__u64)(uintptr_t)data; - cmd.data_len = data_len; - return nvme_submit_admin_passthru(fd, &cmd, NULL); + result = 0; + ret = getlogpage(dev, 0xcb, 0x01, data, 4096, NULL); + if (ret) + return IG_UNSUPPORT; + + ret = getlogpage(dev, 0xcb, 0x02, data, 4096, &result); + if ((ret) || (result == 0)) + return IG_UNSUPPORT; + + total_size = result * 4096; + printf("total eventlog : %d.%d MB\n", total_size / SIZE_MB, + (total_size % SIZE_MB) * 100 / SIZE_MB); + for (i = 0; i <= total_size; i += 4096) { + ret = getlogpage(dev, 0xcb, 0x00, data, 4096, NULL); + printf("\rget eventlog : %d.%d MB ", i / SIZE_MB, + (i % SIZE_MB) * 100 / SIZE_MB); + if (ret) { + printf("(error)\n"); + return IG_ERROR; + } + fwrite(data, 1, 4096, fp); + } + printf("\n"); + return IG_SUCCESS; } -static int innogrit_vsc_geteventlog(int argc, char **argv, +static int innogrit_geteventlog(int argc, char **argv, struct command *command, struct plugin *plugin) { time_t timep; struct tm *logtime; - int icount, ioffset16k, iblock, ivsctype; char currentdir[128], filename[512]; - unsigned char data[4096], data16k[SIZE_16K], zerob[32]; - unsigned int *pcheckdata; - unsigned int isize, icheck_stopvalue, iend; - unsigned char bSortLog = false, bget_nextlog = true; - struct evlg_flush_hdr *pevlog = (struct evlg_flush_hdr *)data; const char *desc = "Recrieve event log for the given device "; - const char *clean_opt = "(optional) 1 for clean event log"; struct nvme_dev *dev; + FILE *fp = NULL; int ret = -1; - struct config { - __u32 clean_flg; - }; - - struct config cfg = { - .clean_flg = 0, - }; - OPT_ARGS(opts) = { - OPT_UINT("clean_flg", 'c', &cfg.clean_flg, clean_opt), OPT_END() }; @@ -193,120 +192,25 @@ static int innogrit_vsc_geteventlog(int argc, char **argv, if (ret) return ret; - if (getcwd(currentdir, 128) == NULL) return -1; - ret = nvme_vucmd(dev_fd(dev), 0xFE, 0x82, 0x03, 0x00, 0x00, (char *)data, 4096); - if (ret == -1) - return ret; - - if (data[0] == 0x5A) - ivsctype = 1; - else - ivsctype = 0; - time(&timep); logtime = localtime(&timep); - sprintf(filename, "%s/eventlog_%02d%02d-%02d%02d%02d.elog", currentdir, logtime->tm_mon+1, - logtime->tm_mday, logtime->tm_hour, logtime->tm_min, logtime->tm_sec); - - iblock = 0; - ioffset16k = 0; - memset(data16k, 0, SIZE_16K); - memset(zerob, 0, 32); - - icount = 0; - while (bget_nextlog) { - if (icount % 100 == 0) { - printf("\rWait for Dump EventLog " XCLEAN_LINE); - fflush(stdout); - icount = 0; - } else if (icount % 5 == 0) { - printf("."); - fflush(stdout); - } - icount++; - - memset(data, 0, 4096); - if (ivsctype == 1) - ret = nvme_vucmd(dev_fd(dev), 0xFE, 0x60, 0x00, 0x00, 0x00, (char *)data, - 4096); - else - ret = nvme_vucmd(dev_fd(dev), NVME_VSC_GET_EVENT_LOG, 0, 0, - (SRB_SIGNATURE >> 32), - (SRB_SIGNATURE & 0xFFFFFFFF), - (char *)data, 4096); - if (ret == -1) - return ret; - - pcheckdata = (unsigned int *)&data[4096 - 32]; - icheck_stopvalue = pcheckdata[1]; - - if (icheck_stopvalue == 0xFFFFFFFF) { - isize = pcheckdata[0]; - if (isize == 0) { - /* Finish Log */ - bget_nextlog = false; - } else if (bSortLog) { - /* No Full 4K Package */ - for (iend = 0; iend < isize - 32; iend += sizeof(struct eventlog)) { - if (memcmp(&data[iend], zerob, sizeof(struct eventlog)) != 0) { - memcpy(&data16k[ioffset16k], &data[iend], sizeof(struct eventlog)); - ioffset16k += sizeof(struct eventlog); - } - } - } else { - setfilecontent(filename, data, isize); - } - } else { - /* Full 4K Package */ - if ((pevlog->signature == EVLOG_SIG) && (pevlog->log_type == 1)) - bSortLog = true; - - if (bSortLog) { - for (iend = 0; iend < SIZE_4K; iend += sizeof(struct eventlog)) { - if (memcmp(&data[iend], zerob, sizeof(struct eventlog)) != 0) { - memcpy(&data16k[ioffset16k], &data[iend], sizeof(struct eventlog)); - ioffset16k += sizeof(struct eventlog); - } - } - - iblock++; - if (iblock == 4) { - sort_eventlog((struct eventlog *)(data16k + sizeof(struct evlg_flush_hdr)), - (ioffset16k - sizeof(struct evlg_flush_hdr))/sizeof(struct eventlog)); - setfilecontent(filename, data16k, ioffset16k); - ioffset16k = 0; - iblock = 0; - memset(data16k, 0, SIZE_16K); - } - } else { - setfilecontent(filename, data, SIZE_4K); - } - - } - } + sprintf(filename, "%s/eventlog_%02d%02d-%02d%02d%02d.eraw", currentdir, + logtime->tm_mon+1, logtime->tm_mday, logtime->tm_hour, logtime->tm_min, + logtime->tm_sec); + printf("output eventlog file : %s\n", filename); - if (bSortLog) { - if (ioffset16k > 0) { - sort_eventlog((struct eventlog *)(data16k + sizeof(struct evlg_flush_hdr)), - (ioffset16k - sizeof(struct evlg_flush_hdr))/sizeof(struct eventlog)); - setfilecontent(filename, data16k, ioffset16k); - } - } - - printf("\r" XCLEAN_LINE "Dump eventLog finish to %s\n", filename); - chmod(filename, 0666); - - if (cfg.clean_flg == 1) { - printf("Clean eventlog\n"); - nvme_vucmd(dev_fd(dev), NVME_VSC_CLEAN_EVENT_LOG, 0, 0, - (SRB_SIGNATURE >> 32), - (SRB_SIGNATURE & 0xFFFFFFFF), (char *)NULL, 0); - } + fp = fopen(filename, "a+"); + getvsctype(dev); + ret = getlogpage_eventlog(dev, fp); + if (ret == IG_UNSUPPORT) + ret = getvsc_eventlog(dev, fp); + fclose(fp); dev_close(dev); + chmod(filename, 0666); return ret; } @@ -318,13 +222,14 @@ static int innogrit_vsc_getcdump(int argc, char **argv, struct command *command, struct tm *logtime; char currentdir[128], filename[512], fname[128]; unsigned int itotal, icur, ivsctype; - unsigned char data[4096]; + char data[4096]; struct cdumpinfo cdumpinfo; unsigned char busevsc = false; unsigned int ipackcount, ipackindex; char fwvera[32]; const char *desc = "Recrieve cdump data for the given device "; struct nvme_dev *dev; + FILE *fp = NULL; int ret = -1; OPT_ARGS(opts) = { @@ -335,50 +240,48 @@ static int innogrit_vsc_getcdump(int argc, char **argv, struct command *command, if (ret) return ret; + ivsctype = getvsctype(dev); + if (getcwd(currentdir, 128) == NULL) return -1; time(&timep); logtime = localtime(&timep); - ivsctype = 0; ipackindex = 0; memset(data, 0, 4096); - ret = nvme_vucmd(dev_fd(dev), 0xFE, 0x82, 0x03, 0x00, 0x00, (char *)data, 4096); - if (ret == -1) - return ret; - - if (data[0] == 0x5A) { - ivsctype = 1; - ret = nvme_vucmd(dev_fd(dev), 0xFE, 0x82, 0x08, 0x00, 0x00, (char *)data, 4096); - } else { - ivsctype = 0; + if (ivsctype == 0) { ret = nvme_vucmd(dev_fd(dev), NVME_VSC_GET, VSC_FN_GET_CDUMP, 0x00, - (SRB_SIGNATURE >> 32), (SRB_SIGNATURE & 0xFFFFFFFF), - (char *)data, 4096); + (SRB_SIGNATURE >> 32), (SRB_SIGNATURE & 0xFFFFFFFF), + (char *)data, 4096); + } else { + ret = nvme_vucmd(dev_fd(dev), NVME_VSC_TYPE1_GET, 0x82, 0x00, + 0, 0, (char *)data, 4096); } - if (ret == -1) - return ret; - memcpy(&cdumpinfo, &data[3072], sizeof(cdumpinfo)); - if (cdumpinfo.sig == 0x5a5b5c5d) { - busevsc = true; - ipackcount = cdumpinfo.ipackcount; - if (ipackcount == 0) { - itotal = 0; - } else { - itotal = cdumpinfo.cdumppack[ipackindex].ilenth; - memset(fwvera, 0, sizeof(fwvera)); - memcpy(fwvera, cdumpinfo.cdumppack[ipackindex].fwver, 8); - sprintf(fname, "cdump_%02d%02d-%02d%02d%02d_%d_%s.cdp", logtime->tm_mon+1, - logtime->tm_mday, logtime->tm_hour, logtime->tm_min, logtime->tm_sec, - ipackindex, fwvera); - sprintf(filename, "%s/%s", currentdir, fname); + if (ret == 0) { + memcpy(&cdumpinfo, &data[3072], sizeof(cdumpinfo)); + if (cdumpinfo.sig == 0x5a5b5c5d) { + busevsc = true; + ipackcount = cdumpinfo.ipackcount; + if (ipackcount == 0) { + itotal = 0; + } else { + itotal = cdumpinfo.cdumppack[ipackindex].ilenth; + memset(fwvera, 0, sizeof(fwvera)); + memcpy(fwvera, cdumpinfo.cdumppack[ipackindex].fwver, 8); + sprintf(fname, "cdump_%02d%02d-%02d%02d%02d_%d_%s.cdp", + logtime->tm_mon+1, logtime->tm_mday, logtime->tm_hour, + logtime->tm_min, logtime->tm_sec, ipackindex, fwvera); + sprintf(filename, "%s/%s", currentdir, fname); + if (fp != NULL) + fclose(fp); + fp = fopen(filename, "a+"); + } } } - if (busevsc == false) { memset(data, 0, 4096); ret = nvme_get_nsid_log(dev_fd(dev), true, 0x07, @@ -389,9 +292,12 @@ static int innogrit_vsc_getcdump(int argc, char **argv, struct command *command, ipackcount = 1; memcpy(&itotal, &data[4092], 4); - sprintf(fname, "cdump_%02d%02d-%02d%02d%02d.cdp", logtime->tm_mon+1, logtime->tm_mday, - logtime->tm_hour, logtime->tm_min, logtime->tm_sec); + sprintf(fname, "cdump_%02d%02d-%02d%02d%02d.cdp", logtime->tm_mon+1, + logtime->tm_mday, logtime->tm_hour, logtime->tm_min, logtime->tm_sec); sprintf(filename, "%s/%s", currentdir, fname); + if (fp != NULL) + fclose(fp); + fp = fopen(filename, "a+"); } if (itotal == 0) { @@ -402,17 +308,20 @@ static int innogrit_vsc_getcdump(int argc, char **argv, struct command *command, while (ipackindex < ipackcount) { memset(data, 0, 4096); strcpy((char *)data, "cdumpstart"); - setfilecontent(filename, data, strlen((char *)data)); + fwrite(data, 1, strlen((char *)data), fp); for (icur = 0; icur < itotal; icur += 4096) { memset(data, 0, 4096); if (busevsc) { - if (ivsctype == 1) - ret = nvme_vucmd(dev_fd(dev), 0xFE, 0x82, 0x08, 0x00, 0x00, - (char *)data, 4096); - else - ret = nvme_vucmd(dev_fd(dev), NVME_VSC_GET, VSC_FN_GET_CDUMP, 0x00, - (SRB_SIGNATURE >> 32), (SRB_SIGNATURE & 0xFFFFFFFF), - (char *)data, 4096); + if (ivsctype == 0) { + ret = nvme_vucmd(dev_fd(dev), NVME_VSC_GET, + VSC_FN_GET_CDUMP, 0x00, + (SRB_SIGNATURE >> 32), + (SRB_SIGNATURE & 0xFFFFFFFF), + (char *)data, 4096); + } else { + ret = nvme_vucmd(dev_fd(dev), NVME_VSC_TYPE1_GET, + 0x82, 0x00, 0, 0, (char *)data, 4096); + } } else { ret = nvme_get_nsid_log(dev_fd(dev), true, 0x07, @@ -421,25 +330,27 @@ static int innogrit_vsc_getcdump(int argc, char **argv, struct command *command, if (ret != 0) return ret; - setfilecontent(filename, data, 4096); - + fwrite(data, 1, 4096, fp); printf("\rWait for dump data %d%%" XCLEAN_LINE, ((icur+4096) * 100/itotal)); } memset(data, 0, 4096); strcpy((char *)data, "cdumpend"); - setfilecontent(filename, data, strlen((char *)data)); + fwrite(data, 1, strlen((char *)data), fp); printf("\r%s\n", fname); ipackindex++; if (ipackindex != ipackcount) { memset(data, 0, 4096); if (busevsc) { - if (ivsctype == 1) - ret = nvme_vucmd(dev_fd(dev), 0xFE, 0x82, 0x08, 0x00, 0x00, - (char *)data, 4096); - else - ret = nvme_vucmd(dev_fd(dev), NVME_VSC_GET, VSC_FN_GET_CDUMP, 0x00, - (SRB_SIGNATURE >> 32), (SRB_SIGNATURE & 0xFFFFFFFF), - (char *)data, 4096); + if (ivsctype == 0) { + ret = nvme_vucmd(dev_fd(dev), NVME_VSC_GET, + VSC_FN_GET_CDUMP, 0x00, + (SRB_SIGNATURE >> 32), + (SRB_SIGNATURE & 0xFFFFFFFF), + (char *)data, 4096); + } else { + ret = nvme_vucmd(dev_fd(dev), NVME_VSC_TYPE1_GET, + 0x82, 0x00, 0, 0, (char *)data, 4096); + } } else { ret = nvme_get_nsid_log(dev_fd(dev), true, 0x07, @@ -455,12 +366,16 @@ static int innogrit_vsc_getcdump(int argc, char **argv, struct command *command, sprintf(fname, "cdump_%02d%02d-%02d%02d%02d_%d_%s.cdp", logtime->tm_mon+1, logtime->tm_mday, logtime->tm_hour, logtime->tm_min, logtime->tm_sec, ipackindex, fwvera); - sprintf(filename, "%s/%s", currentdir, fname); + if (fp != NULL) + fclose(fp); + fp = fopen(filename, "a+"); } } printf("\n"); dev_close(dev); + if (fp != NULL) + fclose(fp); return ret; } diff --git a/plugins/innogrit/innogrit-nvme.h b/plugins/innogrit/innogrit-nvme.h index 2de0502a65..885479c3a4 100644 --- a/plugins/innogrit/innogrit-nvme.h +++ b/plugins/innogrit/innogrit-nvme.h @@ -9,8 +9,7 @@ PLUGIN(NAME("innogrit", "innogrit vendor specific extensions", NVME_VERSION), COMMAND_LIST( - ENTRY("smart-log-add", "Retrieve innogrit SMART Log, show it", innogrit_smart_log_additional) - ENTRY("get-eventlog", "get event log", innogrit_vsc_geteventlog) + ENTRY("get-eventlog", "get event log", innogrit_geteventlog) ENTRY("get-cdump", "get cdump data", innogrit_vsc_getcdump) ) ); diff --git a/plugins/innogrit/typedef.h b/plugins/innogrit/typedef.h index 7220d38d84..0c5e4063a0 100644 --- a/plugins/innogrit/typedef.h +++ b/plugins/innogrit/typedef.h @@ -1,15 +1,18 @@ /* SPDX-License-Identifier: GPL-2.0-or-later */ -#define SIZE_4K 4096 -#define SIZE_16K 16384 +#define IG_SUCCESS (0) +#define IG_UNSUPPORT (-1) +#define IG_ERROR (-2) -#define NVME_VSC_GET_EVENT_LOG 0xC2 -#define NVME_VSC_CLEAN_EVENT_LOG 0xD8 -#define NVME_VSC_GET 0xE6 -#define VSC_FN_GET_CDUMP 0x08 -#define EVLOG_SIG 0x65766C67 -#define IGVSC_SIG 0x69677673 -#define SRB_SIGNATURE 0x544952474F4E4E49ULL -#define XCLEAN_LINE "\033[K" +#define NVME_VSC_GET_EVENT_LOG 0xC2 +#define NVME_VSC_GET 0xE6 +#define NVME_VSC_TYPE1_GET 0xFE +#define VSC_FN_GET_CDUMP 0x08 +#define IGVSC_SIG 0x69677673 +#define EVLOG_SIG 0x65766C67 +#define SRB_SIGNATURE 0x544952474F4E4E49ULL + +#define XCLEAN_LINE "\033[K" +#define SIZE_MB 0x100000 struct evlg_flush_hdr { unsigned int signature; @@ -27,45 +30,33 @@ struct eventlog { unsigned int param[7]; }; -struct eventlog_addindex { - unsigned int ms; - unsigned int param[7]; - unsigned int iindex; -}; - -#pragma pack(push) -#pragma pack(1) -struct vsc_smart_log { - unsigned short defect_cnt; - unsigned short slc_spb_cnt; - unsigned int slc_total_ec_cnt; - unsigned int slc_max_ec_cnt; - unsigned int slc_min_ec_cnt; - unsigned int slc_avg_ec_cnt; - unsigned int total_ec_cnt; - unsigned int max_ec_cnt; - unsigned int min_ec_cnt; - unsigned int avg_ec_cnt; - unsigned int mrd_rr_good_cnt; - unsigned int ard_rr_good_cnt; - unsigned int preset_cnt; - unsigned int nvme_reset_cnt; - unsigned int low_pwr_cnt; - unsigned int wa; - unsigned int ps3_entry_cnt; - unsigned char highest_temp[4]; - unsigned int weight_ec; - unsigned int slc_cap_mb; - unsigned long long nand_page_write_cnt; - unsigned int program_error_cnt; - unsigned int erase_error_cnt; - unsigned char flash_type; - unsigned char reserved2[3]; - unsigned int hs_crc_err_cnt; - unsigned int ddr_ecc_err_cnt; - unsigned int reserved3[44]; +struct drvinfo_t { + unsigned char signature; + unsigned char fw_base; + unsigned short socid; + unsigned char soc_ver[4]; + unsigned char loader_version[8]; + unsigned char nand_devids[6]; + unsigned char ddr_type; + unsigned char ddr_size; + unsigned char rsvd1[8]; + unsigned char origin_fw_name[8]; + unsigned long long nand_type; + unsigned int board_type[5]; + unsigned short soc_type; + unsigned char build_mode; + unsigned char rsvd2; + unsigned int ftl_build_num; + unsigned short soc_reg; + unsigned char rsvd3[2]; + unsigned int cur_cpu_clk; + unsigned int cur_nf_clk; + unsigned char nand_geo[4]; + unsigned int fw_d2h_info_bit; + unsigned int spi_flash_id; + unsigned char rom_version[8]; + unsigned char rsvd4[404]; }; -#pragma pack(pop) struct cdump_pack { unsigned int ilenth; From 7ad9d9adc4b61654b9ef1722f054555da1777224 Mon Sep 17 00:00:00 2001 From: Francis Pravin Date: Fri, 16 Aug 2024 12:12:36 +0530 Subject: [PATCH 131/281] nvme-print: print the new fields added in TP4142 Print the new fields added in Identify Controller Data Structure. Also, print the field added in Temperature Threshold feature. Signed-off-by: Francis Pravin Reviewed-by: Steven Seungcheol Lee --- nvme-print-json.c | 11 ++++++++++- nvme-print-stdout.c | 31 ++++++++++++++++++++++++++----- 2 files changed, 36 insertions(+), 6 deletions(-) diff --git a/nvme-print-json.c b/nvme-print-json.c index ce094ec40b..af90eba04f 100644 --- a/nvme-print-json.c +++ b/nvme-print-json.c @@ -400,6 +400,7 @@ void json_nvme_id_ctrl(struct nvme_id_ctrl *ctrl, obj_add_uint(r, "pels", le32_to_cpu(ctrl->pels)); obj_add_int(r, "domainid", le16_to_cpu(ctrl->domainid)); obj_add_uint128(r, "megcap", megcap); + obj_add_int(r, "tmpthha", ctrl->tmpthha); obj_add_int(r, "sqes", ctrl->sqes); obj_add_int(r, "cqes", ctrl->cqes); obj_add_int(r, "maxcmd", le16_to_cpu(ctrl->maxcmd)); @@ -3298,9 +3299,17 @@ static void json_feature_show_fields_lba_range(struct json_object *r, __u8 field static void json_feature_show_fields_temp_thresh(struct json_object *r, unsigned int result) { - __u8 field = (result & 0x300000) >> 20; char json_str[STR_LEN]; + __u8 field; + field = (result & 0x1c00000) >> 22; + sprintf(json_str, "%s", nvme_degrees_string(field)); + obj_add_str(r, "Temperature Threshold Hysteresis (TMPTHH)", json_str); + + sprintf(json_str, "%u K", field); + obj_add_str(r, "TMPTHH kelvin", json_str); + + field = (result & 0x300000) >> 20; obj_add_uint(r, "Threshold Type Select (THSEL)", field); obj_add_str(r, "THSEL description", nvme_feature_temp_type_to_string(field)); diff --git a/nvme-print-stdout.c b/nvme-print-stdout.c index acecd1ac3d..e23739a394 100644 --- a/nvme-print-stdout.c +++ b/nvme-print-stdout.c @@ -1684,7 +1684,8 @@ static void stdout_id_ctrl_oaes(__le32 ctrl_oaes) __u32 disc = (oaes >> 31) & 0x1; __u32 rsvd0 = (oaes & 0x70000000) >> 28; __u32 zicn = (oaes & 0x08000000) >> 27; - __u32 rsvd1 = (oaes & 0x07FF0000) >> 16; + __u32 rsvd1 = (oaes & 0x7fe0000) >> 17; + __u32 tthr = (oaes & 0x10000) >> 16; __u32 normal_shn = (oaes >> 15) & 0x1; __u32 egealpcn = (oaes & 0x4000) >> 14; __u32 lbasin = (oaes & 0x2000) >> 13; @@ -1702,7 +1703,9 @@ static void stdout_id_ctrl_oaes(__le32 ctrl_oaes) printf(" [27:27] : %#x\tZone Descriptor Changed Notices %sSupported\n", zicn, zicn ? "" : "Not "); if (rsvd1) - printf(" [26:16] : %#x\tReserved\n", rsvd1); + printf(" [26:17] : %#x\tReserved\n", rsvd1); + printf(" [16:16] : %#x\tTemperature Threshold Hysteresis Recovery %sSupported\n", + tthr, tthr ? "" : "Not "); printf(" [15:15] : %#x\tNormal NSS Shutdown Event %sSupported\n", normal_shn, normal_shn ? "" : "Not "); printf(" [14:14] : %#x\tEndurance Group Event Aggregate Log Page"\ @@ -2118,6 +2121,18 @@ static void stdout_id_ctrl_anacap(__u8 anacap) printf("\n"); } +static void stdout_id_ctrl_tmpthha(__u8 tmpthha) +{ + __u8 rsvd3 = (tmpthha & 0xf8) >> 3; + __u8 tmpthmh = tmpthha & 0x7; + + if (rsvd3) + printf(" [7:3] : %#x\tReserved\n", rsvd3); + printf(" [2:0] : %#x\tTemperature Threshold Maximum Hysteresis\n", + tmpthmh); + printf("\n"); +} + static void stdout_id_ctrl_sqes(__u8 sqes) { __u8 msqes = (sqes & 0xF0) >> 4; @@ -2992,6 +3007,9 @@ static void stdout_id_ctrl(struct nvme_id_ctrl *ctrl, printf("domainid : %d\n", le16_to_cpu(ctrl->domainid)); printf("megcap : %s\n", uint128_t_to_l10n_string(le128_to_cpu(ctrl->megcap))); + printf("tmpthha : %#x\n", ctrl->tmpthha); + if (human) + stdout_id_ctrl_tmpthha(ctrl->tmpthha); printf("sqes : %#x\n", ctrl->sqes); if (human) stdout_id_ctrl_sqes(ctrl->sqes); @@ -4495,13 +4513,16 @@ static void stdout_feature_show_fields(enum nvme_features_id fid, stdout_lba_range((struct nvme_lba_range_type *)buf, field); break; case NVME_FEAT_FID_TEMP_THRESH: + field = (result & 0x1c00000) >> 22; + printf("\tTemperature Threshold Hysteresis(TMPTHH): %s (%u K)\n", + nvme_degrees_string(field), field); field = (result & 0x00300000) >> 20; - printf("\tThreshold Type Select (THSEL): %u - %s\n", field, + printf("\tThreshold Type Select (THSEL): %u - %s\n", field, nvme_feature_temp_type_to_string(field)); field = (result & 0x000f0000) >> 16; - printf("\tThreshold Temperature Select (TMPSEL): %u - %s\n", + printf("\tThreshold Temperature Select (TMPSEL): %u - %s\n", field, nvme_feature_temp_sel_to_string(field)); - printf("\tTemperature Threshold (TMPTH): %s (%u K)\n", + printf("\tTemperature Threshold (TMPTH): %s (%u K)\n", nvme_degrees_string(result & 0x0000ffff), result & 0x0000ffff); break; case NVME_FEAT_FID_ERR_RECOVERY: From 7bb2940f21650c625f7c35ab880c3d9e22d5f7f1 Mon Sep 17 00:00:00 2001 From: Martin George Date: Fri, 16 Aug 2024 17:12:44 +0530 Subject: [PATCH 132/281] netapp: fix uninitialized value from heap error Valgrind complained about an "uninitialized value created by a heap allocation" error. Fix the same. Signed-off-by: Martin George --- plugins/netapp/netapp-nvme.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugins/netapp/netapp-nvme.c b/plugins/netapp/netapp-nvme.c index 99f0a20df4..fb1b5679ac 100644 --- a/plugins/netapp/netapp-nvme.c +++ b/plugins/netapp/netapp-nvme.c @@ -470,6 +470,8 @@ static int netapp_ontapdevices_get_info(int fd, struct ontapdevice_info *item, return 0; } + memset(nsdescs, 0, 0x1000); + err = nvme_identify_ns_descs(fd, item->nsid, nsdescs); if (err) { fprintf(stderr, "Unable to identify namespace descriptor for %s (%s)\n", From cc87270e085f8f79db61f00743a45f0f7c0fdc70 Mon Sep 17 00:00:00 2001 From: Martin George Date: Fri, 16 Aug 2024 18:12:04 +0530 Subject: [PATCH 133/281] netapp: segregate the print routines Segregate printing the respective regular/normal and json outputs into separate routines for better readability. Signed-off-by: Martin George --- plugins/netapp/netapp-nvme.c | 93 ++++++++++++++++++++++-------------- 1 file changed, 56 insertions(+), 37 deletions(-) diff --git a/plugins/netapp/netapp-nvme.c b/plugins/netapp/netapp-nvme.c index fb1b5679ac..4694cc9d4b 100644 --- a/plugins/netapp/netapp-nvme.c +++ b/plugins/netapp/netapp-nvme.c @@ -316,11 +316,9 @@ static void netapp_smdevices_print(struct smdevice_info *devices, int count, int } } -static void netapp_ontapdevices_print(struct ontapdevice_info *devices, +static void netapp_ontapdevices_print_regular(struct ontapdevice_info *devices, int count, int format) { - struct json_object *root = NULL; - struct json_object *json_devices = NULL; char vsname[ONTAP_LABEL_LEN] = " "; char nspath[ONTAP_NS_PATHLEN] = " "; unsigned long long lba; @@ -328,52 +326,67 @@ static void netapp_ontapdevices_print(struct ontapdevice_info *devices, char uuid_str[37] = " "; int i; - char basestr[] = "%s, Vserver %s, Namespace Path %s, NSID %d, UUID %s, %s\n"; + char *formatstr = NULL; + char basestr[] = + "%s, Vserver %s, Namespace Path %s, NSID %d, UUID %s, %s\n"; char columnstr[] = "%-16s %-25s %-50s %-4d %-38s %-9s\n"; - /* default to 'normal' output format */ - char *formatstr = basestr; - - if (format == NCOLUMN) { - /* change output string and print column headers */ - formatstr = columnstr; + if (format == NNORMAL) + formatstr = basestr; + else if (format == NCOLUMN) { printf("%-16s %-25s %-50s %-4s %-38s %-9s\n", - "Device", "Vserver", "Namespace Path", - "NSID", "UUID", "Size"); + "Device", "Vserver", "Namespace Path", + "NSID", "UUID", "Size"); printf("%-16s %-25s %-50s %-4s %-38s %-9s\n", - "----------------", "-------------------------", - "--------------------------------------------------", - "----", "--------------------------------------", - "---------"); - } else if (format == NJSON) { - /* prepare for json output */ - root = json_create_object(); - json_devices = json_create_array(); + "----------------", "-------------------------", + "--------------------------------------------------", + "----", "--------------------------------------", + "---------"); + formatstr = columnstr; } for (i = 0; i < count; i++) { - netapp_get_ns_size(size, &lba, &devices[i].ns); nvme_uuid_to_string(devices[i].uuid, uuid_str); netapp_get_ontap_labels(vsname, nspath, devices[i].log_data); - if (format == NJSON) { - netapp_ontapdevice_json(json_devices, devices[i].dev, - vsname, nspath, devices[i].nsid, - uuid_str, size, lba, - le64_to_cpu(devices[i].ns.nsze)); - } else - printf(formatstr, devices[i].dev, vsname, nspath, - devices[i].nsid, uuid_str, size); + printf(formatstr, devices[i].dev, vsname, nspath, + devices[i].nsid, uuid_str, size); } +} - if (format == NJSON) { - /* complete the json output */ - json_object_add_value_array(root, "ONTAPdevices", json_devices); - json_print_object(root, NULL); - printf("\n"); - json_free_object(root); +static void netapp_ontapdevices_print_json(struct ontapdevice_info *devices, + int count) +{ + struct json_object *root = NULL; + struct json_object *json_devices = NULL; + char vsname[ONTAP_LABEL_LEN] = " "; + char nspath[ONTAP_NS_PATHLEN] = " "; + unsigned long long lba; + char size[128]; + char uuid_str[37] = " "; + int i; + + /* prepare for the json output */ + root = json_create_object(); + json_devices = json_create_array(); + + for (i = 0; i < count; i++) { + netapp_get_ns_size(size, &lba, &devices[i].ns); + nvme_uuid_to_string(devices[i].uuid, uuid_str); + netapp_get_ontap_labels(vsname, nspath, devices[i].log_data); + + netapp_ontapdevice_json(json_devices, devices[i].dev, + vsname, nspath, devices[i].nsid, + uuid_str, size, lba, + le64_to_cpu(devices[i].ns.nsze)); } + + /* complete the json output */ + json_object_add_value_array(root, "ONTAPdevices", json_devices); + json_print_object(root, NULL); + printf("\n"); + json_free_object(root); } static int nvme_get_ontap_c2_log(int fd, __u32 nsid, void *buf, __u32 buflen) @@ -666,8 +679,14 @@ static int netapp_ontapdevices(int argc, char **argv, struct command *command, close(fd); } - if (num_ontapdevices) - netapp_ontapdevices_print(ontapdevices, num_ontapdevices, fmt); + if (num_ontapdevices) { + if (fmt == NNORMAL || fmt == NCOLUMN) + netapp_ontapdevices_print_regular(ontapdevices, + num_ontapdevices, fmt); + else if (fmt == NJSON) + netapp_ontapdevices_print_json(ontapdevices, + num_ontapdevices); + } for (i = 0; i < num; i++) free(devices[i]); From 8642daa2590dc799e6cb321cd683bbe279830c77 Mon Sep 17 00:00:00 2001 From: Martin George Date: Fri, 16 Aug 2024 19:05:13 +0530 Subject: [PATCH 134/281] netapp: print output for single device too In addition to printing info of all ontap devices on the host, provide an option to print the output for the specified device alone. Signed-off-by: Martin George --- plugins/netapp/netapp-nvme.c | 53 +++++++++++++++++++++++++++++++++--- 1 file changed, 49 insertions(+), 4 deletions(-) diff --git a/plugins/netapp/netapp-nvme.c b/plugins/netapp/netapp-nvme.c index 4694cc9d4b..7318cda85c 100644 --- a/plugins/netapp/netapp-nvme.c +++ b/plugins/netapp/netapp-nvme.c @@ -317,7 +317,7 @@ static void netapp_smdevices_print(struct smdevice_info *devices, int count, int } static void netapp_ontapdevices_print_regular(struct ontapdevice_info *devices, - int count, int format) + int count, int format, const char *devname) { char vsname[ONTAP_LABEL_LEN] = " "; char nspath[ONTAP_NS_PATHLEN] = " "; @@ -346,6 +346,21 @@ static void netapp_ontapdevices_print_regular(struct ontapdevice_info *devices, } for (i = 0; i < count; i++) { + if (devname && !strcmp(devname, basename(devices[i].dev))) { + /* found the device, fetch and print for that alone */ + netapp_get_ns_size(size, &lba, &devices[i].ns); + nvme_uuid_to_string(devices[i].uuid, uuid_str); + netapp_get_ontap_labels(vsname, nspath, + devices[i].log_data); + + printf(formatstr, devices[i].dev, vsname, nspath, + devices[i].nsid, uuid_str, size); + return; + } + } + + for (i = 0; i < count; i++) { + /* fetch info and print for all devices */ netapp_get_ns_size(size, &lba, &devices[i].ns); nvme_uuid_to_string(devices[i].uuid, uuid_str); netapp_get_ontap_labels(vsname, nspath, devices[i].log_data); @@ -356,7 +371,7 @@ static void netapp_ontapdevices_print_regular(struct ontapdevice_info *devices, } static void netapp_ontapdevices_print_json(struct ontapdevice_info *devices, - int count) + int count, const char *devname) { struct json_object *root = NULL; struct json_object *json_devices = NULL; @@ -372,6 +387,22 @@ static void netapp_ontapdevices_print_json(struct ontapdevice_info *devices, json_devices = json_create_array(); for (i = 0; i < count; i++) { + if (devname && !strcmp(devname, basename(devices[i].dev))) { + /* found the device, fetch info for that alone */ + netapp_get_ns_size(size, &lba, &devices[i].ns); + nvme_uuid_to_string(devices[i].uuid, uuid_str); + netapp_get_ontap_labels(vsname, nspath, devices[i].log_data); + + netapp_ontapdevice_json(json_devices, devices[i].dev, + vsname, nspath, devices[i].nsid, + uuid_str, size, lba, + le64_to_cpu(devices[i].ns.nsze)); + goto out; + } + } + + for (i = 0; i < count; i++) { + /* fetch info for all devices */ netapp_get_ns_size(size, &lba, &devices[i].ns); nvme_uuid_to_string(devices[i].uuid, uuid_str); netapp_get_ontap_labels(vsname, nspath, devices[i].log_data); @@ -382,6 +413,7 @@ static void netapp_ontapdevices_print_json(struct ontapdevice_info *devices, le64_to_cpu(devices[i].ns.nsze)); } +out: /* complete the json output */ json_object_add_value_array(root, "ONTAPdevices", json_devices); json_print_object(root, NULL); @@ -626,6 +658,7 @@ static int netapp_ontapdevices(int argc, char **argv, struct command *command, int num, i, fd, ret, fmt; struct ontapdevice_info *ontapdevices; char path[264]; + char *devname = NULL; int num_ontapdevices = 0; struct config { @@ -651,6 +684,18 @@ static int netapp_ontapdevices(int argc, char **argv, struct command *command, return -EINVAL; } + if (optind < argc) + devname = basename(argv[optind++]); + + if (devname) { + int subsys_num, nsid; + + if (sscanf(devname, "nvme%dn%d", &subsys_num, &nsid) != 2) { + fprintf(stderr, "Invalid device name %s\n", devname); + return -EINVAL; + } + } + num = scandir(dev_path, &devices, netapp_nvme_filter, alphasort); if (num <= 0) { fprintf(stderr, "No NVMe devices detected.\n"); @@ -682,10 +727,10 @@ static int netapp_ontapdevices(int argc, char **argv, struct command *command, if (num_ontapdevices) { if (fmt == NNORMAL || fmt == NCOLUMN) netapp_ontapdevices_print_regular(ontapdevices, - num_ontapdevices, fmt); + num_ontapdevices, fmt, devname); else if (fmt == NJSON) netapp_ontapdevices_print_json(ontapdevices, - num_ontapdevices); + num_ontapdevices, devname); } for (i = 0; i < num; i++) From 6c7bc6a711e69d8fd8453a9699439f2822e3f9fd Mon Sep 17 00:00:00 2001 From: Martin George Date: Sun, 18 Aug 2024 22:12:58 +0530 Subject: [PATCH 135/281] nvme-print: add subsystype to the list-subsys output The nvme list-subsys and show-topology outputs misses out on the subsystype details. Add the same. Signed-off-by: Martin George --- nvme-print-json.c | 2 ++ nvme-print-stdout.c | 2 ++ 2 files changed, 4 insertions(+) diff --git a/nvme-print-json.c b/nvme-print-json.c index af90eba04f..9101c48305 100644 --- a/nvme-print-json.c +++ b/nvme-print-json.c @@ -2466,6 +2466,7 @@ static void json_print_nvme_subsystem_list(nvme_root_t r, bool show_ana) obj_add_str(subsystem_attrs, "Name", nvme_subsystem_get_name(s)); obj_add_str(subsystem_attrs, "NQN", nvme_subsystem_get_nqn(s)); obj_add_str(subsystem_attrs, "IOPolicy", nvme_subsystem_get_iopolicy(s)); + obj_add_str(subsystem_attrs, "Type", nvme_subsystem_get_type(s)); array_add_obj(subsystems, subsystem_attrs); paths = json_create_array(); @@ -4360,6 +4361,7 @@ static void json_simple_topology(nvme_root_t r) obj_add_str(subsystem_attrs, "Name", nvme_subsystem_get_name(s)); obj_add_str(subsystem_attrs, "NQN", nvme_subsystem_get_nqn(s)); obj_add_str(subsystem_attrs, "IOPolicy", nvme_subsystem_get_iopolicy(s)); + obj_add_str(subsystem_attrs, "Type", nvme_subsystem_get_type(s)); array_add_obj(subsystems, subsystem_attrs); namespaces = json_create_array(); diff --git a/nvme-print-stdout.c b/nvme-print-stdout.c index e23739a394..784792e12d 100644 --- a/nvme-print-stdout.c +++ b/nvme-print-stdout.c @@ -1073,6 +1073,8 @@ static void stdout_subsys_config(nvme_subsystem_t s) nvme_host_get_hostnqn(nvme_subsystem_get_host(s))); printf("%*s iopolicy=%s\n", len, " ", nvme_subsystem_get_iopolicy(s)); + printf("%*s type=%s\n", len, " ", + nvme_subsystem_get_type(s)); } static void stdout_subsystem(nvme_root_t r, bool show_ana) From e6d61b8dce37cb932264a1bd687dd89653eaf57c Mon Sep 17 00:00:00 2001 From: Martin George Date: Sun, 18 Aug 2024 22:24:18 +0530 Subject: [PATCH 136/281] nvme-print: update subsys verbose outputs The current list-subsys & show-topology simple outputs are a little crowded. Also the respective verbose options to both these commands are a no-op at the moment. So move the iopolicy and subsystype details to the respective verbose outputs instead so that the simple outputs are restricted to displaying key subsys details like subsys name & NQN alone. Signed-off-by: Martin George --- nvme-print-json.c | 18 ++++++++++++++---- nvme-print-stdout.c | 11 +++++++---- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/nvme-print-json.c b/nvme-print-json.c index 9101c48305..a05015ff52 100644 --- a/nvme-print-json.c +++ b/nvme-print-json.c @@ -2465,8 +2465,13 @@ static void json_print_nvme_subsystem_list(nvme_root_t r, bool show_ana) subsystem_attrs = json_create_object(); obj_add_str(subsystem_attrs, "Name", nvme_subsystem_get_name(s)); obj_add_str(subsystem_attrs, "NQN", nvme_subsystem_get_nqn(s)); - obj_add_str(subsystem_attrs, "IOPolicy", nvme_subsystem_get_iopolicy(s)); - obj_add_str(subsystem_attrs, "Type", nvme_subsystem_get_type(s)); + + if (json_print_ops.flags & VERBOSE) { + obj_add_str(subsystem_attrs, "IOPolicy", + nvme_subsystem_get_iopolicy(s)); + obj_add_str(subsystem_attrs, "Type", + nvme_subsystem_get_type(s)); + } array_add_obj(subsystems, subsystem_attrs); paths = json_create_array(); @@ -4360,8 +4365,13 @@ static void json_simple_topology(nvme_root_t r) subsystem_attrs = json_create_object(); obj_add_str(subsystem_attrs, "Name", nvme_subsystem_get_name(s)); obj_add_str(subsystem_attrs, "NQN", nvme_subsystem_get_nqn(s)); - obj_add_str(subsystem_attrs, "IOPolicy", nvme_subsystem_get_iopolicy(s)); - obj_add_str(subsystem_attrs, "Type", nvme_subsystem_get_type(s)); + + if (json_print_ops.flags & VERBOSE) { + obj_add_str(subsystem_attrs, "IOPolicy", + nvme_subsystem_get_iopolicy(s)); + obj_add_str(subsystem_attrs, "Type", + nvme_subsystem_get_type(s)); + } array_add_obj(subsystems, subsystem_attrs); namespaces = json_create_array(); diff --git a/nvme-print-stdout.c b/nvme-print-stdout.c index 784792e12d..fc0cd4e634 100644 --- a/nvme-print-stdout.c +++ b/nvme-print-stdout.c @@ -1071,10 +1071,13 @@ static void stdout_subsys_config(nvme_subsystem_t s) nvme_subsystem_get_nqn(s)); printf("%*s hostnqn=%s\n", len, " ", nvme_host_get_hostnqn(nvme_subsystem_get_host(s))); - printf("%*s iopolicy=%s\n", len, " ", - nvme_subsystem_get_iopolicy(s)); - printf("%*s type=%s\n", len, " ", - nvme_subsystem_get_type(s)); + + if (stdout_print_ops.flags & VERBOSE) { + printf("%*s iopolicy=%s\n", len, " ", + nvme_subsystem_get_iopolicy(s)); + printf("%*s type=%s\n", len, " ", + nvme_subsystem_get_type(s)); + } } static void stdout_subsystem(nvme_root_t r, bool show_ana) From 7cdd12ea6c325924e692b1644433783245f738e6 Mon Sep 17 00:00:00 2001 From: Tokunori Ikegami Date: Mon, 19 Aug 2024 21:13:49 +0900 Subject: [PATCH 137/281] nvme-print-stdout: use NVME_FEAT util definitions Some NVME_FEAT definitions needed to add for FDP, etc. Signed-off-by: Tokunori Ikegami --- nvme-print-stdout.c | 127 ++++++++++++++++++++++++-------------------- nvme-print.c | 2 +- 2 files changed, 71 insertions(+), 58 deletions(-) diff --git a/nvme-print-stdout.c b/nvme-print-stdout.c index fc0cd4e634..69be09ea0c 100644 --- a/nvme-print-stdout.c +++ b/nvme-print-stdout.c @@ -4410,8 +4410,10 @@ static void stdout_directive_show(__u8 type, __u8 oper, __u16 spec, __u32 nsid, static void stdout_lba_status_info(__u32 result) { - printf("\tLBA Status Information Poll Interval (LSIPI) : %u\n", (result >> 16) & 0xffff); - printf("\tLBA Status Information Report Interval (LSIRI): %u\n", result & 0xffff); + printf("\tLBA Status Information Poll Interval (LSIPI) : %u\n", + NVME_FEAT_LBAS_LSIPI(result)); + printf("\tLBA Status Information Report Interval (LSIRI): %u\n", + NVME_FEAT_LBAS_LSIRI(result)); } void stdout_d(unsigned char *buf, int len, int width, int group) @@ -4497,22 +4499,23 @@ static void stdout_feature_show_fields(enum nvme_features_id fid, switch (fid) { case NVME_FEAT_FID_ARBITRATION: - printf("\tHigh Priority Weight (HPW): %u\n", ((result & 0xff000000) >> 24) + 1); - printf("\tMedium Priority Weight (MPW): %u\n", ((result & 0x00ff0000) >> 16) + 1); - printf("\tLow Priority Weight (LPW): %u\n", ((result & 0x0000ff00) >> 8) + 1); + printf("\tHigh Priority Weight (HPW): %u\n", NVME_FEAT_ARB_HPW(result) + 1); + printf("\tMedium Priority Weight (MPW): %u\n", NVME_FEAT_ARB_MPW(result) + 1); + printf("\tLow Priority Weight (LPW): %u\n", NVME_FEAT_ARB_LPW(result) + 1); printf("\tArbitration Burst (AB): "); - if ((result & 0x00000007) == 7) + if (NVME_FEAT_ARB_BURST(result) == NVME_FEAT_ARBITRATION_BURST_MASK) printf("No limit\n"); else - printf("%u\n", 1 << (result & 0x00000007)); + printf("%u\n", 1 << NVME_FEAT_ARB_BURST(result)); break; case NVME_FEAT_FID_POWER_MGMT: - field = (result & 0x000000E0) >> 5; - printf("\tWorkload Hint (WH): %u - %s\n", field, nvme_feature_wl_hints_to_string(field)); - printf("\tPower State (PS): %u\n", result & 0x0000001f); + field = NVME_FEAT_PM_WH(result); + printf("\tWorkload Hint (WH): %u - %s\n", field, + nvme_feature_wl_hints_to_string(field)); + printf("\tPower State (PS): %u\n", NVME_FEAT_PM_PS(result)); break; case NVME_FEAT_FID_LBA_RANGE: - field = result & 0x0000003f; + field = NVME_FEAT_LBAR_NR(result); printf("\tNumber of LBA Ranges (NUM): %u\n", field + 1); if (buf) stdout_lba_range((struct nvme_lba_range_type *)buf, field); @@ -4520,72 +4523,78 @@ static void stdout_feature_show_fields(enum nvme_features_id fid, case NVME_FEAT_FID_TEMP_THRESH: field = (result & 0x1c00000) >> 22; printf("\tTemperature Threshold Hysteresis(TMPTHH): %s (%u K)\n", - nvme_degrees_string(field), field); - field = (result & 0x00300000) >> 20; - printf("\tThreshold Type Select (THSEL): %u - %s\n", field, - nvme_feature_temp_type_to_string(field)); - field = (result & 0x000f0000) >> 16; - printf("\tThreshold Temperature Select (TMPSEL): %u - %s\n", + nvme_degrees_string(field), field); + field = NVME_FEAT_TT_THSEL(result); + printf("\tThreshold Type Select (THSEL): %u - %s\n", field, + nvme_feature_temp_type_to_string(field)); + field = NVME_FEAT_TT_TMPSEL(result); + printf("\tThreshold Temperature Select (TMPSEL): %u - %s\n", field, nvme_feature_temp_sel_to_string(field)); - printf("\tTemperature Threshold (TMPTH): %s (%u K)\n", - nvme_degrees_string(result & 0x0000ffff), result & 0x0000ffff); + printf("\tTemperature Threshold (TMPTH): %s (%u K)\n", + nvme_degrees_string(NVME_FEAT_TT_TMPTH(result)), NVME_FEAT_TT_TMPTH(result)); break; case NVME_FEAT_FID_ERR_RECOVERY: printf("\tDeallocated or Unwritten Logical Block Error Enable (DULBE): %s\n", - ((result & 0x00010000) >> 16) ? "Enabled" : "Disabled"); + NVME_FEAT_ER_DULBE(result) ? "Enabled" : "Disabled"); printf("\tTime Limited Error Recovery (TLER): %u ms\n", - (result & 0x0000ffff) * 100); + NVME_FEAT_ER_TLER(result) * 100); break; case NVME_FEAT_FID_VOLATILE_WC: - printf("\tVolatile Write Cache Enable (WCE): %s\n", (result & 0x00000001) ? "Enabled" : "Disabled"); + printf("\tVolatile Write Cache Enable (WCE): %s\n", + NVME_FEAT_VWC_WCE(result) ? "Enabled" : "Disabled"); break; case NVME_FEAT_FID_NUM_QUEUES: - printf("\tNumber of IO Completion Queues Allocated (NCQA): %u\n", ((result & 0xffff0000) >> 16) + 1); - printf("\tNumber of IO Submission Queues Allocated (NSQA): %u\n", (result & 0x0000ffff) + 1); + printf("\tNumber of IO Completion Queues Allocated (NCQA): %u\n", + NVME_FEAT_NRQS_NCQR(result) + 1); + printf("\tNumber of IO Submission Queues Allocated (NSQA): %u\n", + NVME_FEAT_NRQS_NSQR(result) + 1); break; case NVME_FEAT_FID_IRQ_COALESCE: - printf("\tAggregation Time (TIME): %u usec\n", ((result & 0x0000ff00) >> 8) * 100); - printf("\tAggregation Threshold (THR): %u\n", (result & 0x000000ff) + 1); + printf("\tAggregation Time (TIME): %u usec\n", + NVME_FEAT_IRQC_TIME(result) * 100); + printf("\tAggregation Threshold (THR): %u\n", NVME_FEAT_IRQC_THR(result) + 1); break; case NVME_FEAT_FID_IRQ_CONFIG: - printf("\tCoalescing Disable (CD): %s\n", ((result & 0x00010000) >> 16) ? "True" : "False"); - printf("\tInterrupt Vector (IV): %u\n", result & 0x0000ffff); + printf("\tCoalescing Disable (CD): %s\n", + NVME_FEAT_ICFG_CD(result) ? "True" : "False"); + printf("\tInterrupt Vector (IV): %u\n", NVME_FEAT_ICFG_IV(result)); break; case NVME_FEAT_FID_WRITE_ATOMIC: - printf("\tDisable Normal (DN): %s\n", (result & 0x00000001) ? "True" : "False"); + printf("\tDisable Normal (DN): %s\n", NVME_FEAT_WA_DN(result) ? "True" : "False"); break; case NVME_FEAT_FID_ASYNC_EVENT: printf("\tDiscovery Log Page Change Notices : %s\n", ((result & 0x80000000) >> 31) ? "Send async event" : "Do not send async event"); printf("\tEndurance Group Event Aggregate Log Change Notices : %s\n", - ((result & 0x00004000) >> 14) ? "Send async event" : "Do not send async event"); + NVME_FEAT_AE_EGA(result) ? "Send async event" : "Do not send async event"); printf("\tLBA Status Information Notices : %s\n", - ((result & 0x00002000) >> 13) ? "Send async event" : "Do not send async event"); + NVME_FEAT_AE_LBAS(result) ? "Send async event" : "Do not send async event"); printf("\tPredictable Latency Event Aggregate Log Change Notices : %s\n", - ((result & 0x00001000) >> 12) ? "Send async event" : "Do not send async event"); + NVME_FEAT_AE_PLA(result) ? "Send async event" : "Do not send async event"); printf("\tAsymmetric Namespace Access Change Notices : %s\n", - ((result & 0x00000800) >> 11) ? "Send async event" : "Do not send async event"); + NVME_FEAT_AE_ANA(result) ? "Send async event" : "Do not send async event"); printf("\tTelemetry Log Notices : %s\n", - ((result & 0x00000400) >> 10) ? "Send async event" : "Do not send async event"); + NVME_FEAT_AE_TELEM(result) ? "Send async event" : "Do not send async event"); printf("\tFirmware Activation Notices : %s\n", - ((result & 0x00000200) >> 9) ? "Send async event" : "Do not send async event"); + NVME_FEAT_AE_FW(result) ? "Send async event" : "Do not send async event"); printf("\tNamespace Attribute Notices : %s\n", - ((result & 0x00000100) >> 8) ? "Send async event" : "Do not send async event"); + NVME_FEAT_AE_NAN(result) ? "Send async event" : "Do not send async event"); printf("\tSMART / Health Critical Warnings : %s\n", - (result & 0x000000ff) ? "Send async event" : "Do not send async event"); + NVME_FEAT_AE_SMART(result) ? "Send async event" : "Do not send async event"); break; case NVME_FEAT_FID_AUTO_PST: printf("\tAutonomous Power State Transition Enable (APSTE): %s\n", - (result & 0x00000001) ? "Enabled" : "Disabled"); + NVME_FEAT_APST_APSTE(result) ? "Enabled" : "Disabled"); if (buf) stdout_auto_pst((struct nvme_feat_auto_pst *)buf); break; case NVME_FEAT_FID_HOST_MEM_BUF: - printf("\tEnable Host Memory (EHM): %s\n", (result & 0x00000001) ? "Enabled" : "Disabled"); + printf("\tEnable Host Memory (EHM): %s\n", + NVME_FEAT_HMEM_EHM(result) ? "Enabled" : "Disabled"); printf("\tHost Memory Non-operational Access Restriction Enable (HMNARE): %s\n", - (result & 0x00000004) ? "True" : "False"); + (result & 0x00000004) ? "True" : "False"); printf("\tHost Memory Non-operational Access Restricted (HMNAR): %s\n", - (result & 0x00000008) ? "True" : "False"); + (result & 0x00000008) ? "True" : "False"); if (buf) stdout_host_mem_buffer((struct nvme_host_mem_buf_attrs *)buf); break; @@ -4598,19 +4607,22 @@ static void stdout_feature_show_fields(enum nvme_features_id fid, break; case NVME_FEAT_FID_HCTM: printf("\tThermal Management Temperature 1 (TMT1) : %u K (%s)\n", - result >> 16, nvme_degrees_string(result >> 16)); + NVME_FEAT_HCTM_TMT1(result), + nvme_degrees_string(NVME_FEAT_HCTM_TMT1(result))); printf("\tThermal Management Temperature 2 (TMT2) : %u K (%s)\n", - result & 0x0000ffff, nvme_degrees_string(result & 0x0000ffff)); + NVME_FEAT_HCTM_TMT2(result), + nvme_degrees_string(NVME_FEAT_HCTM_TMT2(result))); break; case NVME_FEAT_FID_NOPSC: printf("\tNon-Operational Power State Permissive Mode Enable (NOPPME): %s\n", - (result & 1) ? "True" : "False"); + NVME_FEAT_NOPS_NOPPME(result) ? "True" : "False"); break; case NVME_FEAT_FID_RRL: - printf("\tRead Recovery Level (RRL): %u\n", result & 0xf); + printf("\tRead Recovery Level (RRL): %u\n", NVME_FEAT_RRL_RRL(result)); break; case NVME_FEAT_FID_PLM_CONFIG: - printf("\tPredictable Latency Window Enabled: %s\n", result & 0x1 ? "True" : "False"); + printf("\tPredictable Latency Window Enabled: %s\n", + NVME_FEAT_PLM_PLME(result) ? "True" : "False"); if (buf) stdout_plm_config((struct nvme_plm_config *)buf); break; @@ -4637,11 +4649,11 @@ static void stdout_feature_show_fields(enum nvme_features_id fid, } break; case NVME_FEAT_FID_SANITIZE: - printf("\tNo-Deallocate Response Mode (NODRM) : %u\n", result & 0x1); + printf("\tNo-Deallocate Response Mode (NODRM) : %u\n", NVME_FEAT_SC_NODRM(result)); break; case NVME_FEAT_FID_ENDURANCE_EVT_CFG: - printf("\tEndurance Group Identifier (ENDGID): %u\n", result & 0xffff); - printf("\tEndurance Group Critical Warnings : %u\n", (result >> 16) & 0xff); + printf("\tEndurance Group Identifier (ENDGID): %u\n", NVME_FEAT_EG_ENDGID(result)); + printf("\tEndurance Group Critical Warnings : %u\n", NVME_FEAT_EG_EGCW(result)); break; case NVME_FEAT_FID_IOCS_PROFILE: printf("\tI/O Command Set Profile: %s\n", result & 0x1 ? "True" : "False"); @@ -4656,7 +4668,7 @@ static void stdout_feature_show_fields(enum nvme_features_id fid, stdout_host_metadata(fid, (struct nvme_host_metadata *)buf); break; case NVME_FEAT_FID_SW_PROGRESS: - printf("\tPre-boot Software Load Count (PBSLC): %u\n", result & 0x000000ff); + printf("\tPre-boot Software Load Count (PBSLC): %u\n", NVME_FEAT_SPM_PBSLC(result)); break; case NVME_FEAT_FID_HOST_ID: if (buf) { @@ -4668,23 +4680,24 @@ static void stdout_feature_show_fields(enum nvme_features_id fid, break; case NVME_FEAT_FID_RESV_MASK: printf("\tMask Reservation Preempted Notification (RESPRE): %s\n", - ((result & 0x00000008) >> 3) ? "True" : "False"); + NVME_FEAT_RM_RESPRE(result) ? "True" : "False"); printf("\tMask Reservation Released Notification (RESREL): %s\n", - ((result & 0x00000004) >> 2) ? "True" : "False"); + NVME_FEAT_RM_RESREL(result) ? "True" : "False"); printf("\tMask Registration Preempted Notification (REGPRE): %s\n", - ((result & 0x00000002) >> 1) ? "True" : "False"); + NVME_FEAT_RM_REGPRE(result) ? "True" : "False"); break; case NVME_FEAT_FID_RESV_PERSIST: - printf("\tPersist Through Power Loss (PTPL): %s\n", (result & 0x00000001) ? "True" : "False"); + printf("\tPersist Through Power Loss (PTPL): %s\n", + NVME_FEAT_RP_PTPL(result) ? "True" : "False"); break; case NVME_FEAT_FID_WRITE_PROTECT: printf("\tNamespace Write Protect: %s\n", nvme_ns_wp_cfg_to_string(result)); break; case NVME_FEAT_FID_FDP: printf("\tFlexible Direct Placement Enable (FDPE) : %s\n", - (result & 0x1) ? "Yes" : "No"); + (result & 0x1) ? "Yes" : "No"); printf("\tFlexible Direct Placement Configuration Index : %u\n", - (result >> 8) & 0xf); + (result >> 8) & 0xf); break; case NVME_FEAT_FID_FDP_EVENTS: for (unsigned int i = 0; i < result; i++) { @@ -4693,7 +4706,7 @@ static void stdout_feature_show_fields(enum nvme_features_id fid, d = &((struct nvme_fdp_supported_event_desc *)buf)[i]; printf("\t%-53s: %sEnabled\n", nvme_fdp_event_to_string(d->evt), - d->evta & 0x1 ? "" : "Not "); + d->evta & 0x1 ? "" : "Not "); } break; default: diff --git a/nvme-print.c b/nvme-print.c index ab8d922160..2ce4566bdc 100644 --- a/nvme-print.c +++ b/nvme-print.c @@ -1057,7 +1057,7 @@ void nvme_directive_show(__u8 type, __u8 oper, __u16 spec, __u32 nsid, __u32 res const char *nvme_plm_window_to_string(__u32 plm) { - switch (plm & 0x7) { + switch (NVME_FEAT_PLMW_WS(plm)) { case 1: return "Deterministic Window (DTWIN)"; case 2: From ecb51edc112de4370e1e131ec305675bef39ee56 Mon Sep 17 00:00:00 2001 From: Carl Moran Date: Thu, 15 Aug 2024 17:49:46 -0700 Subject: [PATCH 138/281] plugins/wdc: fix json output for vs-nand-stats Running nvme wdc vs-nand-stats will change the values of the user data fields depending on output format used. In regular stdout, the ordering is TLC min, TLC Max, SLC Min, SLC Max. However in json, the values get reassigned, what was SLC Min in stdout will become TLC > Regular format (TLC Min, TLC Max, SLC Min, SLC Max) [root@ /tmp/]# nvme wdc vs-nand-stats /dev/nvme0n1 | grep User\ Data User Data Erase Counts - TLC Min 169 User Data Erase Counts - TLC Max 310 User Data Erase Counts - SLC Min 10719 User Data Erase Counts - SLC Max 11676 Json format (SLC Min, SLC Max, TLC Min, TLC Max) [root@ /tmp/]# nvme wdc vs-nand-stats /dev/nvme0n1 -o json | grep User\ Data "User Data Erase Counts - SLC Min" : 169, "User Data Erase Counts - SLC Max" : 310, "User Data Erase Counts - TLC Min" : 10719, "User Data Erase Counts - TLC Max" : 11676, The difference can be traced to how the array subscripts are being used in the two output formats stdout : https://t.ly/sRIDz tlc_min == 0 tlc_max == 1 slc_min == 2 slc_max == 3 json : https://t.ly/pmU-m slc_min = 0 slc_max = 1 tlc_min = 2 tlc_max = 3 With the patch, we rename the fields to be the same for both stdout & json. Output comparison below Regular format (TLC Min, TLC Max, SLC Min, SLC Max) [root@ /tmp/]# ./nvme wdc vs-nand-stats /dev/nvme0n1 | grep User\ Data User Data Erase Counts - TLC Min 169 User Data Erase Counts - TLC Max 310 User Data Erase Counts - SLC Min 10719 User Data Erase Counts - SLC Max 11676 Json format (TLC Min, TLC Max, SLC Min, SLC Max) [root@ /tmp/]# ./nvme wdc vs-nand-stats /dev/nvme0n1 -o json | grep User\ Data "User Data Erase Counts - TLC Min":169, "User Data Erase Counts - TLC Max":310, "User Data Erase Counts - SLC Min":10719, "User Data Erase Counts - SLC Max":11676, Signed-off-by: Carl Moran --- plugins/wdc/wdc-nvme.c | 8 ++++---- plugins/wdc/wdc-nvme.h | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/plugins/wdc/wdc-nvme.c b/plugins/wdc/wdc-nvme.c index d3b6ecbaa6..1bc9ecd1e0 100644 --- a/plugins/wdc/wdc-nvme.c +++ b/plugins/wdc/wdc-nvme.c @@ -10835,13 +10835,13 @@ static void wdc_print_nand_stats_json(__u16 version, void *data) le32_to_cpu(nand_stats_v3->ssd_correction_counts[12])); json_object_add_value_uint(root, "System data % life-used", nand_stats_v3->percent_life_used); - json_object_add_value_uint64(root, "User Data Erase Counts - SLC Min", + json_object_add_value_uint64(root, "User Data Erase Counts - TLC Min", le64_to_cpu(nand_stats_v3->user_data_erase_counts[0])); - json_object_add_value_uint64(root, "User Data Erase Counts - SLC Max", + json_object_add_value_uint64(root, "User Data Erase Counts - TLC Max", le64_to_cpu(nand_stats_v3->user_data_erase_counts[1])); - json_object_add_value_uint64(root, "User Data Erase Counts - TLC Min", + json_object_add_value_uint64(root, "User Data Erase Counts - SLC Min", le64_to_cpu(nand_stats_v3->user_data_erase_counts[2])); - json_object_add_value_uint64(root, "User Data Erase Counts - TLC Max", + json_object_add_value_uint64(root, "User Data Erase Counts - SLC Max", le64_to_cpu(nand_stats_v3->user_data_erase_counts[3])); temp_ptr = (__u64 *)nand_stats_v3->program_fail_count; temp_norm = (__u16)(*temp_ptr & 0x000000000000FFFF); diff --git a/plugins/wdc/wdc-nvme.h b/plugins/wdc/wdc-nvme.h index 4ab5672039..b88e79b9ac 100644 --- a/plugins/wdc/wdc-nvme.h +++ b/plugins/wdc/wdc-nvme.h @@ -5,7 +5,7 @@ #if !defined(WDC_NVME) || defined(CMD_HEADER_MULTI_READ) #define WDC_NVME -#define WDC_PLUGIN_VERSION "2.9.2" +#define WDC_PLUGIN_VERSION "2.9.3" #include "cmd.h" PLUGIN(NAME("wdc", "Western Digital vendor specific extensions", WDC_PLUGIN_VERSION), From 14d09354cddd5c217d7293f414924b0b8b89bcc5 Mon Sep 17 00:00:00 2001 From: Minsik Jeon Date: Wed, 21 Aug 2024 19:22:01 +0900 Subject: [PATCH 139/281] plugins/fdp: bugfix error check to validate output format The return value of validate_output_format functions is whether the functions fails. So I fix to check the err variable. Signed-off-by: Minsik Jeon --- plugins/fdp/fdp.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/plugins/fdp/fdp.c b/plugins/fdp/fdp.c index 1efdd76d25..cac0b2bd72 100644 --- a/plugins/fdp/fdp.c +++ b/plugins/fdp/fdp.c @@ -57,7 +57,7 @@ static int fdp_configs(int argc, char **argv, struct command *cmd, return err; err = validate_output_format(cfg.output_format, &flags); - if (flags < 0) + if (err < 0) goto out; if (cfg.raw_binary) @@ -138,7 +138,7 @@ static int fdp_usage(int argc, char **argv, struct command *cmd, struct plugin * return err; err = validate_output_format(cfg.output_format, &flags); - if (flags < 0) + if (err < 0) goto out; if (cfg.raw_binary) @@ -209,7 +209,7 @@ static int fdp_stats(int argc, char **argv, struct command *cmd, struct plugin * return err; err = validate_output_format(cfg.output_format, &flags); - if (flags < 0) + if (err < 0) goto out; if (cfg.raw_binary) @@ -270,7 +270,7 @@ static int fdp_events(int argc, char **argv, struct command *cmd, struct plugin return err; err = validate_output_format(cfg.output_format, &flags); - if (flags < 0) + if (err < 0) goto out; if (cfg.raw_binary) @@ -329,7 +329,7 @@ static int fdp_status(int argc, char **argv, struct command *cmd, struct plugin return err; err = validate_output_format(cfg.output_format, &flags); - if (flags < 0) + if (err < 0) goto out; if (cfg.raw_binary) From 4e41b60a8334e790feef7c764dec581875c8b50b Mon Sep 17 00:00:00 2001 From: Ankit Soni Date: Fri, 23 Aug 2024 16:06:33 +0530 Subject: [PATCH 140/281] build: update libnvme wrap 5585f06 - types: added new fields in nvme_nvme_id_ns Signed-off-by: Ankit Soni --- subprojects/libnvme.wrap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subprojects/libnvme.wrap b/subprojects/libnvme.wrap index b7688869ca..0d93535cd0 100644 --- a/subprojects/libnvme.wrap +++ b/subprojects/libnvme.wrap @@ -1,6 +1,6 @@ [wrap-git] url = https://github.com/linux-nvme/libnvme.git -revision = df12de68816f341b36e24f46822c4f727ed3e636 +revision = 5585f06a4f849a1b43b1a04f387d2f9b5829744f [provide] libnvme = libnvme_dep From 25b3a6b9b118d2ab860fcc39de898729caf82bfd Mon Sep 17 00:00:00 2001 From: Ankit Soni Date: Fri, 23 Aug 2024 16:13:46 +0530 Subject: [PATCH 141/281] nvme-print: added new fields for nvm_id_ns Added new fields from I/O Command Set Specific Identify Namespace Data Structure CNS5 as per NVM Command Set Specification(Rev 1.1). Signed-off-by: Ankit Soni Reviewed-by: Steven Seungcheol Lee --- nvme-print-json.c | 6 ++++++ nvme-print-stdout.c | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/nvme-print-json.c b/nvme-print-json.c index a05015ff52..38de97be0f 100644 --- a/nvme-print-json.c +++ b/nvme-print-json.c @@ -3081,6 +3081,12 @@ static void json_nvme_nvm_id_ns(struct nvme_nvm_id_ns *nvm_ns, } if (ns->nsfeat & 0x20) obj_add_int(r, "npdgl", le32_to_cpu(nvm_ns->npdgl)); + + obj_add_uint(r, "nprg", le32_to_cpu(nvm_ns->nprg)); + obj_add_uint(r, "npra", le32_to_cpu(nvm_ns->npra)); + obj_add_uint(r, "nors", le32_to_cpu(nvm_ns->nors)); + obj_add_uint(r, "npdal", le32_to_cpu(nvm_ns->npdal)); + obj_add_uint(r, "lbapss", le32_to_cpu(nvm_ns->lbapss)); obj_add_uint(r, "tlbaag", le32_to_cpu(nvm_ns->tlbaag)); json_print(r); diff --git a/nvme-print-stdout.c b/nvme-print-stdout.c index 69be09ea0c..15b6902ef9 100644 --- a/nvme-print-stdout.c +++ b/nvme-print-stdout.c @@ -3199,6 +3199,12 @@ static void stdout_nvm_id_ns(struct nvme_nvm_id_ns *nvm_ns, unsigned int nsid, } if (ns->nsfeat & 0x20) printf("npdgl : %#x\n", le32_to_cpu(nvm_ns->npdgl)); + + printf("nprg : %#x\n", le32_to_cpu(nvm_ns->nprg)); + printf("npra : %#x\n", le32_to_cpu(nvm_ns->npra)); + printf("nors : %#x\n", le32_to_cpu(nvm_ns->nors)); + printf("npdal : %#x\n", le32_to_cpu(nvm_ns->npdal)); + printf("lbapss: %#x\n", le32_to_cpu(nvm_ns->lbapss)); printf("tlbaag: %#x\n", le32_to_cpu(nvm_ns->tlbaag)); } From 97a8584897ad632a99cd7f5bb8411bee165b3feb Mon Sep 17 00:00:00 2001 From: Haro Panosyan Date: Wed, 21 Aug 2024 16:38:03 -0700 Subject: [PATCH 142/281] plugins/solidigm : Fixing vs-internal-log to generate identify per allocated namespace. CNS 11h is for namespace data structures for allocated namespaces. Earlier code was using attached namespaces. This fix is to generate identify data structures per allocated namespace. Signed-off-by: Haro Panosyan --- plugins/solidigm/solidigm-internal-logs.c | 27 ++++++++++++++++++----- 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/plugins/solidigm/solidigm-internal-logs.c b/plugins/solidigm/solidigm-internal-logs.c index f5b57f321a..0c99406304 100644 --- a/plugins/solidigm/solidigm-internal-logs.c +++ b/plugins/solidigm/solidigm-internal-logs.c @@ -4,6 +4,7 @@ * * Authors: leonardo.da.cunha@solidigm.com * shankaralingegowda.singonahalli@solidigm.com + * haro.panosyan@solidigm.com */ #include @@ -597,14 +598,17 @@ static int ilog_dump_telemetry(struct ilog *ilog, enum log_type ttype) static int ilog_dump_identify_pages(struct ilog *ilog) { - struct nvme_ns_list ns_list; + struct nvme_ns_list ns_attached_list; + struct nvme_ns_list ns_allocated_list; __u32 j = 0; + struct log identify_base_list[] = { {NVME_IDENTIFY_CNS_NS_ACTIVE_LIST, "Id Active Namespace ID list", - sizeof(ns_list), (__u8 *) &ns_list}, + sizeof(ns_attached_list), (__u8 *) &ns_attached_list}, {NVME_IDENTIFY_CNS_NVMSET_LIST, "Id NVM Set List"}, {NVME_IDENTIFY_CNS_CSI_CTRL, "Id I/O Command Set specific"}, - {NVME_IDENTIFY_CNS_ALLOCATED_NS_LIST, "Id Allocated Namespace ID list"}, + {NVME_IDENTIFY_CNS_ALLOCATED_NS_LIST, "Id Allocated Namespace ID list", + sizeof(ns_allocated_list), (__u8 *) &ns_allocated_list}, {NVME_IDENTIFY_CNS_CTRL_LIST, "Id Controller List"} }; struct log identify_ns_required_list[] = { @@ -613,10 +617,12 @@ static int ilog_dump_identify_pages(struct ilog *ilog) {NVME_IDENTIFY_CNS_CSI_NS, "Id Namespace ID I/O Command Set specific"}, {NVME_IDENTIFY_CNS_CSI_INDEPENDENT_ID_NS, "I/O Command Set Independent Identify Namespace Data"}, - {NVME_IDENTIFY_CNS_ALLOCATED_NS, "Id Namespace data "}, {NVME_IDENTIFY_CNS_NS_CTRL_LIST, "Id Namespace Id Controller List"}, }; + struct log allocated = {NVME_IDENTIFY_CNS_ALLOCATED_NS, "Allocated Namespace Data", + NVME_IDENTIFY_DATA_SIZE, NULL}; + ilog_ensure_dump_id_ctrl(ilog); for (int i = 0; i < ARRAY_SIZE(identify_base_list); i++) { @@ -626,10 +632,10 @@ static int ilog_dump_identify_pages(struct ilog *ilog) ilog->count++; } - while (ns_list.ns[j]) { + while (ns_attached_list.ns[j]) { for (int i = 0; i < ARRAY_SIZE(identify_ns_required_list); i++) { int err = ilog_dump_identify_page(ilog, &identify_ns_required_list[i], - ns_list.ns[j]); + ns_attached_list.ns[j]); if (err == 0) ilog->count++; @@ -637,6 +643,15 @@ static int ilog_dump_identify_pages(struct ilog *ilog) j++; } + j = 0; + while (ns_allocated_list.ns[j]) { + int err = ilog_dump_identify_page(ilog, &allocated, ns_allocated_list.ns[j]); + + if (err == 0) + ilog->count++; + j++; + } + return 0; } From 0973f275e509bb23d0e2d5dacf3377ea6bac791a Mon Sep 17 00:00:00 2001 From: Martin George Date: Thu, 29 Aug 2024 11:31:13 +0530 Subject: [PATCH 143/281] nvme-print: sanitize error-log output Minor textual and formatting changes to the error-log output. Signed-off-by: Martin George --- nvme-print-stdout.c | 4 ++-- nvme-print.c | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/nvme-print-stdout.c b/nvme-print-stdout.c index 15b6902ef9..3faf4027c8 100644 --- a/nvme-print-stdout.c +++ b/nvme-print-stdout.c @@ -3662,7 +3662,7 @@ static void stdout_error_log(struct nvme_error_log_page *err_log, int entries, le64_to_cpu(err_log[i].error_count)); printf("sqid : %d\n", err_log[i].sqid); printf("cmdid : %#x\n", err_log[i].cmdid); - printf("status_field : %#x(%s)\n", status, + printf("status_field : %#x (%s)\n", status, nvme_status_to_string(status, false)); printf("phase_tag : %#x\n", le16_to_cpu(err_log[i].status_field & 0x1)); @@ -3672,7 +3672,7 @@ static void stdout_error_log(struct nvme_error_log_page *err_log, int entries, le64_to_cpu(err_log[i].lba)); printf("nsid : %#x\n", err_log[i].nsid); printf("vs : %d\n", err_log[i].vs); - printf("trtype : %s\n", + printf("trtype : %#x (%s)\n", err_log[i].trtype, nvme_trtype_to_string(err_log[i].trtype)); printf("csi : %d\n", err_log[i].csi); printf("opcode : %#x\n", err_log[i].opcode); diff --git a/nvme-print.c b/nvme-print.c index 2ce4566bdc..404b470ef3 100644 --- a/nvme-print.c +++ b/nvme-print.c @@ -678,11 +678,11 @@ const char *nvme_trtype_to_string(__u8 trtype) { switch (trtype) { case 0: return "The transport type is not indicated or the error "\ - "is not transport related."; - case 1: return "RDMA Transport error."; - case 2: return "Fibre Channel Transport error."; - case 3: return "TCP Transport error."; - case 254: return "Intra-host Transport error."; + "is not transport related"; + case 1: return "RDMA Transport error"; + case 2: return "Fibre Channel Transport error"; + case 3: return "TCP Transport error"; + case 254: return "Intra-host Transport error"; default: return "Reserved"; }; } From 0dca717b7e9e3bda528e96a4d73e57d03a70ca86 Mon Sep 17 00:00:00 2001 From: Tokunori Ikegami Date: Sat, 31 Aug 2024 03:49:45 +0900 Subject: [PATCH 144/281] util: extern uint128_t_to_double() function Use the function to calculate with the uint128_t value. Signed-off-by: Tokunori Ikegami --- util/types.c | 2 +- util/types.h | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/util/types.c b/util/types.c index 376c73435e..20c121b1a6 100644 --- a/util/types.c +++ b/util/types.c @@ -48,7 +48,7 @@ uint64_t int48_to_long(__u8 *data) return result; } -static long double uint128_t_to_double(nvme_uint128_t data) +long double uint128_t_to_double(nvme_uint128_t data) { long double result = 0; int i; diff --git a/util/types.h b/util/types.h index 9e0806c2d2..b2e8fc8df5 100644 --- a/util/types.h +++ b/util/types.h @@ -41,6 +41,7 @@ uint64_t int48_to_long(__u8 *data); char *uint128_t_to_string(nvme_uint128_t val); char *uint128_t_to_l10n_string(nvme_uint128_t val); char *uint128_t_to_si_string(nvme_uint128_t val, __u32 bytes_per_unit); +long double uint128_t_to_double(nvme_uint128_t data); const char *util_uuid_to_string(unsigned char uuid[NVME_UUID_LEN]); const char *util_fw_to_string(char *c); From 93a075b1c37499f12e9b9a11fd3d53e561fb1e6c Mon Sep 17 00:00:00 2001 From: Tokunori Ikegami Date: Sat, 31 Aug 2024 15:24:30 +0900 Subject: [PATCH 145/281] logging: add print_info function This is for debugging print. Signed-off-by: Tokunori Ikegami --- util/logging.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/util/logging.h b/util/logging.h index 7b1814cb78..bf02984889 100644 --- a/util/logging.h +++ b/util/logging.h @@ -5,6 +5,12 @@ #include +#define print_info(...) \ + do { \ + if (log_level >= LOG_INFO) \ + printf(__VA_ARGS__); \ + } while (false) + extern int log_level; int map_log_level(int verbose, bool quiet); From 838f21e7f70edd708d8a327edf4c95bbf46c0045 Mon Sep 17 00:00:00 2001 From: Tokunori Ikegami Date: Sat, 31 Aug 2024 14:54:16 +0900 Subject: [PATCH 146/281] nvme-print-stdout: add print_array function To reduce the repeated print code for arrays. Signed-off-by: Tokunori Ikegami --- nvme-print-stdout.c | 13 +++++++++++++ nvme-print.h | 1 + 2 files changed, 14 insertions(+) diff --git a/nvme-print-stdout.c b/nvme-print-stdout.c index 3faf4027c8..27b3beb29f 100644 --- a/nvme-print-stdout.c +++ b/nvme-print-stdout.c @@ -5319,3 +5319,16 @@ struct print_ops *nvme_get_stdout_print_ops(nvme_print_flags_t flags) stdout_print_ops.flags = flags; return &stdout_print_ops; } + +void print_array(char *name, __u8 *data, int size) +{ + int i; + + if (!name || !data || !size) + return; + + printf("%s: 0x", name); + for (i = 0; i < size; i++) + printf("%02X", data[size - i - 1]); + printf("\n"); +} diff --git a/nvme-print.h b/nvme-print.h index a3943ccd98..596980486a 100644 --- a/nvme-print.h +++ b/nvme-print.h @@ -323,4 +323,5 @@ bool nvme_is_fabrics_reg(int offset); bool nvme_registers_cmbloc_support(__u32 cmbsz); bool nvme_registers_pmrctl_ready(__u32 pmrctl); const char *nvme_degrees_string(long t); +void print_array(char *name, __u8 *data, int size); #endif /* NVME_PRINT_H */ From 8802163e2972c6d43f8514a8c9d20229e25950d1 Mon Sep 17 00:00:00 2001 From: Martin George Date: Sun, 1 Sep 2024 17:21:47 +0530 Subject: [PATCH 147/281] nvme: update nvme_insert_tls_key_versioned() return handling Treat nvme_insert_tls_key_versioned() return value of zero as errors too. Signed-off-by: Martin George --- nvme.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nvme.c b/nvme.c index a69ac9cdf5..900b1c0e19 100644 --- a/nvme.c +++ b/nvme.c @@ -9276,7 +9276,7 @@ static int gen_tls_key(int argc, char **argv, struct command *command, struct pl cfg.keytype, cfg.hostnqn, cfg.subsysnqn, cfg.identity, cfg.hmac, raw_secret, key_len); - if (tls_key < 0) { + if (tls_key <= 0) { nvme_show_error("Failed to insert key, error %d", errno); return -errno; } @@ -9369,7 +9369,7 @@ static int check_tls_key(int argc, char **argv, struct command *command, struct cfg.keytype, cfg.hostnqn, cfg.subsysnqn, cfg.identity, hmac, decoded_key, decoded_len); - if (tls_key < 0) { + if (tls_key <= 0) { nvme_show_error("Failed to insert key, error %d", errno); return -errno; } From 835bf029d2d45c5c3cfa72919928da7ceb5875f4 Mon Sep 17 00:00:00 2001 From: Tokunori Ikegami Date: Sun, 1 Sep 2024 22:50:43 +0900 Subject: [PATCH 148/281] ocp: fix to set return value to get c9 log page data The value not set but checked the ret variable after the call. Signed-off-by: Tokunori Ikegami --- plugins/ocp/ocp-nvme.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/plugins/ocp/ocp-nvme.c b/plugins/ocp/ocp-nvme.c index 91f4083b17..d6cac6f5a3 100644 --- a/plugins/ocp/ocp-nvme.c +++ b/plugins/ocp/ocp-nvme.c @@ -3600,8 +3600,7 @@ static int get_c9_log_page(struct nvme_dev *dev, char *format) return ret; } - get_c9_log_page_data(dev, 1, 0); - + ret = get_c9_log_page_data(dev, 1, 0); if (!ret) { switch (fmt) { case NORMAL: From 75ba96aab29d5c5ae69e56daa1ca2aa9d5592d16 Mon Sep 17 00:00:00 2001 From: Tokunori Ikegami Date: Sun, 1 Sep 2024 23:02:58 +0900 Subject: [PATCH 149/281] ocp: fix to return c9 log page data error to open file Use _cleanup_fd_ function so delete close() call and goto statement. Also fix some minor coding style errors around the code. Signed-off-by: Tokunori Ikegami --- plugins/ocp/ocp-nvme.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/plugins/ocp/ocp-nvme.c b/plugins/ocp/ocp-nvme.c index d6cac6f5a3..51c9f67ba4 100644 --- a/plugins/ocp/ocp-nvme.c +++ b/plugins/ocp/ocp-nvme.c @@ -1588,13 +1588,15 @@ static int get_telemetry_log_page_data(struct nvme_dev *dev, int tele_type) static int get_c9_log_page_data(struct nvme_dev *dev, int print_data, int save_bin) { - int ret = 0, fd; + int ret = 0; __le64 stat_id_str_table_ofst = 0; __le64 event_str_table_ofst = 0; __le64 vu_event_str_table_ofst = 0; __le64 ascii_table_ofst = 0; char file_path[PATH_MAX]; + _cleanup_fd_ int fd = STDIN_FILENO; + header_data = (__u8 *)malloc(sizeof(__u8) * C9_TELEMETRY_STR_LOG_LEN); if (!header_data) { fprintf(stderr, "ERROR : OCP : malloc : %s\n", strerror(errno)); @@ -1642,26 +1644,24 @@ static int get_c9_log_page_data(struct nvme_dev *dev, int print_data, int save_b ret = nvme_get_log_simple(dev_fd(dev), C9_TELEMETRY_STRING_LOG_ENABLE_OPCODE, total_log_page_sz, pC9_string_buffer); - } else + } else { fprintf(stderr, "ERROR : OCP : Unable to read C9 data.\n"); + } if (save_bin) { sprintf(file_path, DEFAULT_STRING_BIN); fd = open(file_path, O_WRONLY | O_CREAT | O_TRUNC, 0666); if (fd < 0) { - fprintf(stderr, "Failed to open output file %s: %s!\n", - file_path, strerror(errno)); - goto exit_status; + fprintf(stderr, "Failed to open output file %s: %s!\n", file_path, + strerror(errno)); + return fd; } ret = write(fd, (void *)pC9_string_buffer, total_log_page_sz); if (ret != total_log_page_sz) fprintf(stderr, "Failed to flush all data to file!\n"); - - close(fd); } -exit_status: return 0; } From f0379a8a94fdd24790682bdd1591e17d3e45690a Mon Sep 17 00:00:00 2001 From: Tokunori Ikegami Date: Sun, 1 Sep 2024 23:12:18 +0900 Subject: [PATCH 150/281] ocp: Change C9 function names to use c9 instead This is to unify c9 and C9 function names. Signed-off-by: Tokunori Ikegami --- plugins/ocp/ocp-nvme.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/plugins/ocp/ocp-nvme.c b/plugins/ocp/ocp-nvme.c index 51c9f67ba4..57bb36b217 100644 --- a/plugins/ocp/ocp-nvme.c +++ b/plugins/ocp/ocp-nvme.c @@ -3142,7 +3142,7 @@ static int ocp_telemetry_str_log_format(int argc, char **argv, struct command *c struct plugin *plugin); -static int ocp_print_C9_log_normal(struct telemetry_str_log_format *log_data, __u8 *log_data_buf) +static int ocp_print_c9_log_normal(struct telemetry_str_log_format *log_data, __u8 *log_data_buf) { //calculating the index value for array __le64 stat_id_index = (log_data->sitsz * 4) / 16; @@ -3343,7 +3343,7 @@ static int ocp_print_C9_log_normal(struct telemetry_str_log_format *log_data, __ return 0; } -static int ocp_print_C9_log_json(struct telemetry_str_log_format *log_data, __u8 *log_data_buf) +static int ocp_print_c9_log_json(struct telemetry_str_log_format *log_data, __u8 *log_data_buf) { struct json_object *root = json_create_object(); char res_arr[48]; @@ -3604,10 +3604,10 @@ static int get_c9_log_page(struct nvme_dev *dev, char *format) if (!ret) { switch (fmt) { case NORMAL: - ocp_print_C9_log_normal(log_data, pC9_string_buffer); + ocp_print_c9_log_normal(log_data, pC9_string_buffer); break; case JSON: - ocp_print_C9_log_json(log_data, pC9_string_buffer); + ocp_print_c9_log_json(log_data, pC9_string_buffer); break; case BINARY: ocp_print_c9_log_binary(pC9_string_buffer, total_log_page_sz); From e152e9715d4a289a9a5b4cda96ed875b7d997f6e Mon Sep 17 00:00:00 2001 From: Tokunori Ikegami Date: Sun, 1 Sep 2024 23:16:13 +0900 Subject: [PATCH 151/281] ocp: fix ocp-nvme.c coding style errors Only fixed some errors found by the file changes. Signed-off-by: Tokunori Ikegami --- plugins/ocp/ocp-nvme.c | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/plugins/ocp/ocp-nvme.c b/plugins/ocp/ocp-nvme.c index 57bb36b217..ef4e784e10 100644 --- a/plugins/ocp/ocp-nvme.c +++ b/plugins/ocp/ocp-nvme.c @@ -912,6 +912,7 @@ __u8 *pC9_string_buffer; static void get_serial_number(struct nvme_id_ctrl *ctrl, char *sn) { int i; + /* Remove trailing spaces from the name */ for (i = 0; i < sizeof(ctrl->sn); i++) { if (ctrl->sn[i] == ' ') @@ -920,8 +921,7 @@ static void get_serial_number(struct nvme_id_ctrl *ctrl, char *sn) } } -static void print_telemetry_header(struct telemetry_initiated_log *logheader, - int tele_type) +static void print_telemetry_header(struct telemetry_initiated_log *logheader, int tele_type) { if (logheader) { unsigned int i = 0, j = 0; @@ -1610,22 +1610,21 @@ static int get_c9_log_page_data(struct nvme_dev *dev, int print_data, int save_b if (!ret) { log_data = (struct telemetry_str_log_format *)header_data; if (print_data) { - printf("Statistics Identifier String Table Size = %lld\n", - log_data->sitsz); + printf("Statistics Identifier String Table Size = %lld\n", log_data->sitsz); printf("Event String Table Size = %lld\n", log_data->estsz); printf("VU Event String Table Size = %lld\n", log_data->vu_eve_st_sz); printf("ASCII Table Size = %lld\n", log_data->asctsz); } - //Calculating the offset for dynamic fields. + /* Calculating the offset for dynamic fields. */ stat_id_str_table_ofst = log_data->sits * 4; event_str_table_ofst = log_data->ests * 4; vu_event_str_table_ofst = log_data->vu_eve_sts * 4; ascii_table_ofst = log_data->ascts * 4; total_log_page_sz = C9_TELEMETRY_STR_LOG_LEN + - (log_data->sitsz * 4) + (log_data->estsz * 4) + - (log_data->vu_eve_st_sz * 4) + (log_data->asctsz * 4); + (log_data->sitsz * 4) + (log_data->estsz * 4) + + (log_data->vu_eve_st_sz * 4) + (log_data->asctsz * 4); if (print_data) { printf("stat_id_str_table_ofst = %lld\n", stat_id_str_table_ofst); @@ -3589,9 +3588,7 @@ static void ocp_print_c9_log_binary(__u8 *log_data_buf, int total_log_page_size) static int get_c9_log_page(struct nvme_dev *dev, char *format) { - int ret = 0; - nvme_print_flags_t fmt; ret = validate_output_format(format, &fmt); @@ -3616,8 +3613,10 @@ static int get_c9_log_page(struct nvme_dev *dev, char *format) fprintf(stderr, "unhandled output format\n"); break; } - } else + } else { fprintf(stderr, "ERROR : OCP : Unable to read C9 data from buffer\n"); + } + free(header_data); return ret; } From c5af2d2f77b0a232ee2a4770d8a4d61aa0241d13 Mon Sep 17 00:00:00 2001 From: Maurizio Lombardi Date: Mon, 2 Sep 2024 17:43:03 +0200 Subject: [PATCH 152/281] plugins/solidigm: fix use after free. the "output" file descriptor is automatically closed when the function returns; therefore we shouldn't explicitly call close() against it. Signed-off-by: Maurizio Lombardi --- plugins/solidigm/solidigm-internal-logs.c | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/plugins/solidigm/solidigm-internal-logs.c b/plugins/solidigm/solidigm-internal-logs.c index 0c99406304..6147952f89 100644 --- a/plugins/solidigm/solidigm-internal-logs.c +++ b/plugins/solidigm/solidigm-internal-logs.c @@ -459,7 +459,6 @@ static int log_save(struct log *log, const char *parent_dir_name, const char *su _cleanup_fd_ int output = -1; char file_path[PATH_MAX] = {0}; size_t bytes_remaining = 0; - int err = 0; ensure_dir(parent_dir_name, subdir_name); @@ -474,19 +473,14 @@ static int log_save(struct log *log, const char *parent_dir_name, const char *su while (bytes_remaining) { ssize_t bytes_written = write(output, buffer, bytes_remaining); - if (bytes_written < 0) { - err = -errno; - goto log_save_close_output; - } + if (bytes_written < 0) + return -errno; bytes_remaining -= bytes_written; buffer += bytes_written; } printf("Successfully wrote %s to %s\n", log->desc, file_path); - -log_save_close_output: - close(output); - return err; + return 0; } static int ilog_dump_identify_page(struct ilog *ilog, struct log *cns, __u32 nsid) From b725f312dada18101973961edd319d7f3c11caf5 Mon Sep 17 00:00:00 2001 From: Tokunori Ikegami Date: Sat, 7 Sep 2024 22:25:59 +0900 Subject: [PATCH 153/281] nvme-print-json: use _cleanup_free_ This is to delete the free function call. Signed-off-by: Tokunori Ikegami --- nvme-print-json.c | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/nvme-print-json.c b/nvme-print-json.c index 38de97be0f..579570f6e1 100644 --- a/nvme-print-json.c +++ b/nvme-print-json.c @@ -132,8 +132,9 @@ static void obj_add_result(struct json_object *o, const char *v, ...) { va_list ap; + _cleanup_free_ char *value = NULL; + va_start(ap, v); - char *value; if (vasprintf(&value, v, ap) < 0) value = NULL; @@ -144,15 +145,15 @@ static void obj_add_result(struct json_object *o, const char *v, ...) obj_add_str(o, "Result", "Could not allocate string"); va_end(ap); - free(value); } static void obj_add_key(struct json_object *o, const char *k, const char *v, ...) { va_list ap; + _cleanup_free_ char *value = NULL; + va_start(ap, v); - char *value; if (vasprintf(&value, v, ap) < 0) value = NULL; @@ -163,7 +164,6 @@ static void obj_add_key(struct json_object *o, const char *k, const char *v, ... obj_add_str(o, k, "Could not allocate string"); va_end(ap); - free(value); } static struct json_object *obj_create_array_obj(struct json_object *o, const char *k) @@ -2085,10 +2085,11 @@ static void json_phy_rx_eom_descs(struct nvme_phy_rx_eom_log *log, static void json_phy_rx_eom_log(struct nvme_phy_rx_eom_log *log, __u16 controller) { - char **allocated_eyes = NULL; int i; struct json_object *r = json_create_object(); + _cleanup_free_ char **allocated_eyes = NULL; + obj_add_uint(r, "lid", log->lid); obj_add_uint(r, "eomip", log->eomip); obj_add_uint(r, "hsize", le16_to_cpu(log->hsize)); @@ -2121,7 +2122,6 @@ static void json_phy_rx_eom_log(struct nvme_phy_rx_eom_log *log, __u16 controlle if (allocated_eyes[i]) free(allocated_eyes[i]); } - free(allocated_eyes); } json_print(r); @@ -4613,18 +4613,17 @@ static void json_output_error_status(int status, const char *msg, va_list ap) { struct json_object *r; char json_str[STR_LEN]; - char *value; int val; int type; + _cleanup_free_ char *value = NULL; + if (vasprintf(&value, msg, ap) < 0) value = NULL; sprintf(json_str, "Error: %s", value ? value : "Could not allocate string"); r = obj_create(json_str); - free(value); - if (status < 0) { obj_add_str(r, "error", nvme_strerror(errno)); obj_print(r); @@ -4656,22 +4655,22 @@ static void json_output_error_status(int status, const char *msg, va_list ap) static void json_output_message(bool error, const char *msg, va_list ap) { struct json_object *r = json_r ? json_r : json_create_object(); - char *value; + + _cleanup_free_ char *value = NULL; if (vasprintf(&value, msg, ap) < 0) value = NULL; obj_add_str(r, error ? "error" : "result", value ? value : "Could not allocate string"); - free(value); - obj_print(r); } static void json_output_perror(const char *msg) { struct json_object *r = json_create_object(); - char *error; + + _cleanup_free_ char *error = NULL; if (asprintf(&error, "%s: %s", msg, strerror(errno)) < 0) error = NULL; @@ -4682,8 +4681,6 @@ static void json_output_perror(const char *msg) obj_add_str(r, "error", "Could not allocate string"); json_output_object(r); - - free(error); } void json_show_init(void) From f7c7953bb3805b08b176d4aee510c6a1d5f34ced Mon Sep 17 00:00:00 2001 From: Tokunori Ikegami Date: Sun, 8 Sep 2024 19:05:56 +0900 Subject: [PATCH 154/281] nvme: use NVME_GET_FEATURES_SEL_SUPPORTED definition This is to delete the hardcoded values. Signed-off-by: Tokunori Ikegami --- nvme.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nvme.c b/nvme.c index 900b1c0e19..40c6c5943b 100644 --- a/nvme.c +++ b/nvme.c @@ -4553,7 +4553,7 @@ static int get_feature_id(struct nvme_dev *dev, struct feat_cfg *cfg, cfg->cdw11 |= 0xff << 16; } - if (cfg->sel == 3) + if (cfg->sel == NVME_GET_FEATURES_SEL_SUPPORTED) cfg->data_len = 0; if (cfg->data_len) { @@ -4592,7 +4592,7 @@ static void get_feature_id_print(struct feat_cfg cfg, int err, __u32 result, if (!err) { if (!cfg.raw_binary || !buf) { nvme_feature_show(cfg.feature_id, cfg.sel, result); - if (cfg.sel == 3) + if (cfg.sel == NVME_GET_FEATURES_SEL_SUPPORTED) nvme_show_select_result(cfg.feature_id, result); else if (cfg.human_readable) nvme_feature_show_fields(cfg.feature_id, result, From 53f2b1ad10c6ec430dc0d73358aa74c5fad32710 Mon Sep 17 00:00:00 2001 From: Martin George Date: Wed, 28 Aug 2024 14:03:55 +0530 Subject: [PATCH 155/281] fabrics: fix incorrect access filename check Config JSON file handling is currently broken due to an incorrect access filename check. Fix it. Signed-off-by: Martin George --- fabrics.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fabrics.c b/fabrics.c index db1b7cb041..fd7ee35d05 100644 --- a/fabrics.c +++ b/fabrics.c @@ -669,8 +669,8 @@ static int nvme_read_volatile_config(nvme_root_t r) static int nvme_read_config_checked(nvme_root_t r, const char *filename) { - if (!access(filename, F_OK)) - return -ENOENT; + if (access(filename, F_OK)) + return -errno; if (nvme_read_config(r, filename)) return -errno; return 0; From caa1544693abbd17c3588afae718d265d0ef6933 Mon Sep 17 00:00:00 2001 From: Tokunori Ikegami Date: Sun, 8 Sep 2024 19:00:52 +0900 Subject: [PATCH 156/281] ocp: add get-enable-ieee1667-silo command The commands returns set of enable IEEE1667 silo. Signed-off-by: Tokunori Ikegami --- plugins/ocp/ocp-nvme.c | 69 ++++++++++++++++++++++++++++++++++++++++++ plugins/ocp/ocp-nvme.h | 2 ++ 2 files changed, 71 insertions(+) diff --git a/plugins/ocp/ocp-nvme.c b/plugins/ocp/ocp-nvme.c index ef4e784e10..1aa5ed0a59 100644 --- a/plugins/ocp/ocp-nvme.c +++ b/plugins/ocp/ocp-nvme.c @@ -194,6 +194,11 @@ struct erri_config { __u16 nrtdp; }; +struct ieee1667_get_cq_entry { + __u32 enabled:3; + __u32 rsvd3:29; +}; + static const char *sel = "[0-3]: current/default/saved/supported"; static const char *no_uuid = "Skip UUID index search (UUID index not required for OCP 1.0)"; const char *data = "Error injection data structure entries"; @@ -4141,3 +4146,67 @@ static int set_error_injection(int argc, char **argv, struct command *cmd, struc return error_injection_set(dev, &cfg, !argconfig_parse_seen(opts, "no-uuid")); } + +static int enable_ieee1667_silo_get(struct nvme_dev *dev, const __u8 sel, bool uuid) +{ + struct ieee1667_get_cq_entry cq_entry; + int err; + const __u8 fid = 0xc4; + + struct nvme_get_features_args args = { + .result = (__u32 *)&cq_entry, + .args_size = sizeof(args), + .fd = dev_fd(dev), + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .sel = sel, + .fid = fid, + }; + + if (uuid) { + /* OCP 2.0 requires UUID index support */ + err = ocp_get_uuid_index(dev, &args.uuidx); + if (err || !args.uuidx) { + nvme_show_error("ERROR: No OCP UUID index found"); + return err; + } + } + + err = nvme_cli_get_features(dev, &args); + if (!err) { + if (sel == NVME_GET_FEATURES_SEL_SUPPORTED) + nvme_show_select_result(fid, *args.result); + else + nvme_show_result("IEEE1667 Sifo Enabled (feature: 0x%02x): 0x%0x (%s: %s)", + fid, cq_entry.enabled, nvme_select_to_string(sel), + cq_entry.enabled ? "enabled" : "disabled"); + } else { + nvme_show_error("Could not get feature: 0x%02x.", fid); + } + + return err; +} + +static int get_enable_ieee1667_silo(int argc, char **argv, struct command *cmd, + struct plugin *plugin) +{ + const char *desc = "return set of enable IEEE1667 silo"; + int err; + struct config { + __u8 sel; + }; + struct config cfg = { 0 }; + + _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; + + OPT_ARGS(opts) = { + OPT_BYTE("sel", 's', &cfg.sel, sel), + OPT_FLAG("no-uuid", 'n', NULL, no_uuid), + OPT_END() + }; + + err = parse_and_open(&dev, argc, argv, desc, opts); + if (err) + return err; + + return enable_ieee1667_silo_get(dev, cfg.sel, !argconfig_parse_seen(opts, "no-uuid")); +} diff --git a/plugins/ocp/ocp-nvme.h b/plugins/ocp/ocp-nvme.h index 16d929d522..de23de01e0 100644 --- a/plugins/ocp/ocp-nvme.h +++ b/plugins/ocp/ocp-nvme.h @@ -38,6 +38,8 @@ PLUGIN(NAME("ocp", "OCP cloud SSD extensions", OCP_PLUGIN_VERSION), ENTRY("tcg-configuration-log", "Retrieve TCG Configuration Log Page", ocp_tcg_configuration_log) ENTRY("get-error-injection", "Return set of error injection", get_error_injection) ENTRY("set-error-injection", "Inject error conditions", set_error_injection) + ENTRY("get-enable-ieee1667-silo", "return set of enable IEEE1667 silo", + get_enable_ieee1667_silo) ) ); From db17e9a8cc2508a01a1120b95ecfe47bee69f57f Mon Sep 17 00:00:00 2001 From: Tokunori Ikegami Date: Wed, 4 Sep 2024 02:55:17 +0900 Subject: [PATCH 157/281] ocp: add error recovery log page version 3 Add panic count and previous panic IDs. Signed-off-by: Tokunori Ikegami --- plugins/ocp/ocp-nvme.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/plugins/ocp/ocp-nvme.c b/plugins/ocp/ocp-nvme.c index 1aa5ed0a59..306955d875 100644 --- a/plugins/ocp/ocp-nvme.c +++ b/plugins/ocp/ocp-nvme.c @@ -2152,6 +2152,8 @@ static int ocp_unsupported_requirements_log(int argc, char **argv, struct comman #define C1_ERROR_RECOVERY_OPCODE 0xC1 #define C1_ERROR_RECOVERY_VERSION 0x0002 #define C1_GUID_LENGTH 16 +#define C1_PREV_PANIC_IDS_LENGTH 4 + static __u8 error_recovery_guid[C1_GUID_LENGTH] = { 0x44, 0xd9, 0x31, 0x21, 0xfe, 0x30, 0x34, 0xae, @@ -2173,6 +2175,8 @@ static __u8 error_recovery_guid[C1_GUID_LENGTH] = { * @vendor_specific_command_timeout: Vendor Specific Command Timeout * @device_recover_action_2: Device Recovery Action 2 * @device_recover_action_2_timeout: Device Recovery Action 2 Timeout + * @panic_count: Panic Count + * @prev_panic_id: Previous Panic IDs * @reserved2: Reserved * @log_page_version: Log Page Version * @log_page_guid: Log Page GUID @@ -2190,7 +2194,9 @@ struct __packed ocp_error_recovery_log_page { __u8 vendor_specific_command_timeout; /* 1 byte - 0x1C */ __u8 device_recover_action_2; /* 1 byte - 0x1D */ __u8 device_recover_action_2_timeout; /* 1 byte - 0x1E */ - __u8 reserved2[0x1cf]; /* 463 bytes - 0x1F - 0x1ED */ + __u8 panic_count; /* 1 byte - 0x1F */ + __le64 prev_panic_id[C1_PREV_PANIC_IDS_LENGTH]; /* 32 bytes - 0x20 - 0x3F */ + __u8 reserved2[0x1ae]; /* 430 bytes - 0x40 - 0x1ED */ __le16 log_page_version; /* 2 bytes - 0x1EE - 0x1EF */ __u8 log_page_guid[0x10]; /* 16 bytes - 0x1F0 - 0x1FF */ }; @@ -2217,8 +2223,13 @@ static void ocp_print_c1_log_normal(struct ocp_error_recovery_log_page *log_data printf(" Vendor Specific Command Timeout : 0x%x\n", log_data->vendor_specific_command_timeout); printf(" Device Recovery Action 2 : 0x%x\n", log_data->device_recover_action_2); printf(" Device Recovery Action 2 Timeout : 0x%x\n", log_data->device_recover_action_2_timeout); + printf(" Panic Count : 0x%x\n", log_data->panic_count); + printf(" Previous Panic IDs:"); + for (i = 0; i < C1_PREV_PANIC_IDS_LENGTH; i++) + printf("%s Panic ID N-%d : 0x%lx\n", i ? " " : "", i + 1, + le64_to_cpu(log_data->prev_panic_id[i])); printf(" Log Page Version : 0x%x\n", le16_to_cpu(log_data->log_page_version)); - printf(" Log page GUID : 0x"); + printf(" Log page GUID : 0x"); for (i = C1_GUID_LENGTH - 1; i >= 0; i--) printf("%x", log_data->log_page_guid[i]); printf("\n"); From c30898ac188c466cf896f7cd91222134eac65af3 Mon Sep 17 00:00:00 2001 From: Tokunori Ikegami Date: Tue, 3 Sep 2024 23:46:01 +0900 Subject: [PATCH 158/281] ocp: add SMART / health information extended log page version 4 Add NVMe command set errata version and lowest permitted firmware revision. Signed-off-by: Tokunori Ikegami --- plugins/ocp/ocp-smart-extended-log.c | 44 ++++++++++++++++++++++------ 1 file changed, 35 insertions(+), 9 deletions(-) diff --git a/plugins/ocp/ocp-smart-extended-log.c b/plugins/ocp/ocp-smart-extended-log.c index 6a524d3e3b..2ff7738fc3 100644 --- a/plugins/ocp/ocp-smart-extended-log.c +++ b/plugins/ocp/ocp-smart-extended-log.c @@ -52,7 +52,8 @@ enum { SCAO_ICS = 112, /* Incomplete shutdowns */ SCAO_PFB = 120, /* Percent free blocks */ SCAO_CPH = 128, /* Capacitor health */ - SCAO_NEV = 130, /* NVMe Errata Version */ + SCAO_NBEV = 130, /* NVMe Base Errata Version */ + SCAO_NCSEV = 131, /* NVMe Command Set Errata Version */ SCAO_UIO = 136, /* Unaligned I/O */ SCAO_SVN = 144, /* Security Version Number */ SCAO_NUSE = 152, /* NUSE - Namespace utilization */ @@ -60,6 +61,7 @@ enum { SCAO_EEST = 176, /* Endurance estimate */ SCAO_PLRC = 192, /* PCIe Link Retraining Count */ SCAO_PSCC = 200, /* Power State Change Count */ + SCAO_LPFR = 208, /* Lowest Permitted Firmware Revision */ SCAO_LPV = 494, /* Log page version */ SCAO_LPG = 496, /* Log page GUID */ }; @@ -115,6 +117,10 @@ static void ocp_print_C0_log_normal(void *data) (__u8)log_data[SCAO_PFB]); printf(" Capacitor health %"PRIu16"\n", (uint16_t)le16_to_cpu(*(uint16_t *)&log_data[SCAO_CPH])); + printf(" NVMe base errata version %c\n", + (uint16_t)le16_to_cpu(*(uint16_t *)&log_data[SCAO_CPH])); + printf(" NVMe command set errata version %c\n", + (uint16_t)le16_to_cpu(*(uint16_t *)&log_data[SCAO_CPH])); printf(" Unaligned I/O %"PRIu64"\n", (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_UIO])); printf(" Security Version Number %"PRIu64"\n", @@ -130,7 +136,17 @@ static void ocp_print_C0_log_normal(void *data) printf(" Log page GUID 0x"); printf("%"PRIx64"%"PRIx64"\n", (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_LPG + 8]), (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_LPG])); - if (smart_log_ver > 2) { + switch (smart_log_ver) { + case 0 ... 1: + break; + default: + case 4: + printf(" NVMe Command Set Errata Version %d\n", + (__u8)log_data[SCAO_NCSEV]); + printf(" Lowest Permitted Firmware Revision %"PRIu64"\n", + le64_to_cpu(*(uint64_t *)&log_data[SCAO_PSCC])); + fallthrough; + case 2 ... 3: printf(" Errata Version Field %d\n", (__u8)log_data[SCAO_EVF]); printf(" Point Version Field %"PRIu16"\n", @@ -139,11 +155,11 @@ static void ocp_print_C0_log_normal(void *data) le16_to_cpu(*(uint16_t *)&log_data[SCAO_MIVF])); printf(" Major Version Field %d\n", (__u8)log_data[SCAO_MAVF]); - printf(" NVMe Errata Version %d\n", - (__u8)log_data[SCAO_NEV]); - printf(" PCIe Link Retraining Count %"PRIu64"\n", + printf(" NVMe Base Errata Version %d\n", + (__u8)log_data[SCAO_NBEV]); + printf(" PCIe Link Retraining Count %"PRIu64"\n", (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_PLRC])); - printf(" Power State Change Count %"PRIu64"\n", + printf(" Power State Change Count %"PRIu64"\n", le64_to_cpu(*(uint64_t *)&log_data[SCAO_PSCC])); } printf("\n"); @@ -229,7 +245,17 @@ static void ocp_print_C0_log_json(void *data) (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_LPG])); json_object_add_value_string(root, "Log page GUID", guid); - if (smart_log_ver > 2) { + switch (smart_log_ver) { + case 0 ... 1: + break; + default: + case 4: + json_object_add_value_uint(root, "NVMe Command Set Errata Version", + (__u8)log_data[SCAO_NCSEV]); + json_object_add_value_uint(root, "Lowest Permitted Firmware Revision", + le64_to_cpu(*(uint64_t *)&log_data[SCAO_PSCC])); + fallthrough; + case 2 ... 3: json_object_add_value_uint(root, "Errata Version Field", (__u8)log_data[SCAO_EVF]); json_object_add_value_uint(root, "Point Version Field", @@ -238,8 +264,8 @@ static void ocp_print_C0_log_json(void *data) le16_to_cpu(*(uint16_t *)&log_data[SCAO_MIVF])); json_object_add_value_uint(root, "Major Version Field", (__u8)log_data[SCAO_MAVF]); - json_object_add_value_uint(root, "NVMe Errata Version", - (__u8)log_data[SCAO_NEV]); + json_object_add_value_uint(root, "NVMe Base Errata Version", + (__u8)log_data[SCAO_NBEV]); json_object_add_value_uint(root, "PCIe Link Retraining Count", (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_PLRC])); json_object_add_value_uint(root, "Power State Change Count", From 668f51dba76c55c8eae2cd415b650bacf2c46a82 Mon Sep 17 00:00:00 2001 From: Tokunori Ikegami Date: Tue, 10 Sep 2024 01:08:25 +0900 Subject: [PATCH 159/281] nvme-print-json: extern json object add functions Some additinal functions introduced and fix obj_add_uint_0nx error. Signed-off-by: Tokunori Ikegami --- nvme-print-json.c | 48 +++++++++++++++++++++++++++++++++++++++-------- nvme-print.h | 10 ++++++++++ 2 files changed, 50 insertions(+), 8 deletions(-) diff --git a/nvme-print-json.c b/nvme-print-json.c index 579570f6e1..38a2e35d99 100644 --- a/nvme-print-json.c +++ b/nvme-print-json.c @@ -25,7 +25,6 @@ #define obj_add_array json_object_add_value_array #define obj_add_int json_object_add_value_int #define obj_add_obj json_object_add_value_object -#define obj_add_str json_object_add_value_string #define obj_add_uint json_object_add_value_uint #define obj_add_uint128 json_object_add_value_uint128 #define obj_add_uint64 json_object_add_value_uint64 @@ -75,7 +74,7 @@ static void obj_add_uint_x(struct json_object *o, const char *k, __u32 v) obj_add_str(o, k, str); } -static void obj_add_uint_0x(struct json_object *o, const char *k, __u32 v) +void obj_add_uint_0x(struct json_object *o, const char *k, __u32 v) { char str[STR_LEN]; @@ -83,15 +82,15 @@ static void obj_add_uint_0x(struct json_object *o, const char *k, __u32 v) obj_add_str(o, k, str); } -static void obj_add_uint_0nx(struct json_object *o, const char *k, __u32 v, int width) +void obj_add_uint_0nx(struct json_object *o, const char *k, __u32 v, int width) { char str[STR_LEN]; - sprintf(str, "0x%02x", v); + sprintf(str, "0x%0*x", width, v); obj_add_str(o, k, str); } -static void obj_add_uint_02x(struct json_object *o, const char *k, __u32 v) +void obj_add_uint_02x(struct json_object *o, const char *k, __u32 v) { obj_add_uint_0nx(o, k, v, 2); } @@ -104,7 +103,7 @@ static void obj_add_uint_nx(struct json_object *o, const char *k, __u32 v) obj_add_str(o, k, str); } -static void obj_add_nprix64(struct json_object *o, const char *k, uint64_t v) +void obj_add_nprix64(struct json_object *o, const char *k, uint64_t v) { char str[STR_LEN]; @@ -166,7 +165,7 @@ static void obj_add_key(struct json_object *o, const char *k, const char *v, ... va_end(ap); } -static struct json_object *obj_create_array_obj(struct json_object *o, const char *k) +struct json_object *obj_create_array_obj(struct json_object *o, const char *k) { struct json_object *array = json_create_array(); struct json_object *obj = json_create_object(); @@ -191,7 +190,7 @@ static struct json_object *obj_create(const char *k) return obj; } -static void json_print(struct json_object *r) +void json_print(struct json_object *r) { json_print_object(r, NULL); printf("\n"); @@ -4784,3 +4783,36 @@ struct print_ops *nvme_get_json_print_ops(nvme_print_flags_t flags) json_print_ops.flags = flags; return &json_print_ops; } + +void obj_add_byte_array(struct json_object *o, const char *k, unsigned char *buf, int len) +{ + int i; + + _cleanup_free_ char *value = NULL; + + if (!buf || !len) { + obj_add_str(o, k, "No information provided"); + return; + } + + value = calloc(1, (len + 1) * 2 + 1); + + if (!value) { + obj_add_str(o, k, "Could not allocate string"); + return; + } + + sprintf(value, "0x"); + for (i = 1; i <= len; i++) + sprintf(&value[i * 2], "%02x", buf[len - i]); + + obj_add_str(o, k, value); +} + +void obj_add_0nprix64(struct json_object *o, const char *k, uint64_t v, int width) +{ + char str[STR_LEN]; + + sprintf(str, "0x%0*"PRIx64"", width, v); + obj_add_str(o, k, str); +} diff --git a/nvme-print.h b/nvme-print.h index 596980486a..3f79fd6851 100644 --- a/nvme-print.h +++ b/nvme-print.h @@ -20,6 +20,8 @@ typedef struct nvme_effects_log_node { #define STR_LEN 100 +#define obj_add_str json_object_add_value_string + void d(unsigned char *buf, int len, int width, int group); void d_raw(unsigned char *buf, unsigned len); @@ -324,4 +326,12 @@ bool nvme_registers_cmbloc_support(__u32 cmbsz); bool nvme_registers_pmrctl_ready(__u32 pmrctl); const char *nvme_degrees_string(long t); void print_array(char *name, __u8 *data, int size); +void obj_add_uint_02x(struct json_object *o, const char *k, __u32 v); +void json_print(struct json_object *r); +void obj_add_uint_0x(struct json_object *o, const char *k, __u32 v); +void obj_add_byte_array(struct json_object *o, const char *k, unsigned char *buf, int len); +void obj_add_nprix64(struct json_object *o, const char *k, uint64_t v); +struct json_object *obj_create_array_obj(struct json_object *o, const char *k); +void obj_add_uint_0nx(struct json_object *o, const char *k, __u32 v, int width); +void obj_add_0nprix64(struct json_object *o, const char *k, uint64_t v, int width); #endif /* NVME_PRINT_H */ From 902f562a7bc5b603ab775ffb5589c27cfb8f6780 Mon Sep 17 00:00:00 2001 From: jeff-lien-wdc Date: Thu, 12 Sep 2024 15:15:19 -0500 Subject: [PATCH 160/281] Add Support for new SN655 PCI Device ID Support was added for an additional PCI Device ID (0x2723) for SN655 drives. Signed-off-by: jeff-lien-wdc --- plugins/wdc/wdc-nvme.c | 4 ++++ plugins/wdc/wdc-nvme.h | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/plugins/wdc/wdc-nvme.c b/plugins/wdc/wdc-nvme.c index 1bc9ecd1e0..3c7982b86d 100644 --- a/plugins/wdc/wdc-nvme.c +++ b/plugins/wdc/wdc-nvme.c @@ -79,6 +79,7 @@ #define WDC_NVME_SN650_DEV_ID_3 0x2720 #define WDC_NVME_SN650_DEV_ID_4 0x2721 #define WDC_NVME_SN655_DEV_ID 0x2722 +#define WDC_NVME_SN655_DEV_ID_1 0x2723 #define WDC_NVME_SN860_DEV_ID 0x2730 #define WDC_NVME_SN660_DEV_ID 0x2704 #define WDC_NVME_SN560_DEV_ID_1 0x2712 @@ -1824,6 +1825,7 @@ static __u64 wdc_get_drive_capabilities(nvme_root_t r, struct nvme_dev *dev) case WDC_NVME_SN650_DEV_ID_3: case WDC_NVME_SN650_DEV_ID_4: case WDC_NVME_SN655_DEV_ID: + case WDC_NVME_SN655_DEV_ID_1: case WDC_NVME_SN550_DEV_ID: /* verify the 0xC0 log page is supported */ if (wdc_nvme_check_supported_log_page(r, dev, @@ -6912,6 +6914,7 @@ static int wdc_get_c0_log_page(nvme_root_t r, struct nvme_dev *dev, char *format case WDC_NVME_SN650_DEV_ID_3: case WDC_NVME_SN650_DEV_ID_4: case WDC_NVME_SN655_DEV_ID: + case WDC_NVME_SN655_DEV_ID_1: if (uuid_index == 0) { ret = nvme_get_print_ocp_cloud_smart_log(dev, uuid_index, @@ -11308,6 +11311,7 @@ static int wdc_vs_drive_info(int argc, char **argv, case WDC_NVME_SN650_DEV_ID_3: case WDC_NVME_SN650_DEV_ID_4: case WDC_NVME_SN655_DEV_ID: + case WDC_NVME_SN655_DEV_ID_1: case WDC_NVME_SN560_DEV_ID_1: case WDC_NVME_SN560_DEV_ID_2: case WDC_NVME_SN560_DEV_ID_3: diff --git a/plugins/wdc/wdc-nvme.h b/plugins/wdc/wdc-nvme.h index b88e79b9ac..196ee1a983 100644 --- a/plugins/wdc/wdc-nvme.h +++ b/plugins/wdc/wdc-nvme.h @@ -5,7 +5,7 @@ #if !defined(WDC_NVME) || defined(CMD_HEADER_MULTI_READ) #define WDC_NVME -#define WDC_PLUGIN_VERSION "2.9.3" +#define WDC_PLUGIN_VERSION "2.10.0" #include "cmd.h" PLUGIN(NAME("wdc", "Western Digital vendor specific extensions", WDC_PLUGIN_VERSION), From e2025d6ac9e98557ce647d988d20c93ec1173360 Mon Sep 17 00:00:00 2001 From: Martin George Date: Fri, 13 Sep 2024 21:36:37 +0530 Subject: [PATCH 161/281] netapp-smdevices: segregate print routines Segregate printing the respective normal/column and json outputs into separate routines for better readability. Signed-off-by: Martin George Tested-by: Clayton Skaggs --- plugins/netapp/netapp-nvme.c | 96 +++++++++++++++++++++++++----------- 1 file changed, 66 insertions(+), 30 deletions(-) diff --git a/plugins/netapp/netapp-nvme.c b/plugins/netapp/netapp-nvme.c index 7318cda85c..4734638e53 100644 --- a/plugins/netapp/netapp-nvme.c +++ b/plugins/netapp/netapp-nvme.c @@ -251,23 +251,24 @@ static void netapp_ontapdevice_json(struct json_object *devices, char *devname, json_array_add_value_object(devices, device_attrs); } -static void netapp_smdevices_print(struct smdevice_info *devices, int count, int format) +static void netapp_smdevices_print_regular(struct smdevice_info *devices, + int count, int format) { - struct json_object *root = NULL; - struct json_object *json_devices = NULL; int i, slta; char array_label[ARRAY_LABEL_LEN / 2 + 1]; char volume_label[VOLUME_LABEL_LEN / 2 + 1]; char nguid_str[33]; + __u8 lba_index; + + char *formatstr = NULL; char basestr[] = "%s, Array Name %s, Volume Name %s, NSID %d, Volume ID %s, Controller %c, Access State %s, %s\n"; char columnstr[] = "%-16s %-30s %-30s %4d %32s %c %-12s %9s\n"; - char *formatstr = basestr; /* default to "normal" output format */ - __u8 lba_index; - if (format == NCOLUMN) { - /* for column output, change output string and print column headers */ - formatstr = columnstr; + if (format == NNORMAL) + formatstr = basestr; + else if (format == NCOLUMN) { + /* change output string and print column headers */ printf("%-16s %-30s %-30s %-4s %-32s %-4s %-12s %-9s\n", "Device", "Array Name", "Volume Name", "NSID", "Volume ID", "Ctrl", "Access State", " Size"); @@ -276,44 +277,74 @@ static void netapp_smdevices_print(struct smdevice_info *devices, int count, int "------------------------------", "----", "--------------------------------", "----", "------------", "---------"); - } else if (format == NJSON) { - /* prepare for json output */ - root = json_create_object(); - json_devices = json_create_array(); + formatstr = columnstr; } for (i = 0; i < count; i++) { nvme_id_ns_flbas_to_lbaf_inuse(devices[i].ns.flbas, &lba_index); - unsigned long long lba = 1ULL << devices[i].ns.lbaf[lba_index].ds; + unsigned long long lba = 1ULL << + devices[i].ns.lbaf[lba_index].ds; double nsze = le64_to_cpu(devices[i].ns.nsze) * lba; const char *s_suffix = suffix_si_get(&nsze); char size[128]; sprintf(size, "%.2f%sB", nsze, s_suffix); - netapp_convert_string(array_label, (char *)&devices[i].ctrl.vs[20], - ARRAY_LABEL_LEN / 2); + netapp_convert_string(array_label, + (char *)&devices[i].ctrl.vs[20], + ARRAY_LABEL_LEN / 2); slta = devices[i].ctrl.vs[0] & 0x1; netapp_convert_string(volume_label, (char *)devices[i].ns.vs, VOLUME_LABEL_LEN / 2); netapp_nguid_to_str(nguid_str, devices[i].ns.nguid); - if (format == NJSON) - netapp_smdevice_json(json_devices, devices[i].dev, - array_label, volume_label, devices[i].nsid, - nguid_str, slta ? "A" : "B", "unknown", size, - lba, le64_to_cpu(devices[i].ns.nsze)); - else - printf(formatstr, devices[i].dev, array_label, + printf(formatstr, devices[i].dev, array_label, volume_label, devices[i].nsid, nguid_str, slta ? 'A' : 'B', "unknown", size); + } } +} + +static void netapp_smdevices_print_json(struct smdevice_info *devices, + int count) +{ + struct json_object *root = NULL; + struct json_object *json_devices = NULL; + int i, slta; + char array_label[ARRAY_LABEL_LEN / 2 + 1]; + char volume_label[VOLUME_LABEL_LEN / 2 + 1]; + char nguid_str[33]; + __u8 lba_index; - if (format == NJSON) { - /* complete the json output */ - json_object_add_value_array(root, "SMdevices", json_devices); - json_print_object(root, NULL); - printf("\n"); - json_free_object(root); + /* prepare for the json output */ + root = json_create_object(); + json_devices = json_create_array(); + + for (i = 0; i < count; i++) { + nvme_id_ns_flbas_to_lbaf_inuse(devices[i].ns.flbas, &lba_index); + unsigned long long lba = 1ULL << + devices[i].ns.lbaf[lba_index].ds; + double nsze = le64_to_cpu(devices[i].ns.nsze) * lba; + const char *s_suffix = suffix_si_get(&nsze); + char size[128]; + + sprintf(size, "%.2f%sB", nsze, s_suffix); + netapp_convert_string(array_label, + (char *)&devices[i].ctrl.vs[20], + ARRAY_LABEL_LEN / 2); + slta = devices[i].ctrl.vs[0] & 0x1; + netapp_convert_string(volume_label, (char *)devices[i].ns.vs, + VOLUME_LABEL_LEN / 2); + netapp_nguid_to_str(nguid_str, devices[i].ns.nguid); + netapp_smdevice_json(json_devices, devices[i].dev, + array_label, volume_label, devices[i].nsid, + nguid_str, slta ? "A" : "B", "unknown", size, + lba, le64_to_cpu(devices[i].ns.nsze)); } + + /* complete the json output */ + json_object_add_value_array(root, "SMdevices", json_devices); + json_print_object(root, NULL); + printf("\n"); + json_free_object(root); } static void netapp_ontapdevices_print_regular(struct ontapdevice_info *devices, @@ -639,8 +670,13 @@ static int netapp_smdevices(int argc, char **argv, struct command *command, close(fd); } - if (num_smdevices) - netapp_smdevices_print(smdevices, num_smdevices, fmt); + if (num_smdevices) { + if (fmt == NNORMAL || fmt == NCOLUMN) + netapp_smdevices_print_regular(smdevices, + num_smdevices, fmt); + else if (fmt == NJSON) + netapp_smdevices_print_json(smdevices, num_smdevices); + } for (i = 0; i < num; i++) free(devices[i]); From e05b4d253ac2c869a6ca2cfc18f7d46c8f0effd0 Mon Sep 17 00:00:00 2001 From: Martin George Date: Fri, 13 Sep 2024 22:44:18 +0530 Subject: [PATCH 162/281] netapp-smdevices: print single device output too In addition to printing info of all smdevices on the host, provide an option to print the output of the specified device alone. Signed-off-by: Martin George Tested-by: Clayton Skaggs --- plugins/netapp/netapp-nvme.c | 94 ++++++++++++++++++++++++++++++++---- 1 file changed, 85 insertions(+), 9 deletions(-) diff --git a/plugins/netapp/netapp-nvme.c b/plugins/netapp/netapp-nvme.c index 4734638e53..9e95e5a87d 100644 --- a/plugins/netapp/netapp-nvme.c +++ b/plugins/netapp/netapp-nvme.c @@ -252,7 +252,7 @@ static void netapp_ontapdevice_json(struct json_object *devices, char *devname, } static void netapp_smdevices_print_regular(struct smdevice_info *devices, - int count, int format) + int count, int format, const char *devname) { int i, slta; char array_label[ARRAY_LABEL_LEN / 2 + 1]; @@ -281,6 +281,36 @@ static void netapp_smdevices_print_regular(struct smdevice_info *devices, } for (i = 0; i < count; i++) { + if (devname && !strcmp(devname, basename(devices[i].dev))) { + /* found the device, fetch info for that alone */ + nvme_id_ns_flbas_to_lbaf_inuse(devices[i].ns.flbas, + &lba_index); + unsigned long long lba = 1ULL << + devices[i].ns.lbaf[lba_index].ds; + double nsze = le64_to_cpu(devices[i].ns.nsze) * lba; + const char *s_suffix = suffix_si_get(&nsze); + char size[128]; + + sprintf(size, "%.2f%sB", nsze, s_suffix); + netapp_convert_string(array_label, + (char *)&devices[i].ctrl.vs[20], + ARRAY_LABEL_LEN / 2); + slta = devices[i].ctrl.vs[0] & 0x1; + netapp_convert_string(volume_label, + (char *)devices[i].ns.vs, + VOLUME_LABEL_LEN / 2); + netapp_nguid_to_str(nguid_str, devices[i].ns.nguid); + + printf(formatstr, devices[i].dev, array_label, + volume_label, devices[i].nsid, + nguid_str, + slta ? 'A' : 'B', "unknown", size); + return; + } + } + + for (i = 0; i < count; i++) { + /* fetch info for all devices */ nvme_id_ns_flbas_to_lbaf_inuse(devices[i].ns.flbas, &lba_index); unsigned long long lba = 1ULL << devices[i].ns.lbaf[lba_index].ds; @@ -294,17 +324,17 @@ static void netapp_smdevices_print_regular(struct smdevice_info *devices, ARRAY_LABEL_LEN / 2); slta = devices[i].ctrl.vs[0] & 0x1; netapp_convert_string(volume_label, (char *)devices[i].ns.vs, - VOLUME_LABEL_LEN / 2); + VOLUME_LABEL_LEN / 2); netapp_nguid_to_str(nguid_str, devices[i].ns.nguid); + printf(formatstr, devices[i].dev, array_label, volume_label, devices[i].nsid, nguid_str, slta ? 'A' : 'B', "unknown", size); - } } } static void netapp_smdevices_print_json(struct smdevice_info *devices, - int count) + int count, const char *devname) { struct json_object *root = NULL; struct json_object *json_devices = NULL; @@ -319,6 +349,36 @@ static void netapp_smdevices_print_json(struct smdevice_info *devices, json_devices = json_create_array(); for (i = 0; i < count; i++) { + if (devname && !strcmp(devname, basename(devices[i].dev))) { + /* found the device, fetch info for that alone */ + nvme_id_ns_flbas_to_lbaf_inuse(devices[i].ns.flbas, + &lba_index); + unsigned long long lba = 1ULL << + devices[i].ns.lbaf[lba_index].ds; + double nsze = le64_to_cpu(devices[i].ns.nsze) * lba; + const char *s_suffix = suffix_si_get(&nsze); + char size[128]; + + sprintf(size, "%.2f%sB", nsze, s_suffix); + netapp_convert_string(array_label, + (char *)&devices[i].ctrl.vs[20], + ARRAY_LABEL_LEN / 2); + slta = devices[i].ctrl.vs[0] & 0x1; + netapp_convert_string(volume_label, + (char *)devices[i].ns.vs, + VOLUME_LABEL_LEN / 2); + netapp_nguid_to_str(nguid_str, devices[i].ns.nguid); + netapp_smdevice_json(json_devices, devices[i].dev, + array_label, volume_label, + devices[i].nsid, nguid_str, + slta ? "A" : "B", "unknown", size, lba, + le64_to_cpu(devices[i].ns.nsze)); + goto out; + } + } + + for (i = 0; i < count; i++) { + /* fetch info for all devices */ nvme_id_ns_flbas_to_lbaf_inuse(devices[i].ns.flbas, &lba_index); unsigned long long lba = 1ULL << devices[i].ns.lbaf[lba_index].ds; @@ -331,15 +391,17 @@ static void netapp_smdevices_print_json(struct smdevice_info *devices, (char *)&devices[i].ctrl.vs[20], ARRAY_LABEL_LEN / 2); slta = devices[i].ctrl.vs[0] & 0x1; - netapp_convert_string(volume_label, (char *)devices[i].ns.vs, + netapp_convert_string(volume_label, + (char *)devices[i].ns.vs, VOLUME_LABEL_LEN / 2); netapp_nguid_to_str(nguid_str, devices[i].ns.nguid); netapp_smdevice_json(json_devices, devices[i].dev, array_label, volume_label, devices[i].nsid, - nguid_str, slta ? "A" : "B", "unknown", size, - lba, le64_to_cpu(devices[i].ns.nsze)); + nguid_str, slta ? "A" : "B", "unknown", + size, lba, le64_to_cpu(devices[i].ns.nsze)); } +out: /* complete the json output */ json_object_add_value_array(root, "SMdevices", json_devices); json_print_object(root, NULL); @@ -618,6 +680,7 @@ static int netapp_smdevices(int argc, char **argv, struct command *command, int num, i, fd, ret, fmt; struct smdevice_info *smdevices; char path[264]; + char *devname = NULL; int num_smdevices = 0; struct config { @@ -649,6 +712,18 @@ static int netapp_smdevices(int argc, char **argv, struct command *command, return num; } + if (optind < argc) + devname = basename(argv[optind++]); + + if (devname) { + int subsys_num, nsid; + + if (sscanf(devname, "nvme%dn%d", &subsys_num, &nsid) != 2) { + fprintf(stderr, "Invalid device name %s\n", devname); + return -EINVAL; + } + } + smdevices = calloc(num, sizeof(*smdevices)); if (!smdevices) { fprintf(stderr, "Unable to allocate memory for devices.\n"); @@ -673,9 +748,10 @@ static int netapp_smdevices(int argc, char **argv, struct command *command, if (num_smdevices) { if (fmt == NNORMAL || fmt == NCOLUMN) netapp_smdevices_print_regular(smdevices, - num_smdevices, fmt); + num_smdevices, fmt, devname); else if (fmt == NJSON) - netapp_smdevices_print_json(smdevices, num_smdevices); + netapp_smdevices_print_json(smdevices, + num_smdevices, devname); } for (i = 0; i < num; i++) From 3cca5904533124a9c485784aa5c2f5f6cc88703c Mon Sep 17 00:00:00 2001 From: Tokunori Ikegami Date: Mon, 16 Sep 2024 15:11:51 +0900 Subject: [PATCH 163/281] nvme: use NVME_CTRL_FNA definitions Replace the hardcoded values. Signed-off-by: Tokunori Ikegami --- nvme-print-stdout.c | 8 ++++---- nvme.c | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/nvme-print-stdout.c b/nvme-print-stdout.c index 27b3beb29f..96aeb75a2f 100644 --- a/nvme-print-stdout.c +++ b/nvme-print-stdout.c @@ -2217,10 +2217,10 @@ static void stdout_id_ctrl_fuses(__le16 ctrl_fuses) static void stdout_id_ctrl_fna(__u8 fna) { __u8 rsvd = (fna & 0xF0) >> 4; - __u8 bcnsid = (fna & 0x8) >> 3; - __u8 cese = (fna & 0x4) >> 2; - __u8 cens = (fna & 0x2) >> 1; - __u8 fmns = fna & 0x1; + __u8 bcnsid = (fna & NVME_CTRL_FNA_NSID_FFFFFFFF) >> 3; + __u8 cese = (fna & NVME_CTRL_FNA_CRYPTO_ERASE) >> 2; + __u8 cens = (fna & NVME_CTRL_FNA_SEC_ALL_NAMESPACES) >> 1; + __u8 fmns = fna & NVME_CTRL_FNA_FMT_ALL_NAMESPACES; if (rsvd) printf(" [7:4] : %#x\tReserved\n", rsvd); diff --git a/nvme.c b/nvme.c index 40c6c5943b..c1f177f351 100644 --- a/nvme.c +++ b/nvme.c @@ -6169,7 +6169,7 @@ static int format_cmd(int argc, char **argv, struct command *cmd, struct plugin return -errno; } - if ((ctrl->fna & 1) == 1) { + if (ctrl->fna & NVME_CTRL_FNA_FMT_ALL_NAMESPACES) { /* * FNA bit 0 set to 1: all namespaces ... shall be configured with the same * attributes and a format (excluding secure erase) of any namespace results in a From a7a9905957123ab010c798245ee82f60d79bb2cd Mon Sep 17 00:00:00 2001 From: Tokunori Ikegami Date: Mon, 16 Sep 2024 20:57:18 +0900 Subject: [PATCH 164/281] ocp: add support for hwcomp log page Note: Still json output not supported. Signed-off-by: Tokunori Ikegami --- plugins/ocp/ocp-nvme.c | 239 ++++++++++++++++++++++++++++++++++++++++- plugins/ocp/ocp-nvme.h | 1 + 2 files changed, 239 insertions(+), 1 deletion(-) diff --git a/plugins/ocp/ocp-nvme.c b/plugins/ocp/ocp-nvme.c index 306955d875..e31687c485 100644 --- a/plugins/ocp/ocp-nvme.c +++ b/plugins/ocp/ocp-nvme.c @@ -22,6 +22,7 @@ #include "plugin.h" #include "linux/types.h" #include "util/types.h" +#include "util/logging.h" #include "nvme-print.h" #include "nvme-wrap.h" @@ -34,6 +35,59 @@ #include "ocp-nvme.h" #include "ocp-utils.h" +#define LID_HWCOMP 0xc6 +#define HWCOMP_RSVD2_LEN 14 +#define GUID_LEN 16 +#define HWCOMP_SIZE_LEN 16 +#define HWCOMP_RSVD48_LEN 16 + +struct __packed hwcomp_desc { + __le64 date_lot_size; + __le64 add_info_size; + __le32 id; + __le64 mfg; + __le64 rev; + __le64 mfg_code; +}; + +struct __packed hwcomp_log { + __le16 ver; + __u8 rsvd2[HWCOMP_RSVD2_LEN]; + __u8 guid[GUID_LEN]; + __u8 size[HWCOMP_SIZE_LEN]; + __u8 rsvd48[HWCOMP_RSVD48_LEN]; + struct hwcomp_desc *desc; +}; + +enum hwcomp_id { + HWCOMP_ID_RSVD, + HWCOMP_ID_ASIC, + HWCOMP_ID_NAND, + HWCOMP_ID_DRAM, + HWCOMP_ID_PMIC, + HWCOMP_ID_PCB, + HWCOMP_ID_CAP, + HWCOMP_ID_REG, + HWCOMP_ID_CASE, + HWCOMP_ID_SN, + HWCOMP_ID_COUNTRY, + HWCOMP_ID_HW_REV, + HWCOMP_ID_VENDOR = 0x8000, + HWCOMP_ID_MAX = 0xffff, +}; + +#define print_info_array(...) \ + do { \ + if (log_level >= LOG_INFO) \ + print_array(__VA_ARGS__); \ + } while (false) + +#define print_info_error(...) \ + do { \ + if (log_level >= LOG_INFO) \ + fprintf(stderr, __VA_ARGS__); \ + } while (false) + /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// @@ -3921,7 +3975,6 @@ static int get_c7_log_page(struct nvme_dev *dev, char *format) return ret; } - static int ocp_tcg_configuration_log(int argc, char **argv, struct command *cmd, struct plugin *plugin) { @@ -4221,3 +4274,187 @@ static int get_enable_ieee1667_silo(int argc, char **argv, struct command *cmd, return enable_ieee1667_silo_get(dev, cfg.sel, !argconfig_parse_seen(opts, "no-uuid")); } + +static const char *hwcomp_id_to_string(__u32 id) +{ + switch (id) { + case HWCOMP_ID_ASIC: + return "Controller ASIC component"; + case HWCOMP_ID_NAND: + return "NAND Component"; + case HWCOMP_ID_DRAM: + return "DRAM Component"; + case HWCOMP_ID_PMIC: + return "PMIC Component"; + case HWCOMP_ID_PCB: + return "PCB Component"; + case HWCOMP_ID_CAP: + return "capacitor component"; + case HWCOMP_ID_REG: + return "registor component"; + case HWCOMP_ID_CASE: + return "case component"; + case HWCOMP_ID_SN: + return "Device Serial Number"; + case HWCOMP_ID_COUNTRY: + return "Country of Origin"; + case HWCOMP_ID_HW_REV: + return "Global Device Hardware Revision"; + case HWCOMP_ID_VENDOR ... HWCOMP_ID_MAX: + return "Vendor Unique Component"; + case HWCOMP_ID_RSVD: + default: + break; + } + + return "Reserved"; +} + +static void print_hwcomp_log_normal(struct hwcomp_log *log) +{ + size_t date_lot_code_offset = sizeof(struct hwcomp_desc); + struct hwcomp_desc *desc; + __u64 date_lot_size; + __u64 add_info_size; + __u8 *add_info; + __u8 *date_lot_code; + __u64 desc_size; + + long double log_size = uint128_t_to_double(le128_to_cpu(log->size)) * sizeof(__le32); + + printf("Log Identifier: %02Xh\n", LID_HWCOMP); + printf("Log Page Version: 0x%x\n", le16_to_cpu(log->ver)); + print_array("Reserved2", log->rsvd2, ARRAY_SIZE(log->rsvd2)); + print_array("Log page GUID", log->guid, ARRAY_SIZE(log->guid)); + printf("Hardware Component Log Size: 0x%llx\n", (unsigned long long)log_size); + print_array("Reserved48", log->rsvd48, ARRAY_SIZE(log->rsvd48)); + printf("Component Descriptions\n"); + desc = log->desc; + while (log_size > 0) { + date_lot_size = le64_to_cpu(desc->date_lot_size) * sizeof(__le32); + date_lot_code = date_lot_size ? (__u8 *)desc + date_lot_code_offset : NULL; + add_info_size = le64_to_cpu(desc->add_info_size) * sizeof(__le32); + add_info = add_info_size ? date_lot_code ? date_lot_code + date_lot_size : + (__u8 *)desc + date_lot_code_offset : NULL; + printf(" Component: %s\n", hwcomp_id_to_string(le32_to_cpu(desc->id))); + printf(" Date/Lot Size: 0x%llx\n", date_lot_size); + printf(" Additional Information Size: 0x%llx\n", add_info_size); + printf(" Identifier: 0x%08x\n", le32_to_cpu(desc->id)); + printf(" Manufacture: 0x%016lx\n", le64_to_cpu(desc->mfg)); + printf(" Revision: 0x%016lx\n", le64_to_cpu(desc->rev)); + printf(" Manufacture Code: 0x%016lx\n", le64_to_cpu(desc->mfg_code)); + print_array(" Date/Lot Code", date_lot_code, date_lot_size); + print_array(" Additional Information", add_info, add_info_size); + desc_size = date_lot_code_offset + date_lot_size + add_info_size; + desc = (struct hwcomp_desc *)((__u8 *)desc + desc_size); + log_size -= desc_size; + } +} + +static void print_hwcomp_log_binary(struct hwcomp_log *log) +{ + long double desc_len = uint128_t_to_double(le128_to_cpu(log->size)) * sizeof(__le32); + + d_raw((unsigned char *)log, offsetof(struct hwcomp_log, desc) + desc_len); +} + +static int get_hwcomp_log_data(struct nvme_dev *dev, struct hwcomp_log *log) +{ + int ret = 0; + size_t desc_offset = offsetof(struct hwcomp_log, desc); + struct nvme_get_log_args args = { + .lpo = desc_offset, + .log = log->desc, + .args_size = sizeof(args), + .fd = dev_fd(dev), + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .lid = LID_HWCOMP, + .nsid = NVME_NSID_ALL, + }; + + ret = nvme_get_log_simple(dev_fd(dev), LID_HWCOMP, desc_offset, log); + if (ret) { + print_info_error("error: ocp: failed to get log simple (hwcomp: %02X, ret: %d)\n", + LID_HWCOMP, ret); + return ret; + } + + print_info("id: %02Xh\n", LID_HWCOMP); + print_info("version: %04Xh\n", log->ver); + print_info_array("guid", log->guid, ARRAY_SIZE(log->guid)); + print_info("size: %s\n", uint128_t_to_string(le128_to_cpu(log->size))); + + args.len = uint128_t_to_double(le128_to_cpu(log->size)) * sizeof(__le32); + log->desc = calloc(1, args.len); + if (!log->desc) { + fprintf(stderr, "error: ocp: calloc: %s\n", strerror(errno)); + return -1; + } + + ret = nvme_get_log_page(dev_fd(dev), NVME_LOG_PAGE_PDU_SIZE, &args); + if (ret) { + print_info_error("error: ocp: failed to get log page (hwcomp: %02X, ret: %d)\n", + LID_HWCOMP, ret); + return ret; + } + + return ret; +} + +static int get_hwcomp_log(struct nvme_dev *dev) +{ + _cleanup_free_ __u8 *desc = NULL; + + int ret; + nvme_print_flags_t fmt; + struct hwcomp_log log = { + .desc = (struct hwcomp_desc *)desc, + }; + + ret = validate_output_format(nvme_cfg.output_format, &fmt); + if (ret < 0) { + fprintf(stderr, "error: ocp: invalid output format\n"); + return ret; + } + + ret = get_hwcomp_log_data(dev, &log); + if (ret) { + print_info_error("error: ocp: failed get hwcomp log: %02X data, ret: %d\n", + LID_HWCOMP, ret); + return ret; + } + + switch (fmt) { + case NORMAL: + print_hwcomp_log_normal(&log); + break; + case BINARY: + print_hwcomp_log_binary(&log); + break; + default: + fprintf(stderr, "unhandled output format\n"); + break; + } + + return 0; +} + +static int ocp_hwcomp_log(int argc, char **argv, struct command *cmd, struct plugin *plugin) +{ + _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; + int ret = 0; + const char *desc = "retrieve hardware component log"; + + NVME_ARGS(opts); + + ret = parse_and_open(&dev, argc, argv, desc, opts); + if (ret) + return ret; + + ret = get_hwcomp_log(dev); + if (ret) + fprintf(stderr, "error: ocp: failed to get hwcomp log: %02X, ret: %d\n", LID_HWCOMP, + ret); + + return ret; +} diff --git a/plugins/ocp/ocp-nvme.h b/plugins/ocp/ocp-nvme.h index de23de01e0..9fafb5ebf5 100644 --- a/plugins/ocp/ocp-nvme.h +++ b/plugins/ocp/ocp-nvme.h @@ -40,6 +40,7 @@ PLUGIN(NAME("ocp", "OCP cloud SSD extensions", OCP_PLUGIN_VERSION), ENTRY("set-error-injection", "Inject error conditions", set_error_injection) ENTRY("get-enable-ieee1667-silo", "return set of enable IEEE1667 silo", get_enable_ieee1667_silo) + ENTRY("hardware-component-log", "retrieve hardware component log", ocp_hwcomp_log) ) ); From 52bf17053ab44dee18bc62908439771f81d510d0 Mon Sep 17 00:00:00 2001 From: Tokunori Ikegami Date: Sat, 31 Aug 2024 15:50:52 +0900 Subject: [PATCH 165/281] ocp: add hwcomp dummy definition This is for a debugging. Signed-off-by: Tokunori Ikegami --- plugins/ocp/ocp-nvme.c | 112 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 112 insertions(+) diff --git a/plugins/ocp/ocp-nvme.c b/plugins/ocp/ocp-nvme.c index e31687c485..eefd1110a9 100644 --- a/plugins/ocp/ocp-nvme.c +++ b/plugins/ocp/ocp-nvme.c @@ -40,6 +40,7 @@ #define GUID_LEN 16 #define HWCOMP_SIZE_LEN 16 #define HWCOMP_RSVD48_LEN 16 +//#define HWCOMP_DUMMY struct __packed hwcomp_desc { __le64 date_lot_size; @@ -88,6 +89,109 @@ enum hwcomp_id { fprintf(stderr, __VA_ARGS__); \ } while (false) +#ifdef HWCOMP_DUMMY +static __u8 hwcomp_dummy[] = { + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xdc, 0x57, 0x0f, 0x9f, 0xb9, 0x31, 0x6b, 0xb7, + 0xd0, 0x4e, 0xcd, 0x30, 0x1f, 0x82, 0xb6, 0xbc, + 0xb4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x20, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20 +}; +#endif /* HWCOMP_DUMMY */ + /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// @@ -4372,12 +4476,16 @@ static int get_hwcomp_log_data(struct nvme_dev *dev, struct hwcomp_log *log) .nsid = NVME_NSID_ALL, }; +#ifdef HWCOMP_DUMMY + memcpy(log, hwcomp_dummy, desc_offset); +#else /* HWCOMP_DUMMY */ ret = nvme_get_log_simple(dev_fd(dev), LID_HWCOMP, desc_offset, log); if (ret) { print_info_error("error: ocp: failed to get log simple (hwcomp: %02X, ret: %d)\n", LID_HWCOMP, ret); return ret; } +#endif /* HWCOMP_DUMMY */ print_info("id: %02Xh\n", LID_HWCOMP); print_info("version: %04Xh\n", log->ver); @@ -4391,12 +4499,16 @@ static int get_hwcomp_log_data(struct nvme_dev *dev, struct hwcomp_log *log) return -1; } +#ifdef HWCOMP_DUMMY + memcpy(log->desc, &hwcomp_dummy[desc_offset], args.len); +#else /* HWCOMP_DUMMY */ ret = nvme_get_log_page(dev_fd(dev), NVME_LOG_PAGE_PDU_SIZE, &args); if (ret) { print_info_error("error: ocp: failed to get log page (hwcomp: %02X, ret: %d)\n", LID_HWCOMP, ret); return ret; } +#endif /* HWCOMP_DUMMY */ return ret; } From 830f06402f1ec5a183a4c9c1abb9a173f5ab77fd Mon Sep 17 00:00:00 2001 From: Tokunori Ikegami Date: Sat, 31 Aug 2024 16:46:37 +0900 Subject: [PATCH 166/281] ocp: add hwcomp log command comp-id option This is to filter the component descriptions. Signed-off-by: Tokunori Ikegami --- plugins/ocp/ocp-nvme.c | 52 ++++++++++++++++++++++++++++++------------ 1 file changed, 38 insertions(+), 14 deletions(-) diff --git a/plugins/ocp/ocp-nvme.c b/plugins/ocp/ocp-nvme.c index eefd1110a9..d566f81b5c 100644 --- a/plugins/ocp/ocp-nvme.c +++ b/plugins/ocp/ocp-nvme.c @@ -4414,7 +4414,7 @@ static const char *hwcomp_id_to_string(__u32 id) return "Reserved"; } -static void print_hwcomp_log_normal(struct hwcomp_log *log) +static void print_hwcomp_log_normal(struct hwcomp_log *log, __u32 id) { size_t date_lot_code_offset = sizeof(struct hwcomp_desc); struct hwcomp_desc *desc; @@ -4440,15 +4440,19 @@ static void print_hwcomp_log_normal(struct hwcomp_log *log) add_info_size = le64_to_cpu(desc->add_info_size) * sizeof(__le32); add_info = add_info_size ? date_lot_code ? date_lot_code + date_lot_size : (__u8 *)desc + date_lot_code_offset : NULL; - printf(" Component: %s\n", hwcomp_id_to_string(le32_to_cpu(desc->id))); - printf(" Date/Lot Size: 0x%llx\n", date_lot_size); - printf(" Additional Information Size: 0x%llx\n", add_info_size); - printf(" Identifier: 0x%08x\n", le32_to_cpu(desc->id)); - printf(" Manufacture: 0x%016lx\n", le64_to_cpu(desc->mfg)); - printf(" Revision: 0x%016lx\n", le64_to_cpu(desc->rev)); - printf(" Manufacture Code: 0x%016lx\n", le64_to_cpu(desc->mfg_code)); - print_array(" Date/Lot Code", date_lot_code, date_lot_size); - print_array(" Additional Information", add_info, add_info_size); + + if (!id || id == le32_to_cpu(desc->id)) { + printf(" Component: %s\n", hwcomp_id_to_string(le32_to_cpu(desc->id))); + printf(" Date/Lot Size: 0x%llx\n", date_lot_size); + printf(" Additional Information Size: 0x%llx\n", add_info_size); + printf(" Identifier: 0x%08x\n", le32_to_cpu(desc->id)); + printf(" Manufacture: 0x%016lx\n", le64_to_cpu(desc->mfg)); + printf(" Revision: 0x%016lx\n", le64_to_cpu(desc->rev)); + printf(" Manufacture Code: 0x%016lx\n", le64_to_cpu(desc->mfg_code)); + print_array(" Date/Lot Code", date_lot_code, date_lot_size); + print_array(" Additional Information", add_info, add_info_size); + } + desc_size = date_lot_code_offset + date_lot_size + add_info_size; desc = (struct hwcomp_desc *)((__u8 *)desc + desc_size); log_size -= desc_size; @@ -4513,7 +4517,7 @@ static int get_hwcomp_log_data(struct nvme_dev *dev, struct hwcomp_log *log) return ret; } -static int get_hwcomp_log(struct nvme_dev *dev) +static int get_hwcomp_log(struct nvme_dev *dev, __u32 id) { _cleanup_free_ __u8 *desc = NULL; @@ -4538,7 +4542,7 @@ static int get_hwcomp_log(struct nvme_dev *dev) switch (fmt) { case NORMAL: - print_hwcomp_log_normal(&log); + print_hwcomp_log_normal(&log, id); break; case BINARY: print_hwcomp_log_binary(&log); @@ -4556,14 +4560,34 @@ static int ocp_hwcomp_log(int argc, char **argv, struct command *cmd, struct plu _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; int ret = 0; const char *desc = "retrieve hardware component log"; + struct config { + __u32 id; + } cfg = { 0 }; + const char *id_desc = "component identifier"; + + OPT_VALS(id) = { + VAL_LONG("asic", HWCOMP_ID_ASIC), + VAL_LONG("nand", HWCOMP_ID_NAND), + VAL_LONG("dram", HWCOMP_ID_DRAM), + VAL_LONG("pmic", HWCOMP_ID_PMIC), + VAL_LONG("pcb", HWCOMP_ID_PCB), + VAL_LONG("cap", HWCOMP_ID_CAP), + VAL_LONG("reg", HWCOMP_ID_REG), + VAL_LONG("case", HWCOMP_ID_CASE), + VAL_LONG("sn", HWCOMP_ID_SN), + VAL_LONG("country", HWCOMP_ID_COUNTRY), + VAL_LONG("hw-rev", HWCOMP_ID_HW_REV), + VAL_LONG("vendor", HWCOMP_ID_VENDOR), + VAL_END() + }; - NVME_ARGS(opts); + NVME_ARGS(opts, OPT_LONG("comp-id", 'i', &cfg.id, id_desc, id)); ret = parse_and_open(&dev, argc, argv, desc, opts); if (ret) return ret; - ret = get_hwcomp_log(dev); + ret = get_hwcomp_log(dev, cfg.id); if (ret) fprintf(stderr, "error: ocp: failed to get hwcomp log: %02X, ret: %d\n", LID_HWCOMP, ret); From 34a32696f16795c9e682526cc5203c55caea9787 Mon Sep 17 00:00:00 2001 From: Tokunori Ikegami Date: Sat, 31 Aug 2024 19:49:59 +0900 Subject: [PATCH 167/281] ocp: add hwcomp log command list option This is to list component descriptions. Signed-off-by: Tokunori Ikegami --- plugins/ocp/ocp-nvme.c | 47 ++++++++++++++++++++++++++---------------- 1 file changed, 29 insertions(+), 18 deletions(-) diff --git a/plugins/ocp/ocp-nvme.c b/plugins/ocp/ocp-nvme.c index d566f81b5c..cea49395b2 100644 --- a/plugins/ocp/ocp-nvme.c +++ b/plugins/ocp/ocp-nvme.c @@ -4414,7 +4414,25 @@ static const char *hwcomp_id_to_string(__u32 id) return "Reserved"; } -static void print_hwcomp_log_normal(struct hwcomp_log *log, __u32 id) +static void print_hwcomp_desc(struct hwcomp_desc *desc, __u64 date_lot_size, __u8 *date_lot_code, + __u64 add_info_size, __u8 *add_info, bool list) +{ + printf(" Component: %s\n", hwcomp_id_to_string(le32_to_cpu(desc->id))); + + if (list) + return; + + printf(" Date/Lot Size: 0x%llx\n", date_lot_size); + printf(" Additional Information Size: 0x%llx\n", add_info_size); + printf(" Identifier: 0x%08x\n", le32_to_cpu(desc->id)); + printf(" Manufacture: 0x%016lx\n", le64_to_cpu(desc->mfg)); + printf(" Revision: 0x%016lx\n", le64_to_cpu(desc->rev)); + printf(" Manufacture Code: 0x%016lx\n", le64_to_cpu(desc->mfg_code)); + print_array(" Date/Lot Code", date_lot_code, date_lot_size); + print_array(" Additional Information", add_info, add_info_size); +} + +static void print_hwcomp_log_normal(struct hwcomp_log *log, __u32 id, bool list) { size_t date_lot_code_offset = sizeof(struct hwcomp_desc); struct hwcomp_desc *desc; @@ -4440,19 +4458,9 @@ static void print_hwcomp_log_normal(struct hwcomp_log *log, __u32 id) add_info_size = le64_to_cpu(desc->add_info_size) * sizeof(__le32); add_info = add_info_size ? date_lot_code ? date_lot_code + date_lot_size : (__u8 *)desc + date_lot_code_offset : NULL; - - if (!id || id == le32_to_cpu(desc->id)) { - printf(" Component: %s\n", hwcomp_id_to_string(le32_to_cpu(desc->id))); - printf(" Date/Lot Size: 0x%llx\n", date_lot_size); - printf(" Additional Information Size: 0x%llx\n", add_info_size); - printf(" Identifier: 0x%08x\n", le32_to_cpu(desc->id)); - printf(" Manufacture: 0x%016lx\n", le64_to_cpu(desc->mfg)); - printf(" Revision: 0x%016lx\n", le64_to_cpu(desc->rev)); - printf(" Manufacture Code: 0x%016lx\n", le64_to_cpu(desc->mfg_code)); - print_array(" Date/Lot Code", date_lot_code, date_lot_size); - print_array(" Additional Information", add_info, add_info_size); - } - + if (!id || id == le32_to_cpu(desc->id)) + print_hwcomp_desc(desc, date_lot_size, date_lot_code, add_info_size, + add_info, list); desc_size = date_lot_code_offset + date_lot_size + add_info_size; desc = (struct hwcomp_desc *)((__u8 *)desc + desc_size); log_size -= desc_size; @@ -4517,7 +4525,7 @@ static int get_hwcomp_log_data(struct nvme_dev *dev, struct hwcomp_log *log) return ret; } -static int get_hwcomp_log(struct nvme_dev *dev, __u32 id) +static int get_hwcomp_log(struct nvme_dev *dev, __u32 id, bool list) { _cleanup_free_ __u8 *desc = NULL; @@ -4542,7 +4550,7 @@ static int get_hwcomp_log(struct nvme_dev *dev, __u32 id) switch (fmt) { case NORMAL: - print_hwcomp_log_normal(&log, id); + print_hwcomp_log_normal(&log, id, list); break; case BINARY: print_hwcomp_log_binary(&log); @@ -4562,8 +4570,10 @@ static int ocp_hwcomp_log(int argc, char **argv, struct command *cmd, struct plu const char *desc = "retrieve hardware component log"; struct config { __u32 id; + bool list; } cfg = { 0 }; const char *id_desc = "component identifier"; + const char *list_desc = "list component descriptions"; OPT_VALS(id) = { VAL_LONG("asic", HWCOMP_ID_ASIC), @@ -4581,13 +4591,14 @@ static int ocp_hwcomp_log(int argc, char **argv, struct command *cmd, struct plu VAL_END() }; - NVME_ARGS(opts, OPT_LONG("comp-id", 'i', &cfg.id, id_desc, id)); + NVME_ARGS(opts, OPT_LONG("comp-id", 'i', &cfg.id, id_desc, id), + OPT_FLAG("list", 'l', &cfg.list, list_desc)); ret = parse_and_open(&dev, argc, argv, desc, opts); if (ret) return ret; - ret = get_hwcomp_log(dev, cfg.id); + ret = get_hwcomp_log(dev, cfg.id, cfg.list); if (ret) fprintf(stderr, "error: ocp: failed to get hwcomp log: %02X, ret: %d\n", LID_HWCOMP, ret); From 41d57225c540a1e701c2142b014ff1d678e8cb91 Mon Sep 17 00:00:00 2001 From: Tokunori Ikegami Date: Sun, 1 Sep 2024 17:29:03 +0900 Subject: [PATCH 168/281] ocp: add hwcomp log json output Add struct hwcomp_desc_entry and fix id option value type error. Signed-off-by: Tokunori Ikegami --- plugins/ocp/ocp-nvme.c | 139 +++++++++++++++++++++++++++++++---------- 1 file changed, 107 insertions(+), 32 deletions(-) diff --git a/plugins/ocp/ocp-nvme.c b/plugins/ocp/ocp-nvme.c index cea49395b2..9366e9b886 100644 --- a/plugins/ocp/ocp-nvme.c +++ b/plugins/ocp/ocp-nvme.c @@ -60,6 +60,15 @@ struct __packed hwcomp_log { struct hwcomp_desc *desc; }; +struct hwcomp_desc_entry { + struct hwcomp_desc *desc; + __u64 date_lot_size; + __u8 *date_lot_code; + __u64 add_info_size; + __u8 *add_info; + __u64 desc_size; +}; + enum hwcomp_id { HWCOMP_ID_RSVD, HWCOMP_ID_ASIC, @@ -4414,59 +4423,122 @@ static const char *hwcomp_id_to_string(__u32 id) return "Reserved"; } -static void print_hwcomp_desc(struct hwcomp_desc *desc, __u64 date_lot_size, __u8 *date_lot_code, - __u64 add_info_size, __u8 *add_info, bool list) +static void print_hwcomp_desc(struct hwcomp_desc_entry *e, bool list, int num) { - printf(" Component: %s\n", hwcomp_id_to_string(le32_to_cpu(desc->id))); + printf(" Component %d: %s\n", num, hwcomp_id_to_string(le32_to_cpu(e->desc->id))); if (list) return; - printf(" Date/Lot Size: 0x%llx\n", date_lot_size); - printf(" Additional Information Size: 0x%llx\n", add_info_size); - printf(" Identifier: 0x%08x\n", le32_to_cpu(desc->id)); - printf(" Manufacture: 0x%016lx\n", le64_to_cpu(desc->mfg)); - printf(" Revision: 0x%016lx\n", le64_to_cpu(desc->rev)); - printf(" Manufacture Code: 0x%016lx\n", le64_to_cpu(desc->mfg_code)); - print_array(" Date/Lot Code", date_lot_code, date_lot_size); - print_array(" Additional Information", add_info, add_info_size); + printf(" Date/Lot Size: 0x%"PRIx64"\n", (uint64_t)e->date_lot_size); + printf(" Additional Information Size: 0x%"PRIx64"\n", (uint64_t)e->add_info_size); + printf(" Identifier: 0x%08x\n", le32_to_cpu(e->desc->id)); + printf(" Manufacture: 0x%016"PRIx64"\n", le64_to_cpu(e->desc->mfg)); + printf(" Revision: 0x%016"PRIx64"\n", le64_to_cpu(e->desc->rev)); + printf(" Manufacture Code: 0x%016"PRIx64"\n", le64_to_cpu(e->desc->mfg_code)); + print_array(" Date/Lot Code", e->date_lot_code, e->date_lot_size); + print_array(" Additional Information", e->add_info, e->add_info_size); } static void print_hwcomp_log_normal(struct hwcomp_log *log, __u32 id, bool list) { size_t date_lot_code_offset = sizeof(struct hwcomp_desc); - struct hwcomp_desc *desc; - __u64 date_lot_size; - __u64 add_info_size; - __u8 *add_info; - __u8 *date_lot_code; - __u64 desc_size; + int num = 1; + struct hwcomp_desc_entry e = { log->desc }; long double log_size = uint128_t_to_double(le128_to_cpu(log->size)) * sizeof(__le32); - printf("Log Identifier: %02Xh\n", LID_HWCOMP); + printf("Log Identifier: 0x%02xh\n", LID_HWCOMP); printf("Log Page Version: 0x%x\n", le16_to_cpu(log->ver)); print_array("Reserved2", log->rsvd2, ARRAY_SIZE(log->rsvd2)); print_array("Log page GUID", log->guid, ARRAY_SIZE(log->guid)); - printf("Hardware Component Log Size: 0x%llx\n", (unsigned long long)log_size); + printf("Hardware Component Log Size: 0x%"PRIx64"\n", (uint64_t)log_size); print_array("Reserved48", log->rsvd48, ARRAY_SIZE(log->rsvd48)); printf("Component Descriptions\n"); - desc = log->desc; while (log_size > 0) { - date_lot_size = le64_to_cpu(desc->date_lot_size) * sizeof(__le32); - date_lot_code = date_lot_size ? (__u8 *)desc + date_lot_code_offset : NULL; - add_info_size = le64_to_cpu(desc->add_info_size) * sizeof(__le32); - add_info = add_info_size ? date_lot_code ? date_lot_code + date_lot_size : - (__u8 *)desc + date_lot_code_offset : NULL; - if (!id || id == le32_to_cpu(desc->id)) - print_hwcomp_desc(desc, date_lot_size, date_lot_code, add_info_size, - add_info, list); - desc_size = date_lot_code_offset + date_lot_size + add_info_size; - desc = (struct hwcomp_desc *)((__u8 *)desc + desc_size); - log_size -= desc_size; + e.date_lot_size = le64_to_cpu(e.desc->date_lot_size) * sizeof(__le32); + e.date_lot_code = e.date_lot_size ? (__u8 *)e.desc + date_lot_code_offset : NULL; + e.add_info_size = le64_to_cpu(e.desc->add_info_size) * sizeof(__le32); + e.add_info = e.add_info_size ? e.date_lot_code ? e.date_lot_code + e.date_lot_size : + (__u8 *)e.desc + date_lot_code_offset : NULL; + if (!id || id == le32_to_cpu(e.desc->id)) + print_hwcomp_desc(&e, list, num++); + e.desc_size = date_lot_code_offset + e.date_lot_size + e.add_info_size; + e.desc = (struct hwcomp_desc *)((__u8 *)e.desc + e.desc_size); + log_size -= e.desc_size; + } +} + +static void print_hwcomp_desc_json(struct hwcomp_desc_entry *e, struct json_object *r) +{ + obj_add_str(r, "Description", hwcomp_id_to_string(le32_to_cpu(e->desc->id))); + obj_add_nprix64(r, "Date/Lot Size", e->date_lot_size); + obj_add_nprix64(r, "Additional Information Size", e->add_info_size); + obj_add_uint_0nx(r, "Identifier", le32_to_cpu(e->desc->id), 8); + obj_add_0nprix64(r, "Manufacture", le64_to_cpu(e->desc->mfg), 16); + obj_add_0nprix64(r, "Revision", le64_to_cpu(e->desc->rev), 16); + obj_add_0nprix64(r, "Manufacture Code", le64_to_cpu(e->desc->mfg_code), 16); + obj_add_byte_array(r, "Date/Lot Code", e->date_lot_code, e->date_lot_size); + obj_add_byte_array(r, "Additional Information", e->add_info, e->add_info_size); +} + +static void print_hwcomp_desc_list_json(struct json_object *r, struct hwcomp_desc_entry *e, + bool list, int num) +{ + _cleanup_free_ char *k = NULL; + + if (asprintf(&k, "Component %d", num) < 0) + return; + + if (list) { + obj_add_str(r, k, hwcomp_id_to_string(le32_to_cpu(e->desc->id))); + return; + } + + print_hwcomp_desc_json(e, obj_create_array_obj(r, k)); +} + +static void print_hwcomp_descs_json(struct hwcomp_desc *desc, long double log_size, __u32 id, + bool list, struct json_object *r) +{ + size_t date_lot_code_offset = sizeof(struct hwcomp_desc); + struct hwcomp_desc_entry e = { desc }; + int num = 1; + + while (log_size > 0) { + e.date_lot_size = le64_to_cpu(e.desc->date_lot_size) * sizeof(__le32); + e.date_lot_code = e.date_lot_size ? + (__u8 *)e.desc + date_lot_code_offset : NULL; + e.add_info_size = le64_to_cpu(e.desc->add_info_size) * sizeof(__le32); + e.add_info = e.add_info_size ? e.date_lot_code ? + e.date_lot_code + e.date_lot_size : + (__u8 *)e.desc + date_lot_code_offset : NULL; + if (!id || id == le32_to_cpu(e.desc->id)) + print_hwcomp_desc_list_json(r, &e, list, num++); + e.desc_size = date_lot_code_offset + e.date_lot_size + e.add_info_size; + e.desc = (struct hwcomp_desc *)((__u8 *)e.desc + e.desc_size); + log_size -= e.desc_size; } } +static void print_hwcomp_log_json(struct hwcomp_log *log, __u32 id, bool list) +{ + struct json_object *r = json_create_object(); + + long double log_size = uint128_t_to_double(le128_to_cpu(log->size)) * sizeof(__le32); + + obj_add_uint_02x(r, "Log Identifier", LID_HWCOMP); + obj_add_uint_0x(r, "Log Page Version", le16_to_cpu(log->ver)); + obj_add_byte_array(r, "Reserved2", log->rsvd2, ARRAY_SIZE(log->rsvd2)); + obj_add_byte_array(r, "Log page GUID", log->guid, ARRAY_SIZE(log->guid)); + obj_add_nprix64(r, "Hardware Component Log Size", (unsigned long long)log_size); + obj_add_byte_array(r, "Reserved48", log->rsvd48, ARRAY_SIZE(log->rsvd48)); + print_hwcomp_descs_json(log->desc, log_size, id, list, + obj_create_array_obj(r, "Component Descriptions")); + + json_print(r); +} + static void print_hwcomp_log_binary(struct hwcomp_log *log) { long double desc_len = uint128_t_to_double(le128_to_cpu(log->size)) * sizeof(__le32); @@ -4552,6 +4624,9 @@ static int get_hwcomp_log(struct nvme_dev *dev, __u32 id, bool list) case NORMAL: print_hwcomp_log_normal(&log, id, list); break; + case JSON: + print_hwcomp_log_json(&log, id, list); + break; case BINARY: print_hwcomp_log_binary(&log); break; @@ -4569,7 +4644,7 @@ static int ocp_hwcomp_log(int argc, char **argv, struct command *cmd, struct plu int ret = 0; const char *desc = "retrieve hardware component log"; struct config { - __u32 id; + __u64 id; bool list; } cfg = { 0 }; const char *id_desc = "component identifier"; From 0a88ebeae47f1f204a7f498adc0ebaf759e2bce8 Mon Sep 17 00:00:00 2001 From: Tokunori Ikegami Date: Sat, 7 Sep 2024 17:00:35 +0900 Subject: [PATCH 169/281] doc: add ocp hardware-component-log command The command lists component descriptions. Signed-off-by: Tokunori Ikegami --- .../nvme-ocp-hardware-component-log.txt | 85 +++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 Documentation/nvme-ocp-hardware-component-log.txt diff --git a/Documentation/nvme-ocp-hardware-component-log.txt b/Documentation/nvme-ocp-hardware-component-log.txt new file mode 100644 index 0000000000..6700e76794 --- /dev/null +++ b/Documentation/nvme-ocp-hardware-component-log.txt @@ -0,0 +1,85 @@ +nvme-ocp-hardware-component-log(1) +================================== + +NAME +---- +nvme-ocp-hardware-component-log - retrieve hardware component log + +SYNOPSIS +-------- +[verse] +'nvme ocp hardware-component-log' [--comp-id= | -i ] + [--list | -l] [--verbose | -v] + [--output-format= | -o ] [--timeout=] + +DESCRIPTION +----------- +Retrieve hardware component log. + +The parameter is mandatory NVMe character device (ex: /dev/nvme0). + +This will only work on OCP compliant devices supporting this feature. +Results for any other device are undefined. + +On success it returns 0, error code otherwise. + +OPTIONS +------- +-i :: +--comp-id=:: + component identifier ++ +[] +|================= +|Value|Definition +|0x0000| Reserved +|0x0001 \| 'asic'| Controller ASIC component +|0x0002 \| 'nand'| NAND Component +|0x0003 \| 'dram'| DRAM Component +|0x0004 \| 'pmic'| PMIC Component +|0x0005 \| 'pcb'| PCB Component +|0x0006 \| 'cap'| capacitor component +|0x0007 \| 'reg'| registor component +|0x0008 \| 'case'| case component +|0x0009 \| 'sn'| Device Serial Number +|0x000A \| 'country'| Country of Origin +|0x000B \| 'hw-rev'| Global Device Hardware Revision +|0x000C-0x7FFF| Reserved +|0x8000 \| 'vendor'| Vendor Unique Component +|0x8001-0xFFFF| Vendor Unique Component +|================= + +-l:: +--list:: + list component descriptions + +-v:: +--verbose:: + Increase the information detail in the output. + +-o :: +--output-format=:: + Set the reporting format to 'normal', 'json' or 'binary'. Only one + output format can be used at a time. + +-t :: +--timeout=:: + Override default timeout value. In milliseconds. + +EXAMPLES +-------- +* Has the program issue a set-error-injection ++ +------------ +# nvme ocp hardware-component-log /dev/nvme0 +------------ + +* Has the program issue a set-error-injection with the asic component list. ++ +------------ +# nvme ocp hardware-component-log /dev/nvme0 -i asic -l +------------ + +NVME +---- +Part of the nvme-user suite. From 0c792f074dcf8cd894d08623a1d268f5259a316c Mon Sep 17 00:00:00 2001 From: Tokunori Ikegami Date: Sat, 7 Sep 2024 20:22:50 +0900 Subject: [PATCH 170/281] completions: add ocp hardware-component-log command The command lists component descriptions. Signed-off-by: Tokunori Ikegami --- completions/_nvme | 19 +++++++++++++++++++ completions/bash-nvme-completion.sh | 7 ++++++- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/completions/_nvme b/completions/_nvme index 6e80dd31b8..954b5c23b6 100644 --- a/completions/_nvme +++ b/completions/_nvme @@ -359,6 +359,24 @@ _nvme () { _arguments '*:: :->subcmds' _describe -t commands "nvme ocp set-error-injection options" _set_error_injection ;; + (hardware-component-log) + local _hardware_component_log + _hardware_component_log=( + /dev/nvme':supply a device to use (required)' + --comp-id=':component identifier' + -i':alias for --comp-id' + --list':list component descriptions' + -v':alias for --list' + --verbose':Increase the information detail in the output.' + -v':alias for --verbose' + --output-format=':Output format: normal|json|binary' + -o ':alias for --output-format' + --timeout=':value for timeout' + -t ':alias for --timeout' + ) + _arguments '*:: :->subcmds' + _describe -t commands "nvme ocp hardware-component-log options" _hardware_component_log + ;; (*) _files ;; @@ -2583,6 +2601,7 @@ _nvme () { tcg-configuration-log':tcg configuration log' get-error-injection':get error injection' set-error-injection':set error injection' + hardware-component-log':retrieve hardware component log' ) _arguments '*:: :->subcmds' _describe -t commands "nvme ocp options" _ocp diff --git a/completions/bash-nvme-completion.sh b/completions/bash-nvme-completion.sh index 10f3ccde93..b7035093ff 100644 --- a/completions/bash-nvme-completion.sh +++ b/completions/bash-nvme-completion.sh @@ -1523,6 +1523,10 @@ plugin_ocp_opts () { opts+=" --data= -d --number= -n --no-uuid -N --type= -t \ --nrtdp= -r --verbose -v --output-format -o --timeout=" ;; + "hardware-component-log") + opts+=" --comp-id= -i --list -l --verbose -v \ + --output-format -o --timeout= -t" + ;; "help") opts+=$NO_OPTS ;; @@ -1602,7 +1606,8 @@ _nvme_subcmds () { set-dssd-power-state-feature get-dssd-power-state-feature \ telemetry-string-log set-telemetry-profile \ set-dssd-async-event-config get-dssd-async-event-config \ - get-error-injection set-error-injection" + get-error-injection set-error-injection \ + hardware-component-log" ) # Associative array mapping plugins to corresponding option completions From 0a5560775f6b47204ab2ef5c2cd74423e8e87cfc Mon Sep 17 00:00:00 2001 From: Tokunori Ikegami Date: Mon, 16 Sep 2024 20:59:30 +0900 Subject: [PATCH 171/281] ocp: split ocp-hwcomp log This is to reduce the ocp-nvme.c code size. Signed-off-by: Tokunori Ikegami --- plugins/ocp/meson.build | 1 + plugins/ocp/ocp-hardware-component-log.c | 469 +++++++++++++++++++++++ plugins/ocp/ocp-hardware-component-log.h | 12 + plugins/ocp/ocp-nvme.c | 459 +--------------------- plugins/ocp/ocp-nvme.h | 2 +- 5 files changed, 486 insertions(+), 457 deletions(-) create mode 100644 plugins/ocp/ocp-hardware-component-log.c create mode 100644 plugins/ocp/ocp-hardware-component-log.h diff --git a/plugins/ocp/meson.build b/plugins/ocp/meson.build index 7835444493..6430c101d0 100644 --- a/plugins/ocp/meson.build +++ b/plugins/ocp/meson.build @@ -5,5 +5,6 @@ sources += [ 'plugins/ocp/ocp-smart-extended-log.c', 'plugins/ocp/ocp-fw-activation-history.c', 'plugins/ocp/ocp-telemetry-decode.c', + 'plugins/ocp/ocp-hardware-component-log.c', ] diff --git a/plugins/ocp/ocp-hardware-component-log.c b/plugins/ocp/ocp-hardware-component-log.c new file mode 100644 index 0000000000..8d638c97ce --- /dev/null +++ b/plugins/ocp/ocp-hardware-component-log.c @@ -0,0 +1,469 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Copyright (c) 2024 + */ +#include +#include + +#include "common.h" +#include "util/logging.h" +#include "nvme-print.h" + +#define LID_HWCOMP 0xc6 +#define HWCOMP_RSVD2_LEN 14 +#define GUID_LEN 16 +#define HWCOMP_SIZE_LEN 16 +#define HWCOMP_RSVD48_LEN 16 +//#define HWCOMP_DUMMY + +struct __packed hwcomp_desc { + __le64 date_lot_size; + __le64 add_info_size; + __le32 id; + __le64 mfg; + __le64 rev; + __le64 mfg_code; +}; + +struct __packed hwcomp_log { + __le16 ver; + __u8 rsvd2[HWCOMP_RSVD2_LEN]; + __u8 guid[GUID_LEN]; + __u8 size[HWCOMP_SIZE_LEN]; + __u8 rsvd48[HWCOMP_RSVD48_LEN]; + struct hwcomp_desc *desc; +}; + +struct hwcomp_desc_entry { + struct hwcomp_desc *desc; + __u64 date_lot_size; + __u8 *date_lot_code; + __u64 add_info_size; + __u8 *add_info; + __u64 desc_size; +}; + +enum hwcomp_id { + HWCOMP_ID_RSVD, + HWCOMP_ID_ASIC, + HWCOMP_ID_NAND, + HWCOMP_ID_DRAM, + HWCOMP_ID_PMIC, + HWCOMP_ID_PCB, + HWCOMP_ID_CAP, + HWCOMP_ID_REG, + HWCOMP_ID_CASE, + HWCOMP_ID_SN, + HWCOMP_ID_COUNTRY, + HWCOMP_ID_HW_REV, + HWCOMP_ID_VENDOR = 0x8000, + HWCOMP_ID_MAX = 0xffff, +}; + +#define print_info_array(...) \ + do { \ + if (log_level >= LOG_INFO) \ + print_array(__VA_ARGS__); \ + } while (false) + +#define print_info_error(...) \ + do { \ + if (log_level >= LOG_INFO) \ + fprintf(stderr, __VA_ARGS__); \ + } while (false) + +#ifdef HWCOMP_DUMMY +static __u8 hwcomp_dummy[] = { + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xdc, 0x57, 0x0f, 0x9f, 0xb9, 0x31, 0x6b, 0xb7, + 0xd0, 0x4e, 0xcd, 0x30, 0x1f, 0x82, 0xb6, 0xbc, + 0xb4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x20, 0x20, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20 +}; +#endif /* HWCOMP_DUMMY */ + +static const char *hwcomp_id_to_string(__u32 id) +{ + switch (id) { + case HWCOMP_ID_ASIC: + return "Controller ASIC component"; + case HWCOMP_ID_NAND: + return "NAND Component"; + case HWCOMP_ID_DRAM: + return "DRAM Component"; + case HWCOMP_ID_PMIC: + return "PMIC Component"; + case HWCOMP_ID_PCB: + return "PCB Component"; + case HWCOMP_ID_CAP: + return "capacitor component"; + case HWCOMP_ID_REG: + return "registor component"; + case HWCOMP_ID_CASE: + return "case component"; + case HWCOMP_ID_SN: + return "Device Serial Number"; + case HWCOMP_ID_COUNTRY: + return "Country of Origin"; + case HWCOMP_ID_HW_REV: + return "Global Device Hardware Revision"; + case HWCOMP_ID_VENDOR ... HWCOMP_ID_MAX: + return "Vendor Unique Component"; + case HWCOMP_ID_RSVD: + default: + break; + } + + return "Reserved"; +} + +static void print_hwcomp_desc(struct hwcomp_desc_entry *e, bool list, int num) +{ + printf(" Component %d: %s\n", num, hwcomp_id_to_string(le32_to_cpu(e->desc->id))); + + if (list) + return; + + printf(" Date/Lot Size: 0x%"PRIx64"\n", (uint64_t)e->date_lot_size); + printf(" Additional Information Size: 0x%"PRIx64"\n", (uint64_t)e->add_info_size); + printf(" Identifier: 0x%08x\n", le32_to_cpu(e->desc->id)); + printf(" Manufacture: 0x%016"PRIx64"\n", le64_to_cpu(e->desc->mfg)); + printf(" Revision: 0x%016"PRIx64"\n", le64_to_cpu(e->desc->rev)); + printf(" Manufacture Code: 0x%016"PRIx64"\n", le64_to_cpu(e->desc->mfg_code)); + print_array(" Date/Lot Code", e->date_lot_code, e->date_lot_size); + print_array(" Additional Information", e->add_info, e->add_info_size); +} + +static void print_hwcomp_log_normal(struct hwcomp_log *log, __u32 id, bool list) +{ + size_t date_lot_code_offset = sizeof(struct hwcomp_desc); + int num = 1; + struct hwcomp_desc_entry e = { log->desc }; + + long double log_size = uint128_t_to_double(le128_to_cpu(log->size)) * sizeof(__le32); + + printf("Log Identifier: 0x%02xh\n", LID_HWCOMP); + printf("Log Page Version: 0x%x\n", le16_to_cpu(log->ver)); + print_array("Reserved2", log->rsvd2, ARRAY_SIZE(log->rsvd2)); + print_array("Log page GUID", log->guid, ARRAY_SIZE(log->guid)); + printf("Hardware Component Log Size: 0x%"PRIx64"\n", (uint64_t)log_size); + print_array("Reserved48", log->rsvd48, ARRAY_SIZE(log->rsvd48)); + printf("Component Descriptions\n"); + while (log_size > 0) { + e.date_lot_size = le64_to_cpu(e.desc->date_lot_size) * sizeof(__le32); + e.date_lot_code = e.date_lot_size ? (__u8 *)e.desc + date_lot_code_offset : NULL; + e.add_info_size = le64_to_cpu(e.desc->add_info_size) * sizeof(__le32); + e.add_info = e.add_info_size ? e.date_lot_code ? e.date_lot_code + e.date_lot_size : + (__u8 *)e.desc + date_lot_code_offset : NULL; + if (!id || id == le32_to_cpu(e.desc->id)) + print_hwcomp_desc(&e, list, num++); + e.desc_size = date_lot_code_offset + e.date_lot_size + e.add_info_size; + e.desc = (struct hwcomp_desc *)((__u8 *)e.desc + e.desc_size); + log_size -= e.desc_size; + } +} + +static void print_hwcomp_desc_json(struct hwcomp_desc_entry *e, struct json_object *r) +{ + obj_add_str(r, "Description", hwcomp_id_to_string(le32_to_cpu(e->desc->id))); + obj_add_nprix64(r, "Date/Lot Size", e->date_lot_size); + obj_add_nprix64(r, "Additional Information Size", e->add_info_size); + obj_add_uint_0nx(r, "Identifier", le32_to_cpu(e->desc->id), 8); + obj_add_0nprix64(r, "Manufacture", le64_to_cpu(e->desc->mfg), 16); + obj_add_0nprix64(r, "Revision", le64_to_cpu(e->desc->rev), 16); + obj_add_0nprix64(r, "Manufacture Code", le64_to_cpu(e->desc->mfg_code), 16); + obj_add_byte_array(r, "Date/Lot Code", e->date_lot_code, e->date_lot_size); + obj_add_byte_array(r, "Additional Information", e->add_info, e->add_info_size); +} + +static void print_hwcomp_desc_list_json(struct json_object *r, struct hwcomp_desc_entry *e, + bool list, int num) +{ + _cleanup_free_ char *k = NULL; + + if (asprintf(&k, "Component %d", num) < 0) + return; + + if (list) { + obj_add_str(r, k, hwcomp_id_to_string(le32_to_cpu(e->desc->id))); + return; + } + + print_hwcomp_desc_json(e, obj_create_array_obj(r, k)); +} + +static void print_hwcomp_descs_json(struct hwcomp_desc *desc, long double log_size, __u32 id, + bool list, struct json_object *r) +{ + size_t date_lot_code_offset = sizeof(struct hwcomp_desc); + struct hwcomp_desc_entry e = { desc }; + int num = 1; + + while (log_size > 0) { + e.date_lot_size = le64_to_cpu(e.desc->date_lot_size) * sizeof(__le32); + e.date_lot_code = e.date_lot_size ? + (__u8 *)e.desc + date_lot_code_offset : NULL; + e.add_info_size = le64_to_cpu(e.desc->add_info_size) * sizeof(__le32); + e.add_info = e.add_info_size ? e.date_lot_code ? + e.date_lot_code + e.date_lot_size : + (__u8 *)e.desc + date_lot_code_offset : NULL; + if (!id || id == le32_to_cpu(e.desc->id)) + print_hwcomp_desc_list_json(r, &e, list, num++); + e.desc_size = date_lot_code_offset + e.date_lot_size + e.add_info_size; + e.desc = (struct hwcomp_desc *)((__u8 *)e.desc + e.desc_size); + log_size -= e.desc_size; + } +} + +static void print_hwcomp_log_json(struct hwcomp_log *log, __u32 id, bool list) +{ + struct json_object *r = json_create_object(); + + long double log_size = uint128_t_to_double(le128_to_cpu(log->size)) * sizeof(__le32); + + obj_add_uint_02x(r, "Log Identifier", LID_HWCOMP); + obj_add_uint_0x(r, "Log Page Version", le16_to_cpu(log->ver)); + obj_add_byte_array(r, "Reserved2", log->rsvd2, ARRAY_SIZE(log->rsvd2)); + obj_add_byte_array(r, "Log page GUID", log->guid, ARRAY_SIZE(log->guid)); + obj_add_nprix64(r, "Hardware Component Log Size", (unsigned long long)log_size); + obj_add_byte_array(r, "Reserved48", log->rsvd48, ARRAY_SIZE(log->rsvd48)); + print_hwcomp_descs_json(log->desc, log_size, id, list, + obj_create_array_obj(r, "Component Descriptions")); + + json_print(r); +} + +static void print_hwcomp_log_binary(struct hwcomp_log *log) +{ + long double desc_len = uint128_t_to_double(le128_to_cpu(log->size)) * sizeof(__le32); + + d_raw((unsigned char *)log, offsetof(struct hwcomp_log, desc) + desc_len); +} + +static int get_hwcomp_log_data(struct nvme_dev *dev, struct hwcomp_log *log) +{ + int ret = 0; + size_t desc_offset = offsetof(struct hwcomp_log, desc); + struct nvme_get_log_args args = { + .lpo = desc_offset, + .log = log->desc, + .args_size = sizeof(args), + .fd = dev_fd(dev), + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .lid = LID_HWCOMP, + .nsid = NVME_NSID_ALL, + }; + +#ifdef HWCOMP_DUMMY + memcpy(log, hwcomp_dummy, desc_offset); +#else /* HWCOMP_DUMMY */ + ret = nvme_get_log_simple(dev_fd(dev), LID_HWCOMP, desc_offset, log); + if (ret) { + print_info_error("error: ocp: failed to get log simple (hwcomp: %02X, ret: %d)\n", + LID_HWCOMP, ret); + return ret; + } +#endif /* HWCOMP_DUMMY */ + + print_info("id: %02Xh\n", LID_HWCOMP); + print_info("version: %04Xh\n", log->ver); + print_info_array("guid", log->guid, ARRAY_SIZE(log->guid)); + print_info("size: %s\n", uint128_t_to_string(le128_to_cpu(log->size))); + + args.len = uint128_t_to_double(le128_to_cpu(log->size)) * sizeof(__le32); + log->desc = calloc(1, args.len); + if (!log->desc) { + fprintf(stderr, "error: ocp: calloc: %s\n", strerror(errno)); + return -1; + } + +#ifdef HWCOMP_DUMMY + memcpy(log->desc, &hwcomp_dummy[desc_offset], args.len); +#else /* HWCOMP_DUMMY */ + ret = nvme_get_log_page(dev_fd(dev), NVME_LOG_PAGE_PDU_SIZE, &args); + if (ret) { + print_info_error("error: ocp: failed to get log page (hwcomp: %02X, ret: %d)\n", + LID_HWCOMP, ret); + return ret; + } +#endif /* HWCOMP_DUMMY */ + + return ret; +} + +static int get_hwcomp_log(struct nvme_dev *dev, __u32 id, bool list) +{ + _cleanup_free_ __u8 *desc = NULL; + + int ret; + nvme_print_flags_t fmt; + struct hwcomp_log log = { + .desc = (struct hwcomp_desc *)desc, + }; + + ret = validate_output_format(nvme_cfg.output_format, &fmt); + if (ret < 0) { + fprintf(stderr, "error: ocp: invalid output format\n"); + return ret; + } + + ret = get_hwcomp_log_data(dev, &log); + if (ret) { + print_info_error("error: ocp: failed get hwcomp log: %02X data, ret: %d\n", + LID_HWCOMP, ret); + return ret; + } + + switch (fmt) { + case NORMAL: + print_hwcomp_log_normal(&log, id, list); + break; + case JSON: + print_hwcomp_log_json(&log, id, list); + break; + case BINARY: + print_hwcomp_log_binary(&log); + break; + default: + fprintf(stderr, "unhandled output format\n"); + break; + } + + return 0; +} + +int ocp_hwcomp_log(int argc, char **argv, struct command *cmd, struct plugin *plugin) +{ + _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; + int ret = 0; + const char *desc = "retrieve hardware component log"; + struct config { + __u64 id; + bool list; + } cfg = { 0 }; + const char *id_desc = "component identifier"; + const char *list_desc = "list component descriptions"; + + OPT_VALS(id) = { + VAL_LONG("asic", HWCOMP_ID_ASIC), + VAL_LONG("nand", HWCOMP_ID_NAND), + VAL_LONG("dram", HWCOMP_ID_DRAM), + VAL_LONG("pmic", HWCOMP_ID_PMIC), + VAL_LONG("pcb", HWCOMP_ID_PCB), + VAL_LONG("cap", HWCOMP_ID_CAP), + VAL_LONG("reg", HWCOMP_ID_REG), + VAL_LONG("case", HWCOMP_ID_CASE), + VAL_LONG("sn", HWCOMP_ID_SN), + VAL_LONG("country", HWCOMP_ID_COUNTRY), + VAL_LONG("hw-rev", HWCOMP_ID_HW_REV), + VAL_LONG("vendor", HWCOMP_ID_VENDOR), + VAL_END() + }; + + NVME_ARGS(opts, OPT_LONG("comp-id", 'i', &cfg.id, id_desc, id), + OPT_FLAG("list", 'l', &cfg.list, list_desc)); + + ret = parse_and_open(&dev, argc, argv, desc, opts); + if (ret) + return ret; + + ret = get_hwcomp_log(dev, cfg.id, cfg.list); + if (ret) + fprintf(stderr, "error: ocp: failed to get hwcomp log: %02X, ret: %d\n", LID_HWCOMP, + ret); + + return ret; +} diff --git a/plugins/ocp/ocp-hardware-component-log.h b/plugins/ocp/ocp-hardware-component-log.h new file mode 100644 index 0000000000..df67b25af4 --- /dev/null +++ b/plugins/ocp/ocp-hardware-component-log.h @@ -0,0 +1,12 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Copyright (c) 2024 + */ +#include "cmd.h" + +#ifndef OCP_HARDWARE_COMPONENT_LOG_H +#define OCP_HARDWARE_COMPONENT_LOG_H + +int ocp_hwcomp_log(int argc, char **argv, struct command *cmd, struct plugin *plugin); + +#endif /* OCP_HARDWARE_COMPONENT_LOG_H */ diff --git a/plugins/ocp/ocp-nvme.c b/plugins/ocp/ocp-nvme.c index 9366e9b886..810ad128ed 100644 --- a/plugins/ocp/ocp-nvme.c +++ b/plugins/ocp/ocp-nvme.c @@ -30,177 +30,12 @@ #include "ocp-clear-features.h" #include "ocp-fw-activation-history.h" #include "ocp-telemetry-decode.h" +#include "ocp-hardware-component-log.h" #define CREATE_CMD #include "ocp-nvme.h" #include "ocp-utils.h" -#define LID_HWCOMP 0xc6 -#define HWCOMP_RSVD2_LEN 14 -#define GUID_LEN 16 -#define HWCOMP_SIZE_LEN 16 -#define HWCOMP_RSVD48_LEN 16 -//#define HWCOMP_DUMMY - -struct __packed hwcomp_desc { - __le64 date_lot_size; - __le64 add_info_size; - __le32 id; - __le64 mfg; - __le64 rev; - __le64 mfg_code; -}; - -struct __packed hwcomp_log { - __le16 ver; - __u8 rsvd2[HWCOMP_RSVD2_LEN]; - __u8 guid[GUID_LEN]; - __u8 size[HWCOMP_SIZE_LEN]; - __u8 rsvd48[HWCOMP_RSVD48_LEN]; - struct hwcomp_desc *desc; -}; - -struct hwcomp_desc_entry { - struct hwcomp_desc *desc; - __u64 date_lot_size; - __u8 *date_lot_code; - __u64 add_info_size; - __u8 *add_info; - __u64 desc_size; -}; - -enum hwcomp_id { - HWCOMP_ID_RSVD, - HWCOMP_ID_ASIC, - HWCOMP_ID_NAND, - HWCOMP_ID_DRAM, - HWCOMP_ID_PMIC, - HWCOMP_ID_PCB, - HWCOMP_ID_CAP, - HWCOMP_ID_REG, - HWCOMP_ID_CASE, - HWCOMP_ID_SN, - HWCOMP_ID_COUNTRY, - HWCOMP_ID_HW_REV, - HWCOMP_ID_VENDOR = 0x8000, - HWCOMP_ID_MAX = 0xffff, -}; - -#define print_info_array(...) \ - do { \ - if (log_level >= LOG_INFO) \ - print_array(__VA_ARGS__); \ - } while (false) - -#define print_info_error(...) \ - do { \ - if (log_level >= LOG_INFO) \ - fprintf(stderr, __VA_ARGS__); \ - } while (false) - -#ifdef HWCOMP_DUMMY -static __u8 hwcomp_dummy[] = { - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xdc, 0x57, 0x0f, 0x9f, 0xb9, 0x31, 0x6b, 0xb7, - 0xd0, 0x4e, 0xcd, 0x30, 0x1f, 0x82, 0xb6, 0xbc, - 0xb4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x20, 0x20, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, - 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20 -}; -#endif /* HWCOMP_DUMMY */ - /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// @@ -4388,295 +4223,7 @@ static int get_enable_ieee1667_silo(int argc, char **argv, struct command *cmd, return enable_ieee1667_silo_get(dev, cfg.sel, !argconfig_parse_seen(opts, "no-uuid")); } -static const char *hwcomp_id_to_string(__u32 id) -{ - switch (id) { - case HWCOMP_ID_ASIC: - return "Controller ASIC component"; - case HWCOMP_ID_NAND: - return "NAND Component"; - case HWCOMP_ID_DRAM: - return "DRAM Component"; - case HWCOMP_ID_PMIC: - return "PMIC Component"; - case HWCOMP_ID_PCB: - return "PCB Component"; - case HWCOMP_ID_CAP: - return "capacitor component"; - case HWCOMP_ID_REG: - return "registor component"; - case HWCOMP_ID_CASE: - return "case component"; - case HWCOMP_ID_SN: - return "Device Serial Number"; - case HWCOMP_ID_COUNTRY: - return "Country of Origin"; - case HWCOMP_ID_HW_REV: - return "Global Device Hardware Revision"; - case HWCOMP_ID_VENDOR ... HWCOMP_ID_MAX: - return "Vendor Unique Component"; - case HWCOMP_ID_RSVD: - default: - break; - } - - return "Reserved"; -} - -static void print_hwcomp_desc(struct hwcomp_desc_entry *e, bool list, int num) -{ - printf(" Component %d: %s\n", num, hwcomp_id_to_string(le32_to_cpu(e->desc->id))); - - if (list) - return; - - printf(" Date/Lot Size: 0x%"PRIx64"\n", (uint64_t)e->date_lot_size); - printf(" Additional Information Size: 0x%"PRIx64"\n", (uint64_t)e->add_info_size); - printf(" Identifier: 0x%08x\n", le32_to_cpu(e->desc->id)); - printf(" Manufacture: 0x%016"PRIx64"\n", le64_to_cpu(e->desc->mfg)); - printf(" Revision: 0x%016"PRIx64"\n", le64_to_cpu(e->desc->rev)); - printf(" Manufacture Code: 0x%016"PRIx64"\n", le64_to_cpu(e->desc->mfg_code)); - print_array(" Date/Lot Code", e->date_lot_code, e->date_lot_size); - print_array(" Additional Information", e->add_info, e->add_info_size); -} - -static void print_hwcomp_log_normal(struct hwcomp_log *log, __u32 id, bool list) -{ - size_t date_lot_code_offset = sizeof(struct hwcomp_desc); - int num = 1; - struct hwcomp_desc_entry e = { log->desc }; - - long double log_size = uint128_t_to_double(le128_to_cpu(log->size)) * sizeof(__le32); - - printf("Log Identifier: 0x%02xh\n", LID_HWCOMP); - printf("Log Page Version: 0x%x\n", le16_to_cpu(log->ver)); - print_array("Reserved2", log->rsvd2, ARRAY_SIZE(log->rsvd2)); - print_array("Log page GUID", log->guid, ARRAY_SIZE(log->guid)); - printf("Hardware Component Log Size: 0x%"PRIx64"\n", (uint64_t)log_size); - print_array("Reserved48", log->rsvd48, ARRAY_SIZE(log->rsvd48)); - printf("Component Descriptions\n"); - while (log_size > 0) { - e.date_lot_size = le64_to_cpu(e.desc->date_lot_size) * sizeof(__le32); - e.date_lot_code = e.date_lot_size ? (__u8 *)e.desc + date_lot_code_offset : NULL; - e.add_info_size = le64_to_cpu(e.desc->add_info_size) * sizeof(__le32); - e.add_info = e.add_info_size ? e.date_lot_code ? e.date_lot_code + e.date_lot_size : - (__u8 *)e.desc + date_lot_code_offset : NULL; - if (!id || id == le32_to_cpu(e.desc->id)) - print_hwcomp_desc(&e, list, num++); - e.desc_size = date_lot_code_offset + e.date_lot_size + e.add_info_size; - e.desc = (struct hwcomp_desc *)((__u8 *)e.desc + e.desc_size); - log_size -= e.desc_size; - } -} - -static void print_hwcomp_desc_json(struct hwcomp_desc_entry *e, struct json_object *r) -{ - obj_add_str(r, "Description", hwcomp_id_to_string(le32_to_cpu(e->desc->id))); - obj_add_nprix64(r, "Date/Lot Size", e->date_lot_size); - obj_add_nprix64(r, "Additional Information Size", e->add_info_size); - obj_add_uint_0nx(r, "Identifier", le32_to_cpu(e->desc->id), 8); - obj_add_0nprix64(r, "Manufacture", le64_to_cpu(e->desc->mfg), 16); - obj_add_0nprix64(r, "Revision", le64_to_cpu(e->desc->rev), 16); - obj_add_0nprix64(r, "Manufacture Code", le64_to_cpu(e->desc->mfg_code), 16); - obj_add_byte_array(r, "Date/Lot Code", e->date_lot_code, e->date_lot_size); - obj_add_byte_array(r, "Additional Information", e->add_info, e->add_info_size); -} - -static void print_hwcomp_desc_list_json(struct json_object *r, struct hwcomp_desc_entry *e, - bool list, int num) +static int hwcomp_log(int argc, char **argv, struct command *cmd, struct plugin *plugin) { - _cleanup_free_ char *k = NULL; - - if (asprintf(&k, "Component %d", num) < 0) - return; - - if (list) { - obj_add_str(r, k, hwcomp_id_to_string(le32_to_cpu(e->desc->id))); - return; - } - - print_hwcomp_desc_json(e, obj_create_array_obj(r, k)); -} - -static void print_hwcomp_descs_json(struct hwcomp_desc *desc, long double log_size, __u32 id, - bool list, struct json_object *r) -{ - size_t date_lot_code_offset = sizeof(struct hwcomp_desc); - struct hwcomp_desc_entry e = { desc }; - int num = 1; - - while (log_size > 0) { - e.date_lot_size = le64_to_cpu(e.desc->date_lot_size) * sizeof(__le32); - e.date_lot_code = e.date_lot_size ? - (__u8 *)e.desc + date_lot_code_offset : NULL; - e.add_info_size = le64_to_cpu(e.desc->add_info_size) * sizeof(__le32); - e.add_info = e.add_info_size ? e.date_lot_code ? - e.date_lot_code + e.date_lot_size : - (__u8 *)e.desc + date_lot_code_offset : NULL; - if (!id || id == le32_to_cpu(e.desc->id)) - print_hwcomp_desc_list_json(r, &e, list, num++); - e.desc_size = date_lot_code_offset + e.date_lot_size + e.add_info_size; - e.desc = (struct hwcomp_desc *)((__u8 *)e.desc + e.desc_size); - log_size -= e.desc_size; - } -} - -static void print_hwcomp_log_json(struct hwcomp_log *log, __u32 id, bool list) -{ - struct json_object *r = json_create_object(); - - long double log_size = uint128_t_to_double(le128_to_cpu(log->size)) * sizeof(__le32); - - obj_add_uint_02x(r, "Log Identifier", LID_HWCOMP); - obj_add_uint_0x(r, "Log Page Version", le16_to_cpu(log->ver)); - obj_add_byte_array(r, "Reserved2", log->rsvd2, ARRAY_SIZE(log->rsvd2)); - obj_add_byte_array(r, "Log page GUID", log->guid, ARRAY_SIZE(log->guid)); - obj_add_nprix64(r, "Hardware Component Log Size", (unsigned long long)log_size); - obj_add_byte_array(r, "Reserved48", log->rsvd48, ARRAY_SIZE(log->rsvd48)); - print_hwcomp_descs_json(log->desc, log_size, id, list, - obj_create_array_obj(r, "Component Descriptions")); - - json_print(r); -} - -static void print_hwcomp_log_binary(struct hwcomp_log *log) -{ - long double desc_len = uint128_t_to_double(le128_to_cpu(log->size)) * sizeof(__le32); - - d_raw((unsigned char *)log, offsetof(struct hwcomp_log, desc) + desc_len); -} - -static int get_hwcomp_log_data(struct nvme_dev *dev, struct hwcomp_log *log) -{ - int ret = 0; - size_t desc_offset = offsetof(struct hwcomp_log, desc); - struct nvme_get_log_args args = { - .lpo = desc_offset, - .log = log->desc, - .args_size = sizeof(args), - .fd = dev_fd(dev), - .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, - .lid = LID_HWCOMP, - .nsid = NVME_NSID_ALL, - }; - -#ifdef HWCOMP_DUMMY - memcpy(log, hwcomp_dummy, desc_offset); -#else /* HWCOMP_DUMMY */ - ret = nvme_get_log_simple(dev_fd(dev), LID_HWCOMP, desc_offset, log); - if (ret) { - print_info_error("error: ocp: failed to get log simple (hwcomp: %02X, ret: %d)\n", - LID_HWCOMP, ret); - return ret; - } -#endif /* HWCOMP_DUMMY */ - - print_info("id: %02Xh\n", LID_HWCOMP); - print_info("version: %04Xh\n", log->ver); - print_info_array("guid", log->guid, ARRAY_SIZE(log->guid)); - print_info("size: %s\n", uint128_t_to_string(le128_to_cpu(log->size))); - - args.len = uint128_t_to_double(le128_to_cpu(log->size)) * sizeof(__le32); - log->desc = calloc(1, args.len); - if (!log->desc) { - fprintf(stderr, "error: ocp: calloc: %s\n", strerror(errno)); - return -1; - } - -#ifdef HWCOMP_DUMMY - memcpy(log->desc, &hwcomp_dummy[desc_offset], args.len); -#else /* HWCOMP_DUMMY */ - ret = nvme_get_log_page(dev_fd(dev), NVME_LOG_PAGE_PDU_SIZE, &args); - if (ret) { - print_info_error("error: ocp: failed to get log page (hwcomp: %02X, ret: %d)\n", - LID_HWCOMP, ret); - return ret; - } -#endif /* HWCOMP_DUMMY */ - - return ret; -} - -static int get_hwcomp_log(struct nvme_dev *dev, __u32 id, bool list) -{ - _cleanup_free_ __u8 *desc = NULL; - - int ret; - nvme_print_flags_t fmt; - struct hwcomp_log log = { - .desc = (struct hwcomp_desc *)desc, - }; - - ret = validate_output_format(nvme_cfg.output_format, &fmt); - if (ret < 0) { - fprintf(stderr, "error: ocp: invalid output format\n"); - return ret; - } - - ret = get_hwcomp_log_data(dev, &log); - if (ret) { - print_info_error("error: ocp: failed get hwcomp log: %02X data, ret: %d\n", - LID_HWCOMP, ret); - return ret; - } - - switch (fmt) { - case NORMAL: - print_hwcomp_log_normal(&log, id, list); - break; - case JSON: - print_hwcomp_log_json(&log, id, list); - break; - case BINARY: - print_hwcomp_log_binary(&log); - break; - default: - fprintf(stderr, "unhandled output format\n"); - break; - } - - return 0; -} - -static int ocp_hwcomp_log(int argc, char **argv, struct command *cmd, struct plugin *plugin) -{ - _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; - int ret = 0; - const char *desc = "retrieve hardware component log"; - struct config { - __u64 id; - bool list; - } cfg = { 0 }; - const char *id_desc = "component identifier"; - const char *list_desc = "list component descriptions"; - - OPT_VALS(id) = { - VAL_LONG("asic", HWCOMP_ID_ASIC), - VAL_LONG("nand", HWCOMP_ID_NAND), - VAL_LONG("dram", HWCOMP_ID_DRAM), - VAL_LONG("pmic", HWCOMP_ID_PMIC), - VAL_LONG("pcb", HWCOMP_ID_PCB), - VAL_LONG("cap", HWCOMP_ID_CAP), - VAL_LONG("reg", HWCOMP_ID_REG), - VAL_LONG("case", HWCOMP_ID_CASE), - VAL_LONG("sn", HWCOMP_ID_SN), - VAL_LONG("country", HWCOMP_ID_COUNTRY), - VAL_LONG("hw-rev", HWCOMP_ID_HW_REV), - VAL_LONG("vendor", HWCOMP_ID_VENDOR), - VAL_END() - }; - - NVME_ARGS(opts, OPT_LONG("comp-id", 'i', &cfg.id, id_desc, id), - OPT_FLAG("list", 'l', &cfg.list, list_desc)); - - ret = parse_and_open(&dev, argc, argv, desc, opts); - if (ret) - return ret; - - ret = get_hwcomp_log(dev, cfg.id, cfg.list); - if (ret) - fprintf(stderr, "error: ocp: failed to get hwcomp log: %02X, ret: %d\n", LID_HWCOMP, - ret); - - return ret; + return ocp_hwcomp_log(argc, argv, cmd, plugin); } diff --git a/plugins/ocp/ocp-nvme.h b/plugins/ocp/ocp-nvme.h index 9fafb5ebf5..1aa1cb1ee9 100644 --- a/plugins/ocp/ocp-nvme.h +++ b/plugins/ocp/ocp-nvme.h @@ -40,7 +40,7 @@ PLUGIN(NAME("ocp", "OCP cloud SSD extensions", OCP_PLUGIN_VERSION), ENTRY("set-error-injection", "Inject error conditions", set_error_injection) ENTRY("get-enable-ieee1667-silo", "return set of enable IEEE1667 silo", get_enable_ieee1667_silo) - ENTRY("hardware-component-log", "retrieve hardware component log", ocp_hwcomp_log) + ENTRY("hardware-component-log", "retrieve hardware component log", hwcomp_log) ) ); From 8b6e87ab04ddda61f912dfa2825d5a3741481ad0 Mon Sep 17 00:00:00 2001 From: Tokunori Ikegami Date: Mon, 16 Sep 2024 21:10:29 +0900 Subject: [PATCH 172/281] build: bump libnvme wrap Include libnvme NVME_CHECK() definition addition. Signed-off-by: Tokunori Ikegami --- subprojects/libnvme.wrap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subprojects/libnvme.wrap b/subprojects/libnvme.wrap index 0d93535cd0..7a822def66 100644 --- a/subprojects/libnvme.wrap +++ b/subprojects/libnvme.wrap @@ -1,6 +1,6 @@ [wrap-git] url = https://github.com/linux-nvme/libnvme.git -revision = 5585f06a4f849a1b43b1a04f387d2f9b5829744f +revision = 8194960d93c9e4343d2cba456e7d1822b2e60563 [provide] libnvme = libnvme_dep From ace51b0f8d149ed893553b8344b8eae0afad0f71 Mon Sep 17 00:00:00 2001 From: Tokunori Ikegami Date: Sun, 15 Sep 2024 10:45:24 +0900 Subject: [PATCH 173/281] nvme: use NVME_CHECK() to check get features select field value Use the macro instead of comparing the long filed value definition. Signed-off-by: Tokunori Ikegami --- nvme.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nvme.c b/nvme.c index c1f177f351..ab5602d015 100644 --- a/nvme.c +++ b/nvme.c @@ -4553,7 +4553,7 @@ static int get_feature_id(struct nvme_dev *dev, struct feat_cfg *cfg, cfg->cdw11 |= 0xff << 16; } - if (cfg->sel == NVME_GET_FEATURES_SEL_SUPPORTED) + if (NVME_CHECK(cfg->sel, GET_FEATURES_SEL, SUPPORTED)) cfg->data_len = 0; if (cfg->data_len) { @@ -4592,7 +4592,7 @@ static void get_feature_id_print(struct feat_cfg cfg, int err, __u32 result, if (!err) { if (!cfg.raw_binary || !buf) { nvme_feature_show(cfg.feature_id, cfg.sel, result); - if (cfg.sel == NVME_GET_FEATURES_SEL_SUPPORTED) + if (NVME_CHECK(cfg.sel, GET_FEATURES_SEL, SUPPORTED)) nvme_show_select_result(cfg.feature_id, result); else if (cfg.human_readable) nvme_feature_show_fields(cfg.feature_id, result, From 525cf1e6edbc7eeba27e7fcbbdf90d5cf113f57b Mon Sep 17 00:00:00 2001 From: Tokunori Ikegami Date: Wed, 18 Sep 2024 23:36:08 +0900 Subject: [PATCH 174/281] ocp: fix to set log data pointer allocated Previously the NULL pointer is set incorrectly. Signed-off-by: Tokunori Ikegami --- plugins/ocp/ocp-hardware-component-log.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/ocp/ocp-hardware-component-log.c b/plugins/ocp/ocp-hardware-component-log.c index 8d638c97ce..679aae89f9 100644 --- a/plugins/ocp/ocp-hardware-component-log.c +++ b/plugins/ocp/ocp-hardware-component-log.c @@ -339,7 +339,6 @@ static int get_hwcomp_log_data(struct nvme_dev *dev, struct hwcomp_log *log) size_t desc_offset = offsetof(struct hwcomp_log, desc); struct nvme_get_log_args args = { .lpo = desc_offset, - .log = log->desc, .args_size = sizeof(args), .fd = dev_fd(dev), .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, @@ -370,6 +369,8 @@ static int get_hwcomp_log_data(struct nvme_dev *dev, struct hwcomp_log *log) return -1; } + args.log = log->desc, + #ifdef HWCOMP_DUMMY memcpy(log->desc, &hwcomp_dummy[desc_offset], args.len); #else /* HWCOMP_DUMMY */ From 2ab3e754c2962a50cd574f15832ac5ac32a05c73 Mon Sep 17 00:00:00 2001 From: Tokunori Ikegami Date: Thu, 19 Sep 2024 00:28:49 +0900 Subject: [PATCH 175/281] ocp: include util/types.h to use nvme_uint128_t This is to fix nvme_uint128_t functions to work correctly. Signed-off-by: Tokunori Ikegami --- plugins/ocp/ocp-hardware-component-log.c | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/ocp/ocp-hardware-component-log.c b/plugins/ocp/ocp-hardware-component-log.c index 679aae89f9..cbf5d1edbd 100644 --- a/plugins/ocp/ocp-hardware-component-log.c +++ b/plugins/ocp/ocp-hardware-component-log.c @@ -6,6 +6,7 @@ #include #include "common.h" +#include "util/types.h" #include "util/logging.h" #include "nvme-print.h" From f64ecdbf0689b6b397172290b721e8a7ad581382 Mon Sep 17 00:00:00 2001 From: Leonardo da Cunha Date: Tue, 3 Sep 2024 16:11:47 -0700 Subject: [PATCH 176/281] plugins/solidigm: Added Workload Tracker Triggers and Wall Time Added Trigger configurations, Stopped converting timestamps to millisec, added optional property to display wall clock column. Signed-off-by: Leonardo da Cunha --- plugins/solidigm/solidigm-nvme.h | 2 +- plugins/solidigm/solidigm-workload-tracker.c | 365 +++++++++++++------ 2 files changed, 262 insertions(+), 105 deletions(-) diff --git a/plugins/solidigm/solidigm-nvme.h b/plugins/solidigm/solidigm-nvme.h index 2b74a02639..5a9ebd26d6 100644 --- a/plugins/solidigm/solidigm-nvme.h +++ b/plugins/solidigm/solidigm-nvme.h @@ -13,7 +13,7 @@ #include "cmd.h" -#define SOLIDIGM_PLUGIN_VERSION "1.6" +#define SOLIDIGM_PLUGIN_VERSION "1.7" PLUGIN(NAME("solidigm", "Solidigm vendor specific extensions", SOLIDIGM_PLUGIN_VERSION), COMMAND_LIST( diff --git a/plugins/solidigm/solidigm-workload-tracker.c b/plugins/solidigm/solidigm-workload-tracker.c index 73bb3c3f13..14d8458122 100644 --- a/plugins/solidigm/solidigm-workload-tracker.c +++ b/plugins/solidigm/solidigm-workload-tracker.c @@ -12,7 +12,8 @@ #define LID 0xf9 #define FID 0xf1 -#define WLT2MS 25000 +#define WLT2US 25 +#define WLT2MS (WLT2US * 1000) #define MAX_WORKLOAD_LOG_ENTRIES 126 #define MAX_WORKLOAD_LOG_ENTRY_SIZE 32 #define MAX_FIELDS 15 @@ -174,11 +175,11 @@ union WorkloadLogEnable { __u32 contentGroup : 4; // content group select __u32 stopCount : 12;// event limit,if<>0,stop tracker after stopCount events __u32 eventDumpEnable : 1; // trigger event dump enable - } field; + }; __u32 dword; }; -struct workloadLogHeader { +struct workloadLog { // Full WL Log Structure __u16 majorVersion; // Major Version __u16 minorVersion; // Minor Version __u32 workloadLogCount; // Number of Entries in the Workload Log @@ -187,14 +188,9 @@ struct workloadLogHeader { __u32 samplePeriodInMilliseconds; // Sample Period In Milliseconds __u64 timestamp_lastEntry; // Timestamp for the last full entry __u64 timestamp_triggered; // Timestamp at the point of trigger - __u32 trackerEnable; // Workload trigger and enable settings + union WorkloadLogEnable config; // Workload trigger and enable settings __u32 triggerthreshold; // Trigger threshold __u32 triggeredValue; // Actual value fired the trigger -}; - - -struct workloadLog { // Full WL Log Structure - struct workloadLogHeader header; __u8 entry[MAX_WORKLOAD_LOG_ENTRIES][MAX_WORKLOAD_LOG_ENTRY_SIZE]; }; #pragma pack(pop) @@ -202,24 +198,26 @@ struct workloadLog { // Full WL Log Structure struct wltracker { int fd; struct workloadLog workload_log; - size_t entry_count; + size_t poll_count; + bool show_wall_timestamp; + __u64 us_epoch_ssd_delta; unsigned int verbose; + __u64 start_time_us; + __u64 run_time_us; + bool disable; }; static void wltracker_print_field_names(struct wltracker *wlt) { struct workloadLog *log = &wlt->workload_log; - __u8 cnt = log->header.workloadLogCount; - union WorkloadLogEnable workloadEnable = (union WorkloadLogEnable)log->header.trackerEnable; - __u8 content_group = workloadEnable.field.contentGroup; - if (cnt == 0) + if (log->workloadLogCount == 0) return; printf("%-16s", "timestamp"); for (int i = 0 ; i < MAX_FIELDS; i++) { - struct field f = group_fields[content_group][i]; + struct field f = group_fields[log->config.contentGroup][i]; if (f.size == 0) break; @@ -228,8 +226,11 @@ static void wltracker_print_field_names(struct wltracker *wlt) printf("%s ", f.name); } + if (wlt->show_wall_timestamp) + printf("%-*s", (int)sizeof("YYYY-MM-DD-hh:mm:ss.uuuuuu"), "wall-time"); + if (wlt->verbose > 1) - printf("%s", "entry#"); + printf("%s", "entry# "); printf("\n"); } @@ -237,35 +238,59 @@ static void wltracker_print_field_names(struct wltracker *wlt) static void wltracker_print_header(struct wltracker *wlt) { struct workloadLog *log = &wlt->workload_log; - __u8 cnt = log->header.workloadLogCount; - union WorkloadLogEnable workloadEnable = (union WorkloadLogEnable)log->header.trackerEnable; - __u8 content_group = workloadEnable.field.contentGroup; - - printf("%-20s %u.%u\n", "Log page version:", le16_to_cpu(log->header.majorVersion), - le16_to_cpu(log->header.minorVersion)); - printf("%-20s %u\n", "Sample period(ms):", - le32_to_cpu(log->header.samplePeriodInMilliseconds)); - printf("%-20s %lu\n", "timestamp_lastEntry:", - le64_to_cpu(log->header.timestamp_lastEntry) / WLT2MS); - printf("%-20s %lu\n", "timestamp_triggered:", - le64_to_cpu(log->header.timestamp_triggered/1000)); - printf("%-20s 0x%x\n", "trackerEnable:", le32_to_cpu(log->header.trackerEnable)); - printf("%-20s %u\n", "Triggerthreshold:", - le32_to_cpu(log->header.triggerthreshold)); - printf("%-20s %u\n", "ValueTriggered:", le32_to_cpu(log->header.triggeredValue)); - printf("%-20s %s\n", "Tracker Type:", trk_types[content_group]); - printf("%-30s %u\n", "Total workload log entries:", le16_to_cpu(cnt)); - printf("%-20s %ld\n\n", "Sample count:", wlt->entry_count); - if (wlt->entry_count != 0) + + printf("%-24s %u.%u\n", "Log page version:", le16_to_cpu(log->majorVersion), + le16_to_cpu(log->minorVersion)); + printf("%-24s %u\n", "Sample period(ms):", le32_to_cpu(log->samplePeriodInMilliseconds)); + printf("%-24s %lu\n", "timestamp_lastChange:", le64_to_cpu(log->timestamp_lastEntry)); + printf("%-24s %lu\n", "timestamp_triggered:", le64_to_cpu(log->timestamp_triggered)); + printf("%-24s 0x%x\n", "config:", le32_to_cpu(log->config.dword)); + printf("%-24s %u\n", "Triggerthreshold:", le32_to_cpu(log->triggerthreshold)); + printf("%-24s %u\n", "ValueTriggered:", le32_to_cpu(log->triggeredValue)); + printf("%-24s %s\n", "Tracker Type:", trk_types[log->config.contentGroup]); + printf("%-24s %u\n", "Total log page entries:", le32_to_cpu(log->workloadLogCount)); + printf("%-24s %u\n", "Trigger count:", log->triggeredEvents); + if (wlt->verbose > 1) + printf("%-24s %ld\n", "Poll count:", wlt->poll_count); + if (wlt->poll_count != 0) wltracker_print_field_names(wlt); } +__u64 micros_id(clockid_t clk_id) +{ + struct timespec ts; + __u64 us; + + clock_gettime(clk_id, &ts); + us = (((__u64)ts.tv_sec)*1000000) + (((__u64)ts.tv_nsec)/1000); + return us; +} + +__u64 micros(void) +{ + return micros_id(CLOCK_REALTIME); +} + +int wltracker_config(struct wltracker *wlt, union WorkloadLogEnable *we) +{ + struct nvme_set_features_args args = { + .args_size = sizeof(args), + .fd = wlt->fd, + .fid = FID, + .cdw11 = we->dword, + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + }; + + return nvme_set_features(&args); +} + static int wltracker_show_newer_entries(struct wltracker *wlt) { struct workloadLog *log = &wlt->workload_log; __u8 cnt; __u8 content_group; - static __u64 last_timestamp_ms; + static __u64 last_timestamp_us; + __u64 timestamp_us = 0; __u64 timestamp = 0; union WorkloadLogEnable workloadEnable; @@ -281,29 +306,75 @@ static int wltracker_show_newer_entries(struct wltracker *wlt) if (wlt->verbose) wltracker_print_header(wlt); - cnt = log->header.workloadLogCount; - workloadEnable = (union WorkloadLogEnable)log->header.trackerEnable; - content_group = workloadEnable.field.contentGroup; + cnt = log->workloadLogCount; + workloadEnable = log->config; + content_group = workloadEnable.contentGroup; if (cnt == 0) { nvme_show_error("Warning : No valid workload log data\n"); return 0; } - timestamp = (le64_to_cpu(log->header.timestamp_lastEntry) / WLT2MS) - - (log->header.samplePeriodInMilliseconds * (cnt - 1)); + timestamp_us = (le64_to_cpu(log->timestamp_lastEntry) / WLT2US) - + (log->samplePeriodInMilliseconds * 1000 * (cnt - 1)); + timestamp = le64_to_cpu(log->timestamp_lastEntry) - + (log->samplePeriodInMilliseconds * WLT2MS * (cnt - 1)); + if (wlt->poll_count++ == 0) { + __u64 tle = log->timestamp_lastEntry; + __u8 tracker_enable_bit = workloadEnable.trackerEnable; - if (wlt->entry_count == 0) wltracker_print_field_names(wlt); + if (wlt->show_wall_timestamp && + ((log->triggeredEvents && wlt->disable) || !tracker_enable_bit)) { + // retrieve fresh timestamp to reconstruct wall time + union WorkloadLogEnable we = log->config; + + if (wlt->verbose > 1) { + printf("Temporarily enabling tracker to find current timestamp\n"); + printf("Original config value: 0x%08x\n", we.dword); + } + we.trackerEnable = true; + we.triggerEnable = false; + we.sampleTime = 1; + + if (wlt->verbose > 1) + printf("Modified config value: 0x%08x\n", we.dword); + + err = wltracker_config(wlt, &we); + usleep(1000); + if (!err) { + struct workloadLog tl; + + err = nvme_get_log_simple(wlt->fd, LID, sizeof(tl), &tl); + tle = tl.timestamp_lastEntry; + } + if (err) { + nvme_show_error("Failed to retrieve latest SSD timestamp"); + } else { + // Restore original config , but don't reenable trigger + we = log->config; + we.triggerEnable = false; + err = wltracker_config(wlt, &we); + if (wlt->verbose > 1) + printf("Restored config value: 0x%08x\n", + we.dword); + } + } + wlt->us_epoch_ssd_delta = (micros() - le64_to_cpu(tle) / WLT2US); + } + for (int i = cnt - 1; i >= 0; i--) { int offset = 0; __u8 *entry = (__u8 *) &log->entry[i]; - bool is_old = timestamp <= last_timestamp_ms; + // allow 10% sample skew + bool is_old = timestamp_us <= last_timestamp_us + + (log->samplePeriodInMilliseconds * 100); if (is_old) { - timestamp += log->header.samplePeriodInMilliseconds; + timestamp_us += (log->samplePeriodInMilliseconds * 1000); + timestamp += log->samplePeriodInMilliseconds * WLT2MS; continue; } printf("%-16llu", timestamp); @@ -312,8 +383,21 @@ static int wltracker_show_newer_entries(struct wltracker *wlt) struct field f = group_fields[content_group][j]; if (f.size == 0) { + if (wlt->show_wall_timestamp) { + time_t epoch_ts_us = timestamp_us + + wlt->us_epoch_ssd_delta; + time_t ts_s = epoch_ts_us / 1000000; + struct tm ts = *localtime(&ts_s); + char buf[80]; + + strftime(buf, sizeof(buf), "%Y-%m-%d-%H:%M:%S", &ts); + printf("%s.%06" PRIu64 " ", buf, + (uint64_t)(epoch_ts_us % 1000000ULL)); + } + if (wlt->verbose > 1) printf("%-*i", (int)sizeof("entry#"), i); + printf("\n"); break; } @@ -337,28 +421,24 @@ static int wltracker_show_newer_entries(struct wltracker *wlt) printf("%-*u ", (int)strlen(f.name), val); } - wlt->entry_count++; - timestamp += log->header.samplePeriodInMilliseconds; + timestamp_us += (log->samplePeriodInMilliseconds * 1000); + timestamp += log->samplePeriodInMilliseconds * WLT2MS; } - last_timestamp_ms = log->header.timestamp_lastEntry / WLT2MS; + last_timestamp_us = log->timestamp_lastEntry / WLT2US; return 0; } -int wltracker_config(struct wltracker *wlt, union WorkloadLogEnable *we) +void wltracker_run_time_update(struct wltracker *wlt) { - struct nvme_set_features_args args = { - .args_size = sizeof(args), - .fd = wlt->fd, - .fid = FID, - .cdw11 = we->dword, - .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, - }; - - return nvme_set_features(&args); + wlt->run_time_us = micros() - wlt->start_time_us; + if (wlt->verbose > 0) + printf("run_time: %lluus\n", wlt->run_time_us); } static int stricmp(char const *a, char const *b) { + if (!a || !b) + return 1; for (; *a || *b; a++, b++) if (tolower((unsigned char)*a) != tolower((unsigned char)*b)) return 1; @@ -367,14 +447,14 @@ static int stricmp(char const *a, char const *b) static int find_option(char const *list[], int size, const char *val) { - for (int i = 0; i < size; i++) { - if (!stricmp(val, list[i])) - return i; - } - return -EINVAL; + for (int i = 0; i < size; i++) { + if (!stricmp(val, list[i])) + return i; + } + return -EINVAL; } -static void join(char *dest, char const *list[], size_t list_size) +static void join_options(char *dest, char const *list[], size_t list_size) { strcat(dest, list[0]); for (int i = 1; i < list_size; i++) { @@ -383,14 +463,26 @@ static void join(char *dest, char const *list[], size_t list_size) } } -__u64 micros(void) +static int find_field(struct field *fields, const char *val) { - struct timespec ts; - __u64 us; + for (int i = 0; i < MAX_FIELDS; i++) { + if (!stricmp(val, fields[i].name)) + return i; + } + return -EINVAL; +} - clock_gettime(CLOCK_MONOTONIC_RAW, &ts); - us = (((__u64)ts.tv_sec)*1000000) + (((__u64)ts.tv_nsec)/1000); - return us; +static void join_fields(char *dest, struct field *fields) +{ + strcat(dest, fields[0].name); + for (int i = 1; i < MAX_FIELDS; i++) { + char *name = fields[i].name; + + if (name) { + strcat(dest, "|"); + strcat(dest, name); + } + } } int sldgm_get_workload_tracker(int argc, char **argv, struct command *cmd, struct plugin *plugin) @@ -406,9 +498,7 @@ int sldgm_get_workload_tracker(int argc, char **argv, struct command *cmd, struc "Samples (1 to 126) to wait for extracting data. Default 100 samples"; char type_options[80] = {0}; char sample_options[80] = {0}; - __u64 us_start; - __u64 run_time_us; - __u64 elapsed_run_time_us = 0; + __u64 stop_time_us; __u64 next_sample_us = 0; int opt; int err; @@ -416,29 +506,43 @@ int sldgm_get_workload_tracker(int argc, char **argv, struct command *cmd, struc struct config { bool enable; bool disable; + bool trigger_on_delta; + bool trigger_on_latency; const char *tracker_type; const char *sample_time; - int run_time_s; + __u32 run_time_s; int flush_frequency; + char *trigger_field; + __u32 trigger_treshold; }; struct config cfg = { .sample_time = samplet[0], .flush_frequency = 100, .tracker_type = trk_types[0], + .trigger_field = "", }; - join(type_options, trk_types, ARRAY_SIZE(trk_types)); - join(sample_options, samplet, ARRAY_SIZE(samplet)); + join_options(type_options, trk_types, ARRAY_SIZE(trk_types)); + join_options(sample_options, samplet, ARRAY_SIZE(samplet)); OPT_ARGS(opts) = { OPT_FLAG("enable", 'e', &cfg.enable, "tracker enable"), OPT_FLAG("disable", 'd', &cfg.disable, "tracker disable"), OPT_STRING("sample-time", 's', sample_options, &cfg.sample_time, sample_interval), OPT_STRING("type", 't', type_options, &cfg.tracker_type, "Tracker type"), - OPT_INT("run-time", 'r', &cfg.run_time_s, run_time), + OPT_UINT("run-time", 'r', &cfg.run_time_s, run_time), OPT_INT("flush-freq", 'f', &cfg.flush_frequency, flush_frequency), - OPT_INCR("verbose", 'v', &wlt.verbose, "Increase logging verbosity"), + OPT_FLAG("wall-clock", 'w', &wlt.show_wall_timestamp, + "Logs current wall timestamp when entry was retrieved"), + OPT_STR("trigger-field", 'T', &cfg.trigger_field, "Field name to stop trigger on"), + OPT_UINT("trigger-threshold", 'V', &cfg.trigger_treshold, + "Field value to trigger stop sampling"), + OPT_FLAG("trigger-on-delta", 'D', &cfg.trigger_on_delta, + "Trigger on delta to stop sampling"), + OPT_FLAG("trigger-on-latency", 'L', &cfg.trigger_on_latency, + "Use latency tracker to trigger stop sampling"), + OPT_INCR("verbose", 'v', &wlt.verbose, "Increase logging verbosity"), OPT_END() }; @@ -460,23 +564,59 @@ int sldgm_get_workload_tracker(int argc, char **argv, struct command *cmd, struc cfg.sample_time, sample_options); return -EINVAL; } - we.field.sampleTime = opt; + we.sampleTime = opt; opt = find_option(trk_types, ARRAY_SIZE(trk_types), cfg.tracker_type); if (opt < 0) { - nvme_show_error("Invalid tracker type: %s. Valid types: %s", + nvme_show_error("Invalid tracker type: \"%s\". Valid types: %s", cfg.tracker_type, type_options); return -EINVAL; } - we.field.contentGroup = opt; + we.contentGroup = opt; + if (argconfig_parse_seen(opts, "trigger-field")) { + int field_pos = find_field(group_fields[opt], cfg.trigger_field); + int field_offset = 0; + + if (field_pos < 0) { + char field_options[256]; + + join_fields(field_options, group_fields[opt]); + nvme_show_error( + "Invalid field name: %s. For type: \"%s\", valid fields are: %s", + cfg.trigger_field, cfg.tracker_type, field_options); + return -EINVAL; + } + for (int i = 0; i < field_pos; i++) + field_offset += group_fields[opt][i].size; + + we.triggerDwordIndex += field_offset / 4; + we.triggerSize = + group_fields[opt][field_pos].size == + 4 ? 3 : group_fields[opt][field_pos].size; + we.triggerByteWordIndex = field_offset % 4 / + group_fields[opt][field_pos].size; + we.triggerEnable = true; + we.triggerDelta = cfg.trigger_on_delta; + we.triggerSynchronous = !cfg.trigger_on_latency; + err = nvme_set_features_data(wlt.fd, 0xf5, 0, cfg.trigger_treshold, 0, 0, NULL, + NULL); + if (err < 0) { + nvme_show_error("Trigger Threshold set-feature: %s", nvme_strerror(errno)); + return err; + } else if (err > 0) { + nvme_show_status(err); + return err; + } + } if (cfg.enable && cfg.disable) { nvme_show_error("Can't enable disable simultaneously"); return -EINVAL; } + wlt.disable = cfg.disable; - if (cfg.enable || cfg.disable) { - we.field.trackerEnable = cfg.enable; + if (cfg.enable) { + we.trackerEnable = true; err = wltracker_config(&wlt, &we); if (err < 0) { nvme_show_error("tracker set-feature: %s", nvme_strerror(errno)); @@ -487,17 +627,12 @@ int sldgm_get_workload_tracker(int argc, char **argv, struct command *cmd, struc } } - if (cfg.disable && !cfg.enable) { - printf("Tracker disabled\n"); - return 0; - } - - us_start = micros(); - run_time_us = cfg.run_time_s * 1000000; - while (elapsed_run_time_us < run_time_us) { + wlt.start_time_us = micros(); + stop_time_us = cfg.run_time_s * 1000000; + while (wlt.run_time_us < stop_time_us) { __u64 interval; __u64 elapsed; - __u64 prev_elapsed_run_time_us = elapsed_run_time_us; + __u64 prev_run_time_us = wlt.run_time_us; err = wltracker_show_newer_entries(&wlt); @@ -505,28 +640,50 @@ int sldgm_get_workload_tracker(int argc, char **argv, struct command *cmd, struc nvme_show_status(err); return err; } - interval = ((__u64)wlt.workload_log.header.samplePeriodInMilliseconds) * 1000 * + interval = ((__u64)wlt.workload_log.samplePeriodInMilliseconds) * 1000 * cfg.flush_frequency; next_sample_us += interval; - elapsed_run_time_us = micros() - us_start; - elapsed = elapsed_run_time_us - prev_elapsed_run_time_us; - if (wlt.verbose > 1) - printf("elapsed_run_time: %lluus\n", elapsed_run_time_us); + wltracker_run_time_update(&wlt); + + if (wlt.workload_log.triggeredEvents) + break; + elapsed = wlt.run_time_us - prev_run_time_us; if (interval > elapsed) { - __u64 period_us = min(next_sample_us - elapsed_run_time_us, - run_time_us - elapsed_run_time_us); + __u64 period_us = min(next_sample_us - wlt.run_time_us, + stop_time_us - wlt.run_time_us); if (wlt.verbose > 1) printf("Sleeping %lluus..\n", period_us); usleep(period_us); + wltracker_run_time_update(&wlt); } - elapsed_run_time_us = micros() - us_start; } - err = wltracker_show_newer_entries(&wlt); + if (!wlt.workload_log.triggeredEvents) { + err = wltracker_show_newer_entries(&wlt); + wltracker_run_time_update(&wlt); + } + + if (cfg.disable) { + union WorkloadLogEnable we2 = wlt.workload_log.config; - elapsed_run_time_us = micros() - us_start; - if (wlt.verbose > 0) - printf("elapsed_run_time: %lluus\n", elapsed_run_time_us); + if (wlt.verbose > 1) + printf("Original config value: 0x%08x\n", we2.dword); + + we2.trackerEnable = false; + we2.triggerEnable = false; + err = wltracker_config(&wlt, &we2); + if (err < 0) { + nvme_show_error("tracker set-feature: %s", nvme_strerror(errno)); + return err; + } else if (err > 0) { + nvme_show_status(err); + return err; + } + if (wlt.verbose > 1) + printf("Modified config value: 0x%08x\n", we2.dword); + printf("Tracker disabled\n"); + return 0; + } if (err > 0) { nvme_show_status(err); From 19503279b0bfac18927420ec09888da77ea42a6d Mon Sep 17 00:00:00 2001 From: Leonardo da Cunha Date: Fri, 20 Sep 2024 09:51:09 +0200 Subject: [PATCH 177/281] completion: add solidgm work-tracker binding Signed-off-by: Leonardo da Cunha --- completions/_nvme | 36 +++++++++++++++++++++++------ completions/bash-nvme-completion.sh | 9 +++++++- 2 files changed, 37 insertions(+), 8 deletions(-) diff --git a/completions/_nvme b/completions/_nvme index 954b5c23b6..548887b48b 100644 --- a/completions/_nvme +++ b/completions/_nvme @@ -552,15 +552,36 @@ _nvme () { _arguments '*:: :->subcmds' _describe -t commands "nvme solidigm vs-drive-info" _vs_drive_info ;; - (set-telemetry-profile) - local _ocp_set_telemetry_profile_feature - _ocp_set_telemetry_profile_feature=( - /dev/nvme':supply a device to use (required)' - --telemetry-profile-select=':Telemetry Profile Select' - -t':alias for --telemetry-profile-select' + (workload-tracker) + local _workload_tracker + _workload_tracker=( + --enable':Enable Workload Tracker' + -e':alias for --enable' + --disable':Disable Workload Tracker' + -d':alias for --disable' + --sample-time=':Sample time in seconds' + -s':alias for --sample-time' + --type=':Workload Tracker type' + -t':alias for --type' + --run-time=':Run time in seconds' + -r':alias for --run-time' + --flush-freq=':Flush frequency in seconds' + -f':alias for --flush-freq' + --wall-clock':Use wall clock time' + -w':alias for --wall-clock' + --trigger-field=':Trigger field' + -T':alias for --trigger-field' + --trigger-threshold=':Trigger threshold' + -V':alias for --trigger-threshold' + --trigger-on-delta':Trigger on delta' + -D':alias for --trigger-on-delta' + --trigger-on-latency':Trigger on latency' + -L':alias for --trigger-on-latency' + --verbose':Increase output verbosity' + -v':alias for --verbose' ) _arguments '*:: :->subcmds' - _describe -t commands "nvme ocp set-telemetry-profile options" _ocp_set_telemetry_profile_feature + _describe -t commands "nvme solidigm workload-tracker options" _workload_tracker ;; (*) _files @@ -2623,6 +2644,7 @@ _nvme () { log-page-directory':Retrieve log page directory' temp-stats':Retrieve Temperature Statistics log' vs-drive-info':Retrieve drive information' + workload-tracker':Enable/Disable and configure Workload Tracker' cloud-SSDplugin-version':Prints plug-in OCP version' version':Shows the program version' help':Display this help' diff --git a/completions/bash-nvme-completion.sh b/completions/bash-nvme-completion.sh index b7035093ff..42ad0c4515 100644 --- a/completions/bash-nvme-completion.sh +++ b/completions/bash-nvme-completion.sh @@ -1181,6 +1181,13 @@ plugin_solidigm_opts () { "temp-stats") opts+=" --raw-binary -b" ;; + "workload-tracker") + opts+=" --enable -e --disable -d --sample-time= -s \ + --type= -t --run-time= -r --flush-freq= -f \ + --wall-clock -w --trigger-field= -T \ + --trigger-threshold= -V --trigger-on-delta -D \ + --trigger-on-latency -L --verbose -v" + ;; "version") opts+=$NO_OPTS ;; @@ -1588,7 +1595,7 @@ _nvme_subcmds () { clear-pcie-correctable-errors parse-telemetry-log \ clear-fw-activate-history vs-fw-activate-history log-page-directory \ vs-drive-info cloud-SSDplugin-version market-log \ - smart-log-add temp-stats version help" + smart-log-add temp-stats workload-tracker version help" [transcend]="healthvalue badblock" [dapustor]="smart-log-add" [zns]="id-ctrl id-ns zone-mgmt-recv \ From dd59efc378fd9cf830270f790d7f0bf9a8cee366 Mon Sep 17 00:00:00 2001 From: Leonardo da Cunha Date: Fri, 20 Sep 2024 09:50:25 +0200 Subject: [PATCH 178/281] completion: add ocp set-telemetry-profile to zsh The zsh completion is missing the ocp set-telemetry-profile binding. Signed-off-by: Leonardo da Cunha --- completions/_nvme | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/completions/_nvme b/completions/_nvme index 548887b48b..dc12b48427 100644 --- a/completions/_nvme +++ b/completions/_nvme @@ -376,6 +376,15 @@ _nvme () { ) _arguments '*:: :->subcmds' _describe -t commands "nvme ocp hardware-component-log options" _hardware_component_log + (set-telemetry-profile) + local _ocp_set_telemetry_profile_feature + _ocp_set_telemetry_profile_feature=( + /dev/nvme':supply a device to use (required)' + --telemetry-profile-select=':Telemetry Profile Select' + -t':alias for --telemetry-profile-select' + ) + _arguments '*:: :->subcmds' + _describe -t commands "nvme ocp set-telemetry-profile options" _ocp_set_telemetry_profile_feature ;; (*) _files From 3bf5bf7d2f5b87754a01521daacbfaae567a2c23 Mon Sep 17 00:00:00 2001 From: Tokunori Ikegami Date: Fri, 20 Sep 2024 23:54:02 +0900 Subject: [PATCH 179/281] nvme-print-stdout: use NVME_CTRL_OAES definitions This is to reduce the hard coded value usage. Signed-off-by: Tokunori Ikegami --- nvme-print-stdout.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/nvme-print-stdout.c b/nvme-print-stdout.c index 96aeb75a2f..d9e7a619c0 100644 --- a/nvme-print-stdout.c +++ b/nvme-print-stdout.c @@ -1686,19 +1686,19 @@ static void stdout_id_ctrl_cmic(__u8 cmic) static void stdout_id_ctrl_oaes(__le32 ctrl_oaes) { __u32 oaes = le32_to_cpu(ctrl_oaes); - __u32 disc = (oaes >> 31) & 0x1; + __u32 disc = (oaes & NVME_CTRL_OAES_DL) >> 31; __u32 rsvd0 = (oaes & 0x70000000) >> 28; - __u32 zicn = (oaes & 0x08000000) >> 27; + __u32 zicn = (oaes & NVME_CTRL_OAES_ZD) >> 27; __u32 rsvd1 = (oaes & 0x7fe0000) >> 17; __u32 tthr = (oaes & 0x10000) >> 16; - __u32 normal_shn = (oaes >> 15) & 0x1; - __u32 egealpcn = (oaes & 0x4000) >> 14; - __u32 lbasin = (oaes & 0x2000) >> 13; - __u32 plealcn = (oaes & 0x1000) >> 12; - __u32 anacn = (oaes & 0x800) >> 11; + __u32 normal_shn = (oaes & NVME_CTRL_OAES_NS) >> 15; + __u32 egealpcn = (oaes & NVME_CTRL_OAES_EGE) >> 14; + __u32 lbasin = (oaes & NVME_CTRL_OAES_LBAS) >> 13; + __u32 plealcn = (oaes & NVME_CTRL_OAES_PLEA) >> 12; + __u32 anacn = (oaes & NVME_CTRL_OAES_ANA) >> 11; __u32 rsvd2 = (oaes >> 10) & 0x1; - __u32 fan = (oaes & 0x200) >> 9; - __u32 nace = (oaes & 0x100) >> 8; + __u32 fan = (oaes & NVME_CTRL_OAES_FA) >> 9; + __u32 nace = (oaes & NVME_CTRL_OAES_NA) >> 8; __u32 rsvd3 = oaes & 0xFF; printf(" [31:31] : %#x\tDiscovery Log Change Notice %sSupported\n", From 81a3a6869235618a195a98e36539799f10a84adb Mon Sep 17 00:00:00 2001 From: Tokunori Ikegami Date: Sun, 15 Sep 2024 15:07:58 +0900 Subject: [PATCH 180/281] nvme: use NVME_GET_FEATURES_SEL definitions These changes are to replace the hardcoded SEL values. Signed-off-by: Tokunori Ikegami --- nvme-print.c | 19 +++++++++++++------ nvme.c | 12 ++++++------ nvme.h | 2 ++ 3 files changed, 21 insertions(+), 12 deletions(-) diff --git a/nvme-print.c b/nvme-print.c index 404b470ef3..a1dd797bd8 100644 --- a/nvme-print.c +++ b/nvme-print.c @@ -962,13 +962,20 @@ const char *nvme_register_to_string(int reg) const char *nvme_select_to_string(int sel) { switch (sel) { - case 0: return "Current"; - case 1: return "Default"; - case 2: return "Saved"; - case 3: return "Supported capabilities"; - case 8: return "Changed"; - default: return "Reserved"; + case NVME_GET_FEATURES_SEL_CURRENT: + return "Current"; + case NVME_GET_FEATURES_SEL_DEFAULT: + return "Default"; + case NVME_GET_FEATURES_SEL_SAVED: + return "Saved"; + case NVME_GET_FEATURES_SEL_SUPPORTED: + return "Supported capabilities"; + case NVME_GET_FEATURES_SEL_CHANGED: + return "Changed"; + default: + break; } + return "Reserved"; } void nvme_show_select_result(enum nvme_features_id fid, __u32 result) diff --git a/nvme.c b/nvme.c index ab5602d015..baeccb1835 100644 --- a/nvme.c +++ b/nvme.c @@ -4622,17 +4622,17 @@ static int get_feature_id_changed(struct nvme_dev *dev, struct feat_cfg cfg, _cleanup_free_ void *buf_def = NULL; if (changed) - cfg.sel = 0; + cfg.sel = NVME_GET_FEATURES_SEL_CURRENT; err = get_feature_id(dev, &cfg, &buf, &result); if (!err && changed) { - cfg.sel = 1; + cfg.sel = NVME_GET_FEATURES_SEL_DEFAULT; err_def = get_feature_id(dev, &cfg, &buf_def, &result_def); } if (changed) - cfg.sel = 8; + cfg.sel = NVME_GET_FEATURES_SEL_CHANGED; if (err || !changed || err_def || result != result_def || (buf && buf_def && !strcmp(buf, buf_def))) @@ -4651,7 +4651,7 @@ static int get_feature_ids(struct nvme_dev *dev, struct feat_cfg cfg) int status = 0; enum nvme_status_type type = NVME_STATUS_TYPE_NVME; - if (cfg.sel == 8) + if (cfg.sel == NVME_GET_FEATURES_SEL_CHANGED) changed = true; if (cfg.feature_id) @@ -4701,7 +4701,7 @@ static int get_feature(int argc, char **argv, struct command *cmd, struct feat_cfg cfg = { .feature_id = 0, .namespace_id = 0, - .sel = 0, + .sel = NVME_GET_FEATURES_SEL_CURRENT, .data_len = 0, .raw_binary = false, .cdw11 = 0, @@ -4734,7 +4734,7 @@ static int get_feature(int argc, char **argv, struct command *cmd, } } - if (cfg.sel > 8) { + if (cfg.sel > NVME_GET_FEATURES_SEL_CHANGED) { nvme_show_error("invalid 'select' param:%d", cfg.sel); return -EINVAL; } diff --git a/nvme.h b/nvme.h index cae4345214..4cd72efd50 100644 --- a/nvme.h +++ b/nvme.h @@ -92,6 +92,8 @@ struct nvme_config { OPT_END() \ } +#define NVME_GET_FEATURES_SEL_CHANGED 8 + static inline int __dev_fd(struct nvme_dev *dev, const char *func, int line) { if (dev->type != NVME_DEV_DIRECT) { From 49089e6be886e77625b48560aea1890f2ffedcc5 Mon Sep 17 00:00:00 2001 From: Tokunori Ikegami Date: Sat, 21 Sep 2024 01:12:12 +0900 Subject: [PATCH 181/281] nvme: separate get NVME_GET_FEATURES_SEL_CHANGED definition Since it is not defined in the NVMe specification. Signed-off-by: Tokunori Ikegami --- nvme-print.c | 2 -- nvme.c | 41 +++++++++++++++++------------------------ nvme.h | 2 -- 3 files changed, 17 insertions(+), 28 deletions(-) diff --git a/nvme-print.c b/nvme-print.c index a1dd797bd8..ae21c91f07 100644 --- a/nvme-print.c +++ b/nvme-print.c @@ -970,8 +970,6 @@ const char *nvme_select_to_string(int sel) return "Saved"; case NVME_GET_FEATURES_SEL_SUPPORTED: return "Supported capabilities"; - case NVME_GET_FEATURES_SEL_CHANGED: - return "Changed"; default: break; } diff --git a/nvme.c b/nvme.c index baeccb1835..9973664dd4 100644 --- a/nvme.c +++ b/nvme.c @@ -76,10 +76,11 @@ struct feat_cfg { enum nvme_get_features_sel sel; __u32 cdw11; __u32 cdw12; - __u8 uuid_index; + __u8 uuid_index; __u32 data_len; - bool raw_binary; - bool human_readable; + bool raw_binary; + bool human_readable; + bool changed; }; struct passthru_config { @@ -4583,8 +4584,7 @@ static int filter_out_flags(int status) NVME_GET(NVME_SC_MASK, SC)); } -static void get_feature_id_print(struct feat_cfg cfg, int err, __u32 result, - void *buf) +static void get_feature_id_print(struct feat_cfg cfg, int err, __u32 result, void *buf) { int status = filter_out_flags(err); enum nvme_status_type type = NVME_STATUS_TYPE_NVME; @@ -4595,8 +4595,7 @@ static void get_feature_id_print(struct feat_cfg cfg, int err, __u32 result, if (NVME_CHECK(cfg.sel, GET_FEATURES_SEL, SUPPORTED)) nvme_show_select_result(cfg.feature_id, result); else if (cfg.human_readable) - nvme_feature_show_fields(cfg.feature_id, result, - buf); + nvme_feature_show_fields(cfg.feature_id, result, buf); else if (buf) d(buf, cfg.data_len, 16, 1); } else if (buf) { @@ -4604,15 +4603,14 @@ static void get_feature_id_print(struct feat_cfg cfg, int err, __u32 result, } } else if (err > 0) { if (!nvme_status_equals(status, type, NVME_SC_INVALID_FIELD) && - !nvme_status_equals(status, type, NVME_SC_INVALID_NS)) + !nvme_status_equals(status, type, NVME_SC_INVALID_NS)) nvme_show_status(err); } else { nvme_show_error("get-feature: %s", nvme_strerror(errno)); } } -static int get_feature_id_changed(struct nvme_dev *dev, struct feat_cfg cfg, - bool changed) +static int get_feature_id_changed(struct nvme_dev *dev, struct feat_cfg cfg) { int err; int err_def = 0; @@ -4621,20 +4619,17 @@ static int get_feature_id_changed(struct nvme_dev *dev, struct feat_cfg cfg, _cleanup_free_ void *buf = NULL; _cleanup_free_ void *buf_def = NULL; - if (changed) + if (cfg.changed) cfg.sel = NVME_GET_FEATURES_SEL_CURRENT; err = get_feature_id(dev, &cfg, &buf, &result); - if (!err && changed) { + if (!err && cfg.changed) { cfg.sel = NVME_GET_FEATURES_SEL_DEFAULT; err_def = get_feature_id(dev, &cfg, &buf_def, &result_def); } - if (changed) - cfg.sel = NVME_GET_FEATURES_SEL_CHANGED; - - if (err || !changed || err_def || result != result_def || + if (err || !cfg.changed || err_def || result != result_def || (buf && buf_def && !strcmp(buf, buf_def))) get_feature_id_print(cfg, err, result, buf); @@ -4647,19 +4642,15 @@ static int get_feature_ids(struct nvme_dev *dev, struct feat_cfg cfg) int i; int feat_max = 0x100; int feat_num = 0; - bool changed = false; int status = 0; enum nvme_status_type type = NVME_STATUS_TYPE_NVME; - if (cfg.sel == NVME_GET_FEATURES_SEL_CHANGED) - changed = true; - if (cfg.feature_id) feat_max = cfg.feature_id + 1; for (i = cfg.feature_id; i < feat_max; i++, feat_num++) { cfg.feature_id = i; - err = get_feature_id_changed(dev, cfg, changed); + err = get_feature_id_changed(dev, cfg); if (!err) continue; status = filter_out_flags(err); @@ -4691,9 +4682,10 @@ static int get_feature(int argc, char **argv, struct command *cmd, "change saveable Features."; const char *raw = "show feature in binary format"; const char *feature_id = "feature identifier"; - const char *sel = "[0-3,8]: current/default/saved/supported/changed"; + const char *sel = "[0-3]: current/default/saved/supported"; const char *cdw11 = "feature specific dword 11"; const char *human_readable = "show feature in readable format"; + const char *changed = "show feature changed"; _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; int err; @@ -4717,7 +4709,8 @@ static int get_feature(int argc, char **argv, struct command *cmd, OPT_FLAG("raw-binary", 'b', &cfg.raw_binary, raw), OPT_UINT("cdw11", 'c', &cfg.cdw11, cdw11), OPT_BYTE("uuid-index", 'U', &cfg.uuid_index, uuid_index_specify), - OPT_FLAG("human-readable", 'H', &cfg.human_readable, human_readable)); + OPT_FLAG("human-readable", 'H', &cfg.human_readable, human_readable), + OPT_FLAG("changed", 'C', &cfg.changed, changed)); err = parse_and_open(&dev, argc, argv, desc, opts); if (err) @@ -4734,7 +4727,7 @@ static int get_feature(int argc, char **argv, struct command *cmd, } } - if (cfg.sel > NVME_GET_FEATURES_SEL_CHANGED) { + if (cfg.sel > NVME_GET_FEATURES_SEL_SUPPORTED) { nvme_show_error("invalid 'select' param:%d", cfg.sel); return -EINVAL; } diff --git a/nvme.h b/nvme.h index 4cd72efd50..cae4345214 100644 --- a/nvme.h +++ b/nvme.h @@ -92,8 +92,6 @@ struct nvme_config { OPT_END() \ } -#define NVME_GET_FEATURES_SEL_CHANGED 8 - static inline int __dev_fd(struct nvme_dev *dev, const char *func, int line) { if (dev->type != NVME_DEV_DIRECT) { From 11907dfc473a6b7976b512867a20555e4a55ada5 Mon Sep 17 00:00:00 2001 From: Tokunori Ikegami Date: Sat, 21 Sep 2024 01:22:08 +0900 Subject: [PATCH 182/281] doc: add get-feature command changed option Separeted from the sel option changed value. Signed-off-by: Tokunori Ikegami --- Documentation/nvme-get-feature.txt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Documentation/nvme-get-feature.txt b/Documentation/nvme-get-feature.txt index a055b93f1f..d035c29518 100644 --- a/Documentation/nvme-get-feature.txt +++ b/Documentation/nvme-get-feature.txt @@ -14,7 +14,7 @@ SYNOPSIS [--data-len= | -l ] [--sel=] [--raw-binary | -b] [--cdw11= | -c ] - [--human-readable | -H] + [--human-readable | -H] [--changed | -C] [--output-format= | -o ] [--verbose | -v] [--timeout= | -t ] @@ -84,6 +84,10 @@ OPTIONS This option will parse and format many of the bit fields into human-readable formats. +-C:: +--changed:: + This option will show feature changed. + -o :: --output-format=:: Set the reporting format to 'normal', 'json' or 'binary'. Only one From 26559809c69024b8c4e4e76a012fe77e50f996b1 Mon Sep 17 00:00:00 2001 From: Tokunori Ikegami Date: Sat, 21 Sep 2024 01:24:26 +0900 Subject: [PATCH 183/281] completions: add get-feature command changed option Separeted from the sel option changed value. Signed-off-by: Tokunori Ikegami --- completions/_nvme | 4 ++++ completions/bash-nvme-completion.sh | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/completions/_nvme b/completions/_nvme index dc12b48427..048fcee4c1 100644 --- a/completions/_nvme +++ b/completions/_nvme @@ -1245,6 +1245,10 @@ _nvme () { -b':alias to --raw-binary' --timeout=':value for timeout' -t':alias of --timeout' + --human-readable':show feature in readable format' + -H':alias of --human-readable' + --changed':show feature changed' + -C':alias of --changed' ) _arguments '*:: :->subcmds' _describe -t commands "nvme get-feature options" _getf diff --git a/completions/bash-nvme-completion.sh b/completions/bash-nvme-completion.sh index 42ad0c4515..451a6c0097 100644 --- a/completions/bash-nvme-completion.sh +++ b/completions/bash-nvme-completion.sh @@ -205,7 +205,7 @@ nvme_list_opts () { "get-feature") opts+=" --namespace-id= -n --feature-id= -f --sel= -s \ --data-len= -l --cdw11= --c -uuid-index= -U --raw-binary -b \ - --human-readable -H --timeout= -t" + --human-readable -H --timeout= -t --changed -C" ;; "device-self-test") opts+=" --namespace-id= -n --self-test-code= -s --timeout= -t" From c1fa24bf70d44fd31370d2ad94547aaa0d676481 Mon Sep 17 00:00:00 2001 From: Tokunori Ikegami Date: Sat, 21 Sep 2024 09:58:42 +0900 Subject: [PATCH 184/281] nvme-print: fix error information log page endianness error Convert the status and phase tag fields to native byte order at first. Signed-off-by: Tokunori Ikegami --- nvme-print-json.c | 4 ++-- nvme-print-stdout.c | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/nvme-print-json.c b/nvme-print-json.c index 38a2e35d99..3ac6baa4f1 100644 --- a/nvme-print-json.c +++ b/nvme-print-json.c @@ -474,8 +474,8 @@ static void json_error_log(struct nvme_error_log_page *err_log, int entries, obj_add_uint64(error, "error_count", le64_to_cpu(err_log[i].error_count)); obj_add_int(error, "sqid", le16_to_cpu(err_log[i].sqid)); obj_add_int(error, "cmdid", le16_to_cpu(err_log[i].cmdid)); - obj_add_int(error, "status_field", le16_to_cpu(err_log[i].status_field >> 0x1)); - obj_add_int(error, "phase_tag", le16_to_cpu(err_log[i].status_field & 0x1)); + obj_add_int(error, "status_field", le16_to_cpu(err_log[i].status_field) >> 0x1); + obj_add_int(error, "phase_tag", le16_to_cpu(err_log[i].status_field) & 0x1); obj_add_int(error, "parm_error_location", le16_to_cpu(err_log[i].parm_error_location)); obj_add_uint64(error, "lba", le64_to_cpu(err_log[i].lba)); diff --git a/nvme-print-stdout.c b/nvme-print-stdout.c index d9e7a619c0..8c8ac5f4b8 100644 --- a/nvme-print-stdout.c +++ b/nvme-print-stdout.c @@ -3664,8 +3664,7 @@ static void stdout_error_log(struct nvme_error_log_page *err_log, int entries, printf("cmdid : %#x\n", err_log[i].cmdid); printf("status_field : %#x (%s)\n", status, nvme_status_to_string(status, false)); - printf("phase_tag : %#x\n", - le16_to_cpu(err_log[i].status_field & 0x1)); + printf("phase_tag : %#x\n", le16_to_cpu(err_log[i].status_field) & 0x1); printf("parm_err_loc : %#x\n", err_log[i].parm_error_location); printf("lba : %#"PRIx64"\n", From 3ba0cf6fd0b332502183527f8a1e34a1ffa34847 Mon Sep 17 00:00:00 2001 From: Tokunori Ikegami Date: Sun, 22 Sep 2024 10:47:40 +0900 Subject: [PATCH 185/281] nvme: fix to convert metadata size to native byte order The changes for create-ns, compare, read and write commands. Signed-off-by: Tokunori Ikegami --- nvme.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/nvme.c b/nvme.c index 9973664dd4..02c89db5f0 100644 --- a/nvme.c +++ b/nvme.c @@ -2966,7 +2966,7 @@ static int parse_lba_num_si(struct nvme_dev *dev, const char *opt, } nvme_id_ns_flbas_to_lbaf_inuse(flbas, &lbaf); - lbas = (1 << ns->lbaf[lbaf].ds) + ns->lbaf[lbaf].ms; + lbas = (1 << ns->lbaf[lbaf].ds) + le16_to_cpu(ns->lbaf[lbaf].ms); if (suffix_si_parse(val, &endptr, (uint64_t *)num)) { nvme_show_error("Expected long suffixed integer argument for '%s-si' but got '%s'!", @@ -7693,7 +7693,8 @@ static int submit_io(int opcode, char *command, const char *desc, int argc, char _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; _cleanup_free_ struct nvme_nvm_id_ns *nvm_ns = NULL; _cleanup_free_ struct nvme_id_ns *ns = NULL; - __u8 lba_index, ms = 0, sts = 0, pif = 0; + __u8 lba_index, sts = 0, pif = 0; + __u16 ms; const char *start_block_addr = "64-bit addr of first block to access"; const char *data_size = "size of data in bytes"; @@ -7878,7 +7879,7 @@ static int submit_io(int opcode, char *command, const char *desc, int argc, char nvme_id_ns_flbas_to_lbaf_inuse(ns->flbas, &lba_index); logical_block_size = 1 << ns->lbaf[lba_index].ds; - ms = ns->lbaf[lba_index].ms; + ms = le16_to_cpu(ns->lbaf[lba_index].ms); nvm_ns = nvme_alloc(sizeof(*nvm_ns)); if (!nvm_ns) From de323e333f9a3a72d0de67e126f6aa6e17f993a8 Mon Sep 17 00:00:00 2001 From: Martin George Date: Sun, 22 Sep 2024 23:51:20 +0530 Subject: [PATCH 186/281] nvme: fix uninitialized value in error-log Valgrind complained about an "uninitialized value created by a stack allocation" error while running the error-log command. Fix the same. Signed-off-by: Martin George --- nvme.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nvme.c b/nvme.c index 02c89db5f0..a1e65fb340 100644 --- a/nvme.c +++ b/nvme.c @@ -1169,7 +1169,7 @@ static int get_error_log(int argc, char **argv, struct command *cmd, struct plug _cleanup_free_ struct nvme_error_log_page *err_log = NULL; _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; - struct nvme_id_ctrl ctrl; + struct nvme_id_ctrl ctrl = { 0 }; nvme_print_flags_t flags; int err = -1; From c7ce9e91de84bff2ce0bd553dad4c30ce56942ca Mon Sep 17 00:00:00 2001 From: Martin George Date: Tue, 24 Sep 2024 16:21:48 +0530 Subject: [PATCH 187/281] nvme-print-stdout: update changed-ns-list-log output The changed-ns-list-log command currently prints nothing for scenarios where there are no changed ns in the log data. Print a meaningful message for the same. Signed-off-by: Martin George --- nvme-print-stdout.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/nvme-print-stdout.c b/nvme-print-stdout.c index 8c8ac5f4b8..c93c2e7eba 100644 --- a/nvme-print-stdout.c +++ b/nvme-print-stdout.c @@ -3768,8 +3768,10 @@ static void stdout_changed_ns_list_log(struct nvme_ns_list *log, if (log->ns[0] != cpu_to_le32(NVME_NSID_ALL)) { for (i = 0; i < NVME_ID_NS_LIST_MAX; i++) { nsid = le32_to_cpu(log->ns[i]); - if (nsid == 0) + if (nsid == 0) { + printf("no ns changed\n"); break; + } printf("[%4u]:%#x\n", i, nsid); } From b090be5af6bae125d5536f9d5f77d6e19b07407f Mon Sep 17 00:00:00 2001 From: Francis Pravin Date: Wed, 25 Sep 2024 09:47:31 +0530 Subject: [PATCH 188/281] nvme-print-json: print CMBEBS and CMBSWTP in json format Print the CMBEBS and CMBSWTP register in json forma Signed-off-by: Francis Pravin --- nvme-print-json.c | 70 +++++++++++++++++++++++++++++++---------------- 1 file changed, 46 insertions(+), 24 deletions(-) diff --git a/nvme-print-json.c b/nvme-print-json.c index 3ac6baa4f1..f8109b8a7a 100644 --- a/nvme-print-json.c +++ b/nvme-print-json.c @@ -1182,6 +1182,30 @@ static void json_registers_cmbsts(uint32_t cmbsts, struct json_object *r) obj_add_uint_x(r, "Controller Base Address Invalid (CBAI)", cmbsts & 1); } +static void json_registers_cmbebs(uint32_t cmbebs, struct json_object *r) +{ + char buffer[BUF_LEN]; + + obj_add_uint_nx(r, "cmbebs", cmbebs); + + obj_add_uint_nx(r, "CMB Elasticity Buffer Size Base (CMBWBZ)", cmbebs >> 8); + sprintf(buffer, "%s", cmbebs & 0x10 ? "shall" : "may"); + obj_add_str(r, "CMB Read Bypass Behavior (CMBRBB)", buffer); + obj_add_str(r, "CMB Elasticity Buffer Size Units (CMBSZU)", + nvme_register_unit_to_string(cmbebs & 0xf)); +} + +static void json_registers_cmbswtp(uint32_t cmbswtp, struct json_object *r) +{ + char str[STR_LEN]; + + obj_add_uint_nx(r, "cmbswtp", cmbswtp); + + obj_add_uint_nx(r, "CMB Sustained Write Throughput (CMBSWTV)", cmbswtp >> 8); + sprintf(str, "%s/second", nvme_register_unit_to_string(cmbswtp & 0xf)); + obj_add_str(r, "CMB Sustained Write Throughput Units (CMBSWTU)", str); +} + static void json_registers_pmrcap(uint32_t pmrcap, struct json_object *r) { obj_add_uint_x(r, "pmrcap", pmrcap); @@ -2682,6 +2706,26 @@ static void json_ctrl_registers_cmbsts(void *bar, struct json_object *r) obj_add_int(r, "cmbsts", cmbsts); } +static void json_ctrl_registers_cmbebs(void *bar, struct json_object *r) +{ + uint32_t cmbebs = mmio_read32(bar + NVME_REG_CMBEBS); + + if (human()) + json_registers_cmbebs(cmbebs, obj_create_array_obj(r, "cmbebs")); + else + obj_add_int(r, "cmbebs", cmbebs); +} + +static void json_ctrl_registers_cmbswtp(void *bar, struct json_object *r) +{ + uint32_t cmbswtp = mmio_read32(bar + NVME_REG_CMBSWTP); + + if (human()) + json_registers_cmbswtp(cmbswtp, obj_create_array_obj(r, "cmbswtp")); + else + obj_add_int(r, "cmbswtp", cmbswtp); +} + static void json_ctrl_registers_pmrcap(void *bar, struct json_object *r) { uint32_t pmrcap = mmio_read32(bar + NVME_REG_PMRCAP); @@ -2780,6 +2824,8 @@ static void json_ctrl_registers(void *bar, bool fabrics) json_ctrl_registers_bpmbl(bar, r); json_ctrl_registers_cmbmsc(bar, r); json_ctrl_registers_cmbsts(bar, r); + json_ctrl_registers_cmbebs(bar, r); + json_ctrl_registers_cmbswtp(bar, r); json_ctrl_registers_pmrcap(bar, r); json_ctrl_registers_pmrctl(bar, r); json_ctrl_registers_pmrsts(bar, r); @@ -2791,30 +2837,6 @@ static void json_ctrl_registers(void *bar, bool fabrics) json_print(r); } -static void json_registers_cmbebs(__u32 cmbebs, struct json_object *r) -{ - char buffer[BUF_LEN]; - - obj_add_uint_nx(r, "cmbebs", cmbebs); - - obj_add_uint_nx(r, "CMB Elasticity Buffer Size Base (CMBWBZ)", cmbebs >> 8); - sprintf(buffer, "%s", cmbebs & 0x10 ? "shall" : "may"); - obj_add_str(r, "Read Bypass Behavior", buffer); - obj_add_str(r, "CMB Elasticity Buffer Size Units (CMBSZU)", - nvme_register_unit_to_string(cmbebs & 0xf)); -} - -static void json_registers_cmbswtp(__u32 cmbswtp, struct json_object *r) -{ - char str[STR_LEN]; - - obj_add_uint_nx(r, "cmbswtp", cmbswtp); - - obj_add_uint_nx(r, "CMB Sustained Write Throughput (CMBSWTV)", cmbswtp >> 8); - sprintf(str, "%s", nvme_register_unit_to_string(cmbswtp & 0xf)); - obj_add_str(r, "CMB Sustained Write Throughput Units (CMBSWTU)", str); -} - static void json_ctrl_register_human(int offset, uint64_t value, struct json_object *r) { char buffer[BUF_LEN]; From 803fba764cb35e3b2e5abc62639d445e6dfe12d8 Mon Sep 17 00:00:00 2001 From: Francis Pravin Date: Wed, 25 Sep 2024 09:52:11 +0530 Subject: [PATCH 189/281] nvme-print-json: print controller register values in offset order Print the Controller Register valuse in order based on the offset. Signed-off-by: Francis Pravin --- nvme-print-json.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nvme-print-json.c b/nvme-print-json.c index f8109b8a7a..d2faa1c797 100644 --- a/nvme-print-json.c +++ b/nvme-print-json.c @@ -2812,8 +2812,6 @@ static void json_ctrl_registers(void *bar, bool fabrics) json_ctrl_registers_cc(bar, r); json_ctrl_registers_csts(bar, r); json_ctrl_registers_nssr(bar, r); - json_ctrl_registers_nssd(bar, r); - json_ctrl_registers_crto(bar, r); json_ctrl_registers_aqa(bar, r); json_ctrl_registers_asq(bar, r); json_ctrl_registers_acq(bar, r); @@ -2826,6 +2824,8 @@ static void json_ctrl_registers(void *bar, bool fabrics) json_ctrl_registers_cmbsts(bar, r); json_ctrl_registers_cmbebs(bar, r); json_ctrl_registers_cmbswtp(bar, r); + json_ctrl_registers_nssd(bar, r); + json_ctrl_registers_crto(bar, r); json_ctrl_registers_pmrcap(bar, r); json_ctrl_registers_pmrctl(bar, r); json_ctrl_registers_pmrsts(bar, r); From 657f100bff6869e356fef784a4376748730b68f9 Mon Sep 17 00:00:00 2001 From: Tetsuya TAKAHASHI Date: Fri, 27 Sep 2024 14:25:02 +0900 Subject: [PATCH 190/281] ocp: fix GUID output Some OCP commands are missing a high-order zero in each byte of the output GUID. This commit fixes the format specifier for the printf function. Signed-off-by: Tetsuya TAKAHASHI Signed-off-by: Koki Ueha --- plugins/ocp/ocp-nvme.c | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/plugins/ocp/ocp-nvme.c b/plugins/ocp/ocp-nvme.c index 810ad128ed..8ebeb54d38 100644 --- a/plugins/ocp/ocp-nvme.c +++ b/plugins/ocp/ocp-nvme.c @@ -539,11 +539,11 @@ static int get_c3_log_page(struct nvme_dev *dev, char *format) fprintf(stderr, "ERROR : OCP : Unknown GUID in C3 Log Page data\n"); fprintf(stderr, "ERROR : OCP : Expected GUID: 0x"); for (j = 0; j < 16; j++) - fprintf(stderr, "%x", lat_mon_guid[j]); + fprintf(stderr, "%02x", lat_mon_guid[j]); fprintf(stderr, "\nERROR : OCP : Actual GUID: 0x"); for (j = 0; j < 16; j++) - fprintf(stderr, "%x", log_data->log_page_guid[j]); + fprintf(stderr, "%02x", log_data->log_page_guid[j]); fprintf(stderr, "\n"); ret = -1; @@ -1994,7 +1994,7 @@ static int ocp_print_C5_log_normal(struct nvme_dev *dev, printf(" Log Page Version : 0x%x\n", le16_to_cpu(log_data->log_page_version)); printf(" Log page GUID : 0x"); for (j = C5_GUID_LENGTH - 1; j >= 0; j--) - printf("%x", log_data->log_page_guid[j]); + printf("%02x", log_data->log_page_guid[j]); printf("\n"); return 0; @@ -2079,10 +2079,10 @@ static int get_c5_log_page(struct nvme_dev *dev, char *format) fprintf(stderr, "ERROR : OCP : Unknown GUID in C5 Log Page data\n"); fprintf(stderr, "ERROR : OCP : Expected GUID: 0x"); for (j = 0; j < 16; j++) - fprintf(stderr, "%x", unsupported_req_guid[j]); + fprintf(stderr, "%02x", unsupported_req_guid[j]); fprintf(stderr, "\nERROR : OCP : Actual GUID: 0x"); for (j = 0; j < 16; j++) - fprintf(stderr, "%x", log_data->log_page_guid[j]); + fprintf(stderr, "%02x", log_data->log_page_guid[j]); fprintf(stderr, "\n"); ret = -1; @@ -2233,7 +2233,7 @@ static void ocp_print_c1_log_normal(struct ocp_error_recovery_log_page *log_data printf(" Log Page Version : 0x%x\n", le16_to_cpu(log_data->log_page_version)); printf(" Log page GUID : 0x"); for (i = C1_GUID_LENGTH - 1; i >= 0; i--) - printf("%x", log_data->log_page_guid[i]); + printf("%02x", log_data->log_page_guid[i]); printf("\n"); } @@ -2314,10 +2314,10 @@ static int get_c1_log_page(struct nvme_dev *dev, char *format) fprintf(stderr, "ERROR : OCP : Unknown GUID in C1 Log Page data\n"); fprintf(stderr, "ERROR : OCP : Expected GUID: 0x"); for (j = 0; j < 16; j++) - fprintf(stderr, "%x", error_recovery_guid[j]); + fprintf(stderr, "%02x", error_recovery_guid[j]); fprintf(stderr, "\nERROR : OCP : Actual GUID: 0x"); for (j = 0; j < 16; j++) - fprintf(stderr, "%x", log_data->log_page_guid[j]); + fprintf(stderr, "%02x", log_data->log_page_guid[j]); fprintf(stderr, "\n"); ret = -1; @@ -2451,7 +2451,7 @@ static void ocp_print_c4_log_normal(struct ocp_device_capabilities_log_page *log printf(" Log Page Version : 0x%x\n", le16_to_cpu(log_data->log_page_version)); printf(" Log page GUID : 0x"); for (i = C4_GUID_LENGTH - 1; i >= 0; i--) - printf("%x", log_data->log_page_guid[i]); + printf("%02x", log_data->log_page_guid[i]); printf("\n"); } @@ -2530,10 +2530,10 @@ static int get_c4_log_page(struct nvme_dev *dev, char *format) fprintf(stderr, "ERROR : OCP : Unknown GUID in C4 Log Page data\n"); fprintf(stderr, "ERROR : OCP : Expected GUID: 0x"); for (j = 0; j < 16; j++) - fprintf(stderr, "%x", dev_cap_req_guid[j]); + fprintf(stderr, "%02x", dev_cap_req_guid[j]); fprintf(stderr, "\nERROR : OCP : Actual GUID: 0x"); for (j = 0; j < 16; j++) - fprintf(stderr, "%x", log_data->log_page_guid[j]); + fprintf(stderr, "%02x", log_data->log_page_guid[j]); fprintf(stderr, "\n"); ret = -1; @@ -3185,7 +3185,7 @@ static int ocp_print_c9_log_normal(struct telemetry_str_log_format *log_data, __ printf(" Log page GUID : 0x"); for (j = C9_GUID_LENGTH - 1; j >= 0; j--) - printf("%x", log_data->log_page_guid[j]); + printf("%02x", log_data->log_page_guid[j]); printf("\n"); printf(" Telemetry String Log Size : 0x%lx\n", le64_to_cpu(log_data->sls)); @@ -3784,7 +3784,7 @@ static int ocp_print_C7_log_normal(struct nvme_dev *dev, printf(" Log Page Version : 0x%x\n", le16_to_cpu(log_data->log_page_version)); printf(" Log page GUID : 0x"); for (j = C7_GUID_LENGTH - 1; j >= 0; j--) - printf("%x", log_data->log_page_guid[j]); + printf("%02x", log_data->log_page_guid[j]); printf("\n"); return 0; @@ -3890,10 +3890,10 @@ static int get_c7_log_page(struct nvme_dev *dev, char *format) fprintf(stderr, "ERROR : OCP : Unknown GUID in C7 Log Page data\n"); fprintf(stderr, "ERROR : OCP : Expected GUID: 0x"); for (j = 0; j < 16; j++) - fprintf(stderr, "%x", tcg_configuration_guid[j]); + fprintf(stderr, "%02x", tcg_configuration_guid[j]); fprintf(stderr, "\nERROR : OCP : Actual GUID: 0x"); for (j = 0; j < 16; j++) - fprintf(stderr, "%x", log_data->log_page_guid[j]); + fprintf(stderr, "%02x", log_data->log_page_guid[j]); fprintf(stderr, "\n"); ret = -1; From fb752ba195a43369ee58dc4d233de7f7ea055375 Mon Sep 17 00:00:00 2001 From: Francis Pravin Date: Mon, 30 Sep 2024 18:22:31 +0530 Subject: [PATCH 191/281] nvme-print: print NSSES field of CAP register Print the newly added NSSES field of CAP register. Signed-off-by: Francis Pravin --- nvme-print-json.c | 2 ++ nvme-print-stdout.c | 2 ++ nvme-print.h | 3 ++- 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/nvme-print-json.c b/nvme-print-json.c index d2faa1c797..cd342470d9 100644 --- a/nvme-print-json.c +++ b/nvme-print-json.c @@ -853,6 +853,8 @@ static void json_registers_cap(struct nvme_bar_cap *cap, struct json_object *r) sprintf(json_str, "%"PRIx64"", *(uint64_t *)cap); obj_add_str(r, "cap", json_str); + obj_add_str(r, "NVM Subsystem Shutdown Enhancements Supported (NSSES)", + cap->nsses ? "Supported" : "Not supported"); obj_add_str(r, "Controller Ready With Media Support (CRWMS)", cap->crwms ? "Supported" : "Not supported"); obj_add_str(r, "Controller Ready Independent of Media Support (CRIMS)", diff --git a/nvme-print-stdout.c b/nvme-print-stdout.c index c93c2e7eba..a885441d33 100644 --- a/nvme-print-stdout.c +++ b/nvme-print-stdout.c @@ -1109,6 +1109,8 @@ static void stdout_subsystem_list(nvme_root_t r, bool show_ana) static void stdout_registers_cap(struct nvme_bar_cap *cap) { + printf("\tNVM Subsystem Shutdown Enhancements Supported (NSSES): %s\n", + cap->nsses ? "Supported" : "Not Supported"); printf("\tController Ready With Media Support (CRWMS): %s\n", cap->crwms ? "Supported" : "Not Supported"); printf("\tController Ready Independent of Media Support (CRIMS): %s\n", diff --git a/nvme-print.h b/nvme-print.h index 3f79fd6851..7ebf64556e 100644 --- a/nvme-print.h +++ b/nvme-print.h @@ -128,7 +128,8 @@ struct nvme_bar_cap { __u8 nsss:1; __u8 crwms:1; __u8 crims:1; - __u8 rsvd61:3; + __u8 nsses:1; + __u8 rsvd62:2; }; #ifdef CONFIG_JSONC From 3b12f402c13e5c0a389f25c1339651a943dae7c8 Mon Sep 17 00:00:00 2001 From: Daniel Wagner Date: Tue, 1 Oct 2024 16:42:44 +0200 Subject: [PATCH 192/281] build: use linux-nvme/ci-containers Use the pre build containers from linux-nvme/ci-containers. Signed-off-by: Daniel Wagner --- .github/workflows/appimage.yml | 2 +- .github/workflows/build.yml | 18 ++++++++++++------ .github/workflows/coverage.yml | 2 +- .github/workflows/docs.yaml | 2 +- 4 files changed, 15 insertions(+), 9 deletions(-) diff --git a/.github/workflows/appimage.yml b/.github/workflows/appimage.yml index c7b92f7fde..9768c70c9d 100644 --- a/.github/workflows/appimage.yml +++ b/.github/workflows/appimage.yml @@ -14,7 +14,7 @@ jobs: name: build AppImage runs-on: ubuntu-latest container: - image: ghcr.io/igaw/linux-nvme/debian:latest + image: ghcr.io/linux-nvme/debian:latest steps: - uses: actions/checkout@v4 with: diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 66b3811bae..a52f129c24 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -17,7 +17,7 @@ jobs: compiler: [gcc, clang] buildtype: [debug, release] container: - image: ghcr.io/igaw/linux-nvme/debian.python:latest + image: ghcr.io/linux-nvme/debian.python:latest steps: - uses: actions/checkout@v4 - name: build @@ -43,10 +43,16 @@ jobs: - uses: actions/checkout@v4 - name: enable foreign arch uses: dbhi/qus/action@main + - name: Login to GitHub Container Registry + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} - name: compile and run unit tests uses: mosteo-actions/docker-run@v2 with: - image: ghcr.io/igaw/linux-nvme/ubuntu-cross-${{ matrix.arch }}:latest + image: ghcr.io/linux-nvme/ubuntu-cross-${{ matrix.arch }}:latest guest-dir: /build host-dir: ${{ github.workspace }} command: | @@ -65,7 +71,7 @@ jobs: name: fallback shared libraries runs-on: ubuntu-latest container: - image: ghcr.io/igaw/linux-nvme/debian:latest + image: ghcr.io/linux-nvme/debian:latest if: github.ref == 'refs/heads/master' steps: - uses: actions/checkout@v4 @@ -83,7 +89,7 @@ jobs: name: muon minimal static runs-on: ubuntu-latest container: - image: ghcr.io/igaw/linux-nvme/debian:latest + image: ghcr.io/linux-nvme/debian:latest steps: - uses: actions/checkout@v4 - name: build @@ -94,7 +100,7 @@ jobs: name: make static runs-on: ubuntu-latest container: - image: ghcr.io/igaw/linux-nvme/debian:latest + image: ghcr.io/linux-nvme/debian:latest steps: - uses: actions/checkout@v4 - name: build @@ -105,7 +111,7 @@ jobs: name: build libnvme and nvme-cli separately runs-on: ubuntu-latest container: - image: ghcr.io/igaw/linux-nvme/debian:latest + image: ghcr.io/linux-nvme/debian:latest steps: - uses: actions/checkout@v4 - name: build diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index 875ed6d6d2..20c69fa44d 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -11,7 +11,7 @@ jobs: name: code coverage runs-on: ubuntu-latest container: - image: ghcr.io/igaw/linux-nvme/debian.python:latest + image: ghcr.io/linux-nvme/debian.python:latest steps: - uses: actions/checkout@v4 - name: build diff --git a/.github/workflows/docs.yaml b/.github/workflows/docs.yaml index 89fbd67b77..465bb260ca 100644 --- a/.github/workflows/docs.yaml +++ b/.github/workflows/docs.yaml @@ -18,7 +18,7 @@ jobs: name: build documentation runs-on: ubuntu-latest container: - image: ghcr.io/igaw/linux-nvme/debian:latest + image: ghcr.io/linux-nvme/debian:latest steps: - uses: actions/checkout@v4 - name: build From a30750e0d23be037abfa7ac650819b45dd793078 Mon Sep 17 00:00:00 2001 From: Brandon Paupore Date: Mon, 30 Sep 2024 15:12:00 -0500 Subject: [PATCH 193/281] wdc: add support for SNTMP drive Adding an additional PCI Device ID (0x2761) to be recognized. Signed-off-by: Brandon Paupore --- plugins/wdc/wdc-nvme.c | 3 +++ plugins/wdc/wdc-nvme.h | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/plugins/wdc/wdc-nvme.c b/plugins/wdc/wdc-nvme.c index 3c7982b86d..ca77d66dde 100644 --- a/plugins/wdc/wdc-nvme.c +++ b/plugins/wdc/wdc-nvme.c @@ -88,6 +88,7 @@ #define WDC_NVME_SN861_DEV_ID 0x2750 #define WDC_NVME_SN861_DEV_ID_1 0x2751 #define WDC_NVME_SN861_DEV_ID_2 0x2752 +#define WDC_NVME_SNTMP_DEV_ID 0x2761 /* This id's are no longer supported, delete ?? */ #define WDC_NVME_SN550_DEV_ID 0x2708 @@ -1877,6 +1878,7 @@ static __u64 wdc_get_drive_capabilities(nvme_root_t r, struct nvme_dev *dev) case WDC_NVME_SN861_DEV_ID: case WDC_NVME_SN861_DEV_ID_1: case WDC_NVME_SN861_DEV_ID_2: + case WDC_NVME_SNTMP_DEV_ID: capabilities |= (WDC_DRIVE_CAP_C0_LOG_PAGE | WDC_DRIVE_CAP_C3_LOG_PAGE | WDC_DRIVE_CAP_CA_LOG_PAGE | @@ -11318,6 +11320,7 @@ static int wdc_vs_drive_info(int argc, char **argv, case WDC_NVME_SN550_DEV_ID: case WDC_NVME_ZN350_DEV_ID: case WDC_NVME_ZN350_DEV_ID_1: + case WDC_NVME_SNTMP_DEV_ID: ret = wdc_do_drive_info(dev, &result); if (!ret) { diff --git a/plugins/wdc/wdc-nvme.h b/plugins/wdc/wdc-nvme.h index 196ee1a983..4a921b805f 100644 --- a/plugins/wdc/wdc-nvme.h +++ b/plugins/wdc/wdc-nvme.h @@ -5,7 +5,7 @@ #if !defined(WDC_NVME) || defined(CMD_HEADER_MULTI_READ) #define WDC_NVME -#define WDC_PLUGIN_VERSION "2.10.0" +#define WDC_PLUGIN_VERSION "2.11.0" #include "cmd.h" PLUGIN(NAME("wdc", "Western Digital vendor specific extensions", WDC_PLUGIN_VERSION), From bed555019316372047f9b99e01339904f3e0865c Mon Sep 17 00:00:00 2001 From: Leonardo da Cunha Date: Tue, 17 Sep 2024 20:36:46 -0700 Subject: [PATCH 194/281] Documentation: Added solidigm plugin commands Added documentation to all current solidigm plugin commands Signed-off-by: Leonardo da Cunha --- Documentation/meson.build | 16 +++ ...vme-solidigm-clear-fw-activate-history.txt | 48 ++++++++ ...solidigm-clear-pcie-correctable-errors.txt | 49 +++++++++ .../nvme-solidigm-cloud-SSDplugin-version.txt | 29 +++++ .../nvme-solidigm-garbage-collect-log.txt | 44 ++++++++ Documentation/nvme-solidigm-id-ctrl.txt | 74 +++++++++++++ .../nvme-solidigm-latency-tracking-log.txt | 79 +++++++++++++ .../nvme-solidigm-log-page-directory.txt | 44 ++++++++ Documentation/nvme-solidigm-market-log.txt | 42 +++++++ .../nvme-solidigm-parse-telemetry-log.txt | 86 +++++++++++++++ Documentation/nvme-solidigm-smart-log-add.txt | 56 ++++++++++ Documentation/nvme-solidigm-temp-stats.txt | 44 ++++++++ Documentation/nvme-solidigm-vs-drive-info.txt | 45 ++++++++ .../nvme-solidigm-vs-fw-activate-history.txt | 39 +++++++ .../nvme-solidigm-vs-internal-log.txt | 59 ++++++++++ .../nvme-solidigm-vs-smart-add-log.txt | 39 +++++++ .../nvme-solidigm-workload-tracker.txt | 104 ++++++++++++++++++ 17 files changed, 897 insertions(+) create mode 100644 Documentation/nvme-solidigm-clear-fw-activate-history.txt create mode 100644 Documentation/nvme-solidigm-clear-pcie-correctable-errors.txt create mode 100644 Documentation/nvme-solidigm-cloud-SSDplugin-version.txt create mode 100644 Documentation/nvme-solidigm-garbage-collect-log.txt create mode 100644 Documentation/nvme-solidigm-id-ctrl.txt create mode 100644 Documentation/nvme-solidigm-latency-tracking-log.txt create mode 100644 Documentation/nvme-solidigm-log-page-directory.txt create mode 100644 Documentation/nvme-solidigm-market-log.txt create mode 100644 Documentation/nvme-solidigm-parse-telemetry-log.txt create mode 100644 Documentation/nvme-solidigm-smart-log-add.txt create mode 100644 Documentation/nvme-solidigm-temp-stats.txt create mode 100644 Documentation/nvme-solidigm-vs-drive-info.txt create mode 100644 Documentation/nvme-solidigm-vs-fw-activate-history.txt create mode 100644 Documentation/nvme-solidigm-vs-internal-log.txt create mode 100644 Documentation/nvme-solidigm-vs-smart-add-log.txt create mode 100644 Documentation/nvme-solidigm-workload-tracker.txt diff --git a/Documentation/meson.build b/Documentation/meson.build index 4e8ffcad26..65495e3cce 100644 --- a/Documentation/meson.build +++ b/Documentation/meson.build @@ -143,6 +143,22 @@ adoc_sources = [ 'nvme-show-regs', 'nvme-show-topology', 'nvme-smart-log', + 'nvme-solidigm-clear-fw-activate-history', + 'nvme-solidigm-clear-pcie-correctable-errors', + 'nvme-solidigm-cloud-SSDplugin-version', + 'nvme-solidigm-garbage-collect-log', + 'nvme-solidigm-id-ctrl', + 'nvme-solidigm-latency-tracking-log', + 'nvme-solidigm-log-page-directory', + 'nvme-solidigm-market-log', + 'nvme-solidigm-parse-telemetry-log', + 'nvme-solidigm-smart-log-add', + 'nvme-solidigm-temp-stats', + 'nvme-solidigm-vs-drive-info', + 'nvme-solidigm-vs-fw-activate-history', + 'nvme-solidigm-vs-internal-log', + 'nvme-solidigm-vs-smart-add-log', + 'nvme-solidigm-workload-tracker', 'nvme-subsystem-reset', 'nvme-supported-log-pages', 'nvme-telemetry-log', diff --git a/Documentation/nvme-solidigm-clear-fw-activate-history.txt b/Documentation/nvme-solidigm-clear-fw-activate-history.txt new file mode 100644 index 0000000000..ac74728b24 --- /dev/null +++ b/Documentation/nvme-solidigm-clear-fw-activate-history.txt @@ -0,0 +1,48 @@ +nvme-solidigm-clear-fw-activate-history(1) +========================================== + +NAME +---- +nvme-solidigm-clear-fw-activate-history - Clear firmware update history log + +SYNOPSIS +-------- +[verse] +'nvme solidigm clear-fw-activate-history' [--no-uuid | -n] + +DESCRIPTION +----------- +This command is a redirect to the OCP plugin's clear firmware update history log command. +For detailed usage and options, please refer to the documentation for 'nvme ocp clear-fw-activate-history'. + +The parameter is mandatory and may be either the NVMe character +device (ex: /dev/nvme0) or block device (ex: /dev/nvme0n1). + +OPTIONS +------- +-n:: +--no-uuid:: + Do not try to automatically detect UUID index for this command (required + for old OCP 1.0 support) + +EXAMPLES +-------- +* Clear the firmware update history log for the device: ++ +------------ +# nvme solidigm clear-fw-activate-history /dev/nvme0 +------------ + +* Clear the firmware update history log for an OCP 1.0 device: ++ +------------ +# nvme solidigm clear-fw-activate-history /dev/nvme0 --no-uuid +------------ + +SEE ALSO +-------- +nvme-ocp-clear-fw-activate-history(1) + +NVME +---- +Part of the nvme-cli suite. diff --git a/Documentation/nvme-solidigm-clear-pcie-correctable-errors.txt b/Documentation/nvme-solidigm-clear-pcie-correctable-errors.txt new file mode 100644 index 0000000000..3f5883d890 --- /dev/null +++ b/Documentation/nvme-solidigm-clear-pcie-correctable-errors.txt @@ -0,0 +1,49 @@ +nvme-solidigm-clear-pcie-correctable-errors(1) +============================================== + +NAME +---- +nvme-solidigm-clear-pcie-correctable-errors - Clear PCIe Correctable Error Counters + +SYNOPSIS +-------- +[verse] +'nvme solidigm clear-pcie-correctable-errors' [--no-uuid | -n] + +DESCRIPTION +----------- +This command is a redirect to the OCP plugin's clear PCIe correctable error counters command. +For detailed usage and options, please refer to the documentation for 'nvme ocp clear-pcie-correctable-error-counters'. + +The parameter is mandatory and may be either the NVMe character +device (ex: /dev/nvme0) or block device (ex: /dev/nvme0n1). + +OPTIONS +------- +-n:: +--no-uuid:: + Do not try to automatically detect UUID index for this command (required + for old OCP 1.0 support). This option is necessary for devices that do not + support OCP 2.0 or NVMe 1.4. + +EXAMPLES +-------- +* Clear PCIe Correctable Error Counters for the device: ++ +------------ +# nvme solidigm clear-pcie-correctable-errors /dev/nvme0 +------------ + +* Clear PCIe Correctable Error Counters for an OCP 1.0 device: ++ +------------ +# nvme solidigm clear-pcie-correctable-errors /dev/nvme0 --no-uuid +------------ + +SEE ALSO +-------- +nvme-ocp-clear-pcie-correctable-error-counters(1) + +NVME +---- +Part of the nvme-cli suite. diff --git a/Documentation/nvme-solidigm-cloud-SSDplugin-version.txt b/Documentation/nvme-solidigm-cloud-SSDplugin-version.txt new file mode 100644 index 0000000000..5d17e47486 --- /dev/null +++ b/Documentation/nvme-solidigm-cloud-SSDplugin-version.txt @@ -0,0 +1,29 @@ +nvme-solidigm-cloud-SSDplugin-version(1) +======================================== + +NAME +---- +nvme-solidigm-cloud-SSDplugin-version - Prints plug-in OCP version + +SYNOPSIS +-------- +[verse] +'nvme solidigm cloud-SSDplugin-version' + +DESCRIPTION +----------- +Displays the OCP (Open Compute Project) version of the Solidigm cloud SSD plugin. + +EXAMPLES +-------- +* Display the OCP plugin version: ++ +------------ +# nvme solidigm cloud-SSDplugin-version +------------ + +NVME +---- +Part of the nvme-user suite + + diff --git a/Documentation/nvme-solidigm-garbage-collect-log.txt b/Documentation/nvme-solidigm-garbage-collect-log.txt new file mode 100644 index 0000000000..77e1be3d80 --- /dev/null +++ b/Documentation/nvme-solidigm-garbage-collect-log.txt @@ -0,0 +1,44 @@ +nvme-solidigm-garbage-collect-log(1) +==================================== + +NAME +---- +nvme-solidigm-garbage-collect-log - Retrieve Garbage Collection Log + +SYNOPSIS +-------- +[verse] +'nvme solidigm garbage-collect-log' [--output-format= | -o ] + +DESCRIPTION +----------- +Retrieves and displays the Solidigm vendor-specific garbage collection log +for the given NVMe device. + +The parameter is mandatory and may be either the NVMe character +device (ex: /dev/nvme0), or a namespace block device (ex: /dev/nvme0n1). + +OPTIONS +------- +-o :: +--output-format=:: + Set the reporting format to 'normal', 'json', or 'binary'. Only one + output format can be used at a time. + +EXAMPLES +-------- +* Retrieve and display the garbage collection log: ++ +------------ +# nvme solidigm garbage-collect-log /dev/nvme0 +------------ + +* Retrieve the garbage collection log in JSON format: ++ +------------ +# nvme solidigm garbage-collect-log /dev/nvme0 -o json +------------ + +NVME +---- +Part of the nvme-user suite \ No newline at end of file diff --git a/Documentation/nvme-solidigm-id-ctrl.txt b/Documentation/nvme-solidigm-id-ctrl.txt new file mode 100644 index 0000000000..7ac67e3767 --- /dev/null +++ b/Documentation/nvme-solidigm-id-ctrl.txt @@ -0,0 +1,74 @@ +nvme-solidigm-id-ctrl(1) +======================== + +NAME +---- +nvme-solidigm-id-ctrl - Send NVMe Identify Controller, return result and structure + +SYNOPSIS +-------- +[verse] +'nvme solidigm id-ctrl' [--raw-binary | -b] [--vendor-specific | -V] + [--output-format= | -o ] [--human-readable | -H] + [--verbose | -v] [--timeout= | -t ] + +DESCRIPTION +----------- +This command is a Solidigm-specific extension of the NVMe Identify Controller command. +It sends an NVMe Identify Controller command to the specified device and provides the result +and returned structure. + +The parameter is mandatory and may be either the NVMe character device (ex: /dev/nvme0) +or a namespace block device (ex: /dev/nvme0n1). + +This command includes all options available in the generic `nvme id-ctrl` command, including: +- `--raw-binary` or `-b` +- `--vendor-specific` or `-V` +- `--output-format=` or `-o ` +- `--human-readable` or `-H` +- `--verbose` or `-v` +- `--timeout=` or `-t ` + +For detailed usage and options, please refer to the documentation for 'nvme id-ctrl'. + +EXAMPLES +-------- +* Send the Identify Controller command and interpret the output: ++ +------------ +# nvme solidigm id-ctrl /dev/nvme0 +------------ + +* Print the raw output to stdout: ++ +------------ +# nvme solidigm id-ctrl /dev/nvme0 --raw-binary +------------ + +* Print the output in JSON format: ++ +------------ +# nvme solidigm id-ctrl /dev/nvme0 -o json +------------ + +* Display the vendor-specific fields: ++ +------------ +# nvme solidigm id-ctrl /dev/nvme0 --vendor-specific +# nvme solidigm id-ctrl /dev/nvme0 -V +------------ + +* Use human-readable output: ++ +------------ +# nvme solidigm id-ctrl /dev/nvme0 --human-readable +# nvme solidigm id-ctrl /dev/nvme0 -H +------------ + +SEE ALSO +-------- +nvme-id-ctrl(1) + +NVME +---- +Part of the nvme-user suite \ No newline at end of file diff --git a/Documentation/nvme-solidigm-latency-tracking-log.txt b/Documentation/nvme-solidigm-latency-tracking-log.txt new file mode 100644 index 0000000000..91940dcc7c --- /dev/null +++ b/Documentation/nvme-solidigm-latency-tracking-log.txt @@ -0,0 +1,79 @@ +nvme-solidigm-latency-tracking-log(1) +===================================== + +NAME +---- +nvme-solidigm-latency-tracking-log - Enable/Retrieve Latency tracking Log + +SYNOPSIS +-------- +[verse] +'nvme solidigm latency-tracking-log' [--enable | -e] [--disable | -d] + [--read | -r] [--write | -w] + [--type | -t ] + [--output-format= | -o ] + +DESCRIPTION +----------- +Enables, disables, or retrieves the Solidigm latency tracking log for the +given NVMe device. This log provides detailed information about I/O latencies. + +The parameter is mandatory and may be either the NVMe character +device (ex: /dev/nvme0), or a namespace block device (ex: /dev/nvme0n1). + +OPTIONS +------- +-e:: +--enable:: + Enable latency tracking before retrieving the log. + +-d:: +--disable:: + Disable latency tracking after retrieving the log. + +-r:: +--read:: + Retrieve read latency statistics (default if neither --read nor --write is specified). + +-w:: +--write:: + Retrieve write latency statistics. + +-t :: +--type :: + Specify the log type to retrieve. Valid values depend on the device's capabilities. + +-o :: +--output-format=:: + Set the reporting format to 'normal', 'json', or 'binary'. Only one + output format can be used at a time. + +EXAMPLES +-------- +* Enable latency tracking and retrieve the read latency log: ++ +------------ +# nvme solidigm latency-tracking-log /dev/nvme0 --enable --read +------------ + +* Retrieve the write latency log in JSON format: ++ +------------ +# nvme solidigm latency-tracking-log /dev/nvme0 --write -o json +------------ + +* Disable latency tracking after retrieving the log: ++ +------------ +# nvme solidigm latency-tracking-log /dev/nvme0 --disable +------------ + +* Specify a log type when retrieving latency statistics: ++ +------------ +# nvme solidigm latency-tracking-log /dev/nvme0 --type 1 --read +------------ + +NVME +---- +Part of the nvme-user suite \ No newline at end of file diff --git a/Documentation/nvme-solidigm-log-page-directory.txt b/Documentation/nvme-solidigm-log-page-directory.txt new file mode 100644 index 0000000000..8a8b17595a --- /dev/null +++ b/Documentation/nvme-solidigm-log-page-directory.txt @@ -0,0 +1,44 @@ +nvme-solidigm-log-page-directory(1) +=================================== + +NAME +---- +nvme-solidigm-log-page-directory - Retrieve log page directory + +SYNOPSIS +-------- +[verse] +'nvme solidigm log-page-directory' [--output-format= | -o ] + +DESCRIPTION +----------- +Retrieves and displays the log page directory for the given Solidigm NVMe device. +This command provides information about the available log pages and their +characteristics. + +The parameter is mandatory and may be either the NVMe character +device (ex: /dev/nvme0), or a namespace block device (ex: /dev/nvme0n1). + +OPTIONS +------- +-o :: +--output-format=:: + Set the reporting format to 'normal' or 'json'. Only one output format can be used at a time. + +EXAMPLES +-------- +* Retrieve and display the log page directory: ++ +------------ +# nvme solidigm log-page-directory /dev/nvme0 +------------ + +* Retrieve the log page directory in JSON format: ++ +------------ +# nvme solidigm log-page-directory /dev/nvme0 -o json +------------ + +NVME +---- +Part of the nvme-user suite \ No newline at end of file diff --git a/Documentation/nvme-solidigm-market-log.txt b/Documentation/nvme-solidigm-market-log.txt new file mode 100644 index 0000000000..1b5e268568 --- /dev/null +++ b/Documentation/nvme-solidigm-market-log.txt @@ -0,0 +1,42 @@ +nvme-solidigm-market-log(1) +=========================== + +NAME +---- +nvme-solidigm-market-log - Retrieve Market Log + +SYNOPSIS +-------- +[verse] +'nvme solidigm market-log' [--raw-binary | -b] + +DESCRIPTION +----------- +Retrieves and displays the Solidigm Marketing Name log for the given NVMe device. + +The parameter is mandatory and may be either the NVMe character +device (ex: /dev/nvme0), or a namespace block device (ex: /dev/nvme0n1). + +OPTIONS +------- +-b:: +--raw-binary:: + Output the raw log data in binary format. + +EXAMPLES +-------- +* Retrieve and display the marketing name log: ++ +------------ +# nvme solidigm market-log /dev/nvme0 +------------ + +* Retrieve the raw binary data of the marketing name log: ++ +------------ +# nvme solidigm market-log /dev/nvme0 --raw-binary +------------ + +NVME +---- +Part of the nvme-user suite \ No newline at end of file diff --git a/Documentation/nvme-solidigm-parse-telemetry-log.txt b/Documentation/nvme-solidigm-parse-telemetry-log.txt new file mode 100644 index 0000000000..38a678bd80 --- /dev/null +++ b/Documentation/nvme-solidigm-parse-telemetry-log.txt @@ -0,0 +1,86 @@ +nvme-solidigm-parse-telemetry-log(1) +==================================== + +NAME +---- +nvme-solidigm-parse-telemetry-log - Parse and display Solidigm Telemetry log + +SYNOPSIS +-------- +[verse] +'nvme solidigm parse-telemetry-log' [OPTIONS] + +DESCRIPTION +----------- +Retrieves, parses, and displays the Telemetry log for the given Solidigm NVMe device. +This command provides detailed information about the device's telemetry data, which +can be useful for diagnostics and performance analysis. + +The parameter is mandatory and may be either the NVMe character +device (ex: /dev/nvme0), or a namespace block device (ex: /dev/nvme0n1). + +OPTIONS +------- +-g :: +--host-generate=:: + Controls when to generate a new host-initiated report. Default value '1' generates + a new host-initiated report, value '0' causes retrieval of an existing log. + Valid values are 0 and 1. + +-c:: +--controller-init:: + Gather report generated by the controller. + +-d :: +--data-area=:: + Pick which telemetry data area to report. Default is 3 to fetch areas 1-3. + Valid options are 1, 2, 3, 4. + +-j :: +--config-file=:: + Specify a JSON configuration file for custom parsing of the telemetry log. + +-s:: +--source-file:: + Indicates that the argument is a binary file containing a log dump + instead of a block or character device. + +EXAMPLES +-------- +* Retrieve and parse the telemetry log with default options: ++ +------------ +# nvme solidigm parse-telemetry-log /dev/nvme0 +------------ + +* Retrieve an existing telemetry log without generating a new one: ++ +------------ +# nvme solidigm parse-telemetry-log /dev/nvme0 -g 0 +------------ + +* Parse a specific data area of the telemetry log: ++ +------------ +# nvme solidigm parse-telemetry-log /dev/nvme0 -d 2 +------------ + +* Use a custom configuration file for parsing: ++ +------------ +# nvme solidigm parse-telemetry-log /dev/nvme0 -j config.json +------------ + +* Parse a telemetry log from a binary file: ++ +------------ +# nvme solidigm parse-telemetry-log telemetry_dump.bin -s +------------ + +OUTPUT +------ +The command outputs the parsed telemetry log in JSON format to stdout. + +NVME +---- +Part of the nvme-cli suite \ No newline at end of file diff --git a/Documentation/nvme-solidigm-smart-log-add.txt b/Documentation/nvme-solidigm-smart-log-add.txt new file mode 100644 index 0000000000..5a9b92c4f3 --- /dev/null +++ b/Documentation/nvme-solidigm-smart-log-add.txt @@ -0,0 +1,56 @@ +nvme-solidigm-smart-log-add(1) +============================== + +NAME +---- +nvme-solidigm-smart-log-add - Retrieve Solidigm SMART Log + +SYNOPSIS +-------- +[verse] +'nvme solidigm smart-log-add' [--namespace-id= | -n ] + [--output-format= | -o ] + +DESCRIPTION +----------- +Retrieves the Solidigm vendor-specific SMART log for the given NVMe device +and optionally the specified namespace, then displays the log. + +The parameter is mandatory and may be either the NVMe character +device (ex: /dev/nvme0), or a namespace block device (ex: /dev/nvme0n1). + +OPTIONS +------- +-n :: +--namespace-id=:: + Retrieve the log for the given nsid. If not specified, the log + will be retrieved for all namespaces. + +-o :: +--output-format=:: + Set the reporting format to 'normal', 'json', or 'binary'. Only one + output format can be used at a time. + +EXAMPLES +-------- +* Retrieve the Solidigm SMART log for all namespaces: ++ +------------ +# nvme solidigm smart-log-add /dev/nvme0 +------------ + +* Retrieve the Solidigm SMART log for namespace 1: ++ +------------ +# nvme solidigm smart-log-add /dev/nvme0 -n 1 +------------ + +* Retrieve the Solidigm SMART log in JSON format: ++ +------------ +# nvme solidigm smart-log-add /dev/nvme0 -o json +------------ + +NVME +---- +Part of the nvme-user suite \ No newline at end of file diff --git a/Documentation/nvme-solidigm-temp-stats.txt b/Documentation/nvme-solidigm-temp-stats.txt new file mode 100644 index 0000000000..f672382dbf --- /dev/null +++ b/Documentation/nvme-solidigm-temp-stats.txt @@ -0,0 +1,44 @@ +nvme-solidigm-temp-stats(1) +=========================== + +NAME +---- +nvme-solidigm-temp-stats - Retrieve Temperature Statistics log + +SYNOPSIS +-------- +[verse] +'nvme solidigm temp-stats' [--raw-binary | -b] + +DESCRIPTION +----------- +Retrieves and displays the Temperature Statistics log for the given Solidigm +NVMe device. This log provides detailed temperature-related information. + +The parameter is mandatory and may be either the NVMe character +device (ex: /dev/nvme0), or a namespace block device (ex: /dev/nvme0n1). + +OPTIONS +------- +-b:: +--raw-binary:: + Dump output in binary format. This option will display the raw data + instead of interpreting it. + +EXAMPLES +-------- +* Retrieve and display the temperature statistics log: ++ +------------ +# nvme solidigm temp-stats /dev/nvme0 +------------ + +* Retrieve the temperature statistics log in raw binary format: ++ +------------ +# nvme solidigm temp-stats /dev/nvme0 --raw-binary +------------ + +NVME +---- +Part of the nvme-user suite \ No newline at end of file diff --git a/Documentation/nvme-solidigm-vs-drive-info.txt b/Documentation/nvme-solidigm-vs-drive-info.txt new file mode 100644 index 0000000000..8096b138ef --- /dev/null +++ b/Documentation/nvme-solidigm-vs-drive-info.txt @@ -0,0 +1,45 @@ +nvme-solidigm-vs-drive-info(1) +============================== + +NAME +---- +nvme-solidigm-vs-drive-info - Retrieve drive information + +SYNOPSIS +-------- +[verse] +'nvme solidigm vs-drive-info' [--output-format= | -o ] + +DESCRIPTION +----------- +Retrieves and displays vendor-specific drive information for the given Solidigm +NVMe device. This command provides additional details about the drive that may +not be available through standard NVMe commands. + +The parameter is mandatory and may be either the NVMe character +device (ex: /dev/nvme0), or a namespace block device (ex: /dev/nvme0n1). + +OPTIONS +------- +-o :: +--output-format=:: + Set the reporting format to 'normal' or 'json'. Only one output format + can be used at a time. + +EXAMPLES +-------- +* Retrieve and display the drive information: ++ +------------ +# nvme solidigm vs-drive-info /dev/nvme0 +------------ + +* Retrieve the drive information in JSON format: ++ +------------ +# nvme solidigm vs-drive-info /dev/nvme0 -o json +------------ + +NVME +---- +Part of the nvme-user suite \ No newline at end of file diff --git a/Documentation/nvme-solidigm-vs-fw-activate-history.txt b/Documentation/nvme-solidigm-vs-fw-activate-history.txt new file mode 100644 index 0000000000..cfe4e864ec --- /dev/null +++ b/Documentation/nvme-solidigm-vs-fw-activate-history.txt @@ -0,0 +1,39 @@ +nvme-solidigm-vs-fw-activate-history(1) +======================================= + +NAME +---- +nvme-solidigm-vs-fw-activate-history - Get firmware activation history log + +SYNOPSIS +-------- +[verse] +'nvme solidigm vs-fw-activate-history' [OPTIONS] + +DESCRIPTION +----------- +This command retrieves the firmware activation history log for Solidigm NVMe devices. It redirects to the OCP plug-in for compatibility. + +OPTIONS +------- +-o :: +--output-format=:: + Set the reporting format to 'normal' or 'json'. Only one output format can be used at a time. Default is normal. + +EXAMPLES +-------- +* Print the firmware activation history log in normal format: ++ +------------ +# nvme solidigm vs-fw-activate-history /dev/nvme0 +------------ + +* Print the firmware activation history log in JSON format: ++ +------------ +# nvme solidigm vs-fw-activate-history /dev/nvme0 -o json +------------ + +NVME +---- +Part of the nvme-cli suite diff --git a/Documentation/nvme-solidigm-vs-internal-log.txt b/Documentation/nvme-solidigm-vs-internal-log.txt new file mode 100644 index 0000000000..e488106b25 --- /dev/null +++ b/Documentation/nvme-solidigm-vs-internal-log.txt @@ -0,0 +1,59 @@ +nvme-solidigm-vs-internal-log(1) +================================ + +NAME +---- +nvme-solidigm-vs-internal-log - Retrieve Debug log binaries + +SYNOPSIS +-------- +[verse] +'nvme solidigm vs-internal-log' [--log-type= | -t ] + [--output-dir= | -d ] + [--verbose | -v] + +DESCRIPTION +----------- +For the NVMe device given, retrieves the Solidigm vendor-specific internal +debug log binaries and saves them to the specified output directory. + +The parameter is mandatory and may be either the NVMe character +device (ex: /dev/nvme0), or a namespace block device (ex: /dev/nvme0n1). + +OPTIONS +------- +-t :: +--log-type=:: + Specify the type of log to retrieve. Valid options are ALL, CIT, HIT, NLOG, ASSERT, and EVENT. Defaults to ALL. + +-d :: +--output-dir=:: + Specify the output directory for the log files. Defaults to the current working directory. + +-v:: +--verbose:: + Enable verbose output for additional information during the log retrieval process. + +EXAMPLES +-------- +* Retrieve all internal logs and save them to the current directory: ++ +------------ +# nvme solidigm vs-internal-log /dev/nvme0 +------------ + +* Retrieve a specific log type and save it to a custom directory: ++ +------------ +# nvme solidigm vs-internal-log /dev/nvme0 -t NLOG -d /tmp/logs +------------ + +* Retrieve logs with verbose output: ++ +------------ +# nvme solidigm vs-internal-log /dev/nvme0 -v +------------ + +NVME +---- +Part of the nvme-user suite \ No newline at end of file diff --git a/Documentation/nvme-solidigm-vs-smart-add-log.txt b/Documentation/nvme-solidigm-vs-smart-add-log.txt new file mode 100644 index 0000000000..c1bf0c83ad --- /dev/null +++ b/Documentation/nvme-solidigm-vs-smart-add-log.txt @@ -0,0 +1,39 @@ +nvme-solidigm-vs-smart-add-log(1) +================================= + +NAME +---- +nvme-solidigm-vs-smart-add-log - Get SMART / health extended log + +SYNOPSIS +-------- +[verse] +'nvme solidigm vs-smart-add-log' [OPTIONS] + +DESCRIPTION +----------- +This command retrieves the SMART / health extended log for Solidigm NVMe devices. It redirects to the OCP plug-in for compatibility. + +OPTIONS +------- +-o :: +--output-format=:: + Set the reporting format to 'normal' or 'json'. Only one output format can be used at a time. Default is normal. + +EXAMPLES +-------- +* Print the SMART / health extended log in normal format: ++ +------------ +# nvme solidigm vs-smart-add-log /dev/nvme0 +------------ + +* Print the SMART / health extended log in JSON format: ++ +------------ +# nvme solidigm vs-smart-add-log /dev/nvme0 -o json +------------ + +NVME +---- +Part of the nvme-cli suite \ No newline at end of file diff --git a/Documentation/nvme-solidigm-workload-tracker.txt b/Documentation/nvme-solidigm-workload-tracker.txt new file mode 100644 index 0000000000..d1f0b3a103 --- /dev/null +++ b/Documentation/nvme-solidigm-workload-tracker.txt @@ -0,0 +1,104 @@ +nvme-solidigm-workload-tracker(1) +================================= + +NAME +---- +nvme-solidigm-workload-tracker - Real-time capture of Workload Tracker samples + +SYNOPSIS +-------- +[verse] +'nvme solidigm workload-tracker' [--enable | -e] [--disable | -d] + [--sample-time=