Nvmed: Add support for command & feature lockdown log page Added implementation for the new admin log page command to pull the command and feature lockdown log page. There were also changes made to support this change to the libnvme repo as a patch and those were put up for review separately This is to support E1.S SSD left shift development Tested: Successfully tested the new admin log page command on a local machine. Redfish URI dump - https://paste.googleplex.com/4664890681851904 Google-Bug-Id: 439949469 Change-Id: I0288788b9f85e182138e127e9348da32e979a26f Signed-off-by: Agrim Bharat <agrimbharat@google.com>
diff --git a/src/NVMeMi.cpp b/src/NVMeMi.cpp index 3cb030b..8b47e77 100644 --- a/src/NVMeMi.cpp +++ b/src/NVMeMi.cpp
@@ -919,8 +919,8 @@ } void NVMeMi::adminGetLogPage( - nvme_mi_ctrl_t ctrl, nvme_cmd_get_log_lid lid, uint32_t nsid, - uint8_t /*lsp*/, uint16_t /*lsi*/, + nvme_mi_ctrl_t ctrl, nvme_cmd_get_log_lid lid, uint32_t nsid, uint8_t lsp, + uint16_t /*lsi*/, std::function<void(const std::error_code&, std::span<uint8_t>)>&& cb) { if (auto degraded = isEndpointDegraded()) @@ -934,7 +934,7 @@ try { - post([ctrl, nsid, lid, self{shared_from_this()}, ep{endpoint}, + post([ctrl, nsid, lid, lsp, self{shared_from_this()}, ep{endpoint}, cb{std::move(cb)}]() { std::vector<uint8_t> data; std::function<void(void)> logHandler; @@ -1074,6 +1074,24 @@ } } break; + case NVME_LOG_LID_CMD_AND_FEAT_LOCKDOWN: + { + data.resize(sizeof(nvme_lockdown_log)); + nvme_lockdown_log* log = + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) + reinterpret_cast<nvme_lockdown_log*>(data.data()); + + int rc = nvme_mi_admin_get_log_lockdown(ctrl, lsp, log); + if (rc != 0) + { + std::cerr + << "[" << ep->describe() << "]" + << "fail to get command and feature lockdown log" + << '\n'; + break; + } + } + break; case NVME_LOG_LID_RESERVATION: { data.resize(sizeof(nvme_resv_notification_log));
diff --git a/subprojects/libnvme.wrap b/subprojects/libnvme.wrap index 19051f1..51ae9fb 100644 --- a/subprojects/libnvme.wrap +++ b/subprojects/libnvme.wrap
@@ -2,7 +2,7 @@ directory = libnvme url = https://github.com/linux-nvme/libnvme.git revision = bf85536ff5640e9e3ee04e13d8e5eedd70add550 -diff_files = libnvme/0001-mi_admin_xfer-set-data-fields-based-on-opcode.patch,libnvme/0002-mi-fix-the-return-error-code.patch,libnvme/0003-mi-fix-the-rc-for-nvme_mi_scan_ep.patch,libnvme/0004-mi-avoid-changing-default-ep-timeout-during-admin_pa.patch,libnvme/0005-libnvme-mi-add-timeout-functions-to-.map.patch,libnvme/0001-mi-don-t-return-from-mi_mctp_submit-with-a-tag-held.patch,libnvme/0001-Assign-default-value-on-variable-definition.patch,libnvme/0001-test-Intialize-the-variables-for-mi-tests.patch +diff_files = libnvme/0001-mi_admin_xfer-set-data-fields-based-on-opcode.patch,libnvme/0002-mi-fix-the-return-error-code.patch,libnvme/0003-mi-fix-the-rc-for-nvme_mi_scan_ep.patch,libnvme/0004-mi-avoid-changing-default-ep-timeout-during-admin_pa.patch,libnvme/0005-libnvme-mi-add-timeout-functions-to-.map.patch,libnvme/0001-mi-don-t-return-from-mi_mctp_submit-with-a-tag-held.patch,libnvme/0001-Assign-default-value-on-variable-definition.patch,libnvme/0001-test-Intialize-the-variables-for-mi-tests.patch,libnvme/0013-Add-support-for-command-feature-lockdown-log-page.patch [provide] dependency_names = libnvme_dep, libnvme_mi_dep
diff --git a/subprojects/packagefiles/libnvme/0013-Add-support-for-command-feature-lockdown-log-page.patch b/subprojects/packagefiles/libnvme/0013-Add-support-for-command-feature-lockdown-log-page.patch new file mode 100644 index 0000000..0077b7b --- /dev/null +++ b/subprojects/packagefiles/libnvme/0013-Add-support-for-command-feature-lockdown-log-page.patch
@@ -0,0 +1,95 @@ +From 35b33c06617e30438e331bcad719c93f65ab7a3c Mon Sep 17 00:00:00 2001 +From: Agrim Bharat <agrimbharat@google.com> +Date: Thu, 25 Sep 2025 17:29:40 +0000 +Subject: [PATCH] Add support for command & feature lockdown log page + +--- + src/nvme/mi.h | 30 ++++++++++++++++++++++++++++++ + src/nvme/types.h | 16 ++++++++++++++++ + 2 files changed, 46 insertions(+) + +diff --git a/src/nvme/mi.h b/src/nvme/mi.h +index 56591595..d4f02fe2 100644 +--- a/src/nvme/mi.h ++++ b/src/nvme/mi.h +@@ -2274,6 +2274,36 @@ static inline int nvme_mi_admin_get_log_persistent_event(nvme_mi_ctrl_t ctrl, + return nvme_mi_admin_get_log(ctrl, &args); + } + ++/** ++ * nvme_mi_admin_get_log_lockdown() - Retrieve lockdown Log ++ * @ctrl: Controller to query ++ * @cnscp: Contents and Scope of Command and Feature Identifier Lists ++ * @lockdown_log: Buffer to store the lockdown log ++ * ++ * Return: The nvme command status if a response was received (see ++ * &enum nvme_status_field) or -1 with errno set otherwise. ++ */ ++static inline int nvme_mi_admin_get_log_lockdown(nvme_mi_ctrl_t ctrl, ++ __u8 cnscp, struct nvme_lockdown_log *lockdown_log) ++{ ++ struct nvme_get_log_args args = { ++ .lpo = 0, ++ .result = NULL, ++ .log = lockdown_log, ++ .args_size = sizeof(args), ++ .lid = NVME_LOG_LID_CMD_AND_FEAT_LOCKDOWN, ++ .len = sizeof(*lockdown_log), ++ .nsid = NVME_NSID_ALL, ++ .csi = NVME_CSI_NVM, ++ .lsi = NVME_LOG_LSI_NONE, ++ .lsp = cnscp, ++ .uuidx = NVME_UUID_NONE, ++ .rae = false, ++ .ot = false, ++ }; ++ return nvme_mi_admin_get_log(ctrl, &args); ++} ++ + /** + * nvme_mi_admin_security_send() - Perform a Security Send command on a + * controller. +diff --git a/src/nvme/types.h b/src/nvme/types.h +index 94066fc2..922dc2c0 100644 +--- a/src/nvme/types.h ++++ b/src/nvme/types.h +@@ -3816,6 +3816,20 @@ struct nvme_supported_cap_config_list_log { + struct nvme_capacity_config_desc cap_config_desc[]; + }; + ++/** ++ * struct nvme_lockdown_log - Command and Feature Lockdown Log ++ * @cfila: Contents of the Command and Feature Identifier List field in the log page. ++ * @rsvd1: Reserved ++ * @lngth: Length of Command and Feature Identifier List field ++ * @cfil: Command and Feature Identifier List ++ */ ++struct nvme_lockdown_log { ++ __u8 cfila; ++ __u8 rsvd1[2]; ++ __u8 lngth; ++ __u8 cfil[508]; ++}; ++ + /** + * struct nvme_resv_notification_log - Reservation Notification Log + * @lpc: Log Page Count +@@ -6375,6 +6389,7 @@ enum nvme_identify_cns { + * @NVME_LOG_LID_SUPPORTED_CAP_CONFIG_LIST: Supported Capacity Configuration Lis + * @NVME_LOG_LID_FID_SUPPORTED_EFFECTS: Feature Identifiers Supported and Effects + * @NVME_LOG_LID_MI_CMD_SUPPORTED_EFFECTS: NVMe-MI Commands Supported and Effects ++ * @NVME_LOG_LID_CMD_AND_FEAT_LOCKDOWN: Command and Feature Lockdown + * @NVME_LOG_LID_BOOT_PARTITION: Boot Partition + * @NVME_LOG_LID_DISCOVER: Discovery + * @NVME_LOG_LID_RESERVATION: Reservation Notification +@@ -6402,6 +6417,7 @@ enum nvme_cmd_get_log_lid { + NVME_LOG_LID_SUPPORTED_CAP_CONFIG_LIST = 0x11, + NVME_LOG_LID_FID_SUPPORTED_EFFECTS = 0x12, + NVME_LOG_LID_MI_CMD_SUPPORTED_EFFECTS = 0x13, ++ NVME_LOG_LID_CMD_AND_FEAT_LOCKDOWN = 0x14, + NVME_LOG_LID_BOOT_PARTITION = 0x15, + NVME_LOG_LID_DISCOVER = 0x70, + NVME_LOG_LID_RESERVATION = 0x80, +-- +2.51.0.618.g983fd99d29-goog +