diff --git a/Documentation/nvme-ocp-get-latency-monitor.txt b/Documentation/nvme-ocp-get-latency-monitor.txt new file mode 100644 index 0000000000..218c21e7d6 --- /dev/null +++ b/Documentation/nvme-ocp-get-latency-monitor.txt @@ -0,0 +1,62 @@ +nvme-ocp-get-latency-monitor(1) +========================================= + +NAME +---- +nvme-ocp-get-latency-monitor - Define and print get-latency-monitor value + +SYNOPSIS +-------- +[verse] +'nvme ocp get-latency-monitor' [--sel=] + [--namespace-id | -n ] [--no-uuid | -u] + +DESCRIPTION +----------- +The 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 +------- +-n :: +--namespace-id=:: + NSID: Assign the different kind of nsid value(like + active, inactive and invalid nsids) and check + the get feature command response: + +-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 +|================== + +-u:: +--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-latency-monitor to retrieve the 0xC5 get features. ++ +------------ +# nvme ocp get-latency-monitor /dev/nvme0 +------------ + +NVME +---- +Part of the nvme-user suite. diff --git a/completions/_nvme b/completions/_nvme index 8708cb8445..658a12c527 100644 --- a/completions/_nvme +++ b/completions/_nvme @@ -397,6 +397,20 @@ _nvme () { _arguments '*:: :->subcmds' _describe -t commands "nvme ocp set-telemetry-profile options" _ocp_set_telemetry_profile_feature ;; + (get-latency-monitor) + local _ocp_get_latency_monitor_feature + _ocp_get_latency_monitor_feature=( + /dev/nvme':supply a device to use (required)' + --sel=':select from 0 - current, 1 - default, 2 - saved, 3 - supported' + -s':alias to --sel' + --namespace-id=':valid, invalid and inactive nsid' + -n':alias to --namespace-id' + --no-uuid':Skip UUID index search' + -u':alias for --no-uuid' + ) + _arguments '*:: :->subcmds' + _describe -t commands "nvme ocp get-latency-monitor options" _ocp_get_latency_monitor_feature + ;; (*) _files ;; @@ -2843,6 +2857,7 @@ _nvme () { get-error-injection':get error injection' set-error-injection':set error injection' hardware-component-log':retrieve hardware component log' + get-latency-monitor':Get Latency Monitor Feature' ) _arguments '*:: :->subcmds' _describe -t commands "nvme ocp options" _ocp diff --git a/completions/bash-nvme-completion.sh b/completions/bash-nvme-completion.sh index bd6dad44e7..7255b6e3fa 100644 --- a/completions/bash-nvme-completion.sh +++ b/completions/bash-nvme-completion.sh @@ -1648,6 +1648,10 @@ plugin_ocp_opts () { opts+=" --comp-id= -i --list -l --verbose -v \ --output-format -o --timeout= -t" ;; + "get-latency-monitor") + opts+=" --sel= -s \ + --namespace-id= -n --no-uuid -u" + ;; "help") opts+=$NO_OPTS ;; @@ -1729,7 +1733,7 @@ _nvme_subcmds () { telemetry-string-log set-telemetry-profile \ set-dssd-async-event-config get-dssd-async-event-config \ get-error-injection set-error-injection \ - hardware-component-log" + hardware-component-log get-latency-monitor" [mangoboost]="id-ctrl" ) diff --git a/plugins/ocp/ocp-nvme.c b/plugins/ocp/ocp-nvme.c index a9fe77d3f8..c5d6163d67 100644 --- a/plugins/ocp/ocp-nvme.c +++ b/plugins/ocp/ocp-nvme.c @@ -423,6 +423,80 @@ int ocp_set_latency_monitor_feature(int argc, char **argv, struct command *cmd, return err; } +static int ocp_get_latency_monitor_feature(int argc, char **argv, struct command *cmd, + struct plugin *plugin) +{ + const char *desc = "Define Issue Get Feature command (FID: 0xC5) Latency Monitor"; + const char *sel = "[0-3]: current/default/saved/supported/"; + const char *nsid = "Byte[04-07]: Namespace Identifier Valid/Invalid/Inactive"; + + _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; + + __u32 result; + int err; + bool uuid; + __u8 uuid_index = 0; + + struct config { + __u8 sel; + __u32 nsid; + }; + + struct config cfg = { + .sel = 0, + .nsid = 0, + }; + + OPT_ARGS(opts) = { + OPT_BYTE("sel", 's', &cfg.sel, sel), + OPT_UINT("namespace-id", 'n', &cfg.nsid, nsid), + OPT_FLAG("no-uuid", 'u', NULL, no_uuid), + OPT_END() + }; + + err = parse_and_open(&dev, argc, argv, desc, opts); + if (err) + return err; + + uuid = !argconfig_parse_seen(opts, "no-uuid"); + + if (uuid) { + /* OCP 2.0 requires UUID index support */ + err = ocp_get_uuid_index(dev, &uuid_index); + if (err || !uuid_index) { + nvme_show_error("ERROR: No OCP UUID index found"); + return err; + } + } + + struct nvme_get_features_args args = { + .args_size = sizeof(args), + .fd = dev_fd(dev), + .fid = OCP_FID_LM, + .nsid = cfg.nsid, + .sel = cfg.sel, + .cdw11 = 0, + .uuidx = uuid_index, + .data_len = 0, + .data = NULL, + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .result = &result, + }; + + err = nvme_get_features(&args); + if (!err) { + printf("get-feature:0xC5 %s value: %#08x\n", + nvme_select_to_string(cfg.sel), result); + + if (cfg.sel == NVME_GET_FEATURES_SEL_SUPPORTED) + nvme_show_select_result(0xC5, result); + } else { + nvme_show_error("Could not get feature: 0xC5"); + } + + return err; +} + /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// diff --git a/plugins/ocp/ocp-nvme.h b/plugins/ocp/ocp-nvme.h index f56a5cb623..281e96b706 100644 --- a/plugins/ocp/ocp-nvme.h +++ b/plugins/ocp/ocp-nvme.h @@ -42,6 +42,8 @@ PLUGIN(NAME("ocp", "OCP cloud SSD extensions", OCP_PLUGIN_VERSION), get_enable_ieee1667_silo) ENTRY("set-enable-ieee1667-silo", "enable IEEE1667 silo", set_enable_ieee1667_silo) ENTRY("hardware-component-log", "retrieve hardware component log", hwcomp_log) + ENTRY("get-latency-monitor", "Get Latency Monitor Feature", + ocp_get_latency_monitor_feature) ) );