From 635faa73465527f75d2ea06b934329eab7eda5df Mon Sep 17 00:00:00 2001 From: Daniel Baumann <daniel@debian.org> Date: Thu, 20 Mar 2025 08:10:44 +0100 Subject: [PATCH] Merging upstream version 2.12. Signed-off-by: Daniel Baumann <daniel@debian.org> --- .checkpatch.conf | 24 + .github/workflows/coverage.yml | 5 +- .github/workflows/run-nightly-tests.yml | 49 +- Documentation/cmd-plugins.txt | 33 + Documentation/meson.build | 1 + Documentation/nvme-admin-passthru.1 | 4 +- Documentation/nvme-admin-passthru.html | 4 +- Documentation/nvme-ana-log.1 | 4 +- Documentation/nvme-ana-log.html | 4 +- Documentation/nvme-attach-ns.1 | 8 +- Documentation/nvme-attach-ns.html | 8 +- Documentation/nvme-attach-ns.txt | 5 +- Documentation/nvme-ave-discovery-log.txt | 51 + Documentation/nvme-boot-part-log.1 | 4 +- Documentation/nvme-boot-part-log.html | 4 +- Documentation/nvme-capacity-mgmt.1 | 4 +- Documentation/nvme-capacity-mgmt.html | 4 +- .../nvme-changed-alloc-ns-list-log.txt | 67 + Documentation/nvme-changed-ns-list-log.1 | 4 +- Documentation/nvme-changed-ns-list-log.html | 4 +- Documentation/nvme-cmdset-ind-id-ns.1 | 4 +- Documentation/nvme-cmdset-ind-id-ns.html | 4 +- Documentation/nvme-compare.1 | 4 +- Documentation/nvme-compare.html | 4 +- Documentation/nvme-connect-all.1 | 4 +- Documentation/nvme-connect-all.html | 4 +- Documentation/nvme-connect.1 | 4 +- Documentation/nvme-connect.html | 4 +- Documentation/nvme-copy.1 | 4 +- Documentation/nvme-copy.html | 4 +- Documentation/nvme-create-ns.1 | 8 +- Documentation/nvme-create-ns.html | 10 +- Documentation/nvme-create-ns.txt | 6 +- Documentation/nvme-dapustor-smart-log-add.1 | 4 +- .../nvme-dapustor-smart-log-add.html | 4 +- Documentation/nvme-delete-ns.1 | 4 +- Documentation/nvme-delete-ns.html | 4 +- Documentation/nvme-dera-stat.1 | 4 +- Documentation/nvme-dera-stat.html | 4 +- Documentation/nvme-detach-ns.1 | 4 +- Documentation/nvme-detach-ns.html | 4 +- Documentation/nvme-device-self-test.1 | 4 +- Documentation/nvme-device-self-test.html | 4 +- Documentation/nvme-dim.1 | 4 +- Documentation/nvme-dim.html | 4 +- Documentation/nvme-dir-receive.1 | 4 +- Documentation/nvme-dir-receive.html | 4 +- Documentation/nvme-dir-send.1 | 4 +- Documentation/nvme-dir-send.html | 4 +- Documentation/nvme-disconnect-all.1 | 4 +- Documentation/nvme-disconnect-all.html | 4 +- Documentation/nvme-disconnect.1 | 4 +- Documentation/nvme-disconnect.html | 4 +- Documentation/nvme-discover.1 | 4 +- Documentation/nvme-discover.html | 4 +- ...vme-dispersed-ns-participating-nss-log.txt | 55 + Documentation/nvme-dsm.1 | 4 +- Documentation/nvme-dsm.html | 4 +- Documentation/nvme-effects-log.1 | 4 +- Documentation/nvme-effects-log.html | 4 +- Documentation/nvme-endurance-event-agg-log.1 | 4 +- .../nvme-endurance-event-agg-log.html | 4 +- Documentation/nvme-endurance-log.1 | 4 +- Documentation/nvme-endurance-log.html | 4 +- Documentation/nvme-error-log.1 | 4 +- Documentation/nvme-error-log.html | 4 +- Documentation/nvme-fdp-configs.1 | 4 +- Documentation/nvme-fdp-configs.html | 4 +- Documentation/nvme-fdp-events.1 | 4 +- Documentation/nvme-fdp-events.html | 4 +- Documentation/nvme-fdp-feature.1 | 86 ++ ...-close-zone.html => nvme-fdp-feature.html} | 76 +- Documentation/nvme-fdp-feature.txt | 56 + Documentation/nvme-fdp-set-events.1 | 4 +- Documentation/nvme-fdp-set-events.html | 4 +- Documentation/nvme-fdp-stats.1 | 4 +- Documentation/nvme-fdp-stats.html | 4 +- Documentation/nvme-fdp-status.1 | 4 +- Documentation/nvme-fdp-status.html | 4 +- Documentation/nvme-fdp-update.1 | 4 +- Documentation/nvme-fdp-update.html | 4 +- Documentation/nvme-fdp-usage.1 | 4 +- Documentation/nvme-fdp-usage.html | 4 +- Documentation/nvme-fid-support-effects-log.1 | 4 +- .../nvme-fid-support-effects-log.html | 4 +- Documentation/nvme-flush.1 | 4 +- Documentation/nvme-flush.html | 4 +- Documentation/nvme-format.1 | 4 +- Documentation/nvme-format.html | 4 +- Documentation/nvme-fw-commit.1 | 4 +- Documentation/nvme-fw-commit.html | 4 +- Documentation/nvme-fw-download.1 | 4 +- Documentation/nvme-fw-download.html | 4 +- Documentation/nvme-fw-log.1 | 4 +- Documentation/nvme-fw-log.html | 4 +- Documentation/nvme-gen-hostnqn.1 | 4 +- Documentation/nvme-gen-hostnqn.html | 4 +- Documentation/nvme-get-feature.1 | 4 +- Documentation/nvme-get-feature.html | 4 +- Documentation/nvme-get-lba-status.1 | 4 +- Documentation/nvme-get-lba-status.html | 4 +- Documentation/nvme-get-log.1 | 4 +- Documentation/nvme-get-log.html | 4 +- Documentation/nvme-get-ns-id.1 | 4 +- Documentation/nvme-get-ns-id.html | 4 +- Documentation/nvme-get-property.1 | 4 +- Documentation/nvme-get-property.html | 4 +- Documentation/nvme-get-reg.txt | 3 + Documentation/nvme-help.1 | 4 +- Documentation/nvme-help.html | 4 +- Documentation/nvme-host-discovery-log.txt | 57 + Documentation/nvme-huawei-id-ctrl.1 | 4 +- Documentation/nvme-huawei-id-ctrl.html | 4 +- Documentation/nvme-huawei-list.1 | 4 +- Documentation/nvme-huawei-list.html | 4 +- Documentation/nvme-id-ctrl.1 | 4 +- Documentation/nvme-id-ctrl.html | 4 +- Documentation/nvme-id-domain.1 | 4 +- Documentation/nvme-id-domain.html | 4 +- Documentation/nvme-id-iocs.1 | 4 +- Documentation/nvme-id-iocs.html | 4 +- Documentation/nvme-id-ns.1 | 4 +- Documentation/nvme-id-ns.html | 4 +- Documentation/nvme-id-nvmset.1 | 4 +- Documentation/nvme-id-nvmset.html | 4 +- Documentation/nvme-inspur-nvme-vendor-log.1 | 4 +- .../nvme-inspur-nvme-vendor-log.html | 4 +- Documentation/nvme-intel-id-ctrl.1 | 4 +- Documentation/nvme-intel-id-ctrl.html | 4 +- Documentation/nvme-intel-internal-log.1 | 4 +- Documentation/nvme-intel-internal-log.html | 4 +- Documentation/nvme-intel-lat-stats.1 | 4 +- Documentation/nvme-intel-lat-stats.html | 4 +- Documentation/nvme-intel-market-name.1 | 4 +- Documentation/nvme-intel-market-name.html | 4 +- Documentation/nvme-intel-smart-log-add.1 | 4 +- Documentation/nvme-intel-smart-log-add.html | 4 +- Documentation/nvme-intel-temp-stats.1 | 4 +- Documentation/nvme-intel-temp-stats.html | 4 +- Documentation/nvme-io-mgmt-recv.1 | 4 +- Documentation/nvme-io-mgmt-recv.html | 4 +- Documentation/nvme-io-mgmt-send.1 | 4 +- Documentation/nvme-io-mgmt-send.html | 4 +- Documentation/nvme-io-passthru.1 | 4 +- Documentation/nvme-io-passthru.html | 4 +- Documentation/nvme-lba-status-log.1 | 4 +- Documentation/nvme-lba-status-log.html | 4 +- Documentation/nvme-list-ctrl.1 | 4 +- Documentation/nvme-list-ctrl.html | 4 +- Documentation/nvme-list-endgrp.1 | 4 +- Documentation/nvme-list-endgrp.html | 4 +- Documentation/nvme-list-ns.1 | 4 +- Documentation/nvme-list-ns.html | 4 +- Documentation/nvme-list-subsys.1 | 4 +- Documentation/nvme-list-subsys.html | 4 +- Documentation/nvme-list.1 | 4 +- Documentation/nvme-list.html | 4 +- Documentation/nvme-lockdown.1 | 4 +- Documentation/nvme-lockdown.html | 4 +- Documentation/nvme-mgmt-addr-list-log.txt | 47 + .../nvme-mi-cmd-support-effects-log.1 | 4 +- .../nvme-mi-cmd-support-effects-log.html | 4 +- Documentation/nvme-micron-clear-pcie-errors.1 | 4 +- .../nvme-micron-clear-pcie-errors.html | 4 +- Documentation/nvme-micron-internal-log.1 | 4 +- Documentation/nvme-micron-internal-log.html | 4 +- Documentation/nvme-micron-nand-stats.1 | 4 +- Documentation/nvme-micron-nand-stats.html | 4 +- Documentation/nvme-micron-pcie-stats.1 | 4 +- Documentation/nvme-micron-pcie-stats.html | 4 +- .../nvme-micron-selective-download.1 | 4 +- .../nvme-micron-selective-download.html | 4 +- Documentation/nvme-micron-smart-add-log.1 | 4 +- Documentation/nvme-micron-smart-add-log.html | 4 +- Documentation/nvme-micron-temperature-stats.1 | 4 +- .../nvme-micron-temperature-stats.html | 4 +- Documentation/nvme-netapp-ontapdevices.1 | 11 +- Documentation/nvme-netapp-ontapdevices.html | 17 +- Documentation/nvme-netapp-ontapdevices.txt | 6 +- Documentation/nvme-netapp-smdevices.1 | 11 +- Documentation/nvme-netapp-smdevices.html | 17 +- Documentation/nvme-netapp-smdevices.txt | 6 +- Documentation/nvme-ns-descs.1 | 4 +- Documentation/nvme-ns-descs.html | 4 +- Documentation/nvme-ns-rescan.1 | 4 +- Documentation/nvme-ns-rescan.html | 4 +- Documentation/nvme-nvm-id-ctrl.1 | 4 +- Documentation/nvme-nvm-id-ctrl.html | 4 +- Documentation/nvme-nvme-mi-recv.1 | 4 +- Documentation/nvme-nvme-mi-recv.html | 4 +- Documentation/nvme-nvme-mi-send.1 | 4 +- Documentation/nvme-nvme-mi-send.html | 4 +- .../nvme-ocp-clear-fw-activate-history.1 | 4 +- .../nvme-ocp-clear-fw-activate-history.html | 4 +- ...cp-clear-pcie-correctable-error-counters.1 | 4 +- ...clear-pcie-correctable-error-counters.html | 4 +- .../nvme-ocp-device-capability-log.1 | 4 +- .../nvme-ocp-device-capability-log.html | 4 +- Documentation/nvme-ocp-eol-plp-failure-mode.1 | 4 +- .../nvme-ocp-eol-plp-failure-mode.html | 4 +- Documentation/nvme-ocp-error-recovery-log.1 | 4 +- .../nvme-ocp-error-recovery-log.html | 4 +- .../nvme-ocp-get-dssd-async-event-config.1 | 4 +- .../nvme-ocp-get-dssd-async-event-config.html | 4 +- .../nvme-ocp-get-dssd-power-state-feature.1 | 4 +- ...nvme-ocp-get-dssd-power-state-feature.html | 4 +- .../nvme-ocp-get-plp-health-check-interval.1 | 4 +- ...vme-ocp-get-plp-health-check-interval.html | 4 +- .../nvme-ocp-hardware-component-log.txt | 4 +- Documentation/nvme-ocp-internal-log.1 | 11 +- Documentation/nvme-ocp-internal-log.html | 9 +- Documentation/nvme-ocp-internal-log.txt | 5 +- Documentation/nvme-ocp-latency-monitor-log.1 | 4 +- .../nvme-ocp-latency-monitor-log.html | 4 +- .../nvme-ocp-set-dssd-async-event-config.1 | 4 +- .../nvme-ocp-set-dssd-async-event-config.html | 4 +- .../nvme-ocp-set-dssd-power-state-feature.1 | 4 +- ...nvme-ocp-set-dssd-power-state-feature.html | 4 +- .../nvme-ocp-set-plp-health-check-interval.1 | 4 +- ...vme-ocp-set-plp-health-check-interval.html | 4 +- .../nvme-ocp-set-telemetry-profile.1 | 4 +- .../nvme-ocp-set-telemetry-profile.html | 4 +- Documentation/nvme-ocp-smart-add-log.1 | 16 +- Documentation/nvme-ocp-smart-add-log.html | 18 +- Documentation/nvme-ocp-smart-add-log.txt | 10 +- .../nvme-ocp-telemetry-string-log-page.1 | 4 +- .../nvme-ocp-telemetry-string-log-page.html | 4 +- Documentation/nvme-ocp-unsupported-reqs-log.1 | 4 +- .../nvme-ocp-unsupported-reqs-log.html | 4 +- Documentation/nvme-persistent-event-log.1 | 4 +- Documentation/nvme-persistent-event-log.html | 4 +- Documentation/nvme-pred-lat-event-agg-log.1 | 4 +- .../nvme-pred-lat-event-agg-log.html | 4 +- Documentation/nvme-predictable-lat-log.1 | 4 +- Documentation/nvme-predictable-lat-log.html | 4 +- Documentation/nvme-primary-ctrl-caps.1 | 4 +- Documentation/nvme-primary-ctrl-caps.html | 4 +- Documentation/nvme-pull-model-ddr-req-log.txt | 51 + .../nvme-reachability-associations-log.txt | 56 + .../nvme-reachability-groups-log.txt | 56 + Documentation/nvme-read.1 | 4 +- Documentation/nvme-read.html | 4 +- Documentation/nvme-reset.1 | 4 +- Documentation/nvme-reset.html | 4 +- Documentation/nvme-resv-acquire.1 | 4 +- Documentation/nvme-resv-acquire.html | 4 +- Documentation/nvme-resv-notif-log.1 | 4 +- Documentation/nvme-resv-notif-log.html | 4 +- Documentation/nvme-resv-register.1 | 4 +- Documentation/nvme-resv-register.html | 4 +- Documentation/nvme-resv-release.1 | 4 +- Documentation/nvme-resv-release.html | 4 +- Documentation/nvme-resv-report.1 | 4 +- Documentation/nvme-resv-report.html | 4 +- .../nvme-rotational-media-info-log.txt | 52 + Documentation/nvme-rpmb.1 | 4 +- Documentation/nvme-rpmb.html | 4 +- Documentation/nvme-sanitize-log.1 | 4 +- Documentation/nvme-sanitize-log.html | 4 +- Documentation/nvme-sanitize.1 | 4 +- Documentation/nvme-sanitize.html | 4 +- .../nvme-seagate-clear-fw-activate-history.1 | 4 +- ...vme-seagate-clear-fw-activate-history.html | 4 +- ...me-seagate-clear-pcie-correctable-errors.1 | 4 +- ...seagate-clear-pcie-correctable-errors.html | 4 +- .../nvme-seagate-cloud-SSD-plugin-version.1 | 4 +- ...nvme-seagate-cloud-SSD-plugin-version.html | 4 +- Documentation/nvme-seagate-get-ctrl-tele.1 | 4 +- Documentation/nvme-seagate-get-ctrl-tele.html | 4 +- Documentation/nvme-seagate-get-host-tele.1 | 4 +- Documentation/nvme-seagate-get-host-tele.html | 4 +- Documentation/nvme-seagate-help.1 | 4 +- Documentation/nvme-seagate-help.html | 4 +- Documentation/nvme-seagate-plugin-version.1 | 4 +- .../nvme-seagate-plugin-version.html | 4 +- Documentation/nvme-seagate-version.1 | 4 +- Documentation/nvme-seagate-version.html | 4 +- .../nvme-seagate-vs-fw-activate-history.1 | 4 +- .../nvme-seagate-vs-fw-activate-history.html | 4 +- Documentation/nvme-seagate-vs-internal-log.1 | 4 +- .../nvme-seagate-vs-internal-log.html | 4 +- Documentation/nvme-seagate-vs-log-page-sup.1 | 4 +- .../nvme-seagate-vs-log-page-sup.html | 4 +- Documentation/nvme-seagate-vs-pcie-stats.1 | 4 +- Documentation/nvme-seagate-vs-pcie-stats.html | 4 +- Documentation/nvme-seagate-vs-smart-add-log.1 | 4 +- .../nvme-seagate-vs-smart-add-log.html | 4 +- .../nvme-seagate-vs-temperature-stats.1 | 4 +- .../nvme-seagate-vs-temperature-stats.html | 4 +- Documentation/nvme-security-recv.1 | 4 +- Documentation/nvme-security-recv.html | 4 +- Documentation/nvme-security-send.1 | 4 +- Documentation/nvme-security-send.html | 4 +- Documentation/nvme-self-test-log.1 | 4 +- Documentation/nvme-self-test-log.html | 4 +- Documentation/nvme-set-feature.1 | 4 +- Documentation/nvme-set-feature.html | 4 +- Documentation/nvme-set-property.1 | 4 +- Documentation/nvme-set-property.html | 4 +- Documentation/nvme-set-reg.txt | 3 + Documentation/nvme-show-hostnqn.1 | 4 +- Documentation/nvme-show-hostnqn.html | 4 +- Documentation/nvme-show-regs.1 | 4 +- Documentation/nvme-show-regs.html | 4 +- Documentation/nvme-show-topology.1 | 4 +- Documentation/nvme-show-topology.html | 4 +- Documentation/nvme-smart-log.1 | 4 +- Documentation/nvme-smart-log.html | 4 +- .../nvme-solidigm-clear-fw-activate-history.1 | 4 +- ...me-solidigm-clear-fw-activate-history.html | 4 +- ...e-solidigm-clear-pcie-correctable-errors.1 | 4 +- ...olidigm-clear-pcie-correctable-errors.html | 4 +- .../nvme-solidigm-cloud-SSDplugin-version.1 | 4 +- ...nvme-solidigm-cloud-SSDplugin-version.html | 4 +- .../nvme-solidigm-garbage-collect-log.1 | 4 +- .../nvme-solidigm-garbage-collect-log.html | 4 +- Documentation/nvme-solidigm-id-ctrl.1 | 4 +- Documentation/nvme-solidigm-id-ctrl.html | 4 +- .../nvme-solidigm-latency-tracking-log.1 | 4 +- .../nvme-solidigm-latency-tracking-log.html | 4 +- .../nvme-solidigm-log-page-directory.1 | 4 +- .../nvme-solidigm-log-page-directory.html | 4 +- Documentation/nvme-solidigm-market-log.1 | 4 +- Documentation/nvme-solidigm-market-log.html | 4 +- .../nvme-solidigm-parse-telemetry-log.1 | 4 +- .../nvme-solidigm-parse-telemetry-log.html | 4 +- Documentation/nvme-solidigm-smart-log-add.1 | 4 +- .../nvme-solidigm-smart-log-add.html | 4 +- Documentation/nvme-solidigm-temp-stats.1 | 4 +- Documentation/nvme-solidigm-temp-stats.html | 4 +- Documentation/nvme-solidigm-vs-drive-info.1 | 4 +- .../nvme-solidigm-vs-drive-info.html | 4 +- .../nvme-solidigm-vs-fw-activate-history.1 | 4 +- .../nvme-solidigm-vs-fw-activate-history.html | 4 +- Documentation/nvme-solidigm-vs-internal-log.1 | 4 +- .../nvme-solidigm-vs-internal-log.html | 4 +- .../nvme-solidigm-vs-smart-add-log.1 | 4 +- .../nvme-solidigm-vs-smart-add-log.html | 4 +- .../nvme-solidigm-workload-tracker.1 | 4 +- .../nvme-solidigm-workload-tracker.html | 4 +- Documentation/nvme-subsystem-reset.1 | 4 +- Documentation/nvme-subsystem-reset.html | 4 +- Documentation/nvme-supported-log-pages.1 | 4 +- Documentation/nvme-supported-log-pages.html | 4 +- Documentation/nvme-telemetry-log.1 | 4 +- Documentation/nvme-telemetry-log.html | 4 +- Documentation/nvme-tls-key.1 | 4 +- Documentation/nvme-tls-key.html | 4 +- ...me-toshiba-clear-pcie-correctable-errors.1 | 4 +- ...toshiba-clear-pcie-correctable-errors.html | 4 +- Documentation/nvme-toshiba-vs-internal-log.1 | 4 +- .../nvme-toshiba-vs-internal-log.html | 4 +- Documentation/nvme-toshiba-vs-smart-add-log.1 | 4 +- .../nvme-toshiba-vs-smart-add-log.html | 4 +- Documentation/nvme-transcend-badblock.1 | 4 +- Documentation/nvme-transcend-badblock.html | 4 +- Documentation/nvme-transcend-healthvalue.1 | 4 +- Documentation/nvme-transcend-healthvalue.html | 4 +- Documentation/nvme-verify.1 | 4 +- Documentation/nvme-verify.html | 4 +- .../nvme-virtium-save-smart-to-vtview-log.1 | 4 +- ...nvme-virtium-save-smart-to-vtview-log.html | 4 +- Documentation/nvme-virtium-show-identify.1 | 4 +- Documentation/nvme-virtium-show-identify.html | 4 +- Documentation/nvme-wdc-cap-diag.1 | 4 +- Documentation/nvme-wdc-cap-diag.html | 4 +- Documentation/nvme-wdc-capabilities.1 | 4 +- Documentation/nvme-wdc-capabilities.html | 4 +- Documentation/nvme-wdc-clear-assert-dump.1 | 4 +- Documentation/nvme-wdc-clear-assert-dump.html | 4 +- .../nvme-wdc-clear-fw-activate-history.1 | 4 +- .../nvme-wdc-clear-fw-activate-history.html | 4 +- .../nvme-wdc-clear-pcie-correctable-errors.1 | 4 +- ...vme-wdc-clear-pcie-correctable-errors.html | 4 +- .../nvme-wdc-cloud-SSD-plugin-version.1 | 4 +- .../nvme-wdc-cloud-SSD-plugin-version.html | 4 +- .../nvme-wdc-cloud-boot-SSD-version.1 | 4 +- .../nvme-wdc-cloud-boot-SSD-version.html | 4 +- Documentation/nvme-wdc-drive-essentials.1 | 4 +- Documentation/nvme-wdc-drive-essentials.html | 4 +- Documentation/nvme-wdc-drive-log.1 | 4 +- Documentation/nvme-wdc-drive-log.html | 4 +- Documentation/nvme-wdc-drive-resize.1 | 4 +- Documentation/nvme-wdc-drive-resize.html | 4 +- Documentation/nvme-wdc-enc-get-log.1 | 4 +- Documentation/nvme-wdc-enc-get-log.html | 4 +- Documentation/nvme-wdc-get-crash-dump.1 | 4 +- Documentation/nvme-wdc-get-crash-dump.html | 4 +- .../nvme-wdc-get-dev-capabilities-log.1 | 4 +- .../nvme-wdc-get-dev-capabilities-log.html | 4 +- Documentation/nvme-wdc-get-drive-status.1 | 4 +- Documentation/nvme-wdc-get-drive-status.html | 4 +- .../nvme-wdc-get-error-recovery-log.1 | 4 +- .../nvme-wdc-get-error-recovery-log.html | 4 +- .../nvme-wdc-get-latency-monitor-log.1 | 4 +- .../nvme-wdc-get-latency-monitor-log.html | 4 +- Documentation/nvme-wdc-get-pfail-dump.1 | 4 +- Documentation/nvme-wdc-get-pfail-dump.html | 4 +- .../nvme-wdc-get-unsupported-reqs-log.1 | 4 +- .../nvme-wdc-get-unsupported-reqs-log.html | 4 +- Documentation/nvme-wdc-id-ctrl.1 | 4 +- Documentation/nvme-wdc-id-ctrl.html | 4 +- Documentation/nvme-wdc-log-page-directory.1 | 4 +- .../nvme-wdc-log-page-directory.html | 4 +- Documentation/nvme-wdc-namespace-resize.1 | 4 +- Documentation/nvme-wdc-namespace-resize.html | 4 +- Documentation/nvme-wdc-purge-monitor.1 | 4 +- Documentation/nvme-wdc-purge-monitor.html | 4 +- Documentation/nvme-wdc-purge.1 | 4 +- Documentation/nvme-wdc-purge.html | 4 +- Documentation/nvme-wdc-vs-cloud-log.1 | 4 +- Documentation/nvme-wdc-vs-cloud-log.html | 4 +- Documentation/nvme-wdc-vs-device-waf.1 | 4 +- Documentation/nvme-wdc-vs-device-waf.html | 4 +- Documentation/nvme-wdc-vs-drive-info.1 | 4 +- Documentation/nvme-wdc-vs-drive-info.html | 4 +- .../nvme-wdc-vs-error-reason-identifier.1 | 4 +- .../nvme-wdc-vs-error-reason-identifier.html | 4 +- .../nvme-wdc-vs-fw-activate-history.1 | 4 +- .../nvme-wdc-vs-fw-activate-history.html | 4 +- Documentation/nvme-wdc-vs-hw-rev-log.1 | 4 +- Documentation/nvme-wdc-vs-hw-rev-log.html | 4 +- Documentation/nvme-wdc-vs-internal-log.1 | 4 +- Documentation/nvme-wdc-vs-internal-log.html | 4 +- Documentation/nvme-wdc-vs-nand-stats.1 | 4 +- Documentation/nvme-wdc-vs-nand-stats.html | 4 +- Documentation/nvme-wdc-vs-smart-add-log.1 | 4 +- Documentation/nvme-wdc-vs-smart-add-log.html | 4 +- .../nvme-wdc-vs-telemetry-controller-option.1 | 4 +- ...me-wdc-vs-telemetry-controller-option.html | 4 +- Documentation/nvme-wdc-vs-temperature-stats.1 | 4 +- .../nvme-wdc-vs-temperature-stats.html | 4 +- Documentation/nvme-write-uncor.1 | 4 +- Documentation/nvme-write-uncor.html | 4 +- Documentation/nvme-write-zeroes.1 | 11 +- Documentation/nvme-write-zeroes.html | 17 +- Documentation/nvme-write-zeroes.txt | 5 +- Documentation/nvme-write.1 | 4 +- Documentation/nvme-write.html | 4 +- Documentation/nvme-zns-changed-zone-list.1 | 4 +- Documentation/nvme-zns-changed-zone-list.html | 4 +- Documentation/nvme-zns-close-zone.1 | 4 +- Documentation/nvme-zns-close-zone.html | 4 +- Documentation/nvme-zns-finish-zone.1 | 4 +- Documentation/nvme-zns-finish-zone.html | 4 +- Documentation/nvme-zns-id-ctrl.1 | 4 +- Documentation/nvme-zns-id-ctrl.html | 4 +- Documentation/nvme-zns-id-ns.1 | 4 +- Documentation/nvme-zns-id-ns.html | 4 +- Documentation/nvme-zns-offline-zone.1 | 4 +- Documentation/nvme-zns-offline-zone.html | 4 +- Documentation/nvme-zns-open-zone.1 | 4 +- Documentation/nvme-zns-open-zone.html | 4 +- Documentation/nvme-zns-report-zones.1 | 4 +- Documentation/nvme-zns-report-zones.html | 4 +- Documentation/nvme-zns-reset-zone.1 | 4 +- Documentation/nvme-zns-reset-zone.html | 4 +- Documentation/nvme-zns-set-zone-desc.1 | 4 +- Documentation/nvme-zns-set-zone-desc.html | 4 +- Documentation/nvme-zns-zone-append.1 | 4 +- Documentation/nvme-zns-zone-append.html | 4 +- Documentation/nvme-zns-zone-mgmt-recv.1 | 4 +- Documentation/nvme-zns-zone-mgmt-recv.html | 4 +- Documentation/nvme-zns-zone-mgmt-send.1 | 4 +- Documentation/nvme-zns-zone-mgmt-send.html | 4 +- Documentation/nvme.1 | 59 +- Documentation/nvme.html | 92 +- Makefile | 24 +- completions/_nvme | 201 ++- completions/bash-nvme-completion.sh | 99 +- fabrics.c | 32 +- meson.build | 4 +- nbft.c | 46 +- nvme-builtin.h | 11 +- nvme-print-binary.c | 64 +- nvme-print-json.c | 562 ++++++-- nvme-print-stdout.c | 1279 ++++++++++++----- nvme-print.c | 226 ++- nvme-print.h | 42 +- nvme-wrap.c | 67 +- nvme-wrap.h | 29 +- nvme.c | 1110 +++++++++++++- nvme.h | 2 +- nvme.spec.in | 1 + .../udev-rules/70-nvmf-keys.rules.in | 2 +- .../udev-rules/71-nvmf-netapp.rules.in | 4 +- plugins/amzn/amzn-nvme.c | 221 +++ plugins/amzn/amzn-nvme.h | 1 + plugins/dapustor/dapustor-nvme.c | 4 +- plugins/fdp/fdp.c | 108 ++ plugins/fdp/fdp.h | 3 +- plugins/huawei/huawei-nvme.c | 4 + plugins/intel/intel-nvme.c | 8 +- plugins/lm/lm-nvme.c | 669 +++++++++ plugins/lm/lm-nvme.h | 30 + plugins/lm/lm-print-binary.c | 25 + plugins/lm/lm-print-json.c | 109 ++ plugins/lm/lm-print-stdout.c | 145 ++ plugins/lm/lm-print.c | 38 + plugins/lm/lm-print.h | 31 + plugins/lm/meson.build | 12 + plugins/meson.build | 61 +- plugins/micron/micron-nvme.c | 37 +- plugins/nbft/nbft-plugin.c | 4 + plugins/netapp/netapp-nvme.c | 318 +++- plugins/ocp/ocp-clear-features.c | 12 +- plugins/ocp/ocp-fw-activation-history.c | 4 +- plugins/ocp/ocp-fw-activation-history.h | 3 +- plugins/ocp/ocp-hardware-component-log.c | 57 +- plugins/ocp/ocp-hardware-component-log.h | 2 +- plugins/ocp/ocp-nvme.c | 230 +-- plugins/ocp/ocp-nvme.h | 47 +- plugins/ocp/ocp-print-binary.c | 7 +- plugins/ocp/ocp-print-json.c | 408 +++++- plugins/ocp/ocp-print-stdout.c | 230 +-- plugins/ocp/ocp-print.c | 5 +- plugins/ocp/ocp-print.h | 6 +- plugins/ocp/ocp-smart-extended-log.c | 32 +- plugins/ocp/ocp-smart-extended-log.h | 175 ++- plugins/ocp/ocp-telemetry-decode.c | 162 ++- plugins/ocp/ocp-telemetry-decode.h | 287 +++- plugins/ocp/ocp-types.h | 13 + plugins/ocp/ocp-utils.c | 22 + plugins/ocp/ocp-utils.h | 3 +- plugins/scaleflux/sfx-nvme.c | 712 +++++++-- plugins/scaleflux/sfx-nvme.h | 1 + plugins/scaleflux/sfx-types.h | 189 +++ plugins/seagate/seagate-nvme.c | 40 +- plugins/sed/sed.c | 37 +- plugins/sed/sedopal_cmd.c | 666 ++++++++- plugins/sed/sedopal_cmd.h | 4 + plugins/sed/sedopal_spec.h | 321 ++++- plugins/solidigm/solidigm-internal-logs.c | 82 +- plugins/solidigm/solidigm-log-page-dir.c | 1 + plugins/solidigm/solidigm-nvme.h | 2 +- plugins/solidigm/solidigm-telemetry/config.c | 2 +- plugins/ssstc/ssstc-nvme.c | 4 +- plugins/virtium/virtium-nvme.c | 6 +- plugins/wdc/wdc-nvme.c | 425 +++++- plugins/wdc/wdc-nvme.h | 2 +- plugins/wdc/wdc-utils.c | 2 +- scripts/build.sh | 9 +- subprojects/json-c.wrap | 18 +- subprojects/libnvme.wrap | 2 +- tests/nvme_attach_detach_ns_test.py | 3 - tests/nvme_compare_test.py | 11 +- tests/nvme_copy_test.py | 49 +- tests/nvme_create_max_ns_test.py | 16 +- tests/nvme_ctrl_reset_test.py | 2 +- tests/nvme_dsm_test.py | 7 +- tests/nvme_flush_test.py | 4 +- tests/nvme_format_test.py | 65 +- tests/nvme_fw_log_test.py | 8 +- tests/nvme_get_features_test.py | 14 +- tests/nvme_get_lba_status_test.py | 18 +- tests/nvme_id_ns_test.py | 13 +- tests/nvme_lba_status_log_test.py | 8 +- tests/nvme_smart_log_test.py | 10 +- tests/nvme_test.py | 231 ++- tests/nvme_test_io.py | 19 +- tests/nvme_verify_test.py | 22 +- tests/nvme_writeuncor_test.py | 6 +- tests/nvme_writezeros_test.py | 6 +- util/argconfig.h | 6 + util/json.c | 63 + util/json.h | 61 +- util/logging.c | 5 +- util/logging.h | 14 +- util/types.c | 23 +- util/types.h | 5 +- util/utils.c | 10 +- 571 files changed, 10718 insertions(+), 2738 deletions(-) create mode 100644 .checkpatch.conf create mode 100644 Documentation/nvme-ave-discovery-log.txt create mode 100644 Documentation/nvme-changed-alloc-ns-list-log.txt create mode 100644 Documentation/nvme-dispersed-ns-participating-nss-log.txt create mode 100644 Documentation/nvme-fdp-feature.1 copy Documentation/{nvme-zns-close-zone.html => nvme-fdp-feature.html} (86%) create mode 100644 Documentation/nvme-fdp-feature.txt create mode 100644 Documentation/nvme-host-discovery-log.txt create mode 100644 Documentation/nvme-mgmt-addr-list-log.txt create mode 100644 Documentation/nvme-pull-model-ddr-req-log.txt create mode 100644 Documentation/nvme-reachability-associations-log.txt create mode 100644 Documentation/nvme-reachability-groups-log.txt create mode 100644 Documentation/nvme-rotational-media-info-log.txt create mode 100644 plugins/lm/lm-nvme.c create mode 100644 plugins/lm/lm-nvme.h create mode 100644 plugins/lm/lm-print-binary.c create mode 100644 plugins/lm/lm-print-json.c create mode 100644 plugins/lm/lm-print-stdout.c create mode 100644 plugins/lm/lm-print.c create mode 100644 plugins/lm/lm-print.h create mode 100644 plugins/lm/meson.build create mode 100644 plugins/ocp/ocp-types.h create mode 100644 plugins/scaleflux/sfx-types.h diff --git a/.checkpatch.conf b/.checkpatch.conf new file mode 100644 index 0000000..aacb982 --- /dev/null +++ b/.checkpatch.conf @@ -0,0 +1,24 @@ +# Checkpatch options. +# REF: https://docs.kernel.org/dev-tools/checkpatch.html + +# This isn't actually a Linux kernel tree +--no-tree + +--max-line-length=100 + +--ignore EMAIL_SUBJECT + +# FILE_PATH_CHANGES reports this kind of message: +# "added, moved or deleted file(s), does MAINTAINERS need updating?" +--ignore FILE_PATH_CHANGES + + +# Commit messages might contain a Gerrit Change-Id. +--ignore GERRIT_CHANGE_ID + +# Do not check the format of commit messages, as Gerrit's merge commits do not +# preserve it. +--ignore GIT_COMMIT_ID + +# Avoid "Does not appear to be a unified-diff format patch" message +--ignore NOT_UNIFIED_DIFF diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index 20c69fa..a743d03 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -17,6 +17,7 @@ jobs: - name: build run: | scripts/build.sh coverage - - uses: codecov/codecov-action@v4 + - uses: codecov/codecov-action@v5 with: - fail_ci_if_error: false + token: ${{ secrets.CODECOV_TOKEN }} + fail_ci_if_error: true diff --git a/.github/workflows/run-nightly-tests.yml b/.github/workflows/run-nightly-tests.yml index d525986..e8ac232 100644 --- a/.github/workflows/run-nightly-tests.yml +++ b/.github/workflows/run-nightly-tests.yml @@ -9,39 +9,25 @@ on: jobs: nightly-tests: runs-on: nvme-nvm + container: + image: ghcr.io/linux-nvme/debian.python:latest + #Expose all devices to the container through the `privileged` flag. + # + #BDEV0 is an environment variable of the self-hosted runner instance + #that contains a valid nvme ctrl name which is capable of the nvm + #command set. + options: '--privileged -v "/dev":"/dev":z -e BDEV0' steps: - name: Output kernel version run: | uname -a - - name: Clean up test device - run: | - #BDEV0 is an environment variable of the self-hosted runner instance - #that contains a valid nvme ctrl name which is capable of the nvm - #command set. - CONTROLLER=$(echo /dev/${BDEV0} | sed 's/n[0-9]*$//') - sudo nvme delete-ns $CONTROLLER -n 0xffffffff - sudo nvme format $CONTROLLER -n 0xffffffff -l 0 -f - SIZE=$(sudo nvme id-ctrl $CONTROLLER --output-format=json | jq -r '{tnvmcap} | .[]' | awk '{print $1/512}') - sudo nvme create-ns -s $SIZE -c $SIZE -f 0 -d 0 --csi=0 $CONTROLLER - sudo nvme attach-ns $CONTROLLER -n 1 -c 0 - uses: actions/checkout@v4 - name: Install dependencies run: | - sudo apt-get update - sudo apt-get install --no-install-recommends -y \ - meson gcc pkg-config git libjson-c-dev libssl-dev libkeyutils-dev \ - libdbus-1-dev libpython3-dev pipx python3-dev swig xz-utils - pipx ensurepath - sudo PIPX_BIN_DIR=/usr/local/bin pipx install nose2 - sudo PIPX_BIN_DIR=/usr/local/bin pipx install flake8 - sudo PIPX_BIN_DIR=/usr/local/bin pipx install mypy - sudo PIPX_BIN_DIR=/usr/local/bin pipx install autopep8 - sudo PIPX_BIN_DIR=/usr/local/bin pipx install isort + PIPX_BIN_DIR=/usr/local/bin pipx install nose2 --force - name: Build and install nvme-cli run: | scripts/build.sh -b release -c gcc - sudo meson install -C .build-ci - sudo ldconfig /usr/local/lib64 - name: Overwrite test config run: | CONTROLLER=$(echo /dev/${BDEV0} | sed 's/n[0-9]*$//') @@ -49,12 +35,14 @@ jobs: { "controller" : "$CONTROLLER", "ns1": "/dev/${BDEV0}", - "log_dir": "tests/nvmetests/" + "log_dir": "tests/nvmetests/", + "nvme_bin": "$(pwd)/.build-ci/nvme" } EOF + cat tests/config.json - name: Run on device tests run: | - sudo nose2 --verbose --start-dir tests \ + nose2 --verbose --start-dir tests \ nvme_attach_detach_ns_test \ nvme_compare_test \ nvme_copy_test \ @@ -79,15 +67,6 @@ jobs: uses: actions/upload-artifact@v4 if: always() with: - name: logs files + name: nvme-cli-test-logs path: | ./tests/nvmetests/**/*.log - - name: Clean up test device - if: always() - run: | - CONTROLLER=$(echo /dev/${BDEV0} | sed 's/n[0-9]*$//') - sudo nvme delete-ns $CONTROLLER -n 0xffffffff - sudo nvme format $CONTROLLER -n 0xffffffff -l 0 -f - SIZE=$(sudo nvme id-ctrl $CONTROLLER --output-format=json | jq -r '{tnvmcap} | .[]' | awk '{print $1/512}') - sudo nvme create-ns -s $SIZE -c $SIZE -f 0 -d 0 --csi=0 $CONTROLLER - sudo nvme attach-ns $CONTROLLER -n 1 -c 0 diff --git a/Documentation/cmd-plugins.txt b/Documentation/cmd-plugins.txt index 2e80bfc..ee77408 100644 --- a/Documentation/cmd-plugins.txt +++ b/Documentation/cmd-plugins.txt @@ -207,3 +207,36 @@ linknvme:nvme-inspur-nvme-vendor-log[1]:: linknvme:nvme-dapustor-smart-log-add[1]:: NVMe DapuStor Additional SMART log page + +linknvme:nvme-solidigm-id-ctrl[1]:: + Solidigm - NVMe Identify Controller + +linknvme:nvme-solidigm-smart-log-add[1]:: + Retrieve Solidigm SMART Log + +linknvme:nvme-solidigm-vs-internal-log[1]:: + Retrieve Debug log binaries + +linknvme:nvme-solidigm-garbage-collect-log[1]:: + Retrieve Garbage Collection Log + +linknvme:nvme-solidigm-market-log[1]:: + Retrieve Market Log + +linknvme:nvme-solidigm-latency-tracking-log[1]:: + Enable/Retrieve Latency tracking Log + +linknvme:nvme-solidigm-parse-telemetry-log[1]:: + Parse Telemetry Log binary + +linknvme:nvme-solidigm-log-page-directory[1]:: + Retrieve log page directory + +linknvme:nvme-solidigm-temp-stats[1]:: + Retrieve Temperature Statistics log + +linknvme:nvme-solidigm-vs-drive-info[1]:: + Retrieve drive information + +linknvme:nvme-solidigm-workload-tracker[1]:: + Real Time capture Workload Tracker samples diff --git a/Documentation/meson.build b/Documentation/meson.build index 65495e3..e81db8c 100644 --- a/Documentation/meson.build +++ b/Documentation/meson.build @@ -32,6 +32,7 @@ adoc_sources = [ 'nvme-error-log', 'nvme-fdp-configs', 'nvme-fdp-events', + 'nvme-fdp-feature', 'nvme-fdp-set-events', 'nvme-fdp-stats', 'nvme-fdp-status', diff --git a/Documentation/nvme-admin-passthru.1 b/Documentation/nvme-admin-passthru.1 index 25576c9..075816d 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ADMIN\-PASSTHR" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-ADMIN\-PASSTHR" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-admin-passthru.html b/Documentation/nvme-admin-passthru.html index 1ae7d89..84eacca 100644 --- a/Documentation/nvme-admin-passthru.html +++ b/Documentation/nvme-admin-passthru.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-admin-passthru(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -1038,7 +1038,7 @@ Or if you want to save that structure to a file: <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-ana-log.1 b/Documentation/nvme-ana-log.1 index e34ef0f..dca4ba1 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ANA\-LOG" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-ANA\-LOG" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-ana-log.html b/Documentation/nvme-ana-log.html index 0e3be22..154dad4 100644 --- a/Documentation/nvme-ana-log.html +++ b/Documentation/nvme-ana-log.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-ana-log(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -835,7 +835,7 @@ Print the ANA log page in a human readable format: <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-attach-ns.1 b/Documentation/nvme-attach-ns.1 index f6f93f1..c82e1b2 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ATTACH\-NS" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-ATTACH\-NS" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -39,11 +39,13 @@ nvme-attach-ns \- Send NVMe attach namespace, return result\&. .SH "DESCRIPTION" .sp For the NVMe device given, sends the nvme namespace attach command for the provided namespace identifier, attaching to the provided list of controller identifiers\&. +.sp +The <device> parameter is mandatory NVMe character device (ex: /dev/nvme0) but not a namespace block device (ex: /dev/nvme0n1)\&. .SH "OPTIONS" .PP \-n <nsid>, \-\-namespace\-id=<nsid> .RS 4 -The namespace identifier to attach\&. +The namespace identifier to attach but not attached already\&. .RE .PP \-c <ctrl\-list,>, \-controllers=<ctrl\-list,> diff --git a/Documentation/nvme-attach-ns.html b/Documentation/nvme-attach-ns.html index 926a570..bbb71e1 100644 --- a/Documentation/nvme-attach-ns.html +++ b/Documentation/nvme-attach-ns.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-attach-ns(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -762,6 +762,8 @@ nvme-attach-ns(1) Manual Page <div class="paragraph"><p>For the NVMe device given, sends the nvme namespace attach command for the provided namespace identifier, attaching to the provided list of controller identifiers.</p></div> +<div class="paragraph"><p>The <device> parameter is mandatory NVMe character device (ex: /dev/nvme0) but +not a namespace block device (ex: /dev/nvme0n1).</p></div> </div> </div> <div class="sect1"> @@ -776,7 +778,7 @@ controller identifiers.</p></div> </dt> <dd> <p> - The namespace identifier to attach. + The namespace identifier to attach but not attached already. </p> </dd> <dt class="hdlist1"> @@ -841,7 +843,7 @@ controller identifiers.</p></div> <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-attach-ns.txt b/Documentation/nvme-attach-ns.txt index 601c20d..1d50759 100644 --- a/Documentation/nvme-attach-ns.txt +++ b/Documentation/nvme-attach-ns.txt @@ -18,11 +18,14 @@ For the NVMe device given, sends the nvme namespace attach command for the provided namespace identifier, attaching to the provided list of controller identifiers. +The <device> parameter is mandatory NVMe character device (ex: /dev/nvme0) but +not a namespace block device (ex: /dev/nvme0n1). + OPTIONS ------- -n <nsid>:: --namespace-id=<nsid>:: - The namespace identifier to attach. + The namespace identifier to attach but not attached already. -c <ctrl-list,>:: -controllers=<ctrl-list,>:: diff --git a/Documentation/nvme-ave-discovery-log.txt b/Documentation/nvme-ave-discovery-log.txt new file mode 100644 index 0000000..75de361 --- /dev/null +++ b/Documentation/nvme-ave-discovery-log.txt @@ -0,0 +1,51 @@ +nvme-ave-discovery-log(1) +========================= + +NAME +---- +nvme-ave-discovery-log - Retrieve AVE Discovery Log, show it + +SYNOPSIS +-------- +[verse] +'nvme ave-discovery-log' <device> [--rae | -r] [--verbose | -v] + [--output-format=<fmt> | -o <fmt>] [--timeout=<timeout>] + +DESCRIPTION +----------- +Retrieve AVE Discovery Log, show it + +The <device> parameter is mandatory NVMe character device (ex: /dev/nvme0). + +On success it returns 0, error code otherwise. + +OPTIONS +------- +-r:: +--rae:: + Retain an Asynchronous Event. + +-v:: +--verbose:: + Increase the information detail in the output. + +-o <fmt>:: +--output-format=<fmt>:: + Set the reporting format to 'normal', 'json' or 'binary'. Only one + output format can be used at a time. + +-t <timeout>:: +--timeout=<timeout>:: + Override default timeout value. In milliseconds. + +EXAMPLES +-------- +* Has the program issue a ave-discovery-log ++ +------------ +# nvme ave-discovery-log /dev/nvme0 +------------ + +NVME +---- +Part of the nvme-user suite. diff --git a/Documentation/nvme-boot-part-log.1 b/Documentation/nvme-boot-part-log.1 index 1727157..afb9ab3 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-BOOT\-PART\-LO" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-BOOT\-PART\-LO" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-boot-part-log.html b/Documentation/nvme-boot-part-log.html index 6bf52e9..56588b2 100644 --- a/Documentation/nvme-boot-part-log.html +++ b/Documentation/nvme-boot-part-log.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-boot-part-log(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -846,7 +846,7 @@ Retrieve Boot Partition data to boot_part_log.bin <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-capacity-mgmt.1 b/Documentation/nvme-capacity-mgmt.1 index 7ec35b8..22d19b7 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-CAPACITY\-MGMT" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-CAPACITY\-MGMT" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-capacity-mgmt.html b/Documentation/nvme-capacity-mgmt.html index c0bb419..a8b650b 100644 --- a/Documentation/nvme-capacity-mgmt.html +++ b/Documentation/nvme-capacity-mgmt.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-capacity-mgmt(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -875,7 +875,7 @@ device (ex: /dev/nvme0), or a namespace block device (ex: /dev/nvme0n1).</p></di <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-changed-alloc-ns-list-log.txt b/Documentation/nvme-changed-alloc-ns-list-log.txt new file mode 100644 index 0000000..3a7f2e8 --- /dev/null +++ b/Documentation/nvme-changed-alloc-ns-list-log.txt @@ -0,0 +1,67 @@ +nvme-changed-alloc-ns-list-log(1) +================================= + +NAME +---- +nvme-changed-alloc-ns-list-log - Send NVMe Changed Allocated Namespace List +log page request, returns result and log. + +SYNOPSIS +-------- +[verse] +'nvme changed-alloc-ns-list-log' <device> [--raw-binary | -b] + [--output-format=<fmt> | -o <fmt>] [--verbose | -v] + [--timeout=<timeout>] + +DESCRIPTION +----------- +Retrieves the NVMe Changed Allocated Namespace List log page from an NVMe +device and provides the returned structure. + +The <device> parameter is mandatory and must be a NVMe character device +(ex: /dev/nvme0). + +On success, the returned Changed Allocated Namespace List 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 +------- +-b:: +--raw-binary:: + Print the raw Changed Namespace List log buffer to stdout. + +-o <fmt>:: +--output-format=<fmt>:: + Set the reporting format to 'normal', 'json' or 'binary'. Only one + output format can be used at a time. + +-v:: +--verbose:: + Increase the information detail in the output. + +-t <timeout>:: +--timeout=<timeout>:: + Override default timeout value. In milliseconds. + +EXAMPLES +-------- +* Print the Changed Allocated Namespace List Log page in a human readable format: ++ +------------ +# nvme changed-alloc-ns-list-log /dev/nvme0 +------------ ++ + +* Print the raw Changed Allocated Namespace List log to a file: ++ +------------ +# nvme changed-alloc-ns-list-log /dev/nvme0 --raw-binary > 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/Documentation/nvme-changed-ns-list-log.1 b/Documentation/nvme-changed-ns-list-log.1 index ce729f7..facfe17 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-CHANGED\-NS\-L" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-CHANGED\-NS\-L" "1" "03/17/2025" "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 c7606df..c0569ad 100644 --- a/Documentation/nvme-changed-ns-list-log.html +++ b/Documentation/nvme-changed-ns-list-log.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-changed-ns-list-log(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -846,7 +846,7 @@ Print the raw Changed Namespace List log to a file: <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-cmdset-ind-id-ns.1 b/Documentation/nvme-cmdset-ind-id-ns.1 index 682c15d..be18f67 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-CMDSET\-IND\-I" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-CMDSET\-IND\-I" "1" "03/17/2025" "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 5bf46af..3ea9e13 100644 --- a/Documentation/nvme-cmdset-ind-id-ns.html +++ b/Documentation/nvme-cmdset-ind-id-ns.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-cmdset-ind-id-ns(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -889,7 +889,7 @@ Have the program return the raw structure in binary: <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-compare.1 b/Documentation/nvme-compare.1 index 556e3f5..cd3932f 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-COMPARE" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-COMPARE" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-compare.html b/Documentation/nvme-compare.html index bb0c7d7..a7b9d59 100644 --- a/Documentation/nvme-compare.html +++ b/Documentation/nvme-compare.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-compare(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -1125,7 +1125,7 @@ metadata is passes.</p></td> <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-connect-all.1 b/Documentation/nvme-connect-all.1 index b101728..af089f0 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-CONNECT\-ALL" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-CONNECT\-ALL" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-connect-all.html b/Documentation/nvme-connect-all.html index 80a9f37..a5f578a 100644 --- a/Documentation/nvme-connect-all.html +++ b/Documentation/nvme-connect-all.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-connect-all(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -1273,7 +1273,7 @@ nvme-connect(1)</p></div> <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-connect.1 b/Documentation/nvme-connect.1 index aca8d8c..acb7331 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-CONNECT" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-CONNECT" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-connect.html b/Documentation/nvme-connect.html index def8aee..f182419 100644 --- a/Documentation/nvme-connect.html +++ b/Documentation/nvme-connect.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-connect(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -1235,7 +1235,7 @@ and <a href="mailto:hch@lst.de">Christoph Hellwig</a></p></div> <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-copy.1 b/Documentation/nvme-copy.1 index 82fa113..656e699 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-COPY" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-COPY" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-copy.html b/Documentation/nvme-copy.html index 6085489..c7258b7 100644 --- a/Documentation/nvme-copy.html +++ b/Documentation/nvme-copy.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-copy(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -1042,7 +1042,7 @@ logical block ranges to a single consecutive destination logical block range.</p <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-create-ns.1 b/Documentation/nvme-create-ns.1 index fe977f4..f105877 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-CREATE\-NS" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-CREATE\-NS" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -123,12 +123,12 @@ Target block size the new namespace should be formatted as\&. Potential FLBAS va .PP \-S, \-\-nsze\-si .RS 4 -The namespace size (NSZE) in standard SI units (aligned on 1Mib boundaries, unless the controller recommends a smaller value)\&. The value SI suffixed is divided by the namespace LBA size to set as NSZE\&. If the value not suffixed it is set as same with the nsze option\&. +The namespace size (NSZE) in standard SI units (aligned on 1Mib boundaries, unless the controller recommends a different value, see namespace granularity)\&. The value SI suffixed is divided by the namespace LBA size to set as NSZE\&. If the value not suffixed it is set as same with the nsze option\&. .RE .PP \-C, \-\-ncap\-si .RS 4 -The namespace capacity (NCAP) in standard SI units (aligned on 1Mib boundaries, unless the controller recommends a smaller value)\&. The value SI suffixed is divided by the namespace LBA size to set as NCAP\&. If the value not suffixed it is set as same with the ncap option\&. +The namespace capacity (NCAP) in standard SI units (aligned on 1Mib boundaries, unless the controller recommends a different value, see namespace granularity)\&. The value SI suffixed is divided by the namespace LBA size to set as NCAP\&. If the value not suffixed it is set as same with the ncap option\&. .RE .PP \-z, \-\-azr diff --git a/Documentation/nvme-create-ns.html b/Documentation/nvme-create-ns.html index cc37359..1ff7301 100644 --- a/Documentation/nvme-create-ns.html +++ b/Documentation/nvme-create-ns.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-create-ns(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -936,7 +936,8 @@ device (ex: /dev/nvme0), or a namespace block device (ex: /dev/nvme0n1).</p></di <dd> <p> The namespace size (NSZE) in standard SI units (aligned on 1Mib boundaries, - unless the controller recommends a smaller value). + unless the controller recommends a different value, see namespace + granularity). The value SI suffixed is divided by the namespace LBA size to set as NSZE. If the value not suffixed it is set as same with the nsze option. </p> @@ -950,7 +951,8 @@ device (ex: /dev/nvme0), or a namespace block device (ex: /dev/nvme0n1).</p></di <dd> <p> The namespace capacity (NCAP) in standard SI units (aligned on 1Mib boundaries, - unless the controller recommends a smaller value). + unless the controller recommends a different value, see namespace + granularity). The value SI suffixed is divided by the namespace LBA size to set as NCAP. If the value not suffixed it is set as same with the ncap option. </p> @@ -1082,7 +1084,7 @@ Create a namespace: <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-create-ns.txt b/Documentation/nvme-create-ns.txt index 95a514d..74ca237 100644 --- a/Documentation/nvme-create-ns.txt +++ b/Documentation/nvme-create-ns.txt @@ -99,14 +99,16 @@ OPTIONS -S:: --nsze-si:: The namespace size (NSZE) in standard SI units (aligned on 1Mib boundaries, - unless the controller recommends a smaller value). + unless the controller recommends a different value, see namespace + granularity). The value SI suffixed is divided by the namespace LBA size to set as NSZE. If the value not suffixed it is set as same with the nsze option. -C:: --ncap-si:: The namespace capacity (NCAP) in standard SI units (aligned on 1Mib boundaries, - unless the controller recommends a smaller value). + unless the controller recommends a different value, see namespace + granularity). The value SI suffixed is divided by the namespace LBA size to set as NCAP. If the value not suffixed it is set as same with the ncap option. diff --git a/Documentation/nvme-dapustor-smart-log-add.1 b/Documentation/nvme-dapustor-smart-log-add.1 index 6750164..a5ef9a3 100644 --- a/Documentation/nvme-dapustor-smart-log-add.1 +++ b/Documentation/nvme-dapustor-smart-log-add.1 @@ -2,12 +2,12 @@ .\" Title: nvme-dapustor-smart-log-add .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-DAPUSTOR\-SMAR" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-DAPUSTOR\-SMAR" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-dapustor-smart-log-add.html b/Documentation/nvme-dapustor-smart-log-add.html index f7a5825..65d79ca 100644 --- a/Documentation/nvme-dapustor-smart-log-add.html +++ b/Documentation/nvme-dapustor-smart-log-add.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-dapustor-smart-log-add(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -849,7 +849,7 @@ Print the raw DapuStor Additional SMART log to a file: <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-delete-ns.1 b/Documentation/nvme-delete-ns.1 index 7ac1853..0c05766 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ID\-NS" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-ID\-NS" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-delete-ns.html b/Documentation/nvme-delete-ns.html index 6ee087b..de96e89 100644 --- a/Documentation/nvme-delete-ns.html +++ b/Documentation/nvme-delete-ns.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-id-ns(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -835,7 +835,7 @@ The <code>'--namespace-id'</code> option is mandatory.</p></div> <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-dera-stat.1 b/Documentation/nvme-dera-stat.1 index e56fb7b..017928c 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-DERA\-STAT" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-DERA\-STAT" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-dera-stat.html b/Documentation/nvme-dera-stat.html index ee45937..cda7572 100644 --- a/Documentation/nvme-dera-stat.html +++ b/Documentation/nvme-dera-stat.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-dera-stat(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -797,7 +797,7 @@ Print the Dera Device status and Additional SMART log page in a human readable f <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-detach-ns.1 b/Documentation/nvme-detach-ns.1 index c9a8e1c..ee26c86 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-DETACH\-NS" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-DETACH\-NS" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-detach-ns.html b/Documentation/nvme-detach-ns.html index 025bf6a..630e452 100644 --- a/Documentation/nvme-detach-ns.html +++ b/Documentation/nvme-detach-ns.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-detach-ns(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -834,7 +834,7 @@ controller identifiers.</p></div> <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-device-self-test.1 b/Documentation/nvme-device-self-test.1 index d21ea59..646cda1 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-DEVICE\-SELF\-" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-DEVICE\-SELF\-" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-device-self-test.html b/Documentation/nvme-device-self-test.html index 1f0c092..4b4e3c3 100644 --- a/Documentation/nvme-device-self-test.html +++ b/Documentation/nvme-device-self-test.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-device-self-test(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -885,7 +885,7 @@ Abort the device self-test operation in the namespace-id 1: <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-dim.1 b/Documentation/nvme-dim.1 index 6f62713..3fa8ab5 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-DIM" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-DIM" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-dim.html b/Documentation/nvme-dim.html index 82c9f0c..a38c0f0 100644 --- a/Documentation/nvme-dim.html +++ b/Documentation/nvme-dim.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-dim(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -885,7 +885,7 @@ Deregister from Central Discovery Controller (CDC) associated with nvme4 <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-dir-receive.1 b/Documentation/nvme-dir-receive.1 index 49e182c..4c01fef 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-DIR\-RECEIVE" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-DIR\-RECEIVE" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-dir-receive.html b/Documentation/nvme-dir-receive.html index d425384..23d0d4d 100644 --- a/Documentation/nvme-dir-receive.html +++ b/Documentation/nvme-dir-receive.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-dir-receive(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -1001,7 +1001,7 @@ Get streams directive status : <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-dir-send.1 b/Documentation/nvme-dir-send.1 index 6e16d68..94b48cf 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-DIR\-SEND" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-DIR\-SEND" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-dir-send.html b/Documentation/nvme-dir-send.html index 4168304..b669e9f 100644 --- a/Documentation/nvme-dir-send.html +++ b/Documentation/nvme-dir-send.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-dir-send(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -1014,7 +1014,7 @@ Release stream ID 3 : <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-disconnect-all.1 b/Documentation/nvme-disconnect-all.1 index 49a6455..44a592d 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-DISCONNECT\-AL" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-DISCONNECT\-AL" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-disconnect-all.html b/Documentation/nvme-disconnect-all.html index b579049..67d0270 100644 --- a/Documentation/nvme-disconnect-all.html +++ b/Documentation/nvme-disconnect-all.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-disconnect-all(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -825,7 +825,7 @@ Disconnect all existing nvme controllers: <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-disconnect.1 b/Documentation/nvme-disconnect.1 index aa443e8..9b61741 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-DISCONNECT" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-DISCONNECT" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-disconnect.html b/Documentation/nvme-disconnect.html index 29bb6ed..2d3c83d 100644 --- a/Documentation/nvme-disconnect.html +++ b/Documentation/nvme-disconnect.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-disconnect(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -862,7 +862,7 @@ Disconnect the controller nvme4 <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-discover.1 b/Documentation/nvme-discover.1 index 8590c03..4202689 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-DISCOVER" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-DISCOVER" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-discover.html b/Documentation/nvme-discover.html index 7ee02b4..b4e2a5e 100644 --- a/Documentation/nvme-discover.html +++ b/Documentation/nvme-discover.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-discover(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -1322,7 +1322,7 @@ nvme-connect-all(1)</p></div> <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-dispersed-ns-participating-nss-log.txt b/Documentation/nvme-dispersed-ns-participating-nss-log.txt new file mode 100644 index 0000000..93b0062 --- /dev/null +++ b/Documentation/nvme-dispersed-ns-participating-nss-log.txt @@ -0,0 +1,55 @@ +nvme-dispersed-ns-participating-nss-log(1) +========================================== + +NAME +---- +nvme-dispersed-ns-participating-nss-log - Retrieve Dispersed Namespace +Participating NVM Subsystems Log, show it + +SYNOPSIS +-------- +[verse] +'nvme dispersed-ns-participating-nss-log' <device> + [--namespace-id=<nsid> | -n <nsid>] [--verbose | -v] + [--output-format=<fmt> | -o <fmt>] [--timeout=<timeout>] + +DESCRIPTION +----------- +Retrieve Dispersed Namespace Participating NVM Subsystems Log, show it + +The <device> parameter is mandatory NVMe character device (ex: /dev/nvme0). + +On success it returns 0, error code otherwise. + +OPTIONS +------- +-n <nsid>:: +--namespace-id=<nsid>:: + The namespace identifier to delete. + Retrieve the dispersed namespace participating NVM subsystems log for + the given nsid. + +-v:: +--verbose:: + Increase the information detail in the output. + +-o <fmt>:: +--output-format=<fmt>:: + Set the reporting format to 'normal', 'json' or 'binary'. Only one + output format can be used at a time. + +-t <timeout>:: +--timeout=<timeout>:: + Override default timeout value. In milliseconds. + +EXAMPLES +-------- +* Has the program issue a dispersed-ns-participating-nss-log ++ +------------ +# nvme dispersed-ns-participating-nss-log /dev/nvme0 --namespace-id=2 +------------ + +NVME +---- +Part of the nvme-user suite. diff --git a/Documentation/nvme-dsm.1 b/Documentation/nvme-dsm.1 index e7a8b58..30c5764 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-DSM" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-DSM" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-dsm.html b/Documentation/nvme-dsm.html index 2761bee..65aeb0b 100644 --- a/Documentation/nvme-dsm.html +++ b/Documentation/nvme-dsm.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-dsm(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -930,7 +930,7 @@ any settings from the flags may have provided.</p></div> <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-effects-log.1 b/Documentation/nvme-effects-log.1 index 5960677..3807cbf 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-EFFECTS\-LOG" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-EFFECTS\-LOG" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-effects-log.html b/Documentation/nvme-effects-log.html index 7f949af..5941a69 100644 --- a/Documentation/nvme-effects-log.html +++ b/Documentation/nvme-effects-log.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-effects-log(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -869,7 +869,7 @@ Have the program return the raw structure in binary: <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-endurance-event-agg-log.1 b/Documentation/nvme-endurance-event-agg-log.1 index 0c5e181..1d135ec 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ENDURANCE\-EVE" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-ENDURANCE\-EVE" "1" "03/17/2025" "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 9f426a2..5590987 100644 --- a/Documentation/nvme-endurance-event-agg-log.html +++ b/Documentation/nvme-endurance-event-agg-log.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-endurance-event-agg-log(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -862,7 +862,7 @@ Print the raw Endurance log to a file: <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-endurance-log.1 b/Documentation/nvme-endurance-log.1 index 26ff933..753ee30 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ENDURANCE\-LOG" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-ENDURANCE\-LOG" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-endurance-log.html b/Documentation/nvme-endurance-log.html index f72f35e..e96a936 100644 --- a/Documentation/nvme-endurance-log.html +++ b/Documentation/nvme-endurance-log.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-endurance-log(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -845,7 +845,7 @@ Print the raw Endurance log to a file: <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-error-log.1 b/Documentation/nvme-error-log.1 index 9a4b8a9..7267411 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ERROR\-LOG" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-ERROR\-LOG" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-error-log.html b/Documentation/nvme-error-log.html index 8db4c61..790a25f 100644 --- a/Documentation/nvme-error-log.html +++ b/Documentation/nvme-error-log.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-error-log(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -860,7 +860,7 @@ Print the raw output to a file: <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-fdp-configs.1 b/Documentation/nvme-fdp-configs.1 index 500375c..41bd295 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-FDP\-CONFIGS" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-FDP\-CONFIGS" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-fdp-configs.html b/Documentation/nvme-fdp-configs.html index aa79a09..c1c5f29 100644 --- a/Documentation/nvme-fdp-configs.html +++ b/Documentation/nvme-fdp-configs.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-fdp-configs(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -826,7 +826,7 @@ the possible configurations for Flexible Data Placement.</p></div> <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-fdp-events.1 b/Documentation/nvme-fdp-events.1 index 39d80c5..ff50ed7 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-FDP\-EVENTS" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-FDP\-EVENTS" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-fdp-events.html b/Documentation/nvme-fdp-events.html index fed22f9..8af3021 100644 --- a/Documentation/nvme-fdp-events.html +++ b/Documentation/nvme-fdp-events.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-fdp-events(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -825,7 +825,7 @@ Units and media usage in an Endurance Group.</p></div> <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-fdp-feature.1 b/Documentation/nvme-fdp-feature.1 new file mode 100644 index 0000000..32d76ce --- /dev/null +++ b/Documentation/nvme-fdp-feature.1 @@ -0,0 +1,86 @@ +'\" t +.\" Title: nvme-fdp-feature +.\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] +.\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/> +.\" Date: 03/17/2025 +.\" Manual: NVMe Manual +.\" Source: NVMe +.\" Language: English +.\" +.TH "NVME\-FDP\-FEATURE" "1" "03/17/2025" "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-fdp-feature \- Show or change Flexible Data Placement (FDP) Feature +.SH "SYNOPSIS" +.sp +.nf +\fInvme fdp\fR <device> [\-\-endgrp\-id=<NUM> | \-e <NUM>] + [\-\-enable\-conf\-idx=<NUM> | \-c <NUM>] + [\-\-disable | \-d] + [\-\-verbose | \-v] +.fi +.SH "DESCRIPTION" +.sp +For the NVMe device given, configure and manage the Flexible Data Placement (FDP) feature\&. +.sp +This command can be used to either show the current FDP feature configuration or change it\&. +.sp +.if n \{\ +.RS 4 +.\} +.nf + If no `\-\-enable\-conf\-idx` or `\-\-disable` options are provided, the current configuration is +displayed\&. +.fi +.if n \{\ +.RE +.\} +.sp +If the \-\-enable\-conf\-idx or \-\-disable options are provided, configuration is changed accordingly\&. Device may refuse the change if there is a namespace\&. +.sp +The <device> parameter is mandatory and must be a NVMe character device (ex: /dev/nvme0) +.SH "OPTIONS" +.PP +\-e <NUM>, \-\-endgrp\-id=<NUM> +.RS 4 +Specify the endurance group ID\&. This option is mandatory if device supports endurance groups\&. +.RE +.PP +\-c <NUM>, \-\-enable\-conf\-idx=<NUM> +.RS 4 +Enable FDP feature with the specified configuration\&. The configuration index matches position listed by nvme\-fdp\-config(1)\&. +.RE +.PP +\-d, \-\-disable +.RS 4 +Disable the current FDP feature configuration\&. +.RE +.PP +\-v, \-\-verbose +.RS 4 +Increase verbosity of the output\&. +.RE +.SH "SEE ALSO" +.sp +nvme\-list\-endgrp(1) nvme\-fdp\-config(1) +.SH "NVME" +.sp +Part of nvme\-cli diff --git a/Documentation/nvme-zns-close-zone.html b/Documentation/nvme-fdp-feature.html similarity index 86% copy from Documentation/nvme-zns-close-zone.html copy to Documentation/nvme-fdp-feature.html index adef16b..d5a37b6 100644 --- a/Documentation/nvme-zns-close-zone.html +++ b/Documentation/nvme-fdp-feature.html @@ -4,8 +4,8 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> -<title>nvme-zns-close-zone(1)</title> +<meta name="generator" content="AsciiDoc 10.2.0" /> +<title>nvme-fdp-feature(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -735,12 +735,12 @@ asciidoc.install(); <body class="manpage"> <div id="header"> <h1> -nvme-zns-close-zone(1) Manual Page +nvme-fdp-feature(1) Manual Page </h1> <h2>NAME</h2> <div class="sectionbody"> -<p>nvme-zns-close-zone - - Closes one or all zones +<p>nvme-fdp-feature - + Show or change Flexible Data Placement (FDP) Feature </p> </div> </div> @@ -749,10 +749,10 @@ nvme-zns-close-zone(1) Manual Page <h2 id="_synopsis">SYNOPSIS</h2> <div class="sectionbody"> <div class="verseblock"> -<pre class="content"><em>nvme zns close-zone</em> <device> [--namespace-id=<NUM> | -n <NUM>] - [--start-lba=<LBA> | -s <LBA>] - [--select-all | -a] - [--timeout=<timeout> | -t <timeout>]</pre> +<pre class="content"><em>nvme fdp</em> <device> [--endgrp-id=<NUM> | -e <NUM>] + [--enable-conf-idx=<NUM> | -c <NUM>] + [--disable | -d] + [--verbose | -v]</pre> <div class="attribution"> </div></div> </div> @@ -760,10 +760,16 @@ nvme-zns-close-zone(1) Manual Page <div class="sect1"> <h2 id="_description">DESCRIPTION</h2> <div class="sectionbody"> -<div class="paragraph"><p>For the NVMe device given, issues the Zone Management Send command with the -"Close Zone" action. This will transition the zone to the closed state.</p></div> -<div class="paragraph"><p>The <device> parameter is mandatory and may be either the NVMe character -device (ex: /dev/nvme0), or a namespace block device (ex: /dev/nvme0n1).</p></div> +<div class="paragraph"><p>For the NVMe device given, configure and manage the Flexible Data Placement (FDP) feature.</p></div> +<div class="paragraph"><p>This command can be used to either show the current FDP feature configuration or change it.</p></div> +<div class="literalblock"> +<div class="content"> +<pre><code> If no `--enable-conf-idx` or `--disable` options are provided, the current configuration is +displayed.</code></pre> +</div></div> +<div class="paragraph"><p>If the <code>--enable-conf-idx</code> or <code>--disable</code> options are provided, configuration is changed +accordingly. Device may refuse the change if there is a namespace.</p></div> +<div class="paragraph"><p>The <device> parameter is mandatory and must be a NVMe character device (ex: /dev/nvme0)</p></div> </div> </div> <div class="sect1"> @@ -771,68 +777,58 @@ device (ex: /dev/nvme0), or a namespace block device (ex: /dev/nvme0n1).</p></di <div class="sectionbody"> <div class="dlist"><dl> <dt class="hdlist1"> --n <NUM> +-e <NUM> </dt> <dt class="hdlist1"> ---namespace-id=<NUM> +--endgrp-id=<NUM> </dt> <dd> <p> - Use the provided namespace id for the command. If not provided, the - namespace id of the block device will be used. If the command is issued - to a non-block device, the parameter is required. + Specify the endurance group ID. This option is mandatory if device supports endurance groups. </p> </dd> <dt class="hdlist1"> --s <lba> +-c <NUM> </dt> <dt class="hdlist1"> ---start-lba=<lba> +--enable-conf-idx=<NUM> </dt> <dd> <p> - The starting LBA of the zone to close. + Enable FDP feature with the specified configuration. The configuration index matches position + listed by nvme-fdp-config(1). </p> </dd> <dt class="hdlist1"> --a +-d </dt> <dt class="hdlist1"> ---select-all +--disable </dt> <dd> <p> - Select all zones for this action + Disable the current FDP feature configuration. </p> </dd> <dt class="hdlist1"> --t <timeout> +-v </dt> <dt class="hdlist1"> ---timeout=<timeout> +--verbose </dt> <dd> <p> - Override default timeout value. In milliseconds. + Increase verbosity of the output. </p> </dd> </dl></div> </div> </div> <div class="sect1"> -<h2 id="_examples">EXAMPLES</h2> +<h2 id="_see_also">SEE ALSO</h2> <div class="sectionbody"> -<div class="ulist"><ul> -<li> -<p> -Close all zones on namespace 1: -</p> -<div class="listingblock"> -<div class="content"> -<pre><code># nvme zns close-zone /dev/nvme0 -a -n 1</code></pre> -</div></div> -</li> -</ul></div> +<div class="paragraph"><p>nvme-list-endgrp(1) +nvme-fdp-config(1)</p></div> </div> </div> <div class="sect1"> @@ -846,7 +842,7 @@ Close all zones on namespace 1: <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-fdp-feature.txt b/Documentation/nvme-fdp-feature.txt new file mode 100644 index 0000000..543c788 --- /dev/null +++ b/Documentation/nvme-fdp-feature.txt @@ -0,0 +1,56 @@ +nvme-fdp-feature(1) +=================== + +NAME +---- +nvme-fdp-feature - Show or change Flexible Data Placement (FDP) Feature + +SYNOPSIS +-------- +[verse] +'nvme fdp' <device> [--endgrp-id=<NUM> | -e <NUM>] + [--enable-conf-idx=<NUM> | -c <NUM>] + [--disable | -d] + [--verbose | -v] + +DESCRIPTION +----------- +For the NVMe device given, configure and manage the Flexible Data Placement (FDP) feature. + +This command can be used to either show the current FDP feature configuration or change it. + + If no `--enable-conf-idx` or `--disable` options are provided, the current configuration is +displayed. + +If the `--enable-conf-idx` or `--disable` options are provided, configuration is changed +accordingly. Device may refuse the change if there is a namespace. + +The <device> parameter is mandatory and must be a NVMe character device (ex: /dev/nvme0) + +OPTIONS +------- +-e <NUM>:: +--endgrp-id=<NUM>:: + Specify the endurance group ID. This option is mandatory if device supports endurance groups. + +-c <NUM>:: +--enable-conf-idx=<NUM>:: + Enable FDP feature with the specified configuration. The configuration index matches position + listed by nvme-fdp-config(1). + +-d:: +--disable:: + Disable the current FDP feature configuration. + +-v:: +--verbose:: + Increase verbosity of the output. + +SEE ALSO +-------- +nvme-list-endgrp(1) +nvme-fdp-config(1) + +NVME +---- +Part of nvme-cli \ No newline at end of file diff --git a/Documentation/nvme-fdp-set-events.1 b/Documentation/nvme-fdp-set-events.1 index 1f0c9d9..6654b97 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-FDP\-SET\-EVEN" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-FDP\-SET\-EVEN" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-fdp-set-events.html b/Documentation/nvme-fdp-set-events.html index afd77fc..4a3e648 100644 --- a/Documentation/nvme-fdp-set-events.html +++ b/Documentation/nvme-fdp-set-events.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-fdp-set-events(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -816,7 +816,7 @@ Handle.</p></div> <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-fdp-stats.1 b/Documentation/nvme-fdp-stats.1 index d0bebf0..dd67346 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-FDP\-STATS" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-FDP\-STATS" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-fdp-stats.html b/Documentation/nvme-fdp-stats.html index dc431b2..14c5d22 100644 --- a/Documentation/nvme-fdp-stats.html +++ b/Documentation/nvme-fdp-stats.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-fdp-stats(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -814,7 +814,7 @@ the life of the FDP configuration in an Endurance Group.</p></div> <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-fdp-status.1 b/Documentation/nvme-fdp-status.1 index 90f1de7..c809ef2 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-FDP\-STATUS" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-FDP\-STATUS" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-fdp-status.html b/Documentation/nvme-fdp-status.html index dbb9813..4942f42 100644 --- a/Documentation/nvme-fdp-status.html +++ b/Documentation/nvme-fdp-status.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-fdp-status(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -814,7 +814,7 @@ are accessible by the specified namespace.</p></div> <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-fdp-update.1 b/Documentation/nvme-fdp-update.1 index a7d1eb5..876d4ff 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-FDP\-UPDATE" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-FDP\-UPDATE" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-fdp-update.html b/Documentation/nvme-fdp-update.html index ee9d309..8e6c2ff 100644 --- a/Documentation/nvme-fdp-update.html +++ b/Documentation/nvme-fdp-update.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-fdp-update(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -802,7 +802,7 @@ a different Reclaim Unit accessible by the specified namespace.</p></div> <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-fdp-usage.1 b/Documentation/nvme-fdp-usage.1 index 82434cf..eaf6b6f 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-FDP\-USAGE" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-FDP\-USAGE" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-fdp-usage.html b/Documentation/nvme-fdp-usage.html index 2d8531e..6589f0c 100644 --- a/Documentation/nvme-fdp-usage.html +++ b/Documentation/nvme-fdp-usage.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-fdp-usage(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -815,7 +815,7 @@ Endurance Group.</p></div> <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-fid-support-effects-log.1 b/Documentation/nvme-fid-support-effects-log.1 index 70f3a0a..0e30c0d 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-FID\-SUPPORT\-" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-FID\-SUPPORT\-" "1" "03/17/2025" "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 58af505..84c7431 100644 --- a/Documentation/nvme-fid-support-effects-log.html +++ b/Documentation/nvme-fid-support-effects-log.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-fid-support-effects-log(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -825,7 +825,7 @@ raw buffer may be printed to stdout.</p></div> <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-flush.1 b/Documentation/nvme-flush.1 index 5e3e486..9d97671 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-FLUSH" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-FLUSH" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-flush.html b/Documentation/nvme-flush.html index 66fe2fa..61536cf 100644 --- a/Documentation/nvme-flush.html +++ b/Documentation/nvme-flush.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-flush(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -824,7 +824,7 @@ any namespace.</p></div> <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-format.1 b/Documentation/nvme-format.1 index 6155bdf..cd81237 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-FORMAT" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-FORMAT" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-format.html b/Documentation/nvme-format.html index a0ca75a..0c49c80 100644 --- a/Documentation/nvme-format.html +++ b/Documentation/nvme-format.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-format(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -1056,7 +1056,7 @@ information: <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-fw-commit.1 b/Documentation/nvme-fw-commit.1 index 01b0dbd..71a12be 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-FW\-COMMIT" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-FW\-COMMIT" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-fw-commit.html b/Documentation/nvme-fw-commit.html index 6a813f8..49946dd 100644 --- a/Documentation/nvme-fw-commit.html +++ b/Documentation/nvme-fw-commit.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-fw-commit(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -941,7 +941,7 @@ commit the last downloaded fw to slot 1. <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-fw-download.1 b/Documentation/nvme-fw-download.1 index 8fef9d6..4d83d1d 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-FW\-DOWNLOAD" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-FW\-DOWNLOAD" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-fw-download.html b/Documentation/nvme-fw-download.html index a533b7f..6ac26c6 100644 --- a/Documentation/nvme-fw-download.html +++ b/Documentation/nvme-fw-download.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-fw-download(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -888,7 +888,7 @@ Transfer a firmware size 128KiB at a time: <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-fw-log.1 b/Documentation/nvme-fw-log.1 index 6f1bd43..c6626d6 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-FW\-LOG" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-FW\-LOG" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-fw-log.html b/Documentation/nvme-fw-log.html index a06590d..aefeab6 100644 --- a/Documentation/nvme-fw-log.html +++ b/Documentation/nvme-fw-log.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-fw-log(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -846,7 +846,7 @@ Print the log firmware to a file: <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-gen-hostnqn.1 b/Documentation/nvme-gen-hostnqn.1 index 9ef79e6..6d28eee 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-GEN\-HOSTNQN" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-GEN\-HOSTNQN" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-gen-hostnqn.html b/Documentation/nvme-gen-hostnqn.html index 99fde8f..59d4007 100644 --- a/Documentation/nvme-gen-hostnqn.html +++ b/Documentation/nvme-gen-hostnqn.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-gen-hostnqn(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -809,7 +809,7 @@ and prints it to stdout.</p></div> <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-get-feature.1 b/Documentation/nvme-get-feature.1 index 64a3631..3ce41cc 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-GET\-FEATURE" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-GET\-FEATURE" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-get-feature.html b/Documentation/nvme-get-feature.html index 2d2858b..d676d04 100644 --- a/Documentation/nvme-get-feature.html +++ b/Documentation/nvme-get-feature.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-get-feature(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -1027,7 +1027,7 @@ format: <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-get-lba-status.1 b/Documentation/nvme-get-lba-status.1 index 4f6ded9..a785a12 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-GET\-LBA\-STAT" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-GET\-LBA\-STAT" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-get-lba-status.html b/Documentation/nvme-get-lba-status.html index 8c5b02b..f8327b2 100644 --- a/Documentation/nvme-get-lba-status.html +++ b/Documentation/nvme-get-lba-status.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-get-lba-status(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -907,7 +907,7 @@ Get LBA Status of the namespace 1 from SLBA 10 for the max Dwords of 0x1000 <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-get-log.1 b/Documentation/nvme-get-log.1 index 933043e..cf038ab 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-GET\-LOG" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-GET\-LOG" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-get-log.html b/Documentation/nvme-get-log.html index 501bc80..08aeecc 100644 --- a/Documentation/nvme-get-log.html +++ b/Documentation/nvme-get-log.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-get-log(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -997,7 +997,7 @@ Have the program return the raw log page in binary: <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-get-ns-id.1 b/Documentation/nvme-get-ns-id.1 index 4d4e80e..8feae47 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-GET\-NS\-ID" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-GET\-NS\-ID" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-get-ns-id.html b/Documentation/nvme-get-ns-id.html index 648e70c..c0970ff 100644 --- a/Documentation/nvme-get-ns-id.html +++ b/Documentation/nvme-get-ns-id.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-get-ns-id(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -818,7 +818,7 @@ Shows the namespace id for the given block device: <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-get-property.1 b/Documentation/nvme-get-property.1 index 764aaba..5d8a3af 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-GET\-PROPERTY" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-GET\-PROPERTY" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-get-property.html b/Documentation/nvme-get-property.html index a8a6c80..0ae9f84 100644 --- a/Documentation/nvme-get-property.html +++ b/Documentation/nvme-get-property.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-get-property(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -879,7 +879,7 @@ Then look for NVMe Fabrics command (0x7f) at trace <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-get-reg.txt b/Documentation/nvme-get-reg.txt index 5e9cd95..74fe324 100644 --- a/Documentation/nvme-get-reg.txt +++ b/Documentation/nvme-get-reg.txt @@ -22,6 +22,9 @@ DESCRIPTION ----------- Read and show the defined NVMe controller register. +The <device> parameter is mandatory and must be the nvme admin character +device (ex: /dev/nvme0). + OPTIONS ------- -O <offset>:: diff --git a/Documentation/nvme-help.1 b/Documentation/nvme-help.1 index 01dfdf0..5099550 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-HELP" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-HELP" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-help.html b/Documentation/nvme-help.html index f5497af..f9a8bf9 100644 --- a/Documentation/nvme-help.html +++ b/Documentation/nvme-help.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-help(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -794,7 +794,7 @@ Show help for nvme smart log: <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-host-discovery-log.txt b/Documentation/nvme-host-discovery-log.txt new file mode 100644 index 0000000..f99ee4f --- /dev/null +++ b/Documentation/nvme-host-discovery-log.txt @@ -0,0 +1,57 @@ +nvme-host-discovery-log(1) +========================== + +NAME +---- +nvme-host-discovery-log - Retrieve Host Discovery Log, show it + +SYNOPSIS +-------- +[verse] +'nvme host-discovery-log' <device> [--all-host-entries | -a] [--rae | -r] + [--verbose | -v] [--output-format=<fmt> | -o <fmt>] + [--timeout=<timeout>] + +DESCRIPTION +----------- +Retrieve Host Discovery Log, show it + +The <device> parameter is mandatory NVMe MI device supported by the discovery +controller (ex: mctp:<net>,<eid>[:ctrl-id]). + +On success it returns 0, error code otherwise. + +OPTIONS +------- +-a:: +--all-host-entries:: + All Host Entries. + +-r:: +--rae:: + Retain an Asynchronous Event. + +-v:: +--verbose:: + Increase the information detail in the output. + +-o <fmt>:: +--output-format=<fmt>:: + Set the reporting format to 'normal', 'json' or 'binary'. Only one + output format can be used at a time. + +-t <timeout>:: +--timeout=<timeout>:: + Override default timeout value. In milliseconds. + +EXAMPLES +-------- +* Has the program issue a host-discovery-log ++ +------------ +# nvme host-discovery-log mctp:<net>,<eid>[:ctrl-id] +------------ + +NVME +---- +Part of the nvme-user suite. diff --git a/Documentation/nvme-huawei-id-ctrl.1 b/Documentation/nvme-huawei-id-ctrl.1 index 31709d6..4cffaf5 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-HUAWEI\-ID\-CT" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-HUAWEI\-ID\-CT" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-huawei-id-ctrl.html b/Documentation/nvme-huawei-id-ctrl.html index 48f4a73..2203f88 100644 --- a/Documentation/nvme-huawei-id-ctrl.html +++ b/Documentation/nvme-huawei-id-ctrl.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-huawei-id-ctrl(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -855,7 +855,7 @@ fields in a human readable format: <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-huawei-list.1 b/Documentation/nvme-huawei-list.1 index 482dd7e..2f3d4c2 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-LIST" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-LIST" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-huawei-list.html b/Documentation/nvme-huawei-list.html index fdb6f05..8959f53 100644 --- a/Documentation/nvme-huawei-list.html +++ b/Documentation/nvme-huawei-list.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-list(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -797,7 +797,7 @@ for those Huawei devices as well as some pertinent information about them.</p></ <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-id-ctrl.1 b/Documentation/nvme-id-ctrl.1 index de28c6e..0b6e52d 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ID\-CTRL" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-ID\-CTRL" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-id-ctrl.html b/Documentation/nvme-id-ctrl.html index 09e7967..c3c50b5 100644 --- a/Documentation/nvme-id-ctrl.html +++ b/Documentation/nvme-id-ctrl.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-id-ctrl(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -921,7 +921,7 @@ int main(int argc, char **argv) <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-id-domain.1 b/Documentation/nvme-id-domain.1 index cba5c4b..24a6c5e 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ID\-DOMAIN" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-ID\-DOMAIN" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-id-domain.html b/Documentation/nvme-id-domain.html index 76eeaf5..6e127e6 100644 --- a/Documentation/nvme-id-domain.html +++ b/Documentation/nvme-id-domain.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-id-domain(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -823,7 +823,7 @@ device (ex: /dev/nvme0), or a namespace block device (ex: /dev/nvme0n1).</p></di <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-id-iocs.1 b/Documentation/nvme-id-iocs.1 index 951f3cd..c8c3a9a 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ID\-IOCS" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-ID\-IOCS" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-id-iocs.html b/Documentation/nvme-id-iocs.html index bd0410f..f5563e0 100644 --- a/Documentation/nvme-id-iocs.html +++ b/Documentation/nvme-id-iocs.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-id-iocs(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -855,7 +855,7 @@ show the fields in human readable format <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-id-ns.1 b/Documentation/nvme-id-ns.1 index f3233c3..b268551 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ID\-NS" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-ID\-NS" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-id-ns.html b/Documentation/nvme-id-ns.html index 605c675..6b26e9b 100644 --- a/Documentation/nvme-id-ns.html +++ b/Documentation/nvme-id-ns.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-id-ns(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -966,7 +966,7 @@ int main(int argc, char **argv) <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-id-nvmset.1 b/Documentation/nvme-id-nvmset.1 index 0c31cc0..807433e 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ID\-NVMSET" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-ID\-NVMSET" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-id-nvmset.html b/Documentation/nvme-id-nvmset.html index 2b1e118..6e5dff1 100644 --- a/Documentation/nvme-id-nvmset.html +++ b/Documentation/nvme-id-nvmset.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-id-nvmset(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -862,7 +862,7 @@ as shown in the above example, or you can <code>'cat'</code> a saved output buff <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-inspur-nvme-vendor-log.1 b/Documentation/nvme-inspur-nvme-vendor-log.1 index 70d2c71..2319969 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-INSPUR\-NVME\-" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-INSPUR\-NVME\-" "1" "03/17/2025" "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 523c223..033806f 100644 --- a/Documentation/nvme-inspur-nvme-vendor-log.html +++ b/Documentation/nvme-inspur-nvme-vendor-log.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-inspur-nvme-vendor-log(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -796,7 +796,7 @@ Print the Inspur Device Vendor log page in a human readable format: <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-intel-id-ctrl.1 b/Documentation/nvme-intel-id-ctrl.1 index 0db9668..d7ef67d 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-INTEL\-ID\-CTR" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-INTEL\-ID\-CTR" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-intel-id-ctrl.html b/Documentation/nvme-intel-id-ctrl.html index 82a2c7c..3708840 100644 --- a/Documentation/nvme-intel-id-ctrl.html +++ b/Documentation/nvme-intel-id-ctrl.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-intel-id-ctrl(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -853,7 +853,7 @@ fields in a human readable format: <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-intel-internal-log.1 b/Documentation/nvme-intel-internal-log.1 index f43c6d5..850d764 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-INTEL\-INTERNA" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-INTEL\-INTERNA" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-intel-internal-log.html b/Documentation/nvme-intel-internal-log.html index 6328ab8..af219ac 100644 --- a/Documentation/nvme-intel-internal-log.html +++ b/Documentation/nvme-intel-internal-log.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-intel-internal-log(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -873,7 +873,7 @@ Gets the event log from the device and saves to defined file: <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-intel-lat-stats.1 b/Documentation/nvme-intel-lat-stats.1 index f29468c..daf80fa 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-INTEL\-LAT\-ST" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-INTEL\-LAT\-ST" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-intel-lat-stats.html b/Documentation/nvme-intel-lat-stats.html index ce69e0a..f1f0a13 100644 --- a/Documentation/nvme-intel-lat-stats.html +++ b/Documentation/nvme-intel-lat-stats.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-intel-lat-stats(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -832,7 +832,7 @@ Get the write statistics <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-intel-market-name.1 b/Documentation/nvme-intel-market-name.1 index 749565f..df6c86b 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-INTEL\-MARKET\" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-INTEL\-MARKET\" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-intel-market-name.html b/Documentation/nvme-intel-market-name.html index 520f30a..c106278 100644 --- a/Documentation/nvme-intel-market-name.html +++ b/Documentation/nvme-intel-market-name.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-intel-market-name(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -813,7 +813,7 @@ Get the marketing name <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-intel-smart-log-add.1 b/Documentation/nvme-intel-smart-log-add.1 index 4710e9b..8627a5f 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-INTEL\-SMART\-" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-INTEL\-SMART\-" "1" "03/17/2025" "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 0814ab8..9dc601f 100644 --- a/Documentation/nvme-intel-smart-log-add.html +++ b/Documentation/nvme-intel-smart-log-add.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-intel-smart-log-add(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -849,7 +849,7 @@ Print the raw Intel Additional SMART log to a file: <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-intel-temp-stats.1 b/Documentation/nvme-intel-temp-stats.1 index 37f45c1..014bc4e 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-INTEL\-TEMP\-S" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-INTEL\-TEMP\-S" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-intel-temp-stats.html b/Documentation/nvme-intel-temp-stats.html index 8ffaf6d..f979f8b 100644 --- a/Documentation/nvme-intel-temp-stats.html +++ b/Documentation/nvme-intel-temp-stats.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-intel-temp-stats(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -822,7 +822,7 @@ Print the raw SMART log to a file: <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-io-mgmt-recv.1 b/Documentation/nvme-io-mgmt-recv.1 index 8347cdf..82090af 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-IO\-MGMT\-RECV" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-IO\-MGMT\-RECV" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-io-mgmt-recv.html b/Documentation/nvme-io-mgmt-recv.html index 4563f32..dfc6646 100644 --- a/Documentation/nvme-io-mgmt-recv.html +++ b/Documentation/nvme-io-mgmt-recv.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-io-mgmt-recv(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -881,7 +881,7 @@ a hex dump, or binary.</p></div> <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-io-mgmt-send.1 b/Documentation/nvme-io-mgmt-send.1 index c4e2b81..b97dfa0 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-IO\-MGMT\-SEND" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-IO\-MGMT\-SEND" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-io-mgmt-send.html b/Documentation/nvme-io-mgmt-send.html index 139ba13..931407a 100644 --- a/Documentation/nvme-io-mgmt-send.html +++ b/Documentation/nvme-io-mgmt-send.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-io-mgmt-send(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -880,7 +880,7 @@ convenience parameters to produce the binary payload.</p></div> <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-io-passthru.1 b/Documentation/nvme-io-passthru.1 index c179cf3..1e56ac0 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-IO\-PASSTHRU" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-IO\-PASSTHRU" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-io-passthru.html b/Documentation/nvme-io-passthru.html index c0a83f8..404ef00 100644 --- a/Documentation/nvme-io-passthru.html +++ b/Documentation/nvme-io-passthru.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-io-passthru(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -1030,7 +1030,7 @@ printed to stdout for another program to parse.</p></div> <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-lba-status-log.1 b/Documentation/nvme-lba-status-log.1 index af7888b..b2fe155 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-LBA\-STATUS\-L" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-LBA\-STATUS\-L" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-lba-status-log.html b/Documentation/nvme-lba-status-log.html index 0c3c455..87d7b90 100644 --- a/Documentation/nvme-lba-status-log.html +++ b/Documentation/nvme-lba-status-log.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-lba-status-log(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -843,7 +843,7 @@ NVME</code></pre> <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-list-ctrl.1 b/Documentation/nvme-list-ctrl.1 index 98d5094..a1d780a 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-LIST\-CTRL" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-LIST\-CTRL" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-list-ctrl.html b/Documentation/nvme-list-ctrl.html index 4d21a84..da3cd73 100644 --- a/Documentation/nvme-list-ctrl.html +++ b/Documentation/nvme-list-ctrl.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-list-ctrl(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -842,7 +842,7 @@ identifier.</p></div> <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-list-endgrp.1 b/Documentation/nvme-list-endgrp.1 index 69778d8..ee091d5 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-LIST\-ENDGRP" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-LIST\-ENDGRP" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-list-endgrp.html b/Documentation/nvme-list-endgrp.html index fbd1d0a..19a9663 100644 --- a/Documentation/nvme-list-endgrp.html +++ b/Documentation/nvme-list-endgrp.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-list-endgrp(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -826,7 +826,7 @@ than or equal to the value specified in the CDW11.ENDGID field.</p></div> <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-list-ns.1 b/Documentation/nvme-list-ns.1 index 49ef9fc..9fa37e2 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ID\-NS" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-ID\-NS" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-list-ns.html b/Documentation/nvme-list-ns.html index ecb263b..39cdf56 100644 --- a/Documentation/nvme-list-ns.html +++ b/Documentation/nvme-list-ns.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-id-ns(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -883,7 +883,7 @@ Print the namespaces present for NVM Command Set in normal format <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-list-subsys.1 b/Documentation/nvme-list-subsys.1 index eca67df..92236ab 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-LIST\-SUBSYS" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-LIST\-SUBSYS" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-list-subsys.html b/Documentation/nvme-list-subsys.html index ef5929d..523e7f6 100644 --- a/Documentation/nvme-list-subsys.html +++ b/Documentation/nvme-list-subsys.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-list-subsys(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -865,7 +865,7 @@ nvme-subsys1 - NQN=nvmf-test2 <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-list.1 b/Documentation/nvme-list.1 index 15ed041..4e674fd 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-LIST" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-LIST" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-list.html b/Documentation/nvme-list.html index 0520ff4..0a652a6 100644 --- a/Documentation/nvme-list.html +++ b/Documentation/nvme-list.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-list(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -816,7 +816,7 @@ for those devices as well as some pertinent information about them.</p></div> <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-lockdown.1 b/Documentation/nvme-lockdown.1 index f1099a9..799ada4 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-LOCKDOWN" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-LOCKDOWN" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-lockdown.html b/Documentation/nvme-lockdown.html index 1a39f6b..a69452c 100644 --- a/Documentation/nvme-lockdown.html +++ b/Documentation/nvme-lockdown.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-lockdown(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -886,7 +886,7 @@ Identifier.</p></div> <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-mgmt-addr-list-log.txt b/Documentation/nvme-mgmt-addr-list-log.txt new file mode 100644 index 0000000..645e1b7 --- /dev/null +++ b/Documentation/nvme-mgmt-addr-list-log.txt @@ -0,0 +1,47 @@ +nvme-mgmt-addr-list-log(1) +========================== + +NAME +---- +nvme-mgmt-addr-list-log - Retrieve Management Address List Log, show it + +SYNOPSIS +-------- +[verse] +'nvme mgmt-addr-list-log' <device> [--verbose | -v] + [--output-format=<fmt> | -o <fmt>] [--timeout=<timeout>] + +DESCRIPTION +----------- +Retrieve Management Address List Log, show it + +The <device> parameter is mandatory NVMe character device (ex: /dev/nvme0). + +On success it returns 0, error code otherwise. + +OPTIONS +------- +-v:: +--verbose:: + Increase the information detail in the output. + +-o <fmt>:: +--output-format=<fmt>:: + Set the reporting format to 'normal', 'json' or 'binary'. Only one + output format can be used at a time. + +-t <timeout>:: +--timeout=<timeout>:: + Override default timeout value. In milliseconds. + +EXAMPLES +-------- +* Has the program issue a mgmt-addr-list-log ++ +------------ +# nvme mgmt-addr-list-log /dev/nvme0 +------------ + +NVME +---- +Part of the nvme-user suite. diff --git a/Documentation/nvme-mi-cmd-support-effects-log.1 b/Documentation/nvme-mi-cmd-support-effects-log.1 index 421c80a..e29cb7a 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-MI\-CMD\-SUPPO" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-MI\-CMD\-SUPPO" "1" "03/17/2025" "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 7fce134..c084dd5 100644 --- a/Documentation/nvme-mi-cmd-support-effects-log.html +++ b/Documentation/nvme-mi-cmd-support-effects-log.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-mi-cmd-support-effects-log(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -826,7 +826,7 @@ raw buffer may be printed to stdout.</p></div> <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-micron-clear-pcie-errors.1 b/Documentation/nvme-micron-clear-pcie-errors.1 index 08c8056..179ec01 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-MICRON\-CLEAR\" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-MICRON\-CLEAR\" "1" "03/17/2025" "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 aadd5de..d8b689e 100644 --- a/Documentation/nvme-micron-clear-pcie-errors.html +++ b/Documentation/nvme-micron-clear-pcie-errors.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-micron-clear-pcie-errors(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -798,7 +798,7 @@ Retrieve NAND statistics information <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-micron-internal-log.1 b/Documentation/nvme-micron-internal-log.1 index baf0396..1daa593 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-MICRON\-INTERN" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-MICRON\-INTERN" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-micron-internal-log.html b/Documentation/nvme-micron-internal-log.html index 45b1e86..864f476 100644 --- a/Documentation/nvme-micron-internal-log.html +++ b/Documentation/nvme-micron-internal-log.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-micron-internal-log(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -814,7 +814,7 @@ Gets the logs from the device and saves to micron_logs.zip file <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-micron-nand-stats.1 b/Documentation/nvme-micron-nand-stats.1 index ab5033e..6190be6 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-MICRON\-NAND\-" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-MICRON\-NAND\-" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-micron-nand-stats.html b/Documentation/nvme-micron-nand-stats.html index 5c35508..4ec8d40 100644 --- a/Documentation/nvme-micron-nand-stats.html +++ b/Documentation/nvme-micron-nand-stats.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-micron-nand-stats(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -799,7 +799,7 @@ Retrieve NAND statistics information <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-micron-pcie-stats.1 b/Documentation/nvme-micron-pcie-stats.1 index 66efdf5..6ac264e 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-MICRON\-PCIE\-" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-MICRON\-PCIE\-" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-micron-pcie-stats.html b/Documentation/nvme-micron-pcie-stats.html index 558b6e5..fea7aac 100644 --- a/Documentation/nvme-micron-pcie-stats.html +++ b/Documentation/nvme-micron-pcie-stats.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-micron-pcie-stats(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -799,7 +799,7 @@ Retrieve PCIe error information <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-micron-selective-download.1 b/Documentation/nvme-micron-selective-download.1 index 90990f0..42db3c0 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-MICRON\-SELECT" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-MICRON\-SELECT" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-micron-selective-download.html b/Documentation/nvme-micron-selective-download.html index f692368..f523295 100644 --- a/Documentation/nvme-micron-selective-download.html +++ b/Documentation/nvme-micron-selective-download.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-micron-selective-download(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -869,7 +869,7 @@ Update eeprom, OOB and main firmware <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-micron-smart-add-log.1 b/Documentation/nvme-micron-smart-add-log.1 index bf60df6..dbbde40 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-MICRON\-SMART\" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-MICRON\-SMART\" "1" "03/17/2025" "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 fa7a163..e6afa72 100644 --- a/Documentation/nvme-micron-smart-add-log.html +++ b/Documentation/nvme-micron-smart-add-log.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-micron-smart-add-log(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -817,7 +817,7 @@ Retrieve NAND/extended SMART data and display in json format <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-micron-temperature-stats.1 b/Documentation/nvme-micron-temperature-stats.1 index f4f5851..8368448 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-MICRON\-TEMPER" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-MICRON\-TEMPER" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-micron-temperature-stats.html b/Documentation/nvme-micron-temperature-stats.html index b9488ed..30b71ae 100644 --- a/Documentation/nvme-micron-temperature-stats.html +++ b/Documentation/nvme-micron-temperature-stats.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-micron-temperature-stats(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -799,7 +799,7 @@ Retrieve temperature information <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-netapp-ontapdevices.1 b/Documentation/nvme-netapp-ontapdevices.1 index c93669f..46dd4a6 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-NETAPP\-ONTAPD" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-NETAPP\-ONTAPD" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -32,7 +32,7 @@ nvme-netapp-ontapdevices \- Display information about ONTAP devices .SH "SYNOPSIS" .sp .nf -\fInvme netapp ontapdevices\fR [\-\-output\-format=<fmt> | \-o <fmt>] +\fInvme netapp ontapdevices\fR [\-\-output\-format=<fmt> | \-o <fmt>] [\-\-verbose | \-v] .fi .SH "DESCRIPTION" .sp @@ -47,6 +47,11 @@ Set the reporting format to \fIcolumn\fR, or \fIjson\fR\&. Only one output format can be used at a time\&. .RE +.PP +\-v, \-\-verbose +.RS 4 +Display additional information of ONTAP devices on the host\&. +.RE .SH "EXAMPLES" .sp .RS 4 diff --git a/Documentation/nvme-netapp-ontapdevices.html b/Documentation/nvme-netapp-ontapdevices.html index 2b734ea..8739793 100644 --- a/Documentation/nvme-netapp-ontapdevices.html +++ b/Documentation/nvme-netapp-ontapdevices.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-netapp-ontapdevices(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -749,7 +749,7 @@ nvme-netapp-ontapdevices(1) Manual Page <h2 id="_synopsis">SYNOPSIS</h2> <div class="sectionbody"> <div class="verseblock"> -<pre class="content"><em>nvme netapp ontapdevices</em> [--output-format=<fmt> | -o <fmt>]</pre> +<pre class="content"><em>nvme netapp ontapdevices</em> [--output-format=<fmt> | -o <fmt>] [--verbose | -v]</pre> <div class="attribution"> </div></div> </div> @@ -777,6 +777,17 @@ identified using the Identify Controller data.</p></div> <em>json</em>. Only one output format can be used at a time. </p> </dd> +<dt class="hdlist1"> +-v +</dt> +<dt class="hdlist1"> +--verbose +</dt> +<dd> +<p> + Display additional information of ONTAP devices on the host. +</p> +</dd> </dl></div> </div> </div> @@ -807,7 +818,7 @@ Display information, in a column-based format, for ONTAP devices. <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-netapp-ontapdevices.txt b/Documentation/nvme-netapp-ontapdevices.txt index fc28947..e56bae5 100644 --- a/Documentation/nvme-netapp-ontapdevices.txt +++ b/Documentation/nvme-netapp-ontapdevices.txt @@ -8,7 +8,7 @@ nvme-netapp-ontapdevices - Display information about ONTAP devices SYNOPSIS -------- [verse] -'nvme netapp ontapdevices' [--output-format=<fmt> | -o <fmt>] +'nvme netapp ontapdevices' [--output-format=<fmt> | -o <fmt>] [--verbose | -v] DESCRIPTION ----------- @@ -22,6 +22,10 @@ OPTIONS Set the reporting format to 'normal' (default), 'column', or 'json'. Only one output format can be used at a time. +-v:: +--verbose:: + Display additional information of ONTAP devices on the host. + EXAMPLES -------- * Display information, in a column-based format, for ONTAP devices. diff --git a/Documentation/nvme-netapp-smdevices.1 b/Documentation/nvme-netapp-smdevices.1 index 8a13c3e..c88e193 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-NETAPP\-SMDEVI" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-NETAPP\-SMDEVI" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -32,7 +32,7 @@ nvme-netapp-smdevices \- Display information for each NVMe path to an E\-Series .SH "SYNOPSIS" .sp .nf -\fInvme netapp smdevices\fR [\-\-output\-format=<fmt> | \-o <fmt>] +\fInvme netapp smdevices\fR [\-\-output\-format=<fmt> | \-o <fmt>] [\-\-verbose | \-v] .fi .SH "DESCRIPTION" .sp @@ -47,6 +47,11 @@ Set the reporting format to \fIcolumn\fR, or \fIjson\fR\&. Only one output format can be used at a time\&. .RE +.PP +\-v, \-\-verbose +.RS 4 +Display additional information of E\-Series devices on the host\&. +.RE .SH "EXAMPLES" .sp .RS 4 diff --git a/Documentation/nvme-netapp-smdevices.html b/Documentation/nvme-netapp-smdevices.html index 80cf2f7..4771dc2 100644 --- a/Documentation/nvme-netapp-smdevices.html +++ b/Documentation/nvme-netapp-smdevices.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-netapp-smdevices(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -749,7 +749,7 @@ nvme-netapp-smdevices(1) Manual Page <h2 id="_synopsis">SYNOPSIS</h2> <div class="sectionbody"> <div class="verseblock"> -<pre class="content"><em>nvme netapp smdevices</em> [--output-format=<fmt> | -o <fmt>]</pre> +<pre class="content"><em>nvme netapp smdevices</em> [--output-format=<fmt> | -o <fmt>] [--verbose | -v]</pre> <div class="attribution"> </div></div> </div> @@ -778,6 +778,17 @@ NVMe nodes in /dev by sending an Identify Controller.</p></div> <em>json</em>. Only one output format can be used at a time. </p> </dd> +<dt class="hdlist1"> +-v +</dt> +<dt class="hdlist1"> +--verbose +</dt> +<dd> +<p> + Display additional information of E-Series devices on the host. +</p> +</dd> </dl></div> </div> </div> @@ -809,7 +820,7 @@ namespace. <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-netapp-smdevices.txt b/Documentation/nvme-netapp-smdevices.txt index cb68acf..c135ff0 100644 --- a/Documentation/nvme-netapp-smdevices.txt +++ b/Documentation/nvme-netapp-smdevices.txt @@ -8,7 +8,7 @@ nvme-netapp-smdevices - Display information for each NVMe path to an E-Series vo SYNOPSIS -------- [verse] -'nvme netapp smdevices' [--output-format=<fmt> | -o <fmt>] +'nvme netapp smdevices' [--output-format=<fmt> | -o <fmt>] [--verbose | -v] DESCRIPTION ----------- @@ -23,6 +23,10 @@ OPTIONS Set the reporting format to 'normal' (default), 'column', or 'json'. Only one output format can be used at a time. +-v:: +--verbose:: + Display additional information of E-Series devices on the host. + EXAMPLES -------- * Display information, in a column-based format, for each path to an E-Series diff --git a/Documentation/nvme-ns-descs.1 b/Documentation/nvme-ns-descs.1 index b111cd2..fc1b2a2 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-NS\-DESCS" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-NS\-DESCS" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-ns-descs.html b/Documentation/nvme-ns-descs.html index f5ca975..9b8cb68 100644 --- a/Documentation/nvme-ns-descs.html +++ b/Documentation/nvme-ns-descs.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-ns-descs(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -867,7 +867,7 @@ Have the program return the raw structure in binary: <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-ns-rescan.1 b/Documentation/nvme-ns-rescan.1 index 113584e..4bbb80e 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-NS\-RESCAN" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-NS\-RESCAN" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-ns-rescan.html b/Documentation/nvme-ns-rescan.html index 4d5c8f0..e7bf91c 100644 --- a/Documentation/nvme-ns-rescan.html +++ b/Documentation/nvme-ns-rescan.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-ns-rescan(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -818,7 +818,7 @@ Rescans the nvme namespaces. <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-nvm-id-ctrl.1 b/Documentation/nvme-nvm-id-ctrl.1 index cfc43c4..a75a879 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-NVM\-ID\-CTRL" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-NVM\-ID\-CTRL" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-nvm-id-ctrl.html b/Documentation/nvme-nvm-id-ctrl.html index d5f520b..0ab74b2 100644 --- a/Documentation/nvme-nvm-id-ctrl.html +++ b/Documentation/nvme-nvm-id-ctrl.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-nvm-id-ctrl(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -832,7 +832,7 @@ Show the output in json format <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-nvme-mi-recv.1 b/Documentation/nvme-nvme-mi-recv.1 index ddb47f1..7906f29 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-NVME\-MI\-RECV" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-NVME\-MI\-RECV" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-nvme-mi-recv.html b/Documentation/nvme-nvme-mi-recv.html index 7b5dd0b..07717a5 100644 --- a/Documentation/nvme-nvme-mi-recv.html +++ b/Documentation/nvme-nvme-mi-recv.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-nvme-mi-recv(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -905,7 +905,7 @@ Has the program issue a nvme-mi-recv to execute the VPD read. <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-nvme-mi-send.1 b/Documentation/nvme-nvme-mi-send.1 index 3ffe836..d2753f7 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-NVME\-MI\-SEND" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-NVME\-MI\-SEND" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-nvme-mi-send.html b/Documentation/nvme-nvme-mi-send.html index bbf737f..deb3ee4 100644 --- a/Documentation/nvme-nvme-mi-send.html +++ b/Documentation/nvme-nvme-mi-send.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-nvme-mi-send(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -905,7 +905,7 @@ Has the program issue a nvme-mi-send to execute the VPD write. <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-ocp-clear-fw-activate-history.1 b/Documentation/nvme-ocp-clear-fw-activate-history.1 index a51ff5e..498937c 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-OCP\-CLEAR\-FW" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-OCP\-CLEAR\-FW" "1" "03/17/2025" "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 fc262f5..116414d 100644 --- a/Documentation/nvme-ocp-clear-fw-activate-history.html +++ b/Documentation/nvme-ocp-clear-fw-activate-history.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-ocp-clear-fw-activate-history(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -817,7 +817,7 @@ Clears OCP Firmware Activation History Log for the device: <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-ocp-clear-pcie-correctable-error-counters.1 b/Documentation/nvme-ocp-clear-pcie-correctable-error-counters.1 index fea822e..732c7e7 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-OCP\-CLEAR\-PC" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-OCP\-CLEAR\-PC" "1" "03/17/2025" "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 c90cc24..50b1c90 100644 --- a/Documentation/nvme-ocp-clear-pcie-correctable-error-counters.html +++ b/Documentation/nvme-ocp-clear-pcie-correctable-error-counters.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-ocp-clear-pcie-correctable-error-counters(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -817,7 +817,7 @@ Clears PCIe correctable error counters Log for the device: <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-ocp-device-capability-log.1 b/Documentation/nvme-ocp-device-capability-log.1 index 353213f..bd4597a 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-OCP\-DEVICE\-C" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-OCP\-DEVICE\-C" "1" "03/17/2025" "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 98a11b5..1cbb9a7 100644 --- a/Documentation/nvme-ocp-device-capability-log.html +++ b/Documentation/nvme-ocp-device-capability-log.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-ocp-device-capability-log(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -811,7 +811,7 @@ Has the program issue a device-capability-log command to retrieve the 0xC4 log p <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-ocp-eol-plp-failure-mode.1 b/Documentation/nvme-ocp-eol-plp-failure-mode.1 index fa40b2f..fb2d319 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-OCP\-EOL\-PLP\" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-OCP\-EOL\-PLP\" "1" "03/17/2025" "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 4757eb3..ef50768 100644 --- a/Documentation/nvme-ocp-eol-plp-failure-mode.html +++ b/Documentation/nvme-ocp-eol-plp-failure-mode.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-ocp-eol-plp-failure-mode(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -886,7 +886,7 @@ Has the program issue a eol-plp-failure-mode to retrieve the 0xC2 get features. <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-ocp-error-recovery-log.1 b/Documentation/nvme-ocp-error-recovery-log.1 index c055e4f..e94ea7f 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-OCP\-ERROR\-RE" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-OCP\-ERROR\-RE" "1" "03/17/2025" "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 84f1f54..0fa518d 100644 --- a/Documentation/nvme-ocp-error-recovery-log.html +++ b/Documentation/nvme-ocp-error-recovery-log.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-ocp-error-recovery-log(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -811,7 +811,7 @@ Has the program issue a error-recovery-log command to retrieve the 0xC1 log page <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-ocp-get-dssd-async-event-config.1 b/Documentation/nvme-ocp-get-dssd-async-event-config.1 index 46668a1..0936d5c 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-OCP\-GET\-DSSD" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-OCP\-GET\-DSSD" "1" "03/17/2025" "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 9386e3d..e684bb7 100644 --- a/Documentation/nvme-ocp-get-dssd-async-event-config.html +++ b/Documentation/nvme-ocp-get-dssd-async-event-config.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-ocp-get-dssd-async-event-config(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -846,7 +846,7 @@ Has the program issue a get-dssd-async-event-config to retrieve the saved 0xC9 g <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-ocp-get-dssd-power-state-feature.1 b/Documentation/nvme-ocp-get-dssd-power-state-feature.1 index 45c2b92..3e2219d 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "GET\-DSSD\-POWER\-ST" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "GET\-DSSD\-POWER\-ST" "1" "03/17/2025" "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 4569ce2..391d518 100644 --- a/Documentation/nvme-ocp-get-dssd-power-state-feature.html +++ b/Documentation/nvme-ocp-get-dssd-power-state-feature.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>get-dssd-power-state-feature(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -883,7 +883,7 @@ Has the program issue a get-dssd-power-state-feature command to get all three DS <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-ocp-get-plp-health-check-interval.1 b/Documentation/nvme-ocp-get-plp-health-check-interval.1 index 3a050c3..a032827 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-OCP\-GET\-PLP\" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-OCP\-GET\-PLP\" "1" "03/17/2025" "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 7f04901..4f2630d 100644 --- a/Documentation/nvme-ocp-get-plp-health-check-interval.html +++ b/Documentation/nvme-ocp-get-plp-health-check-interval.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-ocp-get-plp-health-check-interval(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -847,7 +847,7 @@ Has the program issue a get-plp-health-check-interval to retrieve the 0xC6 get f <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-ocp-hardware-component-log.txt b/Documentation/nvme-ocp-hardware-component-log.txt index 6700e76..02ddd78 100644 --- a/Documentation/nvme-ocp-hardware-component-log.txt +++ b/Documentation/nvme-ocp-hardware-component-log.txt @@ -68,13 +68,13 @@ OPTIONS EXAMPLES -------- -* Has the program issue a set-error-injection +* Has the program issue a ocp hardware-component-log + ------------ # nvme ocp hardware-component-log /dev/nvme0 ------------ -* Has the program issue a set-error-injection with the asic component list. +* Has the program issue a ocp hardware-component-log with asic component list + ------------ # nvme ocp hardware-component-log /dev/nvme0 -i asic -l diff --git a/Documentation/nvme-ocp-internal-log.1 b/Documentation/nvme-ocp-internal-log.1 index e0bd8d9..a975d1d 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-OCP\-INTERNAL\" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-OCP\-INTERNAL\" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -81,7 +81,12 @@ Retrieves the specific data area requested\&. Valid inputs are 1,2\&. If this op .PP \-t <type>, \-\-telemetry\-type=<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\&. +Set the telemetry type to +\fIhost\fR, +\fIhost0\fR, +\fIhost1\fR +or +\fIcontroller\fR\&. If set to host1, 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 set to host0, controller shall not update this data\&. .RE .SH "EXAMPLES" .sp diff --git a/Documentation/nvme-ocp-internal-log.html b/Documentation/nvme-ocp-internal-log.html index 08a0ff0..089b5e2 100644 --- a/Documentation/nvme-ocp-internal-log.html +++ b/Documentation/nvme-ocp-internal-log.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-ocp-internal-log(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -847,9 +847,10 @@ Results for any other device are undefined.</p></div> </dt> <dd> <p> - If set to 1, controller shall capture the Telemetry Host-Initiated data + Set the telemetry type to <em>host</em>, <em>host0</em>, <em>host1</em> or <em>controller</em>. + If set to host1, 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 + Get Log Page command is processed. If set to host0, controller shall not update this data. </p> </dd> @@ -918,7 +919,7 @@ Decode data-areas 1 and 2, and output in normal text format. <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-ocp-internal-log.txt b/Documentation/nvme-ocp-internal-log.txt index 7393349..26d78ac 100644 --- a/Documentation/nvme-ocp-internal-log.txt +++ b/Documentation/nvme-ocp-internal-log.txt @@ -64,9 +64,10 @@ OPTIONS -t <type>:: --telemetry-type=<type>:: - If set to 1, controller shall capture the Telemetry Host-Initiated data + Set the telemetry type to 'host', 'host0', 'host1' or 'controller'. + If set to host1, 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 + Get Log Page command is processed. If set to host0, controller shall not update this data. EXAMPLES diff --git a/Documentation/nvme-ocp-latency-monitor-log.1 b/Documentation/nvme-ocp-latency-monitor-log.1 index 7da8390..f6b0d75 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-OCP\-LATENCY\-" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-OCP\-LATENCY\-" "1" "03/17/2025" "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 03c2436..2fb1f02 100644 --- a/Documentation/nvme-ocp-latency-monitor-log.html +++ b/Documentation/nvme-ocp-latency-monitor-log.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-ocp-latency-monitor-log(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -811,7 +811,7 @@ Displays the get latency monitor log for the device: <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-ocp-set-dssd-async-event-config.1 b/Documentation/nvme-ocp-set-dssd-async-event-config.1 index 72bfc01..27e9886 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-OCP\-SET\-DSSD" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-OCP\-SET\-DSSD" "1" "03/17/2025" "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 7a2418b..dcbc909 100644 --- a/Documentation/nvme-ocp-set-dssd-async-event-config.html +++ b/Documentation/nvme-ocp-set-dssd-async-event-config.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-ocp-set-dssd-async-event-config(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -822,7 +822,7 @@ persisting through power states. <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-ocp-set-dssd-power-state-feature.1 b/Documentation/nvme-ocp-set-dssd-power-state-feature.1 index a297fe0..6a25636 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "SET\-DSSD\-POWER\-ST" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "SET\-DSSD\-POWER\-ST" "1" "03/17/2025" "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 28c1918..084ec6e 100644 --- a/Documentation/nvme-ocp-set-dssd-power-state-feature.html +++ b/Documentation/nvme-ocp-set-dssd-power-state-feature.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>set-dssd-power-state-feature(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -812,7 +812,7 @@ Has the program issue a set-dssd-power-state-feature command to set DSSD Power S <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-ocp-set-plp-health-check-interval.1 b/Documentation/nvme-ocp-set-plp-health-check-interval.1 index ed41415..270c908 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-OCP\-SET\-PLP\" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-OCP\-SET\-PLP\" "1" "03/17/2025" "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 39ff461..940fd58 100644 --- a/Documentation/nvme-ocp-set-plp-health-check-interval.html +++ b/Documentation/nvme-ocp-set-plp-health-check-interval.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-ocp-set-plp-health-check-interval(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -834,7 +834,7 @@ Has the program issue a set-plp-health-check-interval to retrieve the 0xC6 set f <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-ocp-set-telemetry-profile.1 b/Documentation/nvme-ocp-set-telemetry-profile.1 index db59df4..8f8d614 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-OCP\-SET\-TELE" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-OCP\-SET\-TELE" "1" "03/17/2025" "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 3d57fec..1b9fdde 100644 --- a/Documentation/nvme-ocp-set-telemetry-profile.html +++ b/Documentation/nvme-ocp-set-telemetry-profile.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-ocp-set-telemetry-profile(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -812,7 +812,7 @@ Has the program issue a set-telemetry-profile command to use profile five. <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-ocp-smart-add-log.1 b/Documentation/nvme-ocp-smart-add-log.1 index 296ff1e..2f300a4 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-OCP\-SMART\-AD" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-OCP\-SMART\-AD" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -32,7 +32,7 @@ nvme-ocp-smart-add-log \- Retrieves Extended SMART information of given OCP comp .SH "SYNOPSIS" .sp .nf -\fInvme ocp smart\-add\-log\fR <device> [\-\-output\-format=<fmt> | \-o <fmt>] +\fInvme ocp smart\-add\-log\fR <device> [\-\-output\-format=<fmt> | \-o <fmt>] [\-\-output\-format\-version=<version>] .fi .SH "DESCRIPTION" .sp @@ -42,6 +42,8 @@ The <device> parameter is mandatory and may be either the NVMe character device .sp This will only work on OCP compliant devices supporting this feature\&. Results for any other device are undefined\&. .sp +EXPERIMENTAL\&. The \-\-output\-format\-version can be set to 2 to generate field names for the outputs that are easier to process via scripts\&. Note this is experimental and the field names are subject to change\&. +.sp On success it returns 0, error code otherwise\&. .SH "OPTIONS" .PP @@ -52,6 +54,14 @@ Set the reporting format to or \fIjson\fR\&. Only one output format can be used at a time\&. The default is normal\&. .RE +.PP +\-\-output\-format\-version=<version> +.RS 4 +Set the field labels in the reporting format to either +\fI1\fR +(the original) or +\fI2\fR\&. The default is 1\&. Note this is experimental\&. +.RE .SH "EXAMPLES" .sp .RS 4 diff --git a/Documentation/nvme-ocp-smart-add-log.html b/Documentation/nvme-ocp-smart-add-log.html index 05d6663..367f842 100644 --- a/Documentation/nvme-ocp-smart-add-log.html +++ b/Documentation/nvme-ocp-smart-add-log.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-ocp-smart-add-log(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -749,7 +749,7 @@ nvme-ocp-smart-add-log(1) Manual Page <h2 id="_synopsis">SYNOPSIS</h2> <div class="sectionbody"> <div class="verseblock"> -<pre class="content"><em>nvme ocp smart-add-log</em> <device> [--output-format=<fmt> | -o <fmt>]</pre> +<pre class="content"><em>nvme ocp smart-add-log</em> <device> [--output-format=<fmt> | -o <fmt>] [--output-format-version=<version>]</pre> <div class="attribution"> </div></div> </div> @@ -763,6 +763,9 @@ provide the additional smart log.</p></div> device (ex: /dev/nvme0) or block device (ex: /dev/nvme0n1).</p></div> <div class="paragraph"><p>This will only work on OCP compliant devices supporting this feature. Results for any other device are undefined.</p></div> +<div class="paragraph"><p>EXPERIMENTAL. The --output-format-version can be set to 2 to generate field names +for the outputs that are easier to process via scripts. Note this is +experimental and the field names are subject to change.</p></div> <div class="paragraph"><p>On success it returns 0, error code otherwise.</p></div> </div> </div> @@ -782,6 +785,15 @@ Results for any other device are undefined.</p></div> can be used at a time. The default is normal. </p> </dd> +<dt class="hdlist1"> +--output-format-version=<version> +</dt> +<dd> +<p> + Set the field labels in the reporting format to either <em>1</em> + (the original) or <em>2</em>. The default is 1. Note this is experimental. +</p> +</dd> </dl></div> </div> </div> @@ -812,7 +824,7 @@ Has the program issue a smart-add-log command to retrieve the 0xC0 log page. <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-ocp-smart-add-log.txt b/Documentation/nvme-ocp-smart-add-log.txt index 66a55a9..97192d6 100644 --- a/Documentation/nvme-ocp-smart-add-log.txt +++ b/Documentation/nvme-ocp-smart-add-log.txt @@ -9,7 +9,7 @@ compliant device SYNOPSIS -------- [verse] -'nvme ocp smart-add-log' <device> [--output-format=<fmt> | -o <fmt>] +'nvme ocp smart-add-log' <device> [--output-format=<fmt> | -o <fmt>] [--output-format-version=<version>] DESCRIPTION ----------- @@ -22,6 +22,10 @@ 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. +EXPERIMENTAL. The --output-format-version can be set to 2 to generate field names +for the outputs that are easier to process via scripts. Note this is +experimental and the field names are subject to change. + On success it returns 0, error code otherwise. OPTIONS @@ -31,6 +35,10 @@ OPTIONS Set the reporting format to 'normal' or 'json'. Only one output format can be used at a time. The default is normal. +--output-format-version=<version>:: + Set the field labels in the reporting format to either '1' + (the original) or '2'. The default is 1. Note this is experimental. + EXAMPLES -------- * Has the program issue a smart-add-log command to retrieve the 0xC0 log page. diff --git a/Documentation/nvme-ocp-telemetry-string-log-page.1 b/Documentation/nvme-ocp-telemetry-string-log-page.1 index 758534e..534a22e 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-OCP\-TELEMETRY" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-OCP\-TELEMETRY" "1" "03/17/2025" "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 5aa0615..9c5b172 100644 --- a/Documentation/nvme-ocp-telemetry-string-log-page.html +++ b/Documentation/nvme-ocp-telemetry-string-log-page.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-ocp-telemetry-string-log-page(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -811,7 +811,7 @@ Has the program issue a telemetry-string-log command to get the log page data fr <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-ocp-unsupported-reqs-log.1 b/Documentation/nvme-ocp-unsupported-reqs-log.1 index 01923a1..a0bfb13 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-OCP\-UNSUPPORT" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-OCP\-UNSUPPORT" "1" "03/17/2025" "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 index b65c733..fb4a8aa 100644 --- a/Documentation/nvme-ocp-unsupported-reqs-log.html +++ b/Documentation/nvme-ocp-unsupported-reqs-log.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-ocp-unsupported-reqs-log(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -812,7 +812,7 @@ Has the program issue a unsupported-reqs-log command to retrieve the 0xC5 log pa <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-persistent-event-log.1 b/Documentation/nvme-persistent-event-log.1 index e9c0298..aecb2cd 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "PERSISTENT\-EVENT\-L" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "PERSISTENT\-EVENT\-L" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-persistent-event-log.html b/Documentation/nvme-persistent-event-log.html index a54207c..bc1c570 100644 --- a/Documentation/nvme-persistent-event-log.html +++ b/Documentation/nvme-persistent-event-log.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>persistent-event-log(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -877,7 +877,7 @@ Print the raw persistent event log to a file: <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-pred-lat-event-agg-log.1 b/Documentation/nvme-pred-lat-event-agg-log.1 index 91fd111..a0b39f9 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-PRED\-LAT\-EVE" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-PRED\-LAT\-EVE" "1" "03/17/2025" "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 ececd53..ef2a1f3 100644 --- a/Documentation/nvme-pred-lat-event-agg-log.html +++ b/Documentation/nvme-pred-lat-event-agg-log.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-pred-lat-event-agg-log(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -864,7 +864,7 @@ Print the raw Predictable Latency Event Aggregate log to a file: <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-predictable-lat-log.1 b/Documentation/nvme-predictable-lat-log.1 index 2222c53..b68e6af 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-PREDICTABLE\-L" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-PREDICTABLE\-L" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-predictable-lat-log.html b/Documentation/nvme-predictable-lat-log.html index 6ddfbc4..7cbfbb3 100644 --- a/Documentation/nvme-predictable-lat-log.html +++ b/Documentation/nvme-predictable-lat-log.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-predictable-lat-log(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -861,7 +861,7 @@ Print the raw Predictable latency per NVM set log to a file: <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-primary-ctrl-caps.1 b/Documentation/nvme-primary-ctrl-caps.1 index 0019ce4..59e6e81 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-PRIMARY\-CTRL\" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-PRIMARY\-CTRL\" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-primary-ctrl-caps.html b/Documentation/nvme-primary-ctrl-caps.html index e4de979..5f2b93b 100644 --- a/Documentation/nvme-primary-ctrl-caps.html +++ b/Documentation/nvme-primary-ctrl-caps.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-primary-ctrl-caps(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -846,7 +846,7 @@ fields in a human readable format: <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-pull-model-ddr-req-log.txt b/Documentation/nvme-pull-model-ddr-req-log.txt new file mode 100644 index 0000000..dce5e56 --- /dev/null +++ b/Documentation/nvme-pull-model-ddr-req-log.txt @@ -0,0 +1,51 @@ +nvme-pull-model-ddr-req-log(1) +============================== + +NAME +---- +nvme-pull-model-ddr-req-log - Retrieve Pull Model DDC Request Log, show it + +SYNOPSIS +-------- +[verse] +'nvme pull-model-ddr-req-log' <device> [--rae | -r] [--verbose | -v] + [--output-format=<fmt> | -o <fmt>] [--timeout=<timeout>] + +DESCRIPTION +----------- +Retrieve Pull Model DDC Request Log, show it + +The <device> parameter is mandatory NVMe character device (ex: /dev/nvme0). + +On success it returns 0, error code otherwise. + +OPTIONS +------- +-r:: +--rae:: + Retain an Asynchronous Event. + +-v:: +--verbose:: + Increase the information detail in the output. + +-o <fmt>:: +--output-format=<fmt>:: + Set the reporting format to 'normal', 'json' or 'binary'. Only one + output format can be used at a time. + +-t <timeout>:: +--timeout=<timeout>:: + Override default timeout value. In milliseconds. + +EXAMPLES +-------- +* Has the program issue a pull-model-ddr-req-log ++ +------------ +# nvme pull-model-ddr-req-log /dev/nvme0 +------------ + +NVME +---- +Part of the nvme-user suite. diff --git a/Documentation/nvme-reachability-associations-log.txt b/Documentation/nvme-reachability-associations-log.txt new file mode 100644 index 0000000..6adf57b --- /dev/null +++ b/Documentation/nvme-reachability-associations-log.txt @@ -0,0 +1,56 @@ +nvme-reachability-associations-log(1) +===================================== + +NAME +---- +nvme-reachability-associations-log - Retrieve Reachability Associations Log, show it + +SYNOPSIS +-------- +[verse] +'nvme reachability-associations-log' <device> [--associations-only | -a] [--rae | -r] + [--verbose | -v] [--output-format=<fmt> | -o <fmt>] + [--timeout=<timeout>] + +DESCRIPTION +----------- +Retrieve Reachability Associations Log, show it + +The <device> parameter is mandatory NVMe character device (ex: /dev/nvme0). + +On success it returns 0, error code otherwise. + +OPTIONS +------- +-a:: +--associations-only:: + Return associations Only. + +-r:: +--rae:: + Retain an Asynchronous Event. + +-v:: +--verbose:: + Increase the information detail in the output. + +-o <fmt>:: +--output-format=<fmt>:: + Set the reporting format to 'normal', 'json' or 'binary'. Only one + output format can be used at a time. + +-t <timeout>:: +--timeout=<timeout>:: + Override default timeout value. In milliseconds. + +EXAMPLES +-------- +* Has the program issue a reachability-associations-log ++ +------------ +# nvme reachability-associations-log /dev/nvme0 +------------ + +NVME +---- +Part of the nvme-user suite. diff --git a/Documentation/nvme-reachability-groups-log.txt b/Documentation/nvme-reachability-groups-log.txt new file mode 100644 index 0000000..6d5379e --- /dev/null +++ b/Documentation/nvme-reachability-groups-log.txt @@ -0,0 +1,56 @@ +nvme-reachability-groups-log(1) +=============================== + +NAME +---- +nvme-reachability-groups-log - Retrieve Reachability Groups Log, show it + +SYNOPSIS +-------- +[verse] +'nvme reachability-groups-log' <device> [--groups-only | -g] [--rae | -r] + [--verbose | -v] [--output-format=<fmt> | -o <fmt>] + [--timeout=<timeout>] + +DESCRIPTION +----------- +Retrieve Reachability Groups Log, show it + +The <device> parameter is mandatory NVMe character device (ex: /dev/nvme0). + +On success it returns 0, error code otherwise. + +OPTIONS +------- +-g:: +--groups-only:: + Return Groups Only. + +-r:: +--rae:: + Retain an Asynchronous Event. + +-v:: +--verbose:: + Increase the information detail in the output. + +-o <fmt>:: +--output-format=<fmt>:: + Set the reporting format to 'normal', 'json' or 'binary'. Only one + output format can be used at a time. + +-t <timeout>:: +--timeout=<timeout>:: + Override default timeout value. In milliseconds. + +EXAMPLES +-------- +* Has the program issue a reachability-groups-log ++ +------------ +# nvme reachability-groups-log /dev/nvme0 +------------ + +NVME +---- +Part of the nvme-user suite. diff --git a/Documentation/nvme-read.1 b/Documentation/nvme-read.1 index 5c18811..685d591 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-READ" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-READ" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-read.html b/Documentation/nvme-read.html index e1cf111..292e81a 100644 --- a/Documentation/nvme-read.html +++ b/Documentation/nvme-read.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-read(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -1096,7 +1096,7 @@ metadata is passes.</p></td> <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-reset.1 b/Documentation/nvme-reset.1 index fbb272e..cbddc37 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-RESET" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-RESET" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-reset.html b/Documentation/nvme-reset.html index adda80f..0dcdf1b 100644 --- a/Documentation/nvme-reset.html +++ b/Documentation/nvme-reset.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-reset(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -818,7 +818,7 @@ Resets the controller. <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-resv-acquire.1 b/Documentation/nvme-resv-acquire.1 index 61b8d2f..cc5c9ab 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-RESV\-ACQUIRE" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-RESV\-ACQUIRE" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-resv-acquire.html b/Documentation/nvme-resv-acquire.html index f7eb726..56114a7 100644 --- a/Documentation/nvme-resv-acquire.html +++ b/Documentation/nvme-resv-acquire.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-resv-acquire(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -980,7 +980,7 @@ cellspacing="0" cellpadding="4"> <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-resv-notif-log.1 b/Documentation/nvme-resv-notif-log.1 index 8d9639a..5162a81 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-RESV\-NOTIF\-L" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-RESV\-NOTIF\-L" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-resv-notif-log.html b/Documentation/nvme-resv-notif-log.html index ecb207f..33197a1 100644 --- a/Documentation/nvme-resv-notif-log.html +++ b/Documentation/nvme-resv-notif-log.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-resv-notif-log(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -833,7 +833,7 @@ Print the output in json format: <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-resv-register.1 b/Documentation/nvme-resv-register.1 index 0725746..ca1572e 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-RESV\-REGISTER" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-RESV\-REGISTER" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-resv-register.html b/Documentation/nvme-resv-register.html index 7774ec4..39ff79e 100644 --- a/Documentation/nvme-resv-register.html +++ b/Documentation/nvme-resv-register.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-resv-register(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -972,7 +972,7 @@ cellspacing="0" cellpadding="4"> <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-resv-release.1 b/Documentation/nvme-resv-release.1 index d8a0b71..a638af6 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-RESV\-RELEASE" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-RESV\-RELEASE" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-resv-release.html b/Documentation/nvme-resv-release.html index b2cf746..dae8c1a 100644 --- a/Documentation/nvme-resv-release.html +++ b/Documentation/nvme-resv-release.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-resv-release(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -962,7 +962,7 @@ cellspacing="0" cellpadding="4"> <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-resv-report.1 b/Documentation/nvme-resv-report.1 index a29046d..71a9f1a 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-RESV\-REPORT" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-RESV\-REPORT" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-resv-report.html b/Documentation/nvme-resv-report.html index 378ed6d..82b2a21 100644 --- a/Documentation/nvme-resv-report.html +++ b/Documentation/nvme-resv-report.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-resv-report(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -877,7 +877,7 @@ Controller data structure for each such controller).</p></div> <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-rotational-media-info-log.txt b/Documentation/nvme-rotational-media-info-log.txt new file mode 100644 index 0000000..981cf4f --- /dev/null +++ b/Documentation/nvme-rotational-media-info-log.txt @@ -0,0 +1,52 @@ +nvme-rotational-media-info-log(1) +================================= + +NAME +---- +nvme-rotational-media-info-log - Retrieve Rotational Media Information Log, show it + +SYNOPSIS +-------- +[verse] +'nvme rotational-media-info-log' <device> [--endg-id=<endgid> | -e <endgid>] + [--verbose | -v] [--output-format=<fmt> | -o <fmt>] + [--timeout=<timeout>] + +DESCRIPTION +----------- +Retrieve Rotational Media Information Log, show it + +The <device> parameter is mandatory NVMe character device (ex: /dev/nvme0). + +On success it returns 0, error code otherwise. + +OPTIONS +------- +-e <endgid>:: +--endg-id=<endgid>:: + This field specifies the identifier of the endurance group. + +-v:: +--verbose:: + Increase the information detail in the output. + +-o <fmt>:: +--output-format=<fmt>:: + Set the reporting format to 'normal', 'json' or 'binary'. Only one + output format can be used at a time. + +-t <timeout>:: +--timeout=<timeout>:: + Override default timeout value. In milliseconds. + +EXAMPLES +-------- +* Has the program issue a rotational-media-info-log ++ +------------ +# nvme rotational-media-info-log /dev/nvme0 --endg-id=1 +------------ + +NVME +---- +Part of the nvme-user suite. diff --git a/Documentation/nvme-rpmb.1 b/Documentation/nvme-rpmb.1 index 63b32e3..673b34c 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-RPMB" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-RPMB" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-rpmb.html b/Documentation/nvme-rpmb.html index 8101aa2..498db0f 100644 --- a/Documentation/nvme-rpmb.html +++ b/Documentation/nvme-rpmb.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-rpmb(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -1024,7 +1024,7 @@ data onto output.bin <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-sanitize-log.1 b/Documentation/nvme-sanitize-log.1 index 955b2f2..0d77457 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SANITIZE\-LOG" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SANITIZE\-LOG" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-sanitize-log.html b/Documentation/nvme-sanitize-log.html index 8caa336..cb1f6c0 100644 --- a/Documentation/nvme-sanitize-log.html +++ b/Documentation/nvme-sanitize-log.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-sanitize-log(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -903,7 +903,7 @@ Has the program issue Sanitize-log Command : <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-sanitize.1 b/Documentation/nvme-sanitize.1 index 2070cb4..d8e7481 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SANITIZE" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SANITIZE" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-sanitize.html b/Documentation/nvme-sanitize.html index 64f7e23..9627d7e 100644 --- a/Documentation/nvme-sanitize.html +++ b/Documentation/nvme-sanitize.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-sanitize(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -980,7 +980,7 @@ Has the program issue Sanitize Command : <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-seagate-clear-fw-activate-history.1 b/Documentation/nvme-seagate-clear-fw-activate-history.1 index a48a7d8..65543b0 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SEAGATE\-CLEAR" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SEAGATE\-CLEAR" "1" "03/17/2025" "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 101b8d3..f3d8041 100644 --- a/Documentation/nvme-seagate-clear-fw-activate-history.html +++ b/Documentation/nvme-seagate-clear-fw-activate-history.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-seagate-clear-fw-activate-history (1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -792,7 +792,7 @@ nvme block device (ex: /dev/nvme0n1).</p></div> <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-seagate-clear-pcie-correctable-errors.1 b/Documentation/nvme-seagate-clear-pcie-correctable-errors.1 index afd18b9..d2be966 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SEAGATE\-CLEAR" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SEAGATE\-CLEAR" "1" "03/17/2025" "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 fe60a6e..64c98a8 100644 --- a/Documentation/nvme-seagate-clear-pcie-correctable-errors.html +++ b/Documentation/nvme-seagate-clear-pcie-correctable-errors.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-seagate-clear-pcie-correctable-errors(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -802,7 +802,7 @@ nvme block device (ex: /dev/nvme0n1).</p></div> <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-seagate-cloud-SSD-plugin-version.1 b/Documentation/nvme-seagate-cloud-SSD-plugin-version.1 index 63dcf18..62623bd 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SEAGATE\-CLOUD" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SEAGATE\-CLOUD" "1" "03/17/2025" "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 78a6dd4..1445731 100644 --- a/Documentation/nvme-seagate-cloud-SSD-plugin-version.html +++ b/Documentation/nvme-seagate-cloud-SSD-plugin-version.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-seagate-cloud-SSD-plugin-version (1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -787,7 +787,7 @@ nvme-seagate-cloud-SSD-plugin-version (1) Manual Page <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-seagate-get-ctrl-tele.1 b/Documentation/nvme-seagate-get-ctrl-tele.1 index 087946a..6f64314 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SEAGATE\-GET\-" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SEAGATE\-GET\-" "1" "03/17/2025" "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 6881eb0..41d7844 100644 --- a/Documentation/nvme-seagate-get-ctrl-tele.html +++ b/Documentation/nvme-seagate-get-ctrl-tele.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-seagate-get-ctrl-tele(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -813,7 +813,7 @@ nvme block device (ex: /dev/nvme0n1).</p></div> <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-seagate-get-host-tele.1 b/Documentation/nvme-seagate-get-host-tele.1 index f06dd1e..2014d92 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SEAGATE\-GET\-" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SEAGATE\-GET\-" "1" "03/17/2025" "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 fd4a677..a334a87 100644 --- a/Documentation/nvme-seagate-get-host-tele.html +++ b/Documentation/nvme-seagate-get-host-tele.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-seagate-get-host-tele(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -826,7 +826,7 @@ commands work across all product families.</p></div> <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-seagate-help.1 b/Documentation/nvme-seagate-help.1 index 010a03d..cc6d89a 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SEAGATE\-HELP" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SEAGATE\-HELP" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-seagate-help.html b/Documentation/nvme-seagate-help.html index 9e8072e..d466791 100644 --- a/Documentation/nvme-seagate-help.html +++ b/Documentation/nvme-seagate-help.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-seagate-help(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -812,7 +812,7 @@ help Display this help</code></pre> <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-seagate-plugin-version.1 b/Documentation/nvme-seagate-plugin-version.1 index b6389f6..02fbec5 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SEAGATE\-PLUGI" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SEAGATE\-PLUGI" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-seagate-plugin-version.html b/Documentation/nvme-seagate-plugin-version.html index d312489..645b48c 100644 --- a/Documentation/nvme-seagate-plugin-version.html +++ b/Documentation/nvme-seagate-plugin-version.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-seagate-plugin-version(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -787,7 +787,7 @@ nvme-seagate-plugin-version(1) Manual Page <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-seagate-version.1 b/Documentation/nvme-seagate-version.1 index ce9cc90..d30477c 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SEAGATE\-VERSI" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SEAGATE\-VERSI" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-seagate-version.html b/Documentation/nvme-seagate-version.html index 8784599..e8c65e6 100644 --- a/Documentation/nvme-seagate-version.html +++ b/Documentation/nvme-seagate-version.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-seagate-version(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -787,7 +787,7 @@ nvme-seagate-version(1) Manual Page <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-seagate-vs-fw-activate-history.1 b/Documentation/nvme-seagate-vs-fw-activate-history.1 index 17b79be..1a77f8f 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SEAGATE\-VS\-F" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SEAGATE\-VS\-F" "1" "03/17/2025" "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 943a8a4..f619ac5 100644 --- a/Documentation/nvme-seagate-vs-fw-activate-history.html +++ b/Documentation/nvme-seagate-vs-fw-activate-history.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-seagate-vs-fw-activate-history (1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -813,7 +813,7 @@ nvme block device (ex: /dev/nvme0n1).</p></div> <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-seagate-vs-internal-log.1 b/Documentation/nvme-seagate-vs-internal-log.1 index d65fb80..461e881 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SEAGATE\-VS\-I" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SEAGATE\-VS\-I" "1" "03/17/2025" "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 d21652b..36336ef 100644 --- a/Documentation/nvme-seagate-vs-internal-log.html +++ b/Documentation/nvme-seagate-vs-internal-log.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-seagate-vs-internal-log(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -814,7 +814,7 @@ specified device.</p></div> <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-seagate-vs-log-page-sup.1 b/Documentation/nvme-seagate-vs-log-page-sup.1 index f3a9137..4408d82 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SEAGATE\-VS\-L" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SEAGATE\-VS\-L" "1" "03/17/2025" "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 511c06c..ec8a81d 100644 --- a/Documentation/nvme-seagate-vs-log-page-sup.html +++ b/Documentation/nvme-seagate-vs-log-page-sup.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-seagate-vs-log-page-sup(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -814,7 +814,7 @@ LogPage-Id LogPage-Name <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-seagate-vs-pcie-stats.1 b/Documentation/nvme-seagate-vs-pcie-stats.1 index e189aa6..8b62dd9 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SEAGATE\-VS\-P" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SEAGATE\-VS\-P" "1" "03/17/2025" "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 72a744e..42bb06e 100644 --- a/Documentation/nvme-seagate-vs-pcie-stats.html +++ b/Documentation/nvme-seagate-vs-pcie-stats.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-seagate-vs-pcie-stats(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -802,7 +802,7 @@ nvme block device (ex: /dev/nvme0n1).</p></div> <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-seagate-vs-smart-add-log.1 b/Documentation/nvme-seagate-vs-smart-add-log.1 index 4347f7f..c9d12ea 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SEAGATE\-VS\-S" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SEAGATE\-VS\-S" "1" "03/17/2025" "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 bf3fea6..b899ac6 100644 --- a/Documentation/nvme-seagate-vs-smart-add-log.html +++ b/Documentation/nvme-seagate-vs-smart-add-log.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-seagate-vs-smart-add-log(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -830,7 +830,7 @@ all commands work across all product families.</p></div> <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-seagate-vs-temperature-stats.1 b/Documentation/nvme-seagate-vs-temperature-stats.1 index 16822b7..a018045 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SEAGATE\-VS\-T" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SEAGATE\-VS\-T" "1" "03/17/2025" "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 a40a93c..cdfec03 100644 --- a/Documentation/nvme-seagate-vs-temperature-stats.html +++ b/Documentation/nvme-seagate-vs-temperature-stats.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-seagate-vs-temperature-stats(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -802,7 +802,7 @@ nvme block device (ex: /dev/nvme0n1).</p></div> <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-security-recv.1 b/Documentation/nvme-security-recv.1 index cb3d5fa..d09ae0f 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SECURITY\-RECV" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SECURITY\-RECV" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-security-recv.html b/Documentation/nvme-security-recv.html index a79ba03..3aa6a9a 100644 --- a/Documentation/nvme-security-recv.html +++ b/Documentation/nvme-security-recv.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-security-recv(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -918,7 +918,7 @@ controller reset occurs.</p></div> <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-security-send.1 b/Documentation/nvme-security-send.1 index c1477a1..bbe0c87 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SECURITY\-SEND" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SECURITY\-SEND" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-security-send.html b/Documentation/nvme-security-send.html index 3133a47..1c656e0 100644 --- a/Documentation/nvme-security-send.html +++ b/Documentation/nvme-security-send.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-security-send(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -905,7 +905,7 @@ Receive command is Security Protocol field dependent as defined in SPC-4.</p></d <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-self-test-log.1 b/Documentation/nvme-self-test-log.1 index 1c1f6b6..fc48243 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SELF\-TEST\-LO" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SELF\-TEST\-LO" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-self-test-log.html b/Documentation/nvme-self-test-log.html index 11ea9cb..bca44f0 100644 --- a/Documentation/nvme-self-test-log.html +++ b/Documentation/nvme-self-test-log.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-self-test-log(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -858,7 +858,7 @@ Get the self-test-log and print it in a json format: <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-set-feature.1 b/Documentation/nvme-set-feature.1 index b4169ac..32a3bca 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SET\-FEATURE" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SET\-FEATURE" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-set-feature.html b/Documentation/nvme-set-feature.html index 51bf469..3b9a23a 100644 --- a/Documentation/nvme-set-feature.html +++ b/Documentation/nvme-set-feature.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-set-feature(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -946,7 +946,7 @@ Sets the host id to the ascii string. <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-set-property.1 b/Documentation/nvme-set-property.1 index 59342d6..d40714f 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SET\-PROPERTY" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SET\-PROPERTY" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-set-property.html b/Documentation/nvme-set-property.html index 8752e9f..4ca7622 100644 --- a/Documentation/nvme-set-property.html +++ b/Documentation/nvme-set-property.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-set-property(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -843,7 +843,7 @@ nvme-set-property(1) Manual Page <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-set-reg.txt b/Documentation/nvme-set-reg.txt index 2978c82..bd86c3a 100644 --- a/Documentation/nvme-set-reg.txt +++ b/Documentation/nvme-set-reg.txt @@ -22,6 +22,9 @@ DESCRIPTION ----------- Writes and shows the defined NVMe controller register. +The <device> parameter is mandatory and must be the nvme admin character +device (ex: /dev/nvme0). + OPTIONS ------- -O <offset>:: diff --git a/Documentation/nvme-show-hostnqn.1 b/Documentation/nvme-show-hostnqn.1 index ddfac92..5449f2d 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SHOW\-HOSTNQN" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SHOW\-HOSTNQN" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-show-hostnqn.html b/Documentation/nvme-show-hostnqn.html index d8cc99c..39fc781 100644 --- a/Documentation/nvme-show-hostnqn.html +++ b/Documentation/nvme-show-hostnqn.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-show-hostnqn(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -809,7 +809,7 @@ this will show the systemd-generated host NQN for the system.</p></div> <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-show-regs.1 b/Documentation/nvme-show-regs.1 index 8a5a968..4da57a5 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ID\-NS" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-ID\-NS" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-show-regs.html b/Documentation/nvme-show-regs.html index 533a092..b50418b 100644 --- a/Documentation/nvme-show-regs.html +++ b/Documentation/nvme-show-regs.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-id-ns(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -871,7 +871,7 @@ in a json format: <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-show-topology.1 b/Documentation/nvme-show-topology.1 index 58270f4..d33ab29 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SHOW\-TOPOLOGY" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SHOW\-TOPOLOGY" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-show-topology.html b/Documentation/nvme-show-topology.html index 3456383..fa2fe02 100644 --- a/Documentation/nvme-show-topology.html +++ b/Documentation/nvme-show-topology.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-show-topology(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -845,7 +845,7 @@ nvme-show-topology(1) Manual Page <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-smart-log.1 b/Documentation/nvme-smart-log.1 index 61af9a4..ba085e9 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SMART\-LOG" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SMART\-LOG" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-smart-log.html b/Documentation/nvme-smart-log.html index 6bfe471..26d8592 100644 --- a/Documentation/nvme-smart-log.html +++ b/Documentation/nvme-smart-log.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-smart-log(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -861,7 +861,7 @@ Print the raw SMART log to a file: <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-solidigm-clear-fw-activate-history.1 b/Documentation/nvme-solidigm-clear-fw-activate-history.1 index a292844..eac7d88 100644 --- a/Documentation/nvme-solidigm-clear-fw-activate-history.1 +++ b/Documentation/nvme-solidigm-clear-fw-activate-history.1 @@ -2,12 +2,12 @@ .\" Title: nvme-solidigm-clear-fw-activate-history .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SOLIDIGM\-CLEA" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SOLIDIGM\-CLEA" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-solidigm-clear-fw-activate-history.html b/Documentation/nvme-solidigm-clear-fw-activate-history.html index 7bb70ad..1a95db0 100644 --- a/Documentation/nvme-solidigm-clear-fw-activate-history.html +++ b/Documentation/nvme-solidigm-clear-fw-activate-history.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-solidigm-clear-fw-activate-history(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -824,7 +824,7 @@ Clear the firmware update history log for an OCP 1.0 device: <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-solidigm-clear-pcie-correctable-errors.1 b/Documentation/nvme-solidigm-clear-pcie-correctable-errors.1 index 8095476..2242a18 100644 --- a/Documentation/nvme-solidigm-clear-pcie-correctable-errors.1 +++ b/Documentation/nvme-solidigm-clear-pcie-correctable-errors.1 @@ -2,12 +2,12 @@ .\" Title: nvme-solidigm-clear-pcie-correctable-errors .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SOLIDIGM\-CLEA" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SOLIDIGM\-CLEA" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-solidigm-clear-pcie-correctable-errors.html b/Documentation/nvme-solidigm-clear-pcie-correctable-errors.html index 8c30f7e..9d60035 100644 --- a/Documentation/nvme-solidigm-clear-pcie-correctable-errors.html +++ b/Documentation/nvme-solidigm-clear-pcie-correctable-errors.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-solidigm-clear-pcie-correctable-errors(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -825,7 +825,7 @@ Clear PCIe Correctable Error Counters for an OCP 1.0 device: <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-solidigm-cloud-SSDplugin-version.1 b/Documentation/nvme-solidigm-cloud-SSDplugin-version.1 index 2c4ee66..328e6a3 100644 --- a/Documentation/nvme-solidigm-cloud-SSDplugin-version.1 +++ b/Documentation/nvme-solidigm-cloud-SSDplugin-version.1 @@ -2,12 +2,12 @@ .\" Title: nvme-solidigm-cloud-SSDplugin-version .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SOLIDIGM\-CLOU" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SOLIDIGM\-CLOU" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-solidigm-cloud-SSDplugin-version.html b/Documentation/nvme-solidigm-cloud-SSDplugin-version.html index eef281a..4435030 100644 --- a/Documentation/nvme-solidigm-cloud-SSDplugin-version.html +++ b/Documentation/nvme-solidigm-cloud-SSDplugin-version.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-solidigm-cloud-SSDplugin-version(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -787,7 +787,7 @@ Display the OCP plugin version: <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-solidigm-garbage-collect-log.1 b/Documentation/nvme-solidigm-garbage-collect-log.1 index 637bf96..cc008a5 100644 --- a/Documentation/nvme-solidigm-garbage-collect-log.1 +++ b/Documentation/nvme-solidigm-garbage-collect-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-solidigm-garbage-collect-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SOLIDIGM\-GARB" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SOLIDIGM\-GARB" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-solidigm-garbage-collect-log.html b/Documentation/nvme-solidigm-garbage-collect-log.html index 7c2ae05..9fc1847 100644 --- a/Documentation/nvme-solidigm-garbage-collect-log.html +++ b/Documentation/nvme-solidigm-garbage-collect-log.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-solidigm-garbage-collect-log(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -818,7 +818,7 @@ Retrieve the garbage collection log in JSON format: <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-solidigm-id-ctrl.1 b/Documentation/nvme-solidigm-id-ctrl.1 index f5e9092..d70e9b9 100644 --- a/Documentation/nvme-solidigm-id-ctrl.1 +++ b/Documentation/nvme-solidigm-id-ctrl.1 @@ -2,12 +2,12 @@ .\" Title: nvme-solidigm-id-ctrl .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SOLIDIGM\-ID\-" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SOLIDIGM\-ID\-" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-solidigm-id-ctrl.html b/Documentation/nvme-solidigm-id-ctrl.html index b6e657f..32a5d0d 100644 --- a/Documentation/nvme-solidigm-id-ctrl.html +++ b/Documentation/nvme-solidigm-id-ctrl.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-solidigm-id-ctrl(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -845,7 +845,7 @@ Use human-readable output: <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-solidigm-latency-tracking-log.1 b/Documentation/nvme-solidigm-latency-tracking-log.1 index 438583b..dc954e9 100644 --- a/Documentation/nvme-solidigm-latency-tracking-log.1 +++ b/Documentation/nvme-solidigm-latency-tracking-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-solidigm-latency-tracking-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SOLIDIGM\-LATE" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SOLIDIGM\-LATE" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-solidigm-latency-tracking-log.html b/Documentation/nvme-solidigm-latency-tracking-log.html index af52bed..9861c25 100644 --- a/Documentation/nvme-solidigm-latency-tracking-log.html +++ b/Documentation/nvme-solidigm-latency-tracking-log.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-solidigm-latency-tracking-log(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -894,7 +894,7 @@ Specify a log type when retrieving latency statistics: <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-solidigm-log-page-directory.1 b/Documentation/nvme-solidigm-log-page-directory.1 index 9ae03b4..a7cba8e 100644 --- a/Documentation/nvme-solidigm-log-page-directory.1 +++ b/Documentation/nvme-solidigm-log-page-directory.1 @@ -2,12 +2,12 @@ .\" Title: nvme-solidigm-log-page-directory .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SOLIDIGM\-LOG\" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SOLIDIGM\-LOG\" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-solidigm-log-page-directory.html b/Documentation/nvme-solidigm-log-page-directory.html index e6e7b18..158161d 100644 --- a/Documentation/nvme-solidigm-log-page-directory.html +++ b/Documentation/nvme-solidigm-log-page-directory.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-solidigm-log-page-directory(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -818,7 +818,7 @@ Retrieve the log page directory in JSON format: <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-solidigm-market-log.1 b/Documentation/nvme-solidigm-market-log.1 index 9a70b25..3fc42cd 100644 --- a/Documentation/nvme-solidigm-market-log.1 +++ b/Documentation/nvme-solidigm-market-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-solidigm-market-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SOLIDIGM\-MARK" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SOLIDIGM\-MARK" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-solidigm-market-log.html b/Documentation/nvme-solidigm-market-log.html index d9d315e..88796e4 100644 --- a/Documentation/nvme-solidigm-market-log.html +++ b/Documentation/nvme-solidigm-market-log.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-solidigm-market-log(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -816,7 +816,7 @@ Retrieve the raw binary data of the marketing name log: <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-solidigm-parse-telemetry-log.1 b/Documentation/nvme-solidigm-parse-telemetry-log.1 index 9764fdf..e09a560 100644 --- a/Documentation/nvme-solidigm-parse-telemetry-log.1 +++ b/Documentation/nvme-solidigm-parse-telemetry-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-solidigm-parse-telemetry-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SOLIDIGM\-PARS" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SOLIDIGM\-PARS" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-solidigm-parse-telemetry-log.html b/Documentation/nvme-solidigm-parse-telemetry-log.html index d33d709..6ef6042 100644 --- a/Documentation/nvme-solidigm-parse-telemetry-log.html +++ b/Documentation/nvme-solidigm-parse-telemetry-log.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-solidigm-parse-telemetry-log(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -899,7 +899,7 @@ Parse a telemetry log from a binary file: <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-solidigm-smart-log-add.1 b/Documentation/nvme-solidigm-smart-log-add.1 index a71787b..e48df55 100644 --- a/Documentation/nvme-solidigm-smart-log-add.1 +++ b/Documentation/nvme-solidigm-smart-log-add.1 @@ -2,12 +2,12 @@ .\" Title: nvme-solidigm-smart-log-add .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SOLIDIGM\-SMAR" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SOLIDIGM\-SMAR" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-solidigm-smart-log-add.html b/Documentation/nvme-solidigm-smart-log-add.html index 178f6bf..a17dfce 100644 --- a/Documentation/nvme-solidigm-smart-log-add.html +++ b/Documentation/nvme-solidigm-smart-log-add.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-solidigm-smart-log-add(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -840,7 +840,7 @@ Retrieve the Solidigm SMART log in JSON format: <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-solidigm-temp-stats.1 b/Documentation/nvme-solidigm-temp-stats.1 index 50e5b44..394ec22 100644 --- a/Documentation/nvme-solidigm-temp-stats.1 +++ b/Documentation/nvme-solidigm-temp-stats.1 @@ -2,12 +2,12 @@ .\" Title: nvme-solidigm-temp-stats .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SOLIDIGM\-TEMP" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SOLIDIGM\-TEMP" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-solidigm-temp-stats.html b/Documentation/nvme-solidigm-temp-stats.html index d61c5fc..b273653 100644 --- a/Documentation/nvme-solidigm-temp-stats.html +++ b/Documentation/nvme-solidigm-temp-stats.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-solidigm-temp-stats(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -818,7 +818,7 @@ Retrieve the temperature statistics log in raw binary format: <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-solidigm-vs-drive-info.1 b/Documentation/nvme-solidigm-vs-drive-info.1 index cd3b63e..5bf9457 100644 --- a/Documentation/nvme-solidigm-vs-drive-info.1 +++ b/Documentation/nvme-solidigm-vs-drive-info.1 @@ -2,12 +2,12 @@ .\" Title: nvme-solidigm-vs-drive-info .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SOLIDIGM\-VS\-" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SOLIDIGM\-VS\-" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-solidigm-vs-drive-info.html b/Documentation/nvme-solidigm-vs-drive-info.html index 04b0c74..65a518b 100644 --- a/Documentation/nvme-solidigm-vs-drive-info.html +++ b/Documentation/nvme-solidigm-vs-drive-info.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-solidigm-vs-drive-info(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -819,7 +819,7 @@ Retrieve the drive information in JSON format: <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-solidigm-vs-fw-activate-history.1 b/Documentation/nvme-solidigm-vs-fw-activate-history.1 index b1d2e99..01ebd6f 100644 --- a/Documentation/nvme-solidigm-vs-fw-activate-history.1 +++ b/Documentation/nvme-solidigm-vs-fw-activate-history.1 @@ -2,12 +2,12 @@ .\" Title: nvme-solidigm-vs-fw-activate-history .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SOLIDIGM\-VS\-" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SOLIDIGM\-VS\-" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-solidigm-vs-fw-activate-history.html b/Documentation/nvme-solidigm-vs-fw-activate-history.html index 75a6c87..31737f2 100644 --- a/Documentation/nvme-solidigm-vs-fw-activate-history.html +++ b/Documentation/nvme-solidigm-vs-fw-activate-history.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-solidigm-vs-fw-activate-history(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -814,7 +814,7 @@ Print the firmware activation history log in JSON format: <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-solidigm-vs-internal-log.1 b/Documentation/nvme-solidigm-vs-internal-log.1 index c30a350..36a1822 100644 --- a/Documentation/nvme-solidigm-vs-internal-log.1 +++ b/Documentation/nvme-solidigm-vs-internal-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-solidigm-vs-internal-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SOLIDIGM\-VS\-" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SOLIDIGM\-VS\-" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-solidigm-vs-internal-log.html b/Documentation/nvme-solidigm-vs-internal-log.html index 2ab4fab..9f6a272 100644 --- a/Documentation/nvme-solidigm-vs-internal-log.html +++ b/Documentation/nvme-solidigm-vs-internal-log.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-solidigm-vs-internal-log(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -850,7 +850,7 @@ Retrieve logs with verbose output: <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-solidigm-vs-smart-add-log.1 b/Documentation/nvme-solidigm-vs-smart-add-log.1 index 80f2bb5..6e5237e 100644 --- a/Documentation/nvme-solidigm-vs-smart-add-log.1 +++ b/Documentation/nvme-solidigm-vs-smart-add-log.1 @@ -2,12 +2,12 @@ .\" Title: nvme-solidigm-vs-smart-add-log .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SOLIDIGM\-VS\-" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SOLIDIGM\-VS\-" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-solidigm-vs-smart-add-log.html b/Documentation/nvme-solidigm-vs-smart-add-log.html index 24832aa..dad1642 100644 --- a/Documentation/nvme-solidigm-vs-smart-add-log.html +++ b/Documentation/nvme-solidigm-vs-smart-add-log.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-solidigm-vs-smart-add-log(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -814,7 +814,7 @@ Print the SMART / health extended log in JSON format: <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-solidigm-workload-tracker.1 b/Documentation/nvme-solidigm-workload-tracker.1 index 444a91d..764011c 100644 --- a/Documentation/nvme-solidigm-workload-tracker.1 +++ b/Documentation/nvme-solidigm-workload-tracker.1 @@ -2,12 +2,12 @@ .\" Title: nvme-solidigm-workload-tracker .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SOLIDIGM\-WORK" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SOLIDIGM\-WORK" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-solidigm-workload-tracker.html b/Documentation/nvme-solidigm-workload-tracker.html index bea20d6..0a2f2f9 100644 --- a/Documentation/nvme-solidigm-workload-tracker.html +++ b/Documentation/nvme-solidigm-workload-tracker.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-solidigm-workload-tracker(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -940,7 +940,7 @@ Capture Power tracker samples with a 10-second interval for 5 minutes: <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-subsystem-reset.1 b/Documentation/nvme-subsystem-reset.1 index fb53f74..3f6ae83 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SUBSYSTEM\-RES" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SUBSYSTEM\-RES" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-subsystem-reset.html b/Documentation/nvme-subsystem-reset.html index 95a2377..ecb44d8 100644 --- a/Documentation/nvme-subsystem-reset.html +++ b/Documentation/nvme-subsystem-reset.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-subsystem-reset(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -819,7 +819,7 @@ Resets the subsystem. <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-supported-log-pages.1 b/Documentation/nvme-supported-log-pages.1 index 9d690b4..99760da 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-SUPPORTED\-LOG" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-SUPPORTED\-LOG" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-supported-log-pages.html b/Documentation/nvme-supported-log-pages.html index dc88b89..ce50d5d 100644 --- a/Documentation/nvme-supported-log-pages.html +++ b/Documentation/nvme-supported-log-pages.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-supported-log-pages(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -813,7 +813,7 @@ for each command that is supported.</p></div> <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-telemetry-log.1 b/Documentation/nvme-telemetry-log.1 index b8b1209..887b8f5 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-TELEMETRY\-LOG" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-TELEMETRY\-LOG" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-telemetry-log.html b/Documentation/nvme-telemetry-log.html index f2dc0c5..7b0867f 100644 --- a/Documentation/nvme-telemetry-log.html +++ b/Documentation/nvme-telemetry-log.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-telemetry-log(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -862,7 +862,7 @@ Retrieve Telemetry Host-Initiated data to telemetry_log.bin <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-tls-key.1 b/Documentation/nvme-tls-key.1 index 05f4347..d81e0bf 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-TLS\-KEY" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-TLS\-KEY" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-tls-key.html b/Documentation/nvme-tls-key.html index c03c598..76e0e61 100644 --- a/Documentation/nvme-tls-key.html +++ b/Documentation/nvme-tls-key.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-tls-key(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -951,7 +951,7 @@ Session Keyring <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-toshiba-clear-pcie-correctable-errors.1 b/Documentation/nvme-toshiba-clear-pcie-correctable-errors.1 index e4a4769..d30aa14 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-TOSHIBA\-CLEAR" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-TOSHIBA\-CLEAR" "1" "03/17/2025" "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 532bda9..f4c2f30 100644 --- a/Documentation/nvme-toshiba-clear-pcie-correctable-errors.html +++ b/Documentation/nvme-toshiba-clear-pcie-correctable-errors.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-toshiba-clear-pcie-correctable-errors(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -791,7 +791,7 @@ Clear the PCIe correctable errors count: <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-toshiba-vs-internal-log.1 b/Documentation/nvme-toshiba-vs-internal-log.1 index faa30e5..5f7174b 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-TOSHIBA\-VS\-I" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-TOSHIBA\-VS\-I" "1" "03/17/2025" "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 823806b..c098d1b 100644 --- a/Documentation/nvme-toshiba-vs-internal-log.html +++ b/Documentation/nvme-toshiba-vs-internal-log.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-toshiba-vs-internal-log(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -837,7 +837,7 @@ Get the previous log from the device and save to a binary file: <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-toshiba-vs-smart-add-log.1 b/Documentation/nvme-toshiba-vs-smart-add-log.1 index 32378c1..72b6241 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-TOSHIBA\-VS\-S" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-TOSHIBA\-VS\-S" "1" "03/17/2025" "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 5b7f9b0..644e539 100644 --- a/Documentation/nvme-toshiba-vs-smart-add-log.html +++ b/Documentation/nvme-toshiba-vs-smart-add-log.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-toshiba-vs-smart-add-log(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -841,7 +841,7 @@ Get the contents of log page 0xC0 from the device and save to a binary file: <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-transcend-badblock.1 b/Documentation/nvme-transcend-badblock.1 index ac520bb..95215b4 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-TRANSCEND\-BAD" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-TRANSCEND\-BAD" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-transcend-badblock.html b/Documentation/nvme-transcend-badblock.html index 1e7dcca..a21281d 100644 --- a/Documentation/nvme-transcend-badblock.html +++ b/Documentation/nvme-transcend-badblock.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-transcend-badblock(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -796,7 +796,7 @@ Print the Transcend device’s bad blocks in a human readable format: <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-transcend-healthvalue.1 b/Documentation/nvme-transcend-healthvalue.1 index 00ffd98..e62057d 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-TRANSCEND\-HEA" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-TRANSCEND\-HEA" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-transcend-healthvalue.html b/Documentation/nvme-transcend-healthvalue.html index d96fb4a..42c34be 100644 --- a/Documentation/nvme-transcend-healthvalue.html +++ b/Documentation/nvme-transcend-healthvalue.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-transcend-healthvalue(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -797,7 +797,7 @@ Print the Transcend Device health value in a human readable format: <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-verify.1 b/Documentation/nvme-verify.1 index b748619..94912a0 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-VERIFY" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-VERIFY" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-verify.html b/Documentation/nvme-verify.html index 4702552..c5127c9 100644 --- a/Documentation/nvme-verify.html +++ b/Documentation/nvme-verify.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-verify(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -988,7 +988,7 @@ metadata is passes.</p></td> <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-virtium-save-smart-to-vtview-log.1 b/Documentation/nvme-virtium-save-smart-to-vtview-log.1 index 8b17025..6812a47 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-VIRTIUM\-SAVE\" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-VIRTIUM\-SAVE\" "1" "03/17/2025" "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 aa8f3a0..7bc4fb0 100644 --- a/Documentation/nvme-virtium-save-smart-to-vtview-log.html +++ b/Documentation/nvme-virtium-save-smart-to-vtview-log.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-virtium-save-smart-to-vtview-log(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -878,7 +878,7 @@ Just logging: Default logging is run for 20 hours and log every 10 hours. <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-virtium-show-identify.1 b/Documentation/nvme-virtium-show-identify.1 index aaf0985..5c0204a 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-VIRTIUM\-SHOW\" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-VIRTIUM\-SHOW\" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-virtium-show-identify.html b/Documentation/nvme-virtium-show-identify.html index 69a8531..a713fa1 100644 --- a/Documentation/nvme-virtium-show-identify.html +++ b/Documentation/nvme-virtium-show-identify.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-virtium-show-identify(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -798,7 +798,7 @@ Show Identify Device: <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-wdc-cap-diag.1 b/Documentation/nvme-wdc-cap-diag.1 index 696c4f3..4dca032 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-CAP\-DIAG" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-CAP\-DIAG" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-cap-diag.html b/Documentation/nvme-wdc-cap-diag.html index 59d7333..6f5bd5e 100644 --- a/Documentation/nvme-wdc-cap-diag.html +++ b/Documentation/nvme-wdc-cap-diag.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-wdc-cap-diag(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -856,7 +856,7 @@ Gets the capture diagnostics log from the device transferring the data in 16k ch <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-wdc-capabilities.1 b/Documentation/nvme-wdc-capabilities.1 index 37ce4f0..1a85864 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-CAPABILIT" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-CAPABILIT" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-capabilities.html b/Documentation/nvme-wdc-capabilities.html index ed5f430..61f6e60 100644 --- a/Documentation/nvme-wdc-capabilities.html +++ b/Documentation/nvme-wdc-capabilities.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-wdc-capabilities(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -789,7 +789,7 @@ Displays the capabilities for the device: <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-wdc-clear-assert-dump.1 b/Documentation/nvme-wdc-clear-assert-dump.1 index b332c20..b3c9703 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-CLEAR\-AS" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-CLEAR\-AS" "1" "03/17/2025" "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 1bfacbc..8f2984c 100644 --- a/Documentation/nvme-wdc-clear-assert-dump.html +++ b/Documentation/nvme-wdc-clear-assert-dump.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-wdc-clear-assert-dump(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -798,7 +798,7 @@ Clears the assert dump (if present): <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-wdc-clear-fw-activate-history.1 b/Documentation/nvme-wdc-clear-fw-activate-history.1 index 63cd477..d88c154 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-CLEAR\-FW" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-CLEAR\-FW" "1" "03/17/2025" "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 ed0aa7a..295d25e 100644 --- a/Documentation/nvme-wdc-clear-fw-activate-history.html +++ b/Documentation/nvme-wdc-clear-fw-activate-history.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-wdc-clear-fw-activate-history(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -797,7 +797,7 @@ Clears the firmware activate history table: <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-wdc-clear-pcie-correctable-errors.1 b/Documentation/nvme-wdc-clear-pcie-correctable-errors.1 index 64b3c9a..57d4c26 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-CLEAR\-PC" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-CLEAR\-PC" "1" "03/17/2025" "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 161b002..539a697 100644 --- a/Documentation/nvme-wdc-clear-pcie-correctable-errors.html +++ b/Documentation/nvme-wdc-clear-pcie-correctable-errors.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-wdc-clear-pcie-correctable-errors(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -799,7 +799,7 @@ Clears the PCIe Correctable Error Count field returned in the smart-log-add comm <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-wdc-cloud-SSD-plugin-version.1 b/Documentation/nvme-wdc-cloud-SSD-plugin-version.1 index 7928060..9170edf 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-CLOUD\-SS" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-CLOUD\-SS" "1" "03/17/2025" "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 baccafb..622abe1 100644 --- a/Documentation/nvme-wdc-cloud-SSD-plugin-version.html +++ b/Documentation/nvme-wdc-cloud-SSD-plugin-version.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-wdc-cloud-SSD-plugin-version(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -790,7 +790,7 @@ Displays the cloud ssd plugin version for the device: <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-wdc-cloud-boot-SSD-version.1 b/Documentation/nvme-wdc-cloud-boot-SSD-version.1 index fc4c7d3..733f076 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-CLOUD\-BO" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-CLOUD\-BO" "1" "03/17/2025" "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 9a7c972..d4ad9c8 100644 --- a/Documentation/nvme-wdc-cloud-boot-SSD-version.html +++ b/Documentation/nvme-wdc-cloud-boot-SSD-version.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-wdc-cloud-boot-SSD-version(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -790,7 +790,7 @@ Displays the cloud boot ssd version for the device: <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-wdc-drive-essentials.1 b/Documentation/nvme-wdc-drive-essentials.1 index 8b582a7..3daa75b 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-DRIVE\-ES" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-DRIVE\-ES" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-drive-essentials.html b/Documentation/nvme-wdc-drive-essentials.html index 8bd99f4..c3c3d1c 100644 --- a/Documentation/nvme-wdc-drive-essentials.html +++ b/Documentation/nvme-wdc-drive-essentials.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-wdc-drive-essentials(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -822,7 +822,7 @@ Gets the drive essentials data files from the device and saves the tar file to s <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-wdc-drive-log.1 b/Documentation/nvme-wdc-drive-log.1 index 33af818..37657cf 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-DRIVE\-LO" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-DRIVE\-LO" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-drive-log.html b/Documentation/nvme-wdc-drive-log.html index 7bdc9be..7b44a9a 100644 --- a/Documentation/nvme-wdc-drive-log.html +++ b/Documentation/nvme-wdc-drive-log.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-wdc-drive-log(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -829,7 +829,7 @@ Gets the drive log from the device and saves to defined file with pathname (e.g. <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-wdc-drive-resize.1 b/Documentation/nvme-wdc-drive-resize.1 index abe43f6..a2e6213 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-DRIVE\-RE" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-DRIVE\-RE" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-drive-resize.html b/Documentation/nvme-wdc-drive-resize.html index edc448f..fc56eb1 100644 --- a/Documentation/nvme-wdc-drive-resize.html +++ b/Documentation/nvme-wdc-drive-resize.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-wdc-drive-resize(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -810,7 +810,7 @@ Has the program issue WDC Resize Vendor Unique Command : <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-wdc-enc-get-log.1 b/Documentation/nvme-wdc-enc-get-log.1 index ccb8e2c..6d3e09a 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-ENC\-GET\" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-ENC\-GET\" "1" "03/17/2025" "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 b8ddbae..cb51ae4 100644 --- a/Documentation/nvme-wdc-enc-get-log.html +++ b/Documentation/nvme-wdc-enc-get-log.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-wdc-enc-get-log(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -837,7 +837,7 @@ Gets the enclosure log from the device based on the log id(0xd2) with default tr <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-wdc-get-crash-dump.1 b/Documentation/nvme-wdc-get-crash-dump.1 index 63e7a2b..6ed0da1 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-GET\-CRAS" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-GET\-CRAS" "1" "03/17/2025" "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 9746926..97742e4 100644 --- a/Documentation/nvme-wdc-get-crash-dump.html +++ b/Documentation/nvme-wdc-get-crash-dump.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-wdc-get-crash-dump(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -830,7 +830,7 @@ Gets the crash dump from the device and saves to defined file with pathname (e.g <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-wdc-get-dev-capabilities-log.1 b/Documentation/nvme-wdc-get-dev-capabilities-log.1 index b9ad1bc..2f0ee07 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-GET\-DEV\" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-GET\-DEV\" "1" "03/17/2025" "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 a82a8a7..945443b 100644 --- a/Documentation/nvme-wdc-get-dev-capabilities-log.html +++ b/Documentation/nvme-wdc-get-dev-capabilities-log.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-wdc-get-dev-capabilities-log(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -815,7 +815,7 @@ Has the program issue WDC get-dev-capabilities-log plugin command : <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-wdc-get-drive-status.1 b/Documentation/nvme-wdc-get-drive-status.1 index 23584ec..e8729b4 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-GET\-DRIV" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-GET\-DRIV" "1" "03/17/2025" "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 2bc68ed..5b4a21c 100644 --- a/Documentation/nvme-wdc-get-drive-status.html +++ b/Documentation/nvme-wdc-get-drive-status.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-wdc-get-drive-status(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -836,7 +836,7 @@ Has the program issue WDC get-drive-status command : <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-wdc-get-error-recovery-log.1 b/Documentation/nvme-wdc-get-error-recovery-log.1 index af3c8d7..226fe6d 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-GET\-ERRO" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-GET\-ERRO" "1" "03/17/2025" "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 99cdcb5..b22b339 100644 --- a/Documentation/nvme-wdc-get-error-recovery-log.html +++ b/Documentation/nvme-wdc-get-error-recovery-log.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-wdc-get-error-recovery-log(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -816,7 +816,7 @@ Has the program issue WDC get-error-recovery-log plugin command : <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-wdc-get-latency-monitor-log.1 b/Documentation/nvme-wdc-get-latency-monitor-log.1 index f13884d..7148035 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-GET\-LATE" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-GET\-LATE" "1" "03/17/2025" "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 f48e7fa..4c7f565 100644 --- a/Documentation/nvme-wdc-get-latency-monitor-log.html +++ b/Documentation/nvme-wdc-get-latency-monitor-log.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-wdc-get-latency-monitor-log(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -810,7 +810,7 @@ Displays the get latency monitor log for the device: <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-wdc-get-pfail-dump.1 b/Documentation/nvme-wdc-get-pfail-dump.1 index a407732..8637ba7 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-GET\-PFAI" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-GET\-PFAI" "1" "03/17/2025" "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 9e982bc..f2d5cd3 100644 --- a/Documentation/nvme-wdc-get-pfail-dump.html +++ b/Documentation/nvme-wdc-get-pfail-dump.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-wdc-get-pfail-dump(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -832,7 +832,7 @@ Gets the pfail crash dump from the device and saves to defined file with pathnam <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-wdc-get-unsupported-reqs-log.1 b/Documentation/nvme-wdc-get-unsupported-reqs-log.1 index 7f93b78..defa5d2 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-GET\-UNSU" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-GET\-UNSU" "1" "03/17/2025" "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 ccdf5a6..83a0424 100644 --- a/Documentation/nvme-wdc-get-unsupported-reqs-log.html +++ b/Documentation/nvme-wdc-get-unsupported-reqs-log.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-wdc-get-unsupported-reqs-log(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -816,7 +816,7 @@ Has the program issue WDC get-unsupported-reqs-log plugin command : <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-wdc-id-ctrl.1 b/Documentation/nvme-wdc-id-ctrl.1 index 7582e1c..2b23668 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-ID\-CTRL" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-ID\-CTRL" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-id-ctrl.html b/Documentation/nvme-wdc-id-ctrl.html index d24b6d3..0afbf04 100644 --- a/Documentation/nvme-wdc-id-ctrl.html +++ b/Documentation/nvme-wdc-id-ctrl.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-wdc-id-ctrl(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -856,7 +856,7 @@ fields in a human readable format: <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-wdc-log-page-directory.1 b/Documentation/nvme-wdc-log-page-directory.1 index ed68050..9120c9f 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-LOG\-PAGE" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-LOG\-PAGE" "1" "03/17/2025" "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 4e7728a..633d871 100644 --- a/Documentation/nvme-wdc-log-page-directory.html +++ b/Documentation/nvme-wdc-log-page-directory.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-wdc-log-page-directory(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -812,7 +812,7 @@ WDC log-page-directory example command : <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-wdc-namespace-resize.1 b/Documentation/nvme-wdc-namespace-resize.1 index dfe6550..b875940 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-NAMESPACE" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-NAMESPACE" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-namespace-resize.html b/Documentation/nvme-wdc-namespace-resize.html index 694138e..d56cc83 100644 --- a/Documentation/nvme-wdc-namespace-resize.html +++ b/Documentation/nvme-wdc-namespace-resize.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-wdc-namespace-resize(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -836,7 +836,7 @@ Resizes namespace 2 to 7% of the original TNVMCAP reported value: <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-wdc-purge-monitor.1 b/Documentation/nvme-wdc-purge-monitor.1 index 353b690..ce9dc02 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-PURGE\-MO" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-PURGE\-MO" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-purge-monitor.html b/Documentation/nvme-wdc-purge-monitor.html index 7bda2ad..75aa4bc 100644 --- a/Documentation/nvme-wdc-purge-monitor.html +++ b/Documentation/nvme-wdc-purge-monitor.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-wdc-purge-monitor(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -837,7 +837,7 @@ Has the program issue WDC Purge-Monitor Vendor Unique Command : <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-wdc-purge.1 b/Documentation/nvme-wdc-purge.1 index 67aef17..cca00b7 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-PURGE" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-PURGE" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-wdc-purge.html b/Documentation/nvme-wdc-purge.html index 1ddff04..b258a79 100644 --- a/Documentation/nvme-wdc-purge.html +++ b/Documentation/nvme-wdc-purge.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-wdc-purge(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -799,7 +799,7 @@ Has the program issue WDC Purge Vendor Unique Command : <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-wdc-vs-cloud-log.1 b/Documentation/nvme-wdc-vs-cloud-log.1 index 67afd04..2b7c0b0 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-VS\-CLOUD" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-VS\-CLOUD" "1" "03/17/2025" "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 9b7ae1a..58280e8 100644 --- a/Documentation/nvme-wdc-vs-cloud-log.html +++ b/Documentation/nvme-wdc-vs-cloud-log.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-wdc-vs-cloud-log(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -828,7 +828,7 @@ Has the program issue WDC vs-cloud-log Vendor Unique Command : <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-wdc-vs-device-waf.1 b/Documentation/nvme-wdc-vs-device-waf.1 index 33e1834..01d0094 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-VS\-DEVIC" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-VS\-DEVIC" "1" "03/17/2025" "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 a96784f..20fd606 100644 --- a/Documentation/nvme-wdc-vs-device-waf.html +++ b/Documentation/nvme-wdc-vs-device-waf.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-wdc-vs-device-waf(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -828,7 +828,7 @@ Has the program issue WDC vs-device-waf plugin Command : <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-wdc-vs-drive-info.1 b/Documentation/nvme-wdc-vs-drive-info.1 index 375ac29..bcf015a 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-VS\-DRIVE" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-VS\-DRIVE" "1" "03/17/2025" "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 6a8fca3..edc55e4 100644 --- a/Documentation/nvme-wdc-vs-drive-info.html +++ b/Documentation/nvme-wdc-vs-drive-info.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-wdc-vs-drive-info(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -795,7 +795,7 @@ on the drive:</p></div> <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-wdc-vs-error-reason-identifier.1 b/Documentation/nvme-wdc-vs-error-reason-identifier.1 index 5e1808c..d266072 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-VS\-ERROR" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-VS\-ERROR" "1" "03/17/2025" "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 efb7800..972d60f 100644 --- a/Documentation/nvme-wdc-vs-error-reason-identifier.html +++ b/Documentation/nvme-wdc-vs-error-reason-identifier.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-wdc-vs-error-reason-identifier(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -836,7 +836,7 @@ Retrieves the controller initiated error reason identifier field and save it in <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-wdc-vs-fw-activate-history.1 b/Documentation/nvme-wdc-vs-fw-activate-history.1 index f5f66f6..b28f8c8 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-VS\-FW\-A" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-VS\-FW\-A" "1" "03/17/2025" "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 8e46a87..cc35488 100644 --- a/Documentation/nvme-wdc-vs-fw-activate-history.html +++ b/Documentation/nvme-wdc-vs-fw-activate-history.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-wdc-vs-fw-activate-history(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -868,7 +868,7 @@ Has the program issue WDC vs-fw-activate-history Vendor Unique Command : <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-wdc-vs-hw-rev-log.1 b/Documentation/nvme-wdc-vs-hw-rev-log.1 index 7e63b81..adab4b3 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-VS\-HW\-R" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-VS\-HW\-R" "1" "03/17/2025" "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 69db3de..86e34ed 100644 --- a/Documentation/nvme-wdc-vs-hw-rev-log.html +++ b/Documentation/nvme-wdc-vs-hw-rev-log.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-wdc-vs-hw-rev-log(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -827,7 +827,7 @@ Has the program issue WDC vs-hw-rev-log plugin Command : <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-wdc-vs-internal-log.1 b/Documentation/nvme-wdc-vs-internal-log.1 index ed338ad..130033e 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-VS\-INTER" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-VS\-INTER" "1" "03/17/2025" "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 9d81655..b4a916c 100644 --- a/Documentation/nvme-wdc-vs-internal-log.html +++ b/Documentation/nvme-wdc-vs-internal-log.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-wdc-vs-internal-log(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -958,7 +958,7 @@ Gets the controller telemetry log page to data area 3 from the device and stores <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-wdc-vs-nand-stats.1 b/Documentation/nvme-wdc-vs-nand-stats.1 index 327b06d..3626a35 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-VS\-NAND\" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-VS\-NAND\" "1" "03/17/2025" "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 453b602..aea6639 100644 --- a/Documentation/nvme-wdc-vs-nand-stats.html +++ b/Documentation/nvme-wdc-vs-nand-stats.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-wdc-vs-nand-stats(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -814,7 +814,7 @@ Has the program issue WDC vs-nand-stats Vendor Unique Command : <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-wdc-vs-smart-add-log.1 b/Documentation/nvme-wdc-vs-smart-add-log.1 index 100628d..9c1ecaf 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-VS\-SMART" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-VS\-SMART" "1" "03/17/2025" "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 190cd46..75e1e07 100644 --- a/Documentation/nvme-wdc-vs-smart-add-log.html +++ b/Documentation/nvme-wdc-vs-smart-add-log.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-wdc-vs-smart-add-log(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -928,7 +928,7 @@ Has the program issue WDC vs-smart-add-log Vendor Unique Command for 0xC0 and 0x <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-wdc-vs-telemetry-controller-option.1 b/Documentation/nvme-wdc-vs-telemetry-controller-option.1 index e6b5e07..afb7230 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-VS\-TELEM" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-VS\-TELEM" "1" "03/17/2025" "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 8432d5d..c1de20a 100644 --- a/Documentation/nvme-wdc-vs-telemetry-controller-option.html +++ b/Documentation/nvme-wdc-vs-telemetry-controller-option.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-wdc-vs-telemetry-controller-option(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -855,7 +855,7 @@ Gets the current status (enabled or disabled) of the controller initiated option <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-wdc-vs-temperature-stats.1 b/Documentation/nvme-wdc-vs-temperature-stats.1 index e363abc..40afa78 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WDC\-VS\-TEMPE" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WDC\-VS\-TEMPE" "1" "03/17/2025" "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 273bb7e..cfab9f5 100644 --- a/Documentation/nvme-wdc-vs-temperature-stats.html +++ b/Documentation/nvme-wdc-vs-temperature-stats.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-wdc-vs-temperature-stats(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -857,7 +857,7 @@ Displays the temperature stats for the device: <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-write-uncor.1 b/Documentation/nvme-write-uncor.1 index 426f210..42254d7 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-UNCOR" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-UNCOR" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-write-uncor.html b/Documentation/nvme-write-uncor.html index 4c59b6a..8e5ddd0 100644 --- a/Documentation/nvme-write-uncor.html +++ b/Documentation/nvme-write-uncor.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-uncor(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -880,7 +880,7 @@ blocks.</p></div> <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-write-zeroes.1 b/Documentation/nvme-write-zeroes.1 index 7880eca..ffe19ea 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WRITE\-ZEROES" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WRITE\-ZEROES" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -43,7 +43,7 @@ nvme-write-zeroes \- Send an NVMe write zeroes command, return results [\-\-storage\-tag<storage\-tag> | \-S <storage\-tag>] [\-\-storage\-tag\-check<storage\-tag\-check> | \-C <storage\-tag\-check>] [\-\-dir\-type=<dtype> | \-T <dtype>] - [\-\-dir\-spec=<dspec> | \-D <dspec>] + [\-\-dir\-spec=<dspec> | \-D <dspec>] [\-\-namespace\-zeroes | \-Z] [\-\-output\-format=<fmt> | \-o <fmt>] [\-\-verbose | \-v] [\-\-timeout=<timeout> | \-t <timeout>] .fi @@ -162,6 +162,11 @@ Directive type Directive specific .RE .PP +\-Z, \-\-namespace\-zeroes +.RS 4 +If set, then the controller clear all logical blocks to zero in the entire namespace\&. +.RE +.PP \-o <fmt>, \-\-output\-format=<fmt> .RS 4 Set the reporting format to diff --git a/Documentation/nvme-write-zeroes.html b/Documentation/nvme-write-zeroes.html index 75edeea..2d81dc2 100644 --- a/Documentation/nvme-write-zeroes.html +++ b/Documentation/nvme-write-zeroes.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-write-zeroes(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -760,7 +760,7 @@ nvme-write-zeroes(1) Manual Page [--storage-tag<storage-tag> | -S <storage-tag>] [--storage-tag-check<storage-tag-check> | -C <storage-tag-check>] [--dir-type=<dtype> | -T <dtype>] - [--dir-spec=<dspec> | -D <dspec>] + [--dir-spec=<dspec> | -D <dspec>] [--namespace-zeroes | -Z] [--output-format=<fmt> | -o <fmt>] [--verbose | -v] [--timeout=<timeout> | -t <timeout>]</pre> <div class="attribution"> @@ -970,6 +970,17 @@ metadata is passes.</p></td> </p> </dd> <dt class="hdlist1"> +-Z +</dt> +<dt class="hdlist1"> +--namespace-zeroes +</dt> +<dd> +<p> + If set, then the controller clear all logical blocks to zero in the entire namespace. +</p> +</dd> +<dt class="hdlist1"> -o <fmt> </dt> <dt class="hdlist1"> @@ -1023,7 +1034,7 @@ metadata is passes.</p></td> <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-write-zeroes.txt b/Documentation/nvme-write-zeroes.txt index 3cfdb24..1e0d4d2 100644 --- a/Documentation/nvme-write-zeroes.txt +++ b/Documentation/nvme-write-zeroes.txt @@ -19,7 +19,7 @@ SYNOPSIS [--storage-tag<storage-tag> | -S <storage-tag>] [--storage-tag-check<storage-tag-check> | -C <storage-tag-check>] [--dir-type=<dtype> | -T <dtype>] - [--dir-spec=<dspec> | -D <dspec>] + [--dir-spec=<dspec> | -D <dspec>] [--namespace-zeroes | -Z] [--output-format=<fmt> | -o <fmt>] [--verbose | -v] [--timeout=<timeout> | -t <timeout>] @@ -97,6 +97,9 @@ metadata is passes. -D <dspec>:: --dir-spec=<dspec>:: Directive specific +-Z:: +--namespace-zeroes:: + If set, then the controller clear all logical blocks to zero in the entire namespace. -o <fmt>:: --output-format=<fmt>:: diff --git a/Documentation/nvme-write.1 b/Documentation/nvme-write.1 index 332f4c9..83ab658 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-WRITE" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-WRITE" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-write.html b/Documentation/nvme-write.html index 8019c3e..002e4b5 100644 --- a/Documentation/nvme-write.html +++ b/Documentation/nvme-write.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-write(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -1118,7 +1118,7 @@ metadata is passes.</p></td> <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-zns-changed-zone-list.1 b/Documentation/nvme-zns-changed-zone-list.1 index d535898..7dfcb1a 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ZNS\-CHANGED\-" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-ZNS\-CHANGED\-" "1" "03/17/2025" "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 e4219c9..b12d5c1 100644 --- a/Documentation/nvme-zns-changed-zone-list.html +++ b/Documentation/nvme-zns-changed-zone-list.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-zns-changed-zone-list(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -832,7 +832,7 @@ Show the output in json format <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-zns-close-zone.1 b/Documentation/nvme-zns-close-zone.1 index 52ca2d3..0796a23 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ZNS\-CLOSE\-ZO" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-ZNS\-CLOSE\-ZO" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-zns-close-zone.html b/Documentation/nvme-zns-close-zone.html index adef16b..cd5fa50 100644 --- a/Documentation/nvme-zns-close-zone.html +++ b/Documentation/nvme-zns-close-zone.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-zns-close-zone(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -846,7 +846,7 @@ Close all zones on namespace 1: <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-zns-finish-zone.1 b/Documentation/nvme-zns-finish-zone.1 index c4ebf76..a738cbf 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ZNS\-FINISH\-Z" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-ZNS\-FINISH\-Z" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-zns-finish-zone.html b/Documentation/nvme-zns-finish-zone.html index 0dd18ff..507199b 100644 --- a/Documentation/nvme-zns-finish-zone.html +++ b/Documentation/nvme-zns-finish-zone.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-zns-finish-zone(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -847,7 +847,7 @@ Finish all zones on namespace 1: <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-zns-id-ctrl.1 b/Documentation/nvme-zns-id-ctrl.1 index 75d17d6..4e1077f 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ZNS\-ID\-CTRL" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-ZNS\-ID\-CTRL" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-zns-id-ctrl.html b/Documentation/nvme-zns-id-ctrl.html index 4395bd0..755c3b0 100644 --- a/Documentation/nvme-zns-id-ctrl.html +++ b/Documentation/nvme-zns-id-ctrl.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-zns-id-ctrl(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -821,7 +821,7 @@ Show the output in json format <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-zns-id-ns.1 b/Documentation/nvme-zns-id-ns.1 index c780325..3caf8d1 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ZNS\-ID\-NS" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-ZNS\-ID\-NS" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-zns-id-ns.html b/Documentation/nvme-zns-id-ns.html index 84220a2..c13878b 100644 --- a/Documentation/nvme-zns-id-ns.html +++ b/Documentation/nvme-zns-id-ns.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-zns-id-ns(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -846,7 +846,7 @@ Show the output in json format with extra details <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-zns-offline-zone.1 b/Documentation/nvme-zns-offline-zone.1 index 80ca32a..a0fac52 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ZNS\-OFFLINE\-" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-ZNS\-OFFLINE\-" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-zns-offline-zone.html b/Documentation/nvme-zns-offline-zone.html index f5367f5..5be0991 100644 --- a/Documentation/nvme-zns-offline-zone.html +++ b/Documentation/nvme-zns-offline-zone.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-zns-offline-zone(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -846,7 +846,7 @@ Offline all zones on namespace 1: <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-zns-open-zone.1 b/Documentation/nvme-zns-open-zone.1 index c0e8f50..13896ee 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ZNS\-OPEN\-ZON" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-ZNS\-OPEN\-ZON" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-zns-open-zone.html b/Documentation/nvme-zns-open-zone.html index d5aad26..bebe57b 100644 --- a/Documentation/nvme-zns-open-zone.html +++ b/Documentation/nvme-zns-open-zone.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-zns-open-zone(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -856,7 +856,7 @@ Open the first zone on namespace 1: <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-zns-report-zones.1 b/Documentation/nvme-zns-report-zones.1 index 1ae1eea..12c316d 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ZNS\-REPORT\-Z" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-ZNS\-REPORT\-Z" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-zns-report-zones.html b/Documentation/nvme-zns-report-zones.html index 652aa2f..84d89cc 100644 --- a/Documentation/nvme-zns-report-zones.html +++ b/Documentation/nvme-zns-report-zones.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-zns-report-zones(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -957,7 +957,7 @@ Show the output in json format with extra details <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-zns-reset-zone.1 b/Documentation/nvme-zns-reset-zone.1 index 357486d..67e8c89 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ZNS\-RESET\-ZO" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-ZNS\-RESET\-ZO" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-zns-reset-zone.html b/Documentation/nvme-zns-reset-zone.html index 2a21a7e..230c426 100644 --- a/Documentation/nvme-zns-reset-zone.html +++ b/Documentation/nvme-zns-reset-zone.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-zns-reset-zone(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -847,7 +847,7 @@ Reset the first zone on namespace 1: <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-zns-set-zone-desc.1 b/Documentation/nvme-zns-set-zone-desc.1 index 58c2b1f..a8c4d3d 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ZNS\-SET\-ZONE" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-ZNS\-SET\-ZONE" "1" "03/17/2025" "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 e79ecf9..b2bc3b5 100644 --- a/Documentation/nvme-zns-set-zone-desc.html +++ b/Documentation/nvme-zns-set-zone-desc.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-zns-set-zone-desc(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -859,7 +859,7 @@ Write "hello world" into the zone descriptor for namespace 1’s first zone <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-zns-zone-append.1 b/Documentation/nvme-zns-zone-append.1 index abee69d..4d85b8e 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ZNS\-ZONE\-APP" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-ZNS\-ZONE\-APP" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- diff --git a/Documentation/nvme-zns-zone-append.html b/Documentation/nvme-zns-zone-append.html index b21ae62..117da03 100644 --- a/Documentation/nvme-zns-zone-append.html +++ b/Documentation/nvme-zns-zone-append.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-zns-zone-append(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -940,7 +940,7 @@ Append the data "hello world" into 4k worth of blocks into the zone starting <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-zns-zone-mgmt-recv.1 b/Documentation/nvme-zns-zone-mgmt-recv.1 index 2713a1f..a60543c 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ZNS\-ZONE\-MGM" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-ZNS\-ZONE\-MGM" "1" "03/17/2025" "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 ec99011..aa3c978 100644 --- a/Documentation/nvme-zns-zone-mgmt-recv.html +++ b/Documentation/nvme-zns-zone-mgmt-recv.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-zns-zone-mgmt-recv(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -880,7 +880,7 @@ Binary dump of a report all zones <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme-zns-zone-mgmt-send.1 b/Documentation/nvme-zns-zone-mgmt-send.1 index 25442eb..35c406c 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME\-ZNS\-ZONE\-MGM" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME\-ZNS\-ZONE\-MGM" "1" "03/17/2025" "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 4b531f0..ff6fdf5 100644 --- a/Documentation/nvme-zns-zone-mgmt-send.html +++ b/Documentation/nvme-zns-zone-mgmt-send.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme-zns-zone-mgmt-send(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -914,7 +914,7 @@ Write "hello world" into the zone descriptor for namespace 1’s first zone <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Documentation/nvme.1 b/Documentation/nvme.1 index c6a07b8..61787c1 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 <http://docbook.sf.net/> -.\" Date: 10/31/2024 +.\" Date: 03/17/2025 .\" Manual: NVMe Manual .\" Source: NVMe .\" Language: English .\" -.TH "NVME" "1" "10/31/2024" "NVMe" "NVMe Manual" +.TH "NVME" "1" "03/17/2025" "NVMe" "NVMe Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -863,6 +863,61 @@ NVMe Inspur Device Vendor log page request .RS 4 NVMe DapuStor Additional SMART log page .RE +.PP +\fBnvme-solidigm-id-ctrl\fR(1) +.RS 4 +Solidigm \- NVMe Identify Controller +.RE +.PP +\fBnvme-solidigm-smart-log-add\fR(1) +.RS 4 +Retrieve Solidigm SMART Log +.RE +.PP +\fBnvme-solidigm-vs-internal-log\fR(1) +.RS 4 +Retrieve Debug log binaries +.RE +.PP +\fBnvme-solidigm-garbage-collect-log\fR(1) +.RS 4 +Retrieve Garbage Collection Log +.RE +.PP +\fBnvme-solidigm-market-log\fR(1) +.RS 4 +Retrieve Market Log +.RE +.PP +\fBnvme-solidigm-latency-tracking-log\fR(1) +.RS 4 +Enable/Retrieve Latency tracking Log +.RE +.PP +\fBnvme-solidigm-parse-telemetry-log\fR(1) +.RS 4 +Parse Telemetry Log binary +.RE +.PP +\fBnvme-solidigm-log-page-directory\fR(1) +.RS 4 +Retrieve log page directory +.RE +.PP +\fBnvme-solidigm-temp-stats\fR(1) +.RS 4 +Retrieve Temperature Statistics log +.RE +.PP +\fBnvme-solidigm-vs-drive-info\fR(1) +.RS 4 +Retrieve drive information +.RE +.PP +\fBnvme-solidigm-workload-tracker\fR(1) +.RS 4 +Real Time capture Workload Tracker samples +.RE .SH "RETURNS" .sp All commands will behave the same, they will return 0 on success and 1 on failure\&. diff --git a/Documentation/nvme.html b/Documentation/nvme.html index 5c7b2f6..ef8ce66 100644 --- a/Documentation/nvme.html +++ b/Documentation/nvme.html @@ -4,7 +4,7 @@ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" /> -<meta name="generator" content="AsciiDoc 10.2.1" /> +<meta name="generator" content="AsciiDoc 10.2.0" /> <title>nvme(1)</title> <style type="text/css"> /* Shared CSS for AsciiDoc xhtml11 and html5 backends */ @@ -2087,6 +2087,94 @@ available, run "nvme help".</p></div> NVMe DapuStor Additional SMART log page </p> </dd> +<dt class="hdlist1"> +<a href="nvme-solidigm-id-ctrl.html">nvme-solidigm-id-ctrl(1)</a> +</dt> +<dd> +<p> + Solidigm - NVMe Identify Controller +</p> +</dd> +<dt class="hdlist1"> +<a href="nvme-solidigm-smart-log-add.html">nvme-solidigm-smart-log-add(1)</a> +</dt> +<dd> +<p> + Retrieve Solidigm SMART Log +</p> +</dd> +<dt class="hdlist1"> +<a href="nvme-solidigm-vs-internal-log.html">nvme-solidigm-vs-internal-log(1)</a> +</dt> +<dd> +<p> + Retrieve Debug log binaries +</p> +</dd> +<dt class="hdlist1"> +<a href="nvme-solidigm-garbage-collect-log.html">nvme-solidigm-garbage-collect-log(1)</a> +</dt> +<dd> +<p> + Retrieve Garbage Collection Log +</p> +</dd> +<dt class="hdlist1"> +<a href="nvme-solidigm-market-log.html">nvme-solidigm-market-log(1)</a> +</dt> +<dd> +<p> + Retrieve Market Log +</p> +</dd> +<dt class="hdlist1"> +<a href="nvme-solidigm-latency-tracking-log.html">nvme-solidigm-latency-tracking-log(1)</a> +</dt> +<dd> +<p> + Enable/Retrieve Latency tracking Log +</p> +</dd> +<dt class="hdlist1"> +<a href="nvme-solidigm-parse-telemetry-log.html">nvme-solidigm-parse-telemetry-log(1)</a> +</dt> +<dd> +<p> + Parse Telemetry Log binary +</p> +</dd> +<dt class="hdlist1"> +<a href="nvme-solidigm-log-page-directory.html">nvme-solidigm-log-page-directory(1)</a> +</dt> +<dd> +<p> + Retrieve log page directory +</p> +</dd> +<dt class="hdlist1"> +<a href="nvme-solidigm-temp-stats.html">nvme-solidigm-temp-stats(1)</a> +</dt> +<dd> +<p> + Retrieve Temperature Statistics log +</p> +</dd> +<dt class="hdlist1"> +<a href="nvme-solidigm-vs-drive-info.html">nvme-solidigm-vs-drive-info(1)</a> +</dt> +<dd> +<p> + Retrieve drive information +</p> +</dd> +<dt class="hdlist1"> +<a href="nvme-solidigm-workload-tracker.html">nvme-solidigm-workload-tracker(1)</a> +</dt> +<dd> +<p> + Real Time capture Workload Tracker samples +</p> +</dd> </dl></div> </div> </div> @@ -2130,7 +2218,7 @@ NVM-Express Site</a>.</p></div> <div id="footer"> <div id="footer-text"> Last updated - 2024-10-31 10:38:40 CET + 2025-03-17 10:39:49 CET </div> </div> </body> diff --git a/Makefile b/Makefile index 1838a0f..eb4283d 100644 --- a/Makefile +++ b/Makefile @@ -9,6 +9,10 @@ NAME := nvme .DEFAULT_GOAL := ${NAME} BUILD-DIR := .build +.PHONY: update-subprojects +update-subprojects: + meson subprojects update + ${BUILD-DIR}: meson setup $@ @echo "Configuration located in: $@" @@ -28,19 +32,29 @@ endif purge: ifneq ("$(wildcard ${BUILD-DIR})","") rm -rf ${BUILD-DIR} + meson subprojects purge --confirm endif -.PHONY: install dist -install dist: ${BUILD-DIR} - cd ${BUILD-DIR} && meson $@ +.PHONY: install +install: ${NAME} + meson install -C ${BUILD-DIR} --skip-subprojects .PHONY: uninstall uninstall: cd ${BUILD-DIR} && meson --internal uninstall +.PHONY: dist +dist: ${NAME} + meson dist -C ${BUILD-DIR} --formats gztar + .PHONY: test -test: ${BUILD-DIR} - ninja -C ${BUILD-DIR} $@ +test: ${NAME} + meson test -C ${BUILD-DIR} + +# Test strictly nvme-cli (do not run tests on all the subprojects) +.PHONY: test-strict +test-strict: ${NAME} + meson test -C ${BUILD-DIR} --suite nvme-cli .PHONY: rpm rpm: diff --git a/completions/_nvme b/completions/_nvme index f34b36b..157555b 100644 --- a/completions/_nvme +++ b/completions/_nvme @@ -89,6 +89,7 @@ _nvme () { 'lockdown:submit a lockdown command' 'media-unit-stat-log:retrieve media unit status log pages details' 'supported-cap-config-log:retrieve the list of Supported Capacity Configuration Descriptors' + 'rotational-media-info-log:retrieve rotational media information log' 'discover:send Get Log Page request to Discovery Controller' 'connect-all:discover NVMeoF subsystems and connect to them' 'connect:connect to NVMeoF subsystem' @@ -109,9 +110,18 @@ _nvme () { 'set-reg:write and show the defined NVMe controller register' 'io-mgmt-recv:send an I/O management receive command' 'io-mgmt-send:send an I/O management send command' + 'mgmt-addr-list-log:retrieve management address list log' + 'changed-ns-list-log:retrieve changed allocated namespaces log' + 'dispersed-ns-participating-nss-log:retrieve dispersed namespace participating NVM subsystems log' + 'reachability-groups-log:retrieve reachability groups log' + 'reachability-associations-log:retrieve reachability associations log' + 'host-discovery-log:retrieve host discovery log' + 'ave-discovery-log:retrieve ave discovery log' + 'pull-model-ddr-req-log:retrieve pull model ddr req log' 'version:show the program version' 'ocp:OCP cloud SSD extensions' 'solidigm:Solidigm plug-in extensions' + 'fdp:FDP plug-in extensions' 'micron:Micron plug-in extensions' 'dapustor:DapuStor plug-in extensions' 'help:print brief descriptions of all nvme commands' @@ -181,7 +191,7 @@ _nvme () { local _internal_log _internal_log=( /dev/nvme':supply a device to use (required)' - --telemetry-type=':Telemetry Type; host or controller generated' + --telemetry-type=':Telemetry Type; host, host0, host1 or controller generated' -t':alias for --telemetry-type' --data-area=':Telemetry Data Area; 1 or 2' -a':alias for --data-area' @@ -366,7 +376,7 @@ _nvme () { --comp-id=':component identifier' -i':alias for --comp-id' --list':list component descriptions' - -v':alias for --list' + -l':alias for --list' --verbose':Increase the information detail in the output.' -v':alias for --verbose' --output-format=':Output format: normal|json|binary' @@ -597,6 +607,28 @@ _nvme () { ;; esac ;; + (fdp) + case ${words[2]} in + (feature) + local _feature + _feature=( + --endgrp-id=':Endurance group ID' + -e':alias for --endgrp-id' + --enable-conf-idx=':FDP configuration index to enable' + -c':alias for --enable-conf-idx' + --disable=':Disable current FDP configuration' + -d':alias for --disable' + --verbose=':Increase output verbosity' + -v':alias for --verbose' + ) + _arguments '*:: :->subcmds' + _describe -t commands "nvme fdp feature options" _feature + ;; + (*) + _files + ;; + esac + ;; (dapustor) case ${words[2]} in (smart-log-add) @@ -1455,6 +1487,8 @@ _nvme () { -C':alias of --storage-tag-check' --dir-spec=':directive specific' -D':alias of --dir-spec' + --namespace-zeroes':If set, then the controller clear all logical blocks to zero in the entire namespace' + -Z':alias of --namespace-zeroes' --timeout=':value for timeout' -t':alias of --timeout' ) @@ -2585,7 +2619,7 @@ _nvme () { -t':alias of --timeout' ) _arguments '*:: :->subcmds' - _describe -t commands "nvme set-reg options" _io_mgmt_recv + _describe -t commands "nvme io-mgmt-recv-reg options" _io_mgmt_recv ;; (io-mgmt-send) local _io_mgmt_send @@ -2609,7 +2643,153 @@ _nvme () { -t':alias of --timeout' ) _arguments '*:: :->subcmds' - _describe -t commands "nvme set-reg options" _io_mgmt_send + _describe -t commands "nvme io-mgmt-send options" _io_mgmt_send + ;; + (mgmt-addr-list-log) + local _mal_log + _mal_log=( + /dev/nvme':supply a device to use (required)' + --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 mgmt-addr-list-log" _mal_log + ;; + (rotational-media-info-log) + local _rmi_log + _rmi_log=( + /dev/nvme':supply a device to use (required)' + --endg-id=':Endurance Group Identifier' + -e':alias of --endg-id' + --verbose':Increase the information detail in the output.' + -v':alias for --verbose' + --output-format=':Output format: normal|json|binary' + -o ':alias for --output-format' + ) + _arguments '*:: :->subcmds' + _describe -t commands "nvme rotational-media-info-log" _rmi_log + ;; + (changed-alloc-ns-list-log) + local _changed_alloc_ns_list_log + _changed_alloc_ns_list_log=( + /dev/nvme':supply a device to use (required)' + --output-format=':Output format: normal|json|binary' + -o':alias for --output-format' + --raw-binary':dump infos in binary format' + -b':alias of --raw-binary' + --verbose':Increase the information detail in the output.' + -v':alias for --verbose' + --timeout=':value for timeout' + -t ':alias for --timeout' + ) + _arguments '*:: :->subcmds' + _describe -t commands "nvme changed-alloc-ns-list-log options" _changed_alloc_ns_list_log + ;; + (dispersed-ns-participating-nss-log) + local _dns_psub_log + _dns_psub_log=( + /dev/nvme':supply a device to use (required)' + --namespace-id=':show infos for namespace <nsid>' + -n':alias of --namespace-id' + --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 dispersed-ns-participating-nss-log" _dns_psub_log + ;; + (reachability-groups-log) + local _rg_log + _rg_log=( + /dev/nvme':supply a device to use (required)' + --groups-only':Return Groups Only' + -g':alias for --groups-only' + --rae':Retain an Asynchronous Event' + -r':alias for --rae' + --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 reachability-groups-log" _rg_log + ;; + (reachability-associations-log) + local _ra_log + _ra_log=( + /dev/nvme':supply a device to use (required)' + --associations-only':Return Associations Only' + -a':alias for --associations-only' + --rae':Retain an Asynchronous Event' + -r':alias for --rae' + --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 reachability-associationsroups-log" _ra_log + ;; + (host-discovery-log) + local _hd_log + _hd_log=( + /dev/nvme':supply a device to use (required)' + --all-host-entries':All Host Entries' + -a':alias for --all-host-entries' + --rae':Retain an Asynchronous Event' + -r':alias for --rae' + --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 host-discovery-log" _hd_log + ;; + (ave-discovery-log) + local _ad_log + _ad_log=( + /dev/nvme':supply a device to use (required)' + --rae':Retain an Asynchronous Event' + -r':alias for --rae' + --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 ave-discovery-log" _ad_log + ;; + (pull-model-ddr-req-log) + local _pmdr_log + _pmdr_log=( + /dev/nvme':supply a device to use (required)' + --rae':Retain an Asynchronous Event' + -r':alias for --rae' + --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 pull-model-ddr-req-log" _pmdr_log ;; (version) local _version @@ -2667,6 +2847,16 @@ _nvme () { _arguments '*:: :->subcmds' _describe -t commands "nvme solidigm options" _solidigm ;; + (fdp) + local _fdp + _fdp=( + feature':Show, enable or disable FDP configuration' + version':Shows the plug-in version' + help':Display this help' + ) + _arguments '*:: :->subcmds' + _describe -t commands "nvme fdp options" _fdp + ;; (micron) local micron _micron=( @@ -2722,7 +2912,8 @@ _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 dapustor + dir-send virt-mgmt rpmb version ocp solidigm dapustor mgmt-addr-list-log + rotational-media-info-log changed-alloc-ns-list-log fdp ) _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 a6c6f42..6b870c9 100644 --- a/completions/bash-nvme-completion.sh +++ b/completions/bash-nvme-completion.sh @@ -340,7 +340,8 @@ nvme_list_opts () { --force-unit-access -f --prinfo= -p --ref-tag= -r \ --app-tag-mask= -m --app-tag= -a \ --storage-tag= -S --storage-tag-check -C \ - --dir-type= -T --dir-spec= -S --timeout= -t" + --dir-type= -T --dir-spec= -S --namespace-zeroes -Z \ + --timeout= -t" ;; "write-uncor") opts+=" --namespace-id= -n --start-block= -s \ @@ -464,7 +465,7 @@ nvme_list_opts () { --nmimt= -m --nmd0= -0 --nmd1= -1 --input-file= -i" ;; "get-reg") - opts+=" --offset, -O --human-readable -H --cap --vs --cmbloc \ + opts+=" --offset= -O --human-readable -H --cap --vs --cmbloc \ --cmbsz --bpinfo --cmbsts --cmbebs --cmbswtp --crto \ --pmrcap --pmrsts --pmrebs --pmrswtp --intms --intmc \ --cc --csts --nssr --aqa --asq --acq --bprsel --bpmbl \ @@ -472,10 +473,55 @@ nvme_list_opts () { --output-format -o --verbose -v --timeout= -t" ;; "set-reg") - opts+=" --offset, -O --value= -V --mmio32 -m --intms= --intmc= \ + opts+=" --offset= -O --value= -V --mmio32 -m --intms= --intmc= \ --cc= --csts= --nssr= --aqa= --asq= --acq= --bprsel= \ --bpmbl= --cmbmsc= --nssd= --pmrctl= --pmrmscl= \ - --pmrmscu= --output-format= -o --verbose= -v \ + --pmrmscu= --output-format= -o --verbose -v \ + --timeout= -t" + ;; + "io-mgmt-recv") + opts+=" --namespace-id= -n --mos= -s --mo= -m --data= -d \ + --data-len= -l --output-format= -o --verbose -v \ + --timeout= -t" + ;; + "io-mgmt-send") + opts+=" --namespace-id= -n --mos= -s --mo= -m --data= -d \ + --data-len= -l --output-format= -o --verbose -v \ + --timeout= -t" + ;; + "mgmt-addr-list-log") + opts+=" --verbose -v --output-format= -o --timeout= -t" + ;; + "rotational-media-info-log") + opts+=" --endg-id= -e --verbose -v --output-format= -o \ + --timeout= -t" + ;; + "changed-alloc-cns-list-log") + opts+=" --output-format= -o --raw-binary -b --verbose -v \ + --timeout= -t" + ;; + "dispersed-ns-participating-nss-log") + opts+=" --namespace-id= -n --verbose -v --output-format= -o \ + --timeout= -t" + ;; + "reachability-groups-log") + opts+=" --groups-only -g --rae -r --verbose -v \ + --output-format= -o --timeout= -t" + ;; + "reachability-associations-log") + opts+=" --associations-only -a --rae -r --verbose -v \ + --output-format= -o --timeout= -t" + ;; + "host-discovery-log") + opts+=" --all-host-entries -a --rae -r --verbose -v \ + --output-format= -o --timeout= -t" + ;; + "ave-discovery-log") + opts+=" --rae -r --verbose -v --output-format= -o \ + --timeout= -t" + ;; + "pull--ddc-req-log") + opts+=" --rae -r --verbose -v --output-format= -o \ --timeout= -t" ;; "version") @@ -1202,6 +1248,41 @@ plugin_solidigm_opts () { return 0 } +plugin_fdp_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 + "feature") + opts+=" --endgrp-id= -e --enable-conf-idx= -c \ + --disable -d --verbose -v" + ;; + "version") + opts+=$NO_OPTS + ;; + "help") + opts+=$NO_OPTS + ;; + esac + + COMPREPLY+=( $( compgen $compargs -W "$opts" -- $cur ) ) + + return 0 +} + plugin_transcend_opts () { local opts="" local compargs="" @@ -1597,6 +1678,7 @@ _nvme_subcmds () { clear-fw-activate-history vs-fw-activate-history log-page-directory \ vs-drive-info cloud-SSDplugin-version market-log \ smart-log-add temp-stats workload-tracker version help" + [fdp]="feature version help" [transcend]="healthvalue badblock" [dapustor]="smart-log-add" [zns]="id-ctrl id-ns zone-mgmt-recv \ @@ -1633,6 +1715,7 @@ _nvme_subcmds () { [dera]="plugin_dera_opts" [sfx]="plugin_sfx_opts" [solidigm]="plugin_solidigm_opts" + [fdp]="plugin_fdp_opts" [transcend]="plugin_transcend_opts" [dapustor]="plugin_dapustor_opts" [zns]="plugin_zns_opts" @@ -1660,7 +1743,7 @@ _nvme_subcmds () { security-send security-recv get-lba-status \ resv-acquire resv-register resv-release \ resv-report dsm copy flush compare read \ - write write-zeros write-uncor verify \ + write write-zeroes write-uncor verify \ sanitize sanitize-log reset subsystem-reset \ ns-rescan show-regs discover connect-all \ connect disconnect disconnect-all gen-hostnqn \ @@ -1668,7 +1751,11 @@ _nvme_subcmds () { 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 \ - nvme-mi-recv nvme-mi-send get-reg set-reg" + nvme-mi-recv nvme-mi-send get-reg set-reg mgmt-addr-list-log \ + rotational-media-info-log changed-alloc-ns-list-log \ + io-mgmt-recv io-mgmt-send dispersed-ns-participating-nss-log \ + reachability-groups-log reachability-associations-log \ + host-discovery-log ave-discovery-log pull--ddc-req-log" # Add plugins: for plugin in "${!_plugin_subcmds[@]}"; do diff --git a/fabrics.c b/fabrics.c index eb90d98..ab17e17 100644 --- a/fabrics.c +++ b/fabrics.c @@ -681,6 +681,7 @@ static int nvme_read_config_checked(nvme_root_t r, const char *filename) return 0; } +/* returns negative errno values */ int nvmf_discover(const char *desc, int argc, char **argv, bool connect) { char *subsysnqn = NVME_DISC_SUBSYS_NAME; @@ -757,7 +758,7 @@ int nvmf_discover(const char *desc, int argc, char **argv, bool connect) if (ret < 0) { fprintf(stderr, "Failed to scan topology: %s\n", nvme_strerror(errno)); - return ret; + return -errno; } ret = nvme_host_get_ids(r, hostnqn, hostid, &hnqn, &hid); @@ -766,7 +767,7 @@ int nvmf_discover(const char *desc, int argc, char **argv, bool connect) h = nvme_lookup_host(r, hnqn, hid); if (!h) { - ret = ENOMEM; + ret = -ENOMEM; goto out_free; } @@ -781,10 +782,9 @@ int nvmf_discover(const char *desc, int argc, char **argv, bool connect) if (!device && !transport && !traddr) { if (!nonbft) - discover_from_nbft(r, hostnqn, hostid, - hnqn, hid, desc, connect, - &cfg, nbft_path, flags, verbose); - + ret = discover_from_nbft(r, hostnqn, hostid, + hnqn, hid, desc, connect, + &cfg, nbft_path, flags, verbose); if (nbft) goto out_free; @@ -876,7 +876,7 @@ int nvmf_discover(const char *desc, int argc, char **argv, bool connect) fprintf(stderr, "failed to add controller, error %s\n", nvme_strerror(errno)); - ret = errno; + ret = -errno; goto out_free; } } @@ -1189,6 +1189,11 @@ int nvmf_disconnect(const char *desc, int argc, char **argv) if (ret) return ret; + if (cfg.nqn && cfg.device) { + fprintf(stderr, + "Both device name [--device | -d] and NQN [--nqn | -n] are specified\n"); + return -EINVAL; + } if (!cfg.nqn && !cfg.device) { fprintf(stderr, "Neither device name [--device | -d] nor NQN [--nqn | -n] provided\n"); @@ -1430,7 +1435,7 @@ int nvmf_config(const char *desc, int argc, char **argv) return 0; } -static void dim_operation(nvme_ctrl_t c, enum nvmf_dim_tas tas, const char *name) +static int dim_operation(nvme_ctrl_t c, enum nvmf_dim_tas tas, const char *name) { static const char * const task[] = { [NVMF_DIM_TAS_REGISTER] = "register", @@ -1451,6 +1456,8 @@ static void dim_operation(nvme_ctrl_t c, enum nvmf_dim_tas tas, const char *name fprintf(stderr, "%s DIM %s command error. Result:0x%04x, Status:0x%04x - %s\n", name, t, result, status, nvme_status_to_string(status, false)); } + + return nvme_status_to_errno(status, true); } int nvmf_dim(const char *desc, int argc, char **argv) @@ -1530,9 +1537,8 @@ int nvmf_dim(const char *desc, int argc, char **argv) nvme_for_each_subsystem(h, s) { if (strcmp(nvme_subsystem_get_nqn(s), p)) continue; - nvme_subsystem_for_each_ctrl(s, c) { - dim_operation(c, tas, p); - } + nvme_subsystem_for_each_ctrl(s, c) + ret = dim_operation(c, tas, p); } } } @@ -1551,9 +1557,9 @@ int nvmf_dim(const char *desc, int argc, char **argv) p, nvme_strerror(errno)); return -errno; } - dim_operation(c, tas, p); + ret = dim_operation(c, tas, p); } } - return 0; + return ret; } diff --git a/meson.build b/meson.build index 0a9f690..b72368a 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.11', + version: '2.12', 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.11', required: true, +libnvme_dep = dependency('libnvme', version: '>=1.12', required: true, fallback : ['libnvme', 'libnvme_dep']) libnvme_mi_dep = dependency('libnvme-mi', required: true, fallback : ['libnvme', 'libnvme_mi_dep']) diff --git a/nbft.c b/nbft.c index f93b4a5..5c85245 100644 --- a/nbft.c +++ b/nbft.c @@ -282,6 +282,7 @@ static int do_discover(struct nbft_info_discovery *dd, return 0; } +/* returns negative errno values */ 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, @@ -290,7 +291,7 @@ int discover_from_nbft(nvme_root_t r, char *hostnqn_arg, char *hostid_arg, { char *hostnqn = NULL, *hostid = NULL, *host_traddr = NULL; nvme_host_t h; - int ret, i; + int ret, rr, i; struct list_head nbft_list; struct nbft_file_entry *entry = NULL; struct nbft_info_subsystem_ns **ss; @@ -298,7 +299,7 @@ int discover_from_nbft(nvme_root_t r, char *hostnqn_arg, char *hostid_arg, struct nbft_info_discovery **dd; if (!connect) - /* to do: print discovery-type info from NBFT tables */ + /* TODO: print discovery-type info from NBFT tables */ return 0; list_head_init(&nbft_list); @@ -306,6 +307,8 @@ int discover_from_nbft(nvme_root_t r, char *hostnqn_arg, char *hostid_arg, if (ret) { if (ret != -ENOENT) nvme_show_perror("Failed to access ACPI tables directory"); + else + ret = 0; /* nothing to connect */ goto out_free; } @@ -327,8 +330,10 @@ int discover_from_nbft(nvme_root_t r, char *hostnqn_arg, char *hostid_arg, } h = nvme_lookup_host(r, hostnqn, hostid); - if (!h) + if (!h) { + ret = -ENOENT; goto out_free; + } /* Subsystem Namespace Descriptor List */ for (ss = entry->nbft->subsystem_ns_list; ss && *ss; ss++) @@ -358,34 +363,37 @@ int discover_from_nbft(nvme_root_t r, char *hostnqn_arg, char *hostid_arg, .trsvcid = (*ss)->trsvcid, }; - ret = do_connect(r, h, NULL, *ss, &trcfg, - cfg, flags, verbose); + rr = do_connect(r, h, NULL, *ss, &trcfg, + cfg, flags, verbose); /* * With TCP/DHCP, it can happen that the OS * obtains a different local IP address than the * firmware had. Retry without host_traddr. */ - if (ret == -ENVME_CONNECT_ADDRNOTAVAIL && + if (rr == -ENVME_CONNECT_ADDRNOTAVAIL && !strcmp(trcfg.transport, "tcp") && strlen(hfi->tcp_info.dhcp_server_ipaddr) > 0) { trcfg.host_traddr = NULL; - ret = do_connect(r, h, NULL, *ss, &trcfg, - cfg, flags, verbose); + rr = do_connect(r, h, NULL, *ss, &trcfg, + cfg, flags, verbose); - if (ret == 0 && verbose >= 1) + if (rr == 0 && verbose >= 1) fprintf(stderr, "SSNS %d: connect with host_traddr=\"%s\" failed, success after omitting host_traddr\n", (*ss)->index, host_traddr); } - if (ret) + if (rr) { fprintf(stderr, "SSNS %d: no controller found\n", (*ss)->index); + /* report an error */ + ret = rr; + } - if (ret == -ENOMEM) + if (rr == -ENOMEM) goto out_free; } @@ -423,7 +431,7 @@ int discover_from_nbft(nvme_root_t r, char *hostnqn_arg, char *hostid_arg, host_traddr = hfi->tcp_info.ipaddr; if (uri->port > 0) { if (asprintf(&trsvcid, "%d", uri->port) < 0) { - errno = ENOMEM; + ret = -ENOMEM; goto out_free; } } else @@ -458,21 +466,25 @@ int discover_from_nbft(nvme_root_t r, char *hostnqn_arg, char *hostid_arg, "Discovery Descriptor %d: failed to add discovery controller: %s\n", (*dd)->index, nvme_strerror(errno)); - if (errno == ENOMEM) + if (errno == ENOMEM) { + ret = -ENOMEM; goto out_free; + } continue; } - ret = do_discover(*dd, r, h, c, cfg, &trcfg, - flags, verbose); + rr = do_discover(*dd, r, h, c, cfg, &trcfg, + flags, verbose); if (!persistent) nvme_disconnect_ctrl(c); nvme_free_ctrl(c); - if (ret == -ENOMEM) + if (rr == -ENOMEM) { + ret = rr; goto out_free; + } } } out_free: free_nbfts(&nbft_list); - return errno; + return ret; } diff --git a/nvme-builtin.h b/nvme-builtin.h index 00e361c..684f3fd 100644 --- a/nvme-builtin.h +++ b/nvme-builtin.h @@ -36,7 +36,7 @@ COMMAND_LIST( ENTRY("get-log", "Generic NVMe get log, returns log in raw format", get_log) ENTRY("telemetry-log", "Retrieve FW Telemetry log write to file", get_telemetry_log) ENTRY("fw-log", "Retrieve FW Log, show it", get_fw_log) - ENTRY("changed-ns-list-log", "Retrieve Changed Namespace List, show it", get_changed_ns_list_log) + ENTRY("changed-ns-list-log", "Retrieve Changed Attached Namespace List, show it", get_changed_attach_ns_list_log) ENTRY("smart-log", "Retrieve SMART Log, show it", get_smart_log) ENTRY("ana-log", "Retrieve ANA Log, show it", get_ana_log) ENTRY("error-log", "Retrieve Error Log, show it", get_error_log) @@ -58,6 +58,15 @@ COMMAND_LIST( ENTRY("mi-cmd-support-effects-log", "Retrieve MI Command Support and Effects log and show it", get_mi_cmd_support_effects_log) ENTRY("media-unit-stat-log", "Retrieve the configuration and wear of media units, show it", get_media_unit_stat_log) ENTRY("supported-cap-config-log", "Retrieve the list of Supported Capacity Configuration Descriptors", get_supp_cap_config_log) + ENTRY("mgmt-addr-list-log", "Retrieve Management Address List Log, show it", get_mgmt_addr_list_log) + ENTRY("rotational-media-info-log", "Retrieve Rotational Media Information Log, show it", get_rotational_media_info_log) + ENTRY("changed-alloc-ns-list-log", "Retrieve Changed Allocated Namespace List, show it", get_changed_alloc_ns_list_log) + ENTRY("dispersed-ns-participating-nss-log", "Retrieve Dispersed Namespace Participating NVM Subsystems Log, show it", get_dispersed_ns_participating_nss_log) + ENTRY("reachability-groups-log", "Retrieve Reachability Groups Log, show it", get_reachability_groups_log) + ENTRY("reachability-associations-log", "Retrieve Reachability Associations Log, show it", get_reachability_associations_log) + ENTRY("host-discovery-log", "Retrieve Host Discovery Log, show it", get_host_discovery_log) + ENTRY("ave-discovery-log", "Retrieve AVE Discovery Log, show it", get_ave_discovery_log) + ENTRY("pull-model-ddc-req-log", "Retrieve Pull Model DDC Request Log, show it", get_pull_model_ddc_req_log) ENTRY("set-feature", "Set a feature and show the resulting value", set_feature) ENTRY("set-property", "Set a property and show the resulting value", set_property) ENTRY("get-property", "Get a property and show the resulting value", get_property) diff --git a/nvme-print-binary.c b/nvme-print-binary.c index 33804f1..17dfb85 100644 --- a/nvme-print-binary.c +++ b/nvme-print-binary.c @@ -1,6 +1,8 @@ /* SPDX-License-Identifier: GPL-2.0-or-later */ #include "nvme-print.h" +#include "util/logging.h" +#include "common.h" static struct print_ops binary_print_ops; @@ -63,14 +65,12 @@ static void binary_boot_part_log(void *bp_log, const char *devname, d_raw((unsigned char *)bp_log, size); } -static void binary_phy_rx_eom_log(struct nvme_phy_rx_eom_log *log, - __u16 controller) +static void binary_phy_rx_eom_log(struct nvme_phy_rx_eom_log *log, __u16 controller) { - size_t len; + size_t len = le16_to_cpu(log->hsize); + if (log->eomip == NVME_PHY_RX_EOM_COMPLETED) - len = log->hsize + log->dsize * log->nd; - else - len = log->hsize; + len += (size_t)le32_to_cpu(log->dsize) * le16_to_cpu(log->nd); d_raw((unsigned char *)log, len); } @@ -233,8 +233,7 @@ static void binary_fw_log(struct nvme_firmware_slot *fw_log, d_raw((unsigned char *)fw_log, sizeof(*fw_log)); } -static void binary_changed_ns_list_log(struct nvme_ns_list *log, - const char *devname) +static void binary_changed_ns_list_log(struct nvme_ns_list *log, const char *devname, bool alloc) { d_raw((unsigned char *)log, sizeof(*log)); } @@ -307,6 +306,47 @@ static void binary_effects_log_pages(struct list_head *list) } } +static void binary_mgmt_addr_list_log(struct nvme_mgmt_addr_list_log *ma_list) +{ + d_raw((unsigned char *)ma_list, sizeof(*ma_list)); +} + +static void binary_rotational_media_info_log(struct nvme_rotational_media_info_log *info) +{ + d_raw((unsigned char *)info, sizeof(*info)); +} + +static void binary_dispersed_ns_psub_log(struct nvme_dispersed_ns_participating_nss_log *log) +{ + d_raw((unsigned char *)log, sizeof(*log) + le64_to_cpu(log->numpsub) * NVME_NQN_LENGTH); +} + +static void binary_reachability_groups_log(struct nvme_reachability_groups_log *log, __u64 len) +{ + d_raw((unsigned char *)log, len); +} + +static void binary_reachability_associations_log(struct nvme_reachability_associations_log *log, + __u64 len) +{ + d_raw((unsigned char *)log, len); +} + +static void binary_host_discovery_log(struct nvme_host_discover_log *log) +{ + d_raw((unsigned char *)log, le32_to_cpu(log->thdlpl)); +} + +static void binary_ave_discovery_log(struct nvme_ave_discover_log *log) +{ + d_raw((unsigned char *)log, le32_to_cpu(log->tadlpl)); +} + +static void binary_pull_model_ddc_req_log(struct nvme_pull_model_ddc_req_log *log) +{ + d_raw((unsigned char *)log, le32_to_cpu(log->tpdrpl)); +} + static struct print_ops binary_print_ops = { /* libnvme types.h print functions */ .ana_log = binary_ana_log, @@ -373,6 +413,14 @@ static struct print_ops binary_print_ops = { .d = NULL, .show_init = NULL, .show_finish = NULL, + .mgmt_addr_list_log = binary_mgmt_addr_list_log, + .rotational_media_info_log = binary_rotational_media_info_log, + .dispersed_ns_psub_log = binary_dispersed_ns_psub_log, + .reachability_groups_log = binary_reachability_groups_log, + .reachability_associations_log = binary_reachability_associations_log, + .host_discovery_log = binary_host_discovery_log, + .ave_discovery_log = binary_ave_discovery_log, + .pull_model_ddc_req_log = binary_pull_model_ddc_req_log, /* libnvme tree print functions */ .list_item = NULL, diff --git a/nvme-print-json.c b/nvme-print-json.c index 412eb20..4ac2414 100644 --- a/nvme-print-json.c +++ b/nvme-print-json.c @@ -3,10 +3,15 @@ #include <assert.h> #include <errno.h> #include <time.h> +#include <sys/types.h> +#include <sys/socket.h> +#include <arpa/inet.h> +#include <ccan/ccan/compiler/compiler.h> #include "nvme-print.h" #include "util/json.h" +#include "util/logging.h" #include "nvme.h" #include "common.h" @@ -28,6 +33,13 @@ #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 +#define obj_add_str json_object_add_value_string +#define obj_add_uint_02x json_object_add_uint_02x +#define obj_add_uint_0x json_object_add_uint_0x +#define obj_add_byte_array json_object_add_byte_array +#define obj_add_nprix64 json_object_add_nprix64 +#define obj_add_uint_0nx json_object_add_uint_0nx +#define obj_add_0nprix64 json_object_add_0nprix64 static const uint8_t zero_uuid[16] = { 0 }; static struct print_ops json_print_ops; @@ -74,27 +86,6 @@ static void obj_add_uint_x(struct json_object *o, const char *k, __u32 v) obj_add_str(o, k, str); } -void obj_add_uint_0x(struct json_object *o, const char *k, __u32 v) -{ - char str[STR_LEN]; - - sprintf(str, "0x%x", v); - obj_add_str(o, k, str); -} - -void obj_add_uint_0nx(struct json_object *o, const char *k, __u32 v, int width) -{ - char str[STR_LEN]; - - sprintf(str, "0x%0*x", width, v); - obj_add_str(o, k, str); -} - -void obj_add_uint_02x(struct json_object *o, const char *k, __u32 v) -{ - obj_add_uint_0nx(o, k, v, 2); -} - static void obj_add_uint_nx(struct json_object *o, const char *k, __u32 v) { char str[STR_LEN]; @@ -103,14 +94,6 @@ static void obj_add_uint_nx(struct json_object *o, const char *k, __u32 v) obj_add_str(o, k, str); } -void obj_add_nprix64(struct json_object *o, const char *k, uint64_t v) -{ - char str[STR_LEN]; - - sprintf(str, "%#"PRIx64"", v); - obj_add_str(o, k, str); -} - static void obj_add_prix64(struct json_object *o, const char *k, uint64_t v) { char str[STR_LEN]; @@ -203,9 +186,27 @@ static void obj_print(struct json_object *o) json_print(o); } +static void json_id_iocs_iocsc(struct json_object *obj_iocsc, __u64 iocsc) +{ + __u8 cpncs = NVME_GET(iocsc, IOCS_IOCSC_CPNCS); + __u8 slmcs = NVME_GET(iocsc, IOCS_IOCSC_SLMCS); + __u8 znscs = NVME_GET(iocsc, IOCS_IOCSC_ZNSCS); + __u8 kvcs = NVME_GET(iocsc, IOCS_IOCSC_KVCS); + __u8 nvmcs = NVME_GET(iocsc, IOCS_IOCSC_NVMCS); + + obj_add_str(obj_iocsc, "Computational Programs Namespace Command Set", cpncs ? + "Selected" : "Not selected"); + obj_add_str(obj_iocsc, "Subsystem Local Memory Command Set", slmcs ? + "Selected" : "Not selected"); + obj_add_str(obj_iocsc, "Zoned Namespace Command Set", znscs ? "Selected" : "Not selected"); + obj_add_str(obj_iocsc, "Key Value Command Set", kvcs ? "Selected" : "Not selected"); + obj_add_str(obj_iocsc, "NVM Command Set", nvmcs ? "Selected" : "Not selected"); +} + static void json_id_iocs(struct nvme_id_iocs *iocs) { struct json_object *r = json_create_object(); + struct json_object *obj_iocsc; char json_str[STR_LEN]; __u16 i; @@ -213,6 +214,11 @@ static void json_id_iocs(struct nvme_id_iocs *iocs) if (iocs->iocsc[i]) { sprintf(json_str, "I/O Command Set Combination[%u]", i); obj_add_uint64(r, json_str, le64_to_cpu(iocs->iocsc[i])); + + obj_iocsc = json_create_object(); + sprintf(json_str, "IOCSC%u", i); + json_id_iocs_iocsc(obj_iocsc, le64_to_cpu(iocs->iocsc[i])); + obj_add_obj(r, json_str, obj_iocsc); } } @@ -260,8 +266,6 @@ static void json_nvme_id_ns(struct nvme_id_ns *ns, unsigned int nsid, obj_add_int(r, "nabspf", le16_to_cpu(ns->nabspf)); obj_add_int(r, "noiob", le16_to_cpu(ns->noiob)); obj_add_uint128(r, "nvmcap", nvmcap); - obj_add_int(r, "nsattr", ns->nsattr); - obj_add_int(r, "nvmsetid", le16_to_cpu(ns->nvmsetid)); if (ns->nsfeat & 0x30) { obj_add_int(r, "npwg", le16_to_cpu(ns->npwg)); @@ -275,12 +279,16 @@ static void json_nvme_id_ns(struct nvme_id_ns *ns, unsigned int nsid, obj_add_int(r, "mssrl", le16_to_cpu(ns->mssrl)); obj_add_uint(r, "mcl", le32_to_cpu(ns->mcl)); obj_add_int(r, "msrc", ns->msrc); + obj_add_uint(r, "kpios", ns->kpios); } obj_add_int(r, "nulbaf", ns->nulbaf); if (!cap_only) { + obj_add_uint(r, "kpiodaag", le32_to_cpu(ns->kpiodaag)); obj_add_uint(r, "anagrpid", le32_to_cpu(ns->anagrpid)); + obj_add_int(r, "nsattr", ns->nsattr); + obj_add_int(r, "nvmsetid", le16_to_cpu(ns->nvmsetid)); obj_add_int(r, "endgid", le16_to_cpu(ns->endgid)); memset(eui64, 0, sizeof(eui64_buf)); @@ -293,8 +301,8 @@ static void json_nvme_id_ns(struct nvme_id_ns *ns, unsigned int nsid, for (i = 0; i < sizeof(ns->nguid); i++) nguid += sprintf(nguid, "%02x", ns->nguid[i]); - obj_add_str(r, "eui64", eui64_buf); obj_add_str(r, "nguid", nguid_buf); + obj_add_str(r, "eui64", eui64_buf); } obj_add_array(r, "lbafs", lbafs); @@ -350,11 +358,15 @@ void json_nvme_id_ctrl(struct nvme_id_ctrl *ctrl, obj_add_uint(r, "oaes", le32_to_cpu(ctrl->oaes)); obj_add_uint(r, "ctratt", le32_to_cpu(ctrl->ctratt)); obj_add_int(r, "rrls", le16_to_cpu(ctrl->rrls)); + obj_add_int(r, "bpcap", ctrl->bpcap); + obj_add_uint(r, "nssl", le32_to_cpu(ctrl->nssl)); + obj_add_int(r, "plsi", ctrl->plsi); obj_add_int(r, "cntrltype", ctrl->cntrltype); obj_add_str(r, "fguid", util_uuid_to_string(ctrl->fguid)); obj_add_int(r, "crdt1", le16_to_cpu(ctrl->crdt1)); obj_add_int(r, "crdt2", le16_to_cpu(ctrl->crdt2)); obj_add_int(r, "crdt3", le16_to_cpu(ctrl->crdt3)); + obj_add_int(r, "crcap", ctrl->crcap); obj_add_int(r, "nvmsr", ctrl->nvmsr); obj_add_int(r, "vwci", ctrl->vwci); obj_add_int(r, "mec", ctrl->mec); @@ -393,8 +405,11 @@ void json_nvme_id_ctrl(struct nvme_id_ctrl *ctrl, obj_add_uint(r, "nanagrpid", le32_to_cpu(ctrl->nanagrpid)); obj_add_uint(r, "pels", le32_to_cpu(ctrl->pels)); obj_add_int(r, "domainid", le16_to_cpu(ctrl->domainid)); + obj_add_int(r, "kpioc", ctrl->kpioc); + obj_add_int(r, "mptfawr", le16_to_cpu(ctrl->mptfawr)); obj_add_uint128(r, "megcap", megcap); obj_add_int(r, "tmpthha", ctrl->tmpthha); + obj_add_int(r, "cqt", le16_to_cpu(ctrl->cqt)); obj_add_int(r, "sqes", ctrl->sqes); obj_add_int(r, "cqes", ctrl->cqes); obj_add_int(r, "maxcmd", le16_to_cpu(ctrl->maxcmd)); @@ -414,6 +429,18 @@ void json_nvme_id_ctrl(struct nvme_id_ctrl *ctrl, obj_add_uint128(r, "maxdna", maxdna); obj_add_uint(r, "maxcna", le32_to_cpu(ctrl->maxcna)); obj_add_uint(r, "oaqd", le32_to_cpu(ctrl->oaqd)); + obj_add_int(r, "rhiri", ctrl->rhiri); + obj_add_int(r, "hirt", ctrl->hirt); + obj_add_int(r, "cmmrtd", le16_to_cpu(ctrl->cmmrtd)); + obj_add_int(r, "nmmrtd", le16_to_cpu(ctrl->nmmrtd)); + obj_add_int(r, "minmrtg", ctrl->minmrtg); + obj_add_int(r, "maxmrtg", ctrl->maxmrtg); + obj_add_int(r, "trattr", ctrl->trattr); + obj_add_int(r, "mcudmq", le16_to_cpu(ctrl->mcudmq)); + obj_add_int(r, "mnsudmq", le16_to_cpu(ctrl->mnsudmq)); + obj_add_int(r, "mcmr", le16_to_cpu(ctrl->mcmr)); + obj_add_int(r, "nmcmr", le16_to_cpu(ctrl->nmcmr)); + obj_add_int(r, "mcdqpc", le16_to_cpu(ctrl->mcdqpc)); if (strlen(subnqn)) obj_add_str(r, "subnqn", subnqn); @@ -431,8 +458,9 @@ void json_nvme_id_ctrl(struct nvme_id_ctrl *ctrl, struct json_object *psd = json_create_object(); obj_add_int(psd, "max_power", le16_to_cpu(ctrl->psd[i].mp)); - obj_add_int(psd, "max_power_scale", ctrl->psd[i].flags & 0x1); - obj_add_int(psd, "non-operational_state", (ctrl->psd[i].flags & 2) >> 1); + obj_add_int(psd, "max_power_scale", ctrl->psd[i].flags & NVME_PSD_FLAGS_MXPS); + obj_add_int(psd, "non-operational_state", + !!(ctrl->psd[i].flags & NVME_PSD_FLAGS_NOPS)); obj_add_uint(psd, "entry_lat", le32_to_cpu(ctrl->psd[i].enlat)); obj_add_uint(psd, "exit_lat", le32_to_cpu(ctrl->psd[i].exlat)); obj_add_int(psd, "read_tput", ctrl->psd[i].rrt); @@ -444,6 +472,12 @@ void json_nvme_id_ctrl(struct nvme_id_ctrl *ctrl, obj_add_int(psd, "active_power", le16_to_cpu(ctrl->psd[i].actp)); obj_add_int(psd, "active_power_work", ctrl->psd[i].apws & 7); obj_add_int(psd, "active_scale", nvme_psd_power_scale(ctrl->psd[i].apws)); + obj_add_int(psd, "emerg_power_fail_recover_time", ctrl->psd[i].epfrt); + obj_add_int(psd, "emerg_power_fail_recover_scale", ctrl->psd[i].epfr_fqv_ts & 0xf); + obj_add_int(psd, "force_quiesce_vault_time", ctrl->psd[i].fqvt); + obj_add_int(psd, "force_quiesce_vault_scale", ctrl->psd[i].epfr_fqv_ts >> 4); + obj_add_int(psd, "emerg_power_fail_vault_time", ctrl->psd[i].epfvt); + obj_add_int(psd, "emerg_power_fail_vault_scale", ctrl->psd[i].epfvts & 0xf); array_add_obj(psds, psd); } @@ -577,8 +611,7 @@ void json_fw_log(struct nvme_firmware_slot *fw_log, const char *devname) json_print(r); } -void json_changed_ns_list_log(struct nvme_ns_list *log, - const char *devname) +void json_changed_ns_list_log(struct nvme_ns_list *log, const char *devname, bool alloc) { struct json_object *r = json_create_object(); struct json_object *nsi = json_create_object(); @@ -587,10 +620,13 @@ void json_changed_ns_list_log(struct nvme_ns_list *log, __u32 nsid; int i; + _cleanup_free_ char *k = NULL; + if (log->ns[0] == cpu_to_le32(0xffffffff)) return; - obj_add_str(r, "Changed Namespace List Log", devname); + if (asprintf(&k, "Changed %s Namespace List Log", alloc ? "Allocated" : "Attached") > 0) + obj_add_str(r, k, devname); for (i = 0; i < NVME_ID_NS_LIST_MAX; i++) { nsid = le32_to_cpu(log->ns[i]); @@ -1137,42 +1173,43 @@ static void json_registers_bpinfo(uint32_t bpinfo, struct json_object *r) { obj_add_uint_x(r, "bpinfo", bpinfo); - obj_add_uint(r, "Active Boot Partition ID (ABPID)", (bpinfo & 0x80000000) >> 31); - json_registers_bpinfo_brs((bpinfo & 0x3000000) >> 24, r); - obj_add_uint(r, "Boot Partition Size (BPSZ)", bpinfo & 0x7fff); + obj_add_uint(r, "Active Boot Partition ID (ABPID)", NVME_BPINFO_ABPID(bpinfo)); + json_registers_bpinfo_brs(NVME_BPINFO_BRS(bpinfo), r); + obj_add_uint(r, "Boot Partition Size (BPSZ)", NVME_BPINFO_BPSZ(bpinfo)); } static void json_registers_bprsel(uint32_t bprsel, struct json_object *r) { obj_add_uint_x(r, "bprsel", bprsel); - obj_add_uint(r, "Boot Partition Identifier (BPID)", (bprsel & 0x80000000) >> 31); - obj_add_uint_x(r, "Boot Partition Read Offset (BPROF)", (bprsel & 0x3ffffc00) >> 10); - obj_add_uint_x(r, "Boot Partition Read Size (BPRSZ)", bprsel & 0x3ff); + obj_add_uint(r, "Boot Partition Identifier (BPID)", NVME_BPRSEL_BPID(bprsel)); + obj_add_uint_x(r, "Boot Partition Read Offset (BPROF)", NVME_BPRSEL_BPROF(bprsel)); + obj_add_uint_x(r, "Boot Partition Read Size (BPRSZ)", NVME_BPRSEL_BPRSZ(bprsel)); } static void json_registers_bpmbl(uint64_t bpmbl, struct json_object *r) { obj_add_prix64(r, "bpmbl", bpmbl); - obj_add_prix64(r, "Boot Partition Memory Buffer Base Address (BMBBA)", bpmbl); + obj_add_prix64(r, "Boot Partition Memory Buffer Base Address (BMBBA)", + (uint64_t)NVME_BPMBL_BMBBA(bpmbl)); } static void json_registers_cmbmsc(uint64_t cmbmsc, struct json_object *r) { obj_add_prix64(r, "cmbmsc", cmbmsc); - obj_add_prix64(r, "Controller Base Address (CBA)", (cmbmsc & 0xfffffffffffff000) >> 12); - obj_add_prix64(r, "Controller Memory Space Enable (CMSE)", (cmbmsc & 2) >> 1); + obj_add_prix64(r, "Controller Base Address (CBA)", (uint64_t)NVME_CMBMSC_CBA(cmbmsc)); + obj_add_prix64(r, "Controller Memory Space Enable (CMSE)", NVME_CMBMSC_CMSE(cmbmsc)); obj_add_str(r, "Capabilities Registers Enabled (CRE)", - cmbmsc & 1 ? "Enabled" : "Not enabled"); + NVME_CMBMSC_CRE(cmbmsc) ? "Enabled" : "Not enabled"); } static void json_registers_cmbsts(uint32_t cmbsts, struct json_object *r) { obj_add_uint_x(r, "cmbsts", cmbsts); - obj_add_uint_x(r, "Controller Base Address Invalid (CBAI)", cmbsts & 1); + obj_add_uint_x(r, "Controller Base Address Invalid (CBAI)", NVME_CMBSTS_CBAI(cmbsts)); } static void json_registers_cmbebs(uint32_t cmbebs, struct json_object *r) @@ -1181,11 +1218,11 @@ static void json_registers_cmbebs(uint32_t cmbebs, struct json_object *r) 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_uint_nx(r, "CMB Elasticity Buffer Size Base (CMBWBZ)", NVME_CMBEBS_CMBWBZ(cmbebs)); + sprintf(buffer, "%s", NVME_CMBEBS_RBB(cmbebs) ? "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)); + nvme_register_unit_to_string(NVME_CMBEBS_CMBSZU(cmbebs))); } static void json_registers_cmbswtp(uint32_t cmbswtp, struct json_object *r) @@ -1194,8 +1231,9 @@ static void json_registers_cmbswtp(uint32_t cmbswtp, struct json_object *r) 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_uint_nx(r, "CMB Sustained Write Throughput (CMBSWTV)", + NVME_CMBSWTP_CMBSWTV(cmbswtp)); + sprintf(str, "%s/second", nvme_register_unit_to_string(NVME_CMBSWTP_CMBSWTU(cmbswtp))); obj_add_str(r, "CMB Sustained Write Throughput Units (CMBSWTU)", str); } @@ -1375,19 +1413,22 @@ static void json_sanitize_log(struct nvme_sanitize_log_page *sanitize_log, struct json_object *r = json_create_object(); struct json_object *dev = json_create_object(); struct json_object *sstat = json_create_object(); + struct json_object *ssi = json_create_object(); const char *status_str; + __u16 status, sos; + __u8 fails, sans; char str[128]; - __u16 status = le16_to_cpu(sanitize_log->sstat); + + status = le16_to_cpu(sanitize_log->sstat); obj_add_int(dev, "sprog", le16_to_cpu(sanitize_log->sprog)); - obj_add_int(sstat, "global_erased", (status & NVME_SANITIZE_SSTAT_GLOBAL_DATA_ERASED) >> 8); - obj_add_int(sstat, "no_cmplted_passes", - (status >> NVME_SANITIZE_SSTAT_COMPLETED_PASSES_SHIFT) & - NVME_SANITIZE_SSTAT_COMPLETED_PASSES_MASK); + obj_add_int(sstat, "media_verification_canceled", NVME_GET(status, SANITIZE_SSTAT_MVCNCLD)); + obj_add_int(sstat, "global_erased", NVME_GET(status, SANITIZE_SSTAT_GLOBAL_DATA_ERASED)); + obj_add_int(sstat, "no_cmplted_passes", NVME_GET(status, SANITIZE_SSTAT_COMPLETED_PASSES)); + sos = NVME_GET(status, SANITIZE_SSTAT_STATUS); status_str = nvme_sstat_status_to_string(status); - sprintf(str, "(%d) %s", status & NVME_SANITIZE_SSTAT_STATUS_MASK, - status_str); + sprintf(str, "(%d) %s", sos, status_str); obj_add_str(sstat, "status", str); obj_add_obj(dev, "sstat", sstat); @@ -1398,7 +1439,21 @@ static void json_sanitize_log(struct nvme_sanitize_log_page *sanitize_log, obj_add_uint(dev, "time_over_write_no_dealloc", le32_to_cpu(sanitize_log->etond)); obj_add_uint(dev, "time_block_erase_no_dealloc", le32_to_cpu(sanitize_log->etbend)); obj_add_uint(dev, "time_crypto_erase_no_dealloc", le32_to_cpu(sanitize_log->etcend)); + obj_add_uint(dev, "time_post_verification_dealloc", le32_to_cpu(sanitize_log->etpvds)); + sans = NVME_GET(sanitize_log->ssi, SANITIZE_SSI_SANS); + status_str = nvme_ssi_state_to_string(sans); + sprintf(str, "(%d) %s", sans, status_str); + obj_add_str(ssi, "sanitize_state", str); + + if (sos == NVME_SANITIZE_SSTAT_STATUS_COMPLETED_FAILED) { + fails = NVME_GET(sanitize_log->ssi, SANITIZE_SSI_FAILS); + status_str = nvme_ssi_state_to_string(fails); + sprintf(str, "(%d) %s", fails, status_str); + obj_add_str(ssi, "failure_state", str); + } + + obj_add_obj(dev, "sanitize_state_information", ssi); obj_add_obj(r, devname, dev); json_print(r); @@ -2944,6 +2999,8 @@ static void json_nvme_id_ns_descs(void *data, unsigned int nsid) static void json_nvme_id_ctrl_nvm(struct nvme_id_ctrl_nvm *ctrl_nvm) { struct json_object *r = json_create_object(); + __u16 rsvd = (ctrl_nvm->aocs & 0xfffe) >> 1; + __u8 ralbas = ctrl_nvm->aocs & 0x1; obj_add_uint(r, "vsl", ctrl_nvm->vsl); obj_add_uint(r, "wzsl", ctrl_nvm->wzsl); @@ -2951,15 +3008,17 @@ 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, "kpiocap", ctrl_nvm->kpiocap); + obj_add_uint(r, "wzdsl", ctrl_nvm->wzdsl); obj_add_uint(r, "aocs", le16_to_cpu(ctrl_nvm->aocs)); - __u16 rsvd = (ctrl_nvm->aocs & 0xfffe) >> 1; - __u8 ralbas = ctrl_nvm->aocs & 0x1; - if (rsvd) obj_add_uint(r, "[15:1]: Reserved", rsvd); obj_add_uint(r, "[0:0]: Reporting Allocated LBA Supported", ralbas); + obj_add_uint(r, "ver", le32_to_cpu(ctrl_nvm->ver)); + obj_add_uint(r, "lbamqf", ctrl_nvm->lbamqf); + json_print(r); } @@ -3294,24 +3353,36 @@ static void json_feature_show_fields_write_atomic(struct json_object *r, unsigne static void json_feature_show_fields_async_event(struct json_object *r, unsigned int result) { - obj_add_str(r, "Discovery Log Page Change Notices", (result & 0x80000000) >> 31 ? - "Send async event" : "Do not send async event"); - obj_add_str(r, "Endurance Group Event Aggregate Log Change Notices", (result & 0x4000) >> 14 ? - "Send async event" : "Do not send async event"); - obj_add_str(r, "LBA Status Information Notices", (result & 0x2000) >> 13 ? - "Send async event" : "Do not send async event"); + const char *async = "Send async event"; + const char *no_async = "Do not send async event"; + + obj_add_str(r, "Discovery Log Page Change Notices", NVME_FEAT_AE_DLPCN(result) ? + async : no_async); + obj_add_str(r, "Host Discovery Log Page Change Notification", NVME_FEAT_AE_HDLPCN(result) ? + async : no_async); + obj_add_str(r, "AVE Discovery Log Page Change Notification", NVME_FEAT_AE_ADLPCN(result) ? + async : no_async); + obj_add_str(r, "Pull Model DDC Request Log Page Change Notification", + NVME_FEAT_AE_PMDRLPCN(result) ? async : no_async); + obj_add_str(r, "Zone Descriptor Changed Notices", NVME_FEAT_AE_ZDCN(result) ? + async : no_async); + obj_add_str(r, "Reachability Group", NVME_FEAT_AE_RGRP0(result) ? async : no_async); + obj_add_str(r, "Reachability Association", NVME_FEAT_AE_RASSN(result) ? async : no_async); + obj_add_str(r, "Normal NVM Subsystem Shutdown", NVME_FEAT_AE_NNSSHDN(result) ? + async : no_async); + obj_add_str(r, "Endurance Group Event Aggregate Log Change Notices", + NVME_FEAT_AE_EGA(result) ? async : no_async); + obj_add_str(r, "LBA Status Information Notices", NVME_FEAT_AE_LBAS(result) ? + async : no_async); obj_add_str(r, "Predictable Latency Event Aggregate Log Change Notices", - (result & 0x1000) >> 12 ? "Send async event" : "Do not send async event"); - obj_add_str(r, "Asymmetric Namespace Access Change Notices", (result & 0x800) >> 11 ? - "Send async event" : "Do not send async event"); - obj_add_str(r, "Telemetry Log Notices", (result & 0x400) >> 10 ? "Send async event" : - "Do not send async event"); - obj_add_str(r, "Firmware Activation Notices", (result & 0x200) >> 9 ? "Send async event" : - "Do not send async event"); - obj_add_str(r, "Namespace Attribute Notices", (result & 0x100) >> 8 ? "Send async event" : - "Do not send async event"); - obj_add_str(r, "SMART / Health Critical Warnings", result & 0xff ? "Send async event" : - "Do not send async event"); + NVME_FEAT_AE_PLA(result) ? async : no_async); + obj_add_str(r, "Asymmetric Namespace Access Change Notices", NVME_FEAT_AE_ANA(result) ? + async : no_async); + obj_add_str(r, "Telemetry Log Notices", NVME_FEAT_AE_TELEM(result) ? async : no_async); + obj_add_str(r, "Firmware Activation Notices", NVME_FEAT_AE_FW(result) ? async : no_async); + obj_add_str(r, "Namespace Attribute Notices", NVME_FEAT_AE_NAN(result) ? async : no_async); + obj_add_str(r, "SMART / Health Critical Warnings", NVME_FEAT_AE_SMART(result) ? + async : no_async); } static void json_auto_pst(struct nvme_feat_auto_pst *apst, struct json_object *r) @@ -3470,8 +3541,25 @@ static void json_feature_show_fields_lba_sts_interval(struct json_object *r, uns static void json_feature_show_fields_host_behavior(struct json_object *r, unsigned char *buf) { - if (buf) + if (buf) { + struct nvme_feat_host_behavior *host = (struct nvme_feat_host_behavior *)buf; + obj_add_str(r, "Host Behavior Support", buf[0] & 0x1 ? "True" : "False"); + obj_add_str(r, "Advanced Command Retry Enable (ACRE)", host->acre ? + "True" : "False"); + obj_add_str(r, "Extended Telemetry Data Area 4 Supported (ETDAS)", host->etdas ? + "True" : "False"); + obj_add_str(r, "LBA Format Extension Enable (LBAFEE)", host->lbafee ? + "True" : "False"); + obj_add_str(r, "Host Dispersed Namespace Support (HDISNS)", host->hdisns ? + "Enabled" : "Disabled"); + obj_add_str(r, "Copy Descriptor Format 2h Enable (CDF2E)", host->cdfe & (1 << 2) ? + "True" : "False"); + obj_add_str(r, "Copy Descriptor Format 3h Enable (CDF3E)", host->cdfe & (1 << 3) ? + "True" : "False"); + obj_add_str(r, "Copy Descriptor Format 4h Enable (CDF4E)", host->cdfe & (1 << 4) ? + "True" : "False"); + } } static void json_feature_show_fields_sanitize(struct json_object *r, unsigned int result) @@ -3495,6 +3583,12 @@ static void json_feature_show_fields_spinup_control(struct json_object *r, unsig obj_add_str(r, "Spinup control feature Enabled", result & 1 ? "True" : "False"); } +static void json_feature_show_fields_power_loss_signal(struct json_object *r, unsigned int result) +{ + obj_add_str(r, "Power Loss Signaling Mode (PLSM)", + nvme_pls_mode_to_string(NVME_GET(result, FEAT_PLS_MODE))); +} + static void json_host_metadata(struct json_object *r, enum nvme_features_id fid, struct nvme_host_metadata *data) { @@ -3705,6 +3799,9 @@ static void json_feature_show_fields(enum nvme_features_id fid, unsigned int res case NVME_FEAT_FID_SPINUP_CONTROL: json_feature_show_fields_spinup_control(r, result); break; + case NVME_FEAT_FID_POWER_LOSS_SIGNAL: + json_feature_show_fields_power_loss_signal(r, result); + break; case NVME_FEAT_FID_ENH_CTRL_METADATA: case NVME_FEAT_FID_CTRL_METADATA: case NVME_FEAT_FID_NS_METADATA: @@ -4568,6 +4665,268 @@ void json_show_finish(void) json_r = NULL; } +static void json_mgmt_addr_list_log(struct nvme_mgmt_addr_list_log *ma_list) +{ + int i; + bool reserved = true; + struct json_object *r = json_create_object(); + struct json_object *mad; + struct json_object *mat; + char json_str[STR_LEN]; + + for (i = 0; i < ARRAY_SIZE(ma_list->mad); i++) { + switch (ma_list->mad[i].mat) { + case 1: + case 2: + mad = json_create_object(); + mat = json_create_object(); + obj_add_str(mat, "definition", ma_list->mad[i].mat == 1 ? + "NVM subsystem management agent" : "fabric interface manager"); + snprintf(json_str, sizeof(json_str), "type: %d", ma_list->mad[i].mat); + obj_add_obj(mad, json_str, mat); + obj_add_str(mad, "address", (const char *)ma_list->mad[i].madrs); + snprintf(json_str, sizeof(json_str), "descriptor: %d", i); + obj_add_obj(r, json_str, mad); + reserved = false; + break; + case 0xff: + goto out; + default: + break; + } + } + +out: + if (reserved) + obj_add_str(r, "list", "All management address descriptors reserved"); + + json_print(r); +} + +static void json_rotational_media_info_log(struct nvme_rotational_media_info_log *info) +{ + struct json_object *r = json_create_object(); + + obj_add_uint(r, "endgid", le16_to_cpu(info->endgid)); + obj_add_uint(r, "numa", le16_to_cpu(info->numa)); + obj_add_uint(r, "nrs", le16_to_cpu(info->nrs)); + obj_add_uint(r, "spinc", le32_to_cpu(info->spinc)); + obj_add_uint(r, "fspinc", le32_to_cpu(info->fspinc)); + obj_add_uint(r, "ldc", le32_to_cpu(info->ldc)); + obj_add_uint(r, "fldc", le32_to_cpu(info->fldc)); + + json_print(r); +} + +static void json_dispersed_ns_psub_log(struct nvme_dispersed_ns_participating_nss_log *log) +{ + struct json_object *r = json_create_object(); + __u64 numpsub = le64_to_cpu(log->numpsub); + __u64 i; + char json_str[STR_LEN]; + char psub[NVME_NQN_LENGTH + 1]; + + obj_add_uint64(r, "genctr", le64_to_cpu(log->genctr)); + obj_add_uint64(r, "numpsub", numpsub); + for (i = 0; i < numpsub; i++) { + snprintf(json_str, sizeof(json_str), "participating_nss %"PRIu64"", (uint64_t)i); + snprintf(psub, sizeof(psub), "%-.*s", NVME_NQN_LENGTH, + &log->participating_nss[i * NVME_NQN_LENGTH]); + obj_add_str(r, json_str, psub); + } + + json_print(r); +} + +static void json_reachability_groups_log(struct nvme_reachability_groups_log *log, __u64 len UNUSED) +{ + struct json_object *r = json_create_object(); + __u16 i; + __u32 j; + char json_str[STR_LEN]; + struct json_object *rgd; + + obj_add_uint64(r, "chngc", le64_to_cpu(log->chngc)); + obj_add_uint(r, "nrgd", le16_to_cpu(log->nrgd)); + + for (i = 0; i < le16_to_cpu(log->nrgd); i++) { + snprintf(json_str, sizeof(json_str), "rgid: %u", le32_to_cpu(log->rgd[i].rgid)); + rgd = json_create_object(); + obj_add_uint(rgd, "nnid", le32_to_cpu(log->rgd[i].nnid)); + obj_add_uint64(rgd, "chngc", le64_to_cpu(log->rgd[i].chngc)); + for (j = 0; j < le32_to_cpu(log->rgd[i].nnid); j++) + obj_add_uint(rgd, "nnid", le32_to_cpu(log->rgd[i].nsid[j])); + obj_add_obj(r, json_str, rgd); + } + + json_print(r); +} + +static void json_reachability_associations_log(struct nvme_reachability_associations_log *log, + __u64 len UNUSED) +{ + struct json_object *r = json_create_object(); + __u16 i; + __u32 j; + char json_str[STR_LEN]; + struct json_object *rad; + + obj_add_uint64(r, "chngc", le64_to_cpu(log->chngc)); + obj_add_uint(r, "nrad", le16_to_cpu(log->nrad)); + + for (i = 0; i < le16_to_cpu(log->nrad); i++) { + snprintf(json_str, sizeof(json_str), "rasid: %u", le32_to_cpu(log->rad[i].rasid)); + rad = json_create_object(); + obj_add_uint(rad, "nrid", le32_to_cpu(log->rad[i].nrid)); + obj_add_uint64(rad, "chngc", le64_to_cpu(log->rad[i].chngc)); + obj_add_uint(rad, "rac", log->rad[i].rac); + for (j = 0; j < le32_to_cpu(log->rad[i].nrid); j++) + obj_add_uint(rad, "rgid", le32_to_cpu(log->rad[i].rgid[j])); + obj_add_obj(r, json_str, rad); + } + + json_print(r); +} + +static void json_host_discovery_log(struct nvme_host_discover_log *log) +{ + struct json_object *r = json_create_object(); + __u32 i; + __u16 j; + struct nvme_host_ext_discover_log *hedlpe; + struct nvmf_ext_attr *exat; + __u32 thdlpl = le32_to_cpu(log->thdlpl); + __u32 tel; + __u16 numexat; + char json_str[STR_LEN]; + struct json_object *hedlpe_o; + struct json_object *tsas_o; + struct json_object *exat_o; + int n = 0; + + obj_add_uint64(r, "genctr", le64_to_cpu(log->genctr)); + obj_add_uint64(r, "numrec", le64_to_cpu(log->numrec)); + obj_add_uint(r, "recfmt", le16_to_cpu(log->recfmt)); + obj_add_uint_02x(r, "hdlpf", log->hdlpf); + obj_add_uint(r, "thdlpl", thdlpl); + + for (i = sizeof(*log); i < le32_to_cpu(log->thdlpl); i += tel) { + hedlpe_o = json_create_object(); + hedlpe = (void *)log + i; + tel = le32_to_cpu(hedlpe->tel); + numexat = le16_to_cpu(hedlpe->numexat); + obj_add_str(hedlpe_o, "trtype", nvmf_trtype_str(hedlpe->trtype)); + obj_add_str(hedlpe_o, "adrfam", + strlen(hedlpe->traddr) ? nvmf_adrfam_str(hedlpe->adrfam) : ""); + obj_add_str(hedlpe_o, "eflags", nvmf_eflags_str(le16_to_cpu(hedlpe->eflags))); + obj_add_str(hedlpe_o, "hostnqn", hedlpe->hostnqn); + obj_add_str(hedlpe_o, "traddr", hedlpe->traddr); + tsas_o = json_create_object(); + switch (hedlpe->trtype) { + case NVMF_TRTYPE_RDMA: + obj_add_str(tsas_o, "prtype", nvmf_prtype_str(hedlpe->tsas.rdma.prtype)); + obj_add_str(tsas_o, "qptype", nvmf_qptype_str(hedlpe->tsas.rdma.qptype)); + obj_add_str(tsas_o, "cms", nvmf_cms_str(hedlpe->tsas.rdma.cms)); + obj_add_uint_0nx(tsas_o, "pkey", le16_to_cpu(hedlpe->tsas.rdma.pkey), 4); + break; + case NVMF_TRTYPE_TCP: + obj_add_str(tsas_o, "sectype", nvmf_sectype_str(hedlpe->tsas.tcp.sectype)); + break; + default: + obj_d(tsas_o, "common", (unsigned char *)hedlpe->tsas.common, + sizeof(hedlpe->tsas.common), 16, 1); + break; + } + obj_add_obj(hedlpe_o, "tsas", tsas_o); + obj_add_uint(hedlpe_o, "tel", tel); + obj_add_uint(hedlpe_o, "numexat", numexat); + + exat = hedlpe->exat; + for (j = 0; j < numexat; j++) { + exat_o = json_create_object(); + snprintf(json_str, sizeof(json_str), "exat: %d", j); + obj_add_uint(exat_o, "exattype", le16_to_cpu(exat->exattype)); + obj_add_uint(exat_o, "exatlen", le16_to_cpu(exat->exatlen)); + obj_d(exat_o, "exatval", (unsigned char *)exat->exatval, + le16_to_cpu(exat->exatlen), 16, 1); + obj_add_obj(hedlpe_o, json_str, exat_o); + exat = nvmf_exat_ptr_next(exat); + } + snprintf(json_str, sizeof(json_str), "hedlpe: %d", n++); + obj_add_obj(r, json_str, hedlpe_o); + } +} + +static void obj_add_traddr(struct json_object *o, const char *k, __u8 adrfam, __u8 *traddr) +{ + int af = AF_INET; + socklen_t size = INET_ADDRSTRLEN; + char dst[INET6_ADDRSTRLEN]; + + if (adrfam == NVMF_ADDR_FAMILY_IP6) { + af = AF_INET6; + size = INET6_ADDRSTRLEN; + } + + if (inet_ntop(af, nvmf_adrfam_str(adrfam), dst, size)) + obj_add_str(o, k, dst); +} + +static void json_ave_discovery_log(struct nvme_ave_discover_log *log) +{ + struct json_object *r = json_create_object(); + __u32 i; + __u8 j; + struct nvme_ave_discover_log_entry *adlpe; + struct nvme_ave_tr_record *atr; + __u32 tadlpl = le32_to_cpu(log->tadlpl); + __u32 tel; + __u8 numatr; + int n = 0; + char json_str[STR_LEN]; + struct json_object *adlpe_o; + struct json_object *atr_o; + + obj_add_uint64(r, "genctr", le64_to_cpu(log->genctr)); + obj_add_uint64(r, "numrec", le64_to_cpu(log->numrec)); + obj_add_uint(r, "recfmt", le16_to_cpu(log->recfmt)); + obj_add_uint(r, "thdlpl", tadlpl); + + for (i = sizeof(*log); i < le32_to_cpu(log->tadlpl); i += tel) { + adlpe_o = json_create_object(); + adlpe = (void *)log + i; + tel = le32_to_cpu(adlpe->tel); + numatr = adlpe->numatr; + obj_add_uint(adlpe_o, "tel", tel); + obj_add_str(adlpe_o, "avenqn", adlpe->avenqn); + obj_add_uint(adlpe_o, "numatr", numatr); + + atr = adlpe->atr; + for (j = 0; j < numatr; j++) { + atr_o = json_create_object(); + snprintf(json_str, sizeof(json_str), "atr: %d", j); + obj_add_str(atr_o, "aveadrfam", nvmf_adrfam_str(atr->aveadrfam)); + obj_add_uint(atr_o, "avetrsvcid", le16_to_cpu(atr->avetrsvcid)); + obj_add_traddr(atr_o, "avetraddr", atr->aveadrfam, atr->avetraddr); + obj_add_obj(adlpe_o, json_str, atr_o); + atr++; + } + snprintf(json_str, sizeof(json_str), "adlpe: %d", n++); + obj_add_obj(r, json_str, adlpe_o); + } +} + +static void json_pull_model_ddc_req_log(struct nvme_pull_model_ddc_req_log *log) +{ + struct json_object *r = json_create_object(); + __u32 tpdrpl = le32_to_cpu(log->tpdrpl); + __u32 osp_len = tpdrpl - offsetof(struct nvme_pull_model_ddc_req_log, osp); + + obj_add_uint(r, "ori", log->ori); + printf("tpdrpl: %u\n", tpdrpl); + obj_d(r, "osp", (unsigned char *)log->osp, osp_len, 16, 1); +} + static struct print_ops json_print_ops = { /* libnvme types.h print functions */ .ana_log = json_ana_log, @@ -4635,6 +4994,14 @@ static struct print_ops json_print_ops = { .d = json_d, .show_init = json_show_init, .show_finish = json_show_finish, + .mgmt_addr_list_log = json_mgmt_addr_list_log, + .rotational_media_info_log = json_rotational_media_info_log, + .dispersed_ns_psub_log = json_dispersed_ns_psub_log, + .reachability_groups_log = json_reachability_groups_log, + .reachability_associations_log = json_reachability_associations_log, + .host_discovery_log = json_host_discovery_log, + .ave_discovery_log = json_ave_discovery_log, + .pull_model_ddc_req_log = json_pull_model_ddc_req_log, /* libnvme tree print functions */ .list_item = json_list_item, @@ -4656,36 +5023,3 @@ 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-stdout.c b/nvme-print-stdout.c index 1fdcb9b..e87c605 100644 --- a/nvme-print-stdout.c +++ b/nvme-print-stdout.c @@ -6,7 +6,9 @@ #include <stdlib.h> #include <time.h> #include <sys/stat.h> - +#include <sys/types.h> +#include <sys/socket.h> +#include <arpa/inet.h> #include <ccan/ccan/strset/strset.h> #include <ccan/ccan/htable/htable_type.h> #include <ccan/ccan/htable/htable.h> @@ -18,6 +20,7 @@ #include "nvme-models.h" #include "util/suffix.h" #include "util/types.h" +#include "util/logging.h" #include "common.h" static const uint8_t zero_uuid[16] = { 0 }; @@ -246,91 +249,255 @@ static void stdout_add_bitmap(int i, __u8 seb) } } -static void stdout_persistent_event_log_fdp_events(unsigned int cdw11, - unsigned int cdw12, +static void stdout_persistent_event_log_fdp_events(unsigned int cdw11, unsigned int cdw12, unsigned char *buf) { - unsigned int num = (cdw11 >> 16) & 0xff; + unsigned int num = NVME_GET(cdw11, FEAT_FDPE_NOET); for (unsigned int i = 0; i < num; i++) { - printf("\t%-53s: %sEnabled\n", nvme_fdp_event_to_string(buf[0]), - cdw12 & 0x1 ? "" : "Not "); + printf("\t%-53s: %sEnabled\n", nvme_fdp_event_to_string(buf[i]), + NVME_GET(cdw12, FDP_SUPP_EVENT_ENABLED) ? "" : "Not "); } } -static void stdout_persistent_event_log(void *pevent_log_info, - __u8 action, __u32 size, +static void pel_header(struct nvme_persistent_event_log *pevent_log_head, int human) +{ + printf("Log Identifier: %u\n", pevent_log_head->lid); + printf("Total Number of Events: %u\n", le32_to_cpu(pevent_log_head->tnev)); + printf("Total Log Length : %"PRIu64"\n", le64_to_cpu(pevent_log_head->tll)); + printf("Log Revision: %u\n", pevent_log_head->rv); + printf("Log Header Length: %u\n", pevent_log_head->lhl); + printf("Timestamp: %"PRIu64"\n", le64_to_cpu(pevent_log_head->ts)); + printf("Power On Hours (POH): %s", + uint128_t_to_l10n_string(le128_to_cpu(pevent_log_head->poh))); + printf("Power Cycle Count: %"PRIu64"\n", le64_to_cpu(pevent_log_head->pcc)); + printf("PCI Vendor ID (VID): %u\n", le16_to_cpu(pevent_log_head->vid)); + printf("PCI Subsystem Vendor ID (SSVID): %u\n", le16_to_cpu(pevent_log_head->ssvid)); + printf("Serial Number (SN): %-.*s\n", (int)sizeof(pevent_log_head->sn), + pevent_log_head->sn); + printf("Model Number (MN): %-.*s\n", (int)sizeof(pevent_log_head->mn), pevent_log_head->mn); + printf("NVM Subsystem NVMe Qualified Name (SUBNQN): %-.*s\n", + (int)sizeof(pevent_log_head->subnqn), pevent_log_head->subnqn); + printf("Generation Number: %u\n", le16_to_cpu(pevent_log_head->gen_number)); + printf("Reporting Context Information (RCI): %u\n", le32_to_cpu(pevent_log_head->rci)); + + if (human) + stdout_persistent_event_log_rci(pevent_log_head->rci); + + printf("Supported Events Bitmap:\n"); + for (int i = 0; i < 32; i++) { + if (!pevent_log_head->seb[i]) + continue; + stdout_add_bitmap(i, pevent_log_head->seb[i]); + } +} + +static void pel_event_header(int i, struct nvme_persistent_event_entry *pevent_entry_head, + int human) +{ + printf("Event Number: %u\n", i); + printf("Event Type: %s\n", nvme_pel_event_to_string(pevent_entry_head->etype)); + printf("Event Type Revision: %u\n", pevent_entry_head->etype_rev); + printf("Event Header Length: %u\n", pevent_entry_head->ehl); + printf("Event Header Additional Info: %u\n", pevent_entry_head->ehai); + + if (human) + stdout_persistent_event_entry_ehai(pevent_entry_head->ehai); + + printf("Controller Identifier: %u\n", le16_to_cpu(pevent_entry_head->cntlid)); + printf("Event Timestamp: %"PRIu64"\n", le64_to_cpu(pevent_entry_head->ets)); + printf("Port Identifier: %u\n", le16_to_cpu(pevent_entry_head->pelpid)); + printf("Vendor Specific Information Length: %u\n", le16_to_cpu(pevent_entry_head->vsil)); + printf("Event Length: %u\n", le16_to_cpu(pevent_entry_head->el)); +} + +static void pel_smart_health_event(void *pevent_log_info, __u32 offset, const char *devname) +{ + struct nvme_smart_log *smart_event = pevent_log_info + offset; + + printf("Smart Health Event Entry:\n"); + stdout_smart_log(smart_event, NVME_NSID_ALL, devname); +} + +static void pel_fw_commit_event(void *pevent_log_info, __u32 offset) +{ + struct nvme_fw_commit_event *fw_commit_event = pevent_log_info + offset; + + printf("FW Commit Event Entry:\n"); + printf("Old Firmware Revision: %"PRIu64" (%s)\n", le64_to_cpu(fw_commit_event->old_fw_rev), + util_fw_to_string((char *)&fw_commit_event->old_fw_rev)); + printf("New Firmware Revision: %"PRIu64" (%s)\n", le64_to_cpu(fw_commit_event->new_fw_rev), + util_fw_to_string((char *)&fw_commit_event->new_fw_rev)); + printf("FW Commit Action: %u\n", fw_commit_event->fw_commit_action); + printf("FW Slot: %u\n", fw_commit_event->fw_slot); + printf("Status Code Type for Firmware Commit Command: %u\n", fw_commit_event->sct_fw); + printf("Status Returned for Firmware Commit Command: %u\n", fw_commit_event->sc_fw); + printf("Vendor Assigned Firmware Commit Result Code: %u\n", + le16_to_cpu(fw_commit_event->vndr_assign_fw_commit_rc)); +} + +static void pel_timestamp_event(void *pevent_log_info, __u32 offset) +{ + struct nvme_time_stamp_change_event *ts_change_event = pevent_log_info + offset; + + printf("Time Stamp Change Event Entry:\n"); + printf("Previous Timestamp: %"PRIu64"\n", le64_to_cpu(ts_change_event->previous_timestamp)); + printf("Milliseconds Since Reset: %"PRIu64"\n", + le64_to_cpu(ts_change_event->ml_secs_since_reset)); +} + +static void pel_power_on_reset_event(void *pevent_log_info, __u32 offset, + struct nvme_persistent_event_entry *pevent_entry_head) +{ + __u64 *fw_rev; + __u32 por_info_len = le16_to_cpu(pevent_entry_head->el) - + le16_to_cpu(pevent_entry_head->vsil) - sizeof(*fw_rev); + struct nvme_power_on_reset_info_list *por_event; + __u32 por_info_list = por_info_len / sizeof(*por_event); + + printf("Power On Reset Event Entry:\n"); + fw_rev = pevent_log_info + offset; + printf("Firmware Revision: %"PRIu64" (%s)\n", le64_to_cpu(*fw_rev), + util_fw_to_string((char *)fw_rev)); + printf("Reset Information List:\n"); + + for (int i = 0; i < por_info_list; i++) { + por_event = pevent_log_info + offset + sizeof(*fw_rev) + i * sizeof(*por_event); + printf("Controller ID: %u\n", le16_to_cpu(por_event->cid)); + printf("Firmware Activation: %u\n", por_event->fw_act); + printf("Operation in Progress: %u\n", por_event->op_in_prog); + printf("Controller Power Cycle: %u\n", le32_to_cpu(por_event->ctrl_power_cycle)); + printf("Power on milliseconds: %"PRIu64"\n", + le64_to_cpu(por_event->power_on_ml_seconds)); + printf("Controller Timestamp: %"PRIu64"\n", + le64_to_cpu(por_event->ctrl_time_stamp)); + } +} + +static void pel_nss_hw_error_event(void *pevent_log_info, __u32 offset) +{ + struct nvme_nss_hw_err_event *nss_hw_err_event = pevent_log_info + offset; + + printf("NVM Subsystem Hardware Error Event Code Entry: %u, %s\n", + le16_to_cpu(nss_hw_err_event->nss_hw_err_event_code), + nvme_nss_hw_error_to_string(nss_hw_err_event->nss_hw_err_event_code)); +} + +static void pel_change_ns_event(void *pevent_log_info, __u32 offset) +{ + struct nvme_change_ns_event *ns_event = pevent_log_info + offset; + + printf("Change Namespace Event Entry:\n"); + printf("Namespace Management CDW10: %u\n", le32_to_cpu(ns_event->nsmgt_cdw10)); + printf("Namespace Size: %"PRIu64"\n", le64_to_cpu(ns_event->nsze)); + printf("Namespace Capacity: %"PRIu64"\n", le64_to_cpu(ns_event->nscap)); + printf("Formatted LBA Size: %u\n", ns_event->flbas); + printf("End-to-end Data Protection Type Settings: %u\n", ns_event->dps); + printf("Namespace Multi-path I/O and Namespace Sharing Capabilities: %u\n", ns_event->nmic); + printf("ANA Group Identifier: %u\n", le32_to_cpu(ns_event->ana_grp_id)); + printf("NVM Set Identifier: %u\n", le16_to_cpu(ns_event->nvmset_id)); + printf("Namespace ID: %u\n", le32_to_cpu(ns_event->nsid)); +} + +static void pel_format_start_event(void *pevent_log_info, __u32 offset) +{ + struct nvme_format_nvm_start_event *format_start_event = pevent_log_info + offset; + + printf("Format NVM Start Event Entry:\n"); + printf("Namespace Identifier: %u\n", le32_to_cpu(format_start_event->nsid)); + printf("Format NVM Attributes: %u\n", format_start_event->fna); + printf("Format NVM CDW10: %u\n", le32_to_cpu(format_start_event->format_nvm_cdw10)); +} + +static void pel_format_completion_event(void *pevent_log_info, __u32 offset) +{ + struct nvme_format_nvm_compln_event *format_cmpln_event = pevent_log_info + offset; + + printf("Format NVM Completion Event Entry:\n"); + printf("Namespace Identifier: %u\n", le32_to_cpu(format_cmpln_event->nsid)); + printf("Smallest Format Progress Indicator: %u\n", format_cmpln_event->smallest_fpi); + printf("Format NVM Status: %u\n", format_cmpln_event->format_nvm_status); + printf("Completion Information: %u\n", le16_to_cpu(format_cmpln_event->compln_info)); + printf("Status Field: %u\n", le32_to_cpu(format_cmpln_event->status_field)); +} + +static void pel_sanitize_start_event(void *pevent_log_info, __u32 offset) +{ + struct nvme_sanitize_start_event *sanitize_start_event = pevent_log_info + offset; + + printf("Sanitize Start Event Entry:\n"); + printf("SANICAP: %u\n", sanitize_start_event->sani_cap); + printf("Sanitize CDW10: %u\n", le32_to_cpu(sanitize_start_event->sani_cdw10)); + printf("Sanitize CDW11: %u\n", le32_to_cpu(sanitize_start_event->sani_cdw11)); +} + +static void pel_sanitize_completion_event(void *pevent_log_info, __u32 offset) +{ + struct nvme_sanitize_compln_event *sanitize_cmpln_event = pevent_log_info + offset; + + printf("Sanitize Completion Event Entry:\n"); + printf("Sanitize Progress: %u\n", le16_to_cpu(sanitize_cmpln_event->sani_prog)); + printf("Sanitize Status: %u\n", le16_to_cpu(sanitize_cmpln_event->sani_status)); + printf("Completion Information: %u\n", le16_to_cpu(sanitize_cmpln_event->cmpln_info)); +} + +static void pel_set_feature_event(void *pevent_log_info, __u32 offset) +{ + int fid, cdw11, cdw12, dword_cnt; + unsigned char *mem_buf; + struct nvme_set_feature_event *set_feat_event = pevent_log_info + offset; + + printf("Set Feature Event Entry:\n"); + dword_cnt = NVME_SET_FEAT_EVENT_DW_COUNT(set_feat_event->layout); + fid = NVME_GET(le32_to_cpu(set_feat_event->cdw_mem[0]), FEATURES_CDW10_FID); + cdw11 = le32_to_cpu(set_feat_event->cdw_mem[1]); + + printf("Set Feature ID: 0x%02x (%s), value: 0x%08x\n", fid, nvme_feature_to_string(fid), + cdw11); + + if (!NVME_SET_FEAT_EVENT_MB_COUNT(set_feat_event->layout)) + return; + + 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); + } +} + +static void pel_thermal_excursion_event(void *pevent_log_info, __u32 offset) +{ + struct nvme_thermal_exc_event *thermal_exc_event = pevent_log_info + offset; + + printf("Thermal Excursion Event Entry:\n"); + printf("Over Temperature: %u\n", thermal_exc_event->over_temp); + printf("Threshold: %u\n", thermal_exc_event->threshold); +} + +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, cdw12, dword_cnt; - unsigned char *mem_buf = NULL; - struct nvme_smart_log *smart_event; - struct nvme_fw_commit_event *fw_commit_event; - struct nvme_time_stamp_change_event *ts_change_event; - struct nvme_power_on_reset_info_list *por_event; - struct nvme_nss_hw_err_event *nss_hw_err_event; - struct nvme_change_ns_event *ns_event; - struct nvme_format_nvm_start_event *format_start_event; - struct nvme_format_nvm_compln_event *format_cmpln_event; - struct nvme_sanitize_start_event *sanitize_start_event; - struct nvme_sanitize_compln_event *sanitize_cmpln_event; - struct nvme_set_feature_event *set_feat_event; - struct nvme_thermal_exc_event *thermal_exc_event; struct nvme_persistent_event_log *pevent_log_head; + __u32 offset = sizeof(*pevent_log_head); struct nvme_persistent_event_entry *pevent_entry_head; - int human = stdout_print_ops.flags & VERBOSE; - offset = sizeof(*pevent_log_head); - printf("Persistent Event Log for device: %s\n", devname); printf("Action for Persistent Event Log: %u\n", action); - if (size >= offset) { - pevent_log_head = pevent_log_info; - printf("Log Identifier: %u\n", pevent_log_head->lid); - printf("Total Number of Events: %u\n", - le32_to_cpu(pevent_log_head->tnev)); - printf("Total Log Length : %"PRIu64"\n", - le64_to_cpu(pevent_log_head->tll)); - printf("Log Revision: %u\n", pevent_log_head->rv); - printf("Log Header Length: %u\n", pevent_log_head->lhl); - printf("Timestamp: %"PRIu64"\n", - le64_to_cpu(pevent_log_head->ts)); - printf("Power On Hours (POH): %s", - uint128_t_to_l10n_string(le128_to_cpu(pevent_log_head->poh))); - printf("Power Cycle Count: %"PRIu64"\n", - le64_to_cpu(pevent_log_head->pcc)); - printf("PCI Vendor ID (VID): %u\n", - le16_to_cpu(pevent_log_head->vid)); - printf("PCI Subsystem Vendor ID (SSVID): %u\n", - le16_to_cpu(pevent_log_head->ssvid)); - printf("Serial Number (SN): %-.*s\n", - (int)sizeof(pevent_log_head->sn), pevent_log_head->sn); - printf("Model Number (MN): %-.*s\n", - (int)sizeof(pevent_log_head->mn), pevent_log_head->mn); - printf("NVM Subsystem NVMe Qualified Name (SUBNQN): %-.*s\n", - (int)sizeof(pevent_log_head->subnqn), - pevent_log_head->subnqn); - printf("Generation Number: %u\n", - le16_to_cpu(pevent_log_head->gen_number)); - printf("Reporting Context Information (RCI): %u\n", - le32_to_cpu(pevent_log_head->rci)); - if (human) - stdout_persistent_event_log_rci(pevent_log_head->rci); - printf("Supported Events Bitmap:\n"); - for (int i = 0; i < 32; i++) { - if (pevent_log_head->seb[i] == 0) - continue; - stdout_add_bitmap(i, pevent_log_head->seb[i]); - } - } else { + + if (size < offset) { printf("No log data can be shown with this log len at least " \ - "512 bytes is required or can be 0 to read the complete "\ - "log page after context established\n"); + "512 bytes is required or can be 0 to read the complete " \ + "log page after context established\n"); return; } + + pevent_log_head = pevent_log_info; + + pel_header(pevent_log_head, human); + printf("\n"); printf("\nPersistent Event Entries:\n"); for (int i = 0; i < le32_to_cpu(pevent_log_head->tnev); i++) { @@ -342,181 +509,50 @@ static void stdout_persistent_event_log(void *pevent_log_info, if ((offset + pevent_entry_head->ehl + 3 + le16_to_cpu(pevent_entry_head->el)) >= size) break; - printf("Event Number: %u\n", i); - printf("Event Type: %s\n", nvme_pel_event_to_string(pevent_entry_head->etype)); - printf("Event Type Revision: %u\n", pevent_entry_head->etype_rev); - printf("Event Header Length: %u\n", pevent_entry_head->ehl); - printf("Event Header Additional Info: %u\n", pevent_entry_head->ehai); - if (human) - stdout_persistent_event_entry_ehai(pevent_entry_head->ehai); - printf("Controller Identifier: %u\n", - le16_to_cpu(pevent_entry_head->cntlid)); - printf("Event Timestamp: %"PRIu64"\n", - le64_to_cpu(pevent_entry_head->ets)); - printf("Port Identifier: %u\n", - le16_to_cpu(pevent_entry_head->pelpid)); - printf("Vendor Specific Information Length: %u\n", - le16_to_cpu(pevent_entry_head->vsil)); - printf("Event Length: %u\n", le16_to_cpu(pevent_entry_head->el)); + + pel_event_header(i, pevent_entry_head, human); offset += pevent_entry_head->ehl + 3; switch (pevent_entry_head->etype) { case NVME_PEL_SMART_HEALTH_EVENT: - smart_event = pevent_log_info + offset; - printf("Smart Health Event Entry:\n"); - stdout_smart_log(smart_event, NVME_NSID_ALL, devname); + pel_smart_health_event(pevent_log_info, offset, devname); break; case NVME_PEL_FW_COMMIT_EVENT: - fw_commit_event = pevent_log_info + offset; - printf("FW Commit Event Entry:\n"); - printf("Old Firmware Revision: %"PRIu64" (%s)\n", - le64_to_cpu(fw_commit_event->old_fw_rev), - util_fw_to_string((char *)&fw_commit_event->old_fw_rev)); - printf("New Firmware Revision: %"PRIu64" (%s)\n", - le64_to_cpu(fw_commit_event->new_fw_rev), - util_fw_to_string((char *)&fw_commit_event->new_fw_rev)); - printf("FW Commit Action: %u\n", - fw_commit_event->fw_commit_action); - printf("FW Slot: %u\n", fw_commit_event->fw_slot); - printf("Status Code Type for Firmware Commit Command: %u\n", - fw_commit_event->sct_fw); - printf("Status Returned for Firmware Commit Command: %u\n", - fw_commit_event->sc_fw); - printf("Vendor Assigned Firmware Commit Result Code: %u\n", - le16_to_cpu(fw_commit_event->vndr_assign_fw_commit_rc)); + pel_fw_commit_event(pevent_log_info, offset); break; case NVME_PEL_TIMESTAMP_EVENT: - ts_change_event = pevent_log_info + offset; - printf("Time Stamp Change Event Entry:\n"); - printf("Previous Timestamp: %"PRIu64"\n", - le64_to_cpu(ts_change_event->previous_timestamp)); - printf("Milliseconds Since Reset: %"PRIu64"\n", - le64_to_cpu(ts_change_event->ml_secs_since_reset)); + pel_timestamp_event(pevent_log_info, offset); break; case NVME_PEL_POWER_ON_RESET_EVENT: - por_info_len = (le16_to_cpu(pevent_entry_head->el) - - le16_to_cpu(pevent_entry_head->vsil) - sizeof(*fw_rev)); - - por_info_list = por_info_len / sizeof(*por_event); - - printf("Power On Reset Event Entry:\n"); - fw_rev = pevent_log_info + offset; - printf("Firmware Revision: %"PRIu64" (%s)\n", le64_to_cpu(*fw_rev), - util_fw_to_string((char *)fw_rev)); - printf("Reset Information List:\n"); - - for (int i = 0; i < por_info_list; i++) { - por_event = pevent_log_info + offset + - sizeof(*fw_rev) + i * sizeof(*por_event); - printf("Controller ID: %u\n", le16_to_cpu(por_event->cid)); - printf("Firmware Activation: %u\n", - por_event->fw_act); - printf("Operation in Progress: %u\n", - por_event->op_in_prog); - printf("Controller Power Cycle: %u\n", - le32_to_cpu(por_event->ctrl_power_cycle)); - printf("Power on milliseconds: %"PRIu64"\n", - le64_to_cpu(por_event->power_on_ml_seconds)); - printf("Controller Timestamp: %"PRIu64"\n", - le64_to_cpu(por_event->ctrl_time_stamp)); - } + pel_power_on_reset_event(pevent_log_info, offset, pevent_entry_head); break; case NVME_PEL_NSS_HW_ERROR_EVENT: - nss_hw_err_event = pevent_log_info + offset; - printf("NVM Subsystem Hardware Error Event Code Entry: %u, %s\n", - le16_to_cpu(nss_hw_err_event->nss_hw_err_event_code), - nvme_nss_hw_error_to_string(nss_hw_err_event->nss_hw_err_event_code)); + pel_nss_hw_error_event(pevent_log_info, offset); break; case NVME_PEL_CHANGE_NS_EVENT: - ns_event = pevent_log_info + offset; - printf("Change Namespace Event Entry:\n"); - printf("Namespace Management CDW10: %u\n", - le32_to_cpu(ns_event->nsmgt_cdw10)); - printf("Namespace Size: %"PRIu64"\n", - le64_to_cpu(ns_event->nsze)); - printf("Namespace Capacity: %"PRIu64"\n", - le64_to_cpu(ns_event->nscap)); - printf("Formatted LBA Size: %u\n", ns_event->flbas); - printf("End-to-end Data Protection Type Settings: %u\n", - ns_event->dps); - printf("Namespace Multi-path I/O and Namespace Sharing" \ - " Capabilities: %u\n", ns_event->nmic); - printf("ANA Group Identifier: %u\n", - le32_to_cpu(ns_event->ana_grp_id)); - printf("NVM Set Identifier: %u\n", le16_to_cpu(ns_event->nvmset_id)); - printf("Namespace ID: %u\n", le32_to_cpu(ns_event->nsid)); + pel_change_ns_event(pevent_log_info, offset); break; case NVME_PEL_FORMAT_START_EVENT: - format_start_event = pevent_log_info + offset; - printf("Format NVM Start Event Entry:\n"); - printf("Namespace Identifier: %u\n", - le32_to_cpu(format_start_event->nsid)); - printf("Format NVM Attributes: %u\n", - format_start_event->fna); - printf("Format NVM CDW10: %u\n", - le32_to_cpu(format_start_event->format_nvm_cdw10)); + pel_format_start_event(pevent_log_info, offset); break; case NVME_PEL_FORMAT_COMPLETION_EVENT: - format_cmpln_event = pevent_log_info + offset; - printf("Format NVM Completion Event Entry:\n"); - printf("Namespace Identifier: %u\n", - le32_to_cpu(format_cmpln_event->nsid)); - printf("Smallest Format Progress Indicator: %u\n", - format_cmpln_event->smallest_fpi); - printf("Format NVM Status: %u\n", - format_cmpln_event->format_nvm_status); - printf("Completion Information: %u\n", - le16_to_cpu(format_cmpln_event->compln_info)); - printf("Status Field: %u\n", - le32_to_cpu(format_cmpln_event->status_field)); + pel_format_completion_event(pevent_log_info, offset); break; case NVME_PEL_SANITIZE_START_EVENT: - sanitize_start_event = pevent_log_info + offset; - printf("Sanitize Start Event Entry:\n"); - printf("SANICAP: %u\n", sanitize_start_event->sani_cap); - printf("Sanitize CDW10: %u\n", - le32_to_cpu(sanitize_start_event->sani_cdw10)); - printf("Sanitize CDW11: %u\n", - le32_to_cpu(sanitize_start_event->sani_cdw11)); + pel_sanitize_start_event(pevent_log_info, offset); break; case NVME_PEL_SANITIZE_COMPLETION_EVENT: - sanitize_cmpln_event = pevent_log_info + offset; - printf("Sanitize Completion Event Entry:\n"); - printf("Sanitize Progress: %u\n", - le16_to_cpu(sanitize_cmpln_event->sani_prog)); - printf("Sanitize Status: %u\n", - le16_to_cpu(sanitize_cmpln_event->sani_status)); - printf("Completion Information: %u\n", - le16_to_cpu(sanitize_cmpln_event->cmpln_info)); + pel_sanitize_completion_event(pevent_log_info, offset); break; case NVME_PEL_SET_FEATURE_EVENT: - set_feat_event = pevent_log_info + offset; - printf("Set Feature Event Entry:\n"); - dword_cnt = NVME_SET_FEAT_EVENT_DW_COUNT(set_feat_event->layout); - fid = NVME_GET(le32_to_cpu(set_feat_event->cdw_mem[0]), FEATURES_CDW10_FID); - cdw11 = le32_to_cpu(set_feat_event->cdw_mem[1]); - - 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; - 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); - } + pel_set_feature_event(pevent_log_info, offset); break; case NVME_PEL_TELEMETRY_CRT: d(pevent_log_info + offset, 512, 16, 1); break; case NVME_PEL_THERMAL_EXCURSION_EVENT: - thermal_exc_event = pevent_log_info + offset; - printf("Thermal Excursion Event Entry:\n"); - printf("Over Temperature: %u\n", thermal_exc_event->over_temp); - printf("Threshold: %u\n", thermal_exc_event->threshold); + pel_thermal_excursion_event(pevent_log_info, offset); break; case NVME_PEL_SANITIZE_MEDIA_VERIF_EVENT: printf("Sanitize Media Verification Event\n"); @@ -1139,7 +1175,7 @@ static void stdout_registers_cap(struct nvme_bar_cap *cap) printf("\tDoorbell Stride (DSTRD): %u bytes\n", 1 << (2 + cap->dstrd)); printf("\tTimeout (TO): %u ms\n", cap->to * 500); printf("\tArbitration Mechanism Supported (AMS): Weighted Round Robin with Urgent Priority Class is %s\n", - cap->ams & 0x02 ? "Supported" : "Not supported"); + cap->ams & 0x01 ? "Supported" : "Not supported"); printf("\tContiguous Queues Required (CQR): %s\n", cap->cqr ? "Yes" : "No"); printf("\tMaximum Queue Entries Supported (MQES): %u\n\n", cap->mqes + 1); } @@ -1691,29 +1727,38 @@ 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 & NVME_CTRL_OAES_DL) >> 31; - __u32 rsvd0 = (oaes & 0x70000000) >> 28; - __u32 zicn = (oaes & NVME_CTRL_OAES_ZD) >> 27; - __u32 rsvd1 = (oaes & 0x7fe0000) >> 17; - __u32 tthr = (oaes & 0x10000) >> 16; + __u32 dlpcn = (oaes & NVME_CTRL_OAES_DL) >> 31; + __u32 rsvd28 = (oaes & 0x70000000) >> 28; + __u32 zdcn = (oaes & NVME_CTRL_OAES_ZD) >> 27; + __u32 rsvd20 = (oaes & 0x7fe0000) >> 20; + __u32 ansan = (oaes & NVME_CTRL_OAES_ANSAN) >> 19; + __u32 rsvd18 = (oaes >> 18) & 0x1; + __u32 rgcns = (oaes & NVME_CTRL_OAES_RGCNS) >> 17; + __u32 tthr = (oaes & NVME_CTRL_OAES_TTH) >> 16; __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 rsvd10 = (oaes >> 10) & 0x1; __u32 fan = (oaes & NVME_CTRL_OAES_FA) >> 9; __u32 nace = (oaes & NVME_CTRL_OAES_NA) >> 8; - __u32 rsvd3 = oaes & 0xFF; + __u32 rsvd0 = oaes & 0xFF; printf(" [31:31] : %#x\tDiscovery Log Change Notice %sSupported\n", - disc, disc ? "" : "Not "); - if (rsvd0) - printf(" [30:28] : %#x\tReserved\n", rsvd0); + dlpcn, dlpcn ? "" : "Not "); + if (rsvd28) + printf(" [30:28] : %#x\tReserved\n", rsvd28); printf(" [27:27] : %#x\tZone Descriptor Changed Notices %sSupported\n", - zicn, zicn ? "" : "Not "); - if (rsvd1) - printf(" [26:17] : %#x\tReserved\n", rsvd1); + zdcn, zdcn ? "" : "Not "); + if (rsvd20) + printf(" [26:20] : %#x\tReserved\n", rsvd20); + printf(" [19:19] : %#x\tAllocated Namespace Attribute Notices %sSupported\n", + ansan, ansan ? "" : "Not "); + if (rsvd18) + printf(" [18:18] : %#x\tReserved\n", rsvd18); + printf(" [17:17] : %#x\tReachability Groups Change Notices %sSupported\n", + rgcns, rgcns ? "" : "Not "); printf(" [16:16] : %#x\tTemperature Threshold Hysteresis Recovery %sSupported\n", tthr, tthr ? "" : "Not "); printf(" [15:15] : %#x\tNormal NSS Shutdown Event %sSupported\n", @@ -1728,14 +1773,14 @@ static void stdout_id_ctrl_oaes(__le32 ctrl_oaes) plealcn, plealcn ? "" : "Not "); printf(" [11:11] : %#x\tAsymmetric Namespace Access Change Notices"\ " %sSupported\n", anacn, anacn ? "" : "Not "); - if (rsvd2) - printf(" [10:10] : %#x\tReserved\n", rsvd2); + if (rsvd10) + printf(" [10:10] : %#x\tReserved\n", rsvd10); printf(" [9:9] : %#x\tFirmware Activation Notices %sSupported\n", fan, fan ? "" : "Not "); printf(" [8:8] : %#x\tNamespace Attribute Changed Event %sSupported\n", nace, nace ? "" : "Not "); - if (rsvd3) - printf(" [7:0] : %#x\tReserved\n", rsvd3); + if (rsvd0) + printf(" [7:0] : %#x\tReserved\n", rsvd0); printf("\n"); } @@ -1743,33 +1788,33 @@ 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 rsvd18 = (ctratt >> 18) & 0x1; - __u32 hmbr = (ctratt >> 17) & 0x1; - __u32 mem = (ctratt >> 16) & 0x1; - __u32 elbas = (ctratt >> 15) & 0x1; - __u32 delnvmset = (ctratt >> 14) & 0x1; - __u32 delegrp = (ctratt >> 13) & 0x1; - __u32 vcap = (ctratt >> 12) & 0x1; - __u32 fcap = (ctratt >> 11) & 0x1; - __u32 mds = (ctratt >> 10) & 0x1; - __u32 hostid128 = (ctratt & NVME_CTRL_CTRATT_128_ID) >> 0; - __u32 psp = (ctratt & NVME_CTRL_CTRATT_NON_OP_PSP) >> 1; - __u32 sets = (ctratt & NVME_CTRL_CTRATT_NVM_SETS) >> 2; - __u32 rrl = (ctratt & NVME_CTRL_CTRATT_READ_RECV_LVLS) >> 3; - __u32 eg = (ctratt & NVME_CTRL_CTRATT_ENDURANCE_GROUPS) >> 4; - __u32 iod = (ctratt & NVME_CTRL_CTRATT_PREDICTABLE_LAT) >> 5; - __u32 tbkas = (ctratt & NVME_CTRL_CTRATT_TBKAS) >> 6; - __u32 ng = (ctratt & NVME_CTRL_CTRATT_NAMESPACE_GRANULARITY) >> 7; + __u32 fdps = (ctratt & NVME_CTRL_CTRATT_FDPS) >> 19; + __u32 rhii = (ctratt & NVME_CTRL_CTRATT_RHII) >> 18; + __u32 hmbr = (ctratt & NVME_CTRL_CTRATT_HMBR) >> 17; + __u32 mem = (ctratt & NVME_CTRL_CTRATT_MEM) >> 16; + __u32 elbas = (ctratt & NVME_CTRL_CTRATT_ELBAS) >> 15; + __u32 dnvms = (ctratt & NVME_CTRL_CTRATT_DEL_NVM_SETS) >> 14; + __u32 deg = (ctratt & NVME_CTRL_CTRATT_DEL_ENDURANCE_GROUPS) >> 13; + __u32 vcm = (ctratt & NVME_CTRL_CTRATT_VARIABLE_CAP) >> 12; + __u32 fcm = (ctratt & NVME_CTRL_CTRATT_FIXED_CAP) >> 11; + __u32 mds = (ctratt & NVME_CTRL_CTRATT_MDS) >> 10; + __u32 ulist = (ctratt & NVME_CTRL_CTRATT_UUID_LIST) >> 9; __u32 sqa = (ctratt & NVME_CTRL_CTRATT_SQ_ASSOCIATIONS) >> 8; - __u32 uuidlist = (ctratt & NVME_CTRL_CTRATT_UUID_LIST) >> 9; + __u32 ng = (ctratt & NVME_CTRL_CTRATT_NAMESPACE_GRANULARITY) >> 7; + __u32 tbkas = (ctratt & NVME_CTRL_CTRATT_TBKAS) >> 6; + __u32 plm = (ctratt & NVME_CTRL_CTRATT_PREDICTABLE_LAT) >> 5; + __u32 egs = (ctratt & NVME_CTRL_CTRATT_ENDURANCE_GROUPS) >> 4; + __u32 rrlvls = (ctratt & NVME_CTRL_CTRATT_READ_RECV_LVLS) >> 3; + __u32 nsets = (ctratt & NVME_CTRL_CTRATT_NVM_SETS) >> 2; + __u32 nopspm = (ctratt & NVME_CTRL_CTRATT_NON_OP_PSP) >> 1; + __u32 hids = (ctratt & NVME_CTRL_CTRATT_128_ID) >> 0; if (rsvd20) printf(" [31:20] : %#x\tReserved\n", rsvd20); printf(" [19:19] : %#x\tFlexible Data Placement %sSupported\n", fdps, fdps ? "" : "Not "); - if (rsvd18) - printf(" [18:18] : %#x\tReserved\n", rsvd18); + printf(" [18:18] : %#x\tReservations and Host Identifier Interaction %sSupported\n", + rhii, rhii ? "" : "Not "); 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", @@ -1777,17 +1822,17 @@ static void stdout_id_ctrl_ctratt(__le32 ctrl_ctratt) printf(" [15:15] : %#x\tExtended LBA Formats %sSupported\n", elbas, elbas ? "" : "Not "); printf(" [14:14] : %#x\tDelete NVM Set %sSupported\n", - delnvmset, delnvmset ? "" : "Not "); + dnvms, dnvms ? "" : "Not "); printf(" [13:13] : %#x\tDelete Endurance Group %sSupported\n", - delegrp, delegrp ? "" : "Not "); + deg, deg ? "" : "Not "); printf(" [12:12] : %#x\tVariable Capacity Management %sSupported\n", - vcap, vcap ? "" : "Not "); + vcm, vcm ? "" : "Not "); printf(" [11:11] : %#x\tFixed Capacity Management %sSupported\n", - fcap, fcap ? "" : "Not "); + fcm, fcm ? "" : "Not "); printf(" [10:10] : %#x\tMulti Domain Subsystem %sSupported\n", mds, mds ? "" : "Not "); printf(" [9:9] : %#x\tUUID List %sSupported\n", - uuidlist, uuidlist ? "" : "Not "); + ulist, ulist ? "" : "Not "); printf(" [8:8] : %#x\tSQ Associations %sSupported\n", sqa, sqa ? "" : "Not "); printf(" [7:7] : %#x\tNamespace Granularity %sSupported\n", @@ -1795,17 +1840,70 @@ static void stdout_id_ctrl_ctratt(__le32 ctrl_ctratt) printf(" [6:6] : %#x\tTraffic Based Keep Alive %sSupported\n", tbkas, tbkas ? "" : "Not "); printf(" [5:5] : %#x\tPredictable Latency Mode %sSupported\n", - iod, iod ? "" : "Not "); + plm, plm ? "" : "Not "); printf(" [4:4] : %#x\tEndurance Groups %sSupported\n", - eg, eg ? "" : "Not "); + egs, egs ? "" : "Not "); printf(" [3:3] : %#x\tRead Recovery Levels %sSupported\n", - rrl, rrl ? "" : "Not "); + rrlvls, rrlvls ? "" : "Not "); printf(" [2:2] : %#x\tNVM Sets %sSupported\n", - sets, sets ? "" : "Not "); + nsets, nsets ? "" : "Not "); printf(" [1:1] : %#x\tNon-Operational Power State Permissive %sSupported\n", - psp, psp ? "" : "Not "); + nopspm, nopspm ? "" : "Not "); printf(" [0:0] : %#x\t128-bit Host Identifier %sSupported\n", - hostid128, hostid128 ? "" : "Not "); + hids, hids ? "" : "Not "); + printf("\n"); +} + +static void stdout_id_ctrl_bpcap(__u8 ctrl_bpcap) +{ + __u8 rsvd3 = (ctrl_bpcap >> 3); + __u8 sfbpwps = NVME_GET(ctrl_bpcap, CTRL_BACAP_SFBPWPS); + __u8 rpmbbpwps = NVME_GET(ctrl_bpcap, CTRL_BACAP_RPMBBPWPS); + static const char * const rpmbbpwps_def[] = { + "Support Not Specified", + "Not Supported", + "Supported" + }; + + if (rsvd3) + printf(" [7:3] : %#x\tReserved\n", rsvd3); + + printf(" [2:2] : %#x\tSet Features Boot Partition Write Protection %sSupported\n", + sfbpwps, sfbpwps ? "" : "Not "); + printf(" [1:0] : %#x\tRPMB Boot Partition Write Protection %s\n", + rpmbbpwps, rpmbbpwps_def[rpmbbpwps]); + printf("\n"); +} + +static void stdout_id_ctrl_plsi(__u8 ctrl_plsi) +{ + __u8 rsvd2 = (ctrl_plsi >> 2); + __u8 plsfq = NVME_GET(ctrl_plsi, CTRL_PLSI_PLSFQ); + __u8 plsepf = NVME_GET(ctrl_plsi, CTRL_PLSI_PLSEPF); + + if (rsvd2) + printf(" [7:2] : %#x\tReserved\n", rsvd2); + + printf(" [1:1] : %#x\tPower Loss Signaling with Forced Quiescence %sSupported\n", + plsfq, plsfq ? "" : "Not "); + printf(" [0:0] : %#x\tPower Loss Signaling with Emergency Power Fail %sSupported\n", + plsepf, plsepf ? "" : "Not "); + printf("\n"); +} + +static void stdout_id_ctrl_crcap(__u8 ctrl_crcap) +{ + __u8 rsvd2 = (ctrl_crcap >> 2); + __u8 rgidc = NVME_GET(ctrl_crcap, CTRL_CRCAP_RGIDC); + __u8 rrsup = NVME_GET(ctrl_crcap, CTRL_CRCAP_RRSUP); + + if (rsvd2) + printf(" [7:2] : %#x\tReserved\n", rsvd2); + + printf(" [1:1] : %#x\tRGRPID %s while the namespace is attached to any controller.\n", + rgidc, rgidc ? "does not change" : "may change"); + printf(" [0:0] : %#x\tReachability Reporting %sSupported\n", + rrsup, rrsup ? "" : "Not "); printf("\n"); } @@ -1871,21 +1969,24 @@ static void stdout_id_ctrl_mec(__u8 mec) static void stdout_id_ctrl_oacs(__le16 ctrl_oacs) { __u16 oacs = le16_to_cpu(ctrl_oacs); - __u16 rsvd = (oacs & 0xF800) >> 11; - __u16 lock = (oacs >> 10) & 0x1; - __u16 glbas = (oacs & 0x200) >> 9; - __u16 dbc = (oacs & 0x100) >> 8; - __u16 vir = (oacs & 0x80) >> 7; - __u16 nmi = (oacs & 0x40) >> 6; - __u16 dir = (oacs & 0x20) >> 5; - __u16 sft = (oacs & 0x10) >> 4; - __u16 nsm = (oacs & 0x8) >> 3; - __u16 fwc = (oacs & 0x4) >> 2; - __u16 fmt = (oacs & 0x2) >> 1; - __u16 sec = oacs & 0x1; + __u16 rsvd = (oacs & 0xF000) >> 12; + __u16 hmlms = (oacs & 0x800) >> 11; + __u16 lock = (oacs & NVME_CTRL_OACS_CMD_FEAT_LD) >> 10; + __u16 glbas = (oacs & NVME_CTRL_OACS_LBA_STATUS) >> 9; + __u16 dbc = (oacs & NVME_CTRL_OACS_DBBUF_CFG) >> 8; + __u16 vir = (oacs & NVME_CTRL_OACS_VIRT_MGMT) >> 7; + __u16 nmi = (oacs & NVME_CTRL_OACS_NVME_MI) >> 6; + __u16 dir = (oacs & NVME_CTRL_OACS_DIRECTIVES) >> 5; + __u16 sft = (oacs & NVME_CTRL_OACS_SELF_TEST) >> 4; + __u16 nsm = (oacs & NVME_CTRL_OACS_NS_MGMT) >> 3; + __u16 fwc = (oacs & NVME_CTRL_OACS_FW) >> 2; + __u16 fmt = (oacs & NVME_CTRL_OACS_FORMAT) >> 1; + __u16 sec = oacs & NVME_CTRL_OACS_SECURITY; if (rsvd) - printf(" [15:11] : %#x\tReserved\n", rsvd); + printf(" [15:12] : %#x\tReserved\n", rsvd); + printf(" [11:11] : %#x\tHost Managed Live Migration %sSupported\n", + hmlms, hmlms ? "" : "Not "); printf(" [10:10] : %#x\tLockdown Command and Feature %sSupported\n", lock, lock ? "" : "Not "); printf(" [9:9] : %#x\tGet LBA Status Capability %sSupported\n", @@ -2043,6 +2144,22 @@ void stdout_id_ctrl_rpmbs(__le32 ctrl_rpmbs) printf("\n"); } +static void stdout_id_ctrl_dsto(__u8 dsto) +{ + __u8 rsvd2 = (dsto & 0xfc) >> 2; + __u8 hirs = (dsto & 0x2) >> 1; + __u8 sdso = dsto & 0x1; + + if (rsvd2) + printf(" [7:2] : %#x\tReserved\n", rsvd2); + printf(" [1:1] : %#x\tHost-Initiated Refresh capability %sSupported\n", + hirs, hirs ? "" : "Not "); + printf(" [0:0] : %#x\tNVM subsystem supports %s at a time\n", sdso, + sdso ? "only one device self-test operation in progress" : + "one device self-test operation per controller"); + printf("\n"); +} + static void stdout_id_ctrl_hctma(__le16 ctrl_hctma) { __u16 hctma = le16_to_cpu(ctrl_hctma); @@ -2134,6 +2251,22 @@ static void stdout_id_ctrl_anacap(__u8 anacap) printf("\n"); } +static void stdout_id_ctrl_kpioc(__u8 ctrl_kpioc) +{ + __u8 rsvd2 = (ctrl_kpioc >> 2); + __u8 kpiosc = NVME_GET(ctrl_kpioc, CTRL_KPIOC_KPIOSC); + __u8 kpios = NVME_GET(ctrl_kpioc, CTRL_KPIOC_KPIOS); + + if (rsvd2) + printf(" [7:2] : %#x\tReserved\n", rsvd2); + + printf(" [1:1] : %#x\tKey Per I/O capability %s to all namespaces\n", + kpiosc, kpiosc ? "applies" : "Not apply"); + printf(" [0:0] : %#x\tKey Per I/O capability %sSupported\n", + kpios, kpios ? "" : "Not "); + printf("\n"); +} + static void stdout_id_ctrl_tmpthha(__u8 tmpthha) { __u8 rsvd3 = (tmpthha & 0xf8) >> 3; @@ -2169,7 +2302,9 @@ static void stdout_id_ctrl_cqes(__u8 cqes) static void stdout_id_ctrl_oncs(__le16 ctrl_oncs) { __u16 oncs = le16_to_cpu(ctrl_oncs); - __u16 rsvd = oncs >> 11; + __u16 rsvd13 = oncs >> 13; + bool nszs = !!(oncs & NVME_CTRL_ONCS_NAMESPACE_ZEROES); + bool maxwzd = !!(oncs & NVME_CTRL_ONCS_WRITE_ZEROES_DEALLOCATE); bool afc = !!(oncs & NVME_CTRL_ONCS_ALL_FAST_COPY); bool csa = !!(oncs & NVME_CTRL_ONCS_COPY_SINGLE_ATOMICITY); bool copy = !!(oncs & NVME_CTRL_ONCS_COPY); @@ -2182,8 +2317,12 @@ static void stdout_id_ctrl_oncs(__le16 ctrl_oncs) bool wunc = !!(oncs & NVME_CTRL_ONCS_WRITE_UNCORRECTABLE); bool cmp = !!(oncs & NVME_CTRL_ONCS_COMPARE); - if (rsvd) - printf(" [15:11] : %#x\tReserved\n", rsvd); + if (rsvd13) + printf(" [15:13] : %#x\tReserved\n", rsvd13); + printf(" [12:12] : %#x\tNamespace Zeroes %sSupported\n", + nszs, nszs ? "" : "Not "); + printf(" [11:11] : %#x\tMaximum Write Zeroes with Deallocate %sSupported\n", + maxwzd, maxwzd ? "" : "Not "); printf(" [10:10] : %#x\tAll Fast Copy %sSupported\n", afc, afc ? "" : "Not "); printf(" [9:9] : %#x\tCopy Single Atomicity %sSupported\n", @@ -2366,6 +2505,24 @@ static void stdout_id_ctrl_sgls(__le32 ctrl_sgls) printf("\n"); } +static void stdout_id_ctrl_trattr(__u8 ctrl_trattr) +{ + __u8 rsvd3 = (ctrl_trattr >> 3); + __u8 mrtll = NVME_GET(ctrl_trattr, CTRL_TRATTR_MRTLL); + __u8 tudcs = NVME_GET(ctrl_trattr, CTRL_TRATTR_TUDCS); + __u8 thmcs = NVME_GET(ctrl_trattr, CTRL_TRATTR_THMCS); + + if (rsvd3) + printf(" [7:3] : %#x\tReserved\n", rsvd3); + + printf(" [2:2] : %#x\tMemory Range Tracking Length Limit\n", mrtll); + printf(" [1:1] : %#x\tTracking User Data Changes %sSupported\n", + tudcs, tudcs ? "" : "Not "); + printf(" [0:0] : %#x\tTrack Host Memory Changes %sSupported\n", + thmcs, thmcs ? "" : "Not "); + printf("\n"); +} + static void stdout_id_ctrl_fcatt(__u8 fcatt) { __u8 rsvd = (fcatt & 0xFE) >> 1; @@ -2391,17 +2548,30 @@ static void stdout_id_ctrl_ofcs(__le16 ofcs) } +static void stdout_id_ns_size(uint64_t nsze, uint64_t ncap, uint64_t nuse) +{ + printf("nsze : %#"PRIx64"\tTotal size in logical blocks\n", + le64_to_cpu(nsze)); + printf("ncap : %#"PRIx64"\tMaximum size in logical blocks\n", + le64_to_cpu(ncap)); + printf("nuse : %#"PRIx64"\tCurrent size in logical blocks\n", + le64_to_cpu(nuse)); +} + static void stdout_id_ns_nsfeat(__u8 nsfeat) { - __u8 rsvd = (nsfeat & 0xC0) >> 6; + __u8 optrperf = (nsfeat & 0x80) >> 7; + __u8 mam = (nsfeat & 0x40) >> 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:6] : %#x\tReserved\n", rsvd); + printf(" [7:7] : %#x\tNPRG, NPRA and NORS are %sSupported\n", + optrperf, optrperf ? "" : "Not "); + printf(" [6:6] : %#x\t%s Atomicity Mode applies to write operations\n", + mam, mam ? "Multiple" : "Single"); printf(" [5:4] : %#x\tNPWG, NPWA, %s%sNPDA, and NOWS are %sSupported\n", optperf, ((optperf & 0x1) || (!optperf)) ? "NPDG, " : "", ((optperf & 0x2) || (!optperf)) ? "NPDGL, " : "", optperf ? "" : "Not "); @@ -2493,13 +2663,16 @@ static void stdout_id_ns_dps(__u8 dps) static void stdout_id_ns_nmic(__u8 nmic) { - __u8 rsvd = (nmic & 0xFE) >> 1; - __u8 mp = nmic & 0x1; + __u8 rsvd = (nmic & 0xfc) >> 2; + __u8 disns = (nmic & 0x2) >> 1; + __u8 shrns = nmic & 0x1; if (rsvd) - printf(" [7:1] : %#x\tReserved\n", rsvd); + printf(" [7:2] : %#x\tReserved\n", rsvd); + printf(" [1:1] : %#x\tNamespace is %sa Dispersed Namespace\n", + disns, disns ? "" : "Not "); printf(" [0:0] : %#x\tNamespace Multipath %sCapable\n", - mp, mp ? "" : "Not "); + shrns, shrns ? "" : "Not "); printf("\n"); } @@ -2578,6 +2751,21 @@ static void stdout_id_ns_dlfeat(__u8 dlfeat) printf("\n"); } +static void stdout_id_ns_kpios(__u8 kpios) +{ + __u8 rsvd = (kpios & 0xfc) >> 2; + __u8 kpiosns = (kpios & 0x2) >> 1; + __u8 kpioens = kpios & 0x1; + + if (rsvd) + printf(" [7:2] : %#x\tReserved\n", rsvd); + printf(" [1:1] : %#x\tKey Per I/O Capability %sSupported\n", + kpiosns, kpiosns ? "" : "Not "); + printf(" [0:0] : %#x\tKey Per I/O Capability %s\n", kpioens, + kpioens ? "Enabled" : "Disabled"); + printf("\n"); +} + static void stdout_id_ns(struct nvme_id_ns *ns, unsigned int nsid, unsigned int lba_index, bool cap_only) { @@ -2589,9 +2777,15 @@ static void stdout_id_ns(struct nvme_id_ns *ns, unsigned int nsid, if (!cap_only) { printf("NVME Identify Namespace %d:\n", nsid); - printf("nsze : %#"PRIx64"\n", le64_to_cpu(ns->nsze)); - printf("ncap : %#"PRIx64"\n", le64_to_cpu(ns->ncap)); - printf("nuse : %#"PRIx64"\n", le64_to_cpu(ns->nuse)); + + if (human) + stdout_id_ns_size(ns->nsze, ns->ncap, ns->nuse); + else { + printf("nsze : %#"PRIx64"\n", le64_to_cpu(ns->nsze)); + printf("ncap : %#"PRIx64"\n", le64_to_cpu(ns->ncap)); + printf("nuse : %#"PRIx64"\n", le64_to_cpu(ns->nuse)); + } + printf("nsfeat : %#x\n", ns->nsfeat); if (human) stdout_id_ns_nsfeat(ns->nsfeat); @@ -2648,11 +2842,17 @@ static void stdout_id_ns(struct nvme_id_ns *ns, unsigned int nsid, printf("mssrl : %u\n", le16_to_cpu(ns->mssrl)); printf("mcl : %u\n", le32_to_cpu(ns->mcl)); printf("msrc : %u\n", ns->msrc); + printf("kpios : %u\n", ns->kpios); + if (human) + stdout_id_ns_kpios(ns->kpios); } printf("nulbaf : %u\n", ns->nulbaf); if (!cap_only) { + printf("kpiodaag: %u\n", le32_to_cpu(ns->kpiodaag)); printf("anagrpid: %u\n", le32_to_cpu(ns->anagrpid)); printf("nsattr : %u\n", ns->nsattr); + if (human) + stdout_id_ns_nsattr(ns->nsattr); printf("nvmsetid: %d\n", le16_to_cpu(ns->nvmsetid)); printf("endgid : %d\n", le16_to_cpu(ns->endgid)); @@ -2866,6 +3066,27 @@ static void print_ps_power_and_scale(__le16 ctr_power, __u8 scale) } } +static void print_psd_time(const char *desc, __u8 time, __u8 ts) +{ + int width = 12 + strlen(desc); + char value[STR_LEN] = { 0 }; + + switch (time) { + case 0: + snprintf(value, sizeof(value), "-"); + break; + case 1 ... 99: + snprintf(value, sizeof(value), "%d (unit: %s)", time, + nvme_time_scale_to_string(ts)); + break; + default: + snprintf(value, sizeof(value), "reserved"); + break; + } + + printf("%*s: %s\n", width, desc, value); +} + static void stdout_id_ctrl_power(struct nvme_id_ctrl *ctrl) { int i; @@ -2897,7 +3118,12 @@ static void stdout_id_ctrl_power(struct nvme_id_ctrl *ctrl) printf("\n active_power_workload:"); print_psd_workload(ctrl->psd[i].apws); printf("\n"); - + print_psd_time("emergency power fail recovery time", ctrl->psd[i].epfrt, + ctrl->psd[i].epfr_fqv_ts & 0xf); + print_psd_time("forced quiescence vault time", ctrl->psd[i].fqvt, + ctrl->psd[i].epfr_fqv_ts >> 4); + print_psd_time("emergency power fail vault time", ctrl->psd[i].epfvt, + ctrl->psd[i].epfvts & 0xf); } } @@ -2930,6 +3156,13 @@ static void stdout_id_ctrl(struct nvme_id_ctrl *ctrl, if (human) stdout_id_ctrl_ctratt(ctrl->ctratt); printf("rrls : %#x\n", le16_to_cpu(ctrl->rrls)); + printf("bpcap : %#x\n", le16_to_cpu(ctrl->bpcap)); + if (human) + stdout_id_ctrl_bpcap(ctrl->bpcap); + printf("nssl : %#x\n", le32_to_cpu(ctrl->nssl)); + printf("plsi : %u\n", ctrl->plsi); + if (human) + stdout_id_ctrl_plsi(ctrl->plsi); printf("cntrltype : %d\n", ctrl->cntrltype); if (human) stdout_id_ctrl_cntrltype(ctrl->cntrltype); @@ -2937,6 +3170,9 @@ static void stdout_id_ctrl(struct nvme_id_ctrl *ctrl, printf("crdt1 : %u\n", le16_to_cpu(ctrl->crdt1)); printf("crdt2 : %u\n", le16_to_cpu(ctrl->crdt2)); printf("crdt3 : %u\n", le16_to_cpu(ctrl->crdt3)); + printf("crcap : %u\n", ctrl->crcap); + if (human) + stdout_id_ctrl_crcap(ctrl->crcap); printf("nvmsr : %u\n", ctrl->nvmsr); if (human) stdout_id_ctrl_nvmsr(ctrl->nvmsr); @@ -2992,6 +3228,8 @@ static void stdout_id_ctrl(struct nvme_id_ctrl *ctrl, stdout_id_ctrl_rpmbs(ctrl->rpmbs); printf("edstt : %d\n", le16_to_cpu(ctrl->edstt)); printf("dsto : %d\n", ctrl->dsto); + if (human) + stdout_id_ctrl_dsto(ctrl->dsto); printf("fwug : %d\n", ctrl->fwug); printf("kas : %d\n", le16_to_cpu(ctrl->kas)); printf("hctma : %#x\n", le16_to_cpu(ctrl->hctma)); @@ -3018,11 +3256,16 @@ static void stdout_id_ctrl(struct nvme_id_ctrl *ctrl, printf("nanagrpid : %u\n", le32_to_cpu(ctrl->nanagrpid)); printf("pels : %u\n", le32_to_cpu(ctrl->pels)); printf("domainid : %d\n", le16_to_cpu(ctrl->domainid)); + printf("kpioc : %u\n", ctrl->kpioc); + if (human) + stdout_id_ctrl_kpioc(ctrl->kpioc); + printf("mptfawr : %d\n", le16_to_cpu(ctrl->mptfawr)); 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("cqt : %d\n", le16_to_cpu(ctrl->cqt)); printf("sqes : %#x\n", ctrl->sqes); if (human) stdout_id_ctrl_sqes(ctrl->sqes); @@ -3063,6 +3306,20 @@ static void stdout_id_ctrl(struct nvme_id_ctrl *ctrl, uint128_t_to_l10n_string(le128_to_cpu(ctrl->maxdna))); printf("maxcna : %u\n", le32_to_cpu(ctrl->maxcna)); printf("oaqd : %u\n", le32_to_cpu(ctrl->oaqd)); + printf("rhiri : %d\n", ctrl->rhiri); + printf("hirt : %d\n", ctrl->hirt); + printf("cmmrtd : %d\n", le16_to_cpu(ctrl->cmmrtd)); + printf("nmmrtd : %d\n", le16_to_cpu(ctrl->nmmrtd)); + printf("minmrtg : %d\n", ctrl->minmrtg); + printf("maxmrtg : %d\n", ctrl->maxmrtg); + printf("trattr : %d\n", ctrl->trattr); + if (human) + stdout_id_ctrl_trattr(ctrl->trattr); + printf("mcudmq : %d\n", le16_to_cpu(ctrl->mcudmq)); + printf("mnsudmq : %d\n", le16_to_cpu(ctrl->mnsudmq)); + printf("mcmr : %d\n", le16_to_cpu(ctrl->mcmr)); + printf("nmcmr : %d\n", le16_to_cpu(ctrl->nmcmr)); + printf("mcdqpc : %d\n", le16_to_cpu(ctrl->mcdqpc)); printf("subnqn : %-.*s\n", (int)sizeof(ctrl->subnqn), ctrl->subnqn); printf("ioccsz : %u\n", le32_to_cpu(ctrl->ioccsz)); printf("iorcsz : %u\n", le32_to_cpu(ctrl->iorcsz)); @@ -3084,6 +3341,20 @@ static void stdout_id_ctrl(struct nvme_id_ctrl *ctrl, } } +static void stdout_id_ctrl_nvm_kpiocap(__u8 kpiocap) +{ + __u8 rsvd2 = (kpiocap & 0xfc) >> 2; + __u8 kpiosc = (kpiocap & 0x2) >> 1; + __u8 kpios = kpiocap & 0x1; + + if (rsvd2) + printf(" [7:2] : %#x\tReserved\n", rsvd2); + printf(" [1:1] : %#x\tKey Per I/O capability enabled and disabled %s in the" + "NVM subsystem\n", kpiosc, kpiosc ? "all namespaces" : "each namespace"); + printf(" [0:0] : %#x\tKey Per I/O capability %sSupported\n", kpios, + kpios ? "" : "Not "); +} + static void stdout_id_ctrl_nvm_aocs(__u16 aocs) { __u16 rsvd = (aocs & 0xfffe) >> 1; @@ -3096,6 +3367,29 @@ static void stdout_id_ctrl_nvm_aocs(__u16 aocs) printf("\n"); } +static void stdout_id_ctrl_nvm_ver(__u32 ver) +{ + printf(" NVM command set specification: %d.%d.%d\n\n", NVME_MAJOR(ver), NVME_MINOR(ver), + NVME_TERTIARY(ver)); +} + +static void stdout_id_ctrl_nvm_lbamqf(__u8 lbamqf) +{ + printf(" 0x%x: ", lbamqf); + + switch (lbamqf) { + case NVME_ID_CTRL_NVM_LBAMQF_TYPE_0: + printf("LBA Migration Queue Entry Type 0\n\n"); + break; + case NVME_ID_CTRL_NVM_LBAMQF_VENDOR_MIN ... NVME_ID_CTRL_NVM_LBAMQF_VENDOR_MAX: + printf("Vendor Specific\n\n"); + break; + default: + printf("Reserved\n\n"); + break; + } +} + static void stdout_id_ctrl_nvm(struct nvme_id_ctrl_nvm *ctrl_nvm) { int verbose = stdout_print_ops.flags & VERBOSE; @@ -3107,9 +3401,19 @@ 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("kpiocap: %u\n", ctrl_nvm->kpiocap); + if (verbose) + stdout_id_ctrl_nvm_kpiocap(ctrl_nvm->kpiocap); + printf("wzdsl : %u\n", ctrl_nvm->wzdsl); printf("aocs : %u\n", le16_to_cpu(ctrl_nvm->aocs)); if (verbose) stdout_id_ctrl_nvm_aocs(le16_to_cpu(ctrl_nvm->aocs)); + printf("ver : 0x%x\n", le32_to_cpu(ctrl_nvm->ver)); + if (verbose) + stdout_id_ctrl_nvm_ver(le32_to_cpu(ctrl_nvm->ver)); + printf("lbamqf : %u\n", ctrl_nvm->lbamqf); + if (verbose) + stdout_id_ctrl_nvm_lbamqf(ctrl_nvm->lbamqf); } static void stdout_nvm_id_ns_pic(__u8 pic) @@ -3357,11 +3661,18 @@ static void stdout_zns_id_ns(struct nvme_zns_id_ns *ns, static void stdout_list_ns(struct nvme_ns_list *ns_list) { - int i; + int i, verbose = stdout_print_ops.flags & VERBOSE; + printf("NVME Namespace List:\n"); for (i = 0; i < 1024; i++) { - if (ns_list->ns[i]) - printf("[%4u]:%#x\n", i, le32_to_cpu(ns_list->ns[i])); + if (ns_list->ns[i]) { + if (verbose) + printf("Identifier %4u: NSID %#x\n", + i, le32_to_cpu(ns_list->ns[i])); + else + printf("[%4u]:%#x\n", + i, le32_to_cpu(ns_list->ns[i])); + } } } @@ -3643,14 +3954,38 @@ static void stdout_endurance_group_list(struct nvme_id_endurance_group_list *end printf("[%4u]:%#x\n", i, le16_to_cpu(endgrp_list->identifier[i])); } +static void stdout_id_iocs_iocsc(__u64 iocsc) +{ + __u8 cpncs = NVME_GET(iocsc, IOCS_IOCSC_CPNCS); + __u8 slmcs = NVME_GET(iocsc, IOCS_IOCSC_SLMCS); + __u8 znscs = NVME_GET(iocsc, IOCS_IOCSC_ZNSCS); + __u8 kvcs = NVME_GET(iocsc, IOCS_IOCSC_KVCS); + __u8 nvmcs = NVME_GET(iocsc, IOCS_IOCSC_NVMCS); + + printf(" [4:4] : %#x\tComputational Programs Namespace Command Set %sSelected\n", + cpncs, cpncs ? "" : "Not "); + printf(" [3:3] : %#x\tSubsystem Local Memory Command Set %sSelected\n", slmcs, + slmcs ? "" : "Not "); + printf(" [2:2] : %#x\tZoned Namespace Command Set %sSelected\n", znscs, + znscs ? "" : "Not "); + printf(" [1:1] : %#x\tKey Value Command Set %sSelected\n", kvcs, kvcs ? "" : "Not "); + printf(" [0:0] : %#x\tNVM Command Set %sSelected\n", nvmcs, nvmcs ? "" : "Not "); + printf("\n"); +} + static void stdout_id_iocs(struct nvme_id_iocs *iocs) { + bool human = stdout_print_ops.flags & VERBOSE; __u16 i; - for (i = 0; i < ARRAY_SIZE(iocs->iocsc); i++) - if (iocs->iocsc[i]) + for (i = 0; i < ARRAY_SIZE(iocs->iocsc); i++) { + if (iocs->iocsc[i]) { printf("I/O Command Set Combination[%u]:%"PRIx64"\n", i, (uint64_t)le64_to_cpu(iocs->iocsc[i])); + if (human) + stdout_id_iocs_iocsc(le64_to_cpu(iocs->iocsc[i])); + } + } } static void stdout_error_log(struct nvme_error_log_page *err_log, int entries, @@ -3767,8 +4102,7 @@ static void stdout_fw_log(struct nvme_firmware_slot *fw_log, } } -static void stdout_changed_ns_list_log(struct nvme_ns_list *log, - const char *devname) +static void stdout_changed_ns_list_log(struct nvme_ns_list *log, const char *devname, bool alloc) { __u32 nsid; int i; @@ -3911,12 +4245,34 @@ static void stdout_support_log_human(__u32 support, __u8 lid) { const char *set = "supported"; const char *clr = "not supported"; + __u16 lidsp = support >> 16; printf(" LSUPP is %s\n", (support & 0x1) ? set : clr); printf(" IOS is %s\n", ((support >> 0x1) & 0x1) ? set : clr); - if (lid == NVME_LOG_LID_PERSISTENT_EVENT) { + + switch (lid) { + case NVME_LOG_LID_TELEMETRY_HOST: + printf(" Maximum Created Data Area is %s\n", + (lidsp & 0x1) ? set : clr); + break; + case NVME_LOG_LID_PERSISTENT_EVENT: printf(" Establish Context and Read 512 Bytes of Header is %s\n", - ((support >> 0x16) & 0x1) ? set : clr); + (lidsp & 0x1) ? set : clr); + break; + case NVME_LOG_LID_DISCOVER: + printf(" Extended Discovery Log Page Entry is %s\n", + (lidsp & 0x1) ? set : clr); + printf(" Port Local Entries Only is %s\n", + (lidsp & 0x2) ? set : clr); + printf(" All NVM Subsystem Entries is %s\n", + (lidsp & 0x4) ? set : clr); + break; + case NVME_LOG_LID_HOST_DISCOVER: + printf(" All Host Entries is %s\n", + (lidsp & 0x1) ? set : clr); + break; + default: + break; } } @@ -4123,6 +4479,9 @@ static void stdout_self_test_result(struct nvme_st_result *res) case NVME_ST_CODE_EXTENDED: printf(" Extended device self-test operation"); break; + case NVME_ST_CODE_HOST_INIT: + printf(" Host-Initiated Refresh operation"); + break; case NVME_ST_CODE_VS: printf(" Vendor specific"); break; @@ -4187,23 +4546,26 @@ static void stdout_sanitize_log_sprog(__u32 sprog) static void stdout_sanitize_log_sstat(__u16 status) { const char *str = nvme_sstat_status_to_string(status); + __u16 gde, mvcncld; - printf("\t[2:0]\t%s\n", str); - str = "Number of completed passes if most recent operation was overwrite"; - printf("\t[7:3]\t%s:\t%u\n", str, - (status >> NVME_SANITIZE_SSTAT_COMPLETED_PASSES_SHIFT) & - NVME_SANITIZE_SSTAT_COMPLETED_PASSES_MASK); + printf(" [2:0] : Sanitize Operation Status : %#x\t%s\n", + NVME_GET(status, SANITIZE_SSTAT_STATUS), str); + printf(" [7:3] : Overwrite Passes Completed : %u\n", + NVME_GET(status, SANITIZE_SSTAT_COMPLETED_PASSES)); - printf("\t [8]\t"); - if (status & NVME_SANITIZE_SSTAT_GLOBAL_DATA_ERASED) - str = "Global Data Erased set: no NS LB in the NVM subsystem "\ - "has been written to and no PMR in the NVM subsystem "\ - "has been enabled"; + gde = NVME_GET(status, SANITIZE_SSTAT_GLOBAL_DATA_ERASED); + if (gde) + str = "No user data has been written in the NVM subsystem and"\ + " no PMR has been enabled in the NVM subsystem"; else - str = "Global Data Erased cleared: a NS LB in the NVM "\ - "subsystem has been written to or a PMR in the NVM "\ - "subsystem has been enabled"; - printf("%s\n", str); + str = "User data has been written in the NVM subsystem or"\ + " PMR has been enabled in the NVM subsystem"; + printf(" [8:8] : Global Data Erased : %#x\t%s\n", gde, str); + + mvcncld = NVME_GET(status, SANITIZE_SSTAT_MVCNCLD); + printf(" [9:9] : Media Verification Canceled: %#x\t%scanceled\n", + mvcncld, mvcncld ? "" : "Not "); + printf("\n"); } static void stdout_estimate_sanitize_time(const char *text, uint32_t value) @@ -4212,6 +4574,23 @@ static void stdout_estimate_sanitize_time(const char *text, uint32_t value) value == 0xffffffff ? " (No time period reported)" : ""); } +static void stdout_sanitize_log_ssi(__u8 ssi, __u16 status) +{ + __u8 sans, fails; + const char *str; + + sans = NVME_GET(ssi, SANITIZE_SSI_SANS); + str = nvme_ssi_state_to_string(sans); + printf(" [3:0] : Sanitize State : %#x\t%s\n", sans, str); + + if (status == NVME_SANITIZE_SSTAT_STATUS_COMPLETED_FAILED) { + fails = NVME_GET(ssi, SANITIZE_SSI_FAILS); + str = nvme_ssi_state_to_string(fails); + printf(" [7:4] : Failure State : %#x\t%s\n", fails, str); + } + printf("\n"); +} + static void stdout_sanitize_log(struct nvme_sanitize_log_page *sanitize, const char *devname) { @@ -4245,6 +4624,12 @@ static void stdout_sanitize_log(struct nvme_sanitize_log_page *sanitize, le32_to_cpu(sanitize->etbend)); stdout_estimate_sanitize_time("Estimated Time For Crypto Erase (No-Deallocate)", le32_to_cpu(sanitize->etcend)); + stdout_estimate_sanitize_time("Estimated Time For Post-Verification Deallocation", + le32_to_cpu(sanitize->etpvds)); + + printf("Sanitize State Information (SSI) : %#x\n", sanitize->ssi); + if (human) + stdout_sanitize_log_ssi(sanitize->ssi, status); } static void stdout_select_result(enum nvme_features_id fid, __u32 result) @@ -4513,6 +4898,8 @@ static void stdout_feature_show_fields(enum nvme_features_id fid, unsigned int result, unsigned char *buf) { + const char *async = "Send async event"; + const char *no_async = "Do not send async event"; __u8 field; uint64_t ull; @@ -4583,23 +4970,41 @@ static void stdout_feature_show_fields(enum nvme_features_id fid, 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"); + NVME_FEAT_AE_DLPCN(result) ? async : no_async); + printf("\tHost Discovery Log Page Change Notification : %s\n", + NVME_FEAT_AE_HDLPCN(result) ? async : no_async); + printf("\tAVE Discovery Log Page Change Notification : %s\n", + NVME_FEAT_AE_ADLPCN(result) ? async : no_async); + printf("\tPull Model DDC Request Log Page Change Notification : %s\n", + NVME_FEAT_AE_PMDRLPCN(result) ? async : no_async); + printf("\tZone Descriptor Changed Notices : %s\n", + NVME_FEAT_AE_ZDCN(result) ? async : no_async); + printf("\tAllocated Namespace Attribute Notices : %s\n", + NVME_FEAT_AE_ANSAN(result) ? async : no_async); + printf("\tReachability Group : %s\n", + NVME_FEAT_AE_RGRP0(result) ? async : no_async); + printf("\tReachability Association : %s\n", + NVME_FEAT_AE_RASSN(result) ? async : no_async); + printf("\tTemperature Threshold Hysteresis Recovery : %s\n", + NVME_FEAT_AE_TTHRY(result) ? async : no_async); + printf("\tNormal NVM Subsystem Shutdown : %s\n", + NVME_FEAT_AE_NNSSHDN(result) ? async : no_async); printf("\tEndurance Group Event Aggregate Log Change Notices : %s\n", - NVME_FEAT_AE_EGA(result) ? "Send async event" : "Do not send async event"); + NVME_FEAT_AE_EGA(result) ? async : no_async); printf("\tLBA Status Information Notices : %s\n", - NVME_FEAT_AE_LBAS(result) ? "Send async event" : "Do not send async event"); + NVME_FEAT_AE_LBAS(result) ? async : no_async); printf("\tPredictable Latency Event Aggregate Log Change Notices : %s\n", - NVME_FEAT_AE_PLA(result) ? "Send async event" : "Do not send async event"); + NVME_FEAT_AE_PLA(result) ? async : no_async); printf("\tAsymmetric Namespace Access Change Notices : %s\n", - NVME_FEAT_AE_ANA(result) ? "Send async event" : "Do not send async event"); + NVME_FEAT_AE_ANA(result) ? async : no_async); printf("\tTelemetry Log Notices : %s\n", - NVME_FEAT_AE_TELEM(result) ? "Send async event" : "Do not send async event"); + NVME_FEAT_AE_TELEM(result) ? async : no_async); printf("\tFirmware Activation Notices : %s\n", - NVME_FEAT_AE_FW(result) ? "Send async event" : "Do not send async event"); + NVME_FEAT_AE_FW(result) ? async : no_async); printf("\tNamespace Attribute Notices : %s\n", - NVME_FEAT_AE_NAN(result) ? "Send async event" : "Do not send async event"); + NVME_FEAT_AE_NAN(result) ? async : no_async); printf("\tSMART / Health Critical Warnings : %s\n", - NVME_FEAT_AE_SMART(result) ? "Send async event" : "Do not send async event"); + NVME_FEAT_AE_SMART(result) ? async : no_async); break; case NVME_FEAT_FID_AUTO_PST: printf("\tAutonomous Power State Transition Enable (APSTE): %s\n", @@ -4661,10 +5066,14 @@ static void stdout_feature_show_fields(enum nvme_features_id fid, host_behavior->etdas ? "True" : "False"); printf("\tLBA Format Extension Enable (LBAFEE): %s\n", host_behavior->lbafee ? "True" : "False"); - printf("\tCopy Descriptor Format 2h Enabled (CDFE): %s\n", + printf("\tHost Dispersed Namespace Support (HDISNS) : %s\n", + host_behavior->hdisns ? "Enabled" : "Disabled"); + printf("\tCopy Descriptor Format 2h Enabled (CDF2E) : %s\n", host_behavior->cdfe & (1 << 2) ? "True" : "False"); - printf("\tCopy Descriptor Format 3h Enabled (CDFE): %s\n", + printf("\tCopy Descriptor Format 3h Enabled (CDF3E) : %s\n", host_behavior->cdfe & (1 << 3) ? "True" : "False"); + printf("\tCopy Descriptor Format 4h Enabled (CDF4E) : %s\n", + host_behavior->cdfe & (1 << 4) ? "True" : "False"); } break; case NVME_FEAT_FID_SANITIZE: @@ -4680,6 +5089,10 @@ static void stdout_feature_show_fields(enum nvme_features_id fid, case NVME_FEAT_FID_SPINUP_CONTROL: printf("\tSpinup control feature Enabled: %s\n", (result & 1) ? "True" : "False"); break; + case NVME_FEAT_FID_POWER_LOSS_SIGNAL: + printf("\tPower Loss Signaling Mode (PLSM): %s\n", + nvme_pls_mode_to_string(NVME_GET(result, FEAT_PLS_MODE))); + break; case NVME_FEAT_FID_ENH_CTRL_METADATA: case NVME_FEAT_FID_CTRL_METADATA: case NVME_FEAT_FID_NS_METADATA: @@ -5244,6 +5657,216 @@ static void stdout_connect_msg(nvme_ctrl_t c) printf("connecting to device: %s\n", nvme_ctrl_get_name(c)); } +static void stdout_mgmt_addr_list_log(struct nvme_mgmt_addr_list_log *ma_list) +{ + int i; + bool reserved = true; + + printf("Management Address List:\n"); + for (i = 0; i < ARRAY_SIZE(ma_list->mad); i++) { + switch (ma_list->mad[i].mat) { + case 1: + case 2: + printf("Descriptor: %d, Type: %d (%s), Address: %s\n", i, + ma_list->mad[i].mat, + ma_list->mad[i].mat == 1 ? "NVM subsystem management agent" : + "fabric interface manager", ma_list->mad[i].madrs); + reserved = false; + break; + case 0xff: + goto out; + default: + break; + } + } +out: + if (reserved) + printf("All management address descriptors reserved\n"); +} + +static void stdout_rotational_media_info_log(struct nvme_rotational_media_info_log *info) +{ + printf("endgid: %u\n", le16_to_cpu(info->endgid)); + printf("numa: %u\n", le16_to_cpu(info->numa)); + printf("nrs: %u\n", le16_to_cpu(info->nrs)); + printf("spinc: %u\n", le32_to_cpu(info->spinc)); + printf("fspinc: %u\n", le32_to_cpu(info->fspinc)); + printf("ldc: %u\n", le32_to_cpu(info->ldc)); + printf("fldc: %u\n", le32_to_cpu(info->fldc)); +} + +static void stdout_dispersed_ns_psub_log(struct nvme_dispersed_ns_participating_nss_log *log) +{ + __u64 numpsub = le64_to_cpu(log->numpsub); + __u64 i; + + printf("genctr: %"PRIu64"\n", le64_to_cpu(log->genctr)); + printf("numpsub: %"PRIu64"\n", (uint64_t)numpsub); + for (i = 0; i < numpsub; i++) + printf("participating_nss %"PRIu64": %-.*s\n", (uint64_t)i, NVME_NQN_LENGTH, + &log->participating_nss[i * NVME_NQN_LENGTH]); +} + +static void stdout_reachability_groups_log(struct nvme_reachability_groups_log *log, __u64 len) +{ + __u16 i; + __u32 j; + + print_debug("len: %"PRIu64"\n", (uint64_t)len); + printf("chngc: %"PRIu64"\n", le64_to_cpu(log->chngc)); + printf("nrgd: %u\n", le16_to_cpu(log->nrgd)); + + for (i = 0; i < le16_to_cpu(log->nrgd); i++) { + printf("rgid: %u\n", le32_to_cpu(log->rgd[i].rgid)); + printf("nnid: %u\n", le32_to_cpu(log->rgd[i].nnid)); + printf("chngc: %"PRIu64"\n", le64_to_cpu(log->rgd[i].chngc)); + for (j = 0; j < le32_to_cpu(log->rgd[i].nnid); j++) + printf("nsid%u: %u\n", j, le32_to_cpu(log->rgd[i].nsid[j])); + } +} + +static void stdout_reachability_associations_log(struct nvme_reachability_associations_log *log, + __u64 len) +{ + __u16 i; + __u32 j; + + print_debug("len: %"PRIu64"\n", (uint64_t)len); + printf("chngc: %"PRIu64"\n", le64_to_cpu(log->chngc)); + printf("nrad: %u\n", le16_to_cpu(log->nrad)); + + for (i = 0; i < le16_to_cpu(log->nrad); i++) { + printf("rasid: %u\n", le32_to_cpu(log->rad[i].rasid)); + printf("nrid: %u\n", le32_to_cpu(log->rad[i].nrid)); + printf("chngc: %"PRIu64"\n", le64_to_cpu(log->rad[i].chngc)); + printf("rac: %u\n", log->rad[i].rac); + for (j = 0; j < le32_to_cpu(log->rad[i].nrid); j++) + printf("rgid%u: %u\n", j, le32_to_cpu(log->rad[i].rgid[j])); + } +} + +static void stdout_host_discovery_log(struct nvme_host_discover_log *log) +{ + __u32 i; + __u16 j; + struct nvme_host_ext_discover_log *hedlpe; + struct nvmf_ext_attr *exat; + __u32 thdlpl = le32_to_cpu(log->thdlpl); + __u32 tel; + __u16 numexat; + int n = 0; + + printf("genctr: %"PRIu64"\n", le64_to_cpu(log->genctr)); + printf("numrec: %"PRIu64"\n", le64_to_cpu(log->numrec)); + printf("recfmt: %u\n", le16_to_cpu(log->recfmt)); + printf("hdlpf: %02x\n", log->hdlpf); + printf("thdlpl: %u\n", thdlpl); + + for (i = sizeof(*log); i < le32_to_cpu(log->thdlpl); i += tel) { + printf("hedlpe: %d\n", n++); + hedlpe = (void *)log + i; + tel = le32_to_cpu(hedlpe->tel); + numexat = le16_to_cpu(hedlpe->numexat); + printf("trtype: %s\n", nvmf_trtype_str(hedlpe->trtype)); + printf("adrfam: %s\n", + strlen(hedlpe->traddr) ? nvmf_adrfam_str(hedlpe->adrfam) : ""); + printf("eflags: %s\n", nvmf_eflags_str(le16_to_cpu(hedlpe->eflags))); + printf("hostnqn: %s\n", hedlpe->hostnqn); + printf("traddr: %s\n", hedlpe->traddr); + printf("tsas: "); + switch (hedlpe->trtype) { + case NVMF_TRTYPE_RDMA: + printf("prtype: %s, qptype: %s, cms: %s, pkey: 0x%04x\n", + nvmf_prtype_str(hedlpe->tsas.rdma.prtype), + nvmf_qptype_str(hedlpe->tsas.rdma.qptype), + nvmf_cms_str(hedlpe->tsas.rdma.cms), + le16_to_cpu(hedlpe->tsas.rdma.pkey)); + break; + case NVMF_TRTYPE_TCP: + printf("sectype: %s\n", nvmf_sectype_str(hedlpe->tsas.tcp.sectype)); + break; + default: + printf("common:\n"); + d((unsigned char *)hedlpe->tsas.common, sizeof(hedlpe->tsas.common), 16, 1); + break; + } + printf("tel: %u\n", tel); + printf("numexat: %u\n", numexat); + + exat = hedlpe->exat; + for (j = 0; j < numexat; j++) { + printf("exat: %d\n", j); + printf("exattype: %u\n", le16_to_cpu(exat->exattype)); + printf("exatlen: %u\n", le16_to_cpu(exat->exatlen)); + printf("exatval:\n"); + d((unsigned char *)exat->exatval, le16_to_cpu(exat->exatlen), 16, 1); + exat = nvmf_exat_ptr_next(exat); + } + } +} + +static void print_traddr(char *field, __u8 adrfam, __u8 *traddr) +{ + int af = AF_INET; + socklen_t size = INET_ADDRSTRLEN; + char dst[INET6_ADDRSTRLEN]; + + if (adrfam == NVMF_ADDR_FAMILY_IP6) { + af = AF_INET6; + size = INET6_ADDRSTRLEN; + } + + if (inet_ntop(af, nvmf_adrfam_str(adrfam), dst, size)) + printf("%s: %s\n", field, dst); +} + +static void stdout_ave_discovery_log(struct nvme_ave_discover_log *log) +{ + __u32 i; + __u8 j; + struct nvme_ave_discover_log_entry *adlpe; + struct nvme_ave_tr_record *atr; + __u32 tadlpl = le32_to_cpu(log->tadlpl); + __u32 tel; + __u8 numatr; + int n = 0; + + printf("genctr: %"PRIu64"\n", le64_to_cpu(log->genctr)); + printf("numrec: %"PRIu64"\n", le64_to_cpu(log->numrec)); + printf("recfmt: %u\n", le16_to_cpu(log->recfmt)); + printf("tadlpl: %u\n", tadlpl); + + for (i = sizeof(*log); i < le32_to_cpu(log->tadlpl); i += tel) { + printf("adlpe: %d\n", n++); + adlpe = (void *)log + i; + tel = le32_to_cpu(adlpe->tel); + numatr = adlpe->numatr; + printf("tel: %u\n", tel); + printf("avenqn: %s\n", adlpe->avenqn); + printf("numatr: %u\n", numatr); + + atr = adlpe->atr; + for (j = 0; j < numatr; j++) { + printf("atr: %d\n", j); + printf("aveadrfam: %s\n", nvmf_adrfam_str(atr->aveadrfam)); + printf("avetrsvcid: %u\n", le16_to_cpu(atr->avetrsvcid)); + print_traddr("avetraddr", atr->aveadrfam, atr->avetraddr); + atr++; + } + } +} + +static void stdout_pull_model_ddc_req_log(struct nvme_pull_model_ddc_req_log *log) +{ + __u32 tpdrpl = le32_to_cpu(log->tpdrpl); + __u32 osp_len = tpdrpl - offsetof(struct nvme_pull_model_ddc_req_log, osp); + + printf("ori: %u\n", log->ori); + printf("tpdrpl: %u\n", tpdrpl); + printf("osp:\n"); + d((unsigned char *)log->osp, osp_len, 16, 1); +} + static struct print_ops stdout_print_ops = { /* libnvme types.h print functions */ .ana_log = stdout_ana_log, @@ -5311,6 +5934,14 @@ static struct print_ops stdout_print_ops = { .d = stdout_d, .show_init = NULL, .show_finish = NULL, + .mgmt_addr_list_log = stdout_mgmt_addr_list_log, + .rotational_media_info_log = stdout_rotational_media_info_log, + .dispersed_ns_psub_log = stdout_dispersed_ns_psub_log, + .reachability_groups_log = stdout_reachability_groups_log, + .reachability_associations_log = stdout_reachability_associations_log, + .host_discovery_log = stdout_host_discovery_log, + .ave_discovery_log = stdout_ave_discovery_log, + .pull_model_ddc_req_log = stdout_pull_model_ddc_req_log, /* libnvme tree print functions */ .list_item = stdout_list_item, diff --git a/nvme-print.c b/nvme-print.c index 170e5c1..8492225 100644 --- a/nvme-print.c +++ b/nvme-print.c @@ -82,12 +82,34 @@ const char *nvme_cmd_to_string(int admin, __u8 opcode) case nvme_admin_virtual_mgmt: return "Virtualization Management"; case nvme_admin_nvme_mi_send: return "NVMe-MI Send"; case nvme_admin_nvme_mi_recv: return "NVMe-MI Receive"; + case nvme_admin_capacity_mgmt: return "Capacity Management"; + case nvme_admin_discovery_info_mgmt:return "Discovery Information Management (DIM)"; + case nvme_admin_fabric_zoning_recv:return "Fabric Zoning Receive"; + case nvme_admin_lockdown: return "Lockdown"; + case nvme_admin_fabric_zoning_lookup:return "Fabric Zoning Lookup"; + case nvme_admin_clear_export_nvm_res: + return "Clear Exported NVM Resource Configuration"; + case nvme_admin_fabric_zoning_send:return "Fabric Zoning Send"; + case nvme_admin_create_export_nvms:return "Create Exported NVM Subsystem"; + case nvme_admin_manage_export_nvms:return "Manage Exported NVM Subsystem"; + case nvme_admin_manage_export_ns:return "Manage Exported Namespace"; + case nvme_admin_manage_export_port:return "Manage Exported Port"; + case nvme_admin_send_disc_log_page:return "Send Discovery Log Page"; + case nvme_admin_track_send: return "Track Send"; + case nvme_admin_track_receive: return "Track Receive"; + case nvme_admin_migration_send: return "Migration Send"; + case nvme_admin_migration_receive:return "Migration Receive"; + case nvme_admin_ctrl_data_queue:return "Controller Data Queue"; case nvme_admin_dbbuf: return "Doorbell Buffer Config"; + case nvme_admin_fabrics: return "Fabrics Commands"; case nvme_admin_format_nvm: return "Format NVM"; case nvme_admin_security_send: return "Security Send"; case nvme_admin_security_recv: return "Security Receive"; case nvme_admin_sanitize_nvm: return "Sanitize"; + case nvme_admin_load_program: return "Load Program"; case nvme_admin_get_lba_status: return "Get LBA Status"; + case nvme_admin_program_act_mgmt:return "Program Activation Management"; + case nvme_admin_mem_range_set_mgmt:return "Memory Range Set Management"; } } else { switch (opcode) { @@ -718,11 +740,10 @@ void nvme_show_fw_log(struct nvme_firmware_slot *fw_log, nvme_print(fw_log, flags, fw_log, devname); } -void nvme_show_changed_ns_list_log(struct nvme_ns_list *log, - const char *devname, - nvme_print_flags_t flags) +void nvme_show_changed_ns_list_log(struct nvme_ns_list *log, const char *devname, + nvme_print_flags_t flags, bool alloc) { - nvme_print(ns_list_log, flags, log, devname); + nvme_print(ns_list_log, flags, log, devname, alloc); } void nvme_print_effects_log_pages(struct list_head *list, @@ -756,11 +777,21 @@ const char *nvme_log_to_string(__u8 lid) case NVME_LOG_LID_MI_CMD_SUPPORTED_EFFECTS: return "NVMe-MI Commands Supported and Effects"; case NVME_LOG_LID_CMD_AND_FEAT_LOCKDOWN: return "Command and Feature Lockdown"; case NVME_LOG_LID_BOOT_PARTITION: return "Boot Partition"; + case NVME_LOG_LID_ROTATIONAL_MEDIA_INFO: return "Rotational Media Information"; + case NVME_LOG_LID_DISPERSED_NS_PARTICIPATING_NSS:return "Dispersed Namespace Participating NVM Subsystems"; + case NVME_LOG_LID_MGMT_ADDR_LIST: return "Management Address List"; + case NVME_LOG_LID_PHY_RX_EOM: return "Physical Interface Receiver Eye Opening Measurement"; + case NVME_LOG_LID_REACHABILITY_GROUPS: return "Reachability Groups"; + case NVME_LOG_LID_REACHABILITY_ASSOCIATIONS: return "Reachability Associations"; + case NVME_LOG_LID_CHANGED_ALLOC_NS_LIST: return "Changed Allocated Namespace List"; case NVME_LOG_LID_FDP_CONFIGS: return "FDP Configurations"; case NVME_LOG_LID_FDP_RUH_USAGE: return "Reclaim Unit Handle Usage"; case NVME_LOG_LID_FDP_STATS: return "FDP Statistics"; case NVME_LOG_LID_FDP_EVENTS: return "FDP Events"; case NVME_LOG_LID_DISCOVER: return "Discovery"; + case NVME_LOG_LID_HOST_DISCOVER: return "Host Discovery"; + case NVME_LOG_LID_AVE_DISCOVER: return "AVE Discovery"; + case NVME_LOG_LID_PULL_MODEL_DDC_REQ: return "Pull Model DDC Request"; case NVME_LOG_LID_RESERVATION: return "Reservation Notification"; case NVME_LOG_LID_SANITIZE: return "Sanitize Status"; case NVME_LOG_LID_ZNS_CHANGED_ZONES: return "Changed Zone List"; @@ -797,6 +828,10 @@ static bool is_fahrenheit_country(const char *country) return false; } +#ifndef LC_MEASUREMENT +#define LC_MEASUREMENT LC_ALL +#endif + static bool is_temperature_fahrenheit(void) { const char *locale, *underscore; @@ -861,42 +896,50 @@ void nvme_show_sanitize_log(struct nvme_sanitize_log_page *sanitize, const char *nvme_feature_to_string(enum nvme_features_id feature) { switch (feature) { - case NVME_FEAT_FID_ARBITRATION: return "Arbitration"; - case NVME_FEAT_FID_POWER_MGMT: return "Power Management"; - case NVME_FEAT_FID_LBA_RANGE: return "LBA Range Type"; - case NVME_FEAT_FID_TEMP_THRESH: return "Temperature Threshold"; - case NVME_FEAT_FID_ERR_RECOVERY:return "Error Recovery"; - case NVME_FEAT_FID_VOLATILE_WC: return "Volatile Write Cache"; - case NVME_FEAT_FID_NUM_QUEUES: return "Number of Queues"; - case NVME_FEAT_FID_IRQ_COALESCE:return "Interrupt Coalescing"; - case NVME_FEAT_FID_IRQ_CONFIG: return "Interrupt Vector Configuration"; - case NVME_FEAT_FID_WRITE_ATOMIC:return "Write Atomicity Normal"; - case NVME_FEAT_FID_ASYNC_EVENT: return "Async Event Configuration"; - case NVME_FEAT_FID_AUTO_PST: return "Autonomous Power State Transition"; - case NVME_FEAT_FID_HOST_MEM_BUF:return "Host Memory Buffer"; - case NVME_FEAT_FID_TIMESTAMP: return "Timestamp"; - case NVME_FEAT_FID_KATO: return "Keep Alive Timer"; - case NVME_FEAT_FID_HCTM: return "Host Controlled Thermal Management"; - case NVME_FEAT_FID_NOPSC: return "Non-Operational Power State Config"; - case NVME_FEAT_FID_RRL: return "Read Recovery Level"; - case NVME_FEAT_FID_PLM_CONFIG: return "Predictable Latency Mode Config"; - case NVME_FEAT_FID_PLM_WINDOW: return "Predictable Latency Mode Window"; + case NVME_FEAT_FID_ARBITRATION: return "Arbitration"; + case NVME_FEAT_FID_POWER_MGMT: return "Power Management"; + case NVME_FEAT_FID_LBA_RANGE: return "LBA Range Type"; + case NVME_FEAT_FID_TEMP_THRESH: return "Temperature Threshold"; + case NVME_FEAT_FID_ERR_RECOVERY: return "Error Recovery"; + case NVME_FEAT_FID_VOLATILE_WC: return "Volatile Write Cache"; + case NVME_FEAT_FID_NUM_QUEUES: return "Number of Queues"; + case NVME_FEAT_FID_IRQ_COALESCE: return "Interrupt Coalescing"; + case NVME_FEAT_FID_IRQ_CONFIG: return "Interrupt Vector Configuration"; + case NVME_FEAT_FID_WRITE_ATOMIC: return "Write Atomicity Normal"; + case NVME_FEAT_FID_ASYNC_EVENT: return "Async Event Configuration"; + case NVME_FEAT_FID_AUTO_PST: return "Autonomous Power State Transition"; + case NVME_FEAT_FID_HOST_MEM_BUF: return "Host Memory Buffer"; + case NVME_FEAT_FID_TIMESTAMP: return "Timestamp"; + case NVME_FEAT_FID_KATO: return "Keep Alive Timer"; + case NVME_FEAT_FID_HCTM: return "Host Controlled Thermal Management"; + case NVME_FEAT_FID_NOPSC: return "Non-Operational Power State Config"; + case NVME_FEAT_FID_RRL: return "Read Recovery Level"; + case NVME_FEAT_FID_PLM_CONFIG: return "Predictable Latency Mode Config"; + case NVME_FEAT_FID_PLM_WINDOW: return "Predictable Latency Mode Window"; case NVME_FEAT_FID_LBA_STS_INTERVAL: return "LBA Status Interval"; case NVME_FEAT_FID_HOST_BEHAVIOR: return "Host Behavior"; - case NVME_FEAT_FID_SANITIZE: return "Sanitize"; + case NVME_FEAT_FID_SANITIZE: return "Sanitize"; case NVME_FEAT_FID_ENDURANCE_EVT_CFG: return "Endurance Event Group Configuration"; case NVME_FEAT_FID_IOCS_PROFILE: return "I/O Command Set Profile"; case NVME_FEAT_FID_SPINUP_CONTROL: return "Spinup Control"; + case NVME_FEAT_FID_POWER_LOSS_SIGNAL: return "Power Loss Signaling Config"; + case NVME_FEAT_FID_PERF_CHARACTERISTICS:return "Performance Characteristics"; + case NVME_FEAT_FID_FDP: return "Flexible Direct Placement"; + case NVME_FEAT_FID_FDP_EVENTS: return "Flexible Direct Placement Events"; + case NVME_FEAT_FID_NS_ADMIN_LABEL: return "Namespace Admin Label"; + case NVME_FEAT_FID_KEY_VALUE: return "Key Value Configuration"; + case NVME_FEAT_FID_CTRL_DATA_QUEUE: return "Controller Data Queue"; + case NVME_FEAT_FID_EMB_MGMT_CTRL_ADDR: return "Embedded Management Controller Address"; + case NVME_FEAT_FID_HOST_MGMT_AGENT_ADDR:return "Host Management Agent Address"; case NVME_FEAT_FID_ENH_CTRL_METADATA: return "Enhanced Controller Metadata"; case NVME_FEAT_FID_CTRL_METADATA: return "Controller Metadata"; - case NVME_FEAT_FID_NS_METADATA: return "Namespace Metadata"; - case NVME_FEAT_FID_SW_PROGRESS: return "Software Progress"; - case NVME_FEAT_FID_HOST_ID: return "Host Identifier"; - case NVME_FEAT_FID_RESV_MASK: return "Reservation Notification Mask"; - case NVME_FEAT_FID_RESV_PERSIST:return "Reservation Persistence"; + case NVME_FEAT_FID_NS_METADATA: return "Namespace Metadata"; + case NVME_FEAT_FID_SW_PROGRESS: return "Software Progress"; + case NVME_FEAT_FID_HOST_ID: return "Host Identifier"; + case NVME_FEAT_FID_RESV_MASK: return "Reservation Notification Mask"; + case NVME_FEAT_FID_RESV_PERSIST: return "Reservation Persistence"; case NVME_FEAT_FID_WRITE_PROTECT: return "Namespace Write Protect"; - case NVME_FEAT_FID_FDP: return "Flexible Direct Placement"; - case NVME_FEAT_FID_FDP_EVENTS: return "Flexible Direct Placement Events"; + case NVME_FEAT_FID_BP_WRITE_PROTECT: return "Boot Partition Write Protection Config"; } /* * We don't use the "default:" statement to let the compiler warning if @@ -1181,6 +1224,28 @@ const char *nvme_pel_ehai_pit_to_string(enum nvme_pel_ehai_pit pit) return "Reserved"; } +const char *nvme_ssi_state_to_string(__u8 state) +{ + switch (state) { + case NVME_SANITIZE_SSI_IDLE: + return "Idle state"; + case NVME_SANITIZE_SSI_RESTRICT_PROCESSING: + return "Restricted Processing State"; + case NVME_SANITIZE_SSI_RESTRICT_FAILURE: + return "Restricted Failure State"; + case NVME_SANITIZE_SSI_UNRESTRICT_PROCESSING: + return "Unrestricted Processing State"; + case NVME_SANITIZE_SSI_UNRESTRICT_FAILURE: + return "Unrestricted Failure State"; + case NVME_SANITIZE_SSI_MEDIA_VERIFICATION: + return "Media Verification State"; + case NVME_SANITIZE_SSI_POST_VERIF_DEALLOC: + return "Post-Verification Deallocation State"; + default: + return "Reserved"; + } +} + const char *nvme_register_symbol_to_string(int offset) { switch (offset) { @@ -1247,6 +1312,58 @@ const char *nvme_register_symbol_to_string(int offset) return "unknown"; } +const char *nvme_time_scale_to_string(__u8 ts) +{ + switch (ts) { + case 0: + return "1 microsecond"; + case 1: + return "10 microseconds"; + case 2: + return "100 microseconds"; + case 3: + return "1 millisecond"; + case 4: + return "10 milliseconds"; + case 5: + return "100 milliseconds"; + case 6: + return "1 second"; + case 7: + return "10 seconds"; + case 8: + return "100 seconds"; + case 9: + return "1,000 seconds"; + case 0xa: + return "10,000 seconds"; + case 0xb: + return "100,000 seconds"; + case 0xc: + return "1,000,000 seconds"; + default: + break; + } + + return "Reserved"; +} + +const char *nvme_pls_mode_to_string(__u8 mode) +{ + switch (mode) { + case 0: + return "not enabled"; + case 1: + return "enabled with Emergency Power Fail"; + case 2: + return "enabled with Forced Quiescence"; + default: + break; + } + + return "Reserved"; +} + void nvme_feature_show(enum nvme_features_id fid, int sel, unsigned int result) { nvme_print(show_feature, NORMAL, fid, sel, result); @@ -1374,3 +1491,48 @@ void nvme_show_finish(void) { nvme_print_output_format(show_finish); } + +void nvme_show_mgmt_addr_list_log(struct nvme_mgmt_addr_list_log *ma_list, nvme_print_flags_t flags) +{ + nvme_print(mgmt_addr_list_log, flags, ma_list); +} + +void nvme_show_rotational_media_info_log(struct nvme_rotational_media_info_log *info, + nvme_print_flags_t flags) +{ + nvme_print(rotational_media_info_log, flags, info); +} + +void nvme_show_dispersed_ns_psub_log(struct nvme_dispersed_ns_participating_nss_log *log, + nvme_print_flags_t flags) +{ + nvme_print(dispersed_ns_psub_log, flags, log); +} + +void nvme_show_reachability_groups_log(struct nvme_reachability_groups_log *log, + __u64 len, nvme_print_flags_t flags) +{ + nvme_print(reachability_groups_log, flags, log, len); +} + +void nvme_show_reachability_associations_log(struct nvme_reachability_associations_log *log, + __u64 len, nvme_print_flags_t flags) +{ + nvme_print(reachability_associations_log, flags, log, len); +} + +void nvme_show_host_discovery_log(struct nvme_host_discover_log *log, nvme_print_flags_t flags) +{ + nvme_print(host_discovery_log, flags, log); +} + +void nvme_show_ave_discovery_log(struct nvme_ave_discover_log *log, nvme_print_flags_t flags) +{ + nvme_print(ave_discovery_log, flags, log); +} + +void nvme_show_pull_model_ddc_req_log(struct nvme_pull_model_ddc_req_log *log, + nvme_print_flags_t flags) +{ + nvme_print(pull_model_ddc_req_log, flags, log); +} diff --git a/nvme-print.h b/nvme-print.h index 6107df9..ad5d4c8 100644 --- a/nvme-print.h +++ b/nvme-print.h @@ -18,10 +18,6 @@ typedef struct nvme_effects_log_node { #define POWER_OF_TWO(exponent) (1 << (exponent)) -#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); @@ -62,7 +58,7 @@ struct print_ops { void (*media_unit_stat_log)(struct nvme_media_unit_stat_log *mus); void (*mi_cmd_support_effects_log)(struct nvme_mi_cmd_supported_effects_log *mi_cmd_log, const char *devname); void (*ns_list)(struct nvme_ns_list *ns_list); - void (*ns_list_log)(struct nvme_ns_list *log, const char *devname); + void (*ns_list_log)(struct nvme_ns_list *log, const char *devname, bool alloc); void (*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); void (*persistent_event_log)(void *pevent_log_info, __u8 action, __u32 size, const char *devname); void (*predictable_latency_event_agg_log)(struct nvme_aggregate_predictable_lat_event *pea_log, __u64 log_entries, __u32 size, const char *devname); @@ -92,6 +88,15 @@ struct print_ops { void (*d)(unsigned char *buf, int len, int width, int group); void (*show_init)(void); void (*show_finish)(void); + void (*mgmt_addr_list_log)(struct nvme_mgmt_addr_list_log *ma_log); + void (*rotational_media_info_log)(struct nvme_rotational_media_info_log *info); + void (*dispersed_ns_psub_log)(struct nvme_dispersed_ns_participating_nss_log *log); + void (*reachability_groups_log)(struct nvme_reachability_groups_log *log, __u64 len); + void (*reachability_associations_log)(struct nvme_reachability_associations_log *log, + __u64 len); + void (*host_discovery_log)(struct nvme_host_discover_log *log); + void (*ave_discovery_log)(struct nvme_ave_discover_log *log); + void (*pull_model_ddc_req_log)(struct nvme_pull_model_ddc_req_log *log); /* libnvme tree print functions */ void (*list_item)(nvme_ns_t n); @@ -176,8 +181,8 @@ void nvme_show_fw_log(struct nvme_firmware_slot *fw_log, const char *devname, nvme_print_flags_t flags); void nvme_print_effects_log_pages(struct list_head *list, nvme_print_flags_t flags); -void nvme_show_changed_ns_list_log(struct nvme_ns_list *log, - const char *devname, nvme_print_flags_t flags); +void nvme_show_changed_ns_list_log(struct nvme_ns_list *log, const char *devname, + nvme_print_flags_t flags, bool alloc); void nvme_show_endurance_log(struct nvme_endurance_group_log *endurance_log, __u16 group_id, const char *devname, nvme_print_flags_t flags); void nvme_show_sanitize_log(struct nvme_sanitize_log_page *sanitize, @@ -314,6 +319,9 @@ const char *nvme_plm_window_to_string(__u32 plm); const char *nvme_ns_wp_cfg_to_string(enum nvme_ns_write_protect_cfg state); const char *nvme_pel_rci_rcpit_to_string(enum nvme_pel_rci_rcpit rcpit); const char *nvme_pel_ehai_pit_to_string(enum nvme_pel_ehai_pit pit); +const char *nvme_ssi_state_to_string(__u8 state); +const char *nvme_time_scale_to_string(__u8 ts); +const char *nvme_pls_mode_to_string(__u8 mode); void nvme_dev_full_path(nvme_ns_t n, char *path, size_t len); void nvme_generic_full_path(nvme_ns_t n, char *path, size_t len); @@ -328,12 +336,20 @@ 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); +void nvme_show_mgmt_addr_list_log(struct nvme_mgmt_addr_list_log *ma_list, + nvme_print_flags_t flags); +void nvme_show_rotational_media_info_log(struct nvme_rotational_media_info_log *info, + nvme_print_flags_t flags); +void nvme_show_dispersed_ns_psub_log(struct nvme_dispersed_ns_participating_nss_log *log, + nvme_print_flags_t flags); +void nvme_show_reachability_groups_log(struct nvme_reachability_groups_log *log, + __u64 len, nvme_print_flags_t flags); +void nvme_show_reachability_associations_log(struct nvme_reachability_associations_log *log, + __u64 len, nvme_print_flags_t flags); +void nvme_show_host_discovery_log(struct nvme_host_discover_log *log, nvme_print_flags_t flags); +void nvme_show_ave_discovery_log(struct nvme_ave_discover_log *log, nvme_print_flags_t flags); +void nvme_show_pull_model_ddc_req_log(struct nvme_pull_model_ddc_req_log *log, + nvme_print_flags_t flags); #endif /* NVME_PRINT_H */ diff --git a/nvme-wrap.c b/nvme-wrap.c index 2a18d4d..ca24028 100644 --- a/nvme-wrap.c +++ b/nvme-wrap.c @@ -119,6 +119,11 @@ int nvme_cli_get_features(struct nvme_dev *dev, return do_admin_args_op(get_features, dev, args); } +int nvme_cli_set_features(struct nvme_dev *dev, struct nvme_set_features_args *args) +{ + return do_admin_args_op(set_features, dev, args); +} + int nvme_cli_ns_mgmt_delete(struct nvme_dev *dev, __u32 nsid, __u32 timeout) { if (dev->type == NVME_DEV_DIRECT) @@ -209,6 +214,12 @@ int nvme_cli_get_log_changed_ns_list(struct nvme_dev *dev, bool rae, return do_admin_op(get_log_changed_ns_list, dev, rae, ns_log); } +int nvme_cli_get_log_changed_alloc_ns_list(struct nvme_dev *dev, bool rae, __u32 len, + struct nvme_ns_list *ns_log) +{ + return do_admin_op(get_log_changed_alloc_ns_list, dev, rae, len, ns_log); +} + int nvme_cli_get_log_cmd_effects(struct nvme_dev *dev, enum nvme_csi csi, struct nvme_cmd_effects_log *effects_log) { @@ -221,10 +232,11 @@ int nvme_cli_get_log_device_self_test(struct nvme_dev *dev, return do_admin_op(get_log_device_self_test, dev, log); } -int nvme_cli_get_log_create_telemetry_host(struct nvme_dev *dev, +int nvme_cli_get_log_create_telemetry_host_mcda(struct nvme_dev *dev, + enum nvme_telemetry_da mcda, struct nvme_telemetry_log *log) { - return do_admin_op(get_log_create_telemetry_host, dev, log); + return do_admin_op(get_log_create_telemetry_host_mcda, dev, mcda, log); } int nvme_cli_get_log_telemetry_host(struct nvme_dev *dev, __u64 offset, @@ -424,3 +436,54 @@ int nvme_cli_security_receive(struct nvme_dev *dev, return -ENODEV; } + +int nvme_cli_get_log_mgmt_addr_list(struct nvme_dev *dev, __u32 len, + struct nvme_mgmt_addr_list_log *ma_list) +{ + return do_admin_op(get_log_mgmt_addr_list, dev, len, ma_list); +} + +int nvme_cli_get_log_rotational_media_info(struct nvme_dev *dev, __u16 endgid, __u32 len, + struct nvme_rotational_media_info_log *info) +{ + if (dev->type == NVME_DEV_DIRECT) + return nvme_get_log_rotational_media_info(dev->direct.fd, endgid, len, info); + + return -ENODEV; +} + +int nvme_cli_get_log_dispersed_ns_participating_nss(struct nvme_dev *dev, __u32 nsid, __u32 len, + struct nvme_dispersed_ns_participating_nss_log *log) +{ + return do_admin_op(get_log_dispersed_ns_participating_nss, dev, nsid, len, log); +} + +int nvme_cli_get_log_reachability_groups(struct nvme_dev *dev, bool rgo, bool rae, __u32 len, + struct nvme_reachability_groups_log *log) +{ + return do_admin_op(get_log_reachability_groups, dev, rgo, rae, len, log); +} + +int nvme_cli_get_log_reachability_associations(struct nvme_dev *dev, bool rao, bool rae, __u32 len, + struct nvme_reachability_associations_log *log) +{ + return do_admin_op(get_log_reachability_associations, dev, rao, rae, len, log); +} + +int nvme_cli_get_log_host_discovery(struct nvme_dev *dev, bool allhoste, bool rae, __u32 len, + struct nvme_host_discover_log *log) +{ + return do_admin_op(get_log_host_discover, dev, allhoste, rae, len, log); +} + +int nvme_cli_get_log_ave_discovery(struct nvme_dev *dev, bool rae, __u32 len, + struct nvme_ave_discover_log *log) +{ + return do_admin_op(get_log_ave_discover, dev, rae, len, log); +} + +int nvme_cli_get_log_pull_model_ddc_req(struct nvme_dev *dev, bool rae, __u32 len, + struct nvme_pull_model_ddc_req_log *log) +{ + return do_admin_op(get_log_pull_model_ddc_req, dev, rae, len, log); +} diff --git a/nvme-wrap.h b/nvme-wrap.h index 67807b0..43f4f80 100644 --- a/nvme-wrap.h +++ b/nvme-wrap.h @@ -49,6 +49,7 @@ int nvme_cli_sanitize_nvm(struct nvme_dev *dev, int nvme_cli_get_features(struct nvme_dev *dev, struct nvme_get_features_args *args); +int nvme_cli_set_features(struct nvme_dev *dev, struct nvme_set_features_args *args); int nvme_cli_get_log(struct nvme_dev *dev, struct nvme_get_log_args *args); int nvme_cli_get_log_page(struct nvme_dev *dev, @@ -71,11 +72,14 @@ int nvme_cli_get_log_fw_slot(struct nvme_dev *dev, bool rae, struct nvme_firmware_slot *fw_log); int nvme_cli_get_log_changed_ns_list(struct nvme_dev *dev, bool rae, struct nvme_ns_list *ns_log); +int nvme_cli_get_log_changed_alloc_ns_list(struct nvme_dev *dev, bool rae, __u32 len, + struct nvme_ns_list *ns_log); int nvme_cli_get_log_cmd_effects(struct nvme_dev *dev, enum nvme_csi csi, struct nvme_cmd_effects_log *effects_log); int nvme_cli_get_log_device_self_test(struct nvme_dev *dev, struct nvme_self_test_log *log); -int nvme_cli_get_log_create_telemetry_host(struct nvme_dev *dev, +int nvme_cli_get_log_create_telemetry_host_mcda(struct nvme_dev *dev, + enum nvme_telemetry_da mcda, struct nvme_telemetry_log *log); int nvme_cli_get_log_telemetry_host(struct nvme_dev *dev, __u64 offset, __u32 len, void *log); @@ -144,4 +148,27 @@ int nvme_cli_security_send(struct nvme_dev *dev, int nvme_cli_security_receive(struct nvme_dev *dev, struct nvme_security_receive_args* args); +int nvme_cli_get_log_mgmt_addr_list(struct nvme_dev *dev, __u32 len, + struct nvme_mgmt_addr_list_log *ma_list); + +int nvme_cli_get_log_rotational_media_info(struct nvme_dev *dev, __u16 endgid, __u32 len, + struct nvme_rotational_media_info_log *info); + +int nvme_cli_get_log_dispersed_ns_participating_nss(struct nvme_dev *dev, __u32 nsid, __u32 len, + struct nvme_dispersed_ns_participating_nss_log *log); + +int nvme_cli_get_log_reachability_groups(struct nvme_dev *dev, bool rgo, bool rae, __u32 len, + struct nvme_reachability_groups_log *log); + +int nvme_cli_get_log_reachability_associations(struct nvme_dev *dev, bool rgo, bool rae, __u32 len, + struct nvme_reachability_associations_log *log); + +int nvme_cli_get_log_host_discovery(struct nvme_dev *dev, bool allhoste, bool rae, __u32 len, + struct nvme_host_discover_log *log); + +int nvme_cli_get_log_ave_discovery(struct nvme_dev *dev, bool rae, __u32 len, + struct nvme_ave_discover_log *log); + +int nvme_cli_get_log_pull_model_ddc_req(struct nvme_dev *dev, bool rae, __u32 len, + struct nvme_pull_model_ddc_req_log *log); #endif /* _NVME_WRAP_H */ diff --git a/nvme.c b/nvme.c index ea0590f..bb41284 100644 --- a/nvme.c +++ b/nvme.c @@ -185,7 +185,11 @@ static struct program nvme = { .extensions = &builtin, }; +#ifdef CONFIG_JSONC const char *output_format = "Output format: normal|json|binary"; +#else /* CONFIG_JSONC */ +const char *output_format = "Output format: normal|binary"; +#endif /* CONFIG_JSONC */ const char *timeout = "timeout value, in milliseconds"; const char *verbose = "Increase output verbosity"; @@ -200,6 +204,7 @@ 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 *endgid = "Endurance Group Identifier (ENDGID)"; 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"; @@ -480,8 +485,10 @@ int validate_output_format(const char *format, nvme_print_flags_t *flags) if (!strcmp(format, "normal")) f = NORMAL; +#ifdef CONFIG_JSONC else if (!strcmp(format, "json")) f = JSON; +#endif /* CONFIG_JSONC */ else if (!strcmp(format, "binary")) f = BINARY; else @@ -655,31 +662,41 @@ static int parse_telemetry_da(struct nvme_dev *dev, { _cleanup_free_ struct nvme_id_ctrl *id_ctrl = NULL; - size_t dalb = 0; + size_t dalb, da1lb = le16_to_cpu(telem->dalb1), da2lb = le16_to_cpu(telem->dalb2), + da3lb = le16_to_cpu(telem->dalb3), da4lb = le32_to_cpu(telem->dalb4); + bool data_area_4_support; id_ctrl = nvme_alloc(sizeof(*id_ctrl)); if (!id_ctrl) return -ENOMEM; + if (nvme_cli_identify_ctrl(dev, id_ctrl)) { + perror("identify-ctrl"); + return -errno; + } + + data_area_4_support = id_ctrl->lpa & 0x40; + switch (da) { + case NVME_TELEMETRY_DA_CTRL_DETERMINE: + if (data_area_4_support) + dalb = da4lb; + else + dalb = da3lb; + break; case NVME_TELEMETRY_DA_1: - dalb = le16_to_cpu(telem->dalb1); + dalb = da1lb; break; case NVME_TELEMETRY_DA_2: - dalb = le16_to_cpu(telem->dalb2); + dalb = da2lb; break; case NVME_TELEMETRY_DA_3: /* dalb3 >= dalb2 >= dalb1 */ - dalb = le16_to_cpu(telem->dalb3); + dalb = da3lb; break; case NVME_TELEMETRY_DA_4: - if (nvme_cli_identify_ctrl(dev, id_ctrl)) { - perror("identify-ctrl"); - return -errno; - } - - if (id_ctrl->lpa & 0x40) { - dalb = le32_to_cpu(telem->dalb4); + if (data_area_4_support) { + dalb = da4lb; } else { nvme_show_error( "Data area 4 unsupported, bit 6 of Log Page Attributes not set"); @@ -757,7 +774,7 @@ static int __create_telemetry_log_host(struct nvme_dev *dev, if (!log) return -ENOMEM; - err = nvme_cli_get_log_create_telemetry_host(dev, log); + err = nvme_cli_get_log_create_telemetry_host_mcda(dev, da, log); if (err) { if (errno) return -errno; @@ -854,6 +871,8 @@ static int get_telemetry_log(int argc, char **argv, struct command *cmd, const char *hgen = "Have the host tell the controller to generate the report"; const char *cgen = "Gather report generated by the controller."; const char *dgen = "Pick which telemetry data area to report. Default is 3 to fetch areas 1-3. Valid options are 1, 2, 3, 4."; + const char *mcda = "Host-init Maximum Created Data Area. Valid options are 0 ~ 4 " + "If given, This option will override dgen. 0 : controller determines data area"; _cleanup_free_ struct nvme_telemetry_log *log = NULL; _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; @@ -862,6 +881,7 @@ static int get_telemetry_log(int argc, char **argv, struct command *cmd, size_t total_size; __u8 *data_ptr = NULL; int data_written = 0, data_remaining = 0; + nvme_print_flags_t flags; struct config { char *file_name; @@ -869,13 +889,15 @@ static int get_telemetry_log(int argc, char **argv, struct command *cmd, bool ctrl_init; int data_area; bool rae; + __u8 mcda; }; struct config cfg = { .file_name = NULL, .host_gen = 1, .ctrl_init = false, .data_area = 3, - .rae = true, + .rae = false, + .mcda = 0xff, }; NVME_ARGS(opts, @@ -883,18 +905,34 @@ static int get_telemetry_log(int argc, char **argv, struct command *cmd, OPT_UINT("host-generate", 'g', &cfg.host_gen, hgen), OPT_FLAG("controller-init", 'c', &cfg.ctrl_init, cgen), OPT_UINT("data-area", 'd', &cfg.data_area, dgen), - OPT_FLAG("rae", 'r', &cfg.rae, rae)); + OPT_FLAG("rae", 'r', &cfg.rae, rae), + OPT_BYTE("mcda", 'm', &cfg.mcda, mcda)); err = parse_and_open(&dev, argc, argv, desc, opts); if (err) return err; + err = validate_output_format(nvme_cfg.output_format, &flags); + if (err < 0) { + nvme_show_error("Invalid output format"); + return err; + } + if (!cfg.file_name) { nvme_show_error("Please provide an output file!"); return -EINVAL; } cfg.host_gen = !!cfg.host_gen; + + if (cfg.mcda != 0xff) { + if (cfg.ctrl_init || !cfg.host_gen) { + nvme_show_error("mcda allowed for Host-init Creation!"); + return -EINVAL; + } + cfg.data_area = cfg.mcda; + } + output = open(cfg.file_name, O_WRONLY | O_CREAT | O_TRUNC, 0666); if (output < 0) { nvme_show_error("Failed to open output file %s: %s!", @@ -1075,7 +1113,10 @@ static int get_effects_log(int argc, char **argv, struct command *cmd, struct pl if (cfg.csi < 0) { __u64 cap; - + if (is_blkdev(dev)) { + nvme_show_error("Block device isn't allowed without csi"); + return -EINVAL; + } bar = mmap_registers(dev, false); if (bar) { @@ -1280,10 +1321,9 @@ static int get_fw_log(int argc, char **argv, struct command *cmd, struct plugin return err; } -static int get_changed_ns_list_log(int argc, char **argv, struct command *cmd, struct plugin *plugin) +static int get_changed_ns_list_log(int argc, char **argv, bool alloc) { - const char *desc = "Retrieve Changed Namespaces log for the given device " - "in either decoded format (default) or binary."; + _cleanup_free_ char *desc = NULL; _cleanup_free_ struct nvme_ns_list *changed_ns_list_log = NULL; _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; @@ -1301,6 +1341,11 @@ static int get_changed_ns_list_log(int argc, char **argv, struct command *cmd, s NVME_ARGS(opts, OPT_FLAG("raw-binary", 'b', &cfg.raw_binary, raw_output)); + if (asprintf(&desc, "Retrieve Changed %s Namespaces log for the given device %s", + alloc ? "Allocated" : "Attached", + "in either decoded format (default) or binary.") < 0) + desc = NULL; + err = parse_and_open(&dev, argc, argv, desc, opts); if (err) return err; @@ -1318,19 +1363,36 @@ static int get_changed_ns_list_log(int argc, char **argv, struct command *cmd, s if (!changed_ns_list_log) return -ENOMEM; - err = nvme_cli_get_log_changed_ns_list(dev, true, - changed_ns_list_log); + if (alloc) + err = nvme_cli_get_log_changed_alloc_ns_list(dev, true, + sizeof(*changed_ns_list_log), + changed_ns_list_log); + else + err = nvme_cli_get_log_changed_ns_list(dev, true, + changed_ns_list_log); if (!err) - nvme_show_changed_ns_list_log(changed_ns_list_log, - dev->name, flags); + nvme_show_changed_ns_list_log(changed_ns_list_log, dev->name, flags, alloc); else if (err > 0) nvme_show_status(err); else - nvme_show_error("changed ns list log: %s", nvme_strerror(errno)); + nvme_show_error("changed %s ns list log: %s", alloc ? "allocated" : "attached", + nvme_strerror(errno)); return err; } +static int get_changed_attach_ns_list_log(int argc, char **argv, struct command *cmd, + struct plugin *plugin) +{ + return get_changed_ns_list_log(argc, argv, false); +} + +static int get_changed_alloc_ns_list_log(int argc, char **argv, struct command *cmd, + struct plugin *plugin) +{ + return get_changed_ns_list_log(argc, argv, true); +} + static int get_pred_lat_per_nvmset_log(int argc, char **argv, struct command *cmd, struct plugin *plugin) { @@ -2253,6 +2315,7 @@ static int get_log(int argc, char **argv, struct command *cmd, struct plugin *pl _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; _cleanup_free_ unsigned char *log = NULL; int err; + nvme_print_flags_t flags; struct config { __u32 namespace_id; @@ -2305,6 +2368,12 @@ static int get_log(int argc, char **argv, struct command *cmd, struct plugin *pl if (err) return err; + err = validate_output_format(nvme_cfg.output_format, &flags); + if (err < 0) { + nvme_show_error("Invalid output format"); + return err; + } + if (cfg.aen) { cfg.log_len = 4096; cfg.log_id = (cfg.aen >> 16) & 0xff; @@ -2621,6 +2690,9 @@ static int list_ns(int argc, char **argv, struct command *cmd, struct plugin *pl return -EINVAL; } + if (argconfig_parse_seen(opts, "verbose")) + flags |= VERBOSE; + ns_list = nvme_alloc(sizeof(*ns_list)); if (!ns_list) return -ENOMEM; @@ -2753,6 +2825,32 @@ static int id_endurance_grp_list(int argc, char **argv, struct command *cmd, return err; } +static void ns_mgmt_show_error(struct nvme_dev *dev, int err, const char *cmd) +{ + _cleanup_free_ struct nvme_id_ctrl *ctrl = NULL; + + if (err < 0) { + nvme_show_error("%s namespace: %s", cmd, nvme_strerror(errno)); + return; + } + + nvme_show_init(); + + nvme_show_status(err); + + ctrl = nvme_alloc(sizeof(*ctrl)); + if (!ctrl) + return; + + err = nvme_cli_identify_ctrl(dev, ctrl); + if (!err) { + if (!(le16_to_cpu(ctrl->oacs) & NVME_CTRL_OACS_NS_MGMT)) + nvme_show_result("NS management and attachment not supported"); + } + + nvme_show_finish(); +} + static int delete_ns(int argc, char **argv, struct command *cmd, struct plugin *plugin) { const char *desc = "Delete the given namespace by " @@ -2765,6 +2863,7 @@ static int delete_ns(int argc, char **argv, struct command *cmd, struct plugin * _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; int err; + nvme_print_flags_t flags; struct config { __u32 namespace_id; @@ -2783,6 +2882,12 @@ static int delete_ns(int argc, char **argv, struct command *cmd, struct plugin * if (err) return err; + err = validate_output_format(nvme_cfg.output_format, &flags); + if (err < 0) { + nvme_show_error("Invalid output format"); + return err; + } + if (!cfg.namespace_id) { err = nvme_get_nsid(dev_fd(dev), &cfg.namespace_id); if (err < 0) { @@ -2794,10 +2899,8 @@ static int delete_ns(int argc, char **argv, struct command *cmd, struct plugin * err = nvme_cli_ns_mgmt_delete(dev, cfg.namespace_id, nvme_cfg.timeout); if (!err) printf("%s: Success, deleted nsid:%d\n", cmd->name, cfg.namespace_id); - else if (err > 0) - nvme_show_status(err); else - nvme_show_error("delete namespace: %s", nvme_strerror(errno)); + ns_mgmt_show_error(dev, err, "delete"); return err; } @@ -2808,6 +2911,7 @@ static int nvme_attach_ns(int argc, char **argv, int attach, const char *desc, s _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; int err, num; __u16 list[NVME_ID_CTRL_LIST_MAX]; + nvme_print_flags_t flags; const char *namespace_id = "namespace to attach"; const char *cont = "optional comma-sep controller id list"; @@ -2830,6 +2934,18 @@ static int nvme_attach_ns(int argc, char **argv, int attach, const char *desc, s if (err) return err; + err = validate_output_format(nvme_cfg.output_format, &flags); + if (err < 0) { + nvme_show_error("Invalid output format"); + return err; + } + + if (is_blkdev(dev)) { + nvme_show_error("%s: a block device opened (dev: %s, nsid: %d)", cmd->name, + dev->name, cfg.namespace_id); + return -EINVAL; + } + if (!cfg.namespace_id) { nvme_show_error("%s: namespace-id parameter required", cmd->name); return -EINVAL; @@ -2860,10 +2976,8 @@ static int nvme_attach_ns(int argc, char **argv, int attach, const char *desc, s if (!err) printf("%s: Success, nsid:%d\n", cmd->name, cfg.namespace_id); - else if (err > 0) - nvme_show_status(err); else - nvme_show_perror(attach ? "attach namespace" : "detach namespace"); + ns_mgmt_show_error(dev, err, attach ? "attach" : "detach"); return err; } @@ -2890,7 +3004,7 @@ static int detach_ns(int argc, char **argv, struct command *cmd, struct plugin * } static int parse_lba_num_si(struct nvme_dev *dev, const char *opt, - const char *val, __u8 flbas, __u64 *num, __u32 align) + const char *val, __u8 flbas, __u64 *num, __u64 align) { _cleanup_free_ struct nvme_ns_list *ns_list = NULL; _cleanup_free_ struct nvme_id_ctrl *ctrl = NULL; @@ -3001,7 +3115,6 @@ static int create_ns(int argc, char **argv, struct command *cmd, struct plugin * const char *nmic = "multipath and sharing capabilities (NMIC)"; const char *anagrpid = "ANA Group Identifier (ANAGRPID)"; const char *nvmsetid = "NVM Set Identifier (NVMSETID)"; - const char *endgid = "Endurance Group Identifier (ENDGID)"; const char *csi = "command set identifier (CSI)"; const char *lbstm = "logical block storage tag mask (LBSTM)"; const char *nphndls = "Number of Placement Handles (NPHNDLS)"; @@ -3024,8 +3137,9 @@ static int create_ns(int argc, char **argv, struct command *cmd, struct plugin * uint16_t phndl[128] = { 0, }; _cleanup_free_ struct nvme_id_ctrl *id = NULL; _cleanup_free_ struct nvme_id_ns_granularity_list *gr_list = NULL; - __u32 align_nsze = 1 << 20; /* Default 1 MiB */ - __u32 align_ncap = align_nsze; + __u64 align_nsze = 1 << 20; /* Default 1 MiB */ + __u64 align_ncap = align_nsze; + nvme_print_flags_t flags; struct config { __u64 nsze; @@ -3080,8 +3194,8 @@ static int create_ns(int argc, char **argv, struct command *cmd, struct plugin * OPT_BYTE("dps", 'd', &cfg.dps, dps), OPT_BYTE("nmic", 'm', &cfg.nmic, nmic), OPT_UINT("anagrp-id", 'a', &cfg.anagrpid, anagrpid), - OPT_UINT("nvmset-id", 'i', &cfg.nvmsetid, nvmsetid), - OPT_UINT("endg-id", 'e', &cfg.endgid, endgid), + OPT_SHRT("nvmset-id", 'i', &cfg.nvmsetid, nvmsetid), + OPT_SHRT("endg-id", 'e', &cfg.endgid, endgid), OPT_SUFFIX("block-size", 'b', &cfg.bs, bs), OPT_BYTE("csi", 'y', &cfg.csi, csi), OPT_SUFFIX("lbstm", 'l', &cfg.lbstm, lbstm), @@ -3098,6 +3212,12 @@ static int create_ns(int argc, char **argv, struct command *cmd, struct plugin * if (err) return err; + err = validate_output_format(nvme_cfg.output_format, &flags); + if (err < 0) { + nvme_show_error("Invalid output format"); + return err; + } + if (cfg.flbas != 0xff && cfg.bs != 0x00) { nvme_show_error( "Invalid specification of both FLBAS and Block Size, please specify only one"); @@ -3167,7 +3287,7 @@ static int create_ns(int argc, char **argv, struct command *cmd, struct plugin * int index = cfg.flbas; /* FIXME: add a proper bitmask to libnvme */ - if (!(gr_list->attributes & 1)) { + if (!(le32_to_cpu(gr_list->attributes) & 1)) { /* Only the first descriptor is valid */ index = 0; } else if (index > gr_list->num_descriptors) { @@ -3179,10 +3299,18 @@ static int create_ns(int argc, char **argv, struct command *cmd, struct plugin * } desc = &gr_list->entry[index]; - if (desc->nszegran && desc->nszegran < align_nsze) - align_nsze = desc->nszegran; - if (desc->ncapgran && desc->ncapgran < align_ncap) - align_ncap = desc->ncapgran; + if (desc->nszegran) { + print_info("enforce nsze alignment to %"PRIx64 + " because of namespace granularity requirements\n", + le64_to_cpu(desc->nszegran)); + align_nsze = le64_to_cpu(desc->nszegran); + } + if (desc->ncapgran) { + print_info("enforce ncap alignment to %"PRIx64 + " because of namespace granularity requirements\n", + le64_to_cpu(desc->ncapgran)); + align_ncap = le64_to_cpu(desc->ncapgran); + } } } @@ -3231,10 +3359,8 @@ parse_lba: err = nvme_cli_ns_mgmt_create(dev, data, &nsid, nvme_cfg.timeout, cfg.csi); if (!err) printf("%s: Success, created nsid:%d\n", cmd->name, nsid); - else if (err > 0) - nvme_show_status(err); else - nvme_show_error("create namespace: %s", nvme_strerror(errno)); + ns_mgmt_show_error(dev, err, "create"); return err; } @@ -3676,7 +3802,7 @@ static int ns_descs(int argc, char **argv, struct command *cmd, struct plugin *p } } - nsdescs = nvme_alloc(sizeof(*nsdescs)); + nsdescs = nvme_alloc(NVME_IDENTIFY_DATA_SIZE); if (!nsdescs) return -ENOMEM; @@ -3997,6 +4123,7 @@ static int id_iocs(int argc, char **argv, struct command *cmd, struct plugin *pl _cleanup_free_ struct nvme_id_iocs *iocs = NULL; _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; + nvme_print_flags_t flags; int err; struct config { @@ -4014,6 +4141,15 @@ static int id_iocs(int argc, char **argv, struct command *cmd, struct plugin *pl if (err) return err; + err = validate_output_format(nvme_cfg.output_format, &flags); + if (err < 0) { + nvme_show_error("Invalid output format"); + return err; + } + + if (argconfig_parse_seen(opts, "verbose")) + flags |= VERBOSE; + iocs = nvme_alloc(sizeof(*iocs)); if (!iocs) return -ENOMEM; @@ -4021,7 +4157,7 @@ static int id_iocs(int argc, char **argv, struct command *cmd, struct plugin *pl err = nvme_identify_iocs(dev_fd(dev), cfg.cntid, iocs); if (!err) { printf("NVMe Identify I/O Command Set:\n"); - nvme_show_id_iocs(iocs, 0); + nvme_show_id_iocs(iocs, flags); } else if (err > 0) { nvme_show_status(err); } else { @@ -4089,6 +4225,7 @@ static int get_ns_id(int argc, char **argv, struct command *cmd, struct plugin * _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; unsigned int nsid; int err; + nvme_print_flags_t flags; NVME_ARGS(opts); @@ -4096,6 +4233,12 @@ static int get_ns_id(int argc, char **argv, struct command *cmd, struct plugin * if (err) return err; + err = validate_output_format(nvme_cfg.output_format, &flags); + if (err < 0) { + nvme_show_error("Invalid output format"); + return err; + } + err = nvme_get_nsid(dev_fd(dev), &nsid); if (err < 0) { nvme_show_error("get namespace ID: %s", nvme_strerror(errno)); @@ -4399,12 +4542,14 @@ static int device_self_test(int argc, char **argv, struct command *cmd, struct p "0h Show current state of device self-test operation\n" "1h Start a short device self-test operation\n" "2h Start a extended device self-test operation\n" + "3h Start a Host-Initiated Refresh operation\n" "eh Start a vendor specific device self-test operation\n" "fh Abort the device self-test operation"; const char *wait = "Wait for the test to finish"; _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; int err; + nvme_print_flags_t flags; struct config { __u32 namespace_id; @@ -4427,6 +4572,12 @@ static int device_self_test(int argc, char **argv, struct command *cmd, struct p if (err) return err; + err = validate_output_format(nvme_cfg.output_format, &flags); + if (err < 0) { + nvme_show_error("Invalid output format"); + return err; + } + if (cfg.stc == NVME_ST_CODE_RESERVED) { _cleanup_free_ struct nvme_self_test_log *log = NULL; @@ -4471,6 +4622,8 @@ static int device_self_test(int argc, char **argv, struct command *cmd, struct p printf("Extended Device self-test started\n"); else if (cfg.stc == NVME_ST_CODE_SHORT) printf("Short Device self-test started\n"); + else if (cfg.stc == NVME_ST_CODE_HOST_INIT) + printf("Host-Initiated Refresh started\n"); if (cfg.wait && cfg.stc != NVME_ST_CODE_ABORT) err = wait_self_test(dev); @@ -4580,13 +4733,14 @@ static int get_feature_id(struct nvme_dev *dev, struct feat_cfg *cfg, static int filter_out_flags(int status) { - return status & (NVME_GET(NVME_SCT_MASK, SCT) | - NVME_GET(NVME_SC_MASK, SC)); + return status & (NVME_VAL(SCT) | NVME_VAL(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, nvme_print_flags_t flags) { int status = filter_out_flags(err); + int verbose = flags & VERBOSE; enum nvme_status_type type = NVME_STATUS_TYPE_NVME; if (!err) { @@ -4594,7 +4748,7 @@ static void get_feature_id_print(struct feat_cfg cfg, int err, __u32 result, voi nvme_feature_show(cfg.feature_id, cfg.sel, result); if (NVME_CHECK(cfg.sel, GET_FEATURES_SEL, SUPPORTED)) nvme_show_select_result(cfg.feature_id, result); - else if (cfg.human_readable) + else if (verbose || !strcmp(nvme_cfg.output_format, "json")) nvme_feature_show_fields(cfg.feature_id, result, buf); else if (buf) d(buf, cfg.data_len, 16, 1); @@ -4610,7 +4764,8 @@ static void get_feature_id_print(struct feat_cfg cfg, int err, __u32 result, voi } } -static int get_feature_id_changed(struct nvme_dev *dev, struct feat_cfg cfg) +static int get_feature_id_changed(struct nvme_dev *dev, struct feat_cfg cfg, + nvme_print_flags_t flags) { int err; int err_def = 0; @@ -4631,12 +4786,13 @@ static int get_feature_id_changed(struct nvme_dev *dev, struct feat_cfg cfg) if (err || !cfg.changed || err_def || result != result_def || (buf && buf_def && !strcmp(buf, buf_def))) - get_feature_id_print(cfg, err, result, buf); + get_feature_id_print(cfg, err, result, buf, flags); return err; } -static int get_feature_ids(struct nvme_dev *dev, struct feat_cfg cfg) +static int get_feature_ids(struct nvme_dev *dev, struct feat_cfg cfg, + nvme_print_flags_t flags) { int err = 0; int i; @@ -4650,7 +4806,7 @@ static int get_feature_ids(struct nvme_dev *dev, struct feat_cfg cfg) for (i = cfg.feature_id; i < feat_max; i++, feat_num++) { cfg.feature_id = i; - err = get_feature_id_changed(dev, cfg); + err = get_feature_id_changed(dev, cfg, flags); if (!err) continue; status = filter_out_flags(err); @@ -4686,6 +4842,7 @@ static int get_feature(int argc, char **argv, struct command *cmd, const char *cdw11 = "feature specific dword 11"; const char *human_readable = "show feature in readable format"; const char *changed = "show feature changed"; + nvme_print_flags_t flags = NORMAL; _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; int err; @@ -4716,6 +4873,12 @@ static int get_feature(int argc, char **argv, struct command *cmd, if (err) return err; + err = validate_output_format(nvme_cfg.output_format, &flags); + if (err < 0) { + nvme_show_error("Invalid output format"); + return err; + } + if (!argconfig_parse_seen(opts, "namespace-id")) { err = nvme_get_nsid(dev_fd(dev), &cfg.namespace_id); if (err < 0) { @@ -4737,9 +4900,12 @@ static int get_feature(int argc, char **argv, struct command *cmd, return -1; } + if (cfg.human_readable || argconfig_parse_seen(opts, "verbose")) + flags |= VERBOSE; + nvme_show_init(); - err = get_feature_ids(dev, cfg); + err = get_feature_ids(dev, cfg, flags); nvme_show_finish(); @@ -4867,6 +5033,7 @@ static int fw_download(int argc, char **argv, struct command *cmd, struct plugin struct stat sb; void *fw_buf; struct nvme_id_ctrl ctrl = { 0 }; + nvme_print_flags_t flags; struct config { char *fw; @@ -4895,6 +5062,12 @@ static int fw_download(int argc, char **argv, struct command *cmd, struct plugin if (err) return err; + err = validate_output_format(nvme_cfg.output_format, &flags); + if (err < 0) { + nvme_show_error("Invalid output format"); + return err; + } + fw_fd = open(cfg.fw, O_RDONLY); cfg.offset <<= 2; if (fw_fd < 0) { @@ -5024,6 +5197,7 @@ static int fw_commit(int argc, char **argv, struct command *cmd, struct plugin * _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; __u32 result; int err; + nvme_print_flags_t flags; struct config { __u8 slot; @@ -5046,6 +5220,12 @@ static int fw_commit(int argc, char **argv, struct command *cmd, struct plugin * if (err) return err; + err = validate_output_format(nvme_cfg.output_format, &flags); + if (err < 0) { + nvme_show_error("Invalid output format"); + return err; + } + if (cfg.slot > 7) { nvme_show_error("invalid slot:%d", cfg.slot); return -EINVAL; @@ -5125,7 +5305,8 @@ static int subsystem_reset(int argc, char **argv, struct command *cmd, struct pl nvme_show_error("Subsystem-reset: NVM Subsystem Reset not supported."); else nvme_show_error("Subsystem-reset: %s", nvme_strerror(errno)); - } + } else if (argconfig_parse_seen(opts, "verbose")) + printf("resetting subsystem through %s\n", dev->name); return err; } @@ -5146,6 +5327,8 @@ static int reset(int argc, char **argv, struct command *cmd, struct plugin *plug err = nvme_ctrl_reset(dev_fd(dev)); if (err < 0) nvme_show_error("Reset: %s", nvme_strerror(errno)); + else if (argconfig_parse_seen(opts, "verbose")) + printf("resetting controller %s\n", dev->name); return err; } @@ -5156,6 +5339,7 @@ static int ns_rescan(int argc, char **argv, struct command *cmd, struct plugin * _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; int err; + nvme_print_flags_t flags; NVME_ARGS(opts); @@ -5163,9 +5347,17 @@ static int ns_rescan(int argc, char **argv, struct command *cmd, struct plugin * if (err) return err; + err = validate_output_format(nvme_cfg.output_format, &flags); + if (err < 0) { + nvme_show_error("Invalid output format"); + return err; + } + err = nvme_ns_rescan(dev_fd(dev)); if (err < 0) nvme_show_error("Namespace Rescan: %s\n", nvme_strerror(errno)); + else if (argconfig_parse_seen(opts, "verbose")) + printf("rescanning namespaces through %s\n", dev->name); return err; } @@ -5184,6 +5376,7 @@ static int sanitize_cmd(int argc, char **argv, struct command *cmd, struct plugi _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; int err; + nvme_print_flags_t flags; struct config { bool no_dealloc; @@ -5227,6 +5420,12 @@ static int sanitize_cmd(int argc, char **argv, struct command *cmd, struct plugi if (err) return err; + err = validate_output_format(nvme_cfg.output_format, &flags); + if (err < 0) { + nvme_show_error("Invalid output format"); + return err; + } + switch (cfg.sanact) { case NVME_SANITIZE_SANACT_EXIT_FAILURE: case NVME_SANITIZE_SANACT_START_BLOCK_ERASE: @@ -5415,6 +5614,11 @@ static int show_registers(int argc, char **argv, struct command *cmd, struct plu if (err) return err; + if (is_blkdev(dev)) { + nvme_show_error("Only character device is allowed"); + return -EINVAL; + } + err = validate_output_format(nvme_cfg.output_format, &flags); if (err < 0) { nvme_show_error("Invalid output format"); @@ -5691,6 +5895,11 @@ static int get_register(int argc, char **argv, struct command *cmd, struct plugi if (err) return err; + if (is_blkdev(dev)) { + nvme_show_error("Only character device is allowed"); + return -EINVAL; + } + err = validate_output_format(nvme_cfg.output_format, &flags); if (err < 0) { nvme_show_error("Invalid output format"); @@ -5995,6 +6204,11 @@ static int set_register(int argc, char **argv, struct command *cmd, struct plugi if (err) return err; + if (is_blkdev(dev)) { + nvme_show_error("Only character device is allowed"); + return -EINVAL; + } + bar = mmap_registers(dev, true); if (argconfig_parse_seen(opts, "offset")) @@ -6020,6 +6234,7 @@ static int get_property(int argc, char **argv, struct command *cmd, struct plugi _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; __u64 value; int err; + nvme_print_flags_t flags = NORMAL; struct get_reg_config cfg = { .offset = -1, @@ -6035,14 +6250,23 @@ static int get_property(int argc, char **argv, struct command *cmd, struct plugi if (err) return err; + err = validate_output_format(nvme_cfg.output_format, &flags); + if (err < 0) { + nvme_show_error("Invalid output format"); + return err; + } + if (cfg.offset == -1) { nvme_show_error("offset required param"); return -EINVAL; } + if (cfg.human_readable || argconfig_parse_seen(opts, "verbose")) + flags |= VERBOSE; + err = nvme_get_single_property(dev_fd(dev), &cfg, &value); if (!err) - nvme_show_single_property(cfg.offset, value, cfg.human_readable); + nvme_show_single_property(cfg.offset, value, flags); return err; } @@ -6056,6 +6280,7 @@ static int set_property(int argc, char **argv, struct command *cmd, struct plugi _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; int err; + nvme_print_flags_t flags; struct set_reg_config cfg = { .offset = -1, @@ -6070,6 +6295,12 @@ static int set_property(int argc, char **argv, struct command *cmd, struct plugi if (err) return err; + err = validate_output_format(nvme_cfg.output_format, &flags); + if (err < 0) { + nvme_show_error("Invalid output format"); + return err; + } + if (cfg.offset == -1) { nvme_show_error("offset required param"); return -EINVAL; @@ -6358,6 +6589,7 @@ static int set_feature(int argc, char **argv, struct command *cmd, struct plugin _cleanup_fd_ int ffd = STDIN_FILENO; int err; __u32 result; + nvme_print_flags_t flags; struct config { __u32 namespace_id; @@ -6394,6 +6626,12 @@ static int set_feature(int argc, char **argv, struct command *cmd, struct plugin if (err) return err; + err = validate_output_format(nvme_cfg.output_format, &flags); + if (err < 0) { + nvme_show_error("Invalid output format"); + return err; + } + if (!argconfig_parse_seen(opts, "namespace-id")) { err = nvme_get_nsid(dev_fd(dev), &cfg.namespace_id); if (err < 0) { @@ -6509,6 +6747,7 @@ static int sec_send(int argc, char **argv, struct command *cmd, struct plugin *p _cleanup_fd_ int sec_fd = -1; unsigned int sec_size; int err; + nvme_print_flags_t flags; struct config { __u32 namespace_id; @@ -6540,6 +6779,12 @@ static int sec_send(int argc, char **argv, struct command *cmd, struct plugin *p if (err) return err; + err = validate_output_format(nvme_cfg.output_format, &flags); + if (err < 0) { + nvme_show_error("Invalid output format"); + return err; + } + if (cfg.tl == 0) { nvme_show_error("--tl unspecified or zero"); return -EINVAL; @@ -6871,6 +7116,7 @@ static int write_zeroes(int argc, char **argv, struct command *cmd, struct plugi _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; __u8 sts = 0, pif = 0; __u16 control = 0; + __u32 result = 0; int err; const char *desc = @@ -6880,6 +7126,7 @@ static int write_zeroes(int argc, char **argv, struct command *cmd, struct plugi const char *storage_tag_check = "This bit specifies the Storage Tag field shall be checked as\n" "part of end-to-end data protection processing"; + const char *nsz = "Clear all logical blocks to zero in the entire namespace"; struct config { __u32 namespace_id; @@ -6896,23 +7143,25 @@ static int write_zeroes(int argc, char **argv, struct command *cmd, struct plugi __u64 storage_tag; bool storage_tag_check; __u16 dspec; + bool nsz; }; struct config cfg = { .namespace_id = 0, .start_block = 0, .block_count = 0, - .dtype = 0, - .deac = false, + .dtype = 0, + .deac = false, .limited_retry = false, .force_unit_access = false, - .prinfo = 0, - .ref_tag = 0, + .prinfo = 0, + .ref_tag = 0, .app_tag_mask = 0, - .app_tag = 0, + .app_tag = 0, .storage_tag = 0, .storage_tag_check = false, - .dspec = 0, + .dspec = 0, + .nsz = false, }; NVME_ARGS(opts, @@ -6929,7 +7178,8 @@ static int write_zeroes(int argc, char **argv, struct command *cmd, struct plugi OPT_SHRT("app-tag", 'a', &cfg.app_tag, app_tag), OPT_SUFFIX("storage-tag", 'S', &cfg.storage_tag, storage_tag), OPT_FLAG("storage-tag-check", 'C', &cfg.storage_tag_check, storage_tag_check), - OPT_SHRT("dir-spec", 'D', &cfg.dspec, dspec_w_dtype)); + OPT_SHRT("dir-spec", 'D', &cfg.dspec, dspec_w_dtype), + OPT_FLAG("namespace-zeroes", 'Z', &cfg.nsz, nsz)); err = parse_and_open(&dev, argc, argv, desc, opts); if (err) @@ -6938,7 +7188,7 @@ static int write_zeroes(int argc, char **argv, struct command *cmd, struct plugi if (cfg.prinfo > 0xf) return -EINVAL; - if (cfg.dtype > 0xf) { + if (cfg.dtype > 0x7) { nvme_show_error("Invalid directive type, %x", cfg.dtype); return -EINVAL; } @@ -6952,6 +7202,8 @@ static int write_zeroes(int argc, char **argv, struct command *cmd, struct plugi control |= NVME_IO_DEAC; if (cfg.storage_tag_check) control |= NVME_IO_STC; + if (cfg.nsz) + control |= NVME_IO_NSZ; control |= (cfg.dtype << 4); if (!cfg.namespace_id) { err = nvme_get_nsid(dev_fd(dev), &cfg.namespace_id); @@ -6988,7 +7240,7 @@ static int write_zeroes(int argc, char **argv, struct command *cmd, struct plugi struct nvme_io_args args = { .args_size = sizeof(args), - .fd = dev_fd(dev), + .fd = dev_fd(dev), .nsid = cfg.namespace_id, .slba = cfg.start_block, .nlb = cfg.block_count, @@ -7001,15 +7253,22 @@ static int write_zeroes(int argc, char **argv, struct command *cmd, struct plugi .storage_tag = cfg.storage_tag, .dspec = cfg.dspec, .timeout = nvme_cfg.timeout, - .result = NULL, + .result = &result, }; err = nvme_write_zeros(&args); if (err < 0) nvme_show_error("write-zeroes: %s", nvme_strerror(errno)); else if (err != 0) nvme_show_status(err); - else + else { printf("NVME Write Zeroes Success\n"); + if (cfg.nsz && argconfig_parse_seen(opts, "verbose")) { + if (result & 0x1) + printf("All logical blocks in the entire namespace cleared to zero\n"); + else + printf("%d logical blocks cleared to zero\n", cfg.block_count); + } + } return err; } @@ -7035,6 +7294,7 @@ static int dsm(int argc, char **argv, struct command *cmd, struct plugin *plugin __u32 nlbs[256] = {0,}; __u64 slbas[256] = {0,}; int err; + nvme_print_flags_t flags; struct config { __u32 namespace_id; @@ -7072,6 +7332,12 @@ static int dsm(int argc, char **argv, struct command *cmd, struct plugin *plugin if (err) return err; + err = validate_output_format(nvme_cfg.output_format, &flags); + if (err < 0) { + nvme_show_error("Invalid output format"); + return err; + } + nc = argconfig_parse_comma_sep_array_u32(cfg.ctx_attrs, ctx_attrs, ARRAY_SIZE(ctx_attrs)); nb = argconfig_parse_comma_sep_array_u32(cfg.blocks, nlbs, ARRAY_SIZE(nlbs)); ns = argconfig_parse_comma_sep_array_u64(cfg.slbas, slbas, ARRAY_SIZE(slbas)); @@ -7378,6 +7644,7 @@ static int resv_acquire(int argc, char **argv, struct command *cmd, struct plugi _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; int err; + nvme_print_flags_t flags; struct config { __u32 namespace_id; @@ -7409,6 +7676,12 @@ static int resv_acquire(int argc, char **argv, struct command *cmd, struct plugi if (err) return err; + err = validate_output_format(nvme_cfg.output_format, &flags); + if (err < 0) { + nvme_show_error("Invalid output format"); + return err; + } + if (!cfg.namespace_id) { err = nvme_get_nsid(dev_fd(dev), &cfg.namespace_id); if (err < 0) { @@ -7455,6 +7728,7 @@ static int resv_register(int argc, char **argv, struct command *cmd, struct plug _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; int err; + nvme_print_flags_t flags; struct config { __u32 namespace_id; @@ -7485,6 +7759,12 @@ static int resv_register(int argc, char **argv, struct command *cmd, struct plug if (err) return err; + err = validate_output_format(nvme_cfg.output_format, &flags); + if (err < 0) { + nvme_show_error("Invalid output format"); + return err; + } + if (!cfg.namespace_id) { err = nvme_get_nsid(dev_fd(dev), &cfg.namespace_id); if (err < 0) { @@ -7539,6 +7819,7 @@ static int resv_release(int argc, char **argv, struct command *cmd, struct plugi _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; int err; + nvme_print_flags_t flags; struct config { __u32 namespace_id; @@ -7567,6 +7848,12 @@ static int resv_release(int argc, char **argv, struct command *cmd, struct plugi if (err) return err; + err = validate_output_format(nvme_cfg.output_format, &flags); + if (err < 0) { + nvme_show_error("Invalid output format"); + return err; + } + if (!cfg.namespace_id) { err = nvme_get_nsid(dev_fd(dev), &cfg.namespace_id); if (err < 0) { @@ -7611,6 +7898,7 @@ static int resv_report(int argc, char **argv, struct command *cmd, struct plugin const char *eds = "request extended data structure"; _cleanup_free_ struct nvme_resv_status *status = NULL; + _cleanup_free_ struct nvme_id_ctrl *ctrl = NULL; _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; nvme_print_flags_t flags; int err, size; @@ -7663,6 +7951,19 @@ static int resv_report(int argc, char **argv, struct command *cmd, struct plugin size = (cfg.numd + 1) << 2; + ctrl = nvme_alloc(sizeof(*ctrl)); + if (!ctrl) + return -ENOMEM; + + err = nvme_cli_identify_ctrl(dev, ctrl); + if (err) { + nvme_show_error("identify-ctrl: %s", nvme_strerror(errno)); + return -errno; + } + + if (ctrl->ctratt & NVME_CTRL_CTRATT_128_ID) + cfg.eds = true; + status = nvme_alloc(size); if (!status) return -ENOMEM; @@ -8218,6 +8519,7 @@ static int sec_recv(int argc, char **argv, struct command *cmd, struct plugin *p _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; _cleanup_free_ void *sec_buf = NULL; int err; + nvme_print_flags_t flags; struct config { __u32 namespace_id; @@ -8252,6 +8554,12 @@ static int sec_recv(int argc, char **argv, struct command *cmd, struct plugin *p if (err) return err; + err = validate_output_format(nvme_cfg.output_format, &flags); + if (err < 0) { + nvme_show_error("Invalid output format"); + return err; + } + if (cfg.size) { sec_buf = nvme_alloc(cfg.size); if (!sec_buf) @@ -8389,6 +8697,7 @@ static int capacity_mgmt(int argc, char **argv, struct command *cmd, struct plug _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; int err = -1; __u32 result; + nvme_print_flags_t flags; struct config { __u8 operation; @@ -8414,6 +8723,12 @@ static int capacity_mgmt(int argc, char **argv, struct command *cmd, struct plug if (err) return err; + err = validate_output_format(nvme_cfg.output_format, &flags); + if (err < 0) { + nvme_show_error("Invalid output format"); + return err; + } + if (cfg.operation > 0xf) { nvme_show_error("invalid operation field: %u", cfg.operation); return -1; @@ -8721,6 +9036,7 @@ static int passthru(int argc, char **argv, bool admin, __u32 result; const char *cmd_name = NULL; struct timeval start_time, end_time; + nvme_print_flags_t flags_t; struct passthru_config cfg = { .opcode = 0, @@ -8777,6 +9093,12 @@ static int passthru(int argc, char **argv, bool admin, if (err) return err; + err = validate_output_format(nvme_cfg.output_format, &flags_t); + if (err < 0) { + nvme_show_error("Invalid output format"); + return err; + } + if (cfg.opcode & 0x01) { cfg.write = true; flags = O_RDONLY; @@ -9911,6 +10233,660 @@ static int nmi_send(int argc, char **argv, struct command *cmd, struct plugin *p return nvme_mi(argc, argv, nvme_admin_nvme_mi_send, desc); } +static int get_mgmt_addr_list_log(int argc, char **argv, struct command *cmd, struct plugin *plugin) +{ + const char *desc = "Retrieve Management Address List Log, show it"; + nvme_print_flags_t flags; + int err = -1; + + _cleanup_free_ struct nvme_mgmt_addr_list_log *ma_log = NULL; + + _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; + + NVME_ARGS(opts); + + err = parse_and_open(&dev, argc, argv, desc, opts); + if (err) + return err; + + err = validate_output_format(nvme_cfg.output_format, &flags); + if (err < 0) { + nvme_show_error("Invalid output format"); + return err; + } + + ma_log = nvme_alloc(sizeof(*ma_log)); + if (!ma_log) + return -ENOMEM; + + err = nvme_cli_get_log_mgmt_addr_list(dev, sizeof(*ma_log), ma_log); + if (!err) + nvme_show_mgmt_addr_list_log(ma_log, flags); + else if (err > 0) + nvme_show_status(err); + else + nvme_show_perror("management address list log"); + + return err; +} + +static int get_rotational_media_info_log(int argc, char **argv, struct command *cmd, + struct plugin *plugin) +{ + const char *desc = "Retrieve Rotational Media Information Log, show it"; + nvme_print_flags_t flags; + int err = -1; + + _cleanup_free_ struct nvme_rotational_media_info_log *info = NULL; + + _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; + + struct config { + __u16 endgid; + }; + + struct config cfg = { + .endgid = 0, + }; + + NVME_ARGS(opts, + OPT_UINT("endg-id", 'e', &cfg.endgid, endgid)); + + err = parse_and_open(&dev, argc, argv, desc, opts); + if (err) + return err; + + err = validate_output_format(nvme_cfg.output_format, &flags); + if (err < 0) { + nvme_show_error("Invalid output format"); + return err; + } + + info = nvme_alloc(sizeof(*info)); + if (!info) + return -ENOMEM; + + err = nvme_cli_get_log_rotational_media_info(dev, cfg.endgid, sizeof(*info), info); + if (!err) + nvme_show_rotational_media_info_log(info, flags); + else if (err > 0) + nvme_show_status(err); + else + nvme_show_perror("rotational media info log"); + + return err; +} + +static int get_dispersed_ns_psub(struct nvme_dev *dev, __u32 nsid, + struct nvme_dispersed_ns_participating_nss_log **logp) +{ + int err; + __u64 header_len = sizeof(**logp); + __u64 psub_list_len; + struct nvme_get_log_args args = { + .args_size = sizeof(args), + .fd = dev_fd(dev), + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .lid = NVME_LOG_LID_DISPERSED_NS_PARTICIPATING_NSS, + .nsid = nsid, + .lpo = header_len, + }; + struct nvme_dispersed_ns_participating_nss_log *log = nvme_alloc(header_len); + + if (!log) + return -ENOMEM; + + err = nvme_cli_get_log_dispersed_ns_participating_nss(dev, nsid, header_len, log); + if (err) + goto err_free; + + psub_list_len = le64_to_cpu(log->numpsub) * NVME_NQN_LENGTH; + + log = nvme_realloc(log, header_len + psub_list_len); + if (!log) { + err = -ENOMEM; + goto err_free; + } + + args.log = log->participating_nss, + args.len = psub_list_len; + + err = nvme_cli_get_log_page(dev, NVME_LOG_PAGE_PDU_SIZE, &args); + if (err) + goto err_free; + + *logp = log; + return 0; + +err_free: + free(log); + return err; +} + +static int get_dispersed_ns_participating_nss_log(int argc, char **argv, struct command *cmd, + struct plugin *plugin) +{ + const char *desc = "Retrieve Dispersed Namespace Participating NVM Subsystems Log, show it"; + nvme_print_flags_t flags; + int err; + + _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; + + _cleanup_free_ struct nvme_dispersed_ns_participating_nss_log *log = NULL; + + struct config { + __u32 namespace_id; + }; + + struct config cfg = { + .namespace_id = 1, + }; + + NVME_ARGS(opts, OPT_UINT("namespace-id", 'n', &cfg.namespace_id, namespace_id_desired)); + + err = parse_and_open(&dev, argc, argv, desc, opts); + if (err) + return err; + + err = validate_output_format(nvme_cfg.output_format, &flags); + if (err < 0) { + nvme_show_error("Invalid output format"); + return err; + } + + err = get_dispersed_ns_psub(dev, cfg.namespace_id, &log); + if (!err) + nvme_show_dispersed_ns_psub_log(log, flags); + else if (err > 0) + nvme_show_status(err); + else + nvme_show_perror("dispersed ns participating nss log"); + + return err; +} + +static int get_log_offset(struct nvme_dev *dev, struct nvme_get_log_args *args, __u64 *offset, + __u32 len, void **log) +{ + args->lpo = *offset, + args->log = *log + *offset, + args->len = len; + *offset += args->len; + *log = nvme_realloc(*log, *offset); + if (!*log) + return -ENOMEM; + return nvme_cli_get_log_page(dev, NVME_LOG_PAGE_PDU_SIZE, args); +} + +static int get_reachability_group_desc(struct nvme_dev *dev, struct nvme_get_log_args *args, + __u64 *offset, struct nvme_reachability_groups_log **logp) +{ + int err; + struct nvme_reachability_groups_log *log = *logp; + __u16 i; + __u32 len; + + for (i = 0; i < le16_to_cpu(log->nrgd); i++) { + len = sizeof(*log->rgd); + err = get_log_offset(dev, args, offset, len, (void **)&log); + if (err) + goto err_free; + len = le32_to_cpu(log->rgd[i].nnid) * sizeof(*log->rgd[i].nsid); + err = get_log_offset(dev, args, offset, len, (void **)&log); + if (err) + goto err_free; + } + + *logp = log; + return 0; + +err_free: + free(log); + *logp = NULL; + return err; +} + +static int get_reachability_groups(struct nvme_dev *dev, bool rgo, bool rae, + struct nvme_reachability_groups_log **logp, + __u64 *lenp) +{ + int err; + struct nvme_reachability_groups_log *log; + __u64 log_len = sizeof(*log); + struct nvme_get_log_args args = { + .args_size = sizeof(args), + .fd = dev_fd(dev), + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .lid = NVME_LOG_LID_REACHABILITY_GROUPS, + .nsid = NVME_NSID_ALL, + .lsp = rgo, + .rae = rae, + }; + + log = nvme_alloc(log_len); + if (!log) + return -ENOMEM; + + err = nvme_cli_get_log_reachability_groups(dev, rgo, rae, log_len, log); + if (err) + goto err_free; + + err = get_reachability_group_desc(dev, &args, &log_len, &log); + if (err) + goto err_free; + + *logp = log; + *lenp = log_len; + return 0; + +err_free: + free(log); + return err; +} + +static int get_reachability_groups_log(int argc, char **argv, struct command *cmd, + struct plugin *plugin) +{ + const char *desc = "Retrieve Reachability Groups Log, show it"; + const char *rgo = "Return Groups Only"; + nvme_print_flags_t flags; + int err; + __u64 len = 0; + + _cleanup_free_ struct nvme_reachability_groups_log *log = NULL; + + _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; + + struct config { + bool rgo; + bool rae; + }; + + struct config cfg = { + .rgo = false, + .rae = false, + }; + + NVME_ARGS(opts, + OPT_FLAG("groups-only", 'g', &cfg.rgo, rgo), + OPT_FLAG("rae", 'r', &cfg.rae, rae)); + + err = parse_and_open(&dev, argc, argv, desc, opts); + if (err) + return err; + + err = validate_output_format(nvme_cfg.output_format, &flags); + if (err < 0) { + nvme_show_error("Invalid output format"); + return err; + } + + err = get_reachability_groups(dev, cfg.rgo, cfg.rae, &log, &len); + if (!err) + nvme_show_reachability_groups_log(log, len, flags); + else if (err > 0) + nvme_show_status(err); + else + nvme_show_perror("reachability groups log"); + + return err; +} + +static int get_reachability_association_desc(struct nvme_dev *dev, struct nvme_get_log_args *args, + __u64 *offset, + struct nvme_reachability_associations_log **logp) +{ + int err; + struct nvme_reachability_associations_log *log = *logp; + __u16 i; + __u32 len; + + for (i = 0; i < le16_to_cpu(log->nrad); i++) { + len = sizeof(*log->rad); + err = get_log_offset(dev, args, offset, len, (void **)&log); + if (err) + goto err_free; + len = le32_to_cpu(log->rad[i].nrid) * sizeof(*log->rad[i].rgid); + err = get_log_offset(dev, args, offset, len, (void **)&log); + if (err) + goto err_free; + } + + *logp = log; + return 0; + +err_free: + free(log); + *logp = NULL; + return err; +} + +static int get_reachability_associations(struct nvme_dev *dev, bool rao, bool rae, + struct nvme_reachability_associations_log **logp, + __u64 *lenp) +{ + int err; + struct nvme_reachability_associations_log *log; + __u64 log_len = sizeof(*log); + struct nvme_get_log_args args = { + .args_size = sizeof(args), + .fd = dev_fd(dev), + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .lid = NVME_LOG_LID_REACHABILITY_ASSOCIATIONS, + .nsid = NVME_NSID_ALL, + .lsp = rao, + .rae = rae, + }; + + log = nvme_alloc(log_len); + if (!log) + return -ENOMEM; + + err = nvme_cli_get_log_reachability_associations(dev, rao, rae, log_len, log); + if (err) + goto err_free; + + err = get_reachability_association_desc(dev, &args, &log_len, &log); + if (err) + goto err_free; + + *logp = log; + *lenp = log_len; + return 0; + +err_free: + free(log); + return err; +} + +static int get_reachability_associations_log(int argc, char **argv, struct command *cmd, + struct plugin *plugin) +{ + const char *desc = "Retrieve Reachability Associations Log, show it"; + const char *rao = "Return Associations Only"; + nvme_print_flags_t flags; + int err; + __u64 len = 0; + + _cleanup_free_ struct nvme_reachability_associations_log *log = NULL; + + _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; + + struct config { + bool rao; + bool rae; + }; + + struct config cfg = { + .rao = false, + .rae = false, + }; + + NVME_ARGS(opts, + OPT_FLAG("associations-only", 'a', &cfg.rao, rao), + OPT_FLAG("rae", 'r', &cfg.rae, rae)); + + err = parse_and_open(&dev, argc, argv, desc, opts); + if (err) + return err; + + err = validate_output_format(nvme_cfg.output_format, &flags); + if (err < 0) { + nvme_show_error("Invalid output format"); + return err; + } + + err = get_reachability_associations(dev, cfg.rao, cfg.rae, &log, &len); + if (!err) + nvme_show_reachability_associations_log(log, len, flags); + else if (err > 0) + nvme_show_status(err); + else + nvme_show_perror("reachability associations log"); + + return err; +} + +static int get_host_discovery(struct nvme_dev *dev, bool allhoste, bool rae, + struct nvme_host_discover_log **logp) +{ + int err; + struct nvme_host_discover_log *log; + __u64 log_len = sizeof(*log); + struct nvme_get_log_args args = { + .args_size = sizeof(args), + .fd = dev_fd(dev), + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .lid = NVME_LOG_LID_HOST_DISCOVER, + .nsid = NVME_NSID_ALL, + .lsp = allhoste, + .rae = rae, + }; + + log = nvme_alloc(log_len); + if (!log) + return -ENOMEM; + + err = nvme_cli_get_log_host_discovery(dev, allhoste, rae, log_len, log); + if (err) + goto err_free; + + log_len = le32_to_cpu(log->thdlpl); + err = get_log_offset(dev, &args, &log_len, le32_to_cpu(log->thdlpl) - log_len, + (void **)&log); + if (err) + goto err_free; + + *logp = log; + return 0; + +err_free: + free(log); + return err; +} + +static int get_host_discovery_log(int argc, char **argv, struct command *cmd, struct plugin *plugin) +{ + const char *desc = "Retrieve Host Discovery Log, show it"; + const char *allhoste = "All Host Entries"; + nvme_print_flags_t flags; + int err; + + _cleanup_free_ struct nvme_host_discover_log *log = NULL; + + _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; + + struct config { + bool allhoste; + bool rae; + }; + + struct config cfg = { + .allhoste = false, + .rae = false, + }; + + NVME_ARGS(opts, + OPT_FLAG("all-host-entries", 'a', &cfg.allhoste, allhoste), + OPT_FLAG("rae", 'r', &cfg.rae, rae)); + + err = parse_and_open(&dev, argc, argv, desc, opts); + if (err) + return err; + + err = validate_output_format(nvme_cfg.output_format, &flags); + if (err < 0) { + nvme_show_error("Invalid output format"); + return err; + } + + err = get_host_discovery(dev, cfg.allhoste, cfg.rae, &log); + if (!err) + nvme_show_host_discovery_log(log, flags); + else if (err > 0) + nvme_show_status(err); + else + nvme_show_perror("host discovery log"); + + return err; +} + +static int get_ave_discovery(struct nvme_dev *dev, bool rae, struct nvme_ave_discover_log **logp) +{ + int err; + struct nvme_ave_discover_log *log; + __u64 log_len = sizeof(*log); + struct nvme_get_log_args args = { + .args_size = sizeof(args), + .fd = dev_fd(dev), + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .lid = NVME_LOG_LID_AVE_DISCOVER, + .nsid = NVME_NSID_ALL, + .rae = rae, + }; + + log = nvme_alloc(log_len); + if (!log) + return -ENOMEM; + + err = nvme_cli_get_log_ave_discovery(dev, rae, log_len, log); + if (err) + goto err_free; + + log_len = le32_to_cpu(log->tadlpl); + err = get_log_offset(dev, &args, &log_len, le32_to_cpu(log->tadlpl) - log_len, + (void **)&log); + if (err) + goto err_free; + + *logp = log; + return 0; + +err_free: + free(log); + return err; +} + +static int get_ave_discovery_log(int argc, char **argv, struct command *cmd, struct plugin *plugin) +{ + const char *desc = "Retrieve AVE Discovery Log, show it"; + nvme_print_flags_t flags; + int err; + + _cleanup_free_ struct nvme_ave_discover_log *log = NULL; + + _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; + + struct config { + bool rae; + }; + + struct config cfg = { + .rae = false, + }; + + NVME_ARGS(opts, OPT_FLAG("rae", 'r', &cfg.rae, rae)); + + err = parse_and_open(&dev, argc, argv, desc, opts); + if (err) + return err; + + err = validate_output_format(nvme_cfg.output_format, &flags); + if (err < 0) { + nvme_show_error("Invalid output format"); + return err; + } + + err = get_ave_discovery(dev, cfg.rae, &log); + if (!err) + nvme_show_ave_discovery_log(log, flags); + else if (err > 0) + nvme_show_status(err); + else + nvme_show_perror("ave discovery log"); + + return err; +} + +static int get_pull_model_ddc_req(struct nvme_dev *dev, + bool rae, struct nvme_pull_model_ddc_req_log **logp) +{ + int err; + struct nvme_pull_model_ddc_req_log *log; + __u64 log_len = sizeof(*log); + struct nvme_get_log_args args = { + .args_size = sizeof(args), + .fd = dev_fd(dev), + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .lid = NVME_LOG_LID_PULL_MODEL_DDC_REQ, + .nsid = NVME_NSID_ALL, + .rae = rae, + }; + + log = nvme_alloc(log_len); + if (!log) + return -ENOMEM; + + err = nvme_cli_get_log_pull_model_ddc_req(dev, rae, log_len, log); + if (err) + goto err_free; + + log_len = le32_to_cpu(log->tpdrpl); + err = get_log_offset(dev, &args, &log_len, le32_to_cpu(log->tpdrpl) - log_len, + (void **)&log); + if (err) + goto err_free; + + *logp = log; + return 0; + +err_free: + free(log); + return err; +} + +static int get_pull_model_ddc_req_log(int argc, char **argv, struct command *cmd, + struct plugin *plugin) +{ + const char *desc = "Retrieve Pull Model DDC Request Log, show it"; + nvme_print_flags_t flags; + int err; + + _cleanup_free_ struct nvme_pull_model_ddc_req_log *log = NULL; + + _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; + + struct config { + bool rae; + }; + + struct config cfg = { + .rae = false, + }; + + NVME_ARGS(opts, OPT_FLAG("rae", 'r', &cfg.rae, rae)); + + err = parse_and_open(&dev, argc, argv, desc, opts); + if (err) + return err; + + err = validate_output_format(nvme_cfg.output_format, &flags); + if (err < 0) { + nvme_show_error("Invalid output format"); + return err; + } + + err = get_pull_model_ddc_req(dev, cfg.rae, &log); + if (!err) + nvme_show_pull_model_ddc_req_log(log, flags); + else if (err > 0) + nvme_show_status(err); + else + nvme_show_perror("pull model ddc req log"); + + return err; +} + void register_extension(struct plugin *plugin) { plugin->parent = &nvme; diff --git a/nvme.h b/nvme.h index cae4345..363a82d 100644 --- a/nvme.h +++ b/nvme.h @@ -31,6 +31,7 @@ #include "util/mem.h" #include "util/argconfig.h" #include "util/cleanup.h" +#include "util/types.h" enum nvme_print_flags { NORMAL = 0, @@ -147,7 +148,6 @@ const char *nvme_select_to_string(int sel); void d(unsigned char *buf, int len, int width, int group); void d_raw(unsigned char *buf, unsigned len); -uint64_t int48_to_long(uint8_t *data); int get_reg_size(int offset); bool nvme_is_ctrl_reg(int offset); diff --git a/nvme.spec.in b/nvme.spec.in index 43fc930..551c9b7 100644 --- a/nvme.spec.in +++ b/nvme.spec.in @@ -32,6 +32,7 @@ touch %{buildroot}@SYSCONFDIR@/nvme/hostid %ghost @SYSCONFDIR@/nvme/config.json @UDEVRULESDIR@/65-persistent-net-nbft.rules @UDEVRULESDIR@/70-nvmf-autoconnect.rules +@UDEVRULESDIR@/70-nvmf-keys.rules @UDEVRULESDIR@/71-nvmf-netapp.rules @DRACUTRILESDIR@/70-nvmf-autoconnect.conf @SYSTEMDDIR@/nvmf-connect@.service diff --git a/nvmf-autoconnect/udev-rules/70-nvmf-keys.rules.in b/nvmf-autoconnect/udev-rules/70-nvmf-keys.rules.in index 0b175be..13b0eba 100644 --- a/nvmf-autoconnect/udev-rules/70-nvmf-keys.rules.in +++ b/nvmf-autoconnect/udev-rules/70-nvmf-keys.rules.in @@ -4,4 +4,4 @@ # the PSK keyring module gets loaded. # # -ACTION=="add", SUBSYSTEM=="module", KERNEL=="nvme_tcp", TEST=="@SYSCONFDIR@/tls-keys", RUN+="@SBINDIR@/nvme tls --import --keyfile @SYSCONFDIR@/tls-keys" +ACTION=="add", SUBSYSTEM=="module", KERNEL=="nvme_tcp", TEST=="@SYSCONFDIR@/nvme/tls-keys", RUN+="@SBINDIR@/nvme tls --import --keyfile @SYSCONFDIR@/nvme/tls-keys" diff --git a/nvmf-autoconnect/udev-rules/71-nvmf-netapp.rules.in b/nvmf-autoconnect/udev-rules/71-nvmf-netapp.rules.in index 99b6a8b..c76a3c4 100644 --- a/nvmf-autoconnect/udev-rules/71-nvmf-netapp.rules.in +++ b/nvmf-autoconnect/udev-rules/71-nvmf-netapp.rules.in @@ -1,5 +1,5 @@ -# Enable round-robin for NetApp ONTAP and NetApp E-Series -ACTION=="add", SUBSYSTEM=="nvme-subsystem", ATTR{subsystype}=="nvm", ATTR{model}=="NetApp ONTAP Controller", ATTR{iopolicy}="round-robin" +# Set appropriate iopolicy for NetApp ONTAP and NetApp E-Series +ACTION=="add", SUBSYSTEM=="nvme-subsystem", ATTR{subsystype}=="nvm", ATTR{model}=="NetApp ONTAP Controller", ATTR{iopolicy}="queue-depth" ACTION=="add", SUBSYSTEM=="nvme-subsystem", ATTR{subsystype}=="nvm", ATTR{model}=="NetApp E-Series", ATTR{iopolicy}="round-robin" # Set ctrl_loss_tmo to -1 for NetApp ONTAP NVMe/TCP diff --git a/plugins/amzn/amzn-nvme.c b/plugins/amzn/amzn-nvme.c index d359cc3..983c31b 100644 --- a/plugins/amzn/amzn-nvme.c +++ b/plugins/amzn/amzn-nvme.c @@ -10,15 +10,59 @@ #include "nvme.h" #include "libnvme.h" #include "plugin.h" +#include "nvme-print.h" #define CREATE_CMD #include "amzn-nvme.h" +#define AMZN_NVME_STATS_LOGPAGE_ID 0xD0 +#define AMZN_NVME_STATS_MAGIC 0x3C23B510 + +#define array_add_obj json_array_add_value_object +#define obj_add_array json_object_add_value_array +#define obj_add_obj json_object_add_value_object +#define obj_add_uint json_object_add_value_uint +#define obj_add_uint64 json_object_add_value_uint64 + struct nvme_vu_id_ctrl_field { __u8 bdev[32]; __u8 reserved0[992]; }; +struct amzn_latency_histogram_bin { + __u64 lower; + __u64 upper; + __u32 count; + __u32 reserved; +} __packed; + +struct amzn_latency_histogram { + __u64 num_bins; + struct amzn_latency_histogram_bin bins[64]; +} __packed; + +struct amzn_latency_log_page { + __u32 magic; + __u32 reserved0; + __u64 total_read_ops; + __u64 total_write_ops; + __u64 total_read_bytes; + __u64 total_write_bytes; + __u64 total_read_time; + __u64 total_write_time; + __u64 ebs_volume_performance_exceeded_iops; + __u64 ebs_volume_performance_exceeded_tp; + __u64 ec2_instance_ebs_performance_exceeded_iops; + __u64 ec2_instance_ebs_performance_exceeded_tp; + __u64 volume_queue_length; + __u8 reserved1[416]; + + struct amzn_latency_histogram read_io_latency_histogram; + struct amzn_latency_histogram write_io_latency_histogram; + + __u8 reserved2[496]; +} __packed; + static void json_amzn_id_ctrl(struct nvme_vu_id_ctrl_field *id, char *bdev, struct json_object *root) @@ -52,3 +96,180 @@ static int id_ctrl(int argc, char **argv, struct command *cmd, struct plugin *pl { return __id_ctrl(argc, argv, cmd, plugin, amzn_id_ctrl); } + +static void amzn_print_latency_histogram(struct amzn_latency_histogram *hist) +{ + printf("=================================\n"); + printf("Lower Upper IO Count\n"); + printf("=================================\n"); + + for (int b = 0; b < hist->num_bins && b < 64; b++) { + struct amzn_latency_histogram_bin *bin = &hist->bins[b]; + + printf("[%-8"PRIu64" - %-8"PRIu64"] => %-8u\n", + (uint64_t)bin->lower, (uint64_t)bin->upper, bin->count); + } + + printf("=================================\n\n"); +} + +#ifdef CONFIG_JSONC +static void amzn_json_add_histogram(struct json_object *root, + struct amzn_latency_histogram *hist) +{ + struct json_object *bins = json_create_array(); + + obj_add_uint64(root, "num_bins", hist->num_bins); + obj_add_array(root, "bins", bins); + + for (int b = 0; b < hist->num_bins && b < 64; b++) { + struct amzn_latency_histogram_bin *bin = &hist->bins[b]; + struct json_object *json_bin = json_create_object(); + + obj_add_uint64(json_bin, "lower", bin->lower); + obj_add_uint64(json_bin, "upper", bin->upper); + obj_add_uint(json_bin, "count", bin->count); + + array_add_obj(bins, json_bin); + } +} + +static void amzn_print_json_stats(struct amzn_latency_log_page *log) +{ + struct json_object *root = json_create_object(); + struct json_object *r_hist = json_create_object(); + struct json_object *w_hist = json_create_object(); + + obj_add_uint64(root, "total_read_ops", log->total_read_ops); + obj_add_uint64(root, "total_write_ops", log->total_write_ops); + obj_add_uint64(root, "total_read_bytes", log->total_read_bytes); + obj_add_uint64(root, "total_write_bytes", log->total_write_bytes); + obj_add_uint64(root, "total_read_time", log->total_read_time); + obj_add_uint64(root, "total_write_time", log->total_write_time); + obj_add_uint64(root, "ebs_volume_performance_exceeded_iops", + log->ebs_volume_performance_exceeded_iops); + obj_add_uint64(root, "ebs_volume_performance_exceeded_tp", + log->ebs_volume_performance_exceeded_tp); + obj_add_uint64(root, + "ec2_instance_ebs_performance_exceeded_iops", + log->ec2_instance_ebs_performance_exceeded_iops); + obj_add_uint64(root, "ec2_instance_ebs_performance_exceeded_tp", + log->ec2_instance_ebs_performance_exceeded_tp); + obj_add_uint64(root, "volume_queue_length", log->volume_queue_length); + + amzn_json_add_histogram(r_hist, &log->read_io_latency_histogram); + obj_add_obj(root, "read_io_latency_histogram", r_hist); + amzn_json_add_histogram(w_hist, &log->write_io_latency_histogram); + obj_add_obj(root, "write_io_latency_histogram", w_hist); + + json_print_object(root, NULL); + printf("\n"); + + json_free_object(root); +} +#else /* CONFIG_JSONC */ +#define amzn_print_json_stats(log) +#endif /* CONFIG_JSONC */ + +static void amzn_print_normal_stats(struct amzn_latency_log_page *log) +{ + printf("Total Ops:\n"); + printf(" Read: %"PRIu64"\n", (uint64_t)log->total_read_ops); + printf(" Write: %"PRIu64"\n", (uint64_t)log->total_write_ops); + printf("Total Bytes:\n"); + printf(" Read: %"PRIu64"\n", (uint64_t)log->total_read_bytes); + printf(" Write: %"PRIu64"\n", (uint64_t)log->total_write_bytes); + printf("Total Time (us):\n"); + printf(" Read: %"PRIu64"\n", (uint64_t)log->total_read_time); + printf(" Write: %"PRIu64"\n\n", (uint64_t)log->total_write_time); + + printf("EBS Volume Performance Exceeded (us):\n"); + printf(" IOPS: %"PRIu64"\n", (uint64_t)log->ebs_volume_performance_exceeded_iops); + printf(" Throughput: %"PRIu64"\n\n", + (uint64_t)log->ebs_volume_performance_exceeded_tp); + printf("EC2 Instance EBS Performance Exceeded (us):\n"); + printf(" IOPS: %"PRIu64"\n", + (uint64_t)log->ec2_instance_ebs_performance_exceeded_iops); + printf(" Throughput: %"PRIu64"\n\n", + (uint64_t)log->ec2_instance_ebs_performance_exceeded_tp); + + printf("Queue Length (point in time): %"PRIu64"\n\n", + (uint64_t)log->volume_queue_length); + + printf("Read IO Latency Histogram\n"); + amzn_print_latency_histogram(&log->read_io_latency_histogram); + + printf("Write IO Latency Histogram\n"); + amzn_print_latency_histogram(&log->write_io_latency_histogram); +} + +static int get_stats(int argc, char **argv, struct command *cmd, + struct plugin *plugin) +{ + const char *desc = "display command latency statistics"; + struct nvme_dev *dev; + struct amzn_latency_log_page log = { 0 }; + int rc; + nvme_print_flags_t flags; + int err; + + struct config { + char *output_format; + }; + + struct config cfg = { + .output_format = "normal", + }; + + OPT_ARGS(opts) = { + OPT_FMT("output-format", 'o', &cfg.output_format, + "Output Format: normal|json"), + OPT_END()}; + + rc = parse_and_open(&dev, argc, argv, desc, opts); + if (rc) + return rc; + + struct nvme_get_log_args args = { + .args_size = sizeof(args), + .fd = dev_fd(dev), + .lid = AMZN_NVME_STATS_LOGPAGE_ID, + .nsid = 1, + .lpo = 0, + .lsp = NVME_LOG_LSP_NONE, + .lsi = 0, + .rae = false, + .uuidx = 0, + .csi = NVME_CSI_NVM, + .ot = false, + .len = sizeof(log), + .log = &log, + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .result = NULL, + }; + + rc = nvme_get_log(&args); + if (rc != 0) { + fprintf(stderr, "[ERROR] %s: Failed to get log page, rc = %d", + __func__, rc); + return rc; + } + + if (log.magic != AMZN_NVME_STATS_MAGIC) { + fprintf(stderr, "[ERROR] %s: Not an EBS device", __func__); + return -ENOTSUP; + } + + err = validate_output_format(cfg.output_format, &flags); + if (err < 0) { + nvme_show_error("Invalid output format"); + return err; + } + + if (flags & JSON) + amzn_print_json_stats(&log); + else + amzn_print_normal_stats(&log); + + return 0; +} diff --git a/plugins/amzn/amzn-nvme.h b/plugins/amzn/amzn-nvme.h index f6c4f8b..19f209b 100644 --- a/plugins/amzn/amzn-nvme.h +++ b/plugins/amzn/amzn-nvme.h @@ -10,6 +10,7 @@ PLUGIN(NAME("amzn", "Amazon vendor specific extensions", NVME_VERSION), COMMAND_LIST( ENTRY("id-ctrl", "Send NVMe Identify Controller", id_ctrl) + ENTRY("stats", "Get EBS volume stats", get_stats) ) ); diff --git a/plugins/dapustor/dapustor-nvme.c b/plugins/dapustor/dapustor-nvme.c index 1f96a62..b98b1a0 100644 --- a/plugins/dapustor/dapustor-nvme.c +++ b/plugins/dapustor/dapustor-nvme.c @@ -505,7 +505,9 @@ static int dapustor_additional_smart_log(int argc, char **argv, struct command * 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"; +#ifdef CONFIG_JSONC const char *json = "Dump output in json format"; +#endif /* CONFIG_JSONC */ struct nvme_additional_smart_log smart_log; struct nvme_extended_additional_smart_log ext_smart_log; @@ -526,7 +528,7 @@ static int dapustor_additional_smart_log(int argc, char **argv, struct command * 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_FLAG_JSON("json", 'j', &cfg.json, json), OPT_END() }; diff --git a/plugins/fdp/fdp.c b/plugins/fdp/fdp.c index cac0b2b..1aec757 100644 --- a/plugins/fdp/fdp.c +++ b/plugins/fdp/fdp.c @@ -215,6 +215,12 @@ static int fdp_stats(int argc, char **argv, struct command *cmd, struct plugin * if (cfg.raw_binary) flags = BINARY; + if (!cfg.egid) { + fprintf(stderr, "endurance group identifier required\n"); + err = -EINVAL; + goto out; + } + memset(&stats, 0x0, sizeof(stats)); err = nvme_get_log_fdp_stats(dev->direct.fd, cfg.egid, 0, sizeof(stats), &stats); @@ -276,6 +282,12 @@ static int fdp_events(int argc, char **argv, struct command *cmd, struct plugin if (cfg.raw_binary) flags = BINARY; + if (!cfg.egid) { + fprintf(stderr, "endurance group identifier required\n"); + err = -EINVAL; + goto out; + } + memset(&events, 0x0, sizeof(events)); err = nvme_get_log_fdp_events(dev->direct.fd, cfg.egid, @@ -539,3 +551,99 @@ out: return err; } + +static int fdp_feature(int argc, char **argv, struct command *cmd, struct plugin *plugin) +{ + const char *desc = "Show, enable or disable FDP configuration"; + const char *enable_conf_idx = "FDP configuration index to enable"; + const char *endurance_group = "Endurance group ID"; + const char *disable = "Disable current FDP configuration"; + + _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; + int err = -1; + __u32 result; + bool enabling_conf_idx = false; + struct nvme_set_features_args setf_args = { + .args_size = sizeof(setf_args), + .fd = -1, + .fid = NVME_FEAT_FID_FDP, + .save = 1, + .nsid = NVME_NSID_ALL, + .data_len = 0, + .data = NULL, + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + }; + + struct config { + bool disable; + __u8 fdpcidx; + __u16 endgid; + }; + + struct config cfg = { + .disable = false, + .fdpcidx = 0, + .endgid = 0, + }; + + OPT_ARGS(opts) = { + OPT_SHRT("endgrp-id", 'e', &cfg.endgid, endurance_group), + OPT_BYTE("enable-conf-idx", 'c', &cfg.fdpcidx, enable_conf_idx), + OPT_FLAG("disable", 'd', &cfg.disable, disable), + OPT_INCR("verbose", 'v', &nvme_cfg.verbose, verbose), + OPT_END() + }; + + err = parse_and_open(&dev, argc, argv, desc, opts); + if (err) + return err; + + enabling_conf_idx = argconfig_parse_seen(opts, "enable-conf-idx"); + if (enabling_conf_idx && cfg.disable) { + nvme_show_error("Cannot enable and disable at the same time"); + return -EINVAL; + } + + if (!enabling_conf_idx && !cfg.disable) { + struct nvme_get_features_args getf_args = { + .args_size = sizeof(getf_args), + .fd = dev_fd(dev), + .fid = NVME_FEAT_FID_FDP, + .nsid = NVME_NSID_ALL, + .sel = NVME_GET_FEATURES_SEL_CURRENT, + .cdw11 = cfg.endgid, + .uuidx = 0, + .data_len = 0, + .data = NULL, + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .result = &result, + }; + + nvme_show_result("Endurance Group : %d", cfg.endgid); + + err = nvme_get_features(&getf_args); + if (err) { + nvme_show_status(err); + return err; + } + + nvme_show_result("Flexible Direct Placement Enable (FDPE) : %s", + (result & 0x1) ? "Yes" : "No"); + nvme_show_result("Flexible Direct Placement Configuration Index : %u", + (result >> 8) & 0xf); + return err; + } + + setf_args.fd = dev_fd(dev); + setf_args.cdw11 = cfg.endgid; + setf_args.cdw12 = cfg.fdpcidx << 8 | (!cfg.disable); + + err = nvme_set_features(&setf_args); + if (err) { + nvme_show_status(err); + return err; + } + nvme_show_result("Success %s Endurance Group: %d, FDP configuration index: %d", + (cfg.disable) ? "disabling" : "enabling", cfg.endgid, cfg.fdpcidx); + return err; +} diff --git a/plugins/fdp/fdp.h b/plugins/fdp/fdp.h index f162b32..0cd44fb 100644 --- a/plugins/fdp/fdp.h +++ b/plugins/fdp/fdp.h @@ -15,7 +15,8 @@ PLUGIN(NAME("fdp", "Manage Flexible Data Placement enabled devices", NVME_VERSIO ENTRY("events", "List events affecting reclaim units and media usage", fdp_events) ENTRY("status", "Show reclaim unit handle status", fdp_status) ENTRY("update", "Update a reclaim unit handle", fdp_update) - ENTRY("set-events", "Enabled or disable events", fdp_set_events) + ENTRY("set-events", "Enable or disable events", fdp_set_events) + ENTRY("feature", "Show, enable or disable FDP configuration", fdp_feature) ) ); diff --git a/plugins/huawei/huawei-nvme.c b/plugins/huawei/huawei-nvme.c index c09d8d3..5de0d3b 100644 --- a/plugins/huawei/huawei-nvme.c +++ b/plugins/huawei/huawei-nvme.c @@ -117,6 +117,7 @@ static int huawei_get_nvme_info(int fd, struct huawei_list_item *item, const cha return 0; } +#ifdef CONFIG_JSONC static void format(char *formatter, size_t fmt_sz, char *tofmt, size_t tofmtsz) { fmt_sz = snprintf(formatter, fmt_sz, "%-*.*s", (int)tofmtsz, (int)tofmtsz, tofmt); @@ -177,6 +178,7 @@ static void huawei_json_print_list_items(struct huawei_list_item *list_items, printf("\n"); json_free_object(root); } +#endif /* CONFIG_JSONC */ static void huawei_print_list_head(struct huawei_list_element_len element_len) { @@ -351,9 +353,11 @@ static int huawei_list(int argc, char **argv, struct command *command, } if (huawei_num > 0) { +#ifdef CONFIG_JSONC if (fmt == JSON) huawei_json_print_list_items(list_items, huawei_num); else +#endif /* CONFIG_JSONC */ huawei_print_list_items(list_items, huawei_num); } out_free_list_items: diff --git a/plugins/intel/intel-nvme.c b/plugins/intel/intel-nvme.c index 378ecc0..faf1a15 100644 --- a/plugins/intel/intel-nvme.c +++ b/plugins/intel/intel-nvme.c @@ -336,7 +336,9 @@ static int get_additional_smart_log(int argc, char **argv, struct command *cmd, "Get Intel vendor specific additional smart log (optionally, for the specified namespace), and show it."; const char *namespace = "(optional) desired namespace"; const char *raw = "Dump output in binary format"; +#ifdef CONFIG_JSONC const char *json = "Dump output in json format"; +#endif /* CONFIG_JSONC */ struct nvme_additional_smart_log smart_log; struct nvme_dev *dev; @@ -355,7 +357,7 @@ static int get_additional_smart_log(int argc, char **argv, struct command *cmd, 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_FLAG_JSON("json", 'j', &cfg.json, json), OPT_END() }; @@ -1032,7 +1034,9 @@ static int get_lat_stats_log(int argc, char **argv, struct command *cmd, struct const char *desc = "Get Intel Latency Statistics log and show it."; const char *raw = "Dump output in binary format"; +#ifdef CONFIG_JSONC const char *json = "Dump output in json format"; +#endif /* CONFIG_JSONC */ const char *write = "Get write statistics (read default)"; struct config { @@ -1047,7 +1051,7 @@ static int get_lat_stats_log(int argc, char **argv, struct command *cmd, struct OPT_ARGS(opts) = { OPT_FLAG("write", 'w', &cfg.write, write), OPT_FLAG("raw-binary", 'b', &cfg.raw_binary, raw), - OPT_FLAG("json", 'j', &cfg.json, json), + OPT_FLAG_JSON("json", 'j', &cfg.json, json), OPT_END() }; diff --git a/plugins/lm/lm-nvme.c b/plugins/lm/lm-nvme.c new file mode 100644 index 0000000..47ea8a4 --- /dev/null +++ b/plugins/lm/lm-nvme.c @@ -0,0 +1,669 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Copyright (c) 2024 Samsung Electronics Co., LTD. + * + * Authors: Nate Thornton <n.thornton@samsung.com> + */ + +#include <assert.h> +#include <fcntl.h> +#include <errno.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include <linux/fs.h> +#include <inttypes.h> +#include <asm/byteorder.h> +#include <sys/mman.h> +#include <sys/shm.h> +#include <sys/sysinfo.h> +#include <sys/stat.h> +#include <sys/types.h> +#include <dirent.h> +#include <time.h> + +#include "common.h" +#include "nvme.h" +#include "nvme-print.h" +#include "libnvme.h" +#include "plugin.h" +#include "linux/types.h" +#include "nvme-wrap.h" +#include "util/cleanup.h" + +#define CREATE_CMD +#include "lm-nvme.h" + +#include "lm-print.h" + +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 int lm_create_cdq(int argc, char **argv, struct command *command, struct plugin *plugin) +{ + const char *desc = "Create Controller Data Queue for controller of specific type and size"; + const char *sz = "CDQ Size (in dwords)"; + const char *cntlid = "Controller ID"; + const char *qt = "Queue Type (default: 0 = User Data Migration Queue)"; + const char *consent = "I consent this will not work and understand a CDQ cannot be mapped " + "to user space. If I proceed with the creation of a CDQ, the device " + "will write to invalid memory, inevitably leading to MMU faults or " + "worse."; + + _cleanup_huge_ struct nvme_mem_huge mh = { 0, }; + _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; + struct lba_migration_queue_entry_type_0 *queue = NULL; + int err = -1; + + struct config { + __u32 sz; + __u16 cntlid; + __u8 qt; + bool consent; + char *file; + }; + + struct config cfg = { + .sz = 0, + .cntlid = 0, + .qt = 0, + .consent = false, + .file = NULL, + }; + + OPT_ARGS(opts) = { + OPT_UINT("size", 's', &cfg.sz, sz), + OPT_SHRT("cntlid", 'c', &cfg.cntlid, cntlid), + OPT_BYTE("queue-type", 'q', &cfg.qt, qt), + OPT_FLAG("consent", 0, &cfg.consent, consent), + OPT_END() + }; + + err = parse_and_open(&dev, argc, argv, desc, opts); + if (err) + return err; + + if (!consent) { + nvme_show_error("ERROR: consent required"); + return -EINVAL; + } + + // Not that it really matters, but we setup memory as if the CDQ can be held + // in user space regardless. + queue = nvme_alloc_huge(cfg.sz << 2, &mh); + if (!queue) { + nvme_show_error("ERROR: nvme_alloc of size %dB failed %s", cfg.sz << 2, + strerror(errno)); + return -ENOMEM; + } + + struct nvme_lm_cdq_args args = { + .args_size = sizeof(args), + .fd = dev_fd(dev), + .sel = NVME_LM_SEL_CREATE_CDQ, + .mos = NVME_SET(cfg.qt, LM_QT), + .cntlid = cfg.cntlid, + .sz = cfg.sz, + .data = queue + }; + + err = nvme_lm_cdq(&args); + if (err < 0) + nvme_show_error("ERROR: nvme_lm_cdq() failed: %s", nvme_strerror(errno)); + else if (err) + nvme_show_status(err); + else + printf("Create CDQ Successful: CDQID=0x%04x\n", args.cdqid); + + return err; +} + +static int lm_delete_cdq(int argc, char **argv, struct command *command, struct plugin *plugin) +{ + const char *desc = "Delete Controller Data Queue"; + const char *cdqid = "Controller Data Queue ID"; + + _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; + int err = -1; + + struct config { + __u16 cdqid; + }; + + struct config cfg = { + .cdqid = 0 + }; + + OPT_ARGS(opts) = { + OPT_SHRT("cdqid", 'C', &cfg.cdqid, cdqid), + OPT_END() + }; + + err = parse_and_open(&dev, argc, argv, desc, opts); + if (err) + return err; + + struct nvme_lm_cdq_args args = { + .args_size = sizeof(args), + .fd = dev_fd(dev), + .sel = NVME_LM_SEL_DELETE_CDQ, + .cdqid = cfg.cdqid, + }; + + err = nvme_lm_cdq(&args); + if (err < 0) + nvme_show_error("ERROR: nvme_lm_cdq() failed: %s", nvme_strerror(errno)); + else if (err > 0) + nvme_show_status(err); + else + printf("Delete CDQ Successful: CDQID=0x%04x\n", cfg.cdqid); + + return err; +} + +static const char * const lm_track_send_select_argstr[] = { + [NVME_LM_SEL_LOG_USER_DATA_CHANGES] = "Log User Data Changes", + [NVME_LM_SEL_TRACK_MEMORY_CHANGES] = "Track Memory Changes" +}; + +static int lm_track_send(int argc, char **argv, struct command *command, struct plugin *plugin) +{ + const char *desc = "Track Send command used to manage the tracking of information by a " + "controller"; + const char *sel = "Type of management operation to perform\n" + " 0h = Log User Data Changes\n" + " 1h = Track Memory Changes"; + const char *mos = "Management operation specific"; + const char *cdqid = "Controller Data Queue ID"; + const char *start = "Equivalent to start tracking with defaults"; + const char *stop = "Equivalent to stop tracking with defaults"; + + + _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; + int err = -1; + + struct config { + __s8 sel; + __u8 mos; + __u16 cdqid; + bool start; + bool stop; + }; + + struct config cfg = { + .sel = -1, + .mos = 0, + .cdqid = 0, + .start = false, + .stop = false, + }; + + OPT_ARGS(opts) = { + OPT_BYTE("sel", 's', &cfg.sel, sel), + OPT_BYTE("mos", 'm', &cfg.mos, mos), + OPT_SHRT("cdqid", 'C', &cfg.cdqid, cdqid), + OPT_FLAG("start", 0, &cfg.start, start), + OPT_FLAG("stop", 0, &cfg.stop, stop), + OPT_END() + }; + + err = parse_and_open(&dev, argc, argv, desc, opts); + if (err) + return err; + + if (cfg.sel == -1) { + nvme_show_error("Select field required"); + return -EINVAL; + } + + if (cfg.sel != NVME_LM_SEL_LOG_USER_DATA_CHANGES) { + nvme_show_error("Unsupported select option %d (%s)", cfg.sel, + ARGSTR(lm_track_send_select_argstr, cfg.sel)); + return -EINVAL; + } + + if (cfg.start && cfg.stop) { + nvme_show_error("Must select one of start & stop, not both"); + return -EINVAL; + } else if (cfg.sel == NVME_LM_SEL_LOG_USER_DATA_CHANGES) { + if (cfg.start) + cfg.mos = NVME_SET(NVME_LM_LACT_START_LOGGING, LM_LACT); + else if (cfg.stop) + cfg.mos = NVME_SET(NVME_LM_LACT_STOP_LOGGING, LM_LACT); + } + + struct nvme_lm_track_send_args args = { + .args_size = sizeof(args), + .fd = dev_fd(dev), + .cdqid = cfg.cdqid, + .sel = cfg.sel, + .mos = cfg.mos, + }; + + err = nvme_lm_track_send(&args); + if (err < 0) + nvme_show_error("ERROR: nvme_lm_track_send() failed %s", strerror(errno)); + else if (err) + nvme_show_status(err); + else + printf("Track Send (%s) Successful\n", + ARGSTR(lm_track_send_select_argstr, cfg.sel)); + + return err; +} + +static const char * const lm_migration_send_select_argstr[] = { + [NVME_LM_SEL_SUSPEND] = "Suspend", + [NVME_LM_SEL_RESUME] = "Resume", + [NVME_LM_SEL_SET_CONTROLLER_STATE] = "Set Controller State" +}; + +static int lm_migration_send(int argc, char **argv, struct command *command, struct plugin *plugin) +{ + const char *desc = "Migration Send command is used to manage the migration of a controller"; + const char *sel = "Select (SEL) the type of management operation to perform " + "(CDW10[07:00])\n" + " 0h = Suspend\n" + " 1h = Resume\n" + " 2h = Set Controller State"; + const char *cntlid = "Controller Identifier (CDW11[15:00])"; + const char *stype = "Type of suspend (STYPE) (CDW11[23:16]\n" + " 0h = Suspend Notification\n" + " 1h = Suspend"; + const char *dudmq = "Delete user data migration queue (DUDMQ) as part of suspend operation " + "(CDW11[31])"; + const char *seqind = "Sequence Indicator (CDW11[17:16])\n" + " 0h = Not first not last\n" + " 1h = First in two or more\n" + " 2h = Last in two or more\n" + " 3h = Entire state info"; + const char *csuuidi = "Controller State UUID Index (CSUUIDI) (CDW11[31:24])"; + const char *csvi = "Controller State Version Index (CSVI) (CDW11[23:16])"; + const char *uidx = "UUID Index (UIDX) (CDW14[16:00])"; + const char *offset = "Controller State Offset"; + const char *numd = "Number of Dwords (NUMD)"; + const char *input = "Controller State Data input file"; + + _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; + _cleanup_file_ FILE *file = NULL; + _cleanup_huge_ struct nvme_mem_huge mh = { 0, }; + void *data = NULL; + int err = -1; + + struct config { + __s8 sel; + __u16 cntlid; + __u8 stype; + __u8 seqind; + __u8 csuuidi; + __u8 csvi; + __u8 uidx; + __u64 offset; + __u32 numd; + char *input; + bool dudmq; + }; + + struct config cfg = { + .sel = -1, + .cntlid = 0, + .stype = 0, + .seqind = 0, + .csuuidi = 0, + .csvi = 0, + .uidx = 0, + .offset = 0, + .numd = 0, + .input = NULL, + .dudmq = false + }; + + OPT_ARGS(opts) = { + OPT_BYTE("sel", 's', &cfg.sel, sel), + OPT_SHRT("cntlid", 'c', &cfg.cntlid, cntlid), + OPT_BYTE("stype", 't', &cfg.stype, stype), + OPT_FLAG("dudmq", 'd', &cfg.dudmq, dudmq), + OPT_BYTE("seq-ind", 'S', &cfg.seqind, seqind), + OPT_BYTE("csuuidi", 'U', &cfg.csuuidi, csuuidi), + OPT_BYTE("csvi", 'V', &cfg.csvi, csvi), + OPT_BYTE("uidx", 'u', &cfg.uidx, uidx), + OPT_LONG("offset", 'o', &cfg.offset, offset), + OPT_UINT("numd", 'n', &cfg.numd, numd), + OPT_FILE("input-file", 'f', &cfg.input, input), + OPT_END() + }; + + err = parse_and_open(&dev, argc, argv, desc, opts); + if (err) + return err; + + if (cfg.sel == -1) { + nvme_show_error("Select field required"); + return -EINVAL; + } + + // Sanity check input parameters + if (cfg.sel == NVME_LM_SEL_SUSPEND || cfg.sel == NVME_LM_SEL_RESUME) { + if (cfg.csuuidi != 0 || cfg.csvi != 0) { + nvme_show_error("Unexpected fields for %s", + ARGSTR(lm_migration_send_select_argstr, cfg.sel)); + return -EINVAL; + } + } else if (cfg.sel == NVME_LM_SEL_SET_CONTROLLER_STATE) { + if (cfg.dudmq || cfg.stype != 0) { + nvme_show_error("Unexpected fields for %s", + ARGSTR(lm_migration_send_select_argstr, cfg.sel)); + return -EINVAL; + } else if (!strlen(cfg.input)) { + nvme_show_error("Expected file for %s", + ARGSTR(lm_migration_send_select_argstr, cfg.sel)); + return -EINVAL; + } + } + + if (cfg.input && strlen(cfg.input)) { + file = fopen(cfg.input, "r"); + if (file == NULL) { + nvme_show_perror(cfg.input); + return -EINVAL; + } + + data = nvme_alloc_huge(cfg.numd << 2, &mh); + if (!data) + return -ENOMEM; + + size_t n_data = fread(data, 1, cfg.numd << 2, file); + + fclose(file); + + if (n_data != (size_t)(cfg.numd << 2)) { + nvme_show_error("failed to read controller state data %s", strerror(errno)); + return -errno; + } + } + + struct nvme_lm_migration_send_args args = { + .args_size = sizeof(args), + .fd = dev_fd(dev), + .sel = cfg.sel, + .mos = NVME_SET(cfg.seqind, LM_MIGRATION_SEND_MOS), + .cntlid = cfg.cntlid, + .csuuidi = cfg.csuuidi, + .uidx = cfg.uidx, + .stype = cfg.stype, + .offset = cfg.offset, + .dudmq = cfg.dudmq, + .numd = cfg.numd, + .data = data, + }; + + err = nvme_lm_migration_send(&args); + if (err < 0) + nvme_show_error("ERROR: nvme_lm_migration_send() failed %s", strerror(errno)); + else if (err > 0) + nvme_show_status(err); + else + printf("Migration Send (%s) Successful\n", + ARGSTR(lm_migration_send_select_argstr, cfg.sel)); + + + return err; +} + +static int lm_migration_recv(int argc, char **argv, struct command *command, struct plugin *plugin) +{ + const char *desc = "Migration Receive command is used to obtain information used to manage " + " a migratable controller"; + const char *sel = "Select (SEL) the type of management operation to perform " + "(CDW10[07:00])\n" + " 0h = Get Controller State"; + const char *cntlid = "Controller Identifier (CDW10[31:16])"; + const char *csuuidi = "Controller State UUID Index (CSUUIDI) (CDW11[23:16])"; + const char *csvi = "Controller State Version Index (CSVI) (CDW11[7:0])"; + const char *uidx = "UUID Index (UIDX) (CDW14[16:00])"; + const char *offset = "Controller State Offset"; + const char *numd = "Number of Dwords (NUMD)"; + const char *output = "Controller State Data output file"; + const char *human_readable_info = "show info in readable format"; + + _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; + _cleanup_file_ FILE *fd = NULL; + _cleanup_huge_ struct nvme_mem_huge mh = { 0, }; + nvme_print_flags_t flags; + void *data = NULL; + int err = -1; + + struct config { + __u8 sel; + __u16 cntlid; + __u8 csuuidi; + __u8 csvi; + __u8 uidx; + __u64 offset; + __u32 numd; + char *output; + char *output_format; + bool human_readable; + }; + + struct config cfg = { + .sel = -1, + .cntlid = 0, + .csuuidi = 0, + .csvi = 0, + .uidx = 0, + .offset = 0, + .numd = 0, + .output = NULL, + .output_format = "normal", + .human_readable = false + }; + + OPT_ARGS(opts) = { + OPT_BYTE("sel", 's', &cfg.sel, sel), + OPT_SHRT("cntlid", 'c', &cfg.cntlid, cntlid), + OPT_BYTE("csuuidi", 'U', &cfg.csuuidi, csuuidi), + OPT_BYTE("csvi", 'V', &cfg.csvi, csvi), + OPT_BYTE("uidx", 'u', &cfg.uidx, uidx), + OPT_LONG("offset", 'o', &cfg.offset, offset), + OPT_UINT("numd", 'n', &cfg.numd, numd), + OPT_FILE("output-file", 'f', &cfg.output, output), + OPT_FMT("output-format", 0, &cfg.output_format, output_format), + OPT_FLAG("human-readable", 'H', &cfg.human_readable, human_readable_info), + OPT_END() + }; + + err = parse_and_open(&dev, argc, argv, desc, opts); + if (err) + return err; + + err = validate_output_format(cfg.output_format, &flags); + if (err < 0) { + nvme_show_error("Invalid output format"); + return err; + } + + if (cfg.output_format && cfg.offset != 0 && !(flags & BINARY)) { + nvme_show_error("cannot parse non-zero offset"); + return -EINVAL; + } + + if (cfg.human_readable) + flags |= VERBOSE; + + if (cfg.output && strlen(cfg.output)) { + fd = fopen(cfg.output, "w"); + if (fd < 0) { + nvme_show_perror(cfg.output); + return -errno; + } + } + + data = nvme_alloc_huge((cfg.numd + 1) << 2, &mh); + if (!data) + return -ENOMEM; + + __u32 result = 0; + struct nvme_lm_migration_recv_args args = { + .args_size = sizeof(args), + .fd = dev_fd(dev), + .sel = cfg.sel, + .mos = NVME_SET(cfg.csvi, LM_GET_CONTROLLER_STATE_CSVI), + .uidx = cfg.uidx, + .csuuidi = cfg.csuuidi, + .offset = cfg.offset, + .cntlid = cfg.cntlid, + .data = data, + .result = &result, + }; + + err = nvme_lm_migration_recv(&args); + if (err < 0) + nvme_show_error("ERROR: nvme_lm_migration_recv() failed %s", strerror(errno)); + else if (err) + nvme_show_status(err); + else if (cfg.sel == NVME_LM_SEL_GET_CONTROLLER_STATE) { + if (flags == NORMAL) + printf("CDW0: 0x%x: Controller %sSuspended\n", result, + (result & NVME_LM_GET_CONTROLLER_STATE_CSUP) ? "" : "NOT "); + + if (cfg.output && strlen(cfg.output)) { + if (fwrite(data, 1, cfg.numd << 2, fd) != (cfg.numd << 2)) { + nvme_show_error("ERROR: %s: failed to write buffer to output file", + strerror(errno)); + err = -errno; + } + } else { + lm_show_controller_state_data((struct nvme_lm_controller_state_data *)data, + (cfg.numd + 1) << 2, cfg.offset, flags); + } + } + + return 0; +} + +enum lm_controller_data_queue_feature_id { + lm_cdq_feature_id = 0x21 +}; + +static int lm_set_cdq(int argc, char **argv, struct command *command, struct plugin *plugin) +{ + const char *desc = "This Feature allows a host to update the status of the head pointer " + "of a CDQ and specify the configuration of a CDQ Tail event."; + const char *cdqid = "Controller Data Queue ID"; + const char *hp = "The slot of the head pointer for the specified CDQ"; + const char *tpt = "If specified, the slot that causes the controller " + " to issue a CDQ Tail Pointer event"; + + _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; + int err = -1; + + struct config { + __u16 cdqid; + __u32 hp; + __s32 tpt; + }; + + struct config cfg = { + .cdqid = 0, + .hp = 0, + .tpt = -1, + }; + + OPT_ARGS(opts) = { + OPT_SHRT("cdqid", 'C', &cfg.cdqid, cdqid), + OPT_UINT("hp", 'H', &cfg.hp, hp), + OPT_UINT("tpt", 'T', &cfg.tpt, tpt), + OPT_END() + }; + + err = parse_and_open(&dev, argc, argv, desc, opts); + if (err) + return err; + + struct nvme_set_features_args args = { + .args_size = sizeof(args), + .fd = dev_fd(dev), + .fid = lm_cdq_feature_id, + .cdw11 = cfg.cdqid | + ((cfg.tpt >= 0) ? NVME_SET(1, LM_CTRL_DATA_QUEUE_ETPT) : 0), + .cdw12 = cfg.hp, + .cdw13 = cfg.tpt + }; + + err = nvme_set_features(&args); + if (err < 0) + nvme_show_error("ERROR: nvme_set_features() failed %s", nvme_strerror(errno)); + else if (err) + nvme_show_status(err); + else + printf("Success. Head Pointer: %d\n", cfg.hp); + + return err; +} + +static int lm_get_cdq(int argc, char **argv, struct command *command, struct plugin *plugin) +{ + const char *desc = "This Feature allows a host to retrieve the status of the head pointer " + "of a CDQ and specify the configuration of a CDQ Tail event."; + const char *cdqid = "Controller Data Queue ID"; + + _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; + nvme_print_flags_t flags; + int err = -1; + + struct config { + __u16 cdqid; + char *output_format; + }; + + struct config cfg = { + .cdqid = 0, + .output_format = "normal", + }; + + OPT_ARGS(opts) = { + OPT_SHRT("cdqid", 'C', &cfg.cdqid, cdqid), + OPT_FMT("output-format", 'o', &cfg.output_format, output_format), + OPT_END() + }; + + err = parse_and_open(&dev, argc, argv, desc, opts); + if (err) + return err; + + err = validate_output_format(cfg.output_format, &flags); + if (err < 0) { + nvme_show_error("Invalid output format"); + return err; + } + + struct nvme_lm_ctrl_data_queue_fid_data data; + + struct nvme_get_features_args args = { + .args_size = sizeof(args), + .fd = dev_fd(dev), + .fid = lm_cdq_feature_id, + .cdw11 = cfg.cdqid, + .data = &data, + .data_len = sizeof(data) + }; + + err = nvme_get_features(&args); + if (err < 0) + nvme_show_error("ERROR: nvme_get_features() failed %s", nvme_strerror(errno)); + else if (err) + nvme_show_status(err); + else + lm_show_controller_data_queue(&data, flags); + + return err; +} diff --git a/plugins/lm/lm-nvme.h b/plugins/lm/lm-nvme.h new file mode 100644 index 0000000..56b3a89 --- /dev/null +++ b/plugins/lm/lm-nvme.h @@ -0,0 +1,30 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Copyright (c) 2024 Samsung Electronics Co., LTD. + * + * Authors: Nate Thornton <n.thornton@samsung.com> + */ + +#undef CMD_INC_FILE +#define CMD_INC_FILE plugins/lm/lm-nvme + +#if !defined(LIVE_MIGRATION_NVME) || defined(CMD_HEADER_MULTI_READ) +#define LIVE_MIGRATION_NVME + +#include "cmd.h" + +PLUGIN(NAME("lm", "Live Migration NVMe extensions", NVME_VERSION), + COMMAND_LIST( + ENTRY("create-cdq", "Create Controller Data Queue", lm_create_cdq) + ENTRY("delete-cdq", "Delete Controller Data Queue", lm_delete_cdq) + ENTRY("track-send", "Track Send Command", lm_track_send) + ENTRY("migration-send", "Migration Send", lm_migration_send) + ENTRY("migration-recv", "Migration Receive", lm_migration_recv) + ENTRY("set-cdq", "Set Feature - Controller Data Queue (FID 21h)", lm_set_cdq) + ENTRY("get-cdq", "Get Feature - Controller Data Queue (FID 21h)", lm_get_cdq) + ) +); + +#endif + +#include "define_cmd.h" diff --git a/plugins/lm/lm-print-binary.c b/plugins/lm/lm-print-binary.c new file mode 100644 index 0000000..9b48144 --- /dev/null +++ b/plugins/lm/lm-print-binary.c @@ -0,0 +1,25 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "lm-print.h" + +static void binary_controller_state_data(struct nvme_lm_controller_state_data *data, size_t len, + __u32 offset) +{ + d_raw((unsigned char *)data, len); +} + +static void binary_controller_data_queue(struct nvme_lm_ctrl_data_queue_fid_data *data) +{ + d_raw((unsigned char *)data, sizeof(*data)); +} + +static struct lm_print_ops binary_print_ops = { + .controller_state_data = binary_controller_state_data, + .controller_data_queue = binary_controller_data_queue, +}; + +struct lm_print_ops *lm_get_binary_print_ops(nvme_print_flags_t flags) +{ + binary_print_ops.flags = flags; + return &binary_print_ops; +} diff --git a/plugins/lm/lm-print-json.c b/plugins/lm/lm-print-json.c new file mode 100644 index 0000000..1990b96 --- /dev/null +++ b/plugins/lm/lm-print-json.c @@ -0,0 +1,109 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "lm-print.h" +#include "common.h" + +static void json_controller_state_data(struct nvme_lm_controller_state_data *data, size_t len, + __u32 offset) +{ + if (offset) { + fprintf(stderr, "cannot understand non-zero offset\n"); + return; + } + + struct json_object *root = json_create_object(); + struct json_object *nvmecs = json_create_object(); + struct json_object *iosqs = json_create_array(); + struct json_object *iocqs = json_create_array(); + + json_object_add_value_uint(root, "version", + le16_to_cpu(data->hdr.ver)); + json_object_add_value_uint(root, "controller state attributes", + data->hdr.csattr); + json_object_add_value_uint128(root, "nvme controller state size", + le128_to_cpu(data->hdr.nvmecss)); + json_object_add_value_uint128(root, "vendor specific size", + le128_to_cpu(data->hdr.vss)); + + json_object_add_value_object(root, "nvme controller state", nvmecs); + + json_object_add_value_uint(nvmecs, "version", + le16_to_cpu(data->data.hdr.ver)); + json_object_add_value_uint(nvmecs, "number of io submission queues", + le16_to_cpu(data->data.hdr.niosq)); + json_object_add_value_uint(nvmecs, "number of io completion queues", + le16_to_cpu(data->data.hdr.niocq)); + + json_object_add_value_array(nvmecs, "io submission queue list", iosqs); + + for (int i = 0; i < data->data.hdr.niosq; i++) { + struct nvme_lm_io_submission_queue_data *sq = &data->data.sqs[i]; + struct json_object *sq_obj = json_create_object(); + + json_object_add_value_uint64(sq_obj, "io submission prp entry 1", + le64_to_cpu(sq->iosqprp1)); + json_object_add_value_uint(sq_obj, "io submission queue size", + le16_to_cpu(sq->iosqqsize)); + json_object_add_value_uint(sq_obj, "io submission queue identifier", + le16_to_cpu(sq->iosqqid)); + json_object_add_value_uint(sq_obj, "io completion queue identifier", + le16_to_cpu(sq->iosqcqid)); + json_object_add_value_uint(sq_obj, "io submission queue attributes", + le16_to_cpu(sq->iosqa)); + json_object_add_value_uint(sq_obj, "io submission queue head pointer", + le16_to_cpu(sq->iosqhp)); + json_object_add_value_uint(sq_obj, "io submission queue tail pointer", + le16_to_cpu(sq->iosqtp)); + + json_array_add_value_object(iosqs, sq_obj); + } + + json_object_add_value_array(nvmecs, "io completion queue list", iocqs); + + for (int i = 0; i < data->data.hdr.niocq; i++) { + struct nvme_lm_io_completion_queue_data *cq = &data->data.cqs[i]; + struct json_object *cq_obj = json_create_object(); + + json_object_add_value_uint64(cq_obj, "io completion prp entry 1", + le64_to_cpu(cq->iocqprp1)); + json_object_add_value_uint(cq_obj, "io completion queue size", + le16_to_cpu(cq->iocqqsize)); + json_object_add_value_uint(cq_obj, "io completion queue identifier", + le16_to_cpu(cq->iocqqid)); + json_object_add_value_uint(cq_obj, "io completion queue head pointer", + le16_to_cpu(cq->iocqhp)); + json_object_add_value_uint(cq_obj, "io completion queue tail pointer", + le16_to_cpu(cq->iocqtp)); + json_object_add_value_uint(cq_obj, "io completion queue attributes", + le32_to_cpu(cq->iocqa)); + + json_array_add_value_object(iocqs, cq_obj); + } + + json_print_object(root, NULL); + printf("\n"); + json_free_object(root); +} + +static void json_controller_data_queue(struct nvme_lm_ctrl_data_queue_fid_data *data) +{ + struct json_object *root = json_create_object(); + + json_object_add_value_uint(root, "head_pointer", le32_to_cpu(data->hp)); + json_object_add_value_uint(root, "tail_pointer_trigger", le32_to_cpu(data->tpt)); + + json_print_object(root, NULL); + printf("\n"); + json_free_object(root); +} + +static struct lm_print_ops json_print_ops = { + .controller_state_data = json_controller_state_data, + .controller_data_queue = json_controller_data_queue +}; + +struct lm_print_ops *lm_get_json_print_ops(nvme_print_flags_t flags) +{ + json_print_ops.flags = flags; + return &json_print_ops; +} diff --git a/plugins/lm/lm-print-stdout.c b/plugins/lm/lm-print-stdout.c new file mode 100644 index 0000000..4495199 --- /dev/null +++ b/plugins/lm/lm-print-stdout.c @@ -0,0 +1,145 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "lm-print.h" + +#include <inttypes.h> + +#include "common.h" +#include "util/types.h" + +static struct lm_print_ops stdout_print_ops; + +static void stdout_controller_state_data(struct nvme_lm_controller_state_data *data, size_t len, + __u32 offset) +{ + if (offset) { + fprintf(stderr, "cannot understand non-zero offset\n"); + return; + } + + int human = stdout_print_ops.flags & VERBOSE; + + if (sizeof(struct nvme_lm_controller_state_data_header) <= len) { + printf("Header:\n"); + printf("%-45s: 0x%x\n", "Version (VER)", data->hdr.ver); + printf("%-45s: 0x%x\n", "Controller State Attributes (CSATTR)", data->hdr.csattr); + if (human) + printf(" [0:0] : 0x%x Controller %sSuspended\n", + data->hdr.csattr & 1, data->hdr.csattr & 1 ? "" : "NOT "); + printf("%-45s: %s\n", "NVMe Controller State Size (NVMECSS)", + uint128_t_to_string(le128_to_cpu(data->hdr.nvmecss))); + printf("%-45s: %s\n", "Vendor Specific Size (VSS)", + uint128_t_to_string(le128_to_cpu(data->hdr.vss))); + + len -= sizeof(struct nvme_lm_controller_state_data_header); + } else { + fprintf(stderr, "WARNING: Header truncated\n"); + len = 0; + } + + if (!len) + return; + + if (sizeof(struct nvme_lm_nvme_controller_state_data_header) <= len) { + int niosq = data->data.hdr.niosq; + int niocq = data->data.hdr.niocq; + + printf("\nNVMe Controller State Data Structure:\n"); + printf("%-45s: 0x%x\n", "Version (VER)", + le16_to_cpu(data->data.hdr.ver)); + printf("%-45s: %d\n", "Number of I/O Submission Queues (NIOSQ)", + le16_to_cpu(niosq)); + printf("%-45s: %d\n", "Number of I/O Completion Queues (NIOCQ)", + le16_to_cpu(niocq)); + + len -= sizeof(struct nvme_lm_nvme_controller_state_data_header); + + if (len < niosq * sizeof(struct nvme_lm_io_submission_queue_data)) { + fprintf(stderr, "WARNING: I/O Submission Queues truncated\n"); + niosq = len / sizeof(struct nvme_lm_io_submission_queue_data); + } + + for (int i = 0; i < niosq; ++i) { + struct nvme_lm_io_submission_queue_data *sq = &(data->data.sqs[i]); + __u16 iosqa = le16_to_cpu(sq->iosqa); + + printf("\nNVMe I/O Submission Queue Data [%d]:\n", i); + printf("%-45s: 0x%"PRIu64"\n", "PRP Entry 1 (IOSQPRP1)", + le64_to_cpu(sq->iosqprp1)); + printf("%-45s: 0x%x\n", "Queue Size (IOSQQSIZE)", + le16_to_cpu(sq->iosqqsize)); + printf("%-45s: 0x%x\n", "Identifier (IOSQQID)", + le16_to_cpu(sq->iosqqid)); + printf("%-45s: 0x%x\n", "Completion Queue Identifier (IOSQCQID)", + le16_to_cpu(sq->iosqcqid)); + printf("%-45s: 0x%x\n", "Attributes (IOSQA)", iosqa); + if (human) { + printf(" [2:1] : 0x%x Queue Priority (IOSQQPRIO)\n", + NVME_GET(iosqa, LM_IOSQPRIO)); + printf(" [0:0] : 0x%x Queue %sPhysically Contiguous (IOSQPC)\n", + NVME_GET(iosqa, LM_IOSQPC), + NVME_GET(iosqa, LM_IOSQPC) ? "" : "NOT "); + } + printf("%-45s: 0x%x\n", "I/O Submission Queue Head Pointer (IOSQHP)", + le16_to_cpu(sq->iosqhp)); + printf("%-45s: 0x%x\n", "I/O Submission Queue Tail Pointer (IOSQTP)", + le16_to_cpu(sq->iosqtp)); + } + + len -= niosq * sizeof(struct nvme_lm_io_submission_queue_data); + + if (len < niocq * sizeof(struct nvme_lm_io_completion_queue_data)) { + fprintf(stderr, "WARNING: I/O Completion Queues truncated\n"); + niocq = len / sizeof(struct nvme_lm_io_completion_queue_data); + } + + for (int i = 0; i < niocq; ++i) { + struct nvme_lm_io_completion_queue_data *cq = &data->data.cqs[niosq + i]; + __u32 iocqa = le32_to_cpu(cq->iocqa); + + printf("\nNVMe I/O Completion Queue Data [%d]:\n", i); + printf("%-45s: 0x%"PRIu64"\n", "I/O Completion PRP Entry 1 (IOCQPRP1)", + le64_to_cpu(cq->iocqprp1)); + printf("%-45s: 0x%x\n", "I/O Completion Queue Size (IOCQQSIZE)", + le16_to_cpu(cq->iocqqsize)); + printf("%-45s: 0x%x\n", "I/O Completion Queue Identifier (IOCQQID)", + le16_to_cpu(cq->iocqqid)); + printf("%-45s: 0x%x\n", "I/O Completion Queue Head Pointer (IOSQHP)", + le16_to_cpu(cq->iocqhp)); + printf("%-45s: 0x%x\n", "I/O Completion Queue Tail Pointer (IOSQTP)", + le16_to_cpu(cq->iocqtp)); + printf("%-45s: 0x%x\n", "I/O Completion Queue Attributes (IOCQA)", iocqa); + if (human) { + printf(" [31:16] : 0x%x I/O Completion Queue Interrupt Vector " + "(IOCQIV)\n", + NVME_GET(iocqa, LM_IOCQIEN)); + printf(" [2:2] : 0x%x Slot 0 Phase Tag (S0PT)\n", + NVME_GET(iocqa, LM_S0PT)); + printf(" [1:1] : 0x%x Interrupts %sEnabled (IOCQIEN)\n", + NVME_GET(iocqa, LM_IOCQIEN), + NVME_GET(iocqa, LM_IOCQIEN) ? "" : "NOT "); + printf(" [0:0] : 0x%x Queue %sPhysically Contiguous (IOCQPC)\n", + NVME_GET(iocqa, LM_IOCQPC), + NVME_GET(iocqa, LM_IOCQPC) ? "" : "NOT "); + } + } + } else + fprintf(stderr, "WARNING: NVMe Controller State Data Structure truncated\n"); +} + +static void stdout_show_controller_data_queue(struct nvme_lm_ctrl_data_queue_fid_data *data) +{ + printf("Head Pointer: 0x%x\n", le32_to_cpu(data->hp)); + printf("Tail Pointer Trigger: 0x%x\n", le32_to_cpu(data->tpt)); +} + +static struct lm_print_ops stdout_print_ops = { + .controller_state_data = stdout_controller_state_data, + .controller_data_queue = stdout_show_controller_data_queue +}; + +struct lm_print_ops *lm_get_stdout_print_ops(nvme_print_flags_t flags) +{ + stdout_print_ops.flags = flags; + return &stdout_print_ops; +} diff --git a/plugins/lm/lm-print.c b/plugins/lm/lm-print.c new file mode 100644 index 0000000..7019af8 --- /dev/null +++ b/plugins/lm/lm-print.c @@ -0,0 +1,38 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "lm-print.h" + +#define lm_print(name, flags, ...) \ + do { \ + struct lm_print_ops *ops = lm_print_ops(flags); \ + if (ops && ops->name) \ + ops->name(__VA_ARGS__); \ + else \ + fprintf(stderr, "unhandled output format\n"); \ + } while (false) + +static struct lm_print_ops *lm_print_ops(nvme_print_flags_t flags) +{ + struct lm_print_ops *ops = NULL; + + if (flags & JSON || nvme_is_output_format_json()) + ops = lm_get_json_print_ops(flags); + else if (flags & BINARY) + ops = lm_get_binary_print_ops(flags); + else + ops = lm_get_stdout_print_ops(flags); + + return ops; +} + +void lm_show_controller_state_data(struct nvme_lm_controller_state_data *data, size_t len, + __u32 offset, nvme_print_flags_t flags) +{ + lm_print(controller_state_data, flags, data, len, offset); +} + +void lm_show_controller_data_queue(struct nvme_lm_ctrl_data_queue_fid_data *data, + nvme_print_flags_t flags) +{ + lm_print(controller_data_queue, flags, data); +} diff --git a/plugins/lm/lm-print.h b/plugins/lm/lm-print.h new file mode 100644 index 0000000..8a64702 --- /dev/null +++ b/plugins/lm/lm-print.h @@ -0,0 +1,31 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +#ifndef LM_PRINT_H +#define LM_PRINT_H + +#include "nvme.h" +#include "libnvme.h" + +struct lm_print_ops { + void (*controller_state_data)(struct nvme_lm_controller_state_data *data, size_t len, + __u32 offset); + void (*controller_data_queue)(struct nvme_lm_ctrl_data_queue_fid_data *data); + nvme_print_flags_t flags; +}; + +struct lm_print_ops *lm_get_stdout_print_ops(nvme_print_flags_t flags); +struct lm_print_ops *lm_get_binary_print_ops(nvme_print_flags_t flags); + +#ifdef CONFIG_JSONC +struct lm_print_ops *lm_get_json_print_ops(nvme_print_flags_t flags); +#else +static inline struct lm_print_ops *lm_get_json_print_ops(nvme_print_flags_t flags) +{ + return NULL; +} +#endif + +void lm_show_controller_state_data(struct nvme_lm_controller_state_data *data, size_t len, + __u32 offset, nvme_print_flags_t flags); +void lm_show_controller_data_queue(struct nvme_lm_ctrl_data_queue_fid_data *data, + nvme_print_flags_t flags); +#endif /* LM_PRINT_H */ diff --git a/plugins/lm/meson.build b/plugins/lm/meson.build new file mode 100644 index 0000000..a161431 --- /dev/null +++ b/plugins/lm/meson.build @@ -0,0 +1,12 @@ +sources += [ + 'plugins/lm/lm-nvme.c', + 'plugins/lm/lm-print.c', + 'plugins/lm/lm-print-stdout.c', + 'plugins/lm/lm-print-binary.c', +] + +if json_c_dep.found() + sources += [ + 'plugins/lm/lm-print-json.c', + ] +endif \ No newline at end of file diff --git a/plugins/meson.build b/plugins/meson.build index 35a9604..3f49bf2 100644 --- a/plugins/meson.build +++ b/plugins/meson.build @@ -2,37 +2,42 @@ 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', - 'plugins/huawei/huawei-nvme.c', - 'plugins/innogrit/innogrit-nvme.c', - 'plugins/inspur/inspur-nvme.c', - 'plugins/intel/intel-nvme.c', - 'plugins/memblaze/memblaze-nvme.c', - 'plugins/micron/micron-nvme.c', - 'plugins/nbft/nbft-plugin.c', - 'plugins/netapp/netapp-nvme.c', - 'plugins/nvidia/nvidia-nvme.c', - 'plugins/scaleflux/sfx-nvme.c', - 'plugins/seagate/seagate-nvme.c', - 'plugins/shannon/shannon-nvme.c', 'plugins/solidigm/solidigm-nvme.c', - 'plugins/toshiba/toshiba-nvme.c', - 'plugins/transcend/transcend-nvme.c', - 'plugins/virtium/virtium-nvme.c', - 'plugins/wdc/wdc-nvme.c', - 'plugins/wdc/wdc-utils.c', - 'plugins/ymtc/ymtc-nvme.c', - 'plugins/zns/zns.c', - 'plugins/ssstc/ssstc-nvme.c', ] subdir('solidigm') - if conf.get('HAVE_SED_OPAL') != 0 - subdir('sed') - endif endif +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', + 'plugins/huawei/huawei-nvme.c', + 'plugins/innogrit/innogrit-nvme.c', + 'plugins/inspur/inspur-nvme.c', + 'plugins/intel/intel-nvme.c', + 'plugins/memblaze/memblaze-nvme.c', + 'plugins/micron/micron-nvme.c', + 'plugins/nbft/nbft-plugin.c', + 'plugins/netapp/netapp-nvme.c', + 'plugins/nvidia/nvidia-nvme.c', + 'plugins/scaleflux/sfx-nvme.c', + 'plugins/seagate/seagate-nvme.c', + 'plugins/shannon/shannon-nvme.c', + 'plugins/ssstc/ssstc-nvme.c', + 'plugins/toshiba/toshiba-nvme.c', + 'plugins/transcend/transcend-nvme.c', + 'plugins/virtium/virtium-nvme.c', + 'plugins/wdc/wdc-nvme.c', + 'plugins/wdc/wdc-utils.c', + 'plugins/ymtc/ymtc-nvme.c', + 'plugins/zns/zns.c', +] + subdir('ocp') +subdir('lm') + +if conf.get('HAVE_SED_OPAL') != 0 + subdir('sed') +endif diff --git a/plugins/micron/micron-nvme.c b/plugins/micron/micron-nvme.c index 2782595..c3fcb64 100644 --- a/plugins/micron/micron-nvme.c +++ b/plugins/micron/micron-nvme.c @@ -737,10 +737,12 @@ static int micron_temp_stats(int argc, char **argv, struct command *cmd, struct format cfg = { .fmt = "normal", }; + bool is_json = false; struct json_object *root; struct json_object *logPages; struct nvme_dev *dev; + nvme_print_flags_t flags; OPT_ARGS(opts) = { OPT_FMT("format", 'f', &cfg.fmt, fmt), @@ -753,7 +755,13 @@ static int micron_temp_stats(int argc, char **argv, struct command *cmd, return -1; } - if (!strcmp(cfg.fmt, "json")) + err = validate_output_format(nvme_cfg.output_format, &flags); + if (err < 0) { + nvme_show_error("Invalid output format"); + return err; + } + + if (flags & JSON) is_json = true; err = nvme_get_log_smart(dev_fd(dev), 0xffffffff, false, &smart_log); @@ -764,6 +772,7 @@ static int micron_temp_stats(int argc, char **argv, struct command *cmd, tempSensors[i] = le16_to_cpu(smart_log.temp_sensor[i]); tempSensors[i] = tempSensors[i] ? tempSensors[i] - 273 : 0; } + if (is_json) { struct json_object *stats = json_create_object(); char tempstr[64] = { 0 }; @@ -840,6 +849,7 @@ static int micron_pcie_stats(int argc, char **argv, __u16 ecrc_error; __u16 unsupported_request_error; } pcie_error_counters = { 0 }; + nvme_print_flags_t flags; struct { char *err; @@ -905,7 +915,13 @@ static int micron_pcie_stats(int argc, char **argv, goto out; } - if (!strcmp(cfg.fmt, "normal")) + err = validate_output_format(cfg.fmt, &flags); + if (err < 0) { + nvme_show_error("Invalid output format"); + return err; + } + + if (flags & NORMAL) is_json = false; if (eModel == M5407) { @@ -1546,12 +1562,20 @@ static int micron_smart_ext_log(int argc, char **argv, OPT_FMT("format", 'f', &cfg.fmt, fmt), OPT_END() }; + nvme_print_flags_t flags; err = parse_and_open(&dev, argc, argv, desc, opts); if (err) { printf("\nDevice not found\n"); return -1; } + + err = validate_output_format(nvme_cfg.output_format, &flags); + if (err < 0) { + nvme_show_error("Invalid output format"); + return err; + } + if (!strcmp(cfg.fmt, "normal")) is_json = false; @@ -1956,6 +1980,7 @@ static int micron_drive_info(int argc, char **argv, struct command *cmd, char *fmt; }; int err = 0; + nvme_print_flags_t flags; const char *fmt = "output format normal"; struct format cfg = { @@ -1972,11 +1997,17 @@ static int micron_drive_info(int argc, char **argv, struct command *cmd, return err; if (model == UNKNOWN_MODEL) { - fprintf(stderr, "ERROR : Unsupported drive for vs-drive-info cmd"); + fprintf(stderr, "ERROR : Unsupported drive for vs-drive-info cmd\n"); dev_close(dev); return -1; } + err = validate_output_format(cfg.fmt, &flags); + if (err < 0) { + nvme_show_error("Invalid output format"); + return err; + } + if (!strcmp(cfg.fmt, "json")) is_json = true; diff --git a/plugins/nbft/nbft-plugin.c b/plugins/nbft/nbft-plugin.c index f25941a..01d9222 100644 --- a/plugins/nbft/nbft-plugin.c +++ b/plugins/nbft/nbft-plugin.c @@ -47,6 +47,7 @@ static char *mac_addr_to_string(unsigned char mac_addr[6]) return mac_string; } +#ifdef CONFIG_JSONC static json_object *hfi_to_json(struct nbft_info_hfi *hfi) { struct json_object *hfi_json; @@ -348,6 +349,9 @@ fail: json_free_object(nbft_json_array); return -ENOMEM; } +#else /* CONFIG_JSONC */ +#define json_show_nbfts(nbft_list, show_subsys, show_hfi, show_discovery) -EINVAL +#endif /* CONFIG_JSONC */ static void print_nbft_hfi_info(struct nbft_info *nbft) { diff --git a/plugins/netapp/netapp-nvme.c b/plugins/netapp/netapp-nvme.c index 5c2e3d4..95fde41 100644 --- a/plugins/netapp/netapp-nvme.c +++ b/plugins/netapp/netapp-nvme.c @@ -22,6 +22,7 @@ #include <unistd.h> #include <errno.h> #include <string.h> +#include <libgen.h> #include "common.h" #include "nvme.h" @@ -118,6 +119,43 @@ static void netapp_get_ns_size(char *size, unsigned long long *lba, sprintf(size, "%.2f%sB", nsze, s_suffix); } +static void netapp_get_ns_attrs(char *size, char *used, char *blk_size, + char *version, unsigned long long *lba, + struct nvme_id_ctrl *ctrl, struct nvme_id_ns *ns) +{ + __u8 lba_index; + + nvme_id_ns_flbas_to_lbaf_inuse(ns->flbas, &lba_index); + *lba = 1ULL << ns->lbaf[lba_index].ds; + + /* get the namespace size */ + double nsze = le64_to_cpu(ns->nsze) * (*lba); + const char *s_suffix = suffix_si_get(&nsze); + + sprintf(size, "%.2f%sB", nsze, s_suffix); + + /* get the namespace utilization */ + double nuse = le64_to_cpu(ns->nuse) * (*lba); + const char *u_suffix = suffix_si_get(&nuse); + + sprintf(used, "%.2f%sB", nuse, u_suffix); + + /* get the namespace block size */ + long long addr = 1LL << ns->lbaf[lba_index].ds; + const char *l_suffix = suffix_binary_get(&addr); + + sprintf(blk_size, "%u%sB", (unsigned int)addr, l_suffix); + + /* get the firmware version */ + int i, max = sizeof(ctrl->fr); + + memcpy(version, ctrl->fr, max); + version[max] = '\0'; + /* strip trailing whitespaces */ + for (i = max - 1; i >= 0 && version[i] == ' '; i--) + version[i] = '\0'; +} + static void ontap_labels_to_str(char *dst, char *src, int count) { int i; @@ -212,10 +250,11 @@ static void netapp_get_ontap_labels(char *vsname, char *nspath, static void netapp_smdevice_json(struct json_object *devices, char *devname, char *arrayname, char *volname, int nsid, char *nguid, - char *ctrl, char *astate, char *size, long long lba, - long long nsze) + char *ctrl, char *astate, char *version, unsigned long long lba, + unsigned long long nsze, unsigned long long nuse) { struct json_object *device_attrs; + unsigned long long ns_size = nsze * lba; device_attrs = json_create_object(); json_object_add_value_string(device_attrs, "Device", devname); @@ -225,18 +264,21 @@ static void netapp_smdevice_json(struct json_object *devices, char *devname, json_object_add_value_string(device_attrs, "Volume_ID", nguid); json_object_add_value_string(device_attrs, "Controller", ctrl); json_object_add_value_string(device_attrs, "Access_State", astate); - json_object_add_value_string(device_attrs, "Size", size); - json_object_add_value_int(device_attrs, "LBA_Data_Size", lba); - json_object_add_value_int(device_attrs, "Namespace_Size", nsze); + json_object_add_value_uint64(device_attrs, "LBA_Size", lba); + json_object_add_value_uint64(device_attrs, "Namespace_Size", ns_size); + json_object_add_value_string(device_attrs, "Version", version); json_array_add_value_object(devices, device_attrs); } static void netapp_ontapdevice_json(struct json_object *devices, char *devname, char *vsname, char *nspath, int nsid, char *uuid, - char *size, long long lba, long long nsze) + unsigned long long lba, char *version, + unsigned long long nsze, unsigned long long nuse) { struct json_object *device_attrs; + unsigned long long ns_size = nsze * lba; + unsigned long long used_size = nuse * lba; device_attrs = json_create_object(); json_object_add_value_string(device_attrs, "Device", devname); @@ -244,13 +286,93 @@ static void netapp_ontapdevice_json(struct json_object *devices, char *devname, json_object_add_value_string(device_attrs, "Namespace_Path", nspath); json_object_add_value_int(device_attrs, "NSID", nsid); json_object_add_value_string(device_attrs, "UUID", uuid); - json_object_add_value_string(device_attrs, "Size", size); - json_object_add_value_int(device_attrs, "LBA_Data_Size", lba); - json_object_add_value_int(device_attrs, "Namespace_Size", nsze); + json_object_add_value_uint64(device_attrs, "LBA_Size", lba); + json_object_add_value_uint64(device_attrs, "Namespace_Size", ns_size); + json_object_add_value_uint64(device_attrs, "UsedBytes", used_size); + json_object_add_value_string(device_attrs, "Version", version); json_array_add_value_object(devices, device_attrs); } +static void netapp_smdevices_print_verbose(struct smdevice_info *devices, + int count, int format, const char *devname) +{ + int i, slta; + char array_label[ARRAY_LABEL_LEN / 2 + 1]; + char volume_label[VOLUME_LABEL_LEN / 2 + 1]; + char nguid_str[33]; + unsigned long long lba; + char size[128], used[128]; + char blk_size[128], version[9]; + + char *formatstr = NULL; + char basestr[] = + "%s, Array Name %s, Volume Name %s, NSID %d, Volume ID %s, " + "Controller %c, Access State %s, Size %s, Format %s, Version %s\n"; + char columnstr[] = + "%-16s %-30s %-30s %4d %32s %c %-12s %-9s %-9s %-9s\n"; + + if (format == NNORMAL) + formatstr = basestr; + else if (format == NCOLUMN) { + /* print column headers and change the output string */ + printf("%-16s %-30s %-30s %-4s %-32s %-4s %-12s %-9s %-9s %-9s\n", + "Device", "Array Name", "Volume Name", "NSID", + "Volume ID", "Ctrl", "Access State", " Size", + "Format", "Version"); + printf("%-16s %-30s %-30s %-4s %-32s %-4s %-12s %-9s %-9s %-9s\n", + "----------------", "------------------------------", + "------------------------------", "----", + "--------------------------------", "----", + "------------", "---------", + "---------", "---------"); + formatstr = columnstr; + } + + 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_attrs(size, used, blk_size, version, + &lba, &devices[i].ctrl, &devices[i].ns); + 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, + blk_size, version); + return; + } + } + + for (i = 0; i < count; i++) { + /* fetch info and print for all devices */ + netapp_get_ns_attrs(size, used, blk_size, version, + &lba, &devices[i].ctrl, &devices[i].ns); + 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, + blk_size, version); + } +} + static void netapp_smdevices_print_regular(struct smdevice_info *devices, int count, int format, const char *devname) { @@ -258,7 +380,8 @@ static void netapp_smdevices_print_regular(struct smdevice_info *devices, char array_label[ARRAY_LABEL_LEN / 2 + 1]; char volume_label[VOLUME_LABEL_LEN / 2 + 1]; char nguid_str[33]; - __u8 lba_index; + unsigned long long lba; + char size[128]; char *formatstr = NULL; char basestr[] = @@ -268,7 +391,7 @@ static void netapp_smdevices_print_regular(struct smdevice_info *devices, if (format == NNORMAL) formatstr = basestr; else if (format == NCOLUMN) { - /* change output string and print column headers */ + /* print column headers and change the output string */ printf("%-16s %-30s %-30s %-4s %-32s %-4s %-12s %-9s\n", "Device", "Array Name", "Volume Name", "NSID", "Volume ID", "Ctrl", "Access State", " Size"); @@ -283,15 +406,7 @@ 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_get_ns_size(size, &lba, &devices[i].ns); netapp_convert_string(array_label, (char *)&devices[i].ctrl.vs[20], ARRAY_LABEL_LEN / 2); @@ -311,14 +426,7 @@ static void netapp_smdevices_print_regular(struct smdevice_info *devices, 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; - 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_get_ns_size(size, &lba, &devices[i].ns); netapp_convert_string(array_label, (char *)&devices[i].ctrl.vs[20], ARRAY_LABEL_LEN / 2); @@ -342,7 +450,9 @@ static void netapp_smdevices_print_json(struct smdevice_info *devices, char array_label[ARRAY_LABEL_LEN / 2 + 1]; char volume_label[VOLUME_LABEL_LEN / 2 + 1]; char nguid_str[33]; - __u8 lba_index; + unsigned long long lba; + char size[128], used[128]; + char blk_size[128], version[9]; /* prepare for the json output */ root = json_create_object(); @@ -351,15 +461,8 @@ static void netapp_smdevices_print_json(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_get_ns_attrs(size, used, blk_size, version, + &lba, &devices[i].ctrl, &devices[i].ns); netapp_convert_string(array_label, (char *)&devices[i].ctrl.vs[20], ARRAY_LABEL_LEN / 2); @@ -371,22 +474,18 @@ static void netapp_smdevices_print_json(struct smdevice_info *devices, 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)); + slta ? "A" : "B", "unknown", + version, lba, + le64_to_cpu(devices[i].ns.nsze), + le64_to_cpu(devices[i].ns.nuse)); 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; - 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_get_ns_attrs(size, used, blk_size, version, + &lba, &devices[i].ctrl, &devices[i].ns); netapp_convert_string(array_label, (char *)&devices[i].ctrl.vs[20], ARRAY_LABEL_LEN / 2); @@ -398,7 +497,9 @@ static void netapp_smdevices_print_json(struct smdevice_info *devices, 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)); + version, lba, + le64_to_cpu(devices[i].ns.nsze), + le64_to_cpu(devices[i].ns.nuse)); } out: @@ -409,6 +510,67 @@ out: json_free_object(root); } +static void netapp_ontapdevices_print_verbose(struct ontapdevice_info *devices, + int count, int format, const char *devname) +{ + char vsname[ONTAP_LABEL_LEN] = " "; + char nspath[ONTAP_NS_PATHLEN] = " "; + unsigned long long lba; + char size[128], used[128]; + char blk_size[128], version[9]; + char uuid_str[37] = " "; + int i; + + char *formatstr = NULL; + char basestr[] = + "%s, Vserver %s, Namespace Path %s, NSID %d, UUID %s, " + "Size %s, Used %s, Format %s, Version %s\n"; + char columnstr[] = "%-16s %-25s %-50s %-4d %-38s %-9s %-9s %-9s %-9s\n"; + + if (format == NNORMAL) + formatstr = basestr; + else if (format == NCOLUMN) { + printf("%-16s %-25s %-50s %-4s %-38s %-9s %-9s %-9s %-9s\n", + "Device", "Vserver", "Namespace Path", + "NSID", "UUID", "Size", "Used", + "Format", "Version"); + printf("%-16s %-25s %-50s %-4s %-38s %-9s %-9s %-9s %-9s\n", + "----------------", "-------------------------", + "--------------------------------------------------", + "----", "--------------------------------------", + "---------", "---------", "---------", "---------"); + formatstr = columnstr; + } + + 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_attrs(size, used, blk_size, version, + &lba, &devices[i].ctrl, &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, used, + blk_size, version); + return; + } + } + + for (i = 0; i < count; i++) { + /* fetch info and print for all devices */ + netapp_get_ns_attrs(size, used, blk_size, version, + &lba, &devices[i].ctrl, &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, used, + blk_size, version); + } +} + static void netapp_ontapdevices_print_regular(struct ontapdevice_info *devices, int count, int format, const char *devname) { @@ -471,7 +633,8 @@ static void netapp_ontapdevices_print_json(struct ontapdevice_info *devices, char vsname[ONTAP_LABEL_LEN] = " "; char nspath[ONTAP_NS_PATHLEN] = " "; unsigned long long lba; - char size[128]; + char size[128], used[128]; + char blk_size[128], version[9]; char uuid_str[37] = " "; int i; @@ -482,28 +645,33 @@ static void netapp_ontapdevices_print_json(struct ontapdevice_info *devices, 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); + netapp_get_ns_attrs(size, used, blk_size, version, + &lba, &devices[i].ctrl, &devices[i].ns); nvme_uuid_to_string(devices[i].uuid, uuid_str); - netapp_get_ontap_labels(vsname, nspath, devices[i].log_data); + 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)); + uuid_str, lba, version, + le64_to_cpu(devices[i].ns.nsze), + le64_to_cpu(devices[i].ns.nuse)); goto out; } } for (i = 0; i < count; i++) { /* fetch info for all devices */ - netapp_get_ns_size(size, &lba, &devices[i].ns); + netapp_get_ns_attrs(size, used, blk_size, version, + &lba, &devices[i].ctrl, &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)); + uuid_str, lba, version, + le64_to_cpu(devices[i].ns.nsze), + le64_to_cpu(devices[i].ns.nuse)); } out: @@ -663,8 +831,10 @@ static int netapp_output_format(char *format) return -EINVAL; if (!strcmp(format, "normal")) return NNORMAL; +#ifdef CONFIG_JSONC if (!strcmp(format, "json")) return NJSON; +#endif /* CONFIG_JSONC */ if (!strcmp(format, "column")) return NCOLUMN; return -EINVAL; @@ -684,6 +854,7 @@ static int netapp_smdevices(int argc, char **argv, struct command *command, int num_smdevices = 0; struct config { + bool verbose; char *output_format; }; @@ -692,6 +863,7 @@ static int netapp_smdevices(int argc, char **argv, struct command *command, }; OPT_ARGS(opts) = { + OPT_FLAG("verbose", 'v', &cfg.verbose, "Increase output verbosity"), OPT_FMT("output-format", 'o', &cfg.output_format, "Output Format: normal|json|column"), OPT_END() }; @@ -708,7 +880,7 @@ static int netapp_smdevices(int argc, char **argv, struct command *command, num = scandir(dev_path, &devices, netapp_nvme_filter, alphasort); if (num <= 0) { - fprintf(stderr, "No NVMe devices detected.\n"); + fprintf(stderr, "No smdevices detected\n"); return num; } @@ -726,7 +898,7 @@ static int netapp_smdevices(int argc, char **argv, struct command *command, smdevices = calloc(num, sizeof(*smdevices)); if (!smdevices) { - fprintf(stderr, "Unable to allocate memory for devices.\n"); + fprintf(stderr, "Unable to allocate memory for devices\n"); return -ENOMEM; } @@ -746,9 +918,14 @@ 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, devname); + if (fmt == NNORMAL || fmt == NCOLUMN) { + if (argconfig_parse_seen(opts, "verbose")) + netapp_smdevices_print_verbose(smdevices, + num_smdevices, fmt, devname); + else + netapp_smdevices_print_regular(smdevices, + num_smdevices, fmt, devname); + } else if (fmt == NJSON) netapp_smdevices_print_json(smdevices, num_smdevices, devname); @@ -775,6 +952,7 @@ static int netapp_ontapdevices(int argc, char **argv, struct command *command, int num_ontapdevices = 0; struct config { + bool verbose; char *output_format; }; @@ -783,6 +961,7 @@ static int netapp_ontapdevices(int argc, char **argv, struct command *command, }; OPT_ARGS(opts) = { + OPT_FLAG("verbose", 'v', &cfg.verbose, "Increase output verbosity"), OPT_FMT("output-format", 'o', &cfg.output_format, "Output Format: normal|json|column"), OPT_END() }; @@ -811,13 +990,13 @@ static int netapp_ontapdevices(int argc, char **argv, struct command *command, num = scandir(dev_path, &devices, netapp_nvme_filter, alphasort); if (num <= 0) { - fprintf(stderr, "No NVMe devices detected.\n"); + fprintf(stderr, "No ontapdevices detected\n"); return num; } ontapdevices = calloc(num, sizeof(*ontapdevices)); if (!ontapdevices) { - fprintf(stderr, "Unable to allocate memory for devices.\n"); + fprintf(stderr, "Unable to allocate memory for devices\n"); return -ENOMEM; } @@ -838,9 +1017,14 @@ 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, devname); + if (fmt == NNORMAL || fmt == NCOLUMN) { + if (argconfig_parse_seen(opts, "verbose")) + netapp_ontapdevices_print_verbose(ontapdevices, + num_ontapdevices, fmt, devname); + else + netapp_ontapdevices_print_regular(ontapdevices, + num_ontapdevices, fmt, devname); + } else if (fmt == NJSON) netapp_ontapdevices_print_json(ontapdevices, num_ontapdevices, devname); diff --git a/plugins/ocp/ocp-clear-features.c b/plugins/ocp/ocp-clear-features.c index 731dfea..6686f85 100644 --- a/plugins/ocp/ocp-clear-features.c +++ b/plugins/ocp/ocp-clear-features.c @@ -7,12 +7,11 @@ */ #include <unistd.h> +#include "util/types.h" +#include "ocp-nvme.h" #include "ocp-utils.h" #include "nvme-print.h" -static const __u8 OCP_FID_CLEAR_FW_ACTIVATION_HISTORY = 0xC1; -static const __u8 OCP_FID_CLEAR_PCIE_CORRECTABLE_ERROR_COUNTERS = 0xC3; - static int ocp_clear_feature(int argc, char **argv, const char *desc, const __u8 fid) { __u32 result = 0; @@ -80,14 +79,13 @@ int ocp_clear_fw_update_history(int argc, char **argv, struct command *cmd, stru { const char *desc = "OCP Clear Firmware Update History"; - return ocp_clear_feature(argc, argv, desc, OCP_FID_CLEAR_FW_ACTIVATION_HISTORY); + return ocp_clear_feature(argc, argv, desc, OCP_FID_CFUH); } int ocp_clear_pcie_correctable_errors(int argc, char **argv, struct command *cmd, - struct plugin *plugin) + struct plugin *plugin) { const char *desc = "OCP Clear PCIe Correctable Error Counters"; - return ocp_clear_feature(argc, argv, desc, - OCP_FID_CLEAR_PCIE_CORRECTABLE_ERROR_COUNTERS); + return ocp_clear_feature(argc, argv, desc, OCP_FID_CPCIE); } diff --git a/plugins/ocp/ocp-fw-activation-history.c b/plugins/ocp/ocp-fw-activation-history.c index 79c03b2..d3eb60c 100644 --- a/plugins/ocp/ocp-fw-activation-history.c +++ b/plugins/ocp/ocp-fw-activation-history.c @@ -13,6 +13,7 @@ #include "common.h" #include "nvme-print.h" +#include "ocp-nvme.h" #include "ocp-utils.h" #include "ocp-print.h" @@ -26,7 +27,6 @@ static const unsigned char ocp_fw_activation_history_guid[GUID_LEN] = { int ocp_fw_activation_history_log(int argc, char **argv, struct command *cmd, struct plugin *plugin) { - const __u8 log_id = 0xC2; const char *description = "Retrieves the OCP firmware activation history log."; char *format = "normal"; @@ -59,7 +59,7 @@ int ocp_fw_activation_history_log(int argc, char **argv, struct command *cmd, .args_size = sizeof(args), .fd = dev_fd(dev), .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, - .lid = log_id, + .lid = (enum nvme_cmd_get_log_lid)OCP_LID_FAHL_OBSOLETE, .len = sizeof(fw_history), .nsid = NVME_NSID_ALL, .csi = NVME_CSI_NVM, diff --git a/plugins/ocp/ocp-fw-activation-history.h b/plugins/ocp/ocp-fw-activation-history.h index 15733a3..fa37e4b 100644 --- a/plugins/ocp/ocp-fw-activation-history.h +++ b/plugins/ocp/ocp-fw-activation-history.h @@ -4,6 +4,7 @@ * * Authors: karl.dedow@solidigm.com */ +#include <libnvme.h> #include "common.h" #include "linux/types.h" @@ -18,7 +19,7 @@ struct __packed fw_activation_history_entry { __u8 entry_length; __le16 reserved1; __le16 activation_count; - __le64 timestamp; + struct nvme_timestamp ts; __le64 reserved2; __le64 power_cycle_count; char previous_fw[8]; diff --git a/plugins/ocp/ocp-hardware-component-log.c b/plugins/ocp/ocp-hardware-component-log.c index 73f1452..e4a8e06 100644 --- a/plugins/ocp/ocp-hardware-component-log.c +++ b/plugins/ocp/ocp-hardware-component-log.c @@ -11,6 +11,7 @@ #include "nvme-print.h" #include "ocp-hardware-component-log.h" #include "ocp-print.h" +#include "ocp-utils.h" //#define HWCOMP_DUMMY @@ -154,6 +155,8 @@ const char *hwcomp_id_to_string(__u32 id) return "Country of Origin"; case HWCOMP_ID_HW_REV: return "Global Device Hardware Revision"; + case HWCOMP_ID_BORN_ON_DATE: + return "Born on Date"; case HWCOMP_ID_VENDOR ... HWCOMP_ID_MAX: return "Vendor Unique Component"; case HWCOMP_ID_RSVD: @@ -168,39 +171,59 @@ 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); + long double log_bytes; + nvme_uint128_t log_size; + struct nvme_get_log_args args = { - .lpo = desc_offset, .args_size = sizeof(args), .fd = dev_fd(dev), .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, - .lid = LID_HWCOMP, + .lid = (enum nvme_cmd_get_log_lid)OCP_LID_HWCOMP, .nsid = NVME_NSID_ALL, + .log = log, + .len = desc_offset, }; + ocp_get_uuid_index(dev, &args.uuidx); + #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); + 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 simple (hwcomp: %02X, ret: %d)\n", - LID_HWCOMP, ret); + print_info_error("error: ocp: failed to get hwcomp log size (ret: %d)\n", ret); return ret; } #endif /* HWCOMP_DUMMY */ - print_info("id: %02Xh\n", LID_HWCOMP); + log_size = le128_to_cpu(log->size); + + print_info("id: %02Xh\n", OCP_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))); + print_info("size: %s\n", uint128_t_to_string(log_size)); + + log_bytes = uint128_t_to_double(log_size); + if (log->ver == 1) + log_bytes *= sizeof(__le32); + + if (log_bytes <= desc_offset) { + print_info_error("error: ocp: invalid hwcomp log size bytes: %.0Lf\n", log_bytes); + return -EINVAL; + } + + args.len = log_bytes - desc_offset; + + print_info("args.len: %u\n", args.len); - 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; + return -errno; } args.log = log->desc, + args.lpo = desc_offset, #ifdef HWCOMP_DUMMY memcpy(log->desc, &hwcomp_dummy[desc_offset], args.len); @@ -208,7 +231,8 @@ static int get_hwcomp_log_data(struct nvme_dev *dev, struct hwcomp_log *log) 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); + OCP_LID_HWCOMP, ret); + free(log->desc); return ret; } #endif /* HWCOMP_DUMMY */ @@ -218,12 +242,10 @@ static int get_hwcomp_log_data(struct nvme_dev *dev, struct hwcomp_log *log) 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, + .desc = NULL, }; ret = validate_output_format(nvme_cfg.output_format, &fmt); @@ -235,12 +257,14 @@ static int get_hwcomp_log(struct nvme_dev *dev, __u32 id, bool list) 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); + OCP_LID_HWCOMP, ret); return ret; } ocp_show_hwcomp_log(&log, id, list, fmt); + free(log.desc); + return 0; } @@ -268,6 +292,7 @@ int ocp_hwcomp_log(int argc, char **argv, struct command *cmd, struct plugin *pl VAL_LONG("sn", HWCOMP_ID_SN), VAL_LONG("country", HWCOMP_ID_COUNTRY), VAL_LONG("hw-rev", HWCOMP_ID_HW_REV), + VAL_LONG("born-on-date", HWCOMP_ID_BORN_ON_DATE), VAL_LONG("vendor", HWCOMP_ID_VENDOR), VAL_END() }; @@ -281,8 +306,8 @@ int ocp_hwcomp_log(int argc, char **argv, struct command *cmd, struct plugin *pl 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); + fprintf(stderr, "error: ocp: failed to get hwcomp log: %02X, ret: %d\n", + OCP_LID_HWCOMP, ret); return ret; } diff --git a/plugins/ocp/ocp-hardware-component-log.h b/plugins/ocp/ocp-hardware-component-log.h index f5e5162..1755388 100644 --- a/plugins/ocp/ocp-hardware-component-log.h +++ b/plugins/ocp/ocp-hardware-component-log.h @@ -9,7 +9,6 @@ #ifndef OCP_HARDWARE_COMPONENT_LOG_H #define OCP_HARDWARE_COMPONENT_LOG_H -#define LID_HWCOMP 0xc6 #define HWCOMP_RSVD2_LEN 14 #define HWCOMP_SIZE_LEN 16 #define HWCOMP_RSVD48_LEN 16 @@ -54,6 +53,7 @@ enum hwcomp_id { HWCOMP_ID_SN, HWCOMP_ID_COUNTRY, HWCOMP_ID_HW_REV, + HWCOMP_ID_BORN_ON_DATE, HWCOMP_ID_VENDOR = 0x8000, HWCOMP_ID_MAX = 0xffff, }; diff --git a/plugins/ocp/ocp-nvme.c b/plugins/ocp/ocp-nvme.c index 6f05750..94ef06e 100644 --- a/plugins/ocp/ocp-nvme.c +++ b/plugins/ocp/ocp-nvme.c @@ -32,6 +32,7 @@ #include "ocp-telemetry-decode.h" #include "ocp-hardware-component-log.h" #include "ocp-print.h" +#include "ocp-types.h" #define CREATE_CMD #include "ocp-nvme.h" @@ -44,8 +45,6 @@ /// Latency Monitor Log #define C3_LATENCY_MON_LOG_BUF_LEN 0x200 -#define C3_LATENCY_MON_OPCODE 0xC3 -#define NVME_FEAT_OCP_LATENCY_MONITOR 0xC5 static __u8 lat_mon_guid[GUID_LEN] = { 0x92, 0x7a, 0xc0, 0x8c, @@ -104,6 +103,17 @@ enum erri_type { ERRI_TYPE_HW_MALFUNCTION, ERRI_TYPE_NO_MORE_NAND_SPARES, ERRI_TYPE_INCOMPLETE_SHUTDOWN, + ERRI_TYPE_METADATA_CORRUPTION, + ERRI_TYPE_CRITICAL_GC, + ERRI_TYPE_LATENCY_SPIKE, + ERRI_TYPE_IO_CMD_FAILURE, + ERRI_TYPE_IO_CMD_TIMEOUT, + ERRI_TYPE_ADMIN_CMD_FAILURE, + ERRI_TYPE_ADMIN_CMD_TIMEOUT, + ERRI_TYPE_THERMAL_THROTTLE_ENGAGED, + ERRI_TYPE_THERMAL_THROTTLE_DISENGAGED, + ERRI_TYPE_CRITICAL_TEMPERATURE_EVENT, + ERRI_TYPE_DIE_OFFLINE, }; const char *erri_type_to_string(__le16 type) @@ -131,6 +141,28 @@ const char *erri_type_to_string(__le16 type) return "no more NAND spares available"; case ERRI_TYPE_INCOMPLETE_SHUTDOWN: return "incomplete shutdown"; + case ERRI_TYPE_METADATA_CORRUPTION: + return "Metadata Corruption"; + case ERRI_TYPE_CRITICAL_GC: + return "Critical Garbage Collection"; + case ERRI_TYPE_LATENCY_SPIKE: + return "Latency Spike"; + case ERRI_TYPE_IO_CMD_FAILURE: + return "I/O command failure"; + case ERRI_TYPE_IO_CMD_TIMEOUT: + return "I/O command timeout"; + case ERRI_TYPE_ADMIN_CMD_FAILURE: + return "Admin command failure"; + case ERRI_TYPE_ADMIN_CMD_TIMEOUT: + return "Admin command timeout"; + case ERRI_TYPE_THERMAL_THROTTLE_ENGAGED: + return "Thermal Throttle Engaged"; + case ERRI_TYPE_THERMAL_THROTTLE_DISENGAGED: + return "Thermal Throttle Disengaged"; + case ERRI_TYPE_CRITICAL_TEMPERATURE_EVENT: + return "Critical Temperature Event"; + case ERRI_TYPE_DIE_OFFLINE: + return "Die Offline"; default: break; } @@ -161,6 +193,8 @@ 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 const char *save = "Specifies that the controller shall save the attribute"; +static const char *enable_ieee1667_silo = "enable IEEE1667 silo"; static int get_c3_log_page(struct nvme_dev *dev, char *format) { @@ -183,8 +217,7 @@ static int get_c3_log_page(struct nvme_dev *dev, char *format) } memset(data, 0, sizeof(__u8) * C3_LATENCY_MON_LOG_BUF_LEN); - ret = nvme_get_log_simple(dev_fd(dev), C3_LATENCY_MON_OPCODE, - C3_LATENCY_MON_LOG_BUF_LEN, data); + ret = ocp_get_log_simple(dev, OCP_LID_LMLOG, C3_LATENCY_MON_LOG_BUF_LEN, data); if (strcmp(format, "json")) fprintf(stderr, "NVMe Status:%s(%x)\n", nvme_status_to_string(ret, false), ret); @@ -305,7 +338,7 @@ int ocp_set_latency_monitor_feature(int argc, char **argv, struct command *cmd, .active_latency_minimum_window = 0xA, .debug_log_trigger_enable = 0, .discard_debug_log = 0, - .latency_monitor_feature_enable = 0x7, + .latency_monitor_feature_enable = 0x1, }; OPT_ARGS(opts) = { @@ -356,7 +389,7 @@ int ocp_set_latency_monitor_feature(int argc, char **argv, struct command *cmd, struct nvme_set_features_args args = { .args_size = sizeof(args), .fd = dev_fd(dev), - .fid = NVME_FEAT_OCP_LATENCY_MONITOR, + .fid = OCP_FID_LM, .nsid = 0, .cdw12 = 0, .save = 1, @@ -370,7 +403,7 @@ int ocp_set_latency_monitor_feature(int argc, char **argv, struct command *cmd, if (err < 0) { perror("set-feature"); } else if (!err) { - printf("NVME_FEAT_OCP_LATENCY_MONITOR: 0x%02x\n", NVME_FEAT_OCP_LATENCY_MONITOR); + printf("NVME_FEAT_OCP_LATENCY_MONITOR: 0x%02x\n", OCP_FID_LM); printf("active bucket timer threshold: 0x%x\n", le16_to_cpu(buf.active_bucket_timer_threshold)); printf("active threshold a: 0x%x\n", buf.active_threshold_a); @@ -511,10 +544,8 @@ static int eol_plp_failure_mode(int argc, char **argv, struct command *cmd, const char *desc = "Define EOL or PLP circuitry failure mode.\n" "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]: current/default/saved/supported"; const __u32 nsid = 0; - const __u8 fid = 0xc2; + const __u8 fid = OCP_FID_ROWTM; struct nvme_dev *dev; int err; @@ -1252,8 +1283,7 @@ static int get_c9_log_page_data(struct nvme_dev *dev, int print_data, int save_b } 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); + ret = ocp_get_log_simple(dev, OCP_LID_TELSLG, C9_TELEMETRY_STR_LOG_LEN, header_data); if (!ret) { log_data = (struct telemetry_str_log_format *)header_data; @@ -1295,8 +1325,7 @@ static int get_c9_log_page_data(struct nvme_dev *dev, int print_data, int save_b } 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); + ret = ocp_get_log_simple(dev, OCP_LID_TELSLG, total_log_page_sz, pC9_string_buffer); } else { fprintf(stderr, "ERROR : OCP : Unable to read C9 data.\n"); } @@ -1385,7 +1414,7 @@ static int ocp_telemetry_log(int argc, char **argv, struct command *cmd, struct 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'"; + const char *telemetry_type = "Telemetry Type; 'host', 'host0', 'host1' or 'controller'"; struct nvme_dev *dev; int err = 0; @@ -1453,7 +1482,8 @@ static int ocp_telemetry_log(int argc, char **argv, struct command *cmd, struct else if (!strcmp(opt.telemetry_type, "controller")) tele_type = TELEMETRY_TYPE_CONTROLLER; else { - nvme_show_error("telemetry-type should be host or controller.\n"); + nvme_show_error( + "telemetry-type should be host, host0, host1 or controller.\n"); goto out; } } else { @@ -1504,60 +1534,6 @@ static int ocp_telemetry_log(int argc, char **argv, struct command *cmd, struct 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, 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); - - printf("\n-------------------------------------------------------------\n"); - - printf("\nExtracting Telemetry Host 0 Dump (Data Area 3)...\n"); - - 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); - - printf("\n-------------------------------------------------------------\n"); - - printf("\nExtracting Telemetry Host 1 Dump (Data Area 1)...\n"); - - 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); - - printf("\n-------------------------------------------------------------\n"); - - printf("\nExtracting Telemetry Host 1 Dump (Data Area 3)...\n"); - - 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); - - printf("\n-------------------------------------------------------------\n"); - - printf("\nExtracting Telemetry Controller Dump (Data Area 3)...\n"); - - if (is_support_telemetry_controller == true) { - 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"); - break; case TELEMETRY_TYPE_HOST_0: case TELEMETRY_TYPE_HOST_1: default: @@ -1585,7 +1561,6 @@ out: /* C5 Unsupported Requirement Log Page */ #define C5_UNSUPPORTED_REQS_LEN 4096 -#define C5_UNSUPPORTED_REQS_OPCODE 0xC5 static __u8 unsupported_req_guid[GUID_LEN] = { 0x2F, 0x72, 0x9C, 0x0E, @@ -1620,8 +1595,7 @@ static int get_c5_log_page(struct nvme_dev *dev, char *format) } memset(data, 0, sizeof(__u8) * C5_UNSUPPORTED_REQS_LEN); - ret = nvme_get_log_simple(dev_fd(dev), C5_UNSUPPORTED_REQS_OPCODE, - C5_UNSUPPORTED_REQS_LEN, data); + ret = ocp_get_log_simple(dev, OCP_LID_URLP, C5_UNSUPPORTED_REQS_LEN, data); if (!ret) { log_data = (struct unsupported_requirement_log *)data; @@ -1693,7 +1667,6 @@ static int ocp_unsupported_requirements_log(int argc, char **argv, struct comman /// Error Recovery Log Page(0xC1) #define C1_ERROR_RECOVERY_LOG_BUF_LEN 0x200 -#define C1_ERROR_RECOVERY_OPCODE 0xC1 static __u8 error_recovery_guid[GUID_LEN] = { 0x44, 0xd9, 0x31, 0x21, @@ -1726,7 +1699,7 @@ static int get_c1_log_page(struct nvme_dev *dev, char *format) } memset(data, 0, sizeof(__u8) * C1_ERROR_RECOVERY_LOG_BUF_LEN); - ret = nvme_get_log_simple(dev_fd(dev), C1_ERROR_RECOVERY_OPCODE, C1_ERROR_RECOVERY_LOG_BUF_LEN, data); + ret = ocp_get_log_simple(dev, OCP_LID_EREC, C1_ERROR_RECOVERY_LOG_BUF_LEN, data); if (!ret) { log_data = (struct ocp_error_recovery_log_page *)data; @@ -1797,7 +1770,6 @@ static int ocp_error_recovery_log(int argc, char **argv, struct command *cmd, st /// Device Capabilities (Log Identifier C4h) Requirements #define C4_DEV_CAP_REQ_LEN 0x1000 -#define C4_DEV_CAP_REQ_OPCODE 0xC4 static __u8 dev_cap_req_guid[GUID_LEN] = { 0x97, 0x42, 0x05, 0x0d, 0xd1, 0xe1, 0xc9, 0x98, @@ -1829,7 +1801,7 @@ static int get_c4_log_page(struct nvme_dev *dev, char *format) } memset(data, 0, sizeof(__u8) * C4_DEV_CAP_REQ_LEN); - ret = nvme_get_log_simple(dev_fd(dev), C4_DEV_CAP_REQ_OPCODE, C4_DEV_CAP_REQ_LEN, data); + ret = ocp_get_log_simple(dev, OCP_LID_DCLP, C4_DEV_CAP_REQ_LEN, data); if (!ret) { log_data = (struct ocp_device_capabilities_log_page *)data; @@ -1915,7 +1887,7 @@ static int ocp_set_telemetry_profile(struct nvme_dev *dev, __u8 tps) struct nvme_set_features_args args = { .args_size = sizeof(args), .fd = dev_fd(dev), - .fid = 0xC8, + .fid = OCP_FID_TEL_CFG, .nsid = 0xFFFFFFFF, .cdw11 = tps, .cdw12 = 0, @@ -2038,7 +2010,6 @@ static int set_dssd_power_state_feature(int argc, char **argv, struct command *c const char *power_state = "DSSD Power State to set in watts"; const char *save = "Specifies that the controller shall save the attribute"; const __u32 nsid = 0; - const __u8 fid = 0xC7; struct nvme_dev *dev; int err; @@ -2065,9 +2036,8 @@ static int set_dssd_power_state_feature(int argc, char **argv, struct command *c return err; if (argconfig_parse_seen(opts, "power-state")) - err = set_dssd_power_state(dev, nsid, fid, cfg.power_state, - cfg.save, - !argconfig_parse_seen(opts, "no-uuid")); + err = set_dssd_power_state(dev, nsid, OCP_FID_DSSDPS, cfg.power_state, cfg.save, + !argconfig_parse_seen(opts, "no-uuid")); dev_close(dev); @@ -2130,7 +2100,7 @@ static int get_dssd_power_state_feature(int argc, char **argv, struct command *c const char *all = "Print out all 3 values at once - Current, Default, and Saved"; const char *sel = "[0-3]: current/default/saved/supported/"; const __u32 nsid = 0; - const __u8 fid = 0xC7; + const __u8 fid = OCP_FID_DSSDPS; struct nvme_dev *dev; int i, err; @@ -2188,7 +2158,6 @@ static int set_plp_health_check_interval(int argc, char **argv, struct command * const char *plp_health_interval = "[31:16]:PLP Health Check Interval"; const char *save = "Specifies that the controller shall save the attribute"; const __u32 nsid = 0; - const __u8 fid = 0xc6; struct nvme_dev *dev; int err; __u32 result; @@ -2230,7 +2199,7 @@ static int set_plp_health_check_interval(int argc, char **argv, struct command * struct nvme_set_features_args args = { .args_size = sizeof(args), .fd = dev_fd(dev), - .fid = fid, + .fid = OCP_FID_PLPI, .nsid = nsid, .cdw11 = cfg.plp_health_interval << 16, .cdw12 = 0, @@ -2262,7 +2231,6 @@ static int get_plp_health_check_interval(int argc, char **argv, struct command * { const char *desc = "Define Issue Get Feature command (FID : 0xC6) PLP Health Check Interval"; - const char *sel = "[0-3,8]: current/default/saved/supported/changed"; const __u32 nsid = 0; const __u8 fid = 0xc6; struct nvme_dev *dev; @@ -2290,7 +2258,7 @@ static int get_plp_health_check_interval(int argc, char **argv, struct command * struct nvme_get_features_args args = { .args_size = sizeof(args), .fd = dev_fd(dev), - .fid = fid, + .fid = OCP_FID_PLPI, .nsid = nsid, .sel = cfg.sel, .cdw11 = 0, @@ -2328,7 +2296,6 @@ static int set_dssd_async_event_config(int argc, char **argv, struct command *cm const char *epn = "[0]:Enable Panic Notices"; const char *save = "Specifies that the controller shall save the attribute"; const __u32 nsid = 0; - const __u8 fid = 0xc9; struct nvme_dev *dev; int err; __u32 result; @@ -2364,7 +2331,7 @@ static int set_dssd_async_event_config(int argc, char **argv, struct command *cm struct nvme_set_features_args args = { .args_size = sizeof(args), .fd = dev_fd(dev), - .fid = fid, + .fid = OCP_FID_DAEC, .nsid = nsid, .cdw11 = cfg.epn ? 1 : 0, .cdw12 = 0, @@ -2398,7 +2365,7 @@ static int get_dssd_async_event_config(int argc, char **argv, struct command *cm const char *desc = "Issue Get Feature command (FID : 0xC9) DSSD Async Event Config"; const char *sel = "[0-3]: current/default/saved/supported"; const __u32 nsid = 0; - const __u8 fid = 0xc9; + const __u8 fid = OCP_FID_DAEC; struct nvme_dev *dev; __u32 result; int err; @@ -2469,7 +2436,11 @@ static int get_c9_log_page(struct nvme_dev *dev, char *format) return ret; } - ret = get_c9_log_page_data(dev, 1, 0); + if (fmt == BINARY) + ret = get_c9_log_page_data(dev, 0, 1); + else + ret = get_c9_log_page_data(dev, 0, 0); + if (!ret) { ocp_c9_log(log_data, pC9_string_buffer, total_log_page_sz, fmt); } else { @@ -2496,7 +2467,8 @@ static int ocp_telemetry_str_log_format(int argc, char **argv, struct command *c }; OPT_ARGS(opts) = { - OPT_FMT("output-format", 'o', &cfg.output_format, "output Format: normal|json"), + OPT_FMT("output-format", 'o', &cfg.output_format, + "output Format:normal|json|binary"), OPT_END() }; @@ -2521,7 +2493,6 @@ static int ocp_telemetry_str_log_format(int argc, char **argv, struct command *c /* C7 TCG Configuration Log Page */ #define C7_TCG_CONFIGURATION_LEN 512 -#define C7_TCG_CONFIGURATION_OPCODE 0xC7 static __u8 tcg_configuration_guid[GUID_LEN] = { 0x06, 0x40, 0x24, 0xBD, @@ -2556,8 +2527,7 @@ static int get_c7_log_page(struct nvme_dev *dev, char *format) } memset(data, 0, sizeof(__u8) * C7_TCG_CONFIGURATION_LEN); - ret = nvme_get_log_simple(dev_fd(dev), C7_TCG_CONFIGURATION_OPCODE, - C7_TCG_CONFIGURATION_LEN, data); + ret = ocp_get_log_simple(dev, OCP_LID_TCGL, C7_TCG_CONFIGURATION_LEN, data); if (!ret) { log_data = (struct tcg_configuration_log *)data; @@ -2657,7 +2627,7 @@ 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; + const __u8 fid = OCP_FID_ERRI; _cleanup_free_ struct erri_entry *entry = NULL; @@ -2738,7 +2708,7 @@ static int error_injection_set(struct nvme_dev *dev, struct erri_config *cfg, bo struct nvme_set_features_args args = { .args_size = sizeof(args), .fd = dev_fd(dev), - .fid = 0xc0, + .fid = OCP_FID_ERRI, .cdw11 = cfg->number, .data_len = cfg->number * sizeof(struct erri_entry), .timeout = nvme_cfg.timeout, @@ -2830,7 +2800,7 @@ static int enable_ieee1667_silo_get(struct nvme_dev *dev, const __u8 sel, bool u { struct ieee1667_get_cq_entry cq_entry; int err; - const __u8 fid = 0xc4; + const __u8 fid = OCP_FID_1667; struct nvme_get_features_args args = { .result = (__u32 *)&cq_entry, @@ -2890,6 +2860,70 @@ 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 int enable_ieee1667_silo_set(struct nvme_dev *dev, + struct argconfig_commandline_options *opts) +{ + struct ieee1667_get_cq_entry cq_entry; + int err; + const __u8 fid = OCP_FID_1667; + bool enable = argconfig_parse_seen(opts, "enable"); + + struct nvme_set_features_args args = { + .result = (__u32 *)&cq_entry, + .args_size = sizeof(args), + .fd = dev_fd(dev), + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .cdw11 = OCP_SET(enable, ENABLE_IEEE1667_SILO), + .save = argconfig_parse_seen(opts, "save"), + .fid = fid, + }; + + if (!argconfig_parse_seen(opts, "no-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_set_features(dev, &args); + if (err > 0) { + nvme_show_status(err); + } else if (err < 0) { + nvme_show_perror(enable_ieee1667_silo); + fprintf(stderr, "Command failed while parsing.\n"); + } else { + enable = OCP_GET(args.cdw11, ENABLE_IEEE1667_SILO); + nvme_show_result("Successfully set enable (feature: 0x%02x): %d (%s: %s).", fid, + enable, args.save ? "Save" : "Not save", + enable ? "Enabled" : "Disabled"); + } + + return err; +} + +static int set_enable_ieee1667_silo(int argc, char **argv, struct command *cmd, + struct plugin *plugin) +{ + int err; + + _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; + + OPT_ARGS(opts) = { + OPT_FLAG("enable", 'e', NULL, no_uuid), + OPT_FLAG("save", 's', NULL, save), + OPT_FLAG("no-uuid", 'n', NULL, no_uuid), + OPT_END() + }; + + err = parse_and_open(&dev, argc, argv, enable_ieee1667_silo, opts); + if (err) + return err; + + return enable_ieee1667_silo_set(dev, opts); +} + static int hwcomp_log(int argc, char **argv, struct command *cmd, struct plugin *plugin) { return ocp_hwcomp_log(argc, argv, cmd, plugin); diff --git a/plugins/ocp/ocp-nvme.h b/plugins/ocp/ocp-nvme.h index 04acbfc..4e697f2 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 "2.9.2" +#define OCP_PLUGIN_VERSION "2.11.0" #include "cmd.h" PLUGIN(NAME("ocp", "OCP cloud SSD extensions", OCP_PLUGIN_VERSION), @@ -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("set-enable-ieee1667-silo", "enable IEEE1667 silo", set_enable_ieee1667_silo) ENTRY("hardware-component-log", "retrieve hardware component log", hwcomp_log) ) ); @@ -50,6 +51,8 @@ PLUGIN(NAME("ocp", "OCP cloud SSD extensions", OCP_PLUGIN_VERSION), #ifndef OCP_NVME_H #define OCP_NVME_H +#include "common.h" + struct __packed ssd_latency_monitor_log { __u8 feature_status; /* 0x00 */ __u8 rsvd1; /* 0x01 */ @@ -73,8 +76,9 @@ struct __packed 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[0x0A]; /* 0x1AA */ + __u8 latency_monitor_debug_log_size[0x0C]; /* 0x1B4 */ __le16 debug_log_trigger_enable; /* 0x1C0 */ __le16 debug_log_measured_latency; /* 0x1C2 */ __le64 debug_log_latency_stamp; /* 0x1C4 */ @@ -195,7 +199,7 @@ struct __packed ocp_device_capabilities_log_page { /* * struct tcg_configuration_log - TCG Configuration Log Page Structure * @state: state - * @rsvd1: Reserved1 + * @rsvd1: Reserved * @locking_sp_act_count: Locking SP Activation Count * @type_rev_count: Tper Revert Count * @locking_sp_rev_count: Locking SP Revert Count. @@ -207,13 +211,14 @@ struct __packed ocp_device_capabilities_log_page { * @no_of_write_lock_locking_obj: Number of Write Locked Locking Objects * @no_of_read_unlock_locking_obj: Number of Read Unlocked Locking Objects * @no_of_read_unlock_locking_obj: Number of Write Unlocked Locking Objects - * @rsvd2: Reserved2 + * @rsvd15: Reserved * @sid_auth_try_count: SID Authentication Try Count * @sid_auth_try_limit: SID Authentication Try Limit * @pro_tcg_rc: Programmatic TCG Reset Count * @pro_rlc: Programmatic Reset Lock Count * @tcg_ec: TCG Error Count - * @rsvd3: Reserved3 + * @no_of_ns_prov_locking_obj_ext: Number of Namespace Provisioned Locking Objects Extended + * @rsvd38: Reserved * @log_page_version: Log Page Version */ struct __packed tcg_configuration_log { @@ -230,15 +235,43 @@ struct __packed tcg_configuration_log { __u8 no_of_write_lock_locking_obj; __u8 no_of_read_unlock_locking_obj; __u8 no_of_write_unlock_locking_obj; - __u8 rsvd2; + __u8 rsvd15; __le32 sid_auth_try_count; __le32 sid_auth_try_limit; __le32 pro_tcg_rc; __le32 pro_rlc; __le32 tcg_ec; - __u8 rsvd3[458]; + __le16 no_of_ns_prov_locking_obj_ext; + __u8 rsvd38[456]; __le16 log_page_version; __u8 log_page_guid[GUID_LEN]; }; + +enum ocp_dssd_log_id { + OCP_LID_SMART = 0xc0, /* SMART / Helth Information Extended */ + OCP_LID_EREC, /* Error Recovery */ + OCP_LID_FAHL_OBSOLETE, /* Firmware Activation History (Obsolete) */ + OCP_LID_LMLOG, /* Latency Monitor */ + OCP_LID_DCLP, /* Device Capabilities */ + OCP_LID_URLP, /* Unsupported Requirements */ + OCP_LID_HWCOMP, /* Hardware Component */ + OCP_LID_TCGL, /* TCG Configuration */ + OCP_LID_RESERVED, /* Reserved for future use */ + OCP_LID_TELSLG, /* Telemetry String */ + OCP_LID_LMLOG_DEBUG, /* Latency Monitor Debug Telemetry */ +}; + +enum ocp_dssd_feature_id { + OCP_FID_ERRI = 0xc0, /* Error Injection */ + OCP_FID_CFUH, /* Clear Firmware Update History (Obsolete) */ + OCP_FID_ROWTM, /* EOL/PLP Failure Mode */ + OCP_FID_CPCIE, /* Clear PCIe Correctable Error Counters */ + OCP_FID_1667, /* Enable IEEE1667 Silo */ + OCP_FID_LM, /* Latency Monitor */ + OCP_FID_PLPI, /* PLP Health Check Interval */ + OCP_FID_DSSDPS, /* DSSD Power State */ + OCP_FID_TEL_CFG, /* Telemetry Profile */ + OCP_FID_DAEC, /* DSSD Asynchronous Event Configuration */ +}; #endif /* OCP_NVME_H */ diff --git a/plugins/ocp/ocp-print-binary.c b/plugins/ocp/ocp-print-binary.c index 64e1246..c966b47 100644 --- a/plugins/ocp/ocp-print-binary.c +++ b/plugins/ocp/ocp-print-binary.c @@ -7,9 +7,12 @@ static void binary_hwcomp_log(struct hwcomp_log *log, __u32 id, bool list) { - long double desc_len = uint128_t_to_double(le128_to_cpu(log->size)) * sizeof(__le32); + long double log_bytes = uint128_t_to_double(le128_to_cpu(log->size)); - d_raw((unsigned char *)log, offsetof(struct hwcomp_log, desc) + desc_len); + if (log->ver == 1) + log_bytes *= sizeof(__le32); + + d_raw((unsigned char *)log, log_bytes); } static void binary_c5_log(struct nvme_dev *dev, struct unsupported_requirement_log *log_data) diff --git a/plugins/ocp/ocp-print-json.c b/plugins/ocp/ocp-print-json.c index a600628..e3ce2da 100644 --- a/plugins/ocp/ocp-print-json.c +++ b/plugins/ocp/ocp-print-json.c @@ -11,15 +11,16 @@ 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); + json_object_add_value_string(r, "Description", + hwcomp_id_to_string(le32_to_cpu(e->desc->id))); + json_object_add_nprix64(r, "Date/Lot Size", e->date_lot_size); + json_object_add_nprix64(r, "Additional Information Size", e->add_info_size); + json_object_add_uint_0nx(r, "Identifier", le32_to_cpu(e->desc->id), 8); + json_object_add_0nprix64(r, "Manufacture", le64_to_cpu(e->desc->mfg), 16); + json_object_add_0nprix64(r, "Revision", le64_to_cpu(e->desc->rev), 16); + json_object_add_0nprix64(r, "Manufacture Code", le64_to_cpu(e->desc->mfg_code), 16); + json_object_add_byte_array(r, "Date/Lot Code", e->date_lot_code, e->date_lot_size); + json_object_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, @@ -31,7 +32,8 @@ static void print_hwcomp_desc_list_json(struct json_object *r, struct hwcomp_des return; if (list) { - obj_add_str(r, k, hwcomp_id_to_string(le32_to_cpu(e->desc->id))); + json_object_add_value_string(r, k, + hwcomp_id_to_string(le32_to_cpu(e->desc->id))); return; } @@ -63,17 +65,19 @@ static void print_hwcomp_descs_json(struct hwcomp_desc *desc, long double log_si static void json_hwcomp_log(struct hwcomp_log *log, __u32 id, bool list) { + long double log_bytes = uint128_t_to_double(le128_to_cpu(log->size)); struct json_object *r = json_create_object(); - long double log_size = uint128_t_to_double(le128_to_cpu(log->size)) * sizeof(__le32); + if (log->ver == 1) + log_bytes *= 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, + json_object_add_uint_02x(r, "Log Identifier", OCP_LID_HWCOMP); + json_object_add_uint_0x(r, "Log Page Version", le16_to_cpu(log->ver)); + json_object_add_byte_array(r, "Reserved2", log->rsvd2, ARRAY_SIZE(log->rsvd2)); + json_object_add_byte_array(r, "Log page GUID", log->guid, ARRAY_SIZE(log->guid)); + json_object_add_nprix64(r, "Hardware Component Log Size", (unsigned long long)log_bytes); + json_object_add_byte_array(r, "Reserved48", log->rsvd48, ARRAY_SIZE(log->rsvd48)); + print_hwcomp_descs_json(log->desc, log_bytes - offsetof(struct hwcomp_log, desc), id, list, obj_create_array_obj(r, "Component Descriptions")); json_print(r); @@ -97,7 +101,7 @@ static void json_fw_activation_history(const struct fw_activation_history *fw_hi json_object_add_value_uint(entry_obj, "activation count", le16_to_cpu(entry->activation_count)); json_object_add_value_uint64(entry_obj, "timestamp", - (0x0000FFFFFFFFFFFF & le64_to_cpu(entry->timestamp))); + int48_to_long(entry->ts.timestamp)); json_object_add_value_uint(entry_obj, "power cycle count", le64_to_cpu(entry->power_cycle_count)); @@ -134,85 +138,88 @@ static void json_fw_activation_history(const struct fw_activation_history *fw_hi printf("\n"); } -static void json_smart_extended_log(void *data) +static void json_smart_extended_log_v1(struct ocp_smart_extended_log *log) { struct json_object *root; struct json_object *pmuw; struct json_object *pmur; uint16_t smart_log_ver = 0; - __u8 *log_data = data; + uint16_t dssd_version = 0; + int i = 0; char guid[40]; + char ascii_arr[65]; + char *ascii = ascii_arr; root = json_create_object(); pmuw = json_create_object(); pmur = json_create_object(); json_object_add_value_uint64(pmuw, "hi", - (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_PMUW + 8] & 0xFFFFFFFFFFFFFFFF)); + le64_to_cpu(*(uint64_t *)&log->physical_media_units_written[8])); json_object_add_value_uint64(pmuw, "lo", - (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_PMUW] & 0xFFFFFFFFFFFFFFFF)); + le64_to_cpu(*(uint64_t *)&log->physical_media_units_written)); json_object_add_value_object(root, "Physical media units written", pmuw); json_object_add_value_uint64(pmur, "hi", - (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_PMUR + 8] & 0xFFFFFFFFFFFFFFFF)); + le64_to_cpu(*(uint64_t *)&log->physical_media_units_read[8])); json_object_add_value_uint64(pmur, "lo", - (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_PMUR] & 0xFFFFFFFFFFFFFFFF)); + le64_to_cpu(*(uint64_t *)&log->physical_media_units_read)); json_object_add_value_object(root, "Physical media units read", pmur); json_object_add_value_uint64(root, "Bad user nand blocks - Raw", - (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_BUNBR] & 0x0000FFFFFFFFFFFF)); + int48_to_long(log->bad_user_nand_blocks_raw)); json_object_add_value_uint(root, "Bad user nand blocks - Normalized", - (uint16_t)le16_to_cpu(*(uint16_t *)&log_data[SCAO_BUNBN])); + le16_to_cpu(log->bad_user_nand_blocks_normalized)); json_object_add_value_uint64(root, "Bad system nand blocks - Raw", - (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_BSNBR] & 0x0000FFFFFFFFFFFF)); + int48_to_long(log->bad_system_nand_blocks_raw)); json_object_add_value_uint(root, "Bad system nand blocks - Normalized", - (uint16_t)le16_to_cpu(*(uint16_t *)&log_data[SCAO_BSNBN])); + le16_to_cpu(log->bad_system_nand_blocks_normalized)); json_object_add_value_uint64(root, "XOR recovery count", - (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_XRC])); + le64_to_cpu(log->xor_recovery_count)); json_object_add_value_uint64(root, "Uncorrectable read error count", - (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_UREC])); + le64_to_cpu(log->uncorrectable_read_err_count)); json_object_add_value_uint64(root, "Soft ecc error count", - (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_SEEC])); + le64_to_cpu(log->soft_ecc_err_count)); json_object_add_value_uint(root, "End to end detected errors", - (uint32_t)le32_to_cpu(*(uint32_t *)&log_data[SCAO_EEDC])); + le32_to_cpu(log->end_to_end_detected_err)); json_object_add_value_uint(root, "End to end corrected errors", - (uint32_t)le32_to_cpu(*(uint32_t *)&log_data[SCAO_EECE])); + le32_to_cpu(log->end_to_end_corrected_err)); json_object_add_value_uint(root, "System data percent used", - (__u8)log_data[SCAO_SDPU]); + log->system_data_used_percent); json_object_add_value_uint64(root, "Refresh counts", - (uint64_t)(le64_to_cpu(*(uint64_t *)&log_data[SCAO_RFSC]) & 0x00FFFFFFFFFFFFFF)); + int56_to_long(log->refresh_counts)); json_object_add_value_uint(root, "Max User data erase counts", - (uint32_t)le32_to_cpu(*(uint32_t *)&log_data[SCAO_MXUDEC])); + le32_to_cpu(log->user_data_erase_count_max)); json_object_add_value_uint(root, "Min User data erase counts", - (uint32_t)le32_to_cpu(*(uint32_t *)&log_data[SCAO_MNUDEC])); + le32_to_cpu(log->user_data_erase_count_min)); json_object_add_value_uint(root, "Number of Thermal throttling events", - (__u8)log_data[SCAO_NTTE]); + log->thermal_throttling_event_count); json_object_add_value_uint(root, "Current throttling status", - (__u8)log_data[SCAO_CTS]); + log->thermal_throttling_current_status); json_object_add_value_uint64(root, "PCIe correctable error count", - (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_PCEC])); + le64_to_cpu(log->pcie_correctable_err_count)); json_object_add_value_uint(root, "Incomplete shutdowns", - (uint32_t)le32_to_cpu(*(uint32_t *)&log_data[SCAO_ICS])); + le32_to_cpu(log->incomplete_shoutdowns)); json_object_add_value_uint(root, "Percent free blocks", - (__u8)log_data[SCAO_PFB]); + log->percent_free_blocks); json_object_add_value_uint(root, "Capacitor health", - (uint16_t)le16_to_cpu(*(uint16_t *)&log_data[SCAO_CPH])); + le16_to_cpu(log->capacitor_health)); json_object_add_value_uint64(root, "Unaligned I/O", - (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_UIO])); + le64_to_cpu(log->unaligned_io)); json_object_add_value_uint64(root, "Security Version Number", - (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_SVN])); + le64_to_cpu(log->security_version)); json_object_add_value_uint64(root, "NUSE - Namespace utilization", - (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_NUSE])); + le64_to_cpu(log->total_nuse)); json_object_add_value_uint128(root, "PLP start count", - le128_to_cpu(&log_data[SCAO_PSC])); + le128_to_cpu(log->plp_start_count)); 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]); + le128_to_cpu(log->endurance_estimate)); + smart_log_ver = le16_to_cpu(log->log_page_version); json_object_add_value_uint(root, "Log page version", smart_log_ver); 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])); + le64_to_cpu(*(uint64_t *)&log->log_page_guid[8]), + le64_to_cpu(*(uint64_t *)&log->log_page_guid)); json_object_add_value_string(root, "Log page GUID", guid); switch (smart_log_ver) { @@ -221,31 +228,251 @@ static void json_smart_extended_log(void *data) default: case 4: json_object_add_value_uint(root, "NVMe Command Set Errata Version", - (__u8)log_data[SCAO_NCSEV]); + log->nvme_cmdset_errata_version); json_object_add_value_uint(root, "Lowest Permitted Firmware Revision", - le64_to_cpu(*(uint64_t *)&log_data[SCAO_PSCC])); + le64_to_cpu(log->lowest_permitted_fw_rev)); + json_object_add_value_uint(root, "NVMe Over Pcie Errata Version", + log->nvme_over_pcie_errate_version); + json_object_add_value_uint(root, "NVMe Mi Errata Version", + log->nvme_mi_errata_version); + json_object_add_value_uint(root, "Total media dies", + le16_to_cpu(log->total_media_dies)); + json_object_add_value_uint(root, "Total die failure tolerance", + le16_to_cpu(log->total_die_failure_tolerance)); + json_object_add_value_uint(root, "Media dies offline", + le16_to_cpu(log->media_dies_offline)); + json_object_add_value_uint(root, "Max temperature recorded", + log->max_temperature_recorded); + json_object_add_value_uint64(root, "Nand avg erase count", + le64_to_cpu(log->nand_avg_erase_count)); + json_object_add_value_uint(root, "Command timeouts", + le32_to_cpu(log->command_timeouts)); + json_object_add_value_uint(root, "Sys area program fail count raw", + le32_to_cpu(log->sys_area_program_fail_count_raw)); + json_object_add_value_uint(root, "Sys area program fail count noralized", + log->sys_area_program_fail_count_normalized); + json_object_add_value_uint(root, "Sys area uncorrectable read count raw", + le32_to_cpu(log->sys_area_uncorr_read_count_raw)); + json_object_add_value_uint(root, "Sys area uncorrectable read count noralized", + log->sys_area_uncorr_read_count_normalized); + json_object_add_value_uint(root, "Sys area erase fail count raw", + le32_to_cpu(log->sys_area_erase_fail_count_raw)); + json_object_add_value_uint(root, "Sys area erase fail count noralized", + log->sys_area_erase_fail_count_normalized); + json_object_add_value_uint(root, "Max peak power capability", + le16_to_cpu(log->max_peak_power_capability)); + json_object_add_value_uint(root, "Current max avg power", + le16_to_cpu(log->current_max_avg_power)); + json_object_add_value_uint64(root, "Lifetime power consumed", + int48_to_long(log->lifetime_power_consumed)); + memset((void *)ascii, 0, 65); + for (i = 0; i < 8; i++) + ascii += sprintf(ascii, "%c", log->dssd_firmware_revision[i]); + json_object_add_value_string(root, "Dssd firmware revision", ascii_arr); + json_object_add_value_string(root, "Dssd firmware build UUID", + util_uuid_to_string(log->dssd_firmware_build_uuid)); + ascii = ascii_arr; + memset((void *)ascii, 0, 65); + for (i = 0; i < 64; i++) + ascii += sprintf(ascii, "%c", log->dssd_firmware_build_label[i]); + json_object_add_value_string(root, "Dssd firmware build label", ascii_arr); fallthrough; case 2 ... 3: json_object_add_value_uint(root, "Errata Version Field", - (__u8)log_data[SCAO_EVF]); + log->dssd_errata_version); + memcpy(&dssd_version, log->dssd_point_version, sizeof(dssd_version)); json_object_add_value_uint(root, "Point Version Field", - le16_to_cpu(*(uint16_t *)&log_data[SCAO_PVF])); + le16_to_cpu(dssd_version)); + memcpy(&dssd_version, log->dssd_minor_version, sizeof(dssd_version)); json_object_add_value_uint(root, "Minor Version Field", - le16_to_cpu(*(uint16_t *)&log_data[SCAO_MIVF])); + le16_to_cpu(dssd_version)); json_object_add_value_uint(root, "Major Version Field", - (__u8)log_data[SCAO_MAVF]); + log->dssd_major_version); json_object_add_value_uint(root, "NVMe Base Errata Version", - (__u8)log_data[SCAO_NBEV]); + log->nvme_base_errata_version); json_object_add_value_uint(root, "PCIe Link Retraining Count", - le64_to_cpu(*(uint64_t *)&log_data[SCAO_PLRC])); + le64_to_cpu(log->pcie_link_retaining_count)); json_object_add_value_uint(root, "Power State Change Count", - le64_to_cpu(*(uint64_t *)&log_data[SCAO_PSCC])); + le64_to_cpu(log->power_state_change_count)); } json_print_object(root, NULL); printf("\n"); json_free_object(root); } +static void json_smart_extended_log_v2(struct ocp_smart_extended_log *log) +{ + struct json_object *root; + struct json_object *pmuw; + struct json_object *pmur; + int i = 0; + uint16_t smart_log_ver = 0; + uint16_t dssd_version = 0; + char guid[40]; + char ascii_arr[65]; + char *ascii = ascii_arr; + + root = json_create_object(); + pmuw = json_create_object(); + pmur = json_create_object(); + + json_object_add_value_uint64(pmuw, "hi", + le64_to_cpu(*(uint64_t *)&log->physical_media_units_written[8])); + json_object_add_value_uint64(pmuw, "lo", + le64_to_cpu(*(uint64_t *)&log->physical_media_units_written)); + json_object_add_value_object(root, "physical_media_units_written", pmuw); + json_object_add_value_uint64(pmur, "hi", + le64_to_cpu(*(uint64_t *)&log->physical_media_units_read[8])); + json_object_add_value_uint64(pmur, "lo", + le64_to_cpu(*(uint64_t *)&log->physical_media_units_read)); + json_object_add_value_object(root, "physical_media_units_read", pmur); + json_object_add_value_uint64(root, "bad_user_nand_blocks_raw", + int48_to_long(log->bad_user_nand_blocks_raw)); + json_object_add_value_uint(root, "bad_user_nand_blocks_normalized", + le16_to_cpu(log->bad_user_nand_blocks_normalized)); + json_object_add_value_uint64(root, "bad_system_nand_blocks_raw", + int48_to_long(log->bad_system_nand_blocks_raw)); + json_object_add_value_uint(root, "bad_system_nand_blocks_normalized", + le16_to_cpu(log->bad_system_nand_blocks_normalized)); + json_object_add_value_uint64(root, "xor_recovery_count", + le64_to_cpu(log->xor_recovery_count)); + json_object_add_value_uint64(root, "uncorrectable_read_errors", + le64_to_cpu(log->uncorrectable_read_err_count)); + json_object_add_value_uint64(root, "soft_ecc_error_count", + le64_to_cpu(log->soft_ecc_err_count)); + json_object_add_value_uint(root, "end_to_end_detected_errors", + le32_to_cpu(log->end_to_end_detected_err)); + json_object_add_value_uint(root, "end_to_end_corrected_errors", + le32_to_cpu(log->end_to_end_corrected_err)); + json_object_add_value_uint(root, "system_data_percent_used", + log->system_data_used_percent); + json_object_add_value_uint64(root, "refresh_count", + int56_to_long(log->refresh_counts)); + json_object_add_value_uint(root, "max_user_data_erase_count", + le32_to_cpu(log->user_data_erase_count_max)); + json_object_add_value_uint(root, "min_user_data_erase_count", + le32_to_cpu(log->user_data_erase_count_min)); + json_object_add_value_uint(root, "thermal_throttling_events", + log->thermal_throttling_event_count); + json_object_add_value_uint(root, "current_throttling_status", + log->thermal_throttling_current_status); + json_object_add_value_uint64(root, "pcie_correctable_errors", + le64_to_cpu(log->pcie_correctable_err_count)); + json_object_add_value_uint(root, "incomplete_shutdowns", + le32_to_cpu(log->incomplete_shoutdowns)); + json_object_add_value_uint(root, "percent_free_blocks", + log->percent_free_blocks); + json_object_add_value_uint(root, "capacitor_health", + le16_to_cpu(log->capacitor_health)); + json_object_add_value_uint64(root, "unaligned_io", + le64_to_cpu(log->unaligned_io)); + json_object_add_value_uint64(root, "security_version_number", + le64_to_cpu(log->security_version)); + json_object_add_value_uint64(root, "nuse_namespace_utilization", + le64_to_cpu(log->total_nuse)); + json_object_add_value_uint128(root, "plp_start_count", + le128_to_cpu(log->plp_start_count)); + json_object_add_value_uint128(root, "endurance_estimate", + le128_to_cpu(log->endurance_estimate)); + smart_log_ver = le16_to_cpu(log->log_page_version); + + json_object_add_value_uint(root, "log_page_version", smart_log_ver); + + memset((void *)guid, 0, 40); + sprintf((char *)guid, "0x%"PRIx64"%"PRIx64"", + le64_to_cpu(*(uint64_t *)&log->log_page_guid[8]), + le64_to_cpu(*(uint64_t *)&log->log_page_guid)); + json_object_add_value_string(root, "log_page_guid", guid); + + switch (smart_log_ver) { + case 0 ... 1: + break; + default: + case 4: + json_object_add_value_uint(root, "nvme_command_set_errata_version", + log->nvme_cmdset_errata_version); + json_object_add_value_uint(root, "lowest_permitted_firmware_revision", + le64_to_cpu(log->lowest_permitted_fw_rev)); + json_object_add_value_uint(root, "nvme_over_pcie_errata_version", + log->nvme_over_pcie_errate_version); + json_object_add_value_uint(root, "nvme_mi_errata_version", + log->nvme_mi_errata_version); + json_object_add_value_uint(root, "total_media_dies", + le16_to_cpu(log->total_media_dies)); + json_object_add_value_uint(root, "total_die_failure_tolerance", + le16_to_cpu(log->total_die_failure_tolerance)); + json_object_add_value_uint(root, "media_dies_offline", + le16_to_cpu(log->media_dies_offline)); + json_object_add_value_uint(root, "max_temperature_recorded", + log->max_temperature_recorded); + json_object_add_value_uint64(root, "nand_avg_erase_count", + le64_to_cpu(log->nand_avg_erase_count)); + json_object_add_value_uint(root, "command_timeouts", + le32_to_cpu(log->command_timeouts)); + json_object_add_value_uint(root, "sys_area_program_fail_count_raw", + le32_to_cpu(log->sys_area_program_fail_count_raw)); + json_object_add_value_uint(root, "sys_area_program_fail_count_noralized", + log->sys_area_program_fail_count_normalized); + json_object_add_value_uint(root, "sys_area_uncorrectable_read_count_raw", + le32_to_cpu(log->sys_area_uncorr_read_count_raw)); + json_object_add_value_uint(root, "sys_area_uncorrectable_read_count_noralized", + log->sys_area_uncorr_read_count_normalized); + json_object_add_value_uint(root, "sys_area_erase_fail_count_raw", + le32_to_cpu(log->sys_area_erase_fail_count_raw)); + json_object_add_value_uint(root, "sys_area_erase_fail_count_noralized", + log->sys_area_erase_fail_count_normalized); + json_object_add_value_uint(root, "max_peak_power_capability", + le16_to_cpu(log->max_peak_power_capability)); + json_object_add_value_uint(root, "current_max_avg_power", + le16_to_cpu(log->current_max_avg_power)); + json_object_add_value_uint64(root, "lifetime_power_consumed", + int48_to_long(log->lifetime_power_consumed)); + memset((void *)ascii, 0, 65); + for (i = 0; i < 8; i++) + ascii += sprintf(ascii, "%c", log->dssd_firmware_revision[i]); + json_object_add_value_string(root, "dssd_firmware_revision", ascii_arr); + json_object_add_value_string(root, "dssd_firmware_build_uuid", + util_uuid_to_string(log->dssd_firmware_build_uuid)); + ascii = ascii_arr; + memset((void *)ascii, 0, 65); + for (i = 0; i < 64; i++) + ascii += sprintf(ascii, "%c", log->dssd_firmware_build_label[i]); + json_object_add_value_string(root, "dssd_firmware_build_label", ascii_arr); + fallthrough; + case 2 ... 3: + json_object_add_value_uint(root, "errata_version_field", + log->dssd_errata_version); + memcpy(&dssd_version, log->dssd_point_version, sizeof(dssd_version)); + json_object_add_value_uint(root, "point_version_field", + le16_to_cpu(dssd_version)); + memcpy(&dssd_version, log->dssd_minor_version, sizeof(dssd_version)); + json_object_add_value_uint(root, "minor_version_field", + le16_to_cpu(dssd_version)); + json_object_add_value_uint(root, "major_version_field", + log->dssd_major_version); + json_object_add_value_uint(root, "nvme_base_errata_version", + log->nvme_base_errata_version); + json_object_add_value_uint(root, "pcie_link_retraining_count", + le64_to_cpu(log->pcie_link_retaining_count)); + json_object_add_value_uint(root, "power_state_change_count", + le64_to_cpu(log->power_state_change_count)); + } + json_print_object(root, NULL); + printf("\n"); + json_free_object(root); +} + +static void json_smart_extended_log(struct ocp_smart_extended_log *log, unsigned int version) +{ + switch (version) { + default: + case 1: + json_smart_extended_log_v1(log); + break; + case 2: + json_smart_extended_log_v2(log); + } +} static void json_telemetry_log(struct ocp_telemetry_parse_options *options) { print_ocp_telemetry_json(options); @@ -258,6 +485,7 @@ static void json_c3_log(struct nvme_dev *dev, struct ssd_latency_monitor_log *lo char buf[128]; int i, j; char *operation[3] = {"Trim", "Write", "Read"}; + __u16 log_page_version = le16_to_cpu(log_data->log_page_version); root = json_create_object(); @@ -374,6 +602,21 @@ static void json_c3_log(struct nvme_dev *dev, struct ssd_latency_monitor_log *lo json_object_add_value_uint(root, "Static Latency Stamp Units", le16_to_cpu(log_data->static_latency_stamp_units)); + + if (log_page_version >= 0x4) { + strcpy(buf, "0x"); + for (i = ARRAY_SIZE(log_data->latency_monitor_debug_log_size) - 1; + i > 0 && (log_data->latency_monitor_debug_log_size[i] == 0); i--) + ; + while (i >= 0) { + char hex_string[3]; + + sprintf(hex_string, "%02x", log_data->latency_monitor_debug_log_size[i--]); + strcat(buf, hex_string); + } + json_object_add_value_string(root, "Debug Telemetry Log Size", buf); + } + json_object_add_value_uint(root, "Debug Log Trigger Enable", le16_to_cpu(log_data->debug_log_trigger_enable)); json_object_add_value_uint(root, "Debug Log Measured Latency", @@ -390,8 +633,7 @@ static void json_c3_log(struct nvme_dev *dev, struct ssd_latency_monitor_log *lo le16_to_cpu(log_data->debug_log_counter_trigger)); json_object_add_value_uint(root, "Debug Log Stamp Units", le16_to_cpu(log_data->debug_log_stamp_units)); - json_object_add_value_uint(root, "Log Page Version", - le16_to_cpu(log_data->log_page_version)); + json_object_add_value_uint(root, "Log Page Version", log_page_version); char guid[(GUID_LEN * 2) + 1]; char *ptr = &guid[0]; @@ -552,7 +794,7 @@ static void json_c9_log(struct telemetry_str_log_format *log_data, __u8 *log_dat json_object_add_value_int(root, "Log Page Version", le16_to_cpu(log_data->log_page_version)); - memset((__u8 *)res, 0, 15); + memset((__u8 *)res, 0, 48); for (j = 0; j < 15; j++) res += sprintf(res, "%d", log_data->reserved1[j]); json_object_add_value_string(root, "Reserved", res_arr); @@ -564,7 +806,8 @@ static void json_c9_log(struct telemetry_str_log_format *log_data, __u8 *log_dat json_object_add_value_int(root, "Telemetry String Log Size", le64_to_cpu(log_data->sls)); - memset((__u8 *)res, 0, 24); + res = res_arr; + memset((__u8 *)res, 0, 48); for (j = 0; j < 24; j++) res += sprintf(res, "%d", log_data->reserved2[j]); json_object_add_value_string(root, "Reserved", res_arr); @@ -587,81 +830,97 @@ static void json_c9_log(struct telemetry_str_log_format *log_data, __u8 *log_dat fifo += sprintf(fifo, "%c", log_data->fifo1[j]); json_object_add_value_string(root, "FIFO 1 ASCII String", fifo_arr); + fifo = fifo_arr; memset((void *)fifo, 0, 16); for (j = 0; j < 16; j++) fifo += sprintf(fifo, "%c", log_data->fifo2[j]); json_object_add_value_string(root, "FIFO 2 ASCII String", fifo_arr); + fifo = fifo_arr; memset((void *)fifo, 0, 16); for (j = 0; j < 16; j++) fifo += sprintf(fifo, "%c", log_data->fifo3[j]); json_object_add_value_string(root, "FIFO 3 ASCII String", fifo_arr); + fifo = fifo_arr; memset((void *)fifo, 0, 16); for (j = 0; j < 16; j++) fifo += sprintf(fifo, "%c", log_data->fifo4[j]); json_object_add_value_string(root, "FIFO 4 ASCII String", fifo_arr); + fifo = fifo_arr; memset((void *)fifo, 0, 16); for (j = 0; j < 16; j++) fifo += sprintf(fifo, "%c", log_data->fifo5[j]); json_object_add_value_string(root, "FIFO 5 ASCII String", fifo_arr); + fifo = fifo_arr; memset((void *)fifo, 0, 16); for (j = 0; j < 16; j++) fifo += sprintf(fifo, "%c", log_data->fifo6[j]); json_object_add_value_string(root, "FIFO 6 ASCII String", fifo_arr); + fifo = fifo_arr; memset((void *)fifo, 0, 16); for (j = 0; j < 16; j++) fifo += sprintf(fifo, "%c", log_data->fifo7[j]); json_object_add_value_string(root, "FIFO 7 ASCII String", fifo_arr); + fifo = fifo_arr; memset((void *)fifo, 0, 16); for (j = 0; j < 16; j++) fifo += sprintf(fifo, "%c", log_data->fifo8[j]); json_object_add_value_string(root, "FIFO 8 ASCII String", fifo_arr); + fifo = fifo_arr; memset((void *)fifo, 0, 16); for (j = 0; j < 16; j++) fifo += sprintf(fifo, "%c", log_data->fifo9[j]); json_object_add_value_string(root, "FIFO 9 ASCII String", fifo_arr); + fifo = fifo_arr; memset((void *)fifo, 0, 16); for (j = 0; j < 16; j++) fifo += sprintf(fifo, "%c", log_data->fifo10[j]); json_object_add_value_string(root, "FIFO 10 ASCII String", fifo_arr); + fifo = fifo_arr; memset((void *)fifo, 0, 16); for (j = 0; j < 16; j++) fifo += sprintf(fifo, "%c", log_data->fifo11[j]); json_object_add_value_string(root, "FIFO 11 ASCII String", fifo_arr); + fifo = fifo_arr; memset((void *)fifo, 0, 16); for (j = 0; j < 16; j++) fifo += sprintf(fifo, "%c", log_data->fifo12[j]); json_object_add_value_string(root, "FIFO 12 ASCII String", fifo_arr); + fifo = fifo_arr; memset((void *)fifo, 0, 16); for (j = 0; j < 16; j++) fifo += sprintf(fifo, "%c", log_data->fifo13[j]); json_object_add_value_string(root, "FIFO 13 ASCII String", fifo_arr); + fifo = fifo_arr; memset((void *)fifo, 0, 16); for (j = 0; j < 16; j++) fifo += sprintf(fifo, "%c", log_data->fifo14[j]); json_object_add_value_string(root, "FIFO 14 ASCII String", fifo_arr); + fifo = fifo_arr; memset((void *)fifo, 0, 16); for (j = 0; j < 16; j++) fifo += sprintf(fifo, "%c", log_data->fifo15[j]); json_object_add_value_string(root, "FIFO 15 ASCII String", fifo_arr); + fifo = fifo_arr; memset((void *)fifo, 0, 16); for (j = 0; j < 16; j++) fifo += sprintf(fifo, "%c", log_data->fifo16[j]); json_object_add_value_string(root, "FIFO 16 ASCII String", fifo_arr); + res = res_arr; memset((__u8 *)res, 0, 48); for (j = 0; j < 48; j++) res += sprintf(res, "%d", log_data->reserved3[j]); @@ -772,6 +1031,7 @@ static void json_c7_log(struct nvme_dev *dev, struct tcg_configuration_log *log_ char *guid = guid_buf; char res_arr[458]; char *res = res_arr; + __u16 log_page_version = le16_to_cpu(log_data->log_page_version); root = json_create_object(); @@ -800,7 +1060,7 @@ static void json_c7_log(struct nvme_dev *dev, struct tcg_configuration_log *log_ log_data->no_of_read_unlock_locking_obj); json_object_add_value_int(root, "Number of Write Unlocked Locking Objects", log_data->no_of_write_unlock_locking_obj); - json_object_add_value_int(root, "Reserved2", log_data->rsvd2); + json_object_add_value_int(root, "Reserved2", log_data->rsvd15); json_object_add_value_int(root, "SID Authentication Try Count", le32_to_cpu(log_data->sid_auth_try_count)); @@ -813,12 +1073,20 @@ static void json_c7_log(struct nvme_dev *dev, struct tcg_configuration_log *log_ json_object_add_value_int(root, "TCG Error Count", le32_to_cpu(log_data->tcg_ec)); memset((__u8 *)res, 0, 458); - for (j = 0; j < 458; j++) - res += sprintf(res, "%d", log_data->rsvd3[j]); + if (log_page_version == 1) { + res += sprintf(res, "%d%d", *(__u8 *)&log_data->no_of_ns_prov_locking_obj_ext, + *((__u8 *)&log_data->no_of_ns_prov_locking_obj_ext + 1)); + } else { + json_object_add_value_int(root, + "Number of Namespace Provisioned Locking Objects Extended", + log_data->no_of_ns_prov_locking_obj_ext); + } + + for (j = 0; j < 456; j++) + res += sprintf(res, "%d", log_data->rsvd38[j]); json_object_add_value_string(root, "Reserved3", res_arr); - json_object_add_value_int(root, "Log Page Version", - le16_to_cpu(log_data->log_page_version)); + json_object_add_value_int(root, "Log Page Version", log_page_version); memset((void *)guid, 0, GUID_LEN); for (j = GUID_LEN - 1; j >= 0; j--) diff --git a/plugins/ocp/ocp-print-stdout.c b/plugins/ocp/ocp-print-stdout.c index e48c171..5e13587 100644 --- a/plugins/ocp/ocp-print-stdout.c +++ b/plugins/ocp/ocp-print-stdout.c @@ -30,18 +30,21 @@ static void stdout_hwcomp_log(struct hwcomp_log *log, __u32 id, bool list) { size_t date_lot_code_offset = sizeof(struct hwcomp_desc); int num = 1; + long double log_bytes = uint128_t_to_double(le128_to_cpu(log->size)); struct hwcomp_desc_entry e = { log->desc }; - long double log_size = uint128_t_to_double(le128_to_cpu(log->size)) * sizeof(__le32); + if (log->ver == 1) + log_bytes *= sizeof(__le32); - printf("Log Identifier: 0x%02xh\n", LID_HWCOMP); + printf("Log Identifier: 0x%02xh\n", OCP_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); + printf("Hardware Component Log Size: 0x%"PRIx64"\n", (uint64_t)log_bytes); print_array("Reserved48", log->rsvd48, ARRAY_SIZE(log->rsvd48)); printf("Component Descriptions\n"); - while (log_size > 0) { + log_bytes -= offsetof(struct hwcomp_log, desc); + while (log_bytes > 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); @@ -51,7 +54,7 @@ static void stdout_hwcomp_log(struct hwcomp_log *log, __u32 id, bool list) 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; + log_bytes -= e.desc_size; } } @@ -72,8 +75,7 @@ static void stdout_fw_activation_history(const struct fw_activation_history *fw_ printf(" %-22s%d\n", "entry length:", entry->entry_length); printf(" %-22s%d\n", "activation count:", le16_to_cpu(entry->activation_count)); - printf(" %-22s%"PRIu64"\n", "timestamp:", - (0x0000FFFFFFFFFFFF & le64_to_cpu(entry->timestamp))); + printf(" %-22s%"PRIu64"\n", "timestamp:", int48_to_long(entry->ts.timestamp)); printf(" %-22s%"PRIu64"\n", "power cycle count:", le64_to_cpu(entry->power_cycle_count)); printf(" %-22s%.*s\n", "previous firmware:", (int)sizeof(entry->previous_fw), @@ -95,101 +97,144 @@ static void stdout_fw_activation_history(const struct fw_activation_history *fw_ printf("\n"); } -static void stdout_smart_extended_log(void *data) +static void stdout_smart_extended_log(struct ocp_smart_extended_log *log, unsigned int version) { uint16_t smart_log_ver = 0; - __u8 *log_data = data; + uint16_t dssd_version = 0; + int i = 0; printf("SMART Cloud Attributes :-\n"); printf(" Physical media units written - %"PRIu64" %"PRIu64"\n", - (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_PMUW + 8] & 0xFFFFFFFFFFFFFFFF), - (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_PMUW] & 0xFFFFFFFFFFFFFFFF)); + le64_to_cpu(*(uint64_t *)&log->physical_media_units_written[8]), + le64_to_cpu(*(uint64_t *)&log->physical_media_units_written)); printf(" Physical media units read - %"PRIu64" %"PRIu64"\n", - (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_PMUR + 8] & 0xFFFFFFFFFFFFFFFF), - (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_PMUR] & 0xFFFFFFFFFFFFFFFF)); + le64_to_cpu(*(uint64_t *)&log->physical_media_units_read[8]), + le64_to_cpu(*(uint64_t *)&log->physical_media_units_read)); printf(" Bad user nand blocks - Raw %"PRIu64"\n", - (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_BUNBR] & 0x0000FFFFFFFFFFFF)); + int48_to_long(log->bad_user_nand_blocks_raw)); printf(" Bad user nand blocks - Normalized %d\n", - (uint16_t)le16_to_cpu(*(uint16_t *)&log_data[SCAO_BUNBN])); + le16_to_cpu(log->bad_user_nand_blocks_normalized)); printf(" Bad system nand blocks - Raw %"PRIu64"\n", - (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_BSNBR] & 0x0000FFFFFFFFFFFF)); + int48_to_long(log->bad_system_nand_blocks_raw)); printf(" Bad system nand blocks - Normalized %d\n", - (uint16_t)le16_to_cpu(*(uint16_t *)&log_data[SCAO_BSNBN])); + le16_to_cpu(log->bad_system_nand_blocks_normalized)); printf(" XOR recovery count %"PRIu64"\n", - (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_XRC])); + le64_to_cpu(log->xor_recovery_count)); printf(" Uncorrectable read error count %"PRIu64"\n", - (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_UREC])); + le64_to_cpu(log->uncorrectable_read_err_count)); printf(" Soft ecc error count %"PRIu64"\n", - (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_SEEC])); + le64_to_cpu(log->soft_ecc_err_count)); printf(" End to end detected errors %"PRIu32"\n", - (uint32_t)le32_to_cpu(*(uint32_t *)&log_data[SCAO_EEDC])); + le32_to_cpu(log->end_to_end_detected_err)); printf(" End to end corrected errors %"PRIu32"\n", - (uint32_t)le32_to_cpu(*(uint32_t *)&log_data[SCAO_EECE])); + le32_to_cpu(log->end_to_end_corrected_err)); printf(" System data percent used %d\n", - (__u8)log_data[SCAO_SDPU]); + log->system_data_used_percent); printf(" Refresh counts %"PRIu64"\n", - (uint64_t)(le64_to_cpu(*(uint64_t *)&log_data[SCAO_RFSC]) & 0x00FFFFFFFFFFFFFF)); + int56_to_long(log->refresh_counts)); printf(" Max User data erase counts %"PRIu32"\n", - (uint32_t)le32_to_cpu(*(uint32_t *)&log_data[SCAO_MXUDEC])); + le32_to_cpu(log->user_data_erase_count_max)); printf(" Min User data erase counts %"PRIu32"\n", - (uint32_t)le32_to_cpu(*(uint32_t *)&log_data[SCAO_MNUDEC])); + le32_to_cpu(log->user_data_erase_count_min)); printf(" Number of Thermal throttling events %d\n", - (__u8)log_data[SCAO_NTTE]); + log->thermal_throttling_event_count); printf(" Current throttling status 0x%x\n", - (__u8)log_data[SCAO_CTS]); + log->thermal_throttling_current_status); printf(" PCIe correctable error count %"PRIu64"\n", - (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_PCEC])); + le64_to_cpu(log->pcie_correctable_err_count)); printf(" Incomplete shutdowns %"PRIu32"\n", - (uint32_t)le32_to_cpu(*(uint32_t *)&log_data[SCAO_ICS])); + le32_to_cpu(log->incomplete_shoutdowns)); printf(" Percent free blocks %d\n", - (__u8)log_data[SCAO_PFB]); + log->percent_free_blocks); 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])); + le16_to_cpu(log->capacitor_health)); printf(" Unaligned I/O %"PRIu64"\n", - (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_UIO])); + le64_to_cpu(log->unaligned_io)); printf(" Security Version Number %"PRIu64"\n", - (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_SVN])); + le64_to_cpu(log->security_version)); printf(" NUSE - Namespace utilization %"PRIu64"\n", - (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_NUSE])); + le64_to_cpu(log->total_nuse)); printf(" PLP start count %s\n", - uint128_t_to_string(le128_to_cpu(&log_data[SCAO_PSC]))); + uint128_t_to_string(le128_to_cpu(log->plp_start_count))); 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]); + uint128_t_to_string(le128_to_cpu(log->endurance_estimate))); + smart_log_ver = le16_to_cpu(log->log_page_version); 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])); + printf("%"PRIx64"%"PRIx64"\n", le64_to_cpu(*(uint64_t *)&log->log_page_guid[8]), + le64_to_cpu(*(uint64_t *)&log->log_page_guid)); switch (smart_log_ver) { case 0 ... 1: break; default: case 4: printf(" NVMe Command Set Errata Version %d\n", - (__u8)log_data[SCAO_NCSEV]); + log->nvme_cmdset_errata_version); printf(" Lowest Permitted Firmware Revision %"PRIu64"\n", - le64_to_cpu(*(uint64_t *)&log_data[SCAO_PSCC])); + le64_to_cpu(log->lowest_permitted_fw_rev)); + printf(" NVMe Over Pcie Errata Version %d\n", + log->nvme_over_pcie_errate_version); + printf(" NVMe Mi Errata Version %d\n", + log->nvme_mi_errata_version); + printf(" Total media dies %"PRIu16"\n", + le16_to_cpu(log->total_media_dies)); + printf(" Total die failure tolerance %"PRIu16"\n", + le16_to_cpu(log->total_die_failure_tolerance)); + printf(" Media dies offline %"PRIu16"\n", + le16_to_cpu(log->media_dies_offline)); + printf(" Max temperature recorded %d\n", + log->max_temperature_recorded); + printf(" Nand avg erase count %"PRIu64"\n", + le64_to_cpu(log->nand_avg_erase_count)); + printf(" Command timeouts %"PRIu32"\n", + le32_to_cpu(log->command_timeouts)); + printf(" Sys area program fail count raw %"PRIu32"\n", + le32_to_cpu(log->sys_area_program_fail_count_raw)); + printf(" Sys area program fail count noralized %d\n", + le32_to_cpu(log->sys_area_program_fail_count_normalized)); + printf(" Sys area uncorrectable read count raw %"PRIu32"\n", + le32_to_cpu(log->sys_area_uncorr_read_count_raw)); + printf(" Sys area uncorrectable read count noralized %d\n", + le32_to_cpu(log->sys_area_uncorr_read_count_normalized)); + printf(" Sys area erase fail count raw %"PRIu32"\n", + le32_to_cpu(log->sys_area_erase_fail_count_raw)); + printf(" Sys area erase fail count noralized %d\n", + le32_to_cpu(log->sys_area_erase_fail_count_normalized)); + printf(" Max peak power capability %"PRIu16"\n", + le16_to_cpu(log->max_peak_power_capability)); + printf(" Current max avg power %"PRIu16"\n", + le16_to_cpu(log->current_max_avg_power)); + printf(" Lifetime power consumed %"PRIu64"\n", + int48_to_long(log->lifetime_power_consumed)); + printf(" Dssd firmware revision "); + for (i = 0; i < sizeof(log->dssd_firmware_revision); i++) + printf("%c", log->dssd_firmware_revision[i]); + printf("\n"); + printf(" Dssd firmware build UUID %s\n", + util_uuid_to_string(log->dssd_firmware_build_uuid)); + printf(" Dssd firmware build label "); + for (i = 0; i < sizeof(log->dssd_firmware_build_label); i++) + printf("%c", log->dssd_firmware_build_label[i]); + printf("\n"); fallthrough; case 2 ... 3: printf(" Errata Version Field %d\n", - (__u8)log_data[SCAO_EVF]); + log->dssd_errata_version); + memcpy(&dssd_version, log->dssd_point_version, sizeof(dssd_version)); printf(" Point Version Field %"PRIu16"\n", - le16_to_cpu(*(uint16_t *)&log_data[SCAO_PVF])); + le16_to_cpu(dssd_version)); + memcpy(&dssd_version, log->dssd_minor_version, sizeof(dssd_version)); printf(" Minor Version Field %"PRIu16"\n", - le16_to_cpu(*(uint16_t *)&log_data[SCAO_MIVF])); + le16_to_cpu(dssd_version)); printf(" Major Version Field %d\n", - (__u8)log_data[SCAO_MAVF]); + log->dssd_major_version); printf(" NVMe Base Errata Version %d\n", - (__u8)log_data[SCAO_NBEV]); + log->nvme_base_errata_version); printf(" PCIe Link Retraining Count %"PRIu64"\n", - (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_PLRC])); + le64_to_cpu(log->pcie_link_retaining_count)); printf(" Power State Change Count %"PRIu64"\n", - le64_to_cpu(*(uint64_t *)&log_data[SCAO_PSCC])); + le64_to_cpu(log->power_state_change_count)); } printf("\n"); } @@ -205,6 +250,7 @@ static void stdout_c3_log(struct nvme_dev *dev, struct ssd_latency_monitor_log * { char ts_buf[128]; int i, j; + __u16 log_page_version = le16_to_cpu(log_data->log_page_version); printf("-Latency Monitor/C3 Log Page Data-\n"); printf(" Controller : %s\n", dev->name); @@ -237,6 +283,17 @@ static void stdout_c3_log(struct nvme_dev *dev, struct ssd_latency_monitor_log * 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)); + + if (log_page_version >= 0x4) { + printf(" Debug Telemetry Log Size 0x"); + for (i = ARRAY_SIZE(log_data->latency_monitor_debug_log_size) - 1; + i > 0 && (log_data->latency_monitor_debug_log_size[i] == 0); i--) + ; + while (i >= 0) + printf("%02x", log_data->latency_monitor_debug_log_size[i--]); + printf("\n"); + } + printf(" Debug Log Trigger Enable %d\n", le16_to_cpu(log_data->debug_log_trigger_enable)); printf(" Debug Log Measured Latency %d\n", @@ -253,8 +310,7 @@ static void stdout_c3_log(struct nvme_dev *dev, struct ssd_latency_monitor_log * le16_to_cpu(log_data->debug_log_counter_trigger)); printf(" Debug Log Stamp Units %d\n", le16_to_cpu(log_data->debug_log_stamp_units)); - printf(" Log Page Version %d\n", - le16_to_cpu(log_data->log_page_version)); + printf(" Log Page Version %d\n", log_page_version); char guid[(GUID_LEN * 2) + 1]; char *ptr = &guid[0]; @@ -632,59 +688,67 @@ static void stdout_c9_log(struct telemetry_str_log_format *log_data, __u8 *log_d static void stdout_c7_log(struct nvme_dev *dev, struct tcg_configuration_log *log_data) { int j; + __u16 log_page_version = le16_to_cpu(log_data->log_page_version); printf("TCG Configuration C7 Log Page Data-\n"); - printf(" State : 0x%x\n", - log_data->state); - printf(" Reserved1 : 0x"); + printf(" State : 0x%x\n", + log_data->state); + printf(" Reserved1 : "); for (j = 0; j < 3; j++) printf("%d", log_data->rsvd1[j]); printf("\n"); - printf(" Locking SP Activation Count : 0x%x\n", + printf(" Locking SP Activation Count : 0x%x\n", log_data->locking_sp_act_count); - printf(" Tper Revert Count : 0x%x\n", + printf(" Tper Revert Count : 0x%x\n", log_data->type_rev_count); - printf(" Locking SP Revert Count : 0x%x\n", + printf(" Locking SP Revert Count : 0x%x\n", log_data->locking_sp_rev_count); - printf(" Number of Locking Objects : 0x%x\n", + printf(" Number of Locking Objects : 0x%x\n", log_data->no_of_locking_obj); - printf(" Number of Single User Mode Locking Objects : 0x%x\n", + printf(" Number of Single User Mode Locking Objects : 0x%x\n", log_data->no_of_single_um_locking_obj); - printf(" Number of Range Provisioned Locking Objects : 0x%x\n", + printf(" Number of Range Provisioned Locking Objects : 0x%x\n", log_data->no_of_range_prov_locking_obj); - printf(" Number of Namespace Provisioned Locking Objects : 0x%x\n", + printf(" Number of Namespace Provisioned Locking Objects : 0x%x\n", log_data->no_of_ns_prov_locking_obj); - printf(" Number of Read Locked Locking Objects : 0x%x\n", + printf(" Number of Read Locked Locking Objects : 0x%x\n", log_data->no_of_read_lock_locking_obj); - printf(" Number of Write Locked Locking Objects : 0x%x\n", + printf(" Number of Write Locked Locking Objects : 0x%x\n", log_data->no_of_write_lock_locking_obj); - printf(" Number of Read Unlocked Locking Objects : 0x%x\n", + printf(" Number of Read Unlocked Locking Objects : 0x%x\n", log_data->no_of_read_unlock_locking_obj); - printf(" Number of Write Unlocked Locking Objects : 0x%x\n", + printf(" Number of Write Unlocked Locking Objects : 0x%x\n", log_data->no_of_write_unlock_locking_obj); - printf(" Reserved2 : 0x%x\n", - log_data->rsvd2); - - printf(" SID Authentication Try Count : 0x%x\n", + printf(" Reserved2 : %x\n", + log_data->rsvd15); + printf(" SID Authentication Try Count : 0x%x\n", le32_to_cpu(log_data->sid_auth_try_count)); - printf(" SID Authentication Try Limit : 0x%x\n", + printf(" SID Authentication Try Limit : 0x%x\n", le32_to_cpu(log_data->sid_auth_try_limit)); - printf(" Programmatic TCG Reset Count : 0x%x\n", + printf(" Programmatic TCG Reset Count : 0x%x\n", le32_to_cpu(log_data->pro_tcg_rc)); - printf(" Programmatic Reset Lock Count : 0x%x\n", + printf(" Programmatic Reset Lock Count : 0x%x\n", le32_to_cpu(log_data->pro_rlc)); - printf(" TCG Error Count : 0x%x\n", + printf(" TCG Error Count : 0x%x\n", le32_to_cpu(log_data->tcg_ec)); - printf(" Reserved3 : 0x"); - for (j = 0; j < 458; j++) - printf("%d", log_data->rsvd3[j]); + if (log_page_version == 1) { + printf(" Reserved3 : %d%d", + *(__u8 *)&log_data->no_of_ns_prov_locking_obj_ext, + *((__u8 *)&log_data->no_of_ns_prov_locking_obj_ext + 1)); + } else { + printf(" Number of Namespace Provisioned Locking Objects Extended : 0x%x\n", + le16_to_cpu(log_data->no_of_ns_prov_locking_obj_ext)); + printf(" Reserved3 : "); + } + for (j = 0; j < 456; j++) + printf("%d", log_data->rsvd38[j]); printf("\n"); - printf(" Log Page Version : 0x%x\n", - le16_to_cpu(log_data->log_page_version)); - printf(" Log page GUID : 0x"); + printf(" Log Page Version : 0x%x\n", + log_page_version); + printf(" Log page GUID : 0x"); for (j = GUID_LEN - 1; j >= 0; j--) printf("%02x", log_data->log_page_guid[j]); printf("\n"); diff --git a/plugins/ocp/ocp-print.c b/plugins/ocp/ocp-print.c index 916c653..31037db 100644 --- a/plugins/ocp/ocp-print.c +++ b/plugins/ocp/ocp-print.c @@ -36,9 +36,10 @@ void ocp_fw_act_history(const struct fw_activation_history *fw_history, nvme_pri ocp_print(fw_act_history, flags, fw_history); } -void ocp_smart_extended_log(void *data, nvme_print_flags_t flags) +void ocp_smart_extended_log(struct ocp_smart_extended_log *log, unsigned int version, + nvme_print_flags_t flags) { - ocp_print(smart_extended_log, flags, data); + ocp_print(smart_extended_log, flags, log, version); } void ocp_show_telemetry_log(struct ocp_telemetry_parse_options *options, nvme_print_flags_t flags) diff --git a/plugins/ocp/ocp-print.h b/plugins/ocp/ocp-print.h index 85655b9..e9ede1c 100644 --- a/plugins/ocp/ocp-print.h +++ b/plugins/ocp/ocp-print.h @@ -4,13 +4,14 @@ #include "ocp-hardware-component-log.h" #include "ocp-fw-activation-history.h" +#include "ocp-smart-extended-log.h" #include "ocp-telemetry-decode.h" #include "ocp-nvme.h" struct ocp_print_ops { void (*hwcomp_log)(struct hwcomp_log *log, __u32 id, bool list); void (*fw_act_history)(const struct fw_activation_history *fw_history); - void (*smart_extended_log)(void *data); + void (*smart_extended_log)(struct ocp_smart_extended_log *log, unsigned int version); void (*telemetry_log)(struct ocp_telemetry_parse_options *options); void (*c3_log)(struct nvme_dev *dev, struct ssd_latency_monitor_log *log_data); void (*c5_log)(struct nvme_dev *dev, struct unsupported_requirement_log *log_data); @@ -36,7 +37,8 @@ static inline struct ocp_print_ops *ocp_get_json_print_ops(nvme_print_flags_t fl void ocp_show_hwcomp_log(struct hwcomp_log *log, __u32 id, bool list, nvme_print_flags_t flags); void ocp_fw_act_history(const struct fw_activation_history *fw_history, nvme_print_flags_t flags); -void ocp_smart_extended_log(void *data, nvme_print_flags_t flags); +void ocp_smart_extended_log(struct ocp_smart_extended_log *log, unsigned int version, + nvme_print_flags_t flags); void ocp_show_telemetry_log(struct ocp_telemetry_parse_options *options, nvme_print_flags_t flags); void ocp_c3_log(struct nvme_dev *dev, struct ssd_latency_monitor_log *log_data, nvme_print_flags_t flags); diff --git a/plugins/ocp/ocp-smart-extended-log.c b/plugins/ocp/ocp-smart-extended-log.c index 5f84191..5e081c9 100644 --- a/plugins/ocp/ocp-smart-extended-log.c +++ b/plugins/ocp/ocp-smart-extended-log.c @@ -14,10 +14,10 @@ #include "common.h" #include "nvme-print.h" #include "ocp-print.h" +#include "ocp-utils.h" /* C0 SCAO Log Page */ #define C0_SMART_CLOUD_ATTR_LEN 0x200 -#define C0_SMART_CLOUD_ATTR_OPCODE 0xC0 static __u8 scao_guid[GUID_LEN] = { 0xC5, 0xAF, 0x10, 0x28, @@ -26,12 +26,21 @@ static __u8 scao_guid[GUID_LEN] = { 0xC9, 0x14, 0xD5, 0xAF }; -static int get_c0_log_page(int fd, char *format) +static int get_c0_log_page(struct nvme_dev *dev, char *format, + unsigned int format_version) { nvme_print_flags_t fmt; - __u8 *data; + struct ocp_smart_extended_log *data; int i; int ret; + int fd = dev_fd(dev); + struct nvme_get_log_args args = { + .args_size = sizeof(args), + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .lid = (enum nvme_cmd_get_log_lid)OCP_LID_SMART, + .nsid = NVME_NSID_ALL, + .len = C0_SMART_CLOUD_ATTR_LEN, + }; ret = validate_output_format(format, &fmt); if (ret < 0) { @@ -46,8 +55,9 @@ static int get_c0_log_page(int fd, char *format) } memset(data, 0, sizeof(__u8) * C0_SMART_CLOUD_ATTR_LEN); - ret = nvme_get_log_simple(fd, C0_SMART_CLOUD_ATTR_OPCODE, - C0_SMART_CLOUD_ATTR_LEN, data); + args.log = data; + ocp_get_uuid_index(dev, &args.uuidx); + ret = nvme_get_log_page(fd, NVME_LOG_PAGE_PDU_SIZE, &args); if (strcmp(format, "json")) fprintf(stderr, "NVMe Status:%s(%x)\n", @@ -57,7 +67,7 @@ static int get_c0_log_page(int fd, char *format) /* check log page guid */ /* Verify GUID matches */ for (i = 0; i < 16; i++) { - if (scao_guid[i] != data[SCAO_LPG + i]) { + if (scao_guid[i] != data->log_page_guid[i]) { int j; fprintf(stderr, "ERROR : OCP : Unknown GUID in C0 Log Page data\n"); @@ -67,7 +77,7 @@ static int get_c0_log_page(int fd, char *format) fprintf(stderr, "\nERROR : OCP : Actual GUID: 0x"); for (j = 0; j < 16; j++) - fprintf(stderr, "%x", data[SCAO_LPG + j]); + fprintf(stderr, "%x", data->log_page_guid[j]); fprintf(stderr, "\n"); ret = -1; @@ -76,7 +86,7 @@ static int get_c0_log_page(int fd, char *format) } /* print the data */ - ocp_smart_extended_log(data, fmt); + ocp_smart_extended_log(data, format_version, fmt); } else { fprintf(stderr, "ERROR : OCP : Unable to read C0 data from buffer\n"); } @@ -95,14 +105,17 @@ int ocp_smart_add_log(int argc, char **argv, struct command *cmd, struct config { char *output_format; + unsigned int output_format_version; }; struct config cfg = { .output_format = "normal", + .output_format_version = 1, }; OPT_ARGS(opts) = { OPT_FMT("output-format", 'o', &cfg.output_format, "output Format: normal|json"), + OPT_UINT("output-format-version", 0, &cfg.output_format_version, "output Format version: 1|2"), OPT_END() }; @@ -110,7 +123,8 @@ int ocp_smart_add_log(int argc, char **argv, struct command *cmd, if (ret) return ret; - ret = get_c0_log_page(dev_fd(dev), cfg.output_format); + ret = get_c0_log_page(dev, cfg.output_format, + cfg.output_format_version); if (ret) fprintf(stderr, "ERROR : OCP : Failure reading the C0 Log Page, ret = %d\n", ret); diff --git a/plugins/ocp/ocp-smart-extended-log.h b/plugins/ocp/ocp-smart-extended-log.h index 3e64b1b..df33809 100644 --- a/plugins/ocp/ocp-smart-extended-log.h +++ b/plugins/ocp/ocp-smart-extended-log.h @@ -6,50 +6,149 @@ * Venkat Ramesh <venkatraghavan@fb.com> */ +#include "common.h" +#include "linux/types.h" + #ifndef OCP_SMART_EXTENDED_LOG_H #define OCP_SMART_EXTENDED_LOG_H struct command; struct plugin; -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_EEDC = 72, /* End to end detected errors */ - SCAO_EECE = 76, /* End to end corrected 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_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 */ - 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_LPFR = 208, /* Lowest Permitted Firmware Revision */ - SCAO_LPV = 494, /* Log page version */ - SCAO_LPG = 496, /* Log page GUID */ +/** + * struct ocp_smart_extended_log - SMART / Health Information Extended + * @physical_media_units_written: Physical Media Units Written + * @physical_media_units_read: Physical Media Units Read + * @bad_user_nand_blocks_raw: Bad User NAND Blocks raw + * @bad_user_nand_blocks_normalized: Bad User NAND Blocks normalized + * @bad_system_nand_blocks_raw: Bad System NAND Blocks raw + * @bad_system_nand_blocks_normalized: Bad System NAND Blocks normalized + * @xor_recovery_count: XOR Recovery Count + * @uncorrectable_read_err_count: Uncorrectable Read Error Count + * @soft_ecc_err_count: Soft ECC Error Count + * @end_to_end_detected_err: End to End detected errors + * @end_to_end_corrected_err: End to End corrected errors + * @system_data_used_percent: System data percent used + * @refresh_counts: Refresh Counts + * @user_data_erase_count_max: Max User data erase counts + * @user_data_erase_count_min: Min User data erase counts + * @thermal_throttling_event_count: Number of Thermal throttling events + * @dssd_errata_version: DSSD Errata Version + * @dssd_point_version: DSSD Point Version + * @dssd_minor_version: DSSD Minor Version + * @dssd_major_version: DSSD Major Version + * @pcie_correctable_err_count: PCIe Correctable Error Count + * @incomplete_shoutdowns: Incomplete Shutdowns + * @rsvd116: Reserved + * @percent_free_blocks: Percent free blocks + * @rsvd121: Reserved + * @capacitor_health: Capacitor health + * @nvme_base_errata_version: NVM Express Base Errata Version + * @nvme_cmdset_errata_version: NVMe Command Set Errata Version + * @rsvd132: Reserved + * @nvme_over_pcie_errate_version: NVMe Over Pcie Errata Version + * @nvme_mi_errata_version: NVMe MI Errata Version + * @unaligned_io: Unaligned I/O + * @security_version: Security Version Number + * @total_nuse: Total NUSE - Namespace utilization + * @plp_start_count: PLP start count + * @endurance_estimate: Endurance Estimate + * @pcie_link_retaining_count: PCIe Link Retraining Count + * @power_state_change_count: Power State Change Count + * @lowest_permitted_fw_rev: Lowest Permitted Firmware Revision ------------- + * @rsvd216: Reserved + * @total_media_dies: Total media dies + * @total_die_failure_tolerance: Total die failure tolerance + * @media_dies_offline: Media dies offline + * @max_temperature_recorded: Max temperature recorded + * @rsvd223: Reserved + * @nand_avg_erase_count: Nand avg erase count + * @command_timeouts: Command timeouts + * @sys_area_program_fail_count_raw: Sys area program fail count raw + * @sys_area_program_fail_count_normalized: Sys area program fail count noralized + * @revd241: Reserved + * @sys_area_uncorr_read_count_raw: Sys area uncorrectable read count raw + * @sys_area_uncorr_read_count_normalized: Sys area uncorrectable read count noralized + * @revd249: Reserved + * @sys_area_erase_fail_count_raw: Sys area erase fail count raw + * @sys_area_erase_fail_count_normalized: Sys area erase fail count noralized + * @revd257: Reserved + * @max_peak_power_capability: Max peak power capability + * @current_max_avg_power: Current max avg power + * @lifetime_power_consumed: Lifetime power consumed + * @dssd_firmware_revision: Dssd firmware revision + * @dssd_firmware_build_uuid: Dssd firmware build UUID + * @dssd_firmware_build_label: Dssd firmware build label + * @revd358: Reserved + * @log_page_version: Log page version + * @log_page_guid: Log page GUID + */ +struct ocp_smart_extended_log { + __u8 physical_media_units_written[16]; /* [15:0] */ + __u8 physical_media_units_read[16]; /* [31:16] */ + __u8 bad_user_nand_blocks_raw[6]; /* [37:32] */ + __le16 bad_user_nand_blocks_normalized; /* [39:38] */ + __u8 bad_system_nand_blocks_raw[6]; /* [45:40] */ + __le16 bad_system_nand_blocks_normalized; /* [47:46] */ + __le64 xor_recovery_count; /* [55:48] */ + __le64 uncorrectable_read_err_count; /* [63:56] */ + __le64 soft_ecc_err_count; /* [71:64] */ + __le32 end_to_end_detected_err; /* [75:72] */ + __le32 end_to_end_corrected_err; /* [79:76] */ + __u8 system_data_used_percent; /* [80] */ + __u8 refresh_counts[7]; /* [87:81] */ + __le32 user_data_erase_count_max; /* [91:88] */ + __le32 user_data_erase_count_min; /* [95:92] */ + __u8 thermal_throttling_event_count; /* [96] */ + __u8 thermal_throttling_current_status; /* [97] */ + __u8 dssd_errata_version; /* [98] */ + __u8 dssd_point_version[2]; /* [100:99] */ + __u8 dssd_minor_version[2]; /* [102:101] */ + __u8 dssd_major_version; /* [103] */ + __le64 pcie_correctable_err_count; /* [111:104] */ + __le32 incomplete_shoutdowns; /* [115:112] */ + __u8 rsvd116[4]; /* [119:116] */ + __u8 percent_free_blocks; /* [120] */ + __u8 rsvd121[7]; /* [127:121] */ + __le16 capacitor_health; /* [129:128] */ + __u8 nvme_base_errata_version; /* [130] */ + __u8 nvme_cmdset_errata_version; /* [131] */ + __u8 nvme_over_pcie_errate_version; /* [132] */ + __u8 nvme_mi_errata_version; /* [133] */ + __u8 rsvd134[2]; /* [135:134] */ + __le64 unaligned_io; /* [143:136] */ + __le64 security_version; /* [151:144] */ + __le64 total_nuse; /* [159:152] */ + __u8 plp_start_count[16]; /* [175:160] */ + __u8 endurance_estimate[16]; /* [191:176] */ + __le64 pcie_link_retaining_count; /* [199:192] */ + __le64 power_state_change_count; /* [207:200] */ + __le64 lowest_permitted_fw_rev; /* [215:208] */ + __le16 total_media_dies; /* [217:216] */ + __le16 total_die_failure_tolerance; /* [219:218] */ + __le16 media_dies_offline; /* [221:220] */ + __u8 max_temperature_recorded; /* [222] */ + __u8 rsvd223; /* [223] */ + __le64 nand_avg_erase_count; /* [231:224] */ + __le32 command_timeouts; /* [235:232] */ + __le32 sys_area_program_fail_count_raw; /* [239:236] */ + __u8 sys_area_program_fail_count_normalized; /* [240] */ + __u8 rsvd241[3]; /* [243:241] */ + __le32 sys_area_uncorr_read_count_raw; /* [247:244] */ + __u8 sys_area_uncorr_read_count_normalized; /* [248] */ + __u8 rsvd249[3]; /* [251:249] */ + __le32 sys_area_erase_fail_count_raw; /* [255:252] */ + __u8 sys_area_erase_fail_count_normalized; /* [256] */ + __u8 rsvd257[3]; /* [259:257] */ + __le16 max_peak_power_capability; /* [261:260] */ + __le16 current_max_avg_power; /* [263:262] */ + __u8 lifetime_power_consumed[6]; /* [269:264] */ + __u8 dssd_firmware_revision[8]; /* [277:270] */ + __u8 dssd_firmware_build_uuid[16]; /* [293:278] */ + __u8 dssd_firmware_build_label[64]; /* [375:294] */ + __u8 rsvd358[136]; /* [493:358] */ + __le16 log_page_version; /* [495:494] */ + __u8 log_page_guid[16]; /* [511:496] */ }; int ocp_smart_add_log(int argc, char **argv, struct command *cmd, diff --git a/plugins/ocp/ocp-telemetry-decode.c b/plugins/ocp/ocp-telemetry-decode.c index 1a6ebe3..57375f5 100644 --- a/plugins/ocp/ocp-telemetry-decode.c +++ b/plugins/ocp/ocp-telemetry-decode.c @@ -39,6 +39,7 @@ void print_stats_desc(struct telemetry_stats_desc *stat_desc) 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)); + printf("Namespace ID[15:0] : 0x%x\n", stat_desc->nsid); if (stat_data_sz > 0) { printf("%s : 0x", @@ -109,13 +110,18 @@ void print_telemetry_fifo_event(__u8 class_type, 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]; + __u16 status; + __u16 cmd_id; + __u16 sq_id; + + memcpy(&status, &data[1], sizeof(status)); + memcpy(&cmd_id, &data[3], sizeof(cmd_id)); + memcpy(&sq_id, &data[5], sizeof(sq_id)); 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)); + printf(" LID,FID,Other Cmd Reserved : 0x%02x\n", data[7]); } else if (id == CC_REGISTER_CHANGED) { __u32 cc_reg_data = *(__u32 *)data; @@ -126,6 +132,20 @@ void print_telemetry_fifo_event(__u8 class_type, printf(" CSTS Reg Data : 0x%08x\n", le32_to_cpu(csts_reg_data)); + } else if (id == OOB_COMMAND) { + printf(" Cmd Op Code : 0x%02x\n", data[0]); + __u16 status; + memcpy(&status, &data[1], sizeof(status)); + + printf(" Admin Cmd Status : 0x%04x\n", le16_to_cpu(status)); + printf(" NVMe MI SC : 0x%02x\n", data[3]); + printf(" Byte1 Req Msg : 0x%02x\n", data[4]); + printf(" Byte2 Req Msg : 0x%02x\n", data[5]); + } else if (id == OOB_AER_EVENT_MSG_TRANS) { + __u64 aem = *(__u64 *)data; + + printf(" AEM : 0x%016"PRIx64"\n", + le64_to_cpu(aem)); } if (size > 8) print_vu_event_data((size-8), (__u8 *)&data[8]); @@ -168,7 +188,7 @@ void print_telemetry_fifo_event(__u8 class_type, case TELEMETRY_MEDIA_WEAR_CLASS: printf(" Event ID : 0x%04x %s\n", - id, telemetry_media_debug_event_id_to_string(id)); + id, telemetry_media_wear_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]; @@ -190,6 +210,16 @@ void print_telemetry_fifo_event(__u8 class_type, print_stats_desc((struct telemetry_stats_desc *)data); break; + case TELEMETRY_VIRTUAL_FIFO_EVENT_CLASS: + printf(" Event ID : 0x%04x %s\n", + id, telemetry_virtual_fifo_event_id_to_string(id)); + + __u16 vu_event_id = *(__u16 *)data; + + printf(" VU Virtual FIFO Event ID : 0x%02x\n", le16_to_cpu(vu_event_id)); + printf("\n"); + break; + default: /* * printf("Unknown Event Class Type\n"); @@ -489,9 +519,9 @@ int get_telemetry_das_offset_and_size( return 0; } -int get_static_id_ascii_string(int identifier, char *description) +int get_statistic_id_ascii_string(int identifier, char *description) { - if (pstring_buffer == NULL) + if (!pstring_buffer || !description) return -1; struct nvme_ocp_telemetry_string_header *pocp_ts_header = @@ -522,16 +552,17 @@ int get_static_id_ascii_string(int identifier, char *description) 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; } } + // If ASCII string isn't found, see in our internal Map + // for 2.5 Spec defined strings + if (identifier <= 0x1D) { + strcpy(description, statistic_identifiers_map[identifier].description); + return 0; + } + return -1; } @@ -629,10 +660,10 @@ int parse_ocp_telemetry_string_log(int event_fifo_num, int identifier, int debug } if (string_table == STATISTICS_IDENTIFIER_STRING) - get_static_id_ascii_string(identifier, description); - else if (string_table == EVENT_STRING) + get_statistic_id_ascii_string(identifier, description); + else if (string_table == EVENT_STRING && debug_event_class < 0x80) get_event_id_ascii_string(identifier, debug_event_class, description); - else if (string_table == VU_EVENT_STRING) + else if (string_table == VU_EVENT_STRING || debug_event_class >= 0x80) get_vu_event_id_ascii_string(identifier, debug_event_class, description); return 0; @@ -1204,10 +1235,15 @@ int parse_statistic(struct nvme_ocp_telemetry_statistic_descriptor *pstatistic_e struct json_object *pstats_array, FILE *fp) { if (pstatistic_entry == NULL) { - nvme_show_error("Input buffer was NULL"); + nvme_show_error("Statistics Input buffer was NULL"); return -1; } + if (pstatistic_entry->statistic_id == STATISTICS_RESERVED_ID) + /* End of statistics entries, return -1 to stop processing the buffer */ + 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); @@ -1236,8 +1272,33 @@ int parse_statistic(struct nvme_ocp_telemetry_statistic_descriptor *pstatistic_e 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 (pstatistic_entry->statistic_id == MAX_DIE_BAD_BLOCK_ID) { + json_add_formatted_u32_str(pstatistics_object, + STR_STATISTICS_WORST_DIE_PERCENT, + pdata[0]); + json_add_formatted_u32_str(pstatistics_object, + STR_STATISTICS_WORST_DIE_RAW, + *(__u16 *)&pdata[2]); + } else if (pstatistic_entry->statistic_id == MAX_NAND_CHANNEL_BAD_BLOCK_ID) { + json_add_formatted_u32_str(pstatistics_object, + STR_STATISTICS_WORST_NAND_CHANNEL_PERCENT, + pdata[0]); + json_add_formatted_u32_str(pstatistics_object, + STR_STATISTICS_WORST_NAND_CHANNEL_RAW, + *(__u16 *)&pdata[2]); + } else if (pstatistic_entry->statistic_id == MIN_NAND_CHANNEL_BAD_BLOCK_ID) { + json_add_formatted_u32_str(pstatistics_object, + STR_STATISTICS_BEST_NAND_CHANNEL_PERCENT, + pdata[0]); + json_add_formatted_u32_str(pstatistics_object, + STR_STATISTICS_BEST_NAND_CHANNEL_RAW, + *(__u16 *)&pdata[2]); + } else { + 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); @@ -1257,8 +1318,33 @@ int parse_statistic(struct nvme_ocp_telemetry_statistic_descriptor *pstatistic_e 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); + if (pstatistic_entry->statistic_id == MAX_DIE_BAD_BLOCK_ID) { + fprintf(fp, "%s: 0x%02x\n", STR_STATISTICS_WORST_DIE_PERCENT, + pdata[0]); + fprintf(fp, "%s: 0x%04x\n", STR_STATISTICS_WORST_DIE_RAW, + *(__u16 *)&pdata[2]); + } else if (pstatistic_entry->statistic_id == + MAX_NAND_CHANNEL_BAD_BLOCK_ID) { + fprintf(fp, "%s: 0x%02x\n", + STR_STATISTICS_WORST_NAND_CHANNEL_PERCENT, + pdata[0]); + fprintf(fp, "%s: 0x%04x\n", + STR_STATISTICS_WORST_NAND_CHANNEL_RAW, + *(__u16 *)&pdata[2]); + } else if (pstatistic_entry->statistic_id == + MIN_NAND_CHANNEL_BAD_BLOCK_ID) { + fprintf(fp, "%s: 0x%02x\n", + STR_STATISTICS_BEST_NAND_CHANNEL_PERCENT, + pdata[0]); + fprintf(fp, "%s: 0x%04x\n", + STR_STATISTICS_BEST_NAND_CHANNEL_RAW, + *(__u16 *)&pdata[2]); + } else { + 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, @@ -1275,8 +1361,33 @@ int parse_statistic(struct nvme_ocp_telemetry_statistic_descriptor *pstatistic_e 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); + if (pstatistic_entry->statistic_id == MAX_DIE_BAD_BLOCK_ID) { + printf("%s: 0x%02x\n", STR_STATISTICS_WORST_DIE_PERCENT, + pdata[0]); + printf("%s: 0x%04x\n", STR_STATISTICS_WORST_DIE_RAW, + *(__u16 *)&pdata[2]); + } else if (pstatistic_entry->statistic_id == + MAX_NAND_CHANNEL_BAD_BLOCK_ID) { + printf("%s: 0x%02x\n", + STR_STATISTICS_WORST_NAND_CHANNEL_PERCENT, + pdata[0]); + printf("%s: 0x%04x\n", + STR_STATISTICS_WORST_NAND_CHANNEL_RAW, + *(__u16 *)&pdata[2]); + } else if (pstatistic_entry->statistic_id == + MIN_NAND_CHANNEL_BAD_BLOCK_ID) { + printf("%s: 0x%02x\n", + STR_STATISTICS_BEST_NAND_CHANNEL_PERCENT, + pdata[0]); + printf("%s: 0x%04x\n", + STR_STATISTICS_BEST_NAND_CHANNEL_RAW, + *(__u16 *)&pdata[2]); + } else { + print_formatted_var_size_str(STR_STATISTICS_SPECIFIC_DATA, + pdata, + data_size, + fp); + } printf(STR_LINE2); } } @@ -1297,6 +1408,7 @@ int parse_statistics(struct json_object *root, struct nvme_ocp_telemetry_offsets __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; + int parse_rc = 0; if (poffsets->data_area == 1) { __u32 stats_da_1_start = *(__u32 *)(pda1_ocp_header_offset + @@ -1336,7 +1448,11 @@ int parse_statistics(struct json_object *root, struct nvme_ocp_telemetry_offsets (struct nvme_ocp_telemetry_statistic_descriptor *) (pstats_offset + offset_to_move); - parse_statistic(pstatistic_entry, pstats_array, fp); + parse_rc = parse_statistic(pstatistic_entry, pstats_array, fp); + if (parse_rc < 0) + /* end of stats entries or null pointer, so break */ + break; + offset_to_move += (pstatistic_entry->statistic_data_size * SIZE_OF_DWORD + stat_des_size); } diff --git a/plugins/ocp/ocp-telemetry-decode.h b/plugins/ocp/ocp-telemetry-decode.h index ce7de75..21c5b03 100644 --- a/plugins/ocp/ocp-telemetry-decode.h +++ b/plugins/ocp/ocp-telemetry-decode.h @@ -48,6 +48,83 @@ enum TELEMETRY_STATISTIC_ID { 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 */ + TELEMETRY_STAT_ID_PMUW = 0x1E, /* Physical Media Units Written */ + TELEMETRY_STAT_ID_PMUR = 0x1F, /* Physical Media Units Read */ + TELEMETRY_STAT_ID_BUNB = 0x20, /* Bad User NAND Blocks */ + TELEMETRY_STAT_ID_BSNB = 0x21, /* Bad System NAND Blocks */ + TELEMETRY_STAT_ID_XORRC = 0x22, /* XOR Recovery Count */ + TELEMETRY_STAT_ID_UNREC = 0x23, /* Uncorrectable Read Error Count */ + TELEMETRY_STAT_ID_SECCEC = 0x24, /* Soft ECC Error Count */ + TELEMETRY_STAT_ID_ETOECC = 0x25, /* End To End Correction Counts */ + TELEMETRY_STAT_ID_SDU = 0x26, /* System Data % Used */ + TELEMETRY_STAT_ID_RC = 0x27, /* Refresh Count */ + TELEMETRY_STAT_ID_UDEC = 0x28, /* User Data Erase Counts */ + TELEMETRY_STAT_ID_TTSC = 0x29, /* Thremal Throttling Status and Count */ + TELEMETRY_STAT_ID_DSSDSV = 0x2A, /* DSSD Specification Version */ + TELEMETRY_STAT_ID_PCIECEC = 0x2B, /* PCIe Correctable Error Count */ + TELEMETRY_STAT_ID_IS = 0x2C, /* Incomplete Shutdown */ + TELEMETRY_STAT_ID_FB = 0x2D, /* % Free Block */ + TELEMETRY_STAT_ID_CH = 0x2E, /* Capacitor Health */ + TELEMETRY_STAT_ID_NVMEBEV = 0x2F, /* NVM Express Base Errata Version */ + TELEMETRY_STAT_ID_NVMCSEV = 0x30, /* NVM Command Set Errata Version */ + TELEMETRY_STAT_ID_NVMEMIEV = 0x31, /* NVM Exp Mgmt Interface Err Version */ + TELEMETRY_STAT_ID_UIO = 0x32, /* Unaligned IO */ + TELEMETRY_STAT_ID_SVN = 0x33, /* Security Version Number */ + TELEMETRY_STAT_ID_TNUSE = 0x34, /* Total NUSE */ + TELEMETRY_STAT_ID_PLPSC = 0x35, /* PLP Start Count */ + TELEMETRY_STAT_ID_EE = 0x36, /* Endurance Estimate */ + TELEMETRY_STAT_ID_PCIELRC = 0x37, /* PCIe Link Retraining Count */ + TELEMETRY_STAT_ID_PSCC = 0x38, /* Power State Change Count */ + TELEMETRY_STAT_ID_LPFR = 0x39, /* Lowest Permitted Firmware Revision */ + TELEMETRY_STAT_ID_LPV = 0x3A, /* Log Page Version */ + TELEMETRY_STAT_ID_MDO = 0x3B, /* Media Dies Offline */ + TELEMETRY_STAT_ID_MTR = 0x3C, /* Max Temperature Recorded */ + TELEMETRY_STAT_ID_NAEC = 0x3D, /* Nand Avg Erase Count */ + TELEMETRY_STAT_ID_CT = 0x3E, /* Command Timeout */ + TELEMETRY_STAT_ID_SAPFC = 0x3F, /* System Area Program Fail Count */ + TELEMETRY_STAT_ID_SARFC = 0x40, /* System Area Read Fail Count */ + TELEMETRY_STAT_ID_SAEFC = 0x41, /* System Area Erase Fail Count */ + TELEMETRY_STAT_ID_MPPC = 0x42, /* Max Peak Power Capability */ + TELEMETRY_STAT_ID_CMAP = 0x43, /* Current Max Average Power */ + TELEMETRY_STAT_ID_LPC = 0x44, /* Lifetime Power Consumed */ + TELEMETRY_STAT_ID_PAC = 0x45, /* Panic Asset Count */ + TELEMETRY_STAT_ID_DBT = 0x46, /* Device Busy Time */ + TELEMETRY_STAT_ID_CW = 0x47, /* Critical Warning */ + TELEMETRY_STAT_ID_COMTEMP = 0x48, /* Composite Temperature */ + TELEMETRY_STAT_ID_AS = 0x49, /* Available Spare */ + TELEMETRY_STAT_ID_AST = 0x4A, /* Available Spare Threshold */ + TELEMETRY_STAT_ID_PU = 0x4B, /* Percentage Used */ + TELEMETRY_STAT_ID_EGCWS = 0x4C, /* Endurance Gp CW Summary */ + TELEMETRY_STAT_ID_DUR = 0x4D, /* Data Units Read */ + TELEMETRY_STAT_ID_DUW = 0x4E, /* Data Units Written */ + TELEMETRY_STAT_ID_HRC = 0x4F, /* Host Read Commands */ + TELEMETRY_STAT_ID_HWC = 0x50, /* Host Write Commands */ + TELEMETRY_STAT_ID_CBT = 0x51, /* Controller Busy Time */ + TELEMETRY_STAT_ID_PC = 0x52, /* Power Cycles */ + TELEMETRY_STAT_ID_POH = 0x53, /* Power On Hours */ + TELEMETRY_STAT_ID_US = 0x54, /* Unsafe Shutdowns */ + TELEMETRY_STAT_ID_MDIE = 0x55, /* Media and Data Integrity Er */ + TELEMETRY_STAT_ID_NEILE = 0x56, /* No of Error Info Entries */ + TELEMETRY_STAT_ID_WCTT = 0x57, /* Warning Composite Temp Time */ + TELEMETRY_STAT_ID_CCTT = 0x58, /* Critical Comp Temp Time */ + TELEMETRY_STAT_ID_TS1 = 0x59, /* Temperature Sensor 1 */ + TELEMETRY_STAT_ID_TS2 = 0x5A, /* Temperature Sensor 2 */ + TELEMETRY_STAT_ID_TS3 = 0x5B, /* Temperature Sensor 3 */ + TELEMETRY_STAT_ID_TS4 = 0x5C, /* Temperature Sensor 4 */ + TELEMETRY_STAT_ID_TS5 = 0x5D, /* Temperature Sensor 5 */ + TELEMETRY_STAT_ID_TS6 = 0x5E, /* Temperature Sensor 6 */ + TELEMETRY_STAT_ID_TS7 = 0x5F, /* Temperature Sensor 7 */ + TELEMETRY_STAT_ID_TS8 = 0x60, /* Temperature Sensor 8 */ + TELEMETRY_STAT_ID_TMT1TC = 0x61, /* Thermal Mgmt Temp1 TC */ + TELEMETRY_STAT_ID_TMT2TC = 0x62, /* Thermal Mgmt Temp2 TC */ + TELEMETRY_STAT_ID_TTTMT1 = 0x63, /* Total Time TMT1 */ + TELEMETRY_STAT_ID_TTTMT2 = 0x64, /* Total Time TMT2 */ + TELEMETRY_STAT_ID_EEE = 0x65, /* Endurance Estimate */ + TELEMETRY_STAT_ID_EDUR = 0x66, /* Endurance Data Units Read */ + TELEMETRY_STAT_ID_EDUW = 0x67, /* Endurance Data Units Written */ + TELEMETRY_STAT_ID_EMUW = 0x68, /* Endurance Media Units Written */ + TELEMETRY_STAT_ID_ENEILE = 0x69, /* Endurance No Of Err Info Log Entries */ + }; static const char * const telemetry_stat_id_str[] = { @@ -80,50 +157,128 @@ static const char * const telemetry_stat_id_str[] = { [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_STAT_ID_PMUW] = "Physical Media Units Written", + [TELEMETRY_STAT_ID_PMUR] = "Physical Media Units Read", + [TELEMETRY_STAT_ID_BUNB] = "Bad User NAND Blocks", + [TELEMETRY_STAT_ID_BSNB] = "Bad System NAND Blocks", + [TELEMETRY_STAT_ID_XORRC] = "XOR Recovery Count", + [TELEMETRY_STAT_ID_UNREC] = "Uncorrectable Read Error Count", + [TELEMETRY_STAT_ID_SECCEC] = "Soft ECC Error Count", + [TELEMETRY_STAT_ID_ETOECC] = "End To End Correction Counts", + [TELEMETRY_STAT_ID_SDU] = "System Data Used", + [TELEMETRY_STAT_ID_RC] = "Refresh Count", + [TELEMETRY_STAT_ID_UDEC] = "User Data Erase Counts", + [TELEMETRY_STAT_ID_TTSC] = "Thremal Throttling Status and Count", + [TELEMETRY_STAT_ID_DSSDSV] = "DSSD Specification Version", + [TELEMETRY_STAT_ID_PCIECEC] = "PCIe Correctable Error Count", + [TELEMETRY_STAT_ID_IS] = "Incomplete Shutdown", + [TELEMETRY_STAT_ID_FB] = "Free Block", + [TELEMETRY_STAT_ID_CH] = "Capacitor Health", + [TELEMETRY_STAT_ID_NVMEBEV] = "NVM Express Base Errata Version", + [TELEMETRY_STAT_ID_NVMCSEV] = "NVM Command Set Errata Version", + [TELEMETRY_STAT_ID_NVMEMIEV] = "NVM Express Management Interface Errata Version", + [TELEMETRY_STAT_ID_UIO] = "Unaligned IO", + [TELEMETRY_STAT_ID_SVN] = "Security Version Number", + [TELEMETRY_STAT_ID_TNUSE] = "Total NUSE", + [TELEMETRY_STAT_ID_PLPSC] = "PLP Start Count", + [TELEMETRY_STAT_ID_EE] = "Endurance Estimate", + [TELEMETRY_STAT_ID_PCIELRC] = "PCIe Link Retraining Count", + [TELEMETRY_STAT_ID_PSCC] = "Power State Change Count", + [TELEMETRY_STAT_ID_LPFR] = "Lowest Permitted Firmware Revision", + [TELEMETRY_STAT_ID_LPV] = "Log Page Version", + [TELEMETRY_STAT_ID_MDO] = "Media Dies Offline", + [TELEMETRY_STAT_ID_MTR] = "Max Temperature Recorded", + [TELEMETRY_STAT_ID_NAEC] = "Nand Avg Erase Count", + [TELEMETRY_STAT_ID_CT] = "Command Timeout", + [TELEMETRY_STAT_ID_SAPFC] = "System Area Program Fail Count", + [TELEMETRY_STAT_ID_SARFC] = "System Area Read Fail Count", + [TELEMETRY_STAT_ID_SAEFC] = "System Area Erase Fail Count", + [TELEMETRY_STAT_ID_MPPC] = "Max Peak Power Capability", + [TELEMETRY_STAT_ID_CMAP] = "Current Max Average Power", + [TELEMETRY_STAT_ID_LPC] = "Lifetime Power Consumed", + [TELEMETRY_STAT_ID_PAC] = "Panic Asset Count", + [TELEMETRY_STAT_ID_DBT] = "Device Busy Time", + [TELEMETRY_STAT_ID_CW] = "Critical Warning", + [TELEMETRY_STAT_ID_COMTEMP] = "Composite Temperature", + [TELEMETRY_STAT_ID_AS] = "Available Spare", + [TELEMETRY_STAT_ID_AST] = "Available Spare Threshold", + [TELEMETRY_STAT_ID_PU] = "Percentage Used", + [TELEMETRY_STAT_ID_EGCWS] = "Endurance Gp CW Summary", + [TELEMETRY_STAT_ID_DUR] = "Data Units Read", + [TELEMETRY_STAT_ID_DUW] = "Data Units Written", + [TELEMETRY_STAT_ID_HRC] = "Host Read Commands", + [TELEMETRY_STAT_ID_HWC] = "Host Write Commands", + [TELEMETRY_STAT_ID_CBT] = "Controller Busy Time", + [TELEMETRY_STAT_ID_PC] = "Power Cycles", + [TELEMETRY_STAT_ID_POH] = "Power On Hours", + [TELEMETRY_STAT_ID_US] = "Unsafe Shutdowns", + [TELEMETRY_STAT_ID_MDIE] = "Media and Data Integrity Er", + [TELEMETRY_STAT_ID_NEILE] = "No of Error Info Entries", + [TELEMETRY_STAT_ID_WCTT] = "Warning Composite Temp Time", + [TELEMETRY_STAT_ID_CCTT] = "Critical Comp Temp Time", + [TELEMETRY_STAT_ID_TS1] = "Temperature Sensor 1", + [TELEMETRY_STAT_ID_TS2] = "Temperature Sensor 2", + [TELEMETRY_STAT_ID_TS3] = "Temperature Sensor 3", + [TELEMETRY_STAT_ID_TS4] = "Temperature Sensor 4", + [TELEMETRY_STAT_ID_TS5] = "Temperature Sensor 5", + [TELEMETRY_STAT_ID_TS6] = "Temperature Sensor 6", + [TELEMETRY_STAT_ID_TS7] = "Temperature Sensor 7", + [TELEMETRY_STAT_ID_TS8] = "Temperature Sensor 8", + [TELEMETRY_STAT_ID_TMT1TC] = "Thermal Mgmt Temp1 TC", + [TELEMETRY_STAT_ID_TMT2TC] = "Thermal Mgmt Temp2 TC", + [TELEMETRY_STAT_ID_TTTMT1] = "Total Time TMT1", + [TELEMETRY_STAT_ID_TTTMT2] = "Total Time TMT2", + [TELEMETRY_STAT_ID_EEE] = "Endurance Estimate", + [TELEMETRY_STAT_ID_EDUR] = "Endurance Data Units Read", + [TELEMETRY_STAT_ID_EDUW] = "Endurance Data Units Written", + [TELEMETRY_STAT_ID_EMUW] = "Endurance Media Units Written", + [TELEMETRY_STAT_ID_ENEILE] = "Endurance No Of Err Info Log Entries", }; /***************************************************************************** * 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, + 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, + TELEMETRY_VIRTUAL_FIFO_EVENT_CLASS = 0xB, }; 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] = "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_VIRTUAL_FIFO_EVENT_CLASS] = "Virtual FIFO Event 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, + TIMESTAMP_FEATURE_HOST_ISSUED = 0x0000, + TIMESTAMP_FW_INTIATED_SNAPSHOT = 0x0001, + TIMESTAMP_OBSOLETE = 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", + [TIMESTAMP_FEATURE_HOST_ISSUED] = "Host Issued Timestamp Set Feature Cmd", + [TIMESTAMP_FW_INTIATED_SNAPSHOT] = "Fw Initiated Timestamp Snapshot", + [TIMESTAMP_OBSOLETE] = "TimeStamp Obsolete", }; /***************************************************************************** @@ -217,6 +372,8 @@ enum TELEMETRY_NVME_EVENT_ID { CC_REGISTER_CHANGED = 0x000B, CSTS_REGISTER_CHANGED = 0x000C, DELETE_IO_QUEUE_PROCESSED = 0x000D, + OOB_COMMAND = 0x000E, + OOB_AER_EVENT_MSG_TRANS = 0x000F }; static const char * const telemetry_nvme_event_id_str[] = { @@ -226,14 +383,16 @@ static const char * const telemetry_nvme_event_id_str[] = { [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_CMD_PROCESSED] = "Inb-Admin Que Cmd Proc other than Cr IO SQ/CQ", [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", + [CSTS_REGISTER_CHANGED] = "CSTS Register Changed", [DELETE_IO_QUEUE_PROCESSED] = "Delete IO SQ or CQ Command Processed", + [OOB_COMMAND] = "Out of Band Command Process", + [OOB_AER_EVENT_MSG_TRANS] = "Out of Band AER Event Msg Transition" }; /***************************************************************************** @@ -292,7 +451,7 @@ static const char * const telemetry_fw_assert_event_id_str[] = { [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", + [ASSERT_OTHER_CODE] = "Assert in Other Code", }; /***************************************************************************** @@ -342,6 +501,19 @@ static const char * const telemetry_media_wear_event_id_str[] = { [MEDIA_WEAR] = "Media Wear", }; +/***************************************************************************** + * Telemetry Virtual FIFO (0Bh) Event ID's and Strings + *****************************************************************************/ +enum TELEMETRY_VIRTUAL_FIFO_EVENT_ID { + VIRTUAL_FIFO_START = 0x0000, + VIRTUAL_FIFO_END = 0x0002, +}; + +static const char * const telemetry_virtual_fifo_event_id_str[] = { + [VIRTUAL_FIFO_START] = "Virtual FIFO Start", + [VIRTUAL_FIFO_END] = "Virtual FIFO End", +}; + /***************************************************************************** * Telemetry Data Structures @@ -353,7 +525,6 @@ static const char * const telemetry_media_wear_event_id_str[] = { #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, @@ -381,7 +552,7 @@ struct telemetry_stats_desc { __u8 info; __u8 ns_info; __le16 size; - __le16 rsvd1; + __le16 nsid; __u8 data[]; }; @@ -438,7 +609,6 @@ struct telemetry_data_area_1 { #define DEFAULT_OUTPUT_FORMAT_JSON "json" /* C9 Telemetry String Log Format Log Page */ -#define C9_TELEMETRY_STRING_LOG_ENABLE_OPCODE 0xC9 #define C9_TELEMETRY_STR_LOG_LEN 432 #define C9_TELEMETRY_STR_LOG_SIST_OFST 431 @@ -460,6 +630,12 @@ struct telemetry_data_area_1 { #define STR_STATISTICS_DATA_SIZE "Statistic Data Size" #define STR_RESERVED "Reserved" #define STR_STATISTICS_SPECIFIC_DATA "Statistic Specific Data" +#define STR_STATISTICS_WORST_DIE_PERCENT "Worst die % of bad blocks" +#define STR_STATISTICS_WORST_DIE_RAW "Worst die raw number of bad blocks" +#define STR_STATISTICS_WORST_NAND_CHANNEL_PERCENT "Worst NAND channel % of bad blocks" +#define STR_STATISTICS_WORST_NAND_CHANNEL_RAW "Worst NAND channel number of bad blocks" +#define STR_STATISTICS_BEST_NAND_CHANNEL_PERCENT "Best NAND channel % of bad blocks" +#define STR_STATISTICS_BEST_NAND_CHANNEL_RAW "Best NAND channel number of bad blocks" #define STR_CLASS_SPECIFIC_DATA "Class Specific Data" #define STR_DBG_EVENT_CLASS_TYPE "Debug Event Class type" #define STR_EVENT_IDENTIFIER "Event Identifier" @@ -497,6 +673,47 @@ enum ocp_telemetry_string_tables { VU_EVENT_STRING }; +/** + * enum ocp_telemetry_statistics_identifiers - OCP Statistics Identifiers + */ +enum ocp_telemetry_statistic_identifiers { + STATISTICS_RESERVED_ID = 0x00, + OUTSTANDING_ADMIN_CMDS_ID = 0x01, + HOST_WRTIE_BANDWIDTH_ID = 0x02, + GW_WRITE_BANDWITH_ID = 0x03, + ACTIVE_NAMESPACES_ID = 0x04, + INTERNAL_WRITE_WORKLOAD_ID = 0x05, + INTERNAL_READ_WORKLOAD_ID = 0x06, + INTERNAL_WRITE_QUEUE_DEPTH_ID = 0x07, + INTERNAL_READ_QUEUE_DEPTH_ID = 0x08, + PENDING_TRIM_LBA_COUNT_ID = 0x09, + HOST_TRIM_LBA_REQUEST_COUNT_ID = 0x0A, + CURRENT_NVME_POWER_STATE_ID = 0x0B, + CURRENT_DSSD_POWER_STATE_ID = 0x0C, + PROGRAM_FAIL_COUNT_ID = 0x0D, + ERASE_FAIL_COUNT_ID = 0x0E, + READ_DISTURB_WRITES_ID = 0x0F, + + RETENTION_WRITES_ID = 0x10, + WEAR_LEVELING_WRITES_ID = 0x11, + READ_RECOVERY_WRITES_ID = 0x12, + GC_WRITES_ID = 0x13, + SRAM_CORRECTABLE_COUNT_ID = 0x14, + DRAM_CORRECTABLE_COUNT_ID = 0x15, + SRAM_UNCORRECTABLE_COUNT_ID = 0x16, + DRAM_UNCORRECTABLE_COUNT_ID = 0x17, + DATA_INTEGRITY_ERROR_COUNT_ID = 0x18, + READ_RETRY_ERROR_COUNT_ID = 0x19, + PERST_EVENTS_COUNT_ID = 0x1A, + MAX_DIE_BAD_BLOCK_ID = 0x1B, + MAX_NAND_CHANNEL_BAD_BLOCK_ID = 0x1C, + MIN_NAND_CHANNEL_BAD_BLOCK_ID = 0x1D, + + //RESERVED = 7FFFh-1Eh, + //VENDOR_UNIQUE_CLASS_TYPE = FFFFh-8000h, +}; + + /** * enum ocp_telemetry_debug_event_class_types - OCP Debug Event Class types * @RESERVED_CLASS_TYPE: Reserved class @@ -1018,6 +1235,10 @@ static inline const char *telemetry_media_wear_event_id_to_string(int event_id) { return ARGSTR(telemetry_media_wear_event_id_str, event_id); } +static inline const char *telemetry_virtual_fifo_event_id_to_string(int event_id) +{ + return ARGSTR(telemetry_virtual_fifo_event_id_str, event_id); +} /** * @brief parse the ocp telemetry host or controller log binary file @@ -1129,7 +1350,7 @@ int print_ocp_telemetry_json(struct ocp_telemetry_parse_options *options); * * @return 0 success */ -int get_static_id_ascii_string(int identifier, char *description); +int get_statistic_id_ascii_string(int identifier, char *description); /** * @brief gets event id ascii string diff --git a/plugins/ocp/ocp-types.h b/plugins/ocp/ocp-types.h new file mode 100644 index 0000000..63fa4d7 --- /dev/null +++ b/plugins/ocp/ocp-types.h @@ -0,0 +1,13 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +#ifndef OCP_TYPES_H +#define OCP_TYPES_H + +#define OCP_GET(value, name) NVME_GET(value, OCP_##name) +#define OCP_SET(value, name) NVME_SET(value, OCP_##name) + +enum nvme_ocp_enable_ieee1667_silo { + NVME_OCP_ENABLE_IEEE1667_SILO_SHIFT = 31, + NVME_OCP_ENABLE_IEEE1667_SILO_MASK = 1, +}; + +#endif /* OCP_TYPES_H */ diff --git a/plugins/ocp/ocp-utils.c b/plugins/ocp/ocp-utils.c index 8a1462e..e3c0747 100644 --- a/plugins/ocp/ocp-utils.c +++ b/plugins/ocp/ocp-utils.c @@ -7,6 +7,8 @@ #include <unistd.h> #include <errno.h> +#include "util/types.h" +#include "ocp-nvme.h" #include "ocp-utils.h" const unsigned char ocp_uuid[NVME_UUID_LEN] = { @@ -37,3 +39,23 @@ int ocp_get_uuid_index(struct nvme_dev *dev, __u8 *index) return ocp_find_uuid_index(&uuid_list, index); } + +int ocp_get_log_simple(struct nvme_dev *dev, enum ocp_dssd_log_id lid, __u32 len, void *log) +{ + int fd = dev_fd(dev); + struct nvme_get_log_args args = { + .log = log, + .args_size = sizeof(args), + .fd = fd, + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .lid = (enum nvme_cmd_get_log_lid)lid, + .len = len, + .nsid = NVME_NSID_ALL, + .lsi = NVME_LOG_LSI_NONE, + .lsp = NVME_LOG_LSP_NONE, + }; + + ocp_get_uuid_index(dev, &args.uuidx); + + return nvme_get_log_page(fd, NVME_LOG_PAGE_PDU_SIZE, &args); +} diff --git a/plugins/ocp/ocp-utils.h b/plugins/ocp/ocp-utils.h index 1512db8..9832474 100644 --- a/plugins/ocp/ocp-utils.h +++ b/plugins/ocp/ocp-utils.h @@ -4,7 +4,6 @@ * * Author: leonardo.da.cunha@solidigm.com */ - #include "nvme.h" /* @@ -30,3 +29,5 @@ int ocp_get_uuid_index(struct nvme_dev *dev, __u8 *index); * Return: Zero if nvme device has UUID list log page, Negative POSIX error code otherwise. */ int ocp_find_uuid_index(struct nvme_id_uuid_list *uuid_list, __u8 *index); + +int ocp_get_log_simple(struct nvme_dev *dev, enum ocp_dssd_log_id lid, __u32 len, void *log); diff --git a/plugins/scaleflux/sfx-nvme.c b/plugins/scaleflux/sfx-nvme.c index f752d5d..63e0e2e 100644 --- a/plugins/scaleflux/sfx-nvme.c +++ b/plugins/scaleflux/sfx-nvme.c @@ -22,9 +22,11 @@ #include "nvme-wrap.h" #include "nvme-print.h" #include "util/cleanup.h" +#include "util/types.h" #define CREATE_CMD #include "sfx-nvme.h" +#include "sfx-types.h" #define SFX_PAGE_SHIFT 12 #define SECTOR_SHIFT 9 @@ -32,8 +34,10 @@ #define SFX_GET_FREESPACE _IOWR('N', 0x240, struct sfx_freespace_ctx) #define NVME_IOCTL_CLR_CARD _IO('N', 0x47) +//See IDEMA LBA1-03 #define IDEMA_CAP(exp_GB) (((__u64)exp_GB - 50ULL) * 1953504ULL + 97696368ULL) -#define IDEMA_CAP2GB(exp_sector) (((__u64)exp_sector - 97696368ULL) / 1953504ULL + 50ULL) +#define IDEMA_CAP2GB(exp_sector) (((__u64)exp_sector - 97696368ULL) / 1953504ULL + 50ULL) +#define IDEMA_CAP2GB_LDS(exp_sector) (((__u64)exp_sector - 12212046ULL) / 244188ULL + 50ULL) #define VANDA_MAJOR_IDX 0 #define VANDA_MINOR_IDX 0 @@ -41,93 +45,7 @@ #define MYRTLE_MAJOR_IDX 4 #define MYRTLE_MINOR_IDX 1 -enum { - SFX_LOG_LATENCY_READ_STATS = 0xc1, - SFX_LOG_SMART = 0xc2, - SFX_LOG_LATENCY_WRITE_STATS = 0xc3, - SFX_LOG_QUAL = 0xc4, - SFX_LOG_MISMATCHLBA = 0xc5, - SFX_LOG_MEDIA = 0xc6, - SFX_LOG_BBT = 0xc7, - SFX_LOG_IDENTIFY = 0xcc, - SFX_FEAT_ATOMIC = 0x01, - SFX_FEAT_UP_P_CAP = 0xac, - SFX_FEAT_CLR_CARD = 0xdc, -}; -enum sfx_nvme_admin_opcode { - nvme_admin_query_cap_info = 0xd3, - nvme_admin_change_cap = 0xd4, - nvme_admin_sfx_set_features = 0xd5, - nvme_admin_sfx_get_features = 0xd6, -}; - -struct sfx_freespace_ctx { - __u64 free_space; - __u64 phy_cap; /* physical capacity, in unit of sector */ - __u64 phy_space; /* physical space considering OP, in unit of sector */ - __u64 user_space; /* user required space, in unit of sector*/ - __u64 hw_used; /* hw space used in 4K */ - __u64 app_written; /* app data written in 4K */ - __u64 out_of_space; - __u64 map_unit; - __u64 max_user_space; - __u64 extendible_user_cap_lba_count; - __u64 friendly_change_cap_support; -}; - -struct nvme_capacity_info { - __u64 lba_sec_sz; - __u64 phy_sec_sz; - __u64 used_space; - __u64 free_space; -}; - -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; - }; - __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_additional_smart_log_item raid_recover_cnt; /* errors which can be recovered by RAID */ - struct nvme_additional_smart_log_item prog_timeout_cnt; - struct nvme_additional_smart_log_item erase_timeout_cnt; - struct nvme_additional_smart_log_item read_timeout_cnt; - struct nvme_additional_smart_log_item read_ecc_cnt; /* retry cnt */ - struct nvme_additional_smart_log_item non_media_crc_err_cnt; - struct nvme_additional_smart_log_item compression_path_err_cnt; - struct nvme_additional_smart_log_item out_of_space_flag; - struct nvme_additional_smart_log_item physical_usage_ratio; - struct nvme_additional_smart_log_item grown_bb; /* grown bad block */ -}; int nvme_query_cap(int fd, __u32 nsid, __u32 data_len, void *data) { @@ -183,13 +101,14 @@ int nvme_sfx_get_features(int fd, __u32 nsid, __u32 fid, __u32 *result) return err; } +#ifdef CONFIG_JSONC static void show_sfx_smart_log_jsn(struct nvme_additional_smart_log *smart, unsigned int nsid, const char *devname) { struct json_object *root, *entry_stats, *dev_stats, *multi; root = json_create_object(); - json_object_add_value_string(root, "Intel Smart log", devname); + json_object_add_value_string(root, "ScaleFlux Smart log", devname); dev_stats = json_create_object(); @@ -318,9 +237,12 @@ static void show_sfx_smart_log_jsn(struct nvme_additional_smart_log *smart, json_object_add_value_object(root, "Device stats", dev_stats); json_print_object(root, NULL); - printf("/n"); + printf("\n"); json_free_object(root); } +#else /* CONFIG_JSONC */ +#define show_sfx_smart_log_jsn(smart, nsid, devname) +#endif /* CONFIG_JSONC */ static void show_sfx_smart_log(struct nvme_additional_smart_log *smart, unsigned int nsid, const char *devname) @@ -410,7 +332,9 @@ static int get_additional_smart_log(int argc, char **argv, struct command *cmd, "Get ScaleFlux vendor specific additional smart log (optionally, for the specified namespace), and show it."; const char *namespace = "(optional) desired namespace"; const char *raw = "dump output in binary format"; +#ifdef CONFIG_JSONC const char *json = "Dump output in json format"; +#endif /* CONFIG_JSONC */ struct nvme_dev *dev; struct config { __u32 namespace_id; @@ -420,17 +344,16 @@ static int get_additional_smart_log(int argc, char **argv, struct command *cmd, int err; struct config cfg = { - .namespace_id = 0xffffffff, + .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_FLAG_JSON("json", 'j', &cfg.json, json), OPT_END() }; - err = parse_and_open(&dev, argc, argv, desc, opts); if (err) return err; @@ -453,56 +376,6 @@ static int get_additional_smart_log(int argc, char **argv, struct command *cmd, return err; } -struct __packed sfx_lat_stats_vanda { - __u16 maj; - __u16 min; - __u32 bucket_1[32]; /* 0~1ms, step 32us */ - __u32 bucket_2[31]; /* 1~32ms, step 1ms */ - __u32 bucket_3[31]; /* 32ms~1s, step 32ms */ - __u32 bucket_4[1]; /* 1s~2s, specifically 1024ms~2047ms */ - __u32 bucket_5[1]; /* 2s~4s, specifically 2048ms~4095ms */ - __u32 bucket_6[1]; /* 4s+, specifically 4096ms+ */ -}; - -struct __packed sfx_lat_stats_myrtle { - __u16 maj; - __u16 min; - __u32 bucket_1[64]; /* 0us~63us, step 1us */ - __u32 bucket_2[64]; /* 63us~127us, step 1us */ - __u32 bucket_3[64]; /* 127us~255us, step 2us */ - __u32 bucket_4[64]; /* 255us~510us, step 4us */ - __u32 bucket_5[64]; /* 510us~1.02ms step 8us */ - __u32 bucket_6[64]; /* 1.02ms~2.04ms step 16us */ - __u32 bucket_7[64]; /* 2.04ms~4.08ms step 32us */ - __u32 bucket_8[64]; /* 4.08ms~8.16ms step 64us */ - __u32 bucket_9[64]; /* 8.16ms~16.32ms step 128us */ - __u32 bucket_10[64]; /* 16.32ms~32.64ms step 256us */ - __u32 bucket_11[64]; /* 32.64ms~65.28ms step 512us */ - __u32 bucket_12[64]; /* 65.28ms~130.56ms step 1.024ms */ - __u32 bucket_13[64]; /* 130.56ms~261.12ms step 2.048ms */ - __u32 bucket_14[64]; /* 261.12ms~522.24ms step 4.096ms */ - __u32 bucket_15[64]; /* 522.24ms~1.04s step 8.192ms */ - __u32 bucket_16[64]; /* 1.04s~2.09s step 16.384ms */ - __u32 bucket_17[64]; /* 2.09s~4.18s step 32.768ms */ - __u32 bucket_18[64]; /* 4.18s~8.36s step 65.536ms */ - __u32 bucket_19[64]; /* 8.36s~ step 131.072ms */ - __u64 average; /* average latency statistics */ -}; - - -struct __packed sfx_lat_status_ver { - __u16 maj; - __u16 min; -}; - -struct sfx_lat_stats { - union { - struct sfx_lat_status_ver ver; - struct sfx_lat_stats_vanda vanda; - struct sfx_lat_stats_myrtle myrtle; - }; -}; - static void show_lat_stats_vanda(struct sfx_lat_stats_vanda *stats, int write) { int i; @@ -713,7 +586,7 @@ static int get_bb_table(int fd, __u32 nsid, unsigned char *buf, __u64 size) /** * @brief display bb table * - * @param bd_table buffer that contain bb table dumped from drvier + * @param bd_table buffer that contain bb table dumped from driver * @param table_size buffer size (BYTES), should at least has 8 bytes for mf_bb_count and grown_bb_count */ static void bd_table_show(unsigned char *bd_table, __u64 table_size) @@ -796,7 +669,7 @@ static int sfx_get_bad_block(int argc, char **argv, struct command *cmd, struct return -1; } - err = get_bb_table(dev_fd(dev), 0xffffffff, data_buf, buf_size); + err = get_bb_table(dev_fd(dev), NVME_NSID_ALL, data_buf, buf_size); if (err < 0) { perror("get-bad-block"); } else if (err) { @@ -847,7 +720,7 @@ static int query_cap_info(int argc, char **argv, struct command *cmd, struct plu if (err) return err; - if (nvme_query_cap(dev_fd(dev), 0xffffffff, sizeof(ctx), &ctx)) { + if (nvme_query_cap(dev_fd(dev), NVME_NSID_ALL, sizeof(ctx), &ctx)) { perror("sfx-query-cap"); err = -1; } @@ -868,22 +741,22 @@ static int change_sanity_check(int fd, __u64 trg_in_4k, int *shrink) struct sysinfo s_info; __u64 mem_need = 0; __u64 cur_in_4k = 0; - __u64 provisoned_cap_4k = 0; + __u64 provisioned_cap_4k = 0; int extend = 0; - if (nvme_query_cap(fd, 0xffffffff, sizeof(freespace_ctx), &freespace_ctx)) + if (nvme_query_cap(fd, NVME_NSID_ALL, sizeof(freespace_ctx), &freespace_ctx)) return -1; /* * capacity illegal check */ - provisoned_cap_4k = freespace_ctx.phy_space >> + provisioned_cap_4k = freespace_ctx.phy_space >> (SFX_PAGE_SHIFT - SECTOR_SHIFT); - if (trg_in_4k < provisoned_cap_4k || - trg_in_4k > ((__u64)provisoned_cap_4k * 4)) { + if (trg_in_4k < provisioned_cap_4k || + trg_in_4k > ((__u64)provisioned_cap_4k * 4)) { fprintf(stderr, "WARNING: Only support 1.0~4.0 x provisioned capacity!\n"); - if (trg_in_4k < provisoned_cap_4k) + if (trg_in_4k < provisioned_cap_4k) fprintf(stderr, "WARNING: The target capacity is less than 1.0 x provisioned capacity!\n"); else @@ -891,7 +764,7 @@ static int change_sanity_check(int fd, __u64 trg_in_4k, int *shrink) "WARNING: The target capacity is larger than 4.0 x provisioned capacity!\n"); return -1; } - if (trg_in_4k > ((__u64)provisoned_cap_4k*4)) { + if (trg_in_4k > ((__u64)provisioned_cap_4k*4)) { fprintf(stderr, "WARNING: the target capacity is too large\n"); return -1; } @@ -997,7 +870,7 @@ static int change_cap(int argc, char **argv, struct command *cmd, struct plugin return 0; } - err = nvme_change_cap(dev_fd(dev), 0xffffffff, cap_in_4k); + err = nvme_change_cap(dev_fd(dev), NVME_NSID_ALL, cap_in_4k); if (err < 0) { perror("sfx-change-cap"); } else if (err) { @@ -1112,7 +985,7 @@ static int sfx_set_feature(int argc, char **argv, struct command *cmd, struct pl } if (cfg.feature_id == SFX_FEAT_ATOMIC && cfg.value) { - if (cfg.namespace_id != 0xffffffff) { + if (cfg.namespace_id != NVME_NSID_ALL) { err = nvme_identify_ns(dev_fd(dev), cfg.namespace_id, &ns); if (err) { @@ -1506,7 +1379,7 @@ static int sfx_dump_evtlog(int argc, char **argv, struct command *cmd, struct pl }; struct config cfg = { .file = NULL, - .namespace_id = 0xffffffff, + .namespace_id = NVME_NSID_ALL, .storage_medium = 0, .parse = false, .output = NULL, @@ -1634,7 +1507,7 @@ static int sfx_expand_cap(int argc, char **argv, struct command *cmd, struct plu __u32 units; }; struct config cfg = { - .namespace_id = 0xffffffff, + .namespace_id = NVME_NSID_ALL, .lbaf = 0, .units = 0, }; @@ -1652,7 +1525,7 @@ static int sfx_expand_cap(int argc, char **argv, struct command *cmd, struct plu if (err) goto ret; - if (cfg.namespace_id == 0xffffffff) { + if (cfg.namespace_id == NVME_NSID_ALL) { if (S_ISCHR(dev->direct.stat.st_mode)) { fprintf(stderr, "namespace_id or blk device required\n"); err = EINVAL; @@ -1685,3 +1558,528 @@ close_dev: ret: return err; } + +static int sfx_status(int argc, char **argv, struct command *cmd, struct plugin *plugin) +{ + const char *desc = "Get ScaleFlux specific status information and print it"; + const char *json_desc = "Print output in JSON format, otherwise human readable"; + struct nvme_dev *dev; + struct nvme_id_ctrl id_ctrl = { 0 }; + struct extended_health_info_myrtle sfx_smart = { 0 }; + struct nvme_smart_log smart_log = { 0 }; + struct nvme_additional_smart_log additional_smart_log = { 0 }; + struct sfx_freespace_ctx sfx_freespace = { 0 }; + struct nvme_get_features_args get_feat_args = { 0 }; + unsigned int get_feat_result, pcie_correctable, pcie_fatal, pcie_nonfatal; + unsigned long long capacity; + bool capacity_valid = false; + int err, fd, len, sector_size; + char pci_vid[7], pci_did[7], pci_ssvid[7], link_speed[20], link_width[5], link_string[40]; + char path[512], numa_node[5], vendor[10], form_factor[15], temperature[10], io_speed[15]; + char chr_dev[8], serial_number[21], model_number[41], firmware_revision[9], pcie_status[9]; + struct json_object *root, *dev_stats, *link_stats, *crit_stats; + double write_amp; + + struct config { + bool json; + }; + struct config cfg = { + .json = false + }; + + OPT_ARGS(opts) = { + OPT_FLAG("json-print", 'j', &cfg.json, json_desc), + OPT_END() + }; + + err = parse_and_open(&dev, argc, argv, desc, opts); + + if (err) + goto ret; + + //Calculate formatted capacity, not concerned with errors, we may have a char device + memset(&path, 0, 512); + snprintf(path, 512, "/dev/%s", dev->name); + fd = open(path, O_RDONLY | O_NONBLOCK); + if (fd >= 0) { + err = ioctl(fd, BLKSSZGET, §or_size); + if (!err) + err = ioctl(fd, BLKGETSIZE64, &capacity); + capacity_valid = (!err); + } + + if (capacity_valid && sector_size == 512) + capacity = IDEMA_CAP2GB(capacity/sector_size); + else if (capacity_valid && sector_size == 4096) + capacity = IDEMA_CAP2GB_LDS(capacity/sector_size); + else + capacity = capacity / (1000 * 1000 * 1000); //B --> GB + + memset(&chr_dev, 0, 8); + strcpy(chr_dev, dev->name); + for (len = 2; len < 8; len++) { + if (chr_dev[len] == 'n') + chr_dev[len] = '\0'; + } + + // Populate PCIe VID/DID/SS_VID, link speed/width, and NUMA node from /sys/ + snprintf(path, 512, "/sys/class/nvme/%s/device/vendor", chr_dev); + fd = open(path, O_RDONLY); + if (fd < 0) { + perror("Could not open PCIe VID in /sys/"); + err = errno; + goto close_dev; + } + memset(&pci_vid, 0, 7); + len = read(fd, pci_vid, 6); + if (len < 1) { + perror("Could not read PCIe VID in /sys/"); + close(fd); + err = errno; + goto close_dev; + } + close(fd); + + snprintf(path, 512, "/sys/class/nvme/%s/device/device", chr_dev); + fd = open(path, O_RDONLY); + if (fd < 0) { + perror("Could not open PCIe DID in /sys/"); + err = errno; + goto close_dev; + } + memset(&pci_did, 0, 7); + len = read(fd, pci_did, 6); + if (len < 1) { + perror("Could not read PCIe DID in /sys/"); + close(fd); + err = errno; + goto close_dev; + } + close(fd); + + if (strncmp("0xcc53", pci_vid, 6) == 0) + strncpy(vendor, "ScaleFlux", 10); + else if (strncmp("0x1dfd", pci_vid, 6) == 0) + strncpy(vendor, "DIGISTOR", 10); + else { + fprintf(stderr, "Please use on a ScaleFlux device\n"); + err = -1; + goto close_dev; + } + + snprintf(path, 512, "/sys/class/nvme/%s/device/subsystem_vendor", chr_dev); + fd = open(path, O_RDONLY); + if (fd < 0) { + perror("Could not open PCIe Subsystem Vendor ID in /sys/"); + err = errno; + goto close_dev; + } + memset(&pci_ssvid, 0, 7); + len = read(fd, pci_ssvid, 6); + if (len < 1) { + perror("could not read PCIe Subsystem Vendor ID in /sys/"); + close(fd); + err = errno; + goto close_dev; + } + close(fd); + + snprintf(path, 512, "/sys/class/nvme/%s/device/current_link_speed", chr_dev); + fd = open(path, O_RDONLY); + if (fd < 0) { + perror("Could not open link speed in /sys/"); + err = errno; + goto close_dev; + } + memset(&link_speed, 0, 20); + len = read(fd, link_speed, 20); + if (len < 1) { + perror("Could not read link speed in /sys/"); + close(fd); + err = errno; + goto close_dev; + } + close(fd); + // Ending string before "PCIe" and newline + for (len = 0; (len+2) < 20 && link_speed[len+2] != '\0'; ++len) { + if (link_speed[len] == '/' && link_speed[len+1] == 's') + link_speed[len+2] = '\0'; + } + + snprintf(path, 512, "/sys/class/nvme/%s/device/current_link_width", chr_dev); + fd = open(path, O_RDONLY); + if (fd < 0) { + perror("Could not open link width in /sys/"); + err = errno; + goto close_dev; + } + memset(&link_width, 0, 5); + len = read(fd, link_width, 5); + if (len < 1) { + perror("Could not read link width in /sys/"); + close(fd); + err = errno; + goto close_dev; + } + close(fd); + // Ending string before newline + for (len = 0; (len) < 5 ; ++len) { + if (link_width[len] == '\n') + link_width[len] = '\0'; + } + + snprintf(link_string, 40, "Speed %s, Width x%s", link_speed, link_width); + + snprintf(path, 512, "/sys/class/nvme/%s/device/numa_node", chr_dev); + fd = open(path, O_RDONLY); + if (fd < 0) { + perror("Could not open NUMA node in /sys/"); + err = errno; + goto close_dev; + } + memset(&numa_node, 0, 5); + len = read(fd, numa_node, 5); + if (len < 1) { + perror("Could not read NUMA node in /sys/"); + close(fd); + err = errno; + goto close_dev; + } + close(fd); + + for (len = 0; len < 5; ++len) { + if (numa_node[len] == '\n') + numa_node[len] = '\0'; + } + + //Populate PCIe AER errors from /sys/ + snprintf(path, 512, "/sys/class/nvme/%s/device/aer_dev_correctable", chr_dev); + fd = open(path, O_RDONLY); + if (fd < 0) { + perror("Could not open PCIe AER Correctable errors in /sys/"); + err = errno; + goto close_dev; + } + len = read(fd, path, 512); + if (len < 1) { + perror("Could not read PCIe AER Correctable errors in /sys/"); + close(fd); + err = errno; + goto close_dev; + } + close(fd); + len = sscanf(path, "%*s %*d %*s %*d %*s %*d %*s %*d %*s %*d %*s %*d %*s %*d %*s %*d TOTAL_ERR_COR %d", &pcie_correctable); + len = 1; + if (len < 1 || len == EOF) { + perror("Could not parse PCIe AER Correctable errors in /sys/"); + err = -1; + goto close_dev; + } + + snprintf(path, 512, "/sys/class/nvme/%s/device/aer_dev_nonfatal", chr_dev); + fd = open(path, O_RDONLY); + if (fd < 0) { + perror("Could not open PCIe AER Non-Fatal errors in /sys/"); + err = errno; + goto close_dev; + } + + len = read(fd, path, 512); + if (len < 1) { + perror("Could not read PCIe AER Non-Fatal errors in /sys/"); + err = errno; + goto close_dev; + } + close(fd); + len = sscanf(path, "%*s %*d %*s %*d %*s %*d %*s %*d %*s %*d %*s %*d %*s %*d %*s %*d %*s %*d %*s %*d %*s %*d %*s %*d %*s %*d %*s %*d %*s %*d %*s %*d %*s %*d %*s %*d TOTAL_ERR_NONFATAL %d", &pcie_nonfatal); + if (len < 1) { + perror("Could not parse PCIe AER Non-Fatal errors in /sys/"); + err = -1; + goto close_dev; + } + + snprintf(path, 512, "/sys/class/nvme/%s/device/aer_dev_fatal", chr_dev); + fd = open(path, O_RDONLY); + if (fd < 0) { + perror("Could not open PCIe AER Fatal errors in /sys/"); + err = errno; + goto close_dev; + } + + len = read(fd, path, 512); + if (len < 1) { + perror("Could not read PCIe AER Fatal errors in /sys/"); + close(fd); + err = errno; + goto close_dev; + } + close(fd); + len = sscanf(path, "%*s %*d %*s %*d %*s %*d %*s %*d %*s %*d %*s %*d %*s %*d %*s %*d %*s %*d %*s %*d %*s %*d %*s %*d %*s %*d %*s %*d %*s %*d %*s %*d %*s %*d %*s %*d TOTAL_ERR_FATAL %d", &pcie_fatal); + if (len < 1) { + perror("Could not parse PCIe AER Fatal errors in /sys/"); + close(fd); + err = -1; + goto close_dev; + } + + snprintf(pcie_status, 9, "%s", (pcie_fatal != 0 || pcie_nonfatal != 0 || pcie_correctable != 0) ? "Warning":"Good"); + + //Populate id-ctrl + err = nvme_identify_ctrl(dev_fd(dev), &id_ctrl); + if (err) { + fprintf(stderr, "Unable to read nvme_identify_ctrl() error code:%x\n", err); + goto close_dev; + } + //Re-format specific fields so they can be safely treated as strings later + serial_number[20] = '\0'; + memcpy(serial_number, id_ctrl.sn, 20); + model_number[40] = '\0'; + memcpy(model_number, id_ctrl.mn, 40); + firmware_revision[8] = '\0'; + memcpy(firmware_revision, id_ctrl.fr, 8); + + //Populate SMART log (0x02) + err = nvme_cli_get_log_smart(dev, NVME_NSID_ALL, false, &smart_log); + if (err < 0) { + perror("Could not read SMART log (0x02)"); + err = errno; + goto close_dev; + } else if (err > 0) { + nvme_show_status(err); + goto close_dev; + } + + snprintf(temperature, 10, "%li", kelvin_to_celsius(smart_log.temperature[1]<<8 | smart_log.temperature[0])); + + //Populate SFX Extended Health log (0xC2) or if PCIe DID ==0x20 (Quince) use 0xD2 + if (strncmp("0x0020", pci_did, 6) == 0) + err = nvme_get_log_simple(dev_fd(dev), SFX_LOG_EXTENDED_HEALTH_ALT, sizeof(sfx_smart), (void *)&sfx_smart); + else + err = nvme_get_log_simple(dev_fd(dev), SFX_LOG_EXTENDED_HEALTH, sizeof(sfx_smart), (void *)&sfx_smart); + if (err < 0) { + perror("Could not read ScaleFlux SMART log"); + err = errno; + goto close_dev; + } else if (err > 0) { + nvme_show_status(err); + goto close_dev; + } + + //Make sure the OPN can be printed safely + sfx_smart.opn[10] = '\0'; + + switch (sfx_smart.opn[3]) { + case 'P': + snprintf(form_factor, 15, "%s", "AIC"); + break; + case 'U': + snprintf(form_factor, 15, "%s", (sfx_smart.opn[4] == '8')?"U.3":"U.2"); + break; + case 'E': + snprintf(form_factor, 15, "%s", "E1.S"); + break; + default: + snprintf(form_factor, 15, "%s", "Incorrect OPN"); + } + + //Populate Additional SMART log (0xCA) + err = nvme_get_nsid_log(dev_fd(dev), false, 0xca, NVME_NSID_ALL, sizeof(struct nvme_additional_smart_log), (void *)&additional_smart_log); + if (err < 0) { + perror("Could not read ScaleFlux SMART log"); + err = errno; + goto close_dev; + } else if (err > 0) { + nvme_show_status(err); + goto close_dev; + } + + //OK with the '-nan' if host_bytes_written is zero + write_amp = int48_to_long(additional_smart_log.nand_bytes_written.raw)/(1.0 * int48_to_long(additional_smart_log.host_bytes_written.raw)); + + //Get SFX freespace information + err = nvme_query_cap(dev_fd(dev), NVME_NSID_ALL, sizeof(sfx_freespace), &sfx_freespace); + if (err < 0) { + perror("Could not query freespace information (0xD6)"); + err = errno; + goto close_dev; + } else if (err > 0) { + nvme_show_status(err); + goto close_dev; + } + + //Parse IO Speed information + memset(&io_speed, 0, 15); + switch (sfx_smart.io_speed) { + case '1': + if (strncmp("0x0020", pci_did, 6)) + strncpy(io_speed, "2.5MB/s", 15); + else + strncpy(io_speed, "10MB/s", 15); + break; + case '2': + if (strncmp("0x0020", pci_did, 6)) + strncpy(io_speed, "128KB/s", 15); + else + strncpy(io_speed, "512KB/s", 15); + break; + case '3': + strncpy(io_speed, "Write Reject", 15); + break; + default: + strncpy(io_speed, "Normal", 15); + } + + if (sfx_smart.comp_ratio < 100) + sfx_smart.comp_ratio = 100; + else if (sfx_smart.comp_ratio > 800) + sfx_smart.comp_ratio = 800; + + //Get status of atomic write feature + get_feat_args.args_size = sizeof(get_feat_args); + get_feat_args.fid = 0x0A; + get_feat_args.timeout = NVME_DEFAULT_IOCTL_TIMEOUT; + get_feat_args.result = &get_feat_result; + err = nvme_cli_get_features(dev, &get_feat_args); + if (err < 0) { + perror("Could not get feature (0x0A)"); + err = errno; + goto close_dev; + } else if (err > 0) { + nvme_show_status(err); + goto close_dev; + } + + if (cfg.json) { + root = json_create_object(); + json_object_add_value_string(root, "ScaleFlux Status", dev->name); + + dev_stats = json_create_object(); + link_stats = json_create_object(); + crit_stats = json_create_object(); + + json_object_add_value_string(dev_stats, "PCIe Vendor ID", pci_vid); + json_object_add_value_string(dev_stats, "PCIe Subsystem Vendor ID", pci_ssvid); + json_object_add_value_string(dev_stats, "Manufacturer", vendor); + json_object_add_value_string(dev_stats, "Model", model_number); + json_object_add_value_string(dev_stats, "Serial Number", serial_number); + json_object_add_value_string(dev_stats, "OPN", (char *)sfx_smart.opn); + json_object_add_value_string(dev_stats, "Drive Type", form_factor); + json_object_add_value_string(dev_stats, "Firmware Revision", firmware_revision); + json_object_add_value_string(dev_stats, "Temperature [C]", temperature); + json_object_add_value_uint(dev_stats, "Power Consumption [mW]", sfx_smart.power_mw_consumption); + json_object_add_value_uint(dev_stats, "Atomic Write Mode", (get_feat_result)); + json_object_add_value_int(dev_stats, "Percentage Used", smart_log.percent_used); + json_object_add_value_string(dev_stats, "Data Read", uint128_t_to_si_string(le128_to_cpu(smart_log.data_units_read), 1000 * 512)); + json_object_add_value_string(dev_stats, "Data Written", uint128_t_to_si_string(le128_to_cpu(smart_log.data_units_written), 1000 * 512)); + json_object_add_value_int(dev_stats, "Correctable Error Count", sfx_smart.pcie_rx_correct_errs); + json_object_add_value_int(dev_stats, "Uncorrectable Error Count", sfx_smart.pcie_rx_uncorrect_errs); + json_object_add_value_string(link_stats, "PCIe Link Width", link_width); + json_object_add_value_string(link_stats, "PCIe Link Speed", link_speed); + json_object_add_value_int(link_stats, "PCIe Link Fatal Errors", pcie_fatal); + json_object_add_value_int(link_stats, "PCIe Link Non-Fatal Errors", pcie_nonfatal); + json_object_add_value_int(link_stats, "PCIe Link Correctable Errors", pcie_correctable); + json_object_add_value_string(link_stats, "PCIe Device Status", pcie_status); + json_object_add_value_object(dev_stats, "PCIe Link Status", link_stats); + if (sfx_smart.friendly_changecap_support) { + json_object_add_value_int(dev_stats, "Current Formatted Capacity [GB]", sfx_smart.cur_formatted_capability); + json_object_add_value_int(dev_stats, "Max Formatted Capacity [GB]", sfx_smart.max_formatted_capability); + json_object_add_value_int(dev_stats, "Extendible Capacity LBA count", sfx_smart.extendible_cap_lbacount); + } else if (capacity_valid) + json_object_add_value_int(dev_stats, "Formatted Capacity [GB]", capacity); + + json_object_add_value_int(dev_stats, "Provisioned Capacity [GB]", IDEMA_CAP2GB(sfx_smart.total_physical_capability)); + json_object_add_value_int(dev_stats, "Compression Ratio", sfx_smart.comp_ratio); + json_object_add_value_int(dev_stats, "Physical Used Ratio", sfx_smart.physical_usage_ratio); + json_object_add_value_int(dev_stats, "Free Physical Space [GB]", IDEMA_CAP2GB(sfx_smart.free_physical_capability)); + json_object_add_value_int(dev_stats, "Firmware RSA Verification", (sfx_smart.otp_rsa_en)); + json_object_add_value_string(dev_stats, "IO Speed", io_speed); + json_object_add_value_string(dev_stats, "NUMA Node", numa_node); + json_object_add_value_int(dev_stats, "Indirection Unit [kiB]", (4*sfx_freespace.map_unit)); + json_object_add_value_double(dev_stats, "Lifetime WAF", write_amp); + + json_object_add_value_int(crit_stats, "Thermal Throttling On", (sfx_smart.temp_throttle_info)); + json_object_add_value_int(crit_stats, "Backup Capacitor Status Bad", (smart_log.critical_warning & 0x10)); + json_object_add_value_int(crit_stats, "Bad block exceeds threshold", (smart_log.critical_warning & 0x01)); + json_object_add_value_int(crit_stats, "Media Error", (smart_log.critical_warning & 0x04)); + json_object_add_value_int(crit_stats, "Read only mode", (smart_log.critical_warning & 0x08)); + json_object_add_value_int(crit_stats, "Power Failure Data Loss", (sfx_smart.sfx_critical_warning & SFX_CRIT_PWR_FAIL_DATA_LOSS)); + json_object_add_value_int(crit_stats, "Exceed physical capacity limitation", (sfx_smart.sfx_critical_warning & SFX_CRIT_OVER_CAP)); + json_object_add_value_int(crit_stats, "Read/Write lock mode", (sfx_smart.sfx_critical_warning & SFX_CRIT_RW_LOCK)); + + json_object_add_value_object(dev_stats, "Critical Warning(s)", crit_stats); + + json_object_add_value_object(root, "Device stats", dev_stats); + + json_print_object(root, NULL); + printf("\n"); + json_free_object(root); + + } else { + // Re-using path variable to hold critical warning text + // order is to match sfx-status, done here to include color + memset(path, 0, 512); + len = snprintf(path, 512, FMT_RED "\n%s%s%s%s%s%s%s%s" FMT_RESET, \ + (sfx_smart.temp_throttle_info) ? "\tThermal Throttling On\n" : "", \ + (smart_log.critical_warning & 0x10) ? "\tBackup Capacitor Status Bad\n" : "", \ + (smart_log.critical_warning & 0x01) ? "\tBad block exceeds threshold\n" : "", \ + (smart_log.critical_warning & 0x04) ? "\tMedia Error\n" : "", \ + (smart_log.critical_warning & 0x08) ? "\tRead only mode\n" : "", \ + (sfx_smart.sfx_critical_warning & SFX_CRIT_PWR_FAIL_DATA_LOSS) ? "\tPower Failure Data Loss\n" : "", \ + (sfx_smart.sfx_critical_warning & SFX_CRIT_OVER_CAP) ? "\tExceed physical capacity limitation\n" : "", \ + (sfx_smart.sfx_critical_warning & SFX_CRIT_RW_LOCK) ? "\tRead/Write lock mode\n" : "" \ + ); + if (len < 11) + strcpy(path, "None"); + + printf("%-35s%s%s\n", "ScaleFlux Drive:", "/dev/", dev->name); + printf("%-35s%s\n", "PCIe Vendor ID:", pci_vid); + printf("%-35s%s\n", "PCIe Subsystem Vendor ID:", pci_ssvid); + printf("%-35s%s\n", "Manufacturer:", vendor); + printf("%-35s%.*s\n", "Model:", 40, model_number); + printf("%-35s%.*s\n", "Serial Number:", 20, serial_number); + printf("%-35s%.*s\n", "OPN:", 32, sfx_smart.opn); + printf("%-35s%s\n", "Drive Type:", form_factor); + printf("%-35s%.*s\n", "Firmware Revision:", 8, firmware_revision); + printf("%-35s%s C\n", "Temperature:", temperature); + printf("%-35s%i mW\n", "Power Consumption:", sfx_smart.power_mw_consumption); + printf("%-35s%s\n", "Atomic Write mode:", (get_feat_result)?"Off":"On"); + printf("%-35s%u%%\n", "Percentage Used:", smart_log.percent_used); + printf("%-35s%s\n", "Host Data Read:", uint128_t_to_si_string( le128_to_cpu( \ + smart_log.data_units_read), 1000 * 512)); + printf("%-35s%s\n", "Host Data Written:", uint128_t_to_si_string(le128_to_cpu( \ + smart_log.data_units_written), 1000 * 512)); + write_amp = int48_to_long(additional_smart_log.nand_bytes_written.raw)/(1.0 * int48_to_long(additional_smart_log.host_bytes_written.raw)); + printf("%-35s%i\n", "Correctable Error Cnt:", sfx_smart.pcie_rx_correct_errs); + printf("%-35s%i\n", "Uncorrectable Error Cnt:", sfx_smart.pcie_rx_uncorrect_errs); + printf("%-35s%s\n", "PCIe Link Status:", link_string); + printf("%-35s%s\n", "PCIe Device Status:", pcie_status); + if (sfx_smart.friendly_changecap_support) { + printf("%-35s%"PRIu64" GB\n", "Current Formatted Capacity:", + (uint64_t)sfx_smart.cur_formatted_capability); + printf("%-35s%"PRIu64" GB\n", "Max Formatted Capacity:", + (uint64_t)sfx_smart.max_formatted_capability); + printf("%-35s%"PRIu64"\n", "Extendible Capacity LBA count:", + (uint64_t)sfx_smart.extendible_cap_lbacount); + } else if (capacity_valid) { + printf("%-35s%"PRIu64" GB\n", "Formatted Capacity:", (uint64_t)capacity); + } + printf("%-35s%"PRIu64" GB\n", "Provisioned Capacity:", + (uint64_t)IDEMA_CAP2GB(sfx_smart.total_physical_capability)); + printf("%-35s%u%%\n", "Compression Ratio:", sfx_smart.comp_ratio); + printf("%-35s%u%%\n", "Physical Used Ratio:", sfx_smart.physical_usage_ratio); + printf("%-35s%"PRIu64" GB\n", "Free Physical Space:", + (uint64_t)IDEMA_CAP2GB(sfx_smart.free_physical_capability)); + printf("%-35s%s\n", "Firmware Verification:", (sfx_smart.otp_rsa_en) ? "On":"Off"); + printf("%-35s%s\n", "IO Speed:", io_speed); + printf("%-35s%s\n", "NUMA Node:", numa_node); + printf("%-35s%"PRIu64"K\n", "Indirection Unit:", + (uint64_t)(4*sfx_freespace.map_unit)); + printf("%-35s%.2f\n", "Lifetime WAF:", write_amp); + printf("%-35s%s\n", "Critical Warning(s):", path); + } + +close_dev: + dev_close(dev); +ret: + return err; +} diff --git a/plugins/scaleflux/sfx-nvme.h b/plugins/scaleflux/sfx-nvme.h index 53e2217..b5a7db4 100644 --- a/plugins/scaleflux/sfx-nvme.h +++ b/plugins/scaleflux/sfx-nvme.h @@ -18,6 +18,7 @@ PLUGIN(NAME("sfx", "ScaleFlux vendor specific extensions", NVME_VERSION), ENTRY("get-feature", "Get a feature", sfx_get_feature) ENTRY("dump-evtlog", "dump evtlog into file and parse warning & error log", sfx_dump_evtlog) ENTRY("expand-cap", "expand the last namespace capacity lossless", sfx_expand_cap) + ENTRY("status", "Retrieve the ScaleFlux status output, show it", sfx_status) ) ); diff --git a/plugins/scaleflux/sfx-types.h b/plugins/scaleflux/sfx-types.h new file mode 100644 index 0000000..491d871 --- /dev/null +++ b/plugins/scaleflux/sfx-types.h @@ -0,0 +1,189 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ + +#include <inttypes.h> + +#define FMT_RED "\x1b[31m" +#define FMT_GREEN "\x1b[32m" +#define FMT_YELLOW "\x1b[33m" +#define FMT_BLUE "\x1b[34m" +#define FMT_RESET "\x1b[0m" + + +enum { + SFX_LOG_LATENCY_READ_STATS = 0xc1, + SFX_LOG_EXTENDED_HEALTH = 0xc2, + SFX_LOG_LATENCY_WRITE_STATS = 0xc3, + SFX_LOG_QUAL = 0xc4, + SFX_LOG_MISMATCHLBA = 0xc5, + SFX_LOG_MEDIA = 0xc6, + SFX_LOG_BBT = 0xc7, + SFX_LOG_IDENTIFY = 0xcc, + SFX_FEAT_ATOMIC = 0x01, + SFX_FEAT_UP_P_CAP = 0xac, + SFX_LOG_EXTENDED_HEALTH_ALT = 0xd2, + SFX_FEAT_CLR_CARD = 0xdc, +}; + +enum { + SFX_CRIT_PWR_FAIL_DATA_LOSS = 0x01, + SFX_CRIT_OVER_CAP = 0x02, + SFX_CRIT_RW_LOCK = 0x04, +}; + +enum sfx_nvme_admin_opcode { + nvme_admin_query_cap_info = 0xd3, + nvme_admin_change_cap = 0xd4, + nvme_admin_sfx_set_features = 0xd5, + nvme_admin_sfx_get_features = 0xd6, +}; + +struct sfx_freespace_ctx { + __u64 free_space; + __u64 phy_cap; /* physical capacity, in unit of sector */ + __u64 phy_space; /* physical space considering OP, in unit of sector */ + __u64 user_space; /* user required space, in unit of sector*/ + __u64 hw_used; /* hw space used in 4K */ + __u64 app_written; /* app data written in 4K */ + __u64 out_of_space; + __u64 map_unit; + __u64 max_user_space; + __u64 extendible_user_cap_lba_count; + __u64 friendly_change_cap_support; +}; + +struct nvme_capacity_info { + __u64 lba_sec_sz; + __u64 phy_sec_sz; + __u64 used_space; + __u64 free_space; +}; + +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; + }; + __u8 _rp; +}; + +struct __packed sfx_lat_stats_vanda { + __u16 maj; + __u16 min; + __u32 bucket_1[32]; /* 0~1ms, step 32us */ + __u32 bucket_2[31]; /* 1~32ms, step 1ms */ + __u32 bucket_3[31]; /* 32ms~1s, step 32ms */ + __u32 bucket_4[1]; /* 1s~2s, specifically 1024ms~2047ms */ + __u32 bucket_5[1]; /* 2s~4s, specifically 2048ms~4095ms */ + __u32 bucket_6[1]; /* 4s+, specifically 4096ms+ */ +}; + +struct __packed sfx_lat_stats_myrtle { + __u16 maj; + __u16 min; + __u32 bucket_1[64]; /* 0us~63us, step 1us */ + __u32 bucket_2[64]; /* 63us~127us, step 1us */ + __u32 bucket_3[64]; /* 127us~255us, step 2us */ + __u32 bucket_4[64]; /* 255us~510us, step 4us */ + __u32 bucket_5[64]; /* 510us~1.02ms step 8us */ + __u32 bucket_6[64]; /* 1.02ms~2.04ms step 16us */ + __u32 bucket_7[64]; /* 2.04ms~4.08ms step 32us */ + __u32 bucket_8[64]; /* 4.08ms~8.16ms step 64us */ + __u32 bucket_9[64]; /* 8.16ms~16.32ms step 128us */ + __u32 bucket_10[64]; /* 16.32ms~32.64ms step 256us */ + __u32 bucket_11[64]; /* 32.64ms~65.28ms step 512us */ + __u32 bucket_12[64]; /* 65.28ms~130.56ms step 1.024ms */ + __u32 bucket_13[64]; /* 130.56ms~261.12ms step 2.048ms */ + __u32 bucket_14[64]; /* 261.12ms~522.24ms step 4.096ms */ + __u32 bucket_15[64]; /* 522.24ms~1.04s step 8.192ms */ + __u32 bucket_16[64]; /* 1.04s~2.09s step 16.384ms */ + __u32 bucket_17[64]; /* 2.09s~4.18s step 32.768ms */ + __u32 bucket_18[64]; /* 4.18s~8.36s step 65.536ms */ + __u32 bucket_19[64]; /* 8.36s~ step 131.072ms */ + __u64 average; /* average latency statistics */ +}; + + +struct __packed sfx_lat_status_ver { + __u16 maj; + __u16 min; +}; + +struct sfx_lat_stats { + union { + struct sfx_lat_status_ver ver; + struct sfx_lat_stats_vanda vanda; + struct sfx_lat_stats_myrtle myrtle; + }; +}; + +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_additional_smart_log_item raid_recover_cnt; + /* errors which can be recovered by RAID */ + struct nvme_additional_smart_log_item prog_timeout_cnt; + struct nvme_additional_smart_log_item erase_timeout_cnt; + struct nvme_additional_smart_log_item read_timeout_cnt; + struct nvme_additional_smart_log_item read_ecc_cnt; /* retry cnt */ + struct nvme_additional_smart_log_item non_media_crc_err_cnt; + struct nvme_additional_smart_log_item compression_path_err_cnt; + struct nvme_additional_smart_log_item out_of_space_flag; + struct nvme_additional_smart_log_item physical_usage_ratio; + struct nvme_additional_smart_log_item grown_bb; /* grown bad block */ +}; + + +struct __packed extended_health_info_myrtle { + __u32 soft_read_recoverable_errs; + __u32 flash_die_raid_recoverable_errs; + __u32 pcie_rx_correct_errs; + __u32 pcie_rx_uncorrect_errs; + __u32 data_read_from_flash; + __u32 data_write_to_flash; + __u32 temp_throttle_info;// bit0: 0--> normal, 1 --> throttled + // bit 31:1 --> throttle events count, resets on power cycle + __u32 power_consumption; + __u32 pf_bbd_read_cnt; + __u32 sfx_critical_warning; + __u32 raid_recovery_total_count; + __u32 rsvd; + __u8 opn[32]; + __u64 total_physical_capability; + __u64 free_physical_capability; + __u32 physical_usage_ratio; + __u32 comp_ratio; + __u32 otp_rsa_en; + __u32 power_mw_consumption; + __u32 io_speed; + __u64 max_formatted_capability; + __u32 map_unit; + __u64 extendible_cap_lbacount; + __u32 friendly_changecap_support; + __u32 rvd1; + __u64 cur_formatted_capability; +}; + + diff --git a/plugins/seagate/seagate-nvme.c b/plugins/seagate/seagate-nvme.c index 887e5bc..96bbbb6 100644 --- a/plugins/seagate/seagate-nvme.c +++ b/plugins/seagate/seagate-nvme.c @@ -1078,6 +1078,7 @@ static int temp_stats(int argc, char **argv, struct command *cmd, struct plugin int index; const char *desc = "Retrieve Seagate Temperature Stats information for the given device "; const char *output_format = "output in binary format"; + nvme_print_flags_t flags; unsigned int temperature = 0, PcbTemp = 0, SocTemp = 0, scCurrentTemp = 0, scMaxTemp = 0; unsigned long long maxTemperature = 0, MaxSocTemp = 0; struct nvme_dev *dev; @@ -1100,7 +1101,13 @@ static int temp_stats(int argc, char **argv, struct command *cmd, struct plugin return -1; } - if (strcmp(cfg.output_format, "json")) + err = validate_output_format(cfg.output_format, &flags); + if (err < 0) { + nvme_show_error("Invalid output format"); + return err; + } + + if (flags & NORMAL) printf("Seagate Temperature Stats Information :\n"); /*STEP-1 : Get Current Temperature from SMART */ err = nvme_get_log_smart(dev_fd(dev), 0xffffffff, false, &smart_log); @@ -1111,7 +1118,7 @@ static int temp_stats(int argc, char **argv, struct command *cmd, struct plugin PcbTemp = PcbTemp ? PcbTemp - 273 : 0; SocTemp = le16_to_cpu(smart_log.temp_sensor[1]); SocTemp = SocTemp ? SocTemp - 273 : 0; - if (strcmp(cfg.output_format, "json")) { + if (flags & NORMAL) { printf("%-20s : %u C\n", "Current Temperature", temperature); printf("%-20s : %u C\n", "Current PCB Temperature", PcbTemp); printf("%-20s : %u C\n", "Current SOC Temperature", SocTemp); @@ -1126,14 +1133,14 @@ static int temp_stats(int argc, char **argv, struct command *cmd, struct plugin if (ExtdSMARTInfo.vendorData[index].AttributeNumber == VS_ATTR_ID_MAX_LIFE_TEMPERATURE) { maxTemperature = smart_attribute_vs(ExtdSMARTInfo.Version, ExtdSMARTInfo.vendorData[index]); maxTemperature = maxTemperature ? maxTemperature - 273 : 0; - if (strcmp(cfg.output_format, "json")) + if (flags & NORMAL) printf("%-20s : %d C\n", "Highest Temperature", (unsigned int)maxTemperature); } if (ExtdSMARTInfo.vendorData[index].AttributeNumber == VS_ATTR_ID_MAX_SOC_LIFE_TEMPERATURE) { MaxSocTemp = smart_attribute_vs(ExtdSMARTInfo.Version, ExtdSMARTInfo.vendorData[index]); MaxSocTemp = MaxSocTemp ? MaxSocTemp - 273 : 0; - if (strcmp(cfg.output_format, "json")) + if (flags & NORMAL) printf("%-20s : %d C\n", "Max SOC Temperature", (unsigned int)MaxSocTemp); } } @@ -1155,7 +1162,7 @@ static int temp_stats(int argc, char **argv, struct command *cmd, struct plugin printf("%-20s : %d C\n", "Super-cap Max Temperature", scMaxTemp); } - if (!strcmp(cfg.output_format, "json")) + if (flags & JSON) json_temp_stats(temperature, PcbTemp, SocTemp, maxTemperature, MaxSocTemp, cf_err, scCurrentTemp, scMaxTemp); dev_close(dev); @@ -1248,6 +1255,7 @@ static int vs_pcie_error_log(int argc, char **argv, struct command *cmd, struct const char *desc = "Retrieve Seagate PCIe error counters for the given device "; const char *output_format = "output in binary format"; int err; + nvme_print_flags_t flags; struct config { char *output_format; }; @@ -1267,13 +1275,19 @@ static int vs_pcie_error_log(int argc, char **argv, struct command *cmd, struct return -1; } - if (strcmp(cfg.output_format, "json")) + err = validate_output_format(cfg.output_format, &flags); + if (err < 0) { + nvme_show_error("Invalid output format"); + return err; + } + + if (flags & NORMAL) printf("Seagate PCIe error counters Information :\n"); err = nvme_get_log_simple(dev_fd(dev), 0xCB, sizeof(pcieErrorLog), &pcieErrorLog); if (!err) { - if (strcmp(cfg.output_format, "json")) + if (flags & NORMAL) print_vs_pcie_error_log(pcieErrorLog); else json_vs_pcie_error_log(pcieErrorLog); @@ -1386,6 +1400,7 @@ static int stx_vs_fw_activate_history(int argc, char **argv, struct command *cmd const char *desc = "Retrieve FW Activate History for Seagate device "; const char *output_format = "output in binary format"; int err; + nvme_print_flags_t flags; struct config { char *output_format; }; @@ -1405,16 +1420,21 @@ static int stx_vs_fw_activate_history(int argc, char **argv, struct command *cmd return -1; } - if (strcmp(cfg.output_format, "json")) + err = validate_output_format(cfg.output_format, &flags); + if (err < 0) { + nvme_show_error("Invalid output format"); + return err; + } + + if (flags & NORMAL) printf("Seagate FW Activation History Information :\n"); err = nvme_get_log_simple(dev_fd(dev), 0xC2, sizeof(fwActivHis), &fwActivHis); if (!err) { - if (strcmp(cfg.output_format, "json")) + if (flags & NORMAL) print_stx_vs_fw_activate_history(fwActivHis); else json_stx_vs_fw_activate_history(fwActivHis); - } else if (err > 0) { nvme_show_status(err); } diff --git a/plugins/sed/sed.c b/plugins/sed/sed.c index 0471e54..b4ac037 100644 --- a/plugins/sed/sed.c +++ b/plugins/sed/sed.c @@ -23,6 +23,12 @@ OPT_ARGS(no_opts) = { OPT_END() }; +OPT_ARGS(init_opts) = { + OPT_FLAG("read-only", 'r', &sedopal_lock_ro, + "Set locking range to read-only"), + OPT_END() +}; + OPT_ARGS(key_opts) = { OPT_FLAG("ask-key", 'k', &sedopal_ask_key, "prompt for SED authentication key"), @@ -36,6 +42,21 @@ OPT_ARGS(revert_opts) = { OPT_END() }; +OPT_ARGS(lock_opts) = { + OPT_FLAG("read-only", 'r', &sedopal_lock_ro, + "Set locking range to read-only"), + OPT_FLAG("ask-key", 'k', &sedopal_ask_key, + "prompt for SED authentication key"), + OPT_END() +}; + +OPT_ARGS(discovery_opts) = { + OPT_FLAG("verbose", 'v', &sedopal_discovery_verbose, + "Print extended discovery information"), + OPT_FLAG("udev", 'u', &sedopal_discovery_udev, + "Print locking information in form suitable for udev rules"), + OPT_END() +}; /* * Open the NVMe device specified on the command line. It must be the @@ -67,7 +88,7 @@ static int sed_opal_discover(int argc, char **argv, struct command *cmd, const char *desc = "Query SED device and display locking features"; struct nvme_dev *dev; - err = sed_opal_open_device(&dev, argc, argv, desc, no_opts); + err = sed_opal_open_device(&dev, argc, argv, desc, discovery_opts); if (err) return err; @@ -84,12 +105,12 @@ static int sed_opal_initialize(int argc, char **argv, struct command *cmd, const char *desc = "Initialize a SED device for locking"; struct nvme_dev *dev; - err = sed_opal_open_device(&dev, argc, argv, desc, no_opts); + err = sed_opal_open_device(&dev, argc, argv, desc, init_opts); if (err) return err; err = sedopal_cmd_initialize(dev->direct.fd); - if (err != 0) + if ((err != 0) && (err != -EOPNOTSUPP)) fprintf(stderr, "initialize: SED error - %s\n", sedopal_error_to_text(err)); @@ -109,7 +130,7 @@ static int sed_opal_revert(int argc, char **argv, struct command *cmd, return err; err = sedopal_cmd_revert(dev->direct.fd); - if (err != 0) + if ((err != 0) && (err != -EOPNOTSUPP)) fprintf(stderr, "revert: SED error - %s\n", sedopal_error_to_text(err)); @@ -124,12 +145,12 @@ static int sed_opal_lock(int argc, char **argv, struct command *cmd, const char *desc = "Lock a SED device"; struct nvme_dev *dev; - err = sed_opal_open_device(&dev, argc, argv, desc, key_opts); + err = sed_opal_open_device(&dev, argc, argv, desc, lock_opts); if (err) return err; err = sedopal_cmd_lock(dev->direct.fd); - if (err != 0) + if ((err != 0) && (err != -EOPNOTSUPP)) fprintf(stderr, "lock: SED error - %s\n", sedopal_error_to_text(err)); @@ -144,12 +165,12 @@ static int sed_opal_unlock(int argc, char **argv, struct command *cmd, const char *desc = "Unlock a SED device"; struct nvme_dev *dev; - err = sed_opal_open_device(&dev, argc, argv, desc, key_opts); + err = sed_opal_open_device(&dev, argc, argv, desc, lock_opts); if (err) return err; err = sedopal_cmd_unlock(dev->direct.fd); - if (err != 0) + if ((err != 0) && (err != -EOPNOTSUPP)) fprintf(stderr, "unlock: SED error - %s\n", sedopal_error_to_text(err)); diff --git a/plugins/sed/sedopal_cmd.c b/plugins/sed/sedopal_cmd.c index 017649d..8d931b9 100644 --- a/plugins/sed/sedopal_cmd.c +++ b/plugins/sed/sedopal_cmd.c @@ -34,6 +34,46 @@ bool sedopal_destructive_revert; */ bool sedopal_psid_revert; +/* + * Lock read-only + */ +bool sedopal_lock_ro; + +/* + * Verbose discovery + */ +bool sedopal_discovery_verbose; + +/* + * discovery with udev output + */ +bool sedopal_discovery_udev; + +/* + * level 0 discovery buffer + */ +char level0_discovery_buf[4096]; + +struct sedopal_feature_parser { + uint32_t features; + void *tper_desc; + void *locking_desc; + void *geometry_reporting_desc; + void *opalv1_desc; + void *single_user_mode_desc; + void *datastore_desc; + void *opalv2_desc; + void *opalite_desc; + void *pyrite_v1_desc; + void *pyrite_v2_desc; + void *ruby_desc; + void *locking_lba_desc; + void *block_sid_auth_desc; + void *config_ns_desc; + void *data_removal_desc; + void *ns_geometry_desc; +}; + /* * Map method status codes to error text */ @@ -170,6 +210,15 @@ int sedopal_cmd_initialize(int fd) struct opal_lr_act lr_act = {}; struct opal_user_lr_setup lr_setup = {}; struct opal_new_pw new_pw = {}; + uint8_t locking_state; + + locking_state = sedopal_locking_state(fd); + + if (locking_state & OPAL_FEATURE_LOCKING_ENABLED) { + fprintf(stderr, + "Error: cannot initialize an initialized drive\n"); + return -EOPNOTSUPP; + } sedopal_ask_key = true; sedopal_ask_new_key = true; @@ -206,7 +255,8 @@ int sedopal_cmd_initialize(int fd) lr_setup.range_start = 0; lr_setup.range_length = 0; lr_setup.RLE = true; - lr_setup.WLE = true; + if (!sedopal_lock_ro) + lr_setup.WLE = true; lr_setup.session.opal_key = key; lr_setup.session.sum = 0; @@ -242,8 +292,12 @@ int sedopal_cmd_initialize(int fd) */ int sedopal_cmd_lock(int fd) { + int lock_state = OPAL_LK; - return sedopal_lock_unlock(fd, OPAL_LK); + if (sedopal_lock_ro) + lock_state = OPAL_RO; + + return sedopal_lock_unlock(fd, lock_state); } /* @@ -252,8 +306,12 @@ int sedopal_cmd_lock(int fd) int sedopal_cmd_unlock(int fd) { int rc; + int lock_state = OPAL_RW; - rc = sedopal_lock_unlock(fd, OPAL_RW); + if (sedopal_lock_ro) + lock_state = OPAL_RO; + + rc = sedopal_lock_unlock(fd, lock_state); /* * If the unlock was successful, force a re-read of the @@ -275,6 +333,15 @@ int sedopal_lock_unlock(int fd, int lock_state) { int rc; struct opal_lock_unlock opal_lu = {}; + uint8_t locking_state; + + locking_state = sedopal_locking_state(fd); + + if (!(locking_state & OPAL_FEATURE_LOCKING_ENABLED)) { + fprintf(stderr, + "Error: cannot lock/unlock an uninitialized drive\n"); + return -EOPNOTSUPP; + } rc = sedopal_set_key(&opal_lu.session.opal_key); if (rc != 0) @@ -389,6 +456,21 @@ int sedopal_cmd_revert(int fd) } else { #ifdef IOC_OPAL_REVERT_LSP struct opal_revert_lsp revert_lsp; + uint8_t locking_state; + + locking_state = sedopal_locking_state(fd); + + if (!(locking_state & OPAL_FEATURE_LOCKING_ENABLED)) { + fprintf(stderr, + "Error: can't revert an uninitialized drive\n"); + return -EOPNOTSUPP; + } + + if (locking_state & OPAL_FEATURE_LOCKED) { + fprintf(stderr, + "Error: cannot revert drive while locked\n"); + return -EOPNOTSUPP; + } rc = sedopal_set_key(&revert_lsp.key); if (rc != 0) @@ -470,36 +552,462 @@ int sedopal_cmd_password(int fd) /* * Print the state of locking features. */ -void sedopal_print_locking_features(uint8_t features) +void sedopal_print_locking_features(void *data) { - printf("Locking Features:\n"); - printf("\tLocking Supported: %s\n", - (features & OPAL_FEATURE_LOCKING_SUPPORTED) ? "Yes" : "No"); - printf("\tLocking Feature Enabled: %s\n", - (features & OPAL_FEATURE_LOCKING_ENABLED) ? "Yes" : "No"); - printf("\tLocked: %s\n", - (features & OPAL_FEATURE_LOCKED) ? "Yes" : "No"); + struct locking_desc *ld = (struct locking_desc *)data; + uint8_t features = ld->features; + + if (!sedopal_discovery_udev) { + printf("Locking Features:\n"); + printf("\tLocking Supported : %s\n", + (features & OPAL_FEATURE_LOCKING_SUPPORTED) ? + "yes" : "no"); + printf("\tLocking Feature Enabled : %s\n", + (features & OPAL_FEATURE_LOCKING_ENABLED) ? + "yes" : "no"); + printf("\tLocked : %s\n", + (features & OPAL_FEATURE_LOCKED) ? "yes" : "no"); + printf("\tMedia Encryption : %s\n", + (features & OPAL_FEATURE_MEDIA_ENCRYPT) ? "yes" : "no"); + printf("\tMBR Enabled : %s\n", + (features & OPAL_FEATURE_MBR_ENABLED) ? "yes" : "no"); + printf("\tMBR Done : %s\n", + (features & OPAL_FEATURE_MBR_DONE) ? "yes" : "no"); + } else { + printf("DEV_SED_LOCKED=%s\n", + (features & OPAL_FEATURE_LOCKING_ENABLED) ? + "ENABLED" : "DISABLED"); + printf("DEV_SED_LOCKING=%s\n", + (features & OPAL_FEATURE_LOCKING_ENABLED) ? + "ENABLED" : "DISABLED"); + printf("DEV_SED_LOCKING_SUPP=%s\n", + (features & OPAL_FEATURE_LOCKING_SUPPORTED) ? + "ENABLED" : "DISABLED"); + printf("DEV_SED_LOCKING_LOCKED=%s\n", + (features & OPAL_FEATURE_LOCKED) ? + "ENABLED" : "DISABLED"); + } } /* - * Query a drive to determine if it's SED Opal capable and - * it's current locking status. + * Print the TPer feature. */ -int sedopal_cmd_discover(int fd) +void sedopal_print_tper(void *data) +{ + struct tper_desc *td = (struct tper_desc *)data; + + printf("\nSED TPER:\n"); + printf("\tSync Supported : %s\n", + (td->feature & TPER_FEATURE_SYNC) ? "yes" : "no"); + printf("\tAsync Supported : %s\n", + (td->feature & TPER_FEATURE_ASYNC) ? "yes" : "no"); + printf("\tACK/NAK Supported : %s\n", + (td->feature & TPER_FEATURE_ACKNAK) ? "yes" : "no"); + printf("\tBuffer Management Supported : %s\n", + (td->feature & TPER_FEATURE_BUF_MGMT) ? "yes" : "no"); + printf("\tStreaming Supported : %s\n", + (td->feature & TPER_FEATURE_STREAMING) ? "yes" : "no"); + printf("\tComID Management Supported : %s\n", + (td->feature & TPER_FEATURE_COMID_MGMT) ? "yes" : "no"); +} + +/* + * Print the Geometry feature. + */ +void sedopal_print_geometry(void *data) +{ + struct geometry_reporting_desc *gd; + + gd = (struct geometry_reporting_desc *)data; + + printf("\nSED Geometry:\n"); + printf("\tAlignment Required : %s\n", + (gd->align & GEOMETRY_ALIGNMENT_REQUIRED) ? "yes" : "no"); + printf("\tLogical Block Size : %u\n", + be32toh(gd->logical_block_size)); + printf("\tAlignment Granularity : %llx\n", + (unsigned long long)(be64toh(gd->alignment_granularity))); + printf("\tLowest Aligned LBA : %llx\n", + (unsigned long long)(be64toh(gd->lowest_aligned_lba))); +} + +/* + * Print the opal v1 feature. + */ +void sedopal_print_opal_v1(void *data) +{ + struct opalv1_desc *v1d = (struct opalv1_desc *)data; + + printf("\nSED OPAL V1.0:\n"); + printf("\tBase Comid : %d\n", + be16toh(v1d->base_comid)); + printf("\tNumber of Comids : %d\n", + be16toh(v1d->num_comids)); +} + +/* + * Print the opal v2 feature. + */ +void sedopal_print_opal_v2(void *data) +{ + struct opalv2_desc *v2d = (struct opalv2_desc *)data; + + printf("\nSED OPAL V2.0:\n"); + printf("\tRange Crossing : %d\n", + !(v2d->flags & OPAL_V2_RANGE_CROSSING)); + printf("\tBase Comid : %d\n", + be16toh(v2d->base_comid)); + printf("\tNumber of Comids : %d\n", + be16toh(v2d->num_comids)); + printf("\tNumber of Admin Authorities : %d\n", + be16toh(v2d->num_locking_sp_admin_auth)); + printf("\tNumber of User Authorities : %d\n", + be16toh(v2d->num_locking_sp_user_auth)); + printf("\tInit pin : %d\n", + v2d->initial_cpin_sid_ind); + printf("\tRevert pin : %d\n", + v2d->initial_cpin_sid_revert); +} + +/* + * Print the ruby feature. + */ +void sedopal_print_ruby(void *data) +{ + struct ruby_desc *rd = (struct ruby_desc *)data; + + printf("\nRuby:\n"); + printf("\tRange Crossing : %d\n", + !(rd->flags & RUBY_RANGE_CROSSING)); + printf("\tBase Comid : %d\n", + be16toh(rd->base_comid)); + printf("\tNumber of Comids : %d\n", + be16toh(rd->num_comids)); + printf("\tNumber of Admin Authorities : %d\n", + be16toh(rd->num_locking_sp_admin_auth)); + printf("\tNumber of User Authorities : %d\n", + be16toh(rd->num_locking_sp_user_auth)); + printf("\tInit pin : %d\n", + rd->initial_cpin_sid_ind); + printf("\tRevert pin : %d\n", + rd->initial_cpin_sid_revert); +} + +/* + * Print the opalite feature. + */ +void sedopal_print_opalite(void *data) +{ + struct opalite_desc *old = (struct opalite_desc *)data; + + printf("\nSED Opalite:\n"); + printf("\tBase Comid : %d\n", + be16toh(old->base_comid)); + printf("\tNumber of Comids : %d\n", + be16toh(old->num_comids)); + printf("\tInit pin : %d\n", + old->initial_cpin_sid_ind); + printf("\tRevert pin : %d\n", + old->initial_cpin_sid_revert); +} + +/* + * Print the pyrite v1 feature. + */ +void sedopal_print_pyrite_v1(void *data) +{ + struct pyrite_v1_desc *p1d = (struct pyrite_v1_desc *)data; + + printf("\nPyrite V1:\n"); + printf("\tBase Comid : %d\n", + be16toh(p1d->base_comid)); + printf("\tNumber of Comids : %d\n", + be16toh(p1d->num_comids)); + printf("\tInit pin : %d\n", + p1d->initial_cpin_sid_ind); + printf("\tRevert pin : %d\n", + p1d->initial_cpin_sid_revert); +} + +/* + * Print the pyrite v2 feature. + */ +void sedopal_print_pyrite_v2(void *data) +{ + struct pyrite_v2_desc *p2d = (struct pyrite_v2_desc *)data; + + printf("\nPyrite V2:\n"); + printf("\tBase Comid : %d\n", + be16toh(p2d->base_comid)); + printf("\tNumber of Comids : %d\n", + be16toh(p2d->num_comids)); + printf("\tInit pin : %d\n", + p2d->initial_cpin_sid_ind); + printf("\tRevert pin : %d\n", + p2d->initial_cpin_sid_revert); +} + +/* + * Print the single user mode feature. + */ +void sedopal_print_sum(void *data) +{ + struct single_user_mode_desc *sumd; + + sumd = (struct single_user_mode_desc *)data; + + printf("\nSingle User Mode (SUM):\n"); + printf("\tNumber of Locking Objects : %u\n", + be32toh(sumd->num_locking_objects)); + printf("\tAny Locking Objects in SUM? : %s\n", + (sumd->flags & SUM_FEATURE_ANY) ? "yes" : "no"); + printf("\tAll Locking Objects in SUM? : %s\n", + (sumd->flags & SUM_FEATURE_ALL) ? "yes" : "no"); + printf("\tUser Authority of Objects : %s\n", + (sumd->flags & SUM_FEATURE_POLICY) ? "yes" : "no"); +} + +/* + * Print the data store table feature. + */ +void sedopal_print_datastore(void *data) +{ + struct datastore_desc *dsd = (struct datastore_desc *)data; + + printf("\nData Store Table:\n"); + printf("\tNumber of Tables Supported : %u\n", + be16toh(dsd->max_tables)); + printf("\tMax Size of Tables : %u\n", + be32toh(dsd->max_table_size)); + printf("\tTable Size Alignment : %u\n", + be32toh(dsd->table_alignment)); +} + +/* + * Print the block SID authentication feature. + */ +void sedopal_print_sid_auth(void *data) +{ + struct block_sid_auth_desc *sid_auth_d; + + sid_auth_d = (struct block_sid_auth_desc *)data; + + printf("\nSED Block SID Authentication:\n"); + printf("\tSID value equal MSID : %s\n", + (sid_auth_d->states & BLOCK_SID_VALUE_STATE) ? "yes" : "no"); + printf("\tSID auth blocked : %s\n", + (sid_auth_d->states & BLOCK_SID_BLOCKED_STATE) ? "yes" : "no"); + printf("\tHW reset selected : %s\n", + (sid_auth_d->hw_reset & BLOCK_SID_HW_RESET) ? "yes" : "no"); +} + +/* + * Print the Locking LBA Ranges Control feature + */ +void sedopal_print_locking_lba(void *data) +{ + /* + * There currently isn't any definition of the level 0 content + * of this feature, so defer any printing. + */ +} + +/* + * Print the configurable namespace locking feature. + */ +void sedopal_print_config_ns(void *data) +{ + struct config_ns_desc *nsd = (struct config_ns_desc *)data; + + printf("\nSED Configurable Namespace Locking:\n"); + printf("\tNon-global Locking Support : %s\n", + (nsd->flags & CONFIG_NS_RANGE_C) ? "yes" : "no"); + printf("\tNon-global Lock objects exist : %s\n", + (nsd->flags & CONFIG_NS_RANGE_P) ? "yes" : "no"); + printf("\tMaximum Key Count : %d\n", + be32toh(nsd->max_key_count)); + printf("\tUnused Key Count : %d\n", + be32toh(nsd->unused_key_count)); +} + +/* + * Print the data removal mechanism feature. + */ +void sedopal_print_data_removal(void *data) +{ + struct data_removal_desc *drd = (struct data_removal_desc *)data; + + printf("\nSED Data Removal Mechanism:\n"); + printf("\tRemoval Operation Processing : %s\n", + (drd->flags & DATA_REMOVAL_OPER_PROCESSING) ? "yes" : "no"); + printf("\tRemoval Operation Interrupted : %s\n", + (drd->flags & DATA_REMOVAL_OPER_INTERRUPTED) ? "yes" : "no"); + printf("\tData Removal Mechanism : %x\n", + drd->removal_mechanism); + printf("\tData Removal Format : %x\n", + drd->format); + printf("\tData Removal Time (Bit 0) : %x\n", + be16toh(drd->time_mechanism_bit0)); + printf("\tData Removal Time (Bit 1) : %x\n", + be16toh(drd->time_mechanism_bit1)); + printf("\tData Removal Time (Bit 2) : %x\n", + be16toh(drd->time_mechanism_bit2)); + printf("\tData Removal Time (Bit 5) : %x\n", + be16toh(drd->time_mechanism_bit5)); +} + +/* + * Print the namespace geometry feature. + */ +void sedopal_print_ns_geometry(void *data) +{ + struct ns_geometry_desc *nsgd = (struct ns_geometry_desc *)data; + + printf("\nSED Namespace Geometry:\n"); + printf("\tAlignment Required : %s\n", + (nsgd->align & NS_GEOMETRY_ALIGNMENT_REQUIRED) ? "yes" : "no"); + printf("\tLogical Block Size : %x\n", + be32toh(nsgd->logical_block_size)); + printf("\tAlignment Granularity : %llx\n", + (unsigned long long)(be64toh(nsgd->alignment_granularity))); + printf("\tLowest Aligned LBA : %llx\n", + (unsigned long long)(be64toh(nsgd->lowest_aligned_lba))); +} + +void sedopal_parse_features(struct level_0_discovery_features *feat, + struct sedopal_feature_parser *sfp) +{ + uint16_t code = be16toh(feat->code); + + switch (code) { + case OPAL_FEATURE_CODE_LOCKING: + sfp->features |= OPAL_FEATURE_LOCKING; + sfp->locking_desc = (void *)(feat + 1); + break; + case OPAL_FEATURE_CODE_OPALV1: + sfp->features |= OPAL_FEATURE_OPALV1; + sfp->opalv1_desc = (void *)(feat + 1); + break; + case OPAL_FEATURE_CODE_OPALV2: + sfp->features |= OPAL_FEATURE_OPALV2; + sfp->opalv2_desc = (void *)(feat + 1); + break; + case OPAL_FEATURE_CODE_TPER: + sfp->features |= OPAL_FEATURE_TPER; + sfp->tper_desc = (void *)(feat + 1); + break; + case OPAL_FEATURE_CODE_GEOMETRY: + sfp->features |= OPAL_FEATURE_GEOMETRY; + sfp->geometry_reporting_desc = (void *)(feat + 1); + break; + case OPAL_FEATURE_CODE_SINGLE_USER_MODE: + sfp->features |= OPAL_FEATURE_SINGLE_USER_MODE; + sfp->single_user_mode_desc = (void *)(feat + 1); + break; + case OPAL_FEATURE_CODE_DATA_STORE: + sfp->features |= OPAL_FEATURE_DATA_STORE; + sfp->datastore_desc = (void *)(feat + 1); + break; + case OPAL_FEATURE_CODE_OPALITE: + sfp->features |= OPAL_FEATURE_OPALITE; + sfp->opalite_desc = (void *)(feat + 1); + break; + case OPAL_FEATURE_CODE_PYRITE_V1: + sfp->features |= OPAL_FEATURE_PYRITE_V1; + sfp->pyrite_v1_desc = (void *)(feat + 1); + break; + case OPAL_FEATURE_CODE_PYRITE_V2: + sfp->features |= OPAL_FEATURE_PYRITE_V2; + sfp->pyrite_v2_desc = (void *)(feat + 1); + break; + case OPAL_FEATURE_CODE_RUBY: + sfp->features |= OPAL_FEATURE_RUBY; + sfp->ruby_desc = (void *)(feat + 1); + break; + case OPAL_FEATURE_CODE_LOCKING_LBA: + sfp->features |= OPAL_FEATURE_LOCKING_LBA; + sfp->locking_lba_desc = (void *)(feat + 1); + break; + case OPAL_FEATURE_CODE_BLOCK_SID_AUTH: + sfp->features |= OPAL_FEATURE_BLOCK_SID_AUTH; + sfp->block_sid_auth_desc = (void *)(feat + 1); + break; + case OPAL_FEATURE_CODE_CONFIG_NS_LOCKING: + sfp->features |= OPAL_FEATURE_CONFIG_NS_LOCKING; + sfp->config_ns_desc = (void *)(feat + 1); + break; + case OPAL_FEATURE_CODE_DATA_REMOVAL: + sfp->features |= OPAL_FEATURE_DATA_REMOVAL; + sfp->data_removal_desc = (void *)(feat + 1); + break; + case OPAL_FEATURE_CODE_NS_GEOMETRY: + sfp->features |= OPAL_FEATURE_NS_GEOMETRY; + sfp->ns_geometry_desc = (void *)(feat + 1); + break; + + default: + break; + } +} + +void sedopal_print_features(struct sedopal_feature_parser *sfp) +{ + if (sfp->features & OPAL_FEATURE_OPALV1) + sedopal_print_opal_v1(sfp->opalv1_desc); + + if (sfp->features & OPAL_FEATURE_OPALV2) + sedopal_print_opal_v2(sfp->opalv2_desc); + + if (sfp->features & OPAL_FEATURE_TPER) + sedopal_print_tper(sfp->tper_desc); + + if (sfp->features & OPAL_FEATURE_GEOMETRY) + sedopal_print_geometry(sfp->geometry_reporting_desc); + + if (sfp->features & OPAL_FEATURE_OPALITE) + sedopal_print_opalite(sfp->opalite_desc); + + if (sfp->features & OPAL_FEATURE_SINGLE_USER_MODE) + sedopal_print_sum(sfp->single_user_mode_desc); + + if (sfp->features & OPAL_FEATURE_DATA_STORE) + sedopal_print_datastore(sfp->datastore_desc); + + if (sfp->features & OPAL_FEATURE_BLOCK_SID_AUTH) + sedopal_print_sid_auth(sfp->block_sid_auth_desc); + + if (sfp->features & OPAL_FEATURE_RUBY) + sedopal_print_ruby(sfp->ruby_desc); + + if (sfp->features & OPAL_FEATURE_PYRITE_V1) + sedopal_print_pyrite_v1(sfp->pyrite_v1_desc); + + if (sfp->features & OPAL_FEATURE_PYRITE_V2) + sedopal_print_pyrite_v2(sfp->pyrite_v2_desc); + + if (sfp->features & OPAL_FEATURE_LOCKING_LBA) + sedopal_print_locking_lba(sfp->locking_lba_desc); + + if (sfp->features & OPAL_FEATURE_CONFIG_NS_LOCKING) + sedopal_print_config_ns(sfp->config_ns_desc); + + if (sfp->features & OPAL_FEATURE_NS_GEOMETRY) + sedopal_print_ns_geometry(sfp->ns_geometry_desc); +} + +/* + * Query a drive to retrieve it's level 0 features. + */ +int sedopal_discover_device(int fd, struct level_0_discovery_features **feat, + struct level_0_discovery_features **feat_end) { #ifdef IOC_OPAL_DISCOVERY - int rc, feat_length; - bool sedopal_locking_supported = false; + int rc; struct opal_discovery discover; struct level_0_discovery_header *dh; - struct level_0_discovery_features *feat; - struct level_0_discovery_features *feat_end; - uint16_t code; - uint8_t locking_flags = 0; - char buf[4096]; - discover.data = (__u64)buf; - discover.size = sizeof(buf); + discover.data = (uintptr_t)level0_discovery_buf; + discover.size = sizeof(level0_discovery_buf); rc = ioctl(fd, IOC_OPAL_DISCOVERY, &discover); if (rc < 0) { @@ -513,41 +1021,89 @@ int sedopal_cmd_discover(int fd) * * TCG Opal Specification v2.0.2 section 3.1.1 */ - dh = (struct level_0_discovery_header *)buf; - feat = (struct level_0_discovery_features *)(dh + 1); - feat_end = (struct level_0_discovery_features *) - (buf + be32toh(dh->parameter_length)); + dh = (struct level_0_discovery_header *)level0_discovery_buf; + *feat = (struct level_0_discovery_features *)(dh + 1); + *feat_end = (struct level_0_discovery_features *) + (level0_discovery_buf + be32toh(dh->parameter_length)); - /* - * iterate through all the features that were returned - */ - 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; - break; - case OPAL_FEATURE_CODE_OPALV2: - sedopal_locking_supported = true; - break; - default: - break; - } - - feat = (struct level_0_discovery_features *)((char *)feat + feat_length); - } - - rc = 0; - if (!sedopal_locking_supported) { - fprintf(stderr, "Error: device does not support SED Opal\n"); - rc = -1; - } else - sedopal_print_locking_features(locking_flags); - - return rc; + return 0 + ; #else /* IOC_OPAL_DISCOVERY */ fprintf(stderr, "ERROR : NVMe device discovery is not supported\n"); return -EOPNOTSUPP; #endif } + +/* + * Query a drive to determine if it's SED Opal capable and + * it's current locking status. + */ +int sedopal_cmd_discover(int fd) +{ + int rc, feat_length; + struct level_0_discovery_features *feat; + struct level_0_discovery_features *feat_end; + struct sedopal_feature_parser sfp = {}; + + rc = sedopal_discover_device(fd, &feat, &feat_end); + if (rc != 0) + return rc; + + /* + * iterate through all the features that were returned + */ + while (feat < feat_end) { + sedopal_parse_features(feat, &sfp); + feat_length = feat->length + 4 /* hdr */; + feat = (struct level_0_discovery_features *) + ((char *)feat + feat_length); + } + + rc = 0; + if (!(sfp.features & OPAL_SED_LOCKING_SUPPORT)) { + fprintf(stderr, "Error: device does not support SED Opal\n"); + rc = -1; + } else + sedopal_print_locking_features(sfp.locking_desc); + + if (!sedopal_discovery_verbose) + return rc; + + sedopal_print_features(&sfp); + + + return rc; +} + +/* + * Query a drive to determine its locking state + */ +int sedopal_locking_state(int fd) +{ + int rc, feat_length; + struct level_0_discovery_features *feat; + struct level_0_discovery_features *feat_end; + + rc = sedopal_discover_device(fd, &feat, &feat_end); + if (rc != 0) + return rc; + + /* + * iterate through all the features that were returned + */ + while (feat < feat_end) { + uint16_t code = be16toh(feat->code); + + if (code == OPAL_FEATURE_CODE_LOCKING) { + struct locking_desc *ld = (struct locking_desc *) (feat + 1); + + return ld->features; + } + + feat_length = feat->length + 4 /* hdr */; + feat = (struct level_0_discovery_features *) + ((char *)feat + feat_length); + } + + return 0; +} diff --git a/plugins/sed/sedopal_cmd.h b/plugins/sed/sedopal_cmd.h index 3b6eae2..32d1cfb 100644 --- a/plugins/sed/sedopal_cmd.h +++ b/plugins/sed/sedopal_cmd.h @@ -17,6 +17,9 @@ extern bool sedopal_ask_key; extern bool sedopal_ask_new_key; extern bool sedopal_destructive_revert; extern bool sedopal_psid_revert; +extern bool sedopal_lock_ro; +extern bool sedopal_discovery_verbose; +extern bool sedopal_discovery_udev; /* * Sub-commands supported by the sedopal command @@ -51,5 +54,6 @@ int sedopal_cmd_discover(int fd); int sedopal_open_nvme_device(char *device); int sedopal_lock_unlock(int fd, int lock_state); const char *sedopal_error_to_text(int code); +int sedopal_locking_state(int fd); #endif /* _SED_OPAL_CMD_H */ diff --git a/plugins/sed/sedopal_spec.h b/plugins/sed/sedopal_spec.h index 7523060..f6b6662 100644 --- a/plugins/sed/sedopal_spec.h +++ b/plugins/sed/sedopal_spec.h @@ -3,6 +3,8 @@ #ifndef _SED_OPAL_SPEC_H #define _SED_OPAL_SPEC_H +#include <common.h> + /* * TCP Storage Architecture Core Specification Version 2.01 * section 5.1.5 Method Status Codes @@ -31,6 +33,31 @@ enum sed_status_codes { SED_STATUS_NO_METHOD_STATUS = 0x89, }; +/* + * level 0 feature flags + */ +#define OPAL_FEATURE_TPER 0x0001 +#define OPAL_FEATURE_LOCKING 0x0002 +#define OPAL_FEATURE_GEOMETRY 0x0004 +#define OPAL_FEATURE_OPALV1 0x0008 +#define OPAL_FEATURE_SINGLE_USER_MODE 0x0010 +#define OPAL_FEATURE_DATA_STORE 0x0020 +#define OPAL_FEATURE_OPALV2 0x0040 +#define OPAL_FEATURE_OPALITE 0x0080 +#define OPAL_FEATURE_PYRITE_V1 0x0100 +#define OPAL_FEATURE_PYRITE_V2 0x0200 +#define OPAL_FEATURE_RUBY 0x0400 +#define OPAL_FEATURE_LOCKING_LBA 0x0800 +#define OPAL_FEATURE_BLOCK_SID_AUTH 0x1000 +#define OPAL_FEATURE_CONFIG_NS_LOCKING 0x2000 +#define OPAL_FEATURE_DATA_REMOVAL 0x4000 +#define OPAL_FEATURE_NS_GEOMETRY 0x8000 + +#define OPAL_SED_LOCKING_SUPPORT \ + (OPAL_FEATURE_OPALV1 | OPAL_FEATURE_OPALV2 | \ + OPAL_FEATURE_RUBY | OPAL_FEATURE_PYRITE_V1 | \ + OPAL_FEATURE_PYRITE_V2 | OPAL_FEATURE_LOCKING) + /* * Definitions from TCG Opal Specification v2.0.2 */ @@ -38,34 +65,304 @@ enum sed_status_codes { /* * level 0 feature codes - section 3.1.1 */ -#define OPAL_FEATURE_CODE_LOCKING 0x0002 -#define OPAL_FEATURE_CODE_OPALV2 0x0203 +#define OPAL_FEATURE_CODE_TPER 0x0001 +#define OPAL_FEATURE_CODE_LOCKING 0x0002 +#define OPAL_FEATURE_CODE_GEOMETRY 0x0003 + +#define OPAL_FEATURE_CODE_OPALV1 0x0200 +#define OPAL_FEATURE_CODE_SINGLE_USER_MODE 0x0201 +#define OPAL_FEATURE_CODE_DATA_STORE 0x0202 +#define OPAL_FEATURE_CODE_OPALV2 0x0203 + +#define OPAL_FEATURE_CODE_OPALITE 0x0301 +#define OPAL_FEATURE_CODE_PYRITE_V1 0x0302 +#define OPAL_FEATURE_CODE_PYRITE_V2 0x0303 +#define OPAL_FEATURE_CODE_RUBY 0x0304 + +#define OPAL_FEATURE_CODE_LOCKING_LBA 0x0401 +#define OPAL_FEATURE_CODE_BLOCK_SID_AUTH 0x0402 +#define OPAL_FEATURE_CODE_CONFIG_NS_LOCKING 0x0403 +#define OPAL_FEATURE_CODE_DATA_REMOVAL 0x0404 +#define OPAL_FEATURE_CODE_NS_GEOMETRY 0x0405 /* locking features */ #define OPAL_FEATURE_LOCKING_SUPPORTED 0x01 #define OPAL_FEATURE_LOCKING_ENABLED 0x02 #define OPAL_FEATURE_LOCKED 0x04 - +#define OPAL_FEATURE_MEDIA_ENCRYPT 0x08 +#define OPAL_FEATURE_MBR_ENABLED 0x10 +#define OPAL_FEATURE_MBR_DONE 0x20 /* - * discovery header as specified in section 3.1.1.1 + * discovery header as specified in section 3.1.1 */ struct level_0_discovery_header { - uint32_t parameter_length; - uint32_t revision; - uint64_t reserved; + __be32 parameter_length; + __be32 revision; + __be64 reserved; uint8_t vendor_specific[32]; -}; +} __packed; /* * level 0 features as specified in section 3.1.1.3 */ struct level_0_discovery_features { - uint16_t code; + __be16 code; uint8_t version; uint8_t length; - uint8_t feature; - uint8_t reserved[11]; -}; +} __packed; + +#define TPER_FEATURE_SYNC 0x0001 +#define TPER_FEATURE_ASYNC 0x0002 +#define TPER_FEATURE_ACKNAK 0x0004 +#define TPER_FEATURE_BUF_MGMT 0x0008 +#define TPER_FEATURE_STREAMING 0x0010 +#define TPER_FEATURE_COMID_MGMT 0x0040 + +/* + * 3.1.1.2 + * + * feature code 0x0001 + */ +struct tper_desc { + uint8_t feature; + uint8_t reserved[11]; +} __packed; + +/* + * 3.1.1.3 + * + * feature code 0x0002 + */ +struct locking_desc { + uint8_t features; + uint8_t reserved[11]; +} __packed; + +/* + * 3.1.1.4 + * + * feature code 0x0003 + */ +#define GEOMETRY_ALIGNMENT_REQUIRED 0x01 + +struct geometry_reporting_desc { + uint8_t align; + uint8_t reserved[7]; + __be32 logical_block_size; + __be64 alignment_granularity; + __be64 lowest_aligned_lba; +} __packed; + +/* + * 3.1.1.5 + * + * feature code 0x0203 + */ +#define OPAL_V2_RANGE_CROSSING 0x01 + +struct opalv2_desc { + __be16 base_comid; + __be16 num_comids; + uint8_t flags; + __be16 num_locking_sp_admin_auth; + __be16 num_locking_sp_user_auth; + uint8_t initial_cpin_sid_ind; + uint8_t initial_cpin_sid_revert; + uint8_t reserved_future[5]; +} __packed; + +/* + * 3.1.1.5 + * + * feature code 0x0200 + */ +struct opalv1_desc { + __be16 base_comid; + __be16 num_comids; +} __packed; + +/* + * TCG Opal SSC Feature Set v1.00 : Single User Mode + * section 4.2.1 + * + * feature code 0x0201 + */ +#define SUM_FEATURE_ANY 0x0001 +#define SUM_FEATURE_ALL 0x0002 +#define SUM_FEATURE_POLICY 0x0004 + +struct single_user_mode_desc { + __be32 num_locking_objects; + uint8_t flags; + uint8_t reserved[7]; +} __packed; + +/* + * TCG Opal SSC Feature Set v1.00 : Additional DataStore Tables + * section 4.2.1 + * + * feature code 0x0202 + */ +struct datastore_desc { + __be16 reserved; + __be16 max_tables; + __be32 max_table_size; + __be32 table_alignment; +} __packed; + +/* + * TCG Storage Security Subsystem Class: Opalite + * section 3.1.1.4 + * + * feature code 0x0301 + */ +struct opalite_desc { + __be16 base_comid; + __be16 num_comids; + uint8_t reserved[5]; + uint8_t initial_cpin_sid_ind; + uint8_t initial_cpin_sid_revert; + uint8_t reserved_future[5]; +} __packed; + +/* + * TCG Storage Security Subsystem Class: Pyrite version 1 + * section 3.1.1.4 + * + * feature code 0x0302 + */ +struct pyrite_v1_desc { + __be16 base_comid; + __be16 num_comids; + uint8_t reserved[5]; + uint8_t initial_cpin_sid_ind; + uint8_t initial_cpin_sid_revert; + uint8_t reserved_future[5]; +} __packed; + +/* + * TCG Storage Security Subsystem Class: Pyrite version 2 + * section 3.1.1.4 + * + * feature code 0x0303 + */ +struct pyrite_v2_desc { + __be16 base_comid; + __be16 num_comids; + uint8_t reserved[5]; + uint8_t initial_cpin_sid_ind; + uint8_t initial_cpin_sid_revert; + uint8_t reserved_future[5]; +} __packed; + +/* + * TCG Ruby SSC Feature Set v1.00 + * section 3.1.1.5 + * + * feature code 0x0304 + */ +#define RUBY_RANGE_CROSSING 0x01 + +struct ruby_desc { + __be16 base_comid; + __be16 num_comids; + uint8_t flags; + __be16 num_locking_sp_admin_auth; + __be16 num_locking_sp_user_auth; + uint8_t initial_cpin_sid_ind; + uint8_t initial_cpin_sid_revert; + uint8_t reserved_future[5]; +} __packed; + +/* + * TCG Storage Enterprise SSC Feature Set Locking LBA Ranges Control + * section 4.1.1 + * + * feature code 0x0401 + */ +struct locking_lba_desc { + uint8_t reserved; + uint8_t reserved_range_control[11]; +} __packed; + +/* + * TCG Storage Feature Set: Block SID Authentication + * section 4.1.1 + * + * feature code 0x0402 + */ +#define BLOCK_SID_VALUE_STATE 0x0001 +#define BLOCK_SID_BLOCKED_STATE 0x0002 +#define BLOCK_SID_HW_RESET 0x0001 + +struct block_sid_auth_desc { + uint8_t states; + uint8_t hw_reset; +} __packed; + +/* + * TCG Storage Opal SSC Feature Set: Configurable Namespace Locking + * section 4.2.1 + * + * feature code 0x0403 + */ +#define CONFIG_NS_RANGE_C 0x0080 +#define CONFIG_NS_RANGE_P 0x0040 + +struct config_ns_desc { + uint8_t flags; + uint8_t reserved[3]; + __be32 max_key_count; + __be32 unused_key_count; + __be32 max_ranges_per_ns; +} __packed; + +/* + * TCG Storage Security Subsystem Class: Opal version 2.02 + * section 3.1.1.6 + * + * feature code 0x0404 + */ +#define DATA_REMOVAL_OPER_PROCESSING 0x01 +#define DATA_REMOVAL_OPER_INTERRUPTED 0x02 +#define DATA_REMOVAL_TIME_BIT0 0x01 +#define DATA_REMOVAL_TIME_BIT1 0x02 +#define DATA_REMOVAL_TIME_BIT2 0x04 +#define DATA_REMOVAL_TIME_BIT5 0x20 + +#define DATA_REMOVAL_MECHANISM_OVERWRITE 0x01 +#define DATA_REMOVAL_MECHANISM_BLOCK_ERASE 0x02 +#define DATA_REMOVAL_MECHANISM_CRYPTO_ERASE 0x04 +#define DATA_REMOVAL_MECHANISM_VENDOR_ERASE 0x10 + +struct data_removal_desc { + uint8_t reserved; + uint8_t flags; + uint8_t removal_mechanism; + uint8_t format; + __be16 time_mechanism_bit0; + __be16 time_mechanism_bit1; + __be16 time_mechanism_bit2; + uint8_t reserved_mech[4]; + __be16 time_mechanism_bit5; + uint8_t future_reserved[16]; +} __packed; + +/* + * TCG Storage Opal SSC Feature Set: Configurable Namespace Locking + * section 4.2.1 + * + * feature code 0x0405 + */ +#define NS_GEOMETRY_ALIGNMENT_REQUIRED 0x01 + +struct ns_geometry_desc { + uint8_t align; + uint8_t reserved[7]; + __be32 logical_block_size; + __be64 alignment_granularity; + __be64 lowest_aligned_lba; +} __packed; #endif /* _SED_OPAL_SPEC_H */ diff --git a/plugins/solidigm/solidigm-internal-logs.c b/plugins/solidigm/solidigm-internal-logs.c index d493216..303d471 100644 --- a/plugins/solidigm/solidigm-internal-logs.c +++ b/plugins/solidigm/solidigm-internal-logs.c @@ -233,7 +233,7 @@ static int ilog_dump_assert_logs(struct ilog *ilog) { __u8 buf[INTERNAL_LOG_MAX_BYTE_TRANSFER]; __u8 head_buf[INTERNAL_LOG_MAX_BYTE_TRANSFER]; - char file_path[PATH_MAX] = {0}; + _cleanup_free_ char *file_path = NULL; char file_name[] = "AssertLog.bin"; struct assert_dump_header *ad = (struct assert_dump_header *) head_buf; struct nvme_passthru_cmd cmd = { @@ -249,8 +249,10 @@ static int ilog_dump_assert_logs(struct ilog *ilog) if (err) return err; - snprintf(file_path, sizeof(file_path), "%.*s/%s", - (int) (sizeof(file_path) - sizeof(file_name) - 1), ilog->cfg->out_dir, file_name); + if (asprintf(&file_path, "%.*s/%s", + (int) (sizeof(file_path) - sizeof(file_name) - 1), + ilog->cfg->out_dir, file_name) < 0) + return -errno; output = open(file_path, O_WRONLY | O_CREAT | O_TRUNC, LOG_FILE_PERMISSION); if (output < 0) return -errno; @@ -289,7 +291,7 @@ static int ilog_dump_event_logs(struct ilog *ilog) { __u8 buf[INTERNAL_LOG_MAX_BYTE_TRANSFER]; __u8 head_buf[INTERNAL_LOG_MAX_BYTE_TRANSFER]; - char file_path[PATH_MAX] = {0}; + _cleanup_free_ char *file_path = NULL; struct event_dump_header *ehdr = (struct event_dump_header *) head_buf; struct nvme_passthru_cmd cmd = { .opcode = 0xd2, @@ -304,7 +306,8 @@ static int ilog_dump_event_logs(struct ilog *ilog) err = read_header(&cmd, dev_fd(ilog->dev)); if (err) return err; - snprintf(file_path, sizeof(file_path) - 1, "%s/EventLog.bin", ilog->cfg->out_dir); + if (asprintf(&file_path, "%s/EventLog.bin", ilog->cfg->out_dir)) + return -errno; output = open(file_path, O_WRONLY | O_CREAT | O_TRUNC, LOG_FILE_PERMISSION); if (output < 0) return -errno; @@ -363,7 +366,7 @@ static int ilog_dump_nlogs(struct ilog *ilog, int core) int err = 0; __u32 count, core_num; __u8 buf[INTERNAL_LOG_MAX_BYTE_TRANSFER]; - char file_path[PATH_MAX] = {0}; + _cleanup_free_ char *file_path = NULL; struct nlog_dump_header_common *nlog_header = (struct nlog_dump_header_common *)buf; struct nvme_passthru_cmd cmd = { .opcode = 0xd2, @@ -400,11 +403,12 @@ static int ilog_dump_nlogs(struct ilog *ilog, int core) count = nlog_header->totalnlogs; core_num = core < 0 ? nlog_header->corecount : 0; if (!header_size) { - snprintf(file_path, sizeof(file_path) - 1, "%s/NLog.bin", - ilog->cfg->out_dir); - output = open(file_path, O_WRONLY | O_CREAT | O_TRUNC, - LOG_FILE_PERMISSION); - if (output < 0) + if (asprintf(&file_path, "%s/NLog.bin", ilog->cfg->out_dir) >= 0) { + output = open(file_path, O_WRONLY | O_CREAT | O_TRUNC, + LOG_FILE_PERMISSION); + if (output < 0) + return -errno; + } else return -errno; header_size = get_nlog_header_size(nlog_header); is_open = true; @@ -416,7 +420,7 @@ static int ilog_dump_nlogs(struct ilog *ilog, int core) print_nlog_header(buf); cmd.cdw13 = 0x400; err = cmd_dump_repeat(&cmd, nlog_header->nlogbytesize / 4, - output, dev_fd(ilog->dev), true); + output, dev_fd(ilog->dev), true); if (err) break; } while (++log_select.selectNlog < count); @@ -432,16 +436,19 @@ static int ilog_dump_nlogs(struct ilog *ilog, int core) int ensure_dir(const char *parent_dir_name, const char *name) { - char file_path[PATH_MAX] = {0}; + _cleanup_free_ char *file_path = NULL; struct stat sb; - snprintf(file_path, sizeof(file_path) - 1, "%s/%s", parent_dir_name, name); + if (asprintf(&file_path, "%s/%s", parent_dir_name, name) < 0) + return -errno; + if (!(stat(file_path, &sb) == 0 && S_ISDIR(sb.st_mode))) { if (mkdir(file_path, 777) != 0) { perror(file_path); return -errno; } } + return 0; } @@ -456,13 +463,14 @@ static int log_save(struct log *log, const char *parent_dir_name, const char *su const char *file_name, __u8 *buffer, size_t buf_size) { _cleanup_fd_ int output = -1; - char file_path[PATH_MAX] = {0}; + _cleanup_free_ char *file_path = NULL; size_t bytes_remaining = 0; ensure_dir(parent_dir_name, subdir_name); - snprintf(file_path, sizeof(file_path) - 1, "%s/%s/%s", parent_dir_name, subdir_name, - file_name); + if (asprintf(&file_path, "%s/%s/%s", parent_dir_name, subdir_name, file_name) < 0) + return -errno; + output = open(file_path, O_WRONLY | O_CREAT | O_TRUNC, LOG_FILE_PERMISSION); if (output < 0) return -errno; @@ -486,15 +494,15 @@ static int ilog_dump_identify_page(struct ilog *ilog, struct log *cns, __u32 nsi { __u8 data[NVME_IDENTIFY_DATA_SIZE]; __u8 *buff = cns->buffer ? cns->buffer : data; - char filename[sizeof( - "cntid_XXXXX_cns_XXX_nsid_XXXXXXXXXX_nvmsetid_XXXXX_csi_XXX.bin")] = {0}; + _cleanup_free_ char *filename = NULL; int err = nvme_identify_cns_nsid(dev_fd(ilog->dev), cns->id, nsid, buff); if (err) return err; - snprintf(filename, sizeof(filename) - 1, "cntid_0_cns_%d_nsid_%d_nvmsetid_0_csi_0.bin", - cns->id, nsid); + if (asprintf(&filename, "cntid_0_cns_%d_nsid_%d_nvmsetid_0_csi_0.bin", cns->id, nsid) < 0) + return -errno; + return log_save(cns, ilog->cfg->out_dir, "identify", filename, buff, sizeof(data)); } @@ -646,9 +654,9 @@ static int ilog_dump_identify_pages(struct ilog *ilog) static int ilog_dump_log_page(struct ilog *ilog, struct log *lp, __u32 nsid) { __u8 *buff = lp->buffer; - char filename[sizeof("lid_0xXX_lsp_0xXX_lsi_0xXXXX.bin")] = {0}; - int err; + _cleanup_free_ char *filename = NULL; + int err; if (!lp->buffer_size) return -EINVAL; if (!buff) { @@ -660,8 +668,9 @@ static int ilog_dump_log_page(struct ilog *ilog, struct log *lp, __u32 nsid) if (err) return err; - snprintf(filename, sizeof(filename), "lid_0x%02x_lsp_0x00_lsi_0x0000.bin", - lp->id); + if (asprintf(&filename, "lid_0x%02x_lsp_0x00_lsi_0x0000.bin", lp->id) < 0) + return -errno; + return log_save(lp, ilog->cfg->out_dir, "log_pages", filename, buff, lp->buffer_size); } @@ -813,10 +822,11 @@ int solidigm_get_internal_log(int argc, char **argv, struct command *command, { char sn_prefix[sizeof(((struct nvme_id_ctrl *)0)->sn)+1]; char date_str[sizeof("-YYYYMMDDHHMMSS")]; - char full_folder[PATH_MAX] = {0}; - char unique_folder[sizeof(sn_prefix)+sizeof(date_str)-1] = {0}; + _cleanup_free_ char *full_folder = NULL; + _cleanup_free_ char *unique_folder = NULL; + _cleanup_free_ char *zip_name = NULL; + char *initial_folder; - char zip_name[PATH_MAX] = {0}; char *output_path; struct ilog ilog = {0}; int err; @@ -885,12 +895,16 @@ int solidigm_get_internal_log(int argc, char **argv, struct command *command, current_time = time(NULL); strftime(date_str, sizeof(date_str), "-%Y%m%d%H%M%S", localtime(¤t_time)); - snprintf(unique_folder, sizeof(unique_folder), "%s%s", sn_prefix, date_str); - snprintf(full_folder, sizeof(full_folder) - 1, "%s/%s", cfg.out_dir, unique_folder); + if (asprintf(&unique_folder, "%s%s", sn_prefix, date_str) < 0) + return -errno; + if (asprintf(&full_folder, "%s/%s", cfg.out_dir, unique_folder) < 0) + return -errno; + if (mkdir(full_folder, 0755) != 0) { perror("mkdir"); return -errno; } + cfg.out_dir = full_folder; output_path = full_folder; @@ -946,10 +960,12 @@ int solidigm_get_internal_log(int argc, char **argv, struct command *command, if (ilog.count > 0) { int ret_cmd; - char *cmd; + _cleanup_free_ char *cmd = NULL; char *quiet = cfg.verbose ? "" : " -q"; - snprintf(zip_name, sizeof(zip_name) - 1, "%s.zip", unique_folder); + if (asprintf(&zip_name, "%s.zip", unique_folder) < 0) + return -errno; + if (asprintf(&cmd, "cd \"%s\" && zip -MM -r \"../%s\" ./* %s", cfg.out_dir, zip_name, quiet) < 0) { err = errno; @@ -962,7 +978,6 @@ int solidigm_get_internal_log(int argc, char **argv, struct command *command, perror(cmd); else { output_path = zip_name; - free(cmd); if (asprintf(&cmd, "rm -rf %s", cfg.out_dir) < 0) { err = errno; perror("Can't allocate string for cleanup"); @@ -971,7 +986,6 @@ int solidigm_get_internal_log(int argc, char **argv, struct command *command, if (system(cmd) != 0) perror("Failed removing logs folder"); } - free(cmd); } out: diff --git a/plugins/solidigm/solidigm-log-page-dir.c b/plugins/solidigm/solidigm-log-page-dir.c index f8d1974..886097b 100644 --- a/plugins/solidigm/solidigm-log-page-dir.c +++ b/plugins/solidigm/solidigm-log-page-dir.c @@ -14,6 +14,7 @@ #include "common.h" #include "nvme-print.h" +#include "plugins/ocp/ocp-nvme.h" #include "plugins/ocp/ocp-utils.h" #include "solidigm-util.h" diff --git a/plugins/solidigm/solidigm-nvme.h b/plugins/solidigm/solidigm-nvme.h index cb32ed0..e2f416e 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.8" +#define SOLIDIGM_PLUGIN_VERSION "1.9" PLUGIN(NAME("solidigm", "Solidigm vendor specific extensions", SOLIDIGM_PLUGIN_VERSION), COMMAND_LIST( diff --git a/plugins/solidigm/solidigm-telemetry/config.c b/plugins/solidigm/solidigm-telemetry/config.c index eceeede..9d1b4e2 100644 --- a/plugins/solidigm/solidigm-telemetry/config.c +++ b/plugins/solidigm/solidigm-telemetry/config.c @@ -61,7 +61,7 @@ const char *solidigm_config_get_nlog_obj_name(const struct json_object *config, if (!json_object_object_get_ex(nlog_names, hex_header, &obj_name)) return NULL; name = json_object_get_string(obj_name); - if (strncmp(NLOG_OBJ_PREFIX, name, strlen(NLOG_OBJ_PREFIX))) + if ((!name) || (strncmp(NLOG_OBJ_PREFIX, name, strlen(NLOG_OBJ_PREFIX)))) return NULL; return &name[strlen(OBJ_NAME_PREFIX)]; diff --git a/plugins/ssstc/ssstc-nvme.c b/plugins/ssstc/ssstc-nvme.c index 302df98..f90ad60 100644 --- a/plugins/ssstc/ssstc-nvme.c +++ b/plugins/ssstc/ssstc-nvme.c @@ -383,7 +383,9 @@ int ssstc_get_add_smart_log(int argc, char **argv, struct command *cmd, struct p "(optionally, for the specified namespace), and show it."; const char *namespace = "(optional) desired namespace"; const char *raw = "Dump output in binary format"; +#ifdef CONFIG_JSONC const char *json = "Dump output in json format"; +#endif /* CONFIG_JSONC */ struct nvme_additional_smart_log smart_log_add; struct nvme_dev *dev; @@ -402,7 +404,7 @@ int ssstc_get_add_smart_log(int argc, char **argv, struct command *cmd, struct p 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_FLAG_JSON("json", 'j', &cfg.json, json), OPT_END() }; diff --git a/plugins/virtium/virtium-nvme.c b/plugins/virtium/virtium-nvme.c index ad9938d..50b2a54 100644 --- a/plugins/virtium/virtium-nvme.c +++ b/plugins/virtium/virtium-nvme.c @@ -127,8 +127,10 @@ static void vt_convert_smart_data_to_human_readable_format(struct vtview_smart_l capacity = le64_to_cpu(smart->raw_ns.nsze) * lba; - snprintf(tempbuff, sizeof(tempbuff), "log;%s;%lu;%s;%s;%-.*s;", smart->raw_ctrl.sn, smart->time_stamp, smart->path, - smart->raw_ctrl.mn, (int)sizeof(smart->raw_ctrl.fr), smart->raw_ctrl.fr); + snprintf(tempbuff, sizeof(tempbuff), "log;%s;%llu;%s;%s;%-.*s;", smart->raw_ctrl.sn, + (unsigned long long)smart->time_stamp, smart->path, + smart->raw_ctrl.mn, (int)sizeof(smart->raw_ctrl.fr), + smart->raw_ctrl.fr); strcpy(text, tempbuff); snprintf(tempbuff, sizeof(tempbuff), "Capacity;%lf;", capacity / 1000000000); strcat(text, tempbuff); diff --git a/plugins/wdc/wdc-nvme.c b/plugins/wdc/wdc-nvme.c index f3e97db..f1e12c4 100644 --- a/plugins/wdc/wdc-nvme.c +++ b/plugins/wdc/wdc-nvme.c @@ -1882,7 +1882,6 @@ 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 | @@ -1899,6 +1898,23 @@ static __u64 wdc_get_drive_capabilities(nvme_root_t r, struct nvme_dev *dev) WDC_DRIVE_CAP_SET_LATENCY_MONITOR); break; + 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 | + WDC_DRIVE_CAP_OCP_C4_LOG_PAGE | + WDC_DRIVE_CAP_OCP_C5_LOG_PAGE | + WDC_DRIVE_CAP_DUI | + WDC_DRIVE_CAP_FW_ACTIVATE_HISTORY_C2 | + WDC_DRIVE_CAP_VU_FID_CLEAR_PCIE | + WDC_DRIVE_CAP_VU_FID_CLEAR_FW_ACT_HISTORY | + WDC_DRIVE_CAP_INFO | + WDC_DRIVE_CAP_CLOUD_SSD_VERSION | + WDC_DRIVE_CAP_LOG_PAGE_DIR | + WDC_DRIVE_CAP_DRIVE_STATUS | + WDC_DRIVE_CAP_SET_LATENCY_MONITOR); + break; + default: capabilities = 0; } @@ -2165,6 +2181,163 @@ static int wdc_create_log_file(char *file, __u8 *drive_log_data, return 0; } +bool wdc_validate_dev_mng_log(void *data) +{ + __u32 remaining_len = 0; + __u32 log_length = 0; + __u32 log_entry_size = 0; + __u32 log_entry_id = 0; + __u32 offset = 0; + bool valid_log = false; + struct wdc_c2_log_subpage_header *p_next_log_entry = NULL; + struct wdc_c2_log_page_header *hdr_ptr = (struct wdc_c2_log_page_header *)data; + + log_length = le32_to_cpu(hdr_ptr->length); + /* Ensure log data is large enough for common header */ + if (log_length < sizeof(struct wdc_c2_log_page_header)) { + fprintf(stderr, + "ERROR: %s: log smaller than header. log_len: 0x%x HdrSize: %"PRIxPTR"\n", + __func__, log_length, sizeof(struct wdc_c2_log_page_header)); + return valid_log; + } + + /* Get pointer to first log Entry */ + offset = sizeof(struct wdc_c2_log_page_header); + p_next_log_entry = (struct wdc_c2_log_subpage_header *)(((__u8 *)data) + offset); + remaining_len = log_length - offset; + + /* Proceed only if there is at least enough data to read an entry header */ + while (remaining_len >= sizeof(struct wdc_c2_log_subpage_header)) { + /* Get size of the next entry */ + log_entry_size = le32_to_cpu(p_next_log_entry->length); + log_entry_id = le32_to_cpu(p_next_log_entry->entry_id); + /* + * If log entry size is 0 or the log entry goes past the end + * of the data, we must be at the end of the data + */ + if (!log_entry_size || log_entry_size > remaining_len) { + fprintf(stderr, "ERROR: WDC: %s: Detected unaligned end of the data. ", + __func__); + fprintf(stderr, "Data Offset: 0x%x Entry Size: 0x%x, ", + offset, log_entry_size); + fprintf(stderr, "Remaining Log Length: 0x%x Entry Id: 0x%x\n", + remaining_len, log_entry_id); + + /* Force the loop to end */ + remaining_len = 0; + } else if (!log_entry_id || log_entry_id > 200) { + /* Invalid entry - fail the search */ + fprintf(stderr, "ERROR: WDC: %s: Invalid entry found at offset: 0x%x ", + __func__, offset); + fprintf(stderr, "Entry Size: 0x%x, Remaining Log Length: 0x%x ", + log_entry_size, remaining_len); + fprintf(stderr, "Entry Id: 0x%x\n", log_entry_id); + + /* Force the loop to end */ + remaining_len = 0; + valid_log = false; + } else { + /* A valid log has at least one entry and no invalid entries */ + valid_log = true; + remaining_len -= log_entry_size; + if (remaining_len > 0) { + /* Increment the offset counter */ + offset += log_entry_size; + /* Get the next entry */ + p_next_log_entry = + (struct wdc_c2_log_subpage_header *)(((__u8 *)data) + offset); + } + } + } + + return valid_log; +} + +bool wdc_parse_dev_mng_log_entry(void *data, __u32 entry_id, + struct wdc_c2_log_subpage_header **log_entry) +{ + __u32 remaining_len = 0; + __u32 log_length = 0; + __u32 log_entry_size = 0; + __u32 log_entry_id = 0; + __u32 offset = 0; + bool found = false; + struct wdc_c2_log_subpage_header *p_next_log_entry = NULL; + struct wdc_c2_log_page_header *hdr_ptr = (struct wdc_c2_log_page_header *)data; + + log_length = le32_to_cpu(hdr_ptr->length); + /* Ensure log data is large enough for common header */ + if (log_length < sizeof(struct wdc_c2_log_page_header)) { + fprintf(stderr, + "ERROR: %s: log smaller than header. log_len: 0x%x HdrSize: %"PRIxPTR"\n", + __func__, log_length, sizeof(struct wdc_c2_log_page_header)); + return found; + } + + /* Get pointer to first log Entry */ + offset = sizeof(struct wdc_c2_log_page_header); + p_next_log_entry = (struct wdc_c2_log_subpage_header *)(((__u8 *)data) + offset); + remaining_len = log_length - offset; + + if (!log_entry) { + fprintf(stderr, "ERROR: WDC - %s: No log entry pointer.\n", __func__); + return found; + } + *log_entry = NULL; + + /* Proceed only if there is at least enough data to read an entry header */ + while (remaining_len >= sizeof(struct wdc_c2_log_subpage_header)) { + /* Get size of the next entry */ + log_entry_size = le32_to_cpu(p_next_log_entry->length); + log_entry_id = le32_to_cpu(p_next_log_entry->entry_id); + + /* + * If log entry size is 0 or the log entry goes past the end + * of the data, we must be at the end of the data + */ + if (!log_entry_size || log_entry_size > remaining_len) { + fprintf(stderr, "ERROR: WDC: %s: Detected unaligned end of the data. ", + __func__); + fprintf(stderr, "Data Offset: 0x%x Entry Size: 0x%x, ", + offset, log_entry_size); + fprintf(stderr, "Remaining Log Length: 0x%x Entry Id: 0x%x\n", + remaining_len, log_entry_id); + + /* Force the loop to end */ + remaining_len = 0; + } else if (!log_entry_id || log_entry_id > 200) { + /* Invalid entry - fail the search */ + fprintf(stderr, "ERROR: WDC: %s: Invalid entry found at offset: 0x%x ", + __func__, offset); + fprintf(stderr, "Entry Size: 0x%x, Remaining Log Length: 0x%x ", + log_entry_size, remaining_len); + fprintf(stderr, "Entry Id: 0x%x\n", log_entry_id); + + /* Force the loop to end */ + remaining_len = 0; + } else { + if (log_entry_id == entry_id) { + found = true; + *log_entry = p_next_log_entry; + remaining_len = 0; + } else { + remaining_len -= log_entry_size; + } + + if (remaining_len > 0) { + /* Increment the offset counter */ + offset += log_entry_size; + + /* Get the next entry */ + p_next_log_entry = + (struct wdc_c2_log_subpage_header *)(((__u8 *)data) + offset); + } + } + } + + return found; +} + bool wdc_get_dev_mng_log_entry(__u32 log_length, __u32 entry_id, struct wdc_c2_log_page_header *p_log_hdr, struct wdc_c2_log_subpage_header **p_p_found_log_entry) @@ -2172,9 +2345,10 @@ bool wdc_get_dev_mng_log_entry(__u32 log_length, __u32 entry_id, __u32 remaining_len = 0; __u32 log_entry_hdr_size = sizeof(struct wdc_c2_log_subpage_header) - 1; __u32 log_entry_size = 0; + __u32 log_entry_id = 0; __u32 size = 0; bool valid_log; - __u32 current_data_offset = 0; + __u32 offset = 0; struct wdc_c2_log_subpage_header *p_next_log_entry = NULL; if (!*p_p_found_log_entry) { @@ -2194,8 +2368,8 @@ bool wdc_get_dev_mng_log_entry(__u32 log_length, __u32 entry_id, /* Get pointer to first log Entry */ size = sizeof(struct wdc_c2_log_page_header); - current_data_offset = size; - p_next_log_entry = (struct wdc_c2_log_subpage_header *)((__u8 *)p_log_hdr + current_data_offset); + offset = size; + p_next_log_entry = (struct wdc_c2_log_subpage_header *)(((__u8 *)p_log_hdr) + offset); remaining_len = log_length - size; valid_log = false; @@ -2209,7 +2383,8 @@ bool wdc_get_dev_mng_log_entry(__u32 log_length, __u32 entry_id, /* Proceed only if there is at least enough data to read an entry header */ while (remaining_len >= log_entry_hdr_size) { /* Get size of the next entry */ - log_entry_size = p_next_log_entry->length; + log_entry_size = le32_to_cpu(p_next_log_entry->length); + log_entry_id = le32_to_cpu(p_next_log_entry->entry_id); /* * If log entry size is 0 or the log entry goes past the end @@ -2219,19 +2394,19 @@ bool wdc_get_dev_mng_log_entry(__u32 log_length, __u32 entry_id, fprintf(stderr, "ERROR: WDC: %s: Detected unaligned end of the data. ", __func__); fprintf(stderr, "Data Offset: 0x%x Entry Size: 0x%x, ", - current_data_offset, log_entry_size); + offset, log_entry_size); fprintf(stderr, "Remaining Log Length: 0x%x Entry Id: 0x%x\n", - remaining_len, p_next_log_entry->entry_id); + remaining_len, log_entry_id); /* Force the loop to end */ remaining_len = 0; - } else if (!p_next_log_entry->entry_id || p_next_log_entry->entry_id > 200) { + } else if (!log_entry_id || log_entry_id > 200) { /* Invalid entry - fail the search */ fprintf(stderr, "ERROR: WDC: %s: Invalid entry found at offset: 0x%x ", - __func__, current_data_offset); + __func__, offset); fprintf(stderr, "Entry Size: 0x%x, Remaining Log Length: 0x%x ", log_entry_size, remaining_len); - fprintf(stderr, "Entry Id: 0x%x\n", p_next_log_entry->entry_id); + fprintf(stderr, "Entry Id: 0x%x\n", log_entry_id); /* Force the loop to end */ remaining_len = 0; @@ -2242,7 +2417,7 @@ bool wdc_get_dev_mng_log_entry(__u32 log_length, __u32 entry_id, } else { /* Structure must have at least one valid entry to be considered valid */ valid_log = true; - if (p_next_log_entry->entry_id == entry_id) + if (log_entry_id == entry_id) /* A potential match. */ *p_p_found_log_entry = p_next_log_entry; @@ -2250,10 +2425,11 @@ bool wdc_get_dev_mng_log_entry(__u32 log_length, __u32 entry_id, if (remaining_len > 0) { /* Increment the offset counter */ - current_data_offset += log_entry_size; + offset += log_entry_size; /* Get the next entry */ - p_next_log_entry = (struct wdc_c2_log_subpage_header *)(((__u8 *)p_log_hdr) + current_data_offset); + p_next_log_entry = + (struct wdc_c2_log_subpage_header *)(((__u8 *)p_log_hdr) + offset); } } } @@ -2261,6 +2437,109 @@ bool wdc_get_dev_mng_log_entry(__u32 log_length, __u32 entry_id, return valid_log; } +static bool get_dev_mgmt_log_page_data(struct nvme_dev *dev, void **log_data, + __u8 uuid_ix) +{ + void *data; + struct wdc_c2_log_page_header *hdr_ptr; + __u32 length = 0; + int ret = 0; + bool valid = false; + + data = (__u8 *)malloc(sizeof(__u8) * WDC_C2_LOG_BUF_LEN); + if (!data) { + fprintf(stderr, "ERROR: WDC: malloc: %s\n", strerror(errno)); + return false; + } + + memset(data, 0, sizeof(__u8) * WDC_C2_LOG_BUF_LEN); + + /* get the log page length */ + struct nvme_get_log_args args_len = { + .args_size = sizeof(args_len), + .fd = dev_fd(dev), + .lid = WDC_NVME_GET_DEV_MGMNT_LOG_PAGE_ID, + .nsid = 0xFFFFFFFF, + .lpo = 0, + .lsp = NVME_LOG_LSP_NONE, + .lsi = 0, + .rae = false, + .uuidx = uuid_ix, + .csi = NVME_CSI_NVM, + .ot = false, + .len = WDC_C2_LOG_BUF_LEN, + .log = data, + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .result = NULL, + }; + ret = nvme_get_log(&args_len); + if (ret) { + fprintf(stderr, + "ERROR: WDC: Unable to get 0x%x Log Page with uuid %d, ret = 0x%x\n", + WDC_NVME_GET_DEV_MGMNT_LOG_PAGE_ID, uuid_ix, ret); + goto end; + } + + hdr_ptr = (struct wdc_c2_log_page_header *)data; + length = le32_to_cpu(hdr_ptr->length); + + if (length > WDC_C2_LOG_BUF_LEN) { + /* Log page buffer too small for actual data */ + free(data); + data = calloc(length, sizeof(__u8)); + if (!data) { + fprintf(stderr, "ERROR: WDC: malloc: %s\n", strerror(errno)); + goto end; + } + + /* get the log page data with the increased length */ + struct nvme_get_log_args args_data = { + .args_size = sizeof(args_data), + .fd = dev_fd(dev), + .lid = WDC_NVME_GET_DEV_MGMNT_LOG_PAGE_ID, + .nsid = 0xFFFFFFFF, + .lpo = 0, + .lsp = NVME_LOG_LSP_NONE, + .lsi = 0, + .rae = false, + .uuidx = uuid_ix, + .csi = NVME_CSI_NVM, + .ot = false, + .len = length, + .log = data, + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .result = NULL, + }; + ret = nvme_get_log(&args_data); + + if (ret) { + fprintf(stderr, + "ERROR: WDC: Unable to read 0x%x Log with uuid %d, ret = 0x%x\n", + WDC_NVME_GET_DEV_MGMNT_LOG_PAGE_ID, uuid_ix, ret); + goto end; + } + } + + valid = wdc_validate_dev_mng_log(data); + if (valid) { + /* Ensure size of log data matches length in log header */ + *log_data = calloc(length, sizeof(__u8)); + if (!*log_data) { + fprintf(stderr, "ERROR: WDC: calloc: %s\n", strerror(errno)); + valid = false; + goto end; + } + memcpy((void *)*log_data, data, length); + } else { + fprintf(stderr, "ERROR: WDC: C2 log page not found with uuid index %d\n", + uuid_ix); + } + +end: + free(data); + return valid; +} + static bool get_dev_mgmt_log_page_lid_data(struct nvme_dev *dev, void **cbs_data, __u8 lid, @@ -2371,6 +2650,78 @@ end: return found; } +static bool get_dev_mgment_data(nvme_root_t r, struct nvme_dev *dev, + void **data) +{ + bool found = false; + *data = NULL; + __u32 device_id = 0, vendor_id = 0; + bool uuid_present = false; + int index = 0, uuid_index = 0; + struct nvme_id_uuid_list uuid_list; + + /* The wdc_get_pci_ids function could fail when drives are connected + * via a PCIe switch. Therefore, the return code is intentionally + * being ignored. The device_id and vendor_id variables have been + * initialized to 0 so the code can continue on without issue for + * both cases: wdc_get_pci_ids successful or failed. + */ + wdc_get_pci_ids(r, dev, &device_id, &vendor_id); + + typedef struct nvme_id_uuid_list_entry *uuid_list_entry; + + memset(&uuid_list, 0, sizeof(struct nvme_id_uuid_list)); + if (wdc_CheckUuidListSupport(dev, &uuid_list)) { + uuid_list_entry uuid_list_entry_ptr = (uuid_list_entry)&uuid_list.entry[0]; + + while (index <= NVME_ID_UUID_LIST_MAX && + !wdc_UuidEqual(uuid_list_entry_ptr, (uuid_list_entry)UUID_END)) { + + if (wdc_UuidEqual(uuid_list_entry_ptr, + (uuid_list_entry)WDC_UUID)) { + uuid_present = true; + break; + } else if (wdc_UuidEqual(uuid_list_entry_ptr, + (uuid_list_entry)WDC_UUID_SN640_3) && + wdc_is_sn640_3(device_id)) { + uuid_present = true; + break; + } + index++; + uuid_list_entry_ptr = (uuid_list_entry)&uuid_list.entry[index]; + } + if (uuid_present) + uuid_index = index + 1; + } + + if (uuid_present) { + /* use the uuid index found above */ + found = get_dev_mgmt_log_page_data(dev, data, uuid_index); + } else { + if (!uuid_index && needs_c2_log_page_check(device_id)) { + /* In certain devices that don't support UUID lists, there are multiple + * definitions of the C2 logpage. In those cases, the code + * needs to try two UUID indexes and use an identification algorithm + * to determine which is returning the correct log page data. + */ + uuid_index = 1; + } + + found = get_dev_mgmt_log_page_data(dev, data, uuid_index); + + if (!found) { + /* not found with uuid = 1 try with uuid = 0 */ + uuid_index = 0; + fprintf(stderr, "Not found, requesting log page with uuid_index %d\n", + uuid_index); + + found = get_dev_mgmt_log_page_data(dev, data, uuid_index); + } + } + + return found; +} + static bool get_dev_mgment_cbs_data(nvme_root_t r, struct nvme_dev *dev, __u8 log_id, void **cbs_data) { @@ -2485,6 +2836,22 @@ static bool wdc_nvme_check_supported_log_page(nvme_root_t r, struct nvme_dev *de return found; } +static bool wdc_nvme_parse_dev_status_log_entry(void *log_data, __u32 *ret_data, + __u32 entry_id) +{ + struct wdc_c2_log_subpage_header *entry_data = NULL; + + if (wdc_parse_dev_mng_log_entry(log_data, entry_id, &entry_data)) { + if (entry_data) { + *ret_data = le32_to_cpu(entry_data->data); + return true; + } + } + + *ret_data = 0; + return false; +} + static bool wdc_nvme_get_dev_status_log_data(nvme_root_t r, struct nvme_dev *dev, __le32 *ret_data, __u8 log_id) { @@ -8609,12 +8976,13 @@ static int wdc_drive_status(int argc, char **argv, struct command *command, struct nvme_dev *dev; int ret = 0; nvme_root_t r; - __le32 system_eol_state; - __le32 user_eol_state; - __le32 format_corrupt_reason = cpu_to_le32(0xFFFFFFFF); - __le32 eol_status; - __le32 assert_status = cpu_to_le32(0xFFFFFFFF); - __le32 thermal_status = cpu_to_le32(0xFFFFFFFF); + void *dev_mng_log = NULL; + __u32 system_eol_state; + __u32 user_eol_state; + __u32 format_corrupt_reason = 0xFFFFFFFF; + __u32 eol_status; + __u32 assert_status = 0xFFFFFFFF; + __u32 thermal_status = 0xFFFFFFFF; __u64 capabilities = 0; OPT_ARGS(opts) = { @@ -8641,35 +9009,41 @@ static int wdc_drive_status(int argc, char **argv, struct command *command, goto out; } + if (!get_dev_mgment_data(r, dev, &dev_mng_log)) { + fprintf(stderr, "ERROR: WDC: 0xC2 Log Page not found\n"); + ret = -1; + goto out; + } + /* Get the assert dump present status */ - if (!wdc_nvme_get_dev_status_log_data(r, dev, &assert_status, + if (!wdc_nvme_parse_dev_status_log_entry(dev_mng_log, &assert_status, WDC_C2_ASSERT_DUMP_PRESENT_ID)) fprintf(stderr, "ERROR: WDC: Get Assert Status Failed\n"); /* Get the thermal throttling status */ - if (!wdc_nvme_get_dev_status_log_data(r, dev, &thermal_status, + if (!wdc_nvme_parse_dev_status_log_entry(dev_mng_log, &thermal_status, WDC_C2_THERMAL_THROTTLE_STATUS_ID)) fprintf(stderr, "ERROR: WDC: Get Thermal Throttling Status Failed\n"); /* Get EOL status */ - if (!wdc_nvme_get_dev_status_log_data(r, dev, &eol_status, + if (!wdc_nvme_parse_dev_status_log_entry(dev_mng_log, &eol_status, WDC_C2_USER_EOL_STATUS_ID)) { fprintf(stderr, "ERROR: WDC: Get User EOL Status Failed\n"); eol_status = cpu_to_le32(-1); } /* Get Customer EOL state */ - if (!wdc_nvme_get_dev_status_log_data(r, dev, &user_eol_state, + if (!wdc_nvme_parse_dev_status_log_entry(dev_mng_log, &user_eol_state, WDC_C2_USER_EOL_STATE_ID)) fprintf(stderr, "ERROR: WDC: Get User EOL State Failed\n"); /* Get System EOL state*/ - if (!wdc_nvme_get_dev_status_log_data(r, dev, &system_eol_state, + if (!wdc_nvme_parse_dev_status_log_entry(dev_mng_log, &system_eol_state, WDC_C2_SYSTEM_EOL_STATE_ID)) fprintf(stderr, "ERROR: WDC: Get System EOL State Failed\n"); /* Get format corrupt reason*/ - if (!wdc_nvme_get_dev_status_log_data(r, dev, &format_corrupt_reason, + if (!wdc_nvme_parse_dev_status_log_entry(dev_mng_log, &format_corrupt_reason, WDC_C2_FORMAT_CORRUPT_REASON_ID)) fprintf(stderr, "ERROR: WDC: Get Format Corrupt Reason Failed\n"); @@ -8716,6 +9090,7 @@ static int wdc_drive_status(int argc, char **argv, struct command *command, else printf(" Format Corrupt Reason: Unknown : 0x%08x\n", le32_to_cpu(format_corrupt_reason)); + free(dev_mng_log); out: nvme_free_tree(r); dev_close(dev); diff --git a/plugins/wdc/wdc-nvme.h b/plugins/wdc/wdc-nvme.h index 6efdbc1..ed7f912 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.11.1" +#define WDC_PLUGIN_VERSION "2.12.0" #include "cmd.h" PLUGIN(NAME("wdc", "Western Digital vendor specific extensions", WDC_PLUGIN_VERSION), diff --git a/plugins/wdc/wdc-utils.c b/plugins/wdc/wdc-utils.c index 1b52e7c..3b1f325 100644 --- a/plugins/wdc/wdc-utils.c +++ b/plugins/wdc/wdc-utils.c @@ -81,7 +81,7 @@ int wdc_UtilsGetTime(PUtilsTimeInfo timeInfo) timeInfo->second = currTimeInfo.tm_sec; timeInfo->msecs = 0; timeInfo->isDST = currTimeInfo.tm_isdst; -#if defined(__GLIBC__) && !defined(__UCLIBC__) && !defined(__MUSL__) +#if (defined(__GLIBC__) && !defined(__UCLIBC__) && !defined(__MUSL__)) || defined(__FreeBSD__) timeInfo->zone = -currTimeInfo.tm_gmtoff / 60; #else timeInfo->zone = -1 * (timezone / SECONDS_IN_MIN); diff --git a/scripts/build.sh b/scripts/build.sh index 1c2df50..fdfbaf2 100755 --- a/scripts/build.sh +++ b/scripts/build.sh @@ -193,11 +193,10 @@ tools_build_muon() { CC="${CC}" CFLAGS="${CFLAGS} -std=c99" ninja="${SAMU}" ./bootstrap.sh stage1 - CC="${CC}" ninja="${SAMU}" stage1/muon setup \ - -Dprefix="${TOOLDIR}" \ - -Ddocs=disabled \ - -Dsamurai=disabled \ - -Dbestline=disabled \ + CC="${CC}" ninja="${SAMU}" stage1/muon-bootstrap setup \ + -Dprefix="${TOOLDIR}" \ + -Ddocs=disabled \ + -Dsamurai=disabled \ "${TOOLDIR}/build-muon" "${SAMU}" -C "${TOOLDIR}/build-muon" MUON="${BUILDDIR}/build-tools/.build-muon/muon" diff --git a/subprojects/json-c.wrap b/subprojects/json-c.wrap index 569f78e..076739d 100644 --- a/subprojects/json-c.wrap +++ b/subprojects/json-c.wrap @@ -1,13 +1,13 @@ [wrap-file] -directory = json-c-0.17 -source_url = https://s3.amazonaws.com/json-c_releases/releases/json-c-0.17.tar.gz -source_filename = json-c-0.17.tar.gz -source_hash = 7550914d58fb63b2c3546f3ccfbe11f1c094147bd31a69dcd23714d7956159e6 -patch_filename = json-c_0.17-2_patch.zip -patch_url = https://wrapdb.mesonbuild.com/v2/json-c_0.17-2/get_patch -patch_hash = c1a9a7e2ea6bed89a59e13a5684be25899a5a510963154c4450c5a492b8f3984 -source_fallback_url = https://github.com/mesonbuild/wrapdb/releases/download/json-c_0.17-2/json-c-0.17.tar.gz -wrapdb_version = 0.17-2 +directory = json-c-0.18 +source_url = https://s3.amazonaws.com/json-c_releases/releases/json-c-0.18.tar.gz +source_filename = json-c-0.18.tar.gz +source_hash = 876ab046479166b869afc6896d288183bbc0e5843f141200c677b3e8dfb11724 +patch_filename = json-c_0.18-1_patch.zip +patch_url = https://wrapdb.mesonbuild.com/v2/json-c_0.18-1/get_patch +patch_hash = c9d2c0449a9686755445cd18d7cff597f21e418e11a786441de7b8947ff43798 +source_fallback_url = https://github.com/mesonbuild/wrapdb/releases/download/json-c_0.18-1/json-c-0.18.tar.gz +wrapdb_version = 0.18-1 [provide] json-c = json_c_dep diff --git a/subprojects/libnvme.wrap b/subprojects/libnvme.wrap index 55864ce..f9dd324 100644 --- a/subprojects/libnvme.wrap +++ b/subprojects/libnvme.wrap @@ -1,6 +1,6 @@ [wrap-git] url = https://github.com/linux-nvme/libnvme.git -revision = 2b3cb1746451f58583408a25857ca897d18cd4ca +revision = 5ec1f5284ecb0eda481f3d2d61236fbc5b46164f [provide] libnvme = libnvme_dep diff --git a/tests/nvme_attach_detach_ns_test.py b/tests/nvme_attach_detach_ns_test.py index a0e6129..f236300 100644 --- a/tests/nvme_attach_detach_ns_test.py +++ b/tests/nvme_attach_detach_ns_test.py @@ -29,8 +29,6 @@ NVMe Namespace Management Testcase:- 5. Delete Namespace. """ -import time - from nvme_test import TestNVMe @@ -59,7 +57,6 @@ class TestNVMeAttachDetachNSCmd(TestNVMe): self.setup_log_dir(self.__class__.__name__) self.ctrl_id = self.get_ctrl_id() self.delete_all_ns() - time.sleep(1) def tearDown(self): """ diff --git a/tests/nvme_compare_test.py b/tests/nvme_compare_test.py index a34df68..f704d6c 100644 --- a/tests/nvme_compare_test.py +++ b/tests/nvme_compare_test.py @@ -30,6 +30,7 @@ NVMe Compare Command Testcase:- """ +from nvme_test import to_decimal from nvme_test_io import TestNVMeIO @@ -52,7 +53,7 @@ class TestNVMeCompareCmd(TestNVMeIO): - Returns: - True if 'compare' is supported, otherwise False """ - return int(self.get_id_ctrl_field_value("oncs"), 16) & (1 << 0) + return to_decimal(self.get_id_ctrl_field_value("oncs")) & (1 << 0) def setUp(self): """ Pre Section for TestNVMeCompareCmd """ @@ -78,10 +79,10 @@ class TestNVMeCompareCmd(TestNVMeIO): - Returns: - return code of the nvme compare command. """ - compare_cmd = "nvme compare " + self.ns1 + " --start-block=" + \ - str(self.start_block) + " --block-count=" + \ - str(self.block_count) + " --data-size=" + \ - str(self.data_size) + " --data=" + cmp_file + compare_cmd = f"{self.nvme_bin} compare {self.ns1} " + \ + f"--start-block={str(self.start_block)} " + \ + f"--block-count={str(self.block_count)} " + \ + f"--data-size={str(self.data_size)} --data={cmp_file}" return self.exec_cmd(compare_cmd) def test_nvme_compare(self): diff --git a/tests/nvme_copy_test.py b/tests/nvme_copy_test.py index 5d16b00..f73cd04 100644 --- a/tests/nvme_copy_test.py +++ b/tests/nvme_copy_test.py @@ -34,15 +34,20 @@ class TestNVMeCopy(TestNVMe): def setUp(self): """ Pre Section for TestNVMeCopy """ super().setUp() - print("\nSetting up test...") self.ocfs = self.get_ocfs() self.host_behavior_data = None cross_namespace_copy = self.ocfs & 0xc if cross_namespace_copy: # get host behavior support data - get_features_cmd = ["nvme", "get-feature", self.ctrl, "--feature-id=0x16", "--data-len=512", "-b"] - print("Running command:", " ".join(get_features_cmd)) - self.host_behavior_data = subprocess.check_output(get_features_cmd) + get_features_cmd = f"{self.nvme_bin} get-feature {self.ctrl} " + \ + "--feature-id=0x16 --data-len=512 --raw-binary" + proc = subprocess.Popen(get_features_cmd, + shell=True, + stdout=subprocess.PIPE, + encoding='utf-8') + err = proc.wait() + self.assertEqual(err, 0, "ERROR : nvme get-feature failed") + self.host_behavior_data = proc.stdout.read() # enable cross-namespace copy formats if self.host_behavior_data[4] & cross_namespace_copy: # skip if already enabled @@ -50,29 +55,37 @@ class TestNVMeCopy(TestNVMe): self.host_behavior_data = None else: data = self.host_behavior_data[:4] + cross_namespace_copy.to_bytes(2, 'little') + self.host_behavior_data[6:] - set_features_cmd = ["nvme", "set-feature", self.ctrl, "--feature-id=0x16", "--data-len=512"] - print("Running command:", " ".join(set_features_cmd)) + set_features_cmd = f"{self.nvme_bin} set-feature " + \ + f"{self.ctrl} --feature-id=0x16 --data-len=512" proc = subprocess.Popen(set_features_cmd, + shell=True, stdout=subprocess.PIPE, - stdin=subprocess.PIPE) + stdin=subprocess.PIPE, + encoding='utf-8') proc.communicate(input=data) self.assertEqual(proc.returncode, 0, "Failed to enable cross-namespace copy formats") - get_ns_id_cmd = ["nvme", "get-ns-id", self.ns1] - print("Running command:", " ".join(get_ns_id_cmd)) - output = subprocess.check_output(get_ns_id_cmd) - self.ns1_nsid = int(output.decode().strip().split(':')[-1]) + get_ns_id_cmd = f"{self.nvme_bin} get-ns-id {self.ns1}" + proc = subprocess.Popen(get_ns_id_cmd, + shell=True, + stdout=subprocess.PIPE, + encoding='utf-8') + err = proc.wait() + self.assertEqual(err, 0, "ERROR : nvme get-ns-id failed") + output = proc.stdout.read() + self.ns1_nsid = int(output.strip().split(':')[-1]) self.setup_log_dir(self.__class__.__name__) def tearDown(self): """ Post Section for TestNVMeCopy """ - print("Tearing down test...") if self.host_behavior_data: # restore saved host behavior support data - set_features_cmd = ["nvme", "set-feature", self.ctrl, "--feature-id=0x16", "--data-len=512"] - print("Running command:", " ".join(set_features_cmd)) + set_features_cmd = f"{self.nvme_bin} set-feature {self.ctrl} " + \ + "--feature-id=0x16 --data-len=512" proc = subprocess.Popen(set_features_cmd, + shell=True, stdout=subprocess.PIPE, - stdin=subprocess.PIPE) + stdin=subprocess.PIPE, + encoding='utf-8') proc.communicate(input=self.host_behavior_data) super().tearDown() @@ -94,18 +107,18 @@ class TestNVMeCopy(TestNVMe): print(f"Skip copy because descriptor format {desc_format} is not supported") return # build copy command - copy_cmd = f"nvme copy {self.ns1} --format={desc_format} --sdlba={sdlba} --blocks={blocks} --slbs={slbs}" + copy_cmd = f"{self.nvme_bin} copy {self.ns1} " + \ + f"--format={desc_format} --sdlba={sdlba} --blocks={blocks} " + \ + f"--slbs={slbs}" if "snsids" in kwargs: copy_cmd += f" --snsids={kwargs['snsids']}" if "sopts" in kwargs: copy_cmd += f" --sopts={kwargs['sopts']}" # run and assert success - print("Running command:", copy_cmd) self.assertEqual(self.exec_cmd(copy_cmd), 0) def test_copy(self): """ Testcase main """ - print("Running test...") self.copy(0, 1, 2, descriptor_format=0) self.copy(0, 1, 2, descriptor_format=1) self.copy(0, 1, 2, descriptor_format=2, snsids=self.ns1_nsid) diff --git a/tests/nvme_create_max_ns_test.py b/tests/nvme_create_max_ns_test.py index 76cd4d4..41e7a8d 100644 --- a/tests/nvme_create_max_ns_test.py +++ b/tests/nvme_create_max_ns_test.py @@ -29,8 +29,6 @@ NVMe Namespace Management Testcase:- 5. Delete all Namespaces. """ -import time - from nvme_test import TestNVMe @@ -52,8 +50,9 @@ class TestNVMeCreateMaxNS(TestNVMe): super().setUp() self.dps = 0 self.flbas = 0 + (ds, ms) = self.get_lba_format_size() self.nsze = int(self.get_ncap() / - self.get_format() / self.get_max_ns()) + (ds + ms) / self.get_max_ns()) # Make sure that we have enough capacity for each ns. # Creating a ns might allocate more bits (NVMCAP) than specified by # nsze and ncap. @@ -63,7 +62,6 @@ class TestNVMeCreateMaxNS(TestNVMe): self.max_ns = self.get_max_ns() self.ctrl_id = self.get_ctrl_id() self.delete_all_ns() - time.sleep(1) def tearDown(self): """ @@ -85,21 +83,21 @@ class TestNVMeCreateMaxNS(TestNVMe): """ Testcase main """ print(f"##### Testing max_ns: {self.max_ns}") for nsid in range(1, self.max_ns + 1): - print("##### Creating " + str(nsid)) + print(f"##### Creating {nsid}") err = self.create_and_validate_ns(nsid, self.nsze, self.ncap, self.flbas, self.dps) self.assertEqual(err, 0) - print("##### Attaching " + str(nsid)) + print(f"##### Attaching {nsid}") self.assertEqual(self.attach_ns(self.ctrl_id, nsid), 0) - print("##### Running IOs in " + str(nsid)) + print(f"##### Running IOs in {nsid}") self.run_ns_io(nsid, 9, 1) for nsid in range(1, self.max_ns + 1): - print("##### Detaching " + str(nsid)) + print(f"##### Detaching {nsid}") self.assertEqual(self.detach_ns(self.ctrl_id, nsid), 0) - print("#### Deleting " + str(nsid)) + print(f"#### Deleting {nsid}") self.assertEqual(self.delete_and_validate_ns(nsid), 0) self.nvme_reset_ctrl() diff --git a/tests/nvme_ctrl_reset_test.py b/tests/nvme_ctrl_reset_test.py index e2c8a00..f32042e 100644 --- a/tests/nvme_ctrl_reset_test.py +++ b/tests/nvme_ctrl_reset_test.py @@ -40,7 +40,7 @@ class TestNVMeCtrlReset(TestNVMe): - Returns: - return code for nvme controller reset. """ - ctrl_reset_cmd = "nvme reset " + self.ctrl + ctrl_reset_cmd = f"{self.nvme_bin} reset {self.ctrl}" return self.exec_cmd(ctrl_reset_cmd) def test_ctrl_reset(self): diff --git a/tests/nvme_dsm_test.py b/tests/nvme_dsm_test.py index d92bf58..4ad3e05 100644 --- a/tests/nvme_dsm_test.py +++ b/tests/nvme_dsm_test.py @@ -45,10 +45,9 @@ class TestNVMeDsm(TestNVMe): - Returns: - return code for nvme dsm command. """ - dsm_cmd = "nvme dsm " + self.ctrl + \ - " --namespace-id=" + str(self.namespace) + \ - " --blocks=" + str(self.range) + \ - " --slbs=" + str(self.start_block) + dsm_cmd = f"{self.nvme_bin} dsm {self.ctrl} " + \ + f"--namespace-id={str(self.namespace)} " + \ + f"--blocks={str(self.range)} --slbs={str(self.start_block)}" return self.exec_cmd(dsm_cmd) def test_dsm(self): diff --git a/tests/nvme_flush_test.py b/tests/nvme_flush_test.py index e4f127d..0f2d3c5 100644 --- a/tests/nvme_flush_test.py +++ b/tests/nvme_flush_test.py @@ -53,8 +53,8 @@ class TestNVMeFlushCmd(TestNVMe): - Returns: - None """ - flush_cmd = "nvme flush " + self.ctrl + " -n " + str(self.default_nsid) - print(flush_cmd) + flush_cmd = f"{self.nvme_bin} flush {self.ctrl} " + \ + f"--namespace-id={str(self.default_nsid)}" return self.exec_cmd(flush_cmd) def test_nvme_flush(self): diff --git a/tests/nvme_format_test.py b/tests/nvme_format_test.py index 12bc128..68445ac 100644 --- a/tests/nvme_format_test.py +++ b/tests/nvme_format_test.py @@ -37,9 +37,9 @@ Namespace Format testcase :- - Delete Namespace. """ +import json import math import subprocess -import time from nvme_test import TestNVMe @@ -55,9 +55,7 @@ class TestNVMeFormatCmd(TestNVMe): - nsze : namespace size. - ncap : namespace capacity. - ctrl_id : controller id. - - lba_format_list : lis of supported format. - - ms_list : list of metadat size per format. - - lbads_list : list of LBA data size per format. + - lba_format_list : json list of supported format. - test_log_dir : directory for logs, temp files. """ @@ -74,12 +72,9 @@ class TestNVMeFormatCmd(TestNVMe): self.nsze = ncap self.ctrl_id = self.get_ctrl_id() self.lba_format_list = [] - self.ms_list = [] - self.lbads_list = [] self.test_log_dir = self.log_dir + "/" + self.__class__.__name__ self.setup_log_dir(self.__class__.__name__) self.delete_all_ns() - time.sleep(1) def tearDown(self): """ @@ -106,50 +101,44 @@ class TestNVMeFormatCmd(TestNVMe): self.dps), 0) self.assertEqual(self.attach_ns(self.ctrl_id, self.default_nsid), 0) # read lbaf information - id_ns = "nvme id-ns " + self.ctrl + \ - " -n1 | grep ^lbaf | awk '{print $2}' | tr -s \"\\n\" \" \"" - proc = subprocess.Popen(id_ns, shell=True, stdout=subprocess.PIPE, + id_ns_cmd = f"{self.nvme_bin} id-ns {self.ctrl} " + \ + f"--namespace-id={self.default_nsid} --output-format=json" + proc = subprocess.Popen(id_ns_cmd, + shell=True, + stdout=subprocess.PIPE, encoding='utf-8') - self.lba_format_list = proc.stdout.read().strip().split(" ") - if proc.wait() == 0: - # read lbads information - id_ns = "nvme id-ns " + self.ctrl + \ - " -n1 | grep ^lbaf | awk '{print $5}'" + \ - " | cut -f 2 -d ':' | tr -s \"\\n\" \" \"" - proc = subprocess.Popen(id_ns, shell=True, stdout=subprocess.PIPE, - encoding='utf-8') - self.lbads_list = proc.stdout.read().strip().split(" ") - # read metadata information - id_ns = "nvme id-ns " + self.ctrl + \ - " -n1 | grep ^lbaf | awk '{print $4}'" + \ - " | cut -f 2 -d ':' | tr -s \"\\n\" \" \"" - proc = subprocess.Popen(id_ns, shell=True, stdout=subprocess.PIPE, - encoding='utf-8') - self.ms_list = proc.stdout.read().strip().split(" ") - self.assertEqual(self.detach_ns(self.ctrl_id, self.default_nsid), 0) - self.assertEqual(self.delete_and_validate_ns(self.default_nsid), 0) - self.nvme_reset_ctrl() + err = proc.wait() + self.assertEqual(err, 0, "ERROR : nvme id-ns failed") + json_output = json.loads(proc.stdout.read()) + self.lba_format_list = json_output['lbafs'] + self.assertTrue(len(self.lba_format_list) > 0, + "ERROR : nvme id-ns could not find any lba formats") + self.assertEqual(self.detach_ns(self.ctrl_id, self.default_nsid), 0) + self.assertEqual(self.delete_and_validate_ns(self.default_nsid), 0) + self.nvme_reset_ctrl() def test_format_ns(self): """ Testcase main """ # extract the supported format information. self.attach_detach_primary_ns() + print("##### Testing lba formats:") # iterate through all supported format - for i in range(0, len(self.lba_format_list)): - print("\nlba format " + str(self.lba_format_list[i]) + - " lbad " + str(self.lbads_list[i]) + - " ms " + str(self.ms_list[i])) - metadata_size = 1 if self.ms_list[i] == '8' else 0 + for flbas, lba_format in enumerate(self.lba_format_list): + ds = lba_format['ds'] + ms = lba_format['ms'] + print(f"\nlba format {str(flbas)}" + f"\nds {str(ds)}" + f"\nms {str(ms)}") + dps = 1 if str(ms) == '8' else 0 err = self.create_and_validate_ns(self.default_nsid, self.nsze, self.ncap, - self.lba_format_list[i], - metadata_size) + flbas, + dps) self.assertEqual(err, 0) self.assertEqual(self.attach_ns(self.ctrl_id, self.default_nsid), 0) - self.run_ns_io(self.default_nsid, self.lbads_list[i]) - time.sleep(5) + self.run_ns_io(self.default_nsid, int(ds)) self.assertEqual(self.detach_ns(self.ctrl_id, self.default_nsid), 0) self.assertEqual(self.delete_and_validate_ns(self.default_nsid), 0) self.nvme_reset_ctrl() diff --git a/tests/nvme_fw_log_test.py b/tests/nvme_fw_log_test.py index b670671..e56953d 100644 --- a/tests/nvme_fw_log_test.py +++ b/tests/nvme_fw_log_test.py @@ -57,16 +57,12 @@ class TestNVMeFwLogCmd(TestNVMe): - Returns: - 0 on success, error code on failure. """ - err = 0 - fw_log_cmd = "nvme fw-log " + self.ctrl + fw_log_cmd = f"{self.nvme_bin} fw-log {self.ctrl}" proc = subprocess.Popen(fw_log_cmd, shell=True, stdout=subprocess.PIPE, encoding='utf-8') - fw_log_output = proc.communicate()[0] - print("\n" + fw_log_output + "\n") - err = proc.wait() - return err + return proc.wait() def test_fw_log(self): """ Testcase main """ diff --git a/tests/nvme_get_features_test.py b/tests/nvme_get_features_test.py index fc3e5bf..d1bf621 100644 --- a/tests/nvme_get_features_test.py +++ b/tests/nvme_get_features_test.py @@ -81,27 +81,23 @@ class TestNVMeGetMandatoryFeatures(TestNVMe): """ if str(feature_id) == "0x09": for vector in range(self.vector_list_len): - get_feat_cmd = "nvme get-feature " + self.ctrl + \ - " --feature-id=" + str(feature_id) + \ - " --cdw11=" + str(vector) + " -H" + get_feat_cmd = f"{self.nvme_bin} get-feature {self.ctrl} " + \ + f"--feature-id={str(feature_id)} " + \ + f"--cdw11={str(vector)} --human-readable" proc = subprocess.Popen(get_feat_cmd, shell=True, stdout=subprocess.PIPE, encoding='utf-8') - feature_output = proc.communicate()[0] - print(feature_output) self.assertEqual(proc.wait(), 0) else: - get_feat_cmd = "nvme get-feature " + self.ctrl + \ - " --feature-id=" + str(feature_id) + " -H" + get_feat_cmd = f"{self.nvme_bin} get-feature {self.ctrl} " + \ + f"--feature-id={str(feature_id)} --human-readable" if str(feature_id) == "0x05": get_feat_cmd += f" --namespace-id={self.default_nsid}" proc = subprocess.Popen(get_feat_cmd, shell=True, stdout=subprocess.PIPE, encoding='utf-8') - feature_output = proc.communicate()[0] - print(feature_output) self.assertEqual(proc.wait(), 0) def test_get_mandatory_features(self): diff --git a/tests/nvme_get_lba_status_test.py b/tests/nvme_get_lba_status_test.py index d9e543c..15842cf 100644 --- a/tests/nvme_get_lba_status_test.py +++ b/tests/nvme_get_lba_status_test.py @@ -50,21 +50,17 @@ class TestNVMeGetLbaStatusCmd(TestNVMe): - Returns: - 0 on success, error code on failure. """ - err = 0 - get_lba_status_cmd = "nvme get-lba-status " + self.ctrl + \ - " --namespace-id=" + str(self.ns1) + \ - " --start-lba=" + str(self.start_lba) + \ - " --max-dw=" + str(self.max_dw) + \ - " --action=" + str(self.action) + \ - " --range-len=" + str(self.range_len) + get_lba_status_cmd = f"{self.nvme_bin} get-lba-status {self.ctrl} " + \ + f"--namespace-id={str(self.ns1)} " + \ + f"--start-lba={str(self.start_lba)} " + \ + f"--max-dw={str(self.max_dw)} " + \ + f"--action={str(self.action)} " + \ + f"--range-len={str(self.range_len)}" proc = subprocess.Popen(get_lba_status_cmd, shell=True, stdout=subprocess.PIPE, encoding='utf-8') - get_lba_status_output = proc.communicate()[0] - print("\n" + get_lba_status_output + "\n") - err = proc.wait() - return err + return proc.wait() def test_get_lba_status(self): """ Testcase main """ diff --git a/tests/nvme_id_ns_test.py b/tests/nvme_id_ns_test.py index 66e2f93..46ed3ee 100644 --- a/tests/nvme_id_ns_test.py +++ b/tests/nvme_id_ns_test.py @@ -42,7 +42,7 @@ class TestNVMeIdentifyNamespace(TestNVMe): """ Pre Section for TestNVMeIdentifyNamespace. """ super().setUp() self.setup_log_dir(self.__class__.__name__) - self.ns_list = self.get_ns_list() + self.nsid_list = self.get_nsid_list() def tearDown(self): """ @@ -60,16 +60,13 @@ class TestNVMeIdentifyNamespace(TestNVMe): - Returns: - 0 on success, error code on failure. """ - err = 0 - id_ns_cmd = "nvme id-ns " + self.ctrl + "n" + str(nsid) + id_ns_cmd = f"{self.nvme_bin} id-ns {self.ctrl} " + \ + f"--namespace-id={str(nsid)}" proc = subprocess.Popen(id_ns_cmd, shell=True, stdout=subprocess.PIPE, encoding='utf-8') - id_ns_output = proc.communicate()[0] - print(id_ns_output + "\n") - err = proc.wait() - return err + return proc.wait() def get_id_ns_all(self): """ @@ -80,7 +77,7 @@ class TestNVMeIdentifyNamespace(TestNVMe): - 0 on success, error code on failure. """ err = 0 - for namespace in self.ns_list: + for namespace in self.nsid_list: err = self.get_id_ns(str(namespace)) return err diff --git a/tests/nvme_lba_status_log_test.py b/tests/nvme_lba_status_log_test.py index a50e211..079fe5c 100644 --- a/tests/nvme_lba_status_log_test.py +++ b/tests/nvme_lba_status_log_test.py @@ -45,16 +45,12 @@ class TestNVMeLbaStatLogCmd(TestNVMe): - Returns: - 0 on success, error code on failure. """ - err = 0 - lba_stat_log_cmd = "nvme lba-status-log " + self.ctrl + lba_stat_log_cmd = f"{self.nvme_bin} lba-status-log {self.ctrl}" proc = subprocess.Popen(lba_stat_log_cmd, shell=True, stdout=subprocess.PIPE, encoding='utf-8') - lba_stat_log_output = proc.communicate()[0] - print("\n" + lba_stat_log_output + "\n") - err = proc.wait() - return err + return proc.wait() def test_lba_stat_log(self): """ Testcase main """ diff --git a/tests/nvme_smart_log_test.py b/tests/nvme_smart_log_test.py index 196998b..2bc81d8 100644 --- a/tests/nvme_smart_log_test.py +++ b/tests/nvme_smart_log_test.py @@ -27,7 +27,7 @@ NVMe Smart Log Verification Testcase:- """ -from nvme_test import TestNVMe +from nvme_test import TestNVMe, to_decimal class TestNVMeSmartLogCmd(TestNVMe): @@ -76,14 +76,14 @@ class TestNVMeSmartLogCmd(TestNVMe): - Returns: - 0 on success, error code on failure. """ - ns_list = self.get_ns_list() - for nsid in range(0, len(ns_list)): - self.get_smart_log_ns(ns_list[nsid]) + nsid_list = self.get_nsid_list() + for nsid in nsid_list: + self.get_smart_log_ns(nsid) return 0 def test_smart_log(self): """ Testcase main """ self.assertEqual(self.get_smart_log_ctrl(), 0) - smlp = self.supp_check_id_ctrl("lpa") + smlp = to_decimal(self.get_id_ctrl_field_value("lpa")) if smlp & 0x1: self.assertEqual(self.get_smart_log_all_ns(), 0) diff --git a/tests/nvme_test.py b/tests/nvme_test.py index a13a993..80750f5 100644 --- a/tests/nvme_test.py +++ b/tests/nvme_test.py @@ -30,12 +30,22 @@ import shutil import stat import subprocess import sys -import time import unittest +import time from nvme_test_logger import TestNVMeLogger +def to_decimal(value): + """ Wrapper for converting numbers to base 10 decimal + - Args: + - value: A number in any common base + - Returns: + - Decimal integer + """ + return int(str(value), 0) + + class TestNVMe(unittest.TestCase): """ @@ -58,19 +68,28 @@ class TestNVMe(unittest.TestCase): self.ctrl = "XXX" self.ns1 = "XXX" self.test_log_dir = "XXX" + self.nvme_bin = "nvme" self.do_validate_pci_device = True self.default_nsid = 0x1 + self.flbas = 0 self.config_file = 'tests/config.json' self.load_config() if self.do_validate_pci_device: self.validate_pci_device() + self.create_and_attach_default_ns() + print(f"\nsetup: ctrl: {self.ctrl}, ns1: {self.ns1}, default_nsid: {self.default_nsid}, flbas: {self.flbas}\n") def tearDown(self): """ Post Section for TestNVMe. """ if self.clear_log_dir is True: shutil.rmtree(self.log_dir, ignore_errors=True) self.create_and_attach_default_ns() + print(f"\nteardown: ctrl: {self.ctrl}, ns1: {self.ns1}, default_nsid: {self.default_nsid}, flbas: {self.flbas}\n") + + @classmethod + def tearDownClass(cls): + print("\n") def create_and_attach_default_ns(self): """ Creates a default namespace with the full capacity of the ctrls NVM @@ -103,8 +122,8 @@ class TestNVMe(unittest.TestCase): - None """ x1, x2, dev = self.ctrl.split('/') - cmd = cmd = "find /sys/devices -name \\*" + dev + " | grep -i pci" - err = subprocess.call(cmd, shell=True) + cmd = "find /sys/devices -name \\*" + dev + " | grep -i pci" + err = subprocess.call(cmd, shell=True, stdout=subprocess.DEVNULL) self.assertEqual(err, 0, "ERROR : Only NVMe PCI subsystem is supported") def load_config(self): @@ -119,7 +138,10 @@ class TestNVMe(unittest.TestCase): self.ctrl = config['controller'] self.ns1 = config['ns1'] self.log_dir = config['log_dir'] - self.do_validate_pci_device = config.get('do_validate_pci_device', self.do_validate_pci_device) + self.nvme_bin = config.get('nvme_bin', self.nvme_bin) + print(f"\nUsing nvme binary '{self.nvme_bin}'") + self.do_validate_pci_device = config.get( + 'do_validate_pci_device', self.do_validate_pci_device) self.clear_log_dir = False if self.clear_log_dir is True: @@ -154,20 +176,17 @@ class TestNVMe(unittest.TestCase): - Returns: - None """ - nvme_reset_cmd = "nvme reset " + self.ctrl + nvme_reset_cmd = f"{self.nvme_bin} reset {self.ctrl}" err = subprocess.call(nvme_reset_cmd, shell=True, - stdout=subprocess.PIPE, - encoding='utf-8') + stdout=subprocess.DEVNULL) self.assertEqual(err, 0, "ERROR : nvme reset failed") - time.sleep(5) rescan_cmd = "echo 1 > /sys/bus/pci/rescan" proc = subprocess.Popen(rescan_cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding='utf-8') - time.sleep(5) self.assertEqual(proc.wait(), 0, "ERROR : pci rescan failed") def get_ctrl_id(self): @@ -177,7 +196,8 @@ class TestNVMe(unittest.TestCase): - Returns: - controller id. """ - get_ctrl_id = f"nvme list-ctrl {self.ctrl} --output-format=json" + get_ctrl_id = f"{self.nvme_bin} list-ctrl {self.ctrl} " + \ + "--output-format=json" proc = subprocess.Popen(get_ctrl_id, shell=True, stdout=subprocess.PIPE, @@ -189,7 +209,7 @@ class TestNVMe(unittest.TestCase): "ERROR : nvme list-ctrl could not find ctrl") return str(json_output['ctrl_list'][0]['ctrl_id']) - def get_ns_list(self): + def get_nsid_list(self): """ Wrapper for extracting the namespace list. - Args: - None @@ -197,14 +217,17 @@ class TestNVMe(unittest.TestCase): - List of the namespaces. """ ns_list = [] - ns_list_cmd = "nvme list-ns " + self.ctrl + ns_list_cmd = f"{self.nvme_bin} list-ns {self.ctrl} " + \ + "--output-format=json" proc = subprocess.Popen(ns_list_cmd, shell=True, stdout=subprocess.PIPE, encoding='utf-8') self.assertEqual(proc.wait(), 0, "ERROR : nvme list namespace failed") - for line in proc.stdout: - ns_list.append(line.split('x')[-1]) + json_output = json.loads(proc.stdout.read()) + + for ns in json_output['nsid_list']: + ns_list.append(ns['nsid']) return ns_list @@ -215,22 +238,16 @@ class TestNVMe(unittest.TestCase): - Returns: - maximum number of namespaces supported. """ - pattern = re.compile("^nn[ ]+: [0-9]", re.IGNORECASE) - max_ns = -1 - max_ns_cmd = "nvme id-ctrl " + self.ctrl + max_ns_cmd = f"{self.nvme_bin} id-ctrl {self.ctrl} " + \ + "--output-format=json" proc = subprocess.Popen(max_ns_cmd, shell=True, stdout=subprocess.PIPE, encoding='utf-8') err = proc.wait() self.assertEqual(err, 0, "ERROR : reading maximum namespace count failed") - - for line in proc.stdout: - if pattern.match(line): - max_ns = line.split(":")[1].strip() - break - print(max_ns) - return int(max_ns) + json_output = json.loads(proc.stdout.read()) + return int(json_output['nn']) def get_lba_status_supported(self): """ Check if 'Get LBA Status' command is supported by the device @@ -239,7 +256,7 @@ class TestNVMe(unittest.TestCase): - Returns: - True if 'Get LBA Status' command is supported, otherwise False """ - return int(self.get_id_ctrl_field_value("oacs"), 16) & (1 << 9) + return to_decimal(self.get_id_ctrl_field_value("oacs")) & (1 << 9) def get_lba_format_size(self): """ Wrapper for extracting lba format size of the given flbas @@ -248,7 +265,8 @@ class TestNVMe(unittest.TestCase): - Returns: - lba format size as a tuple of (data_size, metadata_size) in bytes. """ - nvme_id_ns_cmd = f"nvme id-ns {self.ns1} --output-format=json" + nvme_id_ns_cmd = f"{self.nvme_bin} id-ns {self.ns1} " + \ + "--output-format=json" proc = subprocess.Popen(nvme_id_ns_cmd, shell=True, stdout=subprocess.PIPE, @@ -274,24 +292,9 @@ class TestNVMe(unittest.TestCase): - Args: - None - Returns: - - maximum number of namespaces supported. + - Total NVM capacity. """ - pattern = re.compile("^tnvmcap[ ]+: [0-9]", re.IGNORECASE) - ncap = -1 - ncap_cmd = "nvme id-ctrl " + self.ctrl - proc = subprocess.Popen(ncap_cmd, - shell=True, - stdout=subprocess.PIPE, - encoding='utf-8') - err = proc.wait() - self.assertEqual(err, 0, "ERROR : reading nvm capacity failed") - - for line in proc.stdout: - if pattern.match(line): - ncap = line.split(":")[1].strip() - break - print(ncap) - return int(ncap) + return to_decimal(self.get_id_ctrl_field_value("tnvmcap")) def get_id_ctrl_field_value(self, field): """ Wrapper for extracting id-ctrl field values @@ -300,7 +303,8 @@ class TestNVMe(unittest.TestCase): - Returns: - Filed value of the given field """ - id_ctrl_cmd = f"nvme id-ctrl {self.ctrl} --output-format=json" + id_ctrl_cmd = f"{self.nvme_bin} id-ctrl {self.ctrl} " + \ + "--output-format=json" proc = subprocess.Popen(id_ctrl_cmd, shell=True, stdout=subprocess.PIPE, @@ -319,30 +323,7 @@ class TestNVMe(unittest.TestCase): - Returns: - Optional Copy Formats Supported """ - return int(self.get_id_ctrl_field_value("ocfs"), 16) - - def get_format(self): - """ Wrapper for extracting format. - - Args: - - None - - Returns: - - maximum format of namespace. - """ - # defaulting to 4K - nvm_format = 4096 - nvm_format_cmd = "nvme id-ns " + self.ctrl + " -n1" - proc = subprocess.Popen(nvm_format_cmd, - shell=True, - stdout=subprocess.PIPE, - encoding='utf-8') - err = proc.wait() - self.assertEqual(err, 0, "ERROR : reading nvm capacity failed") - - for line in proc.stdout: - if "in use" in line: - nvm_format = 2 ** int(line.split(":")[3].split()[0]) - print(nvm_format) - return int(nvm_format) + return to_decimal(self.get_id_ctrl_field_value("ocfs")) def delete_all_ns(self): """ Wrapper for deleting all the namespaces. @@ -351,15 +332,19 @@ class TestNVMe(unittest.TestCase): - Returns: - None """ - delete_ns_cmd = "nvme delete-ns " + self.ctrl + " -n 0xFFFFFFFF" + delete_ns_cmd = f"{self.nvme_bin} delete-ns {self.ctrl} " + \ + "--namespace-id=0xFFFFFFFF" self.assertEqual(self.exec_cmd(delete_ns_cmd), 0) - list_ns_cmd = "nvme list-ns " + self.ctrl + " --all | wc -l" + list_ns_cmd = f"{self.nvme_bin} list-ns {self.ctrl} --all " + \ + "--output-format=json" proc = subprocess.Popen(list_ns_cmd, shell=True, stdout=subprocess.PIPE, encoding='utf-8') - output = proc.stdout.read().strip() - self.assertEqual(output, '0', "ERROR : deleting all namespace failed") + self.assertEqual(proc.wait(), 0, "ERROR : nvme list-ns failed") + json_output = json.loads(proc.stdout.read()) + self.assertEqual(len(json_output['nsid_list']), 0, + "ERROR : deleting all namespace failed") def create_ns(self, nsze, ncap, flbas, dps): """ Wrapper for creating a namespace. @@ -371,9 +356,9 @@ class TestNVMe(unittest.TestCase): - Returns: - return code of the nvme create namespace command. """ - create_ns_cmd = "nvme create-ns " + self.ctrl + " --nsze=" + \ - str(nsze) + " --ncap=" + str(ncap) + \ - " --flbas=" + str(flbas) + " --dps=" + str(dps) + create_ns_cmd = f"{self.nvme_bin} create-ns {self.ctrl} " + \ + f"--nsze={str(nsze)} --ncap={str(ncap)} --flbas={str(flbas)} " + \ + f"--dps={str(dps)} --verbose" return self.exec_cmd(create_ns_cmd) def create_and_validate_ns(self, nsid, nsze, ncap, flbas, dps): @@ -389,15 +374,14 @@ class TestNVMe(unittest.TestCase): """ err = self.create_ns(nsze, ncap, flbas, dps) if err == 0: - time.sleep(2) - id_ns_cmd = "nvme id-ns " + self.ctrl + " -n " + str(nsid) + id_ns_cmd = f"{self.nvme_bin} id-ns {self.ctrl} " + \ + f"--namespace-id={str(nsid)}" err = subprocess.call(id_ns_cmd, shell=True, - stdout=subprocess.PIPE, - encoding='utf-8') + stdout=subprocess.DEVNULL) return err - def attach_ns(self, ctrl_id, ns_id): + def attach_ns(self, ctrl_id, nsid): """ Wrapper for attaching the namespace. - Args: - ctrl_id : controller id to which namespace to be attached. @@ -405,21 +389,23 @@ class TestNVMe(unittest.TestCase): - Returns: - 0 on success, error code on failure. """ - attach_ns_cmd = "nvme attach-ns " + self.ctrl + \ - " --namespace-id=" + str(ns_id) + \ - " --controllers=" + ctrl_id + attach_ns_cmd = f"{self.nvme_bin} attach-ns {self.ctrl} " + \ + f"--namespace-id={str(nsid)} --controllers={ctrl_id} --verbose" err = subprocess.call(attach_ns_cmd, shell=True, - stdout=subprocess.PIPE, - encoding='utf-8') - time.sleep(5) - if err == 0: - # enumerate new namespace block device - self.nvme_reset_ctrl() - time.sleep(5) - # check if new namespace block device exists - err = 0 if stat.S_ISBLK(os.stat(self.ns1).st_mode) else 1 - return err + stdout=subprocess.DEVNULL) + if err != 0: + return err + + # Try to find block device for 5 seconds + device_path = f"{self.ctrl}n{str(nsid)}" + stop_time = time.time() + 5 + while time.time() < stop_time: + if os.path.exists(device_path) and stat.S_ISBLK(os.stat(device_path).st_mode): + return 0 + time.sleep(0.1) + + return 1 def detach_ns(self, ctrl_id, nsid): """ Wrapper for detaching the namespace. @@ -429,13 +415,11 @@ class TestNVMe(unittest.TestCase): - Returns: - 0 on success, error code on failure. """ - detach_ns_cmd = "nvme detach-ns " + self.ctrl + \ - " --namespace-id=" + str(nsid) + \ - " --controllers=" + ctrl_id + detach_ns_cmd = f"{self.nvme_bin} detach-ns {self.ctrl} " + \ + f"--namespace-id={str(nsid)} --controllers={ctrl_id} --verbose" return subprocess.call(detach_ns_cmd, shell=True, - stdout=subprocess.PIPE, - encoding='utf-8') + stdout=subprocess.DEVNULL) def delete_and_validate_ns(self, nsid): """ Wrapper for deleting and validating that namespace is deleted. @@ -445,11 +429,11 @@ class TestNVMe(unittest.TestCase): - 0 on success, 1 on failure. """ # delete the namespace - delete_ns_cmd = "nvme delete-ns " + self.ctrl + " -n " + str(nsid) + delete_ns_cmd = f"{self.nvme_bin} delete-ns {self.ctrl} " + \ + f"--namespace-id={str(nsid)} --verbose" err = subprocess.call(delete_ns_cmd, shell=True, - stdout=subprocess.PIPE, - encoding='utf-8') + stdout=subprocess.DEVNULL) self.assertEqual(err, 0, "ERROR : delete namespace failed") return err @@ -460,16 +444,14 @@ class TestNVMe(unittest.TestCase): - Returns: - 0 on success, error code on failure. """ - smart_log_cmd = "nvme smart-log " + self.ctrl + " -n " + str(nsid) - print(smart_log_cmd) + smart_log_cmd = f"{self.nvme_bin} smart-log {self.ctrl} " + \ + f"--namespace-id={str(nsid)}" proc = subprocess.Popen(smart_log_cmd, shell=True, stdout=subprocess.PIPE, encoding='utf-8') err = proc.wait() self.assertEqual(err, 0, "ERROR : nvme smart log failed") - smart_log_output = proc.communicate()[0] - print(f"{smart_log_output}") return err def get_id_ctrl(self, vendor=False): @@ -480,10 +462,10 @@ class TestNVMe(unittest.TestCase): - 0 on success, error code on failure. """ if not vendor: - id_ctrl_cmd = "nvme id-ctrl " + self.ctrl + id_ctrl_cmd = f"{self.nvme_bin} id-ctrl {self.ctrl}" else: - id_ctrl_cmd = "nvme id-ctrl --vendor-specific " + self.ctrl - print(id_ctrl_cmd) + id_ctrl_cmd = f"{self.nvme_bin} id-ctrl " +\ + f"--vendor-specific {self.ctrl}" proc = subprocess.Popen(id_ctrl_cmd, shell=True, stdout=subprocess.PIPE, @@ -500,13 +482,14 @@ class TestNVMe(unittest.TestCase): - 0 on success, error code on failure. """ pattern = re.compile(r"^ Entry\[[ ]*[0-9]+\]") - error_log_cmd = "nvme error-log " + self.ctrl + error_log_cmd = f"{self.nvme_bin} error-log {self.ctrl}" proc = subprocess.Popen(error_log_cmd, shell=True, stdout=subprocess.PIPE, encoding='utf-8') err = proc.wait() self.assertEqual(err, 0, "ERROR : nvme error log failed") + # This sanity checkes the 'normal' output line = proc.stdout.readline() err_log_entry_count = int(line.split(" ")[5].strip().split(":")[1]) entry_count = 0 @@ -523,42 +506,20 @@ class TestNVMe(unittest.TestCase): - Returns: - None """ - block_size = mmap.PAGESIZE if int(lbads) < 9 else 2 ** int(lbads) + (ds, _) = self.get_lba_format_size() + block_size = ds if int(lbads) < 9 else 2 ** int(lbads) ns_path = self.ctrl + "n" + str(nsid) io_cmd = "dd if=" + ns_path + " of=/dev/null" + " bs=" + \ str(block_size) + " count=" + str(count) + " > /dev/null 2>&1" - print(io_cmd) + print(f"Running io: {io_cmd}") run_io = subprocess.Popen(io_cmd, shell=True, stdout=subprocess.PIPE, encoding='utf-8') run_io_result = run_io.communicate()[1] self.assertEqual(run_io_result, None) io_cmd = "dd if=/dev/zero of=" + ns_path + " bs=" + \ str(block_size) + " count=" + str(count) + " > /dev/null 2>&1" - print(io_cmd) + print(f"Running io: {io_cmd}") run_io = subprocess.Popen(io_cmd, shell=True, stdout=subprocess.PIPE, encoding='utf-8') run_io_result = run_io.communicate()[1] self.assertEqual(run_io_result, None) - - def supp_check_id_ctrl(self, key): - """ Wrapper for support check. - - Args: - - key : search key. - - Returns: - - value for key requested. - """ - id_ctrl = "nvme id-ctrl " + self.ctrl - print("\n" + id_ctrl) - proc = subprocess.Popen(id_ctrl, - shell=True, - stdout=subprocess.PIPE, - encoding='utf-8') - err = proc.wait() - self.assertEqual(err, 0, "ERROR : nvme Identify controller Data \ - structure failed") - for line in proc.stdout: - if key in line: - key = line.replace(",", "", 1) - print(key) - val = (key.split(':'))[1].strip() - return int(val, 16) diff --git a/tests/nvme_test_io.py b/tests/nvme_test_io.py index bf30e0a..4cd5571 100644 --- a/tests/nvme_test_io.py +++ b/tests/nvme_test_io.py @@ -43,7 +43,7 @@ class TestNVMeIO(TestNVMe): """ Pre Section for TestNVMeIO """ super().setUp() # common code used in various testcases. - self.data_size = 512 + (self.data_size, _) = self.get_lba_format_size() self.start_block = 0 self.block_count = 0 self.write_file = "write_file.txt" @@ -77,10 +77,10 @@ class TestNVMeIO(TestNVMe): - Returns: - return code for nvme write command. """ - write_cmd = "nvme write " + self.ns1 + " --start-block=" + \ - str(self.start_block) + " --block-count=" + \ - str(self.block_count) + " --data-size=" + \ - str(self.data_size) + " --data=" + self.write_file + write_cmd = f"{self.nvme_bin} write {self.ns1} " + \ + f"--start-block={str(self.start_block)} " + \ + f"--block-count={str(self.block_count)} " + \ + f"--data-size={str(self.data_size)} --data={self.write_file}" return self.exec_cmd(write_cmd) def nvme_read(self): @@ -90,9 +90,8 @@ class TestNVMeIO(TestNVMe): - Returns: - return code for nvme read command. """ - read_cmd = "nvme read " + self.ns1 + " --start-block=" + \ - str(self.start_block) + " --block-count=" + \ - str(self.block_count) + " --data-size=" + \ - str(self.data_size) + " --data=" + self.read_file - print(read_cmd) + read_cmd = f"{self.nvme_bin} read {self.ns1} " + \ + f"--start-block={str(self.start_block)} " + \ + f"--block-count={str(self.block_count)} " + \ + f"--data-size={str(self.data_size)} --data={self.read_file}" return self.exec_cmd(read_cmd) diff --git a/tests/nvme_verify_test.py b/tests/nvme_verify_test.py index 7c30828..90e149d 100644 --- a/tests/nvme_verify_test.py +++ b/tests/nvme_verify_test.py @@ -13,7 +13,7 @@ NVMe Verify Testcase:- """ -from nvme_test import TestNVMe +from nvme_test import TestNVMe, to_decimal class TestNVMeVerify(TestNVMe): @@ -25,9 +25,21 @@ class TestNVMeVerify(TestNVMe): - test_log_dir : directory for logs, temp files. """ + def verify_cmd_supported(self): + """ Wrapper for extracting optional NVM 'verify' command support + - Args: + - None + - Returns: + - True if 'verify' is supported, otherwise False + """ + return to_decimal(self.get_id_ctrl_field_value("oncs")) & (1 << 7) + def setUp(self): """ Pre Section for TestNVMeVerify """ super().setUp() + if not self.verify_cmd_supported(): + self.skipTest( + "because: Optional NVM Command 'Verify' (NVMVFYS) not supported") self.start_block = 0 self.block_count = 0 self.namespace = 1 @@ -44,10 +56,10 @@ class TestNVMeVerify(TestNVMe): - Returns: - return code for nvme verify command. """ - verify_cmd = "nvme verify " + self.ctrl + \ - " --namespace-id=" + str(self.namespace) + \ - " --start-block=" + str(self.start_block) + \ - " --block-count=" + str(self.block_count) + verify_cmd = f"{self.nvme_bin} verify {self.ctrl} " + \ + f"--namespace-id={str(self.namespace)} " + \ + f"--start-block={str(self.start_block)} " + \ + f"--block-count={str(self.block_count)}" return self.exec_cmd(verify_cmd) def test_verify(self): diff --git a/tests/nvme_writeuncor_test.py b/tests/nvme_writeuncor_test.py index 1083d46..8e0b9a0 100644 --- a/tests/nvme_writeuncor_test.py +++ b/tests/nvme_writeuncor_test.py @@ -63,9 +63,9 @@ class TestNVMeUncor(TestNVMeIO): - Returns: - return code of nvme write uncorrectable command. """ - write_uncor_cmd = "nvme write-uncor " + self.ns1 + \ - " --start-block=" + str(self.start_block) + \ - " --block-count=" + str(self.block_count) + write_uncor_cmd = f"{self.nvme_bin} write-uncor {self.ns1} " + \ + f"--start-block={str(self.start_block)} " + \ + f"--block-count={str(self.block_count)}" return self.exec_cmd(write_uncor_cmd) def test_write_uncor(self): diff --git a/tests/nvme_writezeros_test.py b/tests/nvme_writezeros_test.py index 3231e3d..75d5687 100644 --- a/tests/nvme_writezeros_test.py +++ b/tests/nvme_writezeros_test.py @@ -71,9 +71,9 @@ class TestNVMeWriteZeros(TestNVMeIO): - Returns: - return code for nvme write command. """ - write_zeroes_cmd = "nvme write-zeroes " + self.ns1 + \ - " --start-block=" + str(self.start_block) + \ - " --block-count=" + str(self.block_count) + write_zeroes_cmd = f"{self.nvme_bin} write-zeroes {self.ns1} " + \ + f"--start-block={str(self.start_block)} " + \ + f"--block-count={str(self.block_count)}" return self.exec_cmd(write_zeroes_cmd) def validate_write_read(self): diff --git a/util/argconfig.h b/util/argconfig.h index 3dff25a..44d2e4e 100644 --- a/util/argconfig.h +++ b/util/argconfig.h @@ -96,6 +96,12 @@ enum argconfig_types { #define OPT_LIST(l, s, v, d, ...) OPT_STRING(l, s, "LIST", v, d, __VA_ARGS__) #define OPT_STR(l, s, v, d, ...) OPT_STRING(l, s, "STRING", v, d, __VA_ARGS__) +#ifdef CONFIG_JSONC +#define OPT_FLAG_JSON(l, s, v, d, ...) OPT_FLAG(l, s, v, d, __VA_ARGS__) +#else /* CONFIG_JSONC */ +#define OPT_FLAG_JSON(l, s, v, d, ...) OPT_END() +#endif /* CONFIG_JSONC */ + #define OPT_VALS(n) \ struct argconfig_opt_val n[] diff --git a/util/json.c b/util/json.c index 2de5848..6c6413c 100644 --- a/util/json.c +++ b/util/json.c @@ -4,6 +4,7 @@ #include "json.h" #include "types.h" +#include "cleanup.h" struct json_object *util_json_object_new_double(long double d) { @@ -72,3 +73,65 @@ uint64_t util_json_object_get_uint64(struct json_object *obj) return val; } + +void json_object_add_uint_02x(struct json_object *o, const char *k, __u32 v) +{ + json_object_add_uint_0nx(o, k, v, 2); +} + +void json_object_add_uint_0x(struct json_object *o, const char *k, __u32 v) +{ + char str[STR_LEN]; + + sprintf(str, "0x%x", v); + json_object_add_value_string(o, k, str); +} + +void json_object_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) { + json_object_add_value_string(o, k, "No information provided"); + return; + } + + value = calloc(1, (len + 1) * 2 + 1); + + if (!value) { + json_object_add_value_string(o, k, "Could not allocate string"); + return; + } + + sprintf(value, "0x"); + for (i = 1; i <= len; i++) + sprintf(&value[i * 2], "%02x", buf[len - i]); + + json_object_add_value_string(o, k, value); +} + +void json_object_add_nprix64(struct json_object *o, const char *k, uint64_t v) +{ + char str[STR_LEN]; + + sprintf(str, "%#"PRIx64"", v); + json_object_add_value_string(o, k, str); +} + +void json_object_add_uint_0nx(struct json_object *o, const char *k, __u32 v, int width) +{ + char str[STR_LEN]; + + sprintf(str, "0x%0*x", width, v); + json_object_add_value_string(o, k, str); +} + +void json_object_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); + json_object_add_value_string(o, k, str); +} diff --git a/util/json.h b/util/json.h index 3dd5b52..5f51b7b 100644 --- a/util/json.h +++ b/util/json.h @@ -9,37 +9,34 @@ /* Wrappers around json-c's API */ #define json_create_object(o) json_object_new_object(o) -#define json_create_array(a) json_object_new_array(a) #define json_free_object(o) json_object_put(o) #define json_free_array(a) json_object_put(a) -#define json_object_add_value_uint(o, k, v) \ - json_object_object_add(o, k, json_object_new_uint64(v)) -#define json_object_add_value_int(o, k, v) \ - json_object_object_add(o, k, json_object_new_int(v)) +#define json_object_add_value_uint(o, k, v) json_object_object_add(o, k, json_object_new_uint64(v)) +#define json_object_add_value_int(o, k, v) json_object_object_add(o, k, json_object_new_int(v)) #ifndef CONFIG_JSONC_14 #define json_object_new_uint64(v) util_json_object_new_uint64(v) #define json_object_get_uint64(v) util_json_object_get_uint64(v) -#endif +#endif /* CONFIG_JSONC_14 */ #define json_object_add_value_uint64(o, k, v) \ json_object_object_add(o, k, json_object_new_uint64(v)) #define json_object_add_value_uint128(o, k, v) \ json_object_object_add(o, k, util_json_object_new_uint128(v)) #define json_object_add_value_double(o, k, v) \ json_object_object_add(o, k, util_json_object_new_double(v)) -#define json_object_add_value_float(o, k, v) \ - json_object_object_add(o, k, json_object_new_double(v)) -static inline int json_object_add_value_string(struct json_object *o, const char *k, const char *v) { +#define json_object_add_value_float(o, k, v) json_object_object_add(o, k, json_object_new_double(v)) + +static inline int json_object_add_value_string(struct json_object *o, const char *k, const char *v) +{ return json_object_object_add(o, k, v ? json_object_new_string(v) : NULL); } -#define json_object_add_value_array(o, k, v) \ - json_object_object_add(o, k, v) -#define json_object_add_value_object(o, k, v) \ - json_object_object_add(o, k, v) -#define json_array_add_value_object(o, k) \ - json_object_array_add(o, k) -static inline int json_array_add_value_string(struct json_object *o, const char *v) { + +#define json_array_add_value_object(o, k) json_object_array_add(o, k) + +static inline int json_array_add_value_string(struct json_object *o, const char *v) +{ return json_object_array_add(o, v ? json_object_new_string(v) : NULL); } + #define json_print_object(o, u) \ printf("%s", json_object_to_json_string_ext(o, \ JSON_C_TO_STRING_PRETTY | \ @@ -51,13 +48,35 @@ struct json_object *util_json_object_new_uint128(nvme_uint128_t val); struct json_object *util_json_object_new_uint128(nvme_uint128_t val); uint64_t util_json_object_get_uint64(struct json_object *obj); - -#else /* !CONFIG_JSONC */ - +#else /* CONFIG_JSONC */ struct json_object; #define json_object_add_value_string(o, k, v) +#define json_create_object(o) NULL +#define json_free_object(o) ((void)(o)) +#define json_object_add_value_uint(o, k, v) ((void)(v)) +#define json_object_add_value_int(o, k, v) ((void)(v)) +#define json_object_add_value_uint64(o, k, v) ((void)(v)) +#define json_object_add_value_uint128(o, k, v) +#define json_object_add_value_double(o, k, v) +#define json_object_add_value_float(o, k, v) +#define json_array_add_value_object(o, k) ((void)(k)) +#define json_print_object(o, u) ((void)(o)) +#define json_object_object_add(o, k, v) ((void)(v)) +#define json_object_new_int(v) +#define json_object_new_array(a) NULL +#define json_object_array_add(o, k) ((void)(k)) +#endif /* CONFIG_JSONC */ -#endif +#define json_create_array(a) json_object_new_array(a) +#define json_object_add_value_array(o, k, v) json_object_object_add(o, k, v) +#define json_object_add_value_object(o, k, v) json_object_object_add(o, k, v) -#endif +void json_object_add_uint_02x(struct json_object *o, const char *k, __u32 v); +void json_object_add_uint_0x(struct json_object *o, const char *k, __u32 v); +void json_object_add_byte_array(struct json_object *o, const char *k, unsigned char *buf, int len); +void json_object_add_nprix64(struct json_object *o, const char *k, uint64_t v); +void json_object_add_uint_0nx(struct json_object *o, const char *k, __u32 v, int width); +void json_object_add_0nprix64(struct json_object *o, const char *k, uint64_t v, int width); + +#endif /* __JSON__H */ diff --git a/util/logging.c b/util/logging.c index 8e59948..a855a3d 100644 --- a/util/logging.c +++ b/util/logging.c @@ -81,8 +81,9 @@ static void nvme_show_command64(struct nvme_passthru_cmd64 *cmd, int err) static void nvme_show_latency(struct timeval start, struct timeval end) { - printf("latency : %lu us\n", - (end.tv_sec - start.tv_sec) * 1000000 + (end.tv_usec - start.tv_usec)); + printf("latency : %llu us\n", + (unsigned long long)((end.tv_sec - start.tv_sec) * 1000000 + + (end.tv_usec - start.tv_usec))); } int nvme_submit_passthru(int fd, unsigned long ioctl_cmd, diff --git a/util/logging.h b/util/logging.h index bf02984..6899a4f 100644 --- a/util/logging.h +++ b/util/logging.h @@ -5,10 +5,16 @@ #include <stdbool.h> -#define print_info(...) \ - do { \ - if (log_level >= LOG_INFO) \ - printf(__VA_ARGS__); \ +#define print_info(...) \ + do { \ + if (log_level >= LOG_INFO) \ + printf(__VA_ARGS__); \ + } while (false) + +#define print_debug(...) \ + do { \ + if (log_level >= LOG_DEBUG) \ + printf(__VA_ARGS__); \ } while (false) extern int log_level; diff --git a/util/types.c b/util/types.c index 20c121b..0c58f17 100644 --- a/util/types.c +++ b/util/types.c @@ -5,6 +5,7 @@ #include <string.h> #include <locale.h> #include <time.h> +#include <limits.h> #include <ccan/endian/endian.h> @@ -36,18 +37,30 @@ long double int128_to_double(__u8 *data) return result; } -uint64_t int48_to_long(__u8 *data) +static uint64_t int_to_long(int bits, const __u8 *data) { int i; uint64_t result = 0; + int bytes = (bits + CHAR_BIT - 1) / CHAR_BIT; - for (i = 0; i < 6; i++) { - result *= 256; - result += data[5 - i]; + for (i = 0; i < bytes; i++) { + result <<= CHAR_BIT; + result += data[bytes - 1 - i]; } + return result; } +uint64_t int48_to_long(const __u8 *data) +{ + return int_to_long(48, data); +} + +uint64_t int56_to_long(const __u8 *data) +{ + return int_to_long(56, data); +} + long double uint128_t_to_double(nvme_uint128_t data) { long double result = 0; @@ -166,7 +179,7 @@ int convert_ts(time_t time, char *ts_buf) gmtime_r((const time_t *)&time_human, &time_info); strftime(buf, sizeof(buf), "%Y-%m-%dD|%H:%M:%S", &time_info); - sprintf(ts_buf, "%s:%03ld", buf, time_ms); + sprintf(ts_buf, "%s:%03llu", buf, (unsigned long long)time_ms); return 0; } diff --git a/util/types.h b/util/types.h index b2e8fc8..4046d5c 100644 --- a/util/types.h +++ b/util/types.h @@ -11,6 +11,8 @@ #define ABSOLUTE_ZERO_CELSIUS -273 +#define STR_LEN 100 + static inline long kelvin_to_celsius(long t) { return t + ABSOLUTE_ZERO_CELSIUS; @@ -36,7 +38,8 @@ typedef union nvme_uint128 nvme_uint128_t; nvme_uint128_t le128_to_cpu(__u8 *data); long double int128_to_double(__u8 *data); -uint64_t int48_to_long(__u8 *data); +uint64_t int48_to_long(const __u8 *data); +uint64_t int56_to_long(const __u8 *data); char *uint128_t_to_string(nvme_uint128_t val); char *uint128_t_to_l10n_string(nvme_uint128_t val); diff --git a/util/utils.c b/util/utils.c index 5d77652..ea30a4b 100644 --- a/util/utils.c +++ b/util/utils.c @@ -138,7 +138,7 @@ unsigned char *read_binary_file(char *data_dir_path, const char *bin_path, void print_formatted_var_size_str(const char *msg, const __u8 *pdata, size_t data_size, FILE *fp) { - char description_str[256] = ""; + char description_str[1024] = ""; char temp_buffer[3] = { 0 }; for (size_t i = 0; i < data_size; ++i) { @@ -146,10 +146,10 @@ void print_formatted_var_size_str(const char *msg, const __u8 *pdata, size_t dat strcat(description_str, temp_buffer); } - if (fp) - fprintf(fp, "%s: %s\n", msg, description_str); - else - printf("%s: %s\n", msg, description_str); + if (!fp) + fp = stdout; + + fprintf(fp, "%s: %s\n", msg, description_str); } void process_field_size_16(int offset, char *sfield, __u8 *buf, char *datastr)