From nobody Fri Nov 14 19:42:16 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1761809525; cv=none; d=zohomail.com; s=zohoarc; b=dl8lmo4QVnVZNstv2ABUYQunc17675T38Crfc/oqNurYJ2IiSsH7Y9akgtC6a4hLBCxcjXh2SSlOc3lgA1XXF7EULnuc437G9tRcLn0JmD6Z5yHf0JJifuzuzPT5UuSvf2kpCymqm87gGKsKrAHfg/lCKvcaHO8OGTyXx/BtdYQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1761809525; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=8uqjS+B4/mrj9+8st/Ib3h3tRy9os/inVyIXpM7VHcU=; b=eujyt3qOX38jlGUPYfh6ritRZICVfMzDujSu7m4tl3FfvQr3i4pzC1Jucg1b+5p+Ltiu9G1O2QNQNkWKPVfbeRchM88EPpa8BFHKINNxdo5ZAvwgGqKgN/AcPW14JSy5wKu+R1maq0PQQNfah/G++4t/C+FRNcUwSICEW5jUEXQ= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1761809525101740.4500524939443; Thu, 30 Oct 2025 00:32:05 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vEN7U-0002vS-GY; Thu, 30 Oct 2025 03:30:53 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vEN7K-0002rn-26 for qemu-devel@nongnu.org; Thu, 30 Oct 2025 03:30:49 -0400 Received: from fout-a6-smtp.messagingengine.com ([103.168.172.149]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vEN72-000532-Hr for qemu-devel@nongnu.org; Thu, 30 Oct 2025 03:30:38 -0400 Received: from phl-compute-12.internal (phl-compute-12.internal [10.202.2.52]) by mailfout.phl.internal (Postfix) with ESMTP id D55C9EC01BF; Thu, 30 Oct 2025 03:30:18 -0400 (EDT) Received: from phl-mailfrontend-02 ([10.202.2.163]) by phl-compute-12.internal (MEProxy); Thu, 30 Oct 2025 03:30:18 -0400 Received: by mail.messagingengine.com (Postfix) with ESMTPA; Thu, 30 Oct 2025 03:30:17 -0400 (EDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=irrelevant.dk; h=cc:cc:content-transfer-encoding:content-type:date:date:from :from:in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:subject:subject:to:to; s=fm2; t=1761809418; x= 1761895818; bh=8uqjS+B4/mrj9+8st/Ib3h3tRy9os/inVyIXpM7VHcU=; b=i QVJfe4MAm110M5uTD5/0XjocRYD/AMcW0UOdtg5ZM8Sdb2b4ekMwQ00pOmyMxHjm Nsj/vILp74SRC1gs8Im8lomNWrBqoXl7JIICbnisqMj7XHF7Dk5gxgBCKmj5HlgZ WcgurhllWtdftXkHwYTpKWxeRX76uA45fxw6JZEcZpH+R1Ga20ywjFGnn5S/QeSc asAt8vud6FqRmULWQdTl2SWAhw/Z1ea4whpn2sIsRT5zDRCsT8xHtFkqH28l+RpK rFkTZGIEmUtYkVkUsVc04UW+YvyclPC8MVfr2ATWGGFnVHXlz9oXCnbVk8UjHSaZ 646oGp1b00Bjux0NhE1pA== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:date:date:feedback-id:feedback-id:from:from :in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:subject:subject:to:to:x-me-proxy:x-me-sender :x-me-sender:x-sasl-enc; s=fm3; t=1761809418; x=1761895818; bh=8 uqjS+B4/mrj9+8st/Ib3h3tRy9os/inVyIXpM7VHcU=; b=aSSl/JlAG1edeJylZ ZmoN2/Ejp1O7+7gdYEkEw/WqlYthBLusWVCZpWRU1+fLwAMSIYPPQuetYfJMgcud lznkOUVVvuYA5JRxopvA2OTJV+YDfScj+wmPvY6WOJBeb2Rqx3DXg6Zk9Jy+nRMb +B1UAXjyyiBfCmO1vTuivdEoLbw8ElNWOlKPIuPCEwMUVie/kiRRd7TaWERRGHfz G7DT3S7FmA2JaAv1WR0D+a/FN9hdAKrLxVhUWl3BDiyAqkqibJjNGhrPCWl2ILVo 4xrsM5WfIpho0+1h+ZBcleMQq/BCxmjZUVUISa9da4yuRGothdDnf8IUME5NP3dr vrKlw== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeeffedrtdeggdduieeitdduucetufdoteggodetrf dotffvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfurfetoffkrfgpnffqhgenuceu rghilhhouhhtmecufedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmnecujf gurhephffvvefufffkofgjfhgggfestdekredtredttdenucfhrhhomhepmfhlrghushcu lfgvnhhsvghnuceoihhtshesihhrrhgvlhgvvhgrnhhtrdgukheqnecuggftrfgrthhtvg hrnhepjefgieelgfeiveehkeeuveehheekfeevgeeigfehfefgjeejhefffeegudejudeg necuvehluhhsthgvrhfuihiivgeptdenucfrrghrrghmpehmrghilhhfrhhomhepihhtsh esihhrrhgvlhgvvhgrnhhtrdgukhdpnhgspghrtghpthhtohepiedpmhhouggvpehsmhht phhouhhtpdhrtghpthhtohepqhgvmhhuqdguvghvvghlsehnohhnghhnuhdrohhrghdprh gtphhtthhopehpvghtvghrrdhmrgihuggvlhhlsehlihhnrghrohdrohhrghdprhgtphht thhopeifihhlfhhrvggurdhmrghllhgrfigrseifuggtrdgtohhmpdhrtghpthhtoheprg hlihhsthgrihhrrdhfrhgrnhgtihhsseifuggtrdgtohhmpdhrtghpthhtohepjhhonhgr thhhrghnrdgtrghmvghrohhnsehhuhgrfigvihdrtghomhdprhgtphhtthhopehkrdhjvg hnshgvnhesshgrmhhsuhhnghdrtghomh X-ME-Proxy: Feedback-ID: idc91472f:Fastmail From: Klaus Jensen To: qemu-devel@nongnu.org Cc: Peter Maydell , Wilfred Mallawa , Alistair Francis , Jonathan Cameron , Klaus Jensen Subject: [PULL 1/7] spdm-socket: add seperate send/recv functions Date: Thu, 30 Oct 2025 08:29:49 +0100 Message-ID: <20251030072956.1194-2-its@irrelevant.dk> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20251030072956.1194-1-its@irrelevant.dk> References: <20251030072956.1194-1-its@irrelevant.dk> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=103.168.172.149; envelope-from=its@irrelevant.dk; helo=fout-a6-smtp.messagingengine.com X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @irrelevant.dk) X-ZM-MESSAGEID: 1761809527733158500 Content-Type: text/plain; charset="utf-8" From: Wilfred Mallawa This is to support uni-directional transports such as SPDM over Storage. As specified by the DMTF DSP0286. Also update spdm_socket_rsp() to use the new send()/receive() functions. For the case of spdm_socket_receive(), this allows us to do error checking in one place with the addition of spdm_socket_command_valid(). Signed-off-by: Wilfred Mallawa Reviewed-by: Alistair Francis Reviewed-by: Jonathan Cameron Signed-off-by: Klaus Jensen --- backends/spdm-socket.c | 58 ++++++++++++++++++++++++++++-------- include/system/spdm-socket.h | 32 ++++++++++++++++++++ 2 files changed, 77 insertions(+), 13 deletions(-) diff --git a/backends/spdm-socket.c b/backends/spdm-socket.c index 2c709c68c873..ab74a02d9cf6 100644 --- a/backends/spdm-socket.c +++ b/backends/spdm-socket.c @@ -184,29 +184,61 @@ int spdm_socket_connect(uint16_t port, Error **errp) return client_socket; } =20 -uint32_t spdm_socket_rsp(const int socket, uint32_t transport_type, - void *req, uint32_t req_len, - void *rsp, uint32_t rsp_len) +static bool spdm_socket_command_valid(uint32_t command) +{ + switch (command) { + case SPDM_SOCKET_COMMAND_NORMAL: + case SPDM_SOCKET_STORAGE_CMD_IF_SEND: + case SPDM_SOCKET_STORAGE_CMD_IF_RECV: + case SOCKET_SPDM_STORAGE_ACK_STATUS: + case SPDM_SOCKET_COMMAND_OOB_ENCAP_KEY_UPDATE: + case SPDM_SOCKET_COMMAND_CONTINUE: + case SPDM_SOCKET_COMMAND_SHUTDOWN: + case SPDM_SOCKET_COMMAND_UNKOWN: + case SPDM_SOCKET_COMMAND_TEST: + return true; + default: + return false; + } +} + +uint32_t spdm_socket_receive(const int socket, uint32_t transport_type, + void *rsp, uint32_t rsp_len) { uint32_t command; bool result; =20 - result =3D send_platform_data(socket, transport_type, - SPDM_SOCKET_COMMAND_NORMAL, - req, req_len); - if (!result) { - return 0; - } - result =3D receive_platform_data(socket, transport_type, &command, (uint8_t *)rsp, &rsp_len); + + /* we may have received some data, but check if the command is valid */ + if (!result || !spdm_socket_command_valid(command)) { + return 0; + } + + return rsp_len; +} + +bool spdm_socket_send(const int socket, uint32_t socket_cmd, + uint32_t transport_type, void *req, uint32_t req_len) +{ + return send_platform_data(socket, transport_type, socket_cmd, req, + req_len); +} + +uint32_t spdm_socket_rsp(const int socket, uint32_t transport_type, + void *req, uint32_t req_len, + void *rsp, uint32_t rsp_len) +{ + bool result; + + result =3D spdm_socket_send(socket, SPDM_SOCKET_COMMAND_NORMAL, + transport_type, req, req_len); if (!result) { return 0; } =20 - assert(command !=3D 0); - - return rsp_len; + return spdm_socket_receive(socket, transport_type, rsp, rsp_len); } =20 void spdm_socket_close(const int socket, uint32_t transport_type) diff --git a/include/system/spdm-socket.h b/include/system/spdm-socket.h index 5d8bd9aa4e1d..29aa04fd5211 100644 --- a/include/system/spdm-socket.h +++ b/include/system/spdm-socket.h @@ -50,6 +50,35 @@ uint32_t spdm_socket_rsp(const int socket, uint32_t tran= sport_type, void *req, uint32_t req_len, void *rsp, uint32_t rsp_len); =20 +/** + * spdm_socket_rsp: Receive a message from an SPDM server + * @socket: socket returned from spdm_socket_connect() + * @transport_type: SPDM_SOCKET_TRANSPORT_TYPE_* macro + * @rsp: response buffer + * @rsp_len: response buffer length + * + * Receives a message from the SPDM server and returns the number of bytes + * received or 0 on failure. This can be used to receive a message from th= e SPDM + * server without sending anything first. + */ +uint32_t spdm_socket_receive(const int socket, uint32_t transport_type, + void *rsp, uint32_t rsp_len); + +/** + * spdm_socket_rsp: Sends a message to an SPDM server + * @socket: socket returned from spdm_socket_connect() + * @socket_cmd: socket command type (normal/if_recv/if_send etc...) + * @transport_type: SPDM_SOCKET_TRANSPORT_TYPE_* macro + * @req: request buffer + * @req_len: request buffer length + * + * Sends platform data to a SPDM server on socket, returns true on success. + * The response from the server must then be fetched by using + * spdm_socket_receive(). + */ +bool spdm_socket_send(const int socket, uint32_t socket_cmd, + uint32_t transport_type, void *req, uint32_t req_len= ); + /** * spdm_socket_close: send a shutdown command to the server * @socket: socket returned from spdm_socket_connect() @@ -60,6 +89,9 @@ uint32_t spdm_socket_rsp(const int socket, uint32_t trans= port_type, void spdm_socket_close(const int socket, uint32_t transport_type); =20 #define SPDM_SOCKET_COMMAND_NORMAL 0x0001 +#define SPDM_SOCKET_STORAGE_CMD_IF_SEND 0x0002 +#define SPDM_SOCKET_STORAGE_CMD_IF_RECV 0x0003 +#define SOCKET_SPDM_STORAGE_ACK_STATUS 0x0004 #define SPDM_SOCKET_COMMAND_OOB_ENCAP_KEY_UPDATE 0x8001 #define SPDM_SOCKET_COMMAND_CONTINUE 0xFFFD #define SPDM_SOCKET_COMMAND_SHUTDOWN 0xFFFE --=20 2.51.0 From nobody Fri Nov 14 19:42:16 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1761809521; cv=none; d=zohomail.com; s=zohoarc; b=C2Am4Q6EQvAcigmhBAAcw9HTu33U/qXtiEKUIEXKL1MH4N6eFq1qeRv+EceZos0kbgE5j2lUnI2YEoZrMPI1kPqstwKi+L1HQOYzIaqz0n1yM7uBlDb26wemPBZoZ1j82tu1TPh3KPldoQq67Za/0dnCLLOqBKKOZpsJ5/EI3dQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1761809521; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=SYl82fCDZJcU+VsPevtjzlgUXnb+eBJwdu+nmoiLFJc=; b=Cwq4Qy4INL/Kw0peS/BouW302cWBz9bxE1mlQ0g5a9o/xwJ9x6GSYSHq88Jwr2K9znMpwy26VuDn5UJ9PZQ3qwPdXPEPC5JCFbODeJ8VkPCbfdGrmqyIaiLjFkAaNawB+K7a8itOx/qvunHaF9+E6WSlNzN0gg605A93DQpmxKc= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1761809521459582.595938689194; Thu, 30 Oct 2025 00:32:01 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vEN7X-0002xb-Mh; Thu, 30 Oct 2025 03:30:58 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vEN7A-0002k8-LX for qemu-devel@nongnu.org; Thu, 30 Oct 2025 03:30:34 -0400 Received: from fhigh-a1-smtp.messagingengine.com ([103.168.172.152]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vEN72-00053C-HT for qemu-devel@nongnu.org; Thu, 30 Oct 2025 03:30:31 -0400 Received: from phl-compute-12.internal (phl-compute-12.internal [10.202.2.52]) by mailfhigh.phl.internal (Postfix) with ESMTP id 488051400186; Thu, 30 Oct 2025 03:30:20 -0400 (EDT) Received: from phl-mailfrontend-02 ([10.202.2.163]) by phl-compute-12.internal (MEProxy); Thu, 30 Oct 2025 03:30:20 -0400 Received: by mail.messagingengine.com (Postfix) with ESMTPA; Thu, 30 Oct 2025 03:30:19 -0400 (EDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=irrelevant.dk; h=cc:cc:content-transfer-encoding:content-type:date:date:from :from:in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:subject:subject:to:to; s=fm2; t=1761809420; x= 1761895820; bh=SYl82fCDZJcU+VsPevtjzlgUXnb+eBJwdu+nmoiLFJc=; b=b oYhgA43vdPkaYGvY2yJgpmMNeNAm4gfzppgA3woiDrXWqq0MP3i6rDX3vnpz+yj1 7WCnRexQ2W1rYhiAs8JPgjY2Jv+gnO2nRbyNTMYnWOw3ikMnEECNup7fZTObiIC4 82t0YLYYaov2VUfaXQ8pYpfUPlUo9MSEm4/JbxuvXiOy6sFfd4odwpPDKqcGPMk1 o+WinToJ4XN0DPexMfB9uUi49INqTp1RAQBXVSePEt58OO7j3vJsun6taAZmAb2n 00TE8D6Ki0mGmhCCvwBymUHpkOK8E/yhqatg05+OjovlrJqJpO4rJKIhwANkRO0n rOyOfQy8DB3CymVO8JEKg== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:date:date:feedback-id:feedback-id:from:from :in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:subject:subject:to:to:x-me-proxy:x-me-sender :x-me-sender:x-sasl-enc; s=fm3; t=1761809420; x=1761895820; bh=S Yl82fCDZJcU+VsPevtjzlgUXnb+eBJwdu+nmoiLFJc=; b=T3I4FCDVOPtAgoxhK CUrwMIWpIT1NPOZr9PAQ4tmRb9Co00qKQTRVUsMPpXu0gL9RnTNMFa8653eBO3bl 5Ry82H5ryXyrbe0yd6mQSmSy2nDIcnoV5Iqg/PSGdI/U2u9gfr1G3qO7hXfsnEdr yeYuHwy//K56+RlFFRsR/86V1Ck4aFwQ4VDggACL9SOj13K5t1OJFQZeLy5bGo5k osYotbJAaU9Df2AJhCkwmrzPtwW5yNfawwMNCk5+uQZCG68QxLluQwDLUH4rb3ML kTNkAvEUumcsSE814ySoTtT+bBnkRnFrr/pRU13JH5z+TtEyu6dMK6nXH9oktW4w 5rV2A== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeeffedrtdeggdduieeitdduucetufdoteggodetrf dotffvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfurfetoffkrfgpnffqhgenuceu rghilhhouhhtmecufedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmnecujf gurhephffvvefufffkofgjfhgggfestdekredtredttdenucfhrhhomhepmfhlrghushcu lfgvnhhsvghnuceoihhtshesihhrrhgvlhgvvhgrnhhtrdgukheqnecuggftrfgrthhtvg hrnhepjefgieelgfeiveehkeeuveehheekfeevgeeigfehfefgjeejhefffeegudejudeg necuvehluhhsthgvrhfuihiivgepudenucfrrghrrghmpehmrghilhhfrhhomhepihhtsh esihhrrhgvlhgvvhgrnhhtrdgukhdpnhgspghrtghpthhtohepiedpmhhouggvpehsmhht phhouhhtpdhrtghpthhtohepqhgvmhhuqdguvghvvghlsehnohhnghhnuhdrohhrghdprh gtphhtthhopehpvghtvghrrdhmrgihuggvlhhlsehlihhnrghrohdrohhrghdprhgtphht thhopeifihhlfhhrvggurdhmrghllhgrfigrseifuggtrdgtohhmpdhrtghpthhtoheprg hlihhsthgrihhrrdhfrhgrnhgtihhsseifuggtrdgtohhmpdhrtghpthhtohepjhhonhgr thhhrghnrdgtrghmvghrohhnsehhuhgrfigvihdrtghomhdprhgtphhtthhopehkrdhjvg hnshgvnhesshgrmhhsuhhnghdrtghomh X-ME-Proxy: Feedback-ID: idc91472f:Fastmail From: Klaus Jensen To: qemu-devel@nongnu.org Cc: Peter Maydell , Wilfred Mallawa , Alistair Francis , Jonathan Cameron , Klaus Jensen Subject: [PULL 2/7] spdm: add spdm storage transport virtual header Date: Thu, 30 Oct 2025 08:29:50 +0100 Message-ID: <20251030072956.1194-3-its@irrelevant.dk> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20251030072956.1194-1-its@irrelevant.dk> References: <20251030072956.1194-1-its@irrelevant.dk> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=103.168.172.152; envelope-from=its@irrelevant.dk; helo=fhigh-a1-smtp.messagingengine.com X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @irrelevant.dk) X-ZM-MESSAGEID: 1761809527738158500 Content-Type: text/plain; charset="utf-8" From: Wilfred Mallawa This header contains the transport encoding for an SPDM message that uses the SPDM over Storage transport as defined by the DMTF DSP0286. Note that in the StorageSpdmTransportHeader structure, security_protocol field is defined in the SCSI Primary Commands 5 (SPC-5) specification. The NVMe specification also refers to the SPC-5 for this definition. The security_protocol_specific field is defined in DSP0286 and is referred to as SP Specific for NVMe and ATA. Signed-off-by: Wilfred Mallawa Reviewed-by: Alistair Francis Reviewed-by: Jonathan Cameron Signed-off-by: Klaus Jensen --- include/system/spdm-socket.h | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/include/system/spdm-socket.h b/include/system/spdm-socket.h index 29aa04fd5211..8c07dc12d283 100644 --- a/include/system/spdm-socket.h +++ b/include/system/spdm-socket.h @@ -88,6 +88,20 @@ bool spdm_socket_send(const int socket, uint32_t socket_= cmd, */ void spdm_socket_close(const int socket, uint32_t transport_type); =20 +/* + * Defines the transport encoding for SPDM, this information shall be pass= ed + * down to the SPDM server, when conforming to the SPDM over Storage stand= ard + * as defined by DSP0286. + */ +typedef struct { + uint8_t security_protocol; /* Must be 0xE8 for SPDM Comma= nds + as per SCSI Primary Command= s 5 */ + uint16_t security_protocol_specific; /* Bit[7:2] SPDM Operation + Bit[0:1] Connection ID + per DSP0286 1.0: Section 7.= 2 */ + uint32_t length; /* Length of the SPDM Message*/ +} QEMU_PACKED StorageSpdmTransportHeader; + #define SPDM_SOCKET_COMMAND_NORMAL 0x0001 #define SPDM_SOCKET_STORAGE_CMD_IF_SEND 0x0002 #define SPDM_SOCKET_STORAGE_CMD_IF_RECV 0x0003 --=20 2.51.0 From nobody Fri Nov 14 19:42:16 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1761809526; cv=none; d=zohomail.com; s=zohoarc; b=X1sIWvZBNzMm8Z8rmzBhlxKfSBWpuNLEVH0CMUiAIVC6v1ii25mNzgiB7OuIjWKSxw554SUOwr9jCPO2uLLBjgl6RyJvxihaVLwRb3ZuRdf16Vkr15MixeIWMvkjfzsGIOm8nys9Qp8hcpuv2kXk6BkAl/Z21OMRHnIliKmPoDY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1761809526; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=YSmhy8uvp1IebovAkUeKiP0mQVZdssdt+4rnnGSCCiM=; b=gt9fu4eEVQdOHFrKcYathvjNqP5DmM6/Fv0ljVyn1w/dZwybRy6GP554Ls2WSJHTzmwDwW0dNH8foeNmLumP3G9/v+Y06Ue8Tt8eDaHIji0UwE/bbUree4kMnT5qxW8oF4kCZR8B4bTD4IA4v9FrqwkVYA1ymuu4LJdPDRvQB5E= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1761809526955500.93523977951065; Thu, 30 Oct 2025 00:32:06 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vEN7o-0003Gx-Al; Thu, 30 Oct 2025 03:31:13 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vEN7G-0002rW-Um; Thu, 30 Oct 2025 03:30:49 -0400 Received: from fout-a6-smtp.messagingengine.com ([103.168.172.149]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vEN77-00053T-1b; Thu, 30 Oct 2025 03:30:36 -0400 Received: from phl-compute-02.internal (phl-compute-02.internal [10.202.2.42]) by mailfout.phl.internal (Postfix) with ESMTP id 0A6F0EC01B4; Thu, 30 Oct 2025 03:30:24 -0400 (EDT) Received: from phl-mailfrontend-02 ([10.202.2.163]) by phl-compute-02.internal (MEProxy); Thu, 30 Oct 2025 03:30:24 -0400 Received: by mail.messagingengine.com (Postfix) with ESMTPA; Thu, 30 Oct 2025 03:30:20 -0400 (EDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=irrelevant.dk; h=cc:cc:content-transfer-encoding:content-type:date:date:from :from:in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:subject:subject:to:to; s=fm2; t=1761809424; x= 1761895824; bh=YSmhy8uvp1IebovAkUeKiP0mQVZdssdt+4rnnGSCCiM=; b=T tA8I9XdPU9GU2YV5h3XpVN/xVs8KuVfxsrOkWtSX6UX57lA8BUp0mUilCThydSMu Oa1FnKnTrVMFeKfHNz3+UqRaEue6q+4+Uyovjk3/vI/cF04FBKnOOG1lI7Gom6kc 5XleA3EBD3n5uaJoVlRrgLADwsTe5BmHZ4YVNNHr75Ak3Lt5INmGZI8T70OHbpGA naNifJctXnMkUU8elEp94HEcVStZ+HBmnKRDZUoaP56n8nnxBTJNEpeKZq97bT3s qDhTGfKQ9cWXeh9nDEO+D/P2//VHdbOIt3gjaOwcnZ1EnzqkkHIGf+EYosYzYhLS A3DfcK3ltaFio+4y/Kgww== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:date:date:feedback-id:feedback-id:from:from :in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:subject:subject:to:to:x-me-proxy:x-me-sender :x-me-sender:x-sasl-enc; s=fm3; t=1761809424; x=1761895824; bh=Y Smhy8uvp1IebovAkUeKiP0mQVZdssdt+4rnnGSCCiM=; b=L3tNLFa6s5L4knnBU YBvMKkdoQuegKx7Wu0K6e7mP+BILKpcTSk0dyt1zFPT4Y6c0EPtcZFRZI8Sgc54j Hcog4z16R3aZ+kJsLC0UDqckA4/LirK63ZVyihvrtcp9Z78XRb9rXoIeVMHHkWfr ukdzWNJclpYnNSzKscGp4qwCnsGCBP5TNFCChcFDX/qG134IJ7pef9lXYLJVnrtN q4m6SMkXHpuZlNn71mZYndsPJaR1BHhqLSwN/Efohj1PuXeY2KvjA1KX0cCwzOQc g8GFSyG4rC+SM6YuUwAzXUW84bGnsA1G5V5qRNc+Y7ewxNLSsZJx1tK6zTjtZL3S NdMnA== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeeffedrtdeggdduieeitdduucetufdoteggodetrf dotffvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfurfetoffkrfgpnffqhgenuceu rghilhhouhhtmecufedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmnecujf gurhephffvvefufffkofgjfhgggfestdekredtredttdenucfhrhhomhepmfhlrghushcu lfgvnhhsvghnuceoihhtshesihhrrhgvlhgvvhgrnhhtrdgukheqnecuggftrfgrthhtvg hrnhepjefgieelgfeiveehkeeuveehheekfeevgeeigfehfefgjeejhefffeegudejudeg necuvehluhhsthgvrhfuihiivgeptdenucfrrghrrghmpehmrghilhhfrhhomhepihhtsh esihhrrhgvlhgvvhgrnhhtrdgukhdpnhgspghrtghpthhtohepudehpdhmohguvgepshhm thhpohhuthdprhgtphhtthhopehqvghmuhdquggvvhgvlhesnhhonhhgnhhurdhorhhgpd hrtghpthhtohepphgvthgvrhdrmhgrhiguvghllheslhhinhgrrhhordhorhhgpdhrtghp thhtohepfihilhhfrhgvugdrmhgrlhhlrgifrgesfigutgdrtghomhdprhgtphhtthhope hsthgvfhgrnhhhrgesrhgvughhrghtrdgtohhmpdhrtghpthhtohepjhhonhgrthhhrghn rdgtrghmvghrohhnsehhuhgrfigvihdrtghomhdprhgtphhtthhopehkrdhjvghnshgvnh esshgrmhhsuhhnghdrtghomhdprhgtphhtthhopegrlhhishhtrghirhdrfhhrrghntghi shesfigutgdrtghomhdprhgtphhtthhopehksghushgthheskhgvrhhnvghlrdhorhhgpd hrtghpthhtohepihhtshesihhrrhgvlhgvvhgrnhhtrdgukh X-ME-Proxy: Feedback-ID: idc91472f:Fastmail From: Klaus Jensen To: qemu-devel@nongnu.org Cc: Peter Maydell , Wilfred Mallawa , Stefan Hajnoczi , Jonathan Cameron , Klaus Jensen , Alistair Francis , Keith Busch , Klaus Jensen , Jesper Devantier , Fam Zheng , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Kevin Wolf , Hanna Reitz , qemu-block@nongnu.org Subject: [PULL 3/7] hw/nvme: add NVMe Admin Security SPDM support Date: Thu, 30 Oct 2025 08:29:51 +0100 Message-ID: <20251030072956.1194-4-its@irrelevant.dk> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20251030072956.1194-1-its@irrelevant.dk> References: <20251030072956.1194-1-its@irrelevant.dk> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=103.168.172.149; envelope-from=its@irrelevant.dk; helo=fout-a6-smtp.messagingengine.com X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @irrelevant.dk) X-ZM-MESSAGEID: 1761809530070158500 Content-Type: text/plain; charset="utf-8" From: Wilfred Mallawa Adds the NVMe Admin Security Send/Receive command support with support for DMTFs SPDM. The transport binding for SPDM is defined in the DMTF DSP0286. Signed-off-by: Wilfred Mallawa Reviewed-by: Stefan Hajnoczi Reviewed-by: Jonathan Cameron Reviewed-by: Klaus Jensen Reviewed-by: Alistair Francis Signed-off-by: Klaus Jensen --- hw/nvme/ctrl.c | 212 ++++++++++++++++++++++++++++++++++- hw/nvme/nvme.h | 5 + include/block/nvme.h | 15 +++ include/system/spdm-socket.h | 2 + 4 files changed, 233 insertions(+), 1 deletion(-) diff --git a/hw/nvme/ctrl.c b/hw/nvme/ctrl.c index cd81f7399754..e450e785ea10 100644 --- a/hw/nvme/ctrl.c +++ b/hw/nvme/ctrl.c @@ -282,6 +282,8 @@ static const uint32_t nvme_cse_acs_default[256] =3D { [NVME_ADM_CMD_FORMAT_NVM] =3D NVME_CMD_EFF_CSUPP | NVME_CMD_EFF_= LBCC, [NVME_ADM_CMD_DIRECTIVE_RECV] =3D NVME_CMD_EFF_CSUPP, [NVME_ADM_CMD_DIRECTIVE_SEND] =3D NVME_CMD_EFF_CSUPP, + [NVME_ADM_CMD_SECURITY_SEND] =3D NVME_CMD_EFF_CSUPP, + [NVME_ADM_CMD_SECURITY_RECV] =3D NVME_CMD_EFF_CSUPP, }; =20 static const uint32_t nvme_cse_iocs_nvm_default[256] =3D { @@ -7282,6 +7284,207 @@ static uint16_t nvme_dbbuf_config(NvmeCtrl *n, cons= t NvmeRequest *req) return NVME_SUCCESS; } =20 +static uint16_t nvme_sec_prot_spdm_send(NvmeCtrl *n, NvmeRequest *req) +{ + StorageSpdmTransportHeader hdr =3D {0}; + g_autofree uint8_t *sec_buf =3D NULL; + uint32_t transfer_len =3D le32_to_cpu(req->cmd.cdw11); + uint32_t transport_transfer_len =3D transfer_len; + uint32_t dw10 =3D le32_to_cpu(req->cmd.cdw10); + uint32_t recvd; + uint16_t nvme_cmd_status, ret; + uint8_t secp =3D extract32(dw10, 24, 8); + uint16_t spsp =3D extract32(dw10, 8, 16); + bool spdm_res; + + if (transport_transfer_len > UINT32_MAX - sizeof(hdr)) { + return NVME_INVALID_FIELD | NVME_DNR; + } + + transport_transfer_len +=3D sizeof(hdr); + if (transport_transfer_len > SPDM_SOCKET_MAX_MESSAGE_BUFFER_SIZE) { + return NVME_INVALID_FIELD | NVME_DNR; + } + + ret =3D nvme_check_mdts(n, transport_transfer_len); + if (ret !=3D NVME_SUCCESS) { + return ret; + } + + /* Generate the NVMe transport header */ + hdr.security_protocol =3D secp; + hdr.security_protocol_specific =3D cpu_to_le16(spsp); + hdr.length =3D cpu_to_le32(transfer_len); + + sec_buf =3D g_try_malloc0(transport_transfer_len); + if (!sec_buf) { + return NVME_INTERNAL_DEV_ERROR; + } + + /* Attach the transport header */ + memcpy(sec_buf, &hdr, sizeof(hdr)); + ret =3D nvme_h2c(n, sec_buf + sizeof(hdr), transfer_len, req); + if (ret) { + return ret; + } + + spdm_res =3D spdm_socket_send(n->spdm_socket, SPDM_SOCKET_STORAGE_CMD_= IF_SEND, + SPDM_SOCKET_TRANSPORT_TYPE_NVME, sec_buf, + transport_transfer_len); + if (!spdm_res) { + return NVME_DATA_TRAS_ERROR | NVME_DNR; + } + + /* The responder shall ack with message status */ + recvd =3D spdm_socket_receive(n->spdm_socket, SPDM_SOCKET_TRANSPORT_TY= PE_NVME, + &nvme_cmd_status, + SPDM_SOCKET_MAX_MSG_STATUS_LEN); + + nvme_cmd_status =3D be16_to_cpu(nvme_cmd_status); + + if (recvd < SPDM_SOCKET_MAX_MSG_STATUS_LEN) { + return NVME_DATA_TRAS_ERROR | NVME_DNR; + } + + return nvme_cmd_status; +} + +/* From host to controller */ +static uint16_t nvme_security_send(NvmeCtrl *n, NvmeRequest *req) +{ + uint32_t dw10 =3D le32_to_cpu(req->cmd.cdw10); + uint8_t secp =3D extract32(dw10, 24, 8); + + switch (secp) { + case NVME_SEC_PROT_DMTF_SPDM: + if (n->spdm_socket < 0) { + return NVME_INVALID_FIELD | NVME_DNR; + } + return nvme_sec_prot_spdm_send(n, req); + default: + /* Unsupported Security Protocol Type */ + return NVME_INVALID_FIELD | NVME_DNR; + } + + return NVME_INVALID_FIELD | NVME_DNR; +} + +static uint16_t nvme_sec_prot_spdm_receive(NvmeCtrl *n, NvmeRequest *req) +{ + StorageSpdmTransportHeader hdr; + g_autofree uint8_t *rsp_spdm_buf =3D NULL; + uint32_t dw10 =3D le32_to_cpu(req->cmd.cdw10); + uint32_t alloc_len =3D le32_to_cpu(req->cmd.cdw11); + uint32_t recvd, spdm_res; + uint16_t nvme_cmd_status, ret; + uint8_t secp =3D extract32(dw10, 24, 8); + uint8_t spsp =3D extract32(dw10, 8, 16); + if (!alloc_len) { + return NVME_INVALID_FIELD | NVME_DNR; + } + + /* Generate the NVMe transport header */ + hdr =3D (StorageSpdmTransportHeader) { + .security_protocol =3D secp, + .security_protocol_specific =3D cpu_to_le16(spsp), + .length =3D cpu_to_le32(alloc_len), + }; + + /* Forward if_recv to the SPDM Server with SPSP0 */ + spdm_res =3D spdm_socket_send(n->spdm_socket, SPDM_SOCKET_STORAGE_CMD_= IF_RECV, + SPDM_SOCKET_TRANSPORT_TYPE_NVME, + &hdr, sizeof(hdr)); + if (!spdm_res) { + return NVME_DATA_TRAS_ERROR | NVME_DNR; + } + + /* The responder shall ack with message status */ + recvd =3D spdm_socket_receive(n->spdm_socket, SPDM_SOCKET_TRANSPORT_TY= PE_NVME, + &nvme_cmd_status, + SPDM_SOCKET_MAX_MSG_STATUS_LEN); + if (recvd < SPDM_SOCKET_MAX_MSG_STATUS_LEN) { + return NVME_DATA_TRAS_ERROR | NVME_DNR; + } + + nvme_cmd_status =3D be16_to_cpu(nvme_cmd_status); + /* An error here implies the prior if_recv from requester was spurious= */ + if (nvme_cmd_status !=3D NVME_SUCCESS) { + return nvme_cmd_status; + } + + /* Clear to start receiving data from the server */ + rsp_spdm_buf =3D g_try_malloc0(alloc_len); + if (!rsp_spdm_buf) { + return NVME_INTERNAL_DEV_ERROR; + } + + recvd =3D spdm_socket_receive(n->spdm_socket, + SPDM_SOCKET_TRANSPORT_TYPE_NVME, + rsp_spdm_buf, alloc_len); + if (!recvd) { + return NVME_DATA_TRAS_ERROR | NVME_DNR; + } + + ret =3D nvme_c2h(n, rsp_spdm_buf, MIN(recvd, alloc_len), req); + if (ret) { + return ret; + } + + return NVME_SUCCESS; +} + +static uint16_t nvme_get_sec_prot_info(NvmeCtrl *n, NvmeRequest *req) +{ + uint32_t alloc_len =3D le32_to_cpu(req->cmd.cdw11); + uint8_t resp[10] =3D { + /* Support Security Protol List Length */ + [6] =3D 0, /* MSB */ + [7] =3D 2, /* LSB */ + /* Support Security Protocol List */ + [8] =3D SFSC_SECURITY_PROT_INFO, + [9] =3D 0, + }; + + if (n->spdm_socket >=3D 0) { + resp[9] =3D NVME_SEC_PROT_DMTF_SPDM; + } + + if (alloc_len < 10) { + return NVME_INVALID_FIELD | NVME_DNR; + } + + return nvme_c2h(n, resp, sizeof(resp), req); +} + +/* From controller to host */ +static uint16_t nvme_security_receive(NvmeCtrl *n, NvmeRequest *req) +{ + uint32_t dw10 =3D le32_to_cpu(req->cmd.cdw10); + uint16_t spsp =3D extract32(dw10, 8, 16); + uint8_t secp =3D extract32(dw10, 24, 8); + + switch (secp) { + case SFSC_SECURITY_PROT_INFO: + switch (spsp) { + case 0: + /* Supported security protocol list */ + return nvme_get_sec_prot_info(n, req); + case 1: + /* Certificate data */ + /* fallthrough */ + default: + return NVME_INVALID_FIELD | NVME_DNR; + } + case NVME_SEC_PROT_DMTF_SPDM: + if (n->spdm_socket < 0) { + return NVME_INVALID_FIELD | NVME_DNR; + } + return nvme_sec_prot_spdm_receive(n, req); + default: + return NVME_INVALID_FIELD | NVME_DNR; + } +} + static uint16_t nvme_directive_send(NvmeCtrl *n, NvmeRequest *req) { return NVME_INVALID_FIELD | NVME_DNR; @@ -7389,6 +7592,10 @@ static uint16_t nvme_admin_cmd(NvmeCtrl *n, NvmeRequ= est *req) return nvme_directive_send(n, req); case NVME_ADM_CMD_DIRECTIVE_RECV: return nvme_directive_receive(n, req); + case NVME_ADM_CMD_SECURITY_SEND: + return nvme_security_send(n, req); + case NVME_ADM_CMD_SECURITY_RECV: + return nvme_security_receive(n, req); default: g_assert_not_reached(); } @@ -8459,6 +8666,8 @@ static void nvme_init_state(NvmeCtrl *n) sctrl->vfn =3D cpu_to_le16(i + 1); } =20 + n->spdm_socket =3D -1; + cap->cntlid =3D cpu_to_le16(n->cntlid); cap->crt =3D NVME_CRT_VQ | NVME_CRT_VI; =20 @@ -8820,7 +9029,8 @@ static void nvme_init_ctrl(NvmeCtrl *n, PCIDevice *pc= i_dev) id->mdts =3D n->params.mdts; id->ver =3D cpu_to_le32(NVME_SPEC_VER); =20 - oacs =3D NVME_OACS_NMS | NVME_OACS_FORMAT | NVME_OACS_DIRECTIVES; + oacs =3D NVME_OACS_NMS | NVME_OACS_FORMAT | NVME_OACS_DIRECTIVES | + NVME_OACS_SECURITY; =20 if (n->params.dbcs) { oacs |=3D NVME_OACS_DBCS; diff --git a/hw/nvme/nvme.h b/hw/nvme/nvme.h index b5c9378ea4e5..67ed562e0086 100644 --- a/hw/nvme/nvme.h +++ b/hw/nvme/nvme.h @@ -461,6 +461,8 @@ static inline const char *nvme_adm_opc_str(uint8_t opc) case NVME_ADM_CMD_DIRECTIVE_RECV: return "NVME_ADM_CMD_DIRECTIVE_REC= V"; case NVME_ADM_CMD_DBBUF_CONFIG: return "NVME_ADM_CMD_DBBUF_CONFIG"; case NVME_ADM_CMD_FORMAT_NVM: return "NVME_ADM_CMD_FORMAT_NVM"; + case NVME_ADM_CMD_SECURITY_SEND: return "NVME_ADM_CMD_SECURITY_SEND= "; + case NVME_ADM_CMD_SECURITY_RECV: return "NVME_ADM_CMD_SECURITY_RECV= "; default: return "NVME_ADM_CMD_UNKNOWN"; } } @@ -648,6 +650,9 @@ typedef struct NvmeCtrl { } next_pri_ctrl_cap; /* These override pri_ctrl_cap after reset */ uint32_t dn; /* Disable Normal */ NvmeAtomic atomic; + + /* Socket mapping to SPDM over NVMe Security In/Out commands */ + int spdm_socket; } NvmeCtrl; =20 typedef enum NvmeResetType { diff --git a/include/block/nvme.h b/include/block/nvme.h index 358e516e38b0..9fa2ecaf281c 100644 --- a/include/block/nvme.h +++ b/include/block/nvme.h @@ -1779,6 +1779,21 @@ enum NvmeDirectiveOperations { NVME_DIRECTIVE_RETURN_PARAMS =3D 0x1, }; =20 +typedef enum SfscSecurityProtocol { + SFSC_SECURITY_PROT_INFO =3D 0x00, +} SfscSecurityProtocol; + +typedef enum NvmeSecurityProtocols { + NVME_SEC_PROT_DMTF_SPDM =3D 0xE8, +} NvmeSecurityProtocols; + +typedef enum SpdmOperationCodes { + SPDM_STORAGE_DISCOVERY =3D 0x1, /* Mandatory */ + SPDM_STORAGE_PENDING_INFO =3D 0x2, /* Optional */ + SPDM_STORAGE_MSG =3D 0x5, /* Mandatory */ + SPDM_STORAGE_SEC_MSG =3D 0x6, /* Optional */ +} SpdmOperationCodes; + typedef struct QEMU_PACKED NvmeFdpConfsHdr { uint16_t num_confs; uint8_t version; diff --git a/include/system/spdm-socket.h b/include/system/spdm-socket.h index 8c07dc12d283..e61163381251 100644 --- a/include/system/spdm-socket.h +++ b/include/system/spdm-socket.h @@ -114,7 +114,9 @@ typedef struct { =20 #define SPDM_SOCKET_TRANSPORT_TYPE_MCTP 0x01 #define SPDM_SOCKET_TRANSPORT_TYPE_PCI_DOE 0x02 +#define SPDM_SOCKET_TRANSPORT_TYPE_NVME 0x04 =20 #define SPDM_SOCKET_MAX_MESSAGE_BUFFER_SIZE 0x1200 +#define SPDM_SOCKET_MAX_MSG_STATUS_LEN 0x02 =20 #endif --=20 2.51.0 From nobody Fri Nov 14 19:42:16 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1761809574; cv=none; d=zohomail.com; s=zohoarc; b=dwd6mVVAnXF1pVOKWwZqkkFe9bE7wlqSfw9t9ltghjGPvutEMyJP+68WRraxN8WSWMiNXnDwhVswaSg1IjZbGiQQ7rz+JzgHW8NVjvvPdf3uR3YxJYIlXyeTu4MhtoApB7a8k9dzYIjfxgSjKTpZfGMmI0wyPpfS/1WBVH8y7iE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1761809574; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=lahpd9GNodsj9jGZJq8wJPs5uzoaarEYXqYshrZLfxM=; b=eWYIgYK+FZTaYM4ZVrl/5ccVmM8gixhG4/zOyI8+CeI5d7uprQpxZTFfDqU5ldxRwpWy0FY35YxmENcYkYf514pEgd0OZuILfA29e07SAL8opPmZHE8LfzVGaWTgmJa4wzZBpgUtH7eqrQ6/3h3J1FOXlMc9/OO1btcK/utQlS8= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 176180957448758.249334911181904; Thu, 30 Oct 2025 00:32:54 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vEN7n-0003F8-EX; Thu, 30 Oct 2025 03:31:12 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vEN7H-0002rY-3z for qemu-devel@nongnu.org; Thu, 30 Oct 2025 03:30:49 -0400 Received: from fout-a6-smtp.messagingengine.com ([103.168.172.149]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vEN77-00053a-0F for qemu-devel@nongnu.org; Thu, 30 Oct 2025 03:30:37 -0400 Received: from phl-compute-11.internal (phl-compute-11.internal [10.202.2.51]) by mailfout.phl.internal (Postfix) with ESMTP id C813FEC01C0; Thu, 30 Oct 2025 03:30:25 -0400 (EDT) Received: from phl-mailfrontend-02 ([10.202.2.163]) by phl-compute-11.internal (MEProxy); Thu, 30 Oct 2025 03:30:25 -0400 Received: by mail.messagingengine.com (Postfix) with ESMTPA; Thu, 30 Oct 2025 03:30:24 -0400 (EDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=irrelevant.dk; h=cc:cc:content-transfer-encoding:content-type:date:date:from :from:in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:subject:subject:to:to; s=fm2; t=1761809425; x= 1761895825; bh=lahpd9GNodsj9jGZJq8wJPs5uzoaarEYXqYshrZLfxM=; b=r jK+DEBL8VsejJRqBKdartUnsidiHG6ylYCB8k35NSWHGtGsaHxL5HCnG2OdUAkl8 9CiL/8ZZ+wJhnyrCVbc7y5Pb1tysmaS2ZJY3zPifEJjEqcYBWmxBB4MIO3Aret/F 6MUixjLIXcp2uNVY2RO7XglfLszU3SQ/qBa18TCHQzru4hf2Tw9Bgib3RA7s2Zcp L2CHlk3ydljFlm8bqNzpFnfWqrWuRQ9tJloZX6m7rR+5jmrUaRQ+E94qOXUB7Q+o OReZwoP3k5dAXFEq6Y/qLj55tSm0ayULbxHGlGrjubycDXTOw9+pH6MTAeRPp9an xlXOOclAZ1ovl3xQZUBwA== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:date:date:feedback-id:feedback-id:from:from :in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:subject:subject:to:to:x-me-proxy:x-me-sender :x-me-sender:x-sasl-enc; s=fm3; t=1761809425; x=1761895825; bh=l ahpd9GNodsj9jGZJq8wJPs5uzoaarEYXqYshrZLfxM=; b=Am8cHhFHYgH2spure /a2wVIpWVfp9faTtNeZptbjRqDb1SFLraWpSUvsQvmKwMAOYN6v256GIj7gYdzNz oZyZMicZPj4WOUtNFYIgGQaiHaTwiVdXzyKkTgpiLRoBppoetnt934JhqeJtrBc5 dpWazPbr9+LylD7BS8bhXFwNQySeMwN0kUAIsqTC+DA/OITqaGeuCL3nh8sz5OeD obZxm5KSEOE9x7WCs6T0RLQUk/+s0dCLEx/f4+omilsSZH9xifoUK+Tbk3qufZ3A HMtKdKWyslVMTKzyNrwsBgjhriAUaWNvPTA6I5bTvzwfgYmwPyvCdxXiju//uCZ7 wrvWw== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeeffedrtdeggdduieeitdduucetufdoteggodetrf dotffvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfurfetoffkrfgpnffqhgenuceu rghilhhouhhtmecufedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmnecujf gurhephffvvefufffkofgjfhgggfestdekredtredttdenucfhrhhomhepmfhlrghushcu lfgvnhhsvghnuceoihhtshesihhrrhgvlhgvvhgrnhhtrdgukheqnecuggftrfgrthhtvg hrnhepjefgieelgfeiveehkeeuveehheekfeevgeeigfehfefgjeejhefffeegudejudeg necuvehluhhsthgvrhfuihiivgeptdenucfrrghrrghmpehmrghilhhfrhhomhepihhtsh esihhrrhgvlhgvvhgrnhhtrdgukhdpnhgspghrtghpthhtohepiedpmhhouggvpehsmhht phhouhhtpdhrtghpthhtohepqhgvmhhuqdguvghvvghlsehnohhnghhnuhdrohhrghdprh gtphhtthhopehpvghtvghrrdhmrgihuggvlhhlsehlihhnrghrohdrohhrghdprhgtphht thhopeifihhlfhhrvggurdhmrghllhgrfigrseifuggtrdgtohhmpdhrtghpthhtohepjh honhgrthhhrghnrdgtrghmvghrohhnsehhuhgrfigvihdrtghomhdprhgtphhtthhopegr lhhishhtrghirhdrfhhrrghntghishesfigutgdrtghomhdprhgtphhtthhopehkrdhjvg hnshgvnhesshgrmhhsuhhnghdrtghomh X-ME-Proxy: Feedback-ID: idc91472f:Fastmail From: Klaus Jensen To: qemu-devel@nongnu.org Cc: Peter Maydell , Wilfred Mallawa , Jonathan Cameron , Alistair Francis , Klaus Jensen Subject: [PULL 4/7] spdm: define SPDM transport enum types Date: Thu, 30 Oct 2025 08:29:52 +0100 Message-ID: <20251030072956.1194-5-its@irrelevant.dk> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20251030072956.1194-1-its@irrelevant.dk> References: <20251030072956.1194-1-its@irrelevant.dk> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=103.168.172.149; envelope-from=its@irrelevant.dk; helo=fout-a6-smtp.messagingengine.com X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @irrelevant.dk) X-ZM-MESSAGEID: 1761809578114158500 Content-Type: text/plain; charset="utf-8" From: Wilfred Mallawa SPDM maybe used over different transports. This patch specifies the trasnport types as an enum with a qdev property definition such that a user input transport type (string) can be mapped directly into the respective SPDM transportenum for internal use. Signed-off-by: Wilfred Mallawa Reviewed-by: Jonathan Cameron Reviewed-by: Alistair Francis Signed-off-by: Klaus Jensen --- backends/spdm-socket.c | 23 +++++++++++++++++++++++ include/system/spdm-socket.h | 19 +++++++++++++++---- 2 files changed, 38 insertions(+), 4 deletions(-) diff --git a/backends/spdm-socket.c b/backends/spdm-socket.c index ab74a02d9cf6..6d8f02d3b928 100644 --- a/backends/spdm-socket.c +++ b/backends/spdm-socket.c @@ -13,6 +13,9 @@ #include "qemu/osdep.h" #include "system/spdm-socket.h" #include "qapi/error.h" +#include "hw/qdev-properties.h" +#include "hw/qdev-properties-system.h" +#include "hw/core/qdev-prop-internal.h" =20 static bool read_bytes(const int socket, uint8_t *buffer, size_t number_of_bytes) @@ -246,3 +249,23 @@ void spdm_socket_close(const int socket, uint32_t tran= sport_type) send_platform_data(socket, transport_type, SPDM_SOCKET_COMMAND_SHUTDOWN, NULL, 0); } + +const QEnumLookup SpdmTransport_lookup =3D { + .array =3D (const char *const[]) { + [SPDM_SOCKET_TRANSPORT_TYPE_UNSPEC] =3D "unspecified", + [SPDM_SOCKET_TRANSPORT_TYPE_MCTP] =3D "mctp", + [SPDM_SOCKET_TRANSPORT_TYPE_PCI_DOE] =3D "doe", + [SPDM_SOCKET_TRANSPORT_TYPE_SCSI] =3D "scsi", + [SPDM_SOCKET_TRANSPORT_TYPE_NVME] =3D "nvme", + }, + .size =3D SPDM_SOCKET_TRANSPORT_TYPE_MAX +}; + +const PropertyInfo qdev_prop_spdm_trans =3D { + .type =3D "SpdmTransportType", + .description =3D "Spdm Transport, doe/nvme/mctp/scsi/unspecified", + .enum_table =3D &SpdmTransport_lookup, + .get =3D qdev_propinfo_get_enum, + .set =3D qdev_propinfo_set_enum, + .set_default_value =3D qdev_propinfo_set_default_value_enum, +}; diff --git a/include/system/spdm-socket.h b/include/system/spdm-socket.h index e61163381251..00cb0e97f36e 100644 --- a/include/system/spdm-socket.h +++ b/include/system/spdm-socket.h @@ -112,11 +112,22 @@ typedef struct { #define SPDM_SOCKET_COMMAND_UNKOWN 0xFFFF #define SPDM_SOCKET_COMMAND_TEST 0xDEAD =20 -#define SPDM_SOCKET_TRANSPORT_TYPE_MCTP 0x01 -#define SPDM_SOCKET_TRANSPORT_TYPE_PCI_DOE 0x02 -#define SPDM_SOCKET_TRANSPORT_TYPE_NVME 0x04 - #define SPDM_SOCKET_MAX_MESSAGE_BUFFER_SIZE 0x1200 #define SPDM_SOCKET_MAX_MSG_STATUS_LEN 0x02 =20 +typedef enum SpdmTransportType { + SPDM_SOCKET_TRANSPORT_TYPE_UNSPEC =3D 0, + SPDM_SOCKET_TRANSPORT_TYPE_MCTP, + SPDM_SOCKET_TRANSPORT_TYPE_PCI_DOE, + SPDM_SOCKET_TRANSPORT_TYPE_SCSI, + SPDM_SOCKET_TRANSPORT_TYPE_NVME, + SPDM_SOCKET_TRANSPORT_TYPE_MAX +} SpdmTransportType; + +extern const PropertyInfo qdev_prop_spdm_trans; + +#define DEFINE_PROP_SPDM_TRANS(_name, _state, _field, _default) \ + DEFINE_PROP_UNSIGNED(_name, _state, _field, _default, \ + qdev_prop_spdm_trans, SpdmTransportType) + #endif --=20 2.51.0 From nobody Fri Nov 14 19:42:16 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1761809520; cv=none; d=zohomail.com; s=zohoarc; b=RQGgqyHPMvHdkbzouE+FPhTvJPTnBvyLX4wfJLARqyPyPUfup8NEvJ9Ft1G44C5Eq8/197nKW6vKNmj88Pk75AeZy0aOCKKW6VcFQu338+kYdAcgVtsCtttnJDMkmT453+JNLmgnYaI9g+6hy/iwBVsOA+VBl/MHIRKrZvaJ0Bk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1761809520; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=KhorpwEocnvX4t05YmWp1XsrdvahA+RzlOhcQFSb+fs=; b=ST2a7F4pYUV8RjpOsC6U5ZeezSsHj+h4RIg46DSzlZ7sWb+7r77xhCo4ku+wRLgfCS9P5qe4nb3G+FRUsWJOoWRzUfi2rTlR3gUbQt1RYc6c1Sd6JqO/5qSK3tsnUQlGBhuwZygfhhf1mC76HRVbIH9OaKCNQEkR2zvj6ifh5Vs= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1761809520086566.6832738658562; Thu, 30 Oct 2025 00:32:00 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vEN7g-000377-On; Thu, 30 Oct 2025 03:31:05 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vEN7N-0002ru-3y; Thu, 30 Oct 2025 03:30:49 -0400 Received: from fout-a6-smtp.messagingengine.com ([103.168.172.149]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vEN7D-00053m-Bp; Thu, 30 Oct 2025 03:30:43 -0400 Received: from phl-compute-03.internal (phl-compute-03.internal [10.202.2.43]) by mailfout.phl.internal (Postfix) with ESMTP id 568D6EC01C6; Thu, 30 Oct 2025 03:30:28 -0400 (EDT) Received: from phl-mailfrontend-02 ([10.202.2.163]) by phl-compute-03.internal (MEProxy); Thu, 30 Oct 2025 03:30:28 -0400 Received: by mail.messagingengine.com (Postfix) with ESMTPA; Thu, 30 Oct 2025 03:30:25 -0400 (EDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=irrelevant.dk; h=cc:cc:content-transfer-encoding:content-type:date:date:from :from:in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:subject:subject:to:to; s=fm2; t=1761809428; x= 1761895828; bh=KhorpwEocnvX4t05YmWp1XsrdvahA+RzlOhcQFSb+fs=; b=A 3kz80Vwh1h2aqPi/V4cGy8i9f7d9FDLym4Kxqe34F+tdwAd2KdCmDo+6pK09oQcB MINupweqRNOjfUln0IATJRCWWfxWQboUvOfAIkaeRaupjFs18dPVw9booXOifR7h 5FbOcOHejkrMnWB7SoxcURFfHrrRpJ/VbIFmXN1azx+ybxi+QWMglUpvJlZilfWQ t0WUmGPt3Z99S0aOtpL8Yk/Sfcs5ooKnjFZKy2XG1sIneeSyQCnGmTbAbl9VEznr SRzvcEJTWKSLbTGvGXC6ox3bio9HG5Emewz7f9ubOq8UWcBHrZEF7KdXZZ8FOoGR 2fpsNtL3jA0CcOh6uMeOg== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:date:date:feedback-id:feedback-id:from:from :in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:subject:subject:to:to:x-me-proxy:x-me-sender :x-me-sender:x-sasl-enc; s=fm3; t=1761809428; x=1761895828; bh=K horpwEocnvX4t05YmWp1XsrdvahA+RzlOhcQFSb+fs=; b=NB4dnymwaZDC1JrMl 7fekvYaNP0Tw7Xt3h9dWnXa0kHXlqvxm+DFW38LFgOqCW2+ud6UmmiB22t2YCDOW UBt6s4jS1zdSJKos43PEZdKD6OWvCW4pE90u7dwWf3xn1E6V/mczlIvBjpzYPku7 s3CvqR0daQ8lAkuWnkVdNzCdJI/hIRGsdx4OZq+UwyYebEF+Cw6No8M+4gRGHkI0 3H41BgA1slftJlALSM/Sg3O+6/P9rtcZnIktEHynt3ldgRALSDhYCToyHv0iXGJv r/wPLKgH7dvk+37x7YzbvJwgYZpiDfBCZ9eIO783YuSDoovFTTx8lNqISfwa01y+ QQp7g== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeeffedrtdeggdduieeitddvucetufdoteggodetrf dotffvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfurfetoffkrfgpnffqhgenuceu rghilhhouhhtmecufedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmnecujf gurhephffvvefufffkofgjfhgggfestdekredtredttdenucfhrhhomhepmfhlrghushcu lfgvnhhsvghnuceoihhtshesihhrrhgvlhgvvhgrnhhtrdgukheqnecuggftrfgrthhtvg hrnheptdeuhedvueegtdettdevudefleejudefteeitdffheegveehfeeiueevkedtleeu necuffhomhgrihhnpegumhhtfhdrohhrghenucevlhhushhtvghrufhiiigvpedtnecurf grrhgrmhepmhgrihhlfhhrohhmpehithhssehirhhrvghlvghvrghnthdrughkpdhnsggp rhgtphhtthhopeduvddpmhhouggvpehsmhhtphhouhhtpdhrtghpthhtohepqhgvmhhuqd guvghvvghlsehnohhnghhnuhdrohhrghdprhgtphhtthhopehpvghtvghrrdhmrgihuggv lhhlsehlihhnrghrohdrohhrghdprhgtphhtthhopeifihhlfhhrvggurdhmrghllhgrfi grseifuggtrdgtohhmpdhrtghpthhtohepjhhonhgrthhhrghnrdgtrghmvghrohhnsehh uhgrfigvihdrtghomhdprhgtphhtthhopehkrdhjvghnshgvnhesshgrmhhsuhhnghdrtg homhdprhgtphhtthhopegrlhhishhtrghirhdrfhhrrghntghishesfigutgdrtghomhdp rhgtphhtthhopehksghushgthheskhgvrhhnvghlrdhorhhgpdhrtghpthhtohepihhtsh esihhrrhgvlhgvvhgrnhhtrdgukhdprhgtphhtthhopehfohhsshesuggvfhhmrggtrhho rdhith X-ME-Proxy: Feedback-ID: idc91472f:Fastmail From: Klaus Jensen To: qemu-devel@nongnu.org Cc: Peter Maydell , Wilfred Mallawa , Jonathan Cameron , Klaus Jensen , Alistair Francis , Keith Busch , Klaus Jensen , Jesper Devantier , "Michael S. Tsirkin" , Marcel Apfelbaum , qemu-block@nongnu.org Subject: [PULL 5/7] hw/nvme: connect SPDM over NVMe Security Send/Recv Date: Thu, 30 Oct 2025 08:29:53 +0100 Message-ID: <20251030072956.1194-6-its@irrelevant.dk> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20251030072956.1194-1-its@irrelevant.dk> References: <20251030072956.1194-1-its@irrelevant.dk> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=103.168.172.149; envelope-from=its@irrelevant.dk; helo=fout-a6-smtp.messagingengine.com X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @irrelevant.dk) X-ZM-MESSAGEID: 1761809526005158500 Content-Type: text/plain; charset="utf-8" From: Wilfred Mallawa This patch extends the existing support we have for NVMe with only DoE to also add support to SPDM over the NVMe Security Send/Recv commands. With the new definition of the `spdm-trans` argument, users can specify `spdm_trans=3Dnvme` or `spdm_trans=3Ddoe`. This allows us to select the SPDM transport respectively. SPDM over the NVMe Security Send/Recv commands are defined in the DMTF DSP0286. Signed-off-by: Wilfred Mallawa Reviewed-by: Jonathan Cameron Reviewed-by: Klaus Jensen Reviewed-by: Alistair Francis [k.jensen: fix declaration in case statement; fix quotes in docs] Signed-off-by: Klaus Jensen --- docs/specs/spdm.rst | 10 ++++++-- hw/nvme/ctrl.c | 47 ++++++++++++++++++++++++++++--------- include/hw/pci/pci_device.h | 2 ++ 3 files changed, 46 insertions(+), 13 deletions(-) diff --git a/docs/specs/spdm.rst b/docs/specs/spdm.rst index 0e3ad25bc698..477ff9ef36c7 100644 --- a/docs/specs/spdm.rst +++ b/docs/specs/spdm.rst @@ -98,7 +98,7 @@ Then you can add this to your QEMU command line: .. code-block:: shell =20 -drive file=3Dblknvme,if=3Dnone,id=3Dmynvme,format=3Draw \ - -device nvme,drive=3Dmynvme,serial=3Ddeadbeef,spdm_port=3D2323 + -device nvme,drive=3Dmynvme,serial=3Ddeadbeef,spdm_port=3D2323,spd= m_trans=3Ddoe =20 At which point QEMU will try to connect to the SPDM server. =20 @@ -113,7 +113,13 @@ of the default. So the entire QEMU command might look = like this -append "root=3D/dev/vda console=3DttyS0" \ -net none -nographic \ -drive file=3Dblknvme,if=3Dnone,id=3Dmynvme,format=3Draw \ - -device nvme,drive=3Dmynvme,serial=3Ddeadbeef,spdm_port=3D2323 + -device nvme,drive=3Dmynvme,serial=3Ddeadbeef,spdm_port=3D2323,spd= m_trans=3Ddoe + +The ``spdm_trans`` argument defines the underlying transport type that is +emulated by QEMU. For an PCIe NVMe controller, both "doe" and "nvme" are +supported. Where, "doe" does SPDM transport over the PCIe extended capabil= ity +Data Object Exchange (DOE), and "nvme" uses the NVMe Admin Security +Send/Receive commands to implement the SPDM transport. =20 .. _DMTF: https://www.dmtf.org/standards/SPDM diff --git a/hw/nvme/ctrl.c b/hw/nvme/ctrl.c index e450e785ea10..fa003031e719 100644 --- a/hw/nvme/ctrl.c +++ b/hw/nvme/ctrl.c @@ -8943,19 +8943,33 @@ static bool nvme_init_pci(NvmeCtrl *n, PCIDevice *p= ci_dev, Error **errp) =20 pcie_cap_deverr_init(pci_dev); =20 - /* DOE Initialisation */ + /* SPDM Initialisation */ if (pci_dev->spdm_port) { - uint16_t doe_offset =3D n->params.sriov_max_vfs ? - PCI_CONFIG_SPACE_SIZE + PCI_ARI_SIZEOF - : PCI_CONFIG_SPACE_SIZE; + uint16_t doe_offset =3D PCI_CONFIG_SPACE_SIZE; =20 - pcie_doe_init(pci_dev, &pci_dev->doe_spdm, doe_offset, - doe_spdm_prot, true, 0); + switch (pci_dev->spdm_trans) { + case SPDM_SOCKET_TRANSPORT_TYPE_PCI_DOE: + if (n->params.sriov_max_vfs) { + doe_offset +=3D PCI_ARI_SIZEOF; + } =20 - pci_dev->doe_spdm.spdm_socket =3D spdm_socket_connect(pci_dev->spd= m_port, - errp); + pcie_doe_init(pci_dev, &pci_dev->doe_spdm, doe_offset, + doe_spdm_prot, true, 0); =20 - if (pci_dev->doe_spdm.spdm_socket < 0) { + pci_dev->doe_spdm.spdm_socket =3D + spdm_socket_connect(pci_dev->spdm_port, errp); + + if (pci_dev->doe_spdm.spdm_socket < 0) { + return false; + } + break; + case SPDM_SOCKET_TRANSPORT_TYPE_NVME: + n->spdm_socket =3D spdm_socket_connect(pci_dev->spdm_port, err= p); + if (n->spdm_socket < 0) { + return false; + } + break; + default: return false; } } @@ -9246,9 +9260,14 @@ static void nvme_exit(PCIDevice *pci_dev) g_free(n->cmb.buf); } =20 + /* Only one of the `spdm_socket`s below should have been setup */ + assert(!(pci_dev->doe_spdm.spdm_socket > 0 && n->spdm_socket >=3D 0)); if (pci_dev->doe_spdm.spdm_socket > 0) { spdm_socket_close(pci_dev->doe_spdm.spdm_socket, SPDM_SOCKET_TRANSPORT_TYPE_PCI_DOE); + } else if (n->spdm_socket >=3D 0) { + spdm_socket_close(pci_dev->doe_spdm.spdm_socket, + SPDM_SOCKET_TRANSPORT_TYPE_NVME); } =20 if (n->pmr.dev) { @@ -9303,6 +9322,8 @@ static const Property nvme_props[] =3D { false), DEFINE_PROP_UINT16("mqes", NvmeCtrl, params.mqes, 0x7ff), DEFINE_PROP_UINT16("spdm_port", PCIDevice, spdm_port, 0), + DEFINE_PROP_SPDM_TRANS("spdm_trans", PCIDevice, spdm_trans, + SPDM_SOCKET_TRANSPORT_TYPE_PCI_DOE), DEFINE_PROP_BOOL("ctratt.mem", NvmeCtrl, params.ctratt.mem, false), DEFINE_PROP_BOOL("atomic.dn", NvmeCtrl, params.atomic_dn, 0), DEFINE_PROP_UINT16("atomic.awun", NvmeCtrl, params.atomic_awun, 0), @@ -9378,7 +9399,9 @@ static void nvme_pci_write_config(PCIDevice *dev, uin= t32_t address, { uint16_t old_num_vfs =3D pcie_sriov_num_vfs(dev); =20 - if (pcie_find_capability(dev, PCI_EXT_CAP_ID_DOE)) { + /* DOE is only initialised if SPDM over DOE is used */ + if (pcie_find_capability(dev, PCI_EXT_CAP_ID_DOE) && + dev->spdm_trans =3D=3D SPDM_SOCKET_TRANSPORT_TYPE_PCI_DOE) { pcie_doe_write_config(&dev->doe_spdm, address, val, len); } pci_default_write_config(dev, address, val, len); @@ -9389,7 +9412,9 @@ static void nvme_pci_write_config(PCIDevice *dev, uin= t32_t address, static uint32_t nvme_pci_read_config(PCIDevice *dev, uint32_t address, int= len) { uint32_t val; - if (dev->spdm_port && pcie_find_capability(dev, PCI_EXT_CAP_ID_DOE)) { + + if (dev->spdm_port && pcie_find_capability(dev, PCI_EXT_CAP_ID_DOE) && + (dev->spdm_trans =3D=3D SPDM_SOCKET_TRANSPORT_TYPE_PCI_DOE)) { if (pcie_doe_read_config(&dev->doe_spdm, address, len, &val)) { return val; } diff --git a/include/hw/pci/pci_device.h b/include/hw/pci/pci_device.h index eee03385686c..88ccea501136 100644 --- a/include/hw/pci/pci_device.h +++ b/include/hw/pci/pci_device.h @@ -4,6 +4,7 @@ #include "hw/pci/pci.h" #include "hw/pci/pcie.h" #include "hw/pci/pcie_doe.h" +#include "system/spdm-socket.h" =20 #define TYPE_PCI_DEVICE "pci-device" typedef struct PCIDeviceClass PCIDeviceClass; @@ -166,6 +167,7 @@ struct PCIDevice { =20 /* SPDM */ uint16_t spdm_port; + SpdmTransportType spdm_trans; =20 /* DOE */ DOECap doe_spdm; --=20 2.51.0 From nobody Fri Nov 14 19:42:16 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1761809567; cv=none; d=zohomail.com; s=zohoarc; b=TC/vHC9HobqrVCkafGNPNsMhIgW+hD24KymHJRQ43zjZXvl/eYbe+mWLJPEs1csGV3/bJV73RL6l1QunJ1YeFroA1LGEbZcbjkLBy73NpNY5B/+tecMmYLbO7u+s9+QkF9nZ+aoHI6LVA+gKopOtnMv8SqZVJ9BBVd0dBa3CO5Q= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1761809567; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=UbSHMYHQEqILcxNEHTUCvzZwo6tZO6GTUL3a7ABniGE=; b=WF/Wj8bqvWng9m2g9vvfJCXNRZEskeiYoxptpGGQRKCMCkjNneeTDv7TEgdGSXbPpXJUpGyQgv1YYocTXB5iWXcuX9m18B2kP//nKj7Ot28QyHf2svwsEslLCCTTjpaZPeIW/vMFE/vrrfChX+2BjKq7BQtNovZT06Dk5+JbPqQ= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1761809567095556.475438707128; Thu, 30 Oct 2025 00:32:47 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vEN7b-00032Q-NE; Thu, 30 Oct 2025 03:31:00 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vEN7N-0002rv-6j; Thu, 30 Oct 2025 03:30:49 -0400 Received: from fout-a6-smtp.messagingengine.com ([103.168.172.149]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vEN7G-00054r-GU; Thu, 30 Oct 2025 03:30:43 -0400 Received: from phl-compute-05.internal (phl-compute-05.internal [10.202.2.45]) by mailfout.phl.internal (Postfix) with ESMTP id 1C0C0EC01C4; Thu, 30 Oct 2025 03:30:30 -0400 (EDT) Received: from phl-mailfrontend-02 ([10.202.2.163]) by phl-compute-05.internal (MEProxy); Thu, 30 Oct 2025 03:30:30 -0400 Received: by mail.messagingengine.com (Postfix) with ESMTPA; Thu, 30 Oct 2025 03:30:28 -0400 (EDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=irrelevant.dk; h=cc:cc:content-transfer-encoding:content-type:date:date:from :from:in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:subject:subject:to:to; s=fm2; t=1761809430; x= 1761895830; bh=UbSHMYHQEqILcxNEHTUCvzZwo6tZO6GTUL3a7ABniGE=; b=x diAl9Xb0K7LGZLDArKK0OoeiGy48Bs3Kkg/x3zUCxakQmo9/Pd0TFozNNyL1zqNL 5LwC4QSBCjRn/ZqzMOjHKDan6wg+kcvQQ5d37Zr8oWMQkSCJcl0lGhyr9PkZZw0x oToYX9tnjunng/DolOZKHn0LjHqSqiuPrya4EP9fg2CcTCj6tuKe3Jh8Z/y7V5+v nd1AypvDpI9MSe4m7CHaBA1KUBuJ2ABFYiSv/QPML7HnypUGxX/r+sn1gCoBXHh2 fD+S5T+yCMV5d6zIAygkWfUVXj1tC2lghnVFR1tH7FIFxpLxCT9zn+BpnP6rAScr 3frAdQcyWtj/B6wn47Pcg== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:date:date:feedback-id:feedback-id:from:from :in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:subject:subject:to:to:x-me-proxy:x-me-sender :x-me-sender:x-sasl-enc; s=fm3; t=1761809430; x=1761895830; bh=U bSHMYHQEqILcxNEHTUCvzZwo6tZO6GTUL3a7ABniGE=; b=hlRCifjRezoQsy3uJ aJdQu24Pp3EJMtRdPBIGzybnvzkpP9xl5636z/RcnPrKsaf1S0BaJDdSiCWImcMe hNODjvBRsAypJWT4Q1BaVghuHDtXF4Crl1Y6WyZMMGja6jGrIHKVu+oatMew2WF5 tw33UtxUUWyH4ilT088FrAPC5HRyacaIZZOynxT3DJ4f/rbU0BeOs51eJzZohIhh vfe5k+7wP2w4wB7HsvJBauQFDSWrXsmIYKF1B9IzNmJkMAjiTgDyrqpNiK4u8Xmm 7AKR/8l6f0S/iwXHBxpxFAVW4ikDDO2k0jJAGU0sQcRoIgV9YJ7hTfuEX2XeMndF yzOjA== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeeffedrtdeggdduieeitdduucetufdoteggodetrf dotffvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfurfetoffkrfgpnffqhgenuceu rghilhhouhhtmecufedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmnecujf gurhephffvvefufffkofgjfhgggfestdekredtredttdenucfhrhhomhepmfhlrghushcu lfgvnhhsvghnuceoihhtshesihhrrhgvlhgvvhgrnhhtrdgukheqnecuggftrfgrthhtvg hrnhepjefgieelgfeiveehkeeuveehheekfeevgeeigfehfefgjeejhefffeegudejudeg necuvehluhhsthgvrhfuihiivgeptdenucfrrghrrghmpehmrghilhhfrhhomhepihhtsh esihhrrhgvlhgvvhgrnhhtrdgukhdpnhgspghrtghpthhtohepkedpmhhouggvpehsmhht phhouhhtpdhrtghpthhtohepqhgvmhhuqdguvghvvghlsehnohhnghhnuhdrohhrghdprh gtphhtthhopehpvghtvghrrdhmrgihuggvlhhlsehlihhnrghrohdrohhrghdprhgtphht thhopegrlhgrnhdrrggurghmshhonhesohhrrggtlhgvrdgtohhmpdhrtghpthhtohepfh hoshhsseguvghfmhgrtghrohdrihhtpdhrtghpthhtohepkhdrjhgvnhhsvghnsehsrghm shhunhhgrdgtohhmpdhrtghpthhtohepkhgsuhhstghhsehkvghrnhgvlhdrohhrghdprh gtphhtthhopehithhssehirhhrvghlvghvrghnthdrughkpdhrtghpthhtohepqhgvmhhu qdgslhhotghksehnohhnghhnuhdrohhrgh X-ME-Proxy: Feedback-ID: idc91472f:Fastmail From: Klaus Jensen To: qemu-devel@nongnu.org Cc: Peter Maydell , Alan Adamson , Jesper Wendel Devantier , Klaus Jensen , Keith Busch , Klaus Jensen , qemu-block@nongnu.org Subject: [PULL 6/7] hw/nvme: enable ns atomic writes Date: Thu, 30 Oct 2025 08:29:54 +0100 Message-ID: <20251030072956.1194-7-its@irrelevant.dk> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20251030072956.1194-1-its@irrelevant.dk> References: <20251030072956.1194-1-its@irrelevant.dk> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=103.168.172.149; envelope-from=its@irrelevant.dk; helo=fout-a6-smtp.messagingengine.com X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @irrelevant.dk) X-ZM-MESSAGEID: 1761809570267158500 Content-Type: text/plain; charset="utf-8" From: Alan Adamson Add support for the namespace atomic paramters: NAWUN and NAWUN. Namespace Atomic Compare and Write Unit (NACWU) is not currently supported. Writes that adhere to the NACWU and NAWUPF parameters are guaranteed to be atomic. New NVMe QEMU Paramters (See NVMe Specification for details): atomic.nawun=3DUINT16 (default: 0) atomic.nawupf=3DUINT16 (default: 0) atomic.nsfeat (default off) - Set Namespace Supported Atomic Bounda= ry & Power (NSABP) bit in Namespace Features (NSFEAT) in the Ide= ntify Namespace Data Structure See the NVMe Specification for more information. Signed-off-by: Alan Adamson Reviewed-by: Jesper Wendel Devantier Signed-off-by: Klaus Jensen --- hw/nvme/ctrl.c | 23 +++++++++++++++++++++++ hw/nvme/ns.c | 38 ++++++++++++++++++++++++++++++++++++++ hw/nvme/nvme.h | 6 ++++++ 3 files changed, 67 insertions(+) diff --git a/hw/nvme/ctrl.c b/hw/nvme/ctrl.c index fa003031e719..121a95b2e373 100644 --- a/hw/nvme/ctrl.c +++ b/hw/nvme/ctrl.c @@ -6705,6 +6705,23 @@ static uint16_t nvme_set_feature(NvmeCtrl *n, NvmeRe= quest *req) } else { atomic->atomic_writes =3D 1; } + for (i =3D 1; i <=3D NVME_MAX_NAMESPACES; i++) { + ns =3D nvme_ns(n, i); + if (ns && ns->atomic.atomic_writes) { + if (n->dn) { + ns->atomic.atomic_max_write_size =3D + le16_to_cpu(ns->id_ns.nawupf) + 1; + } else { + ns->atomic.atomic_max_write_size =3D + le16_to_cpu(ns->id_ns.nawun) + 1; + } + if (ns->atomic.atomic_max_write_size =3D=3D 1) { + ns->atomic.atomic_writes =3D 0; + } else { + ns->atomic.atomic_writes =3D 1; + } + } + } break; default: return NVME_FEAT_NOT_CHANGEABLE | NVME_DNR; @@ -7688,6 +7705,12 @@ static int nvme_atomic_write_check(NvmeCtrl *n, Nvme= Cmd *cmd, =20 static NvmeAtomic *nvme_get_atomic(NvmeCtrl *n, NvmeCmd *cmd) { + NvmeNamespace *ns =3D nvme_ns(n, cmd->nsid); + + if (ns && ns->atomic.atomic_writes) { + return &ns->atomic; + } + if (n->atomic.atomic_writes) { return &n->atomic; } diff --git a/hw/nvme/ns.c b/hw/nvme/ns.c index 6df2e8e7c5ac..28aacb8db59a 100644 --- a/hw/nvme/ns.c +++ b/hw/nvme/ns.c @@ -724,11 +724,46 @@ static void nvme_ns_realize(DeviceState *dev, Error *= *errp) BusState *s =3D qdev_get_parent_bus(dev); NvmeCtrl *n =3D NVME(s->parent); NvmeSubsystem *subsys =3D n->subsys; + NvmeIdCtrl *id =3D &n->id_ctrl; + NvmeIdNs *id_ns =3D &ns->id_ns; uint32_t nsid =3D ns->params.nsid; int i; =20 assert(subsys); =20 + /* Set atomic write parameters */ + if (ns->params.atomic_nsfeat) { + id_ns->nsfeat |=3D NVME_ID_NS_NSFEAT_NSABPNS; + id_ns->nawun =3D cpu_to_le16(ns->params.atomic_nawun); + if (!id->awupf || (id_ns->nawun && (id_ns->nawun < id->awun))) { + error_report("Invalid NAWUN: %x AWUN=3D%x", id_ns->nawun, id->= awun); + } + id_ns->nawupf =3D cpu_to_le16(ns->params.atomic_nawupf); + if (!id->awupf || (id_ns->nawupf && (id_ns->nawupf < id->awupf))) { + error_report("Invalid NAWUPF: %x AWUPF=3D%x", + id_ns->nawupf, id->awupf); + } + if (id_ns->nawupf > id_ns->nawun) { + error_report("Invalid: NAWUN=3D%x NAWUPF=3D%x", + id_ns->nawun, id_ns->nawupf); + } + } + + if (id_ns->nawun || id_ns->nawupf) { + NvmeAtomic *atomic =3D &ns->atomic; + + if (n->dn) { + atomic->atomic_max_write_size =3D cpu_to_le16(id_ns->nawupf) += 1; + } else { + atomic->atomic_max_write_size =3D cpu_to_le16(id_ns->nawun) + = 1; + } + if (atomic->atomic_max_write_size =3D=3D 1) { + atomic->atomic_writes =3D 0; + } else { + atomic->atomic_writes =3D 1; + } + } + /* reparent to subsystem bus */ if (!qdev_set_parent_bus(dev, &subsys->bus.parent_bus, errp)) { return; @@ -804,6 +839,9 @@ static const Property nvme_ns_props[] =3D { DEFINE_PROP_BOOL("eui64-default", NvmeNamespace, params.eui64_default, false), DEFINE_PROP_STRING("fdp.ruhs", NvmeNamespace, params.fdp.ruhs), + DEFINE_PROP_UINT16("atomic.nawun", NvmeNamespace, params.atomic_nawun,= 0), + DEFINE_PROP_UINT16("atomic.nawupf", NvmeNamespace, params.atomic_nawup= f, 0), + DEFINE_PROP_BOOL("atomic.nsfeat", NvmeNamespace, params.atomic_nsfeat,= 0), }; =20 static void nvme_ns_class_init(ObjectClass *oc, const void *data) diff --git a/hw/nvme/nvme.h b/hw/nvme/nvme.h index 67ed562e0086..7d01080fc1f9 100644 --- a/hw/nvme/nvme.h +++ b/hw/nvme/nvme.h @@ -218,6 +218,9 @@ typedef struct NvmeNamespaceParams { struct { char *ruhs; } fdp; + uint16_t atomic_nawun; + uint16_t atomic_nawupf; + bool atomic_nsfeat; } NvmeNamespaceParams; =20 typedef struct NvmeAtomic { @@ -280,6 +283,9 @@ typedef struct NvmeNamespace { /* reclaim unit handle identifiers indexed by placement handle */ uint16_t *phs; } fdp; + uint16_t atomic_nawun; + uint16_t atomic_nawupf; + NvmeAtomic atomic; } NvmeNamespace; =20 static inline uint32_t nvme_nsid(NvmeNamespace *ns) --=20 2.51.0 From nobody Fri Nov 14 19:42:16 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1761809523; cv=none; d=zohomail.com; s=zohoarc; b=jehV9MyVKsYg0Bo335pHKHjvt1vLtfHsj9fgjOMuSmaUvlCY2MBnRQjwEhbbcBQP2Bps2toVE2zAigBQFtrnRllIBP0wWZLTKno+Ovfx5v+WH2V2OTI2PUXYqQynPg5OhON+8GLWQY4b36f/EON9vjY3PHyFSC6ct1IRPcZRbB8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1761809523; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=Fe5bhLuyG5WOblCIlnczmwsx9+pG/Wxr2BLnDKiVnbY=; b=RV+o4cS7ww+4q8N+6hCzDzQghy3yLwEn+Vguveq9Fq9Yi++/jP9VXTpXLHsf0XUmW41hoPWJdFJlBFL3E9lHp2U7W0mrqLZoGnqd/ma1f3n27yWNwUGaQXlfm3bcKOvGyO35yr6A1qw8QlRNLb7UghbwmhfDbhjtWGWIJ1JVByw= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1761809523193200.03007229004447; Thu, 30 Oct 2025 00:32:03 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vEN7j-0003A6-9F; Thu, 30 Oct 2025 03:31:08 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vEN7M-0002s9-PM; Thu, 30 Oct 2025 03:30:49 -0400 Received: from fout-a6-smtp.messagingengine.com ([103.168.172.149]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vEN7H-000554-TO; Thu, 30 Oct 2025 03:30:44 -0400 Received: from phl-compute-11.internal (phl-compute-11.internal [10.202.2.51]) by mailfout.phl.internal (Postfix) with ESMTP id D9861EC01BC; Thu, 30 Oct 2025 03:30:31 -0400 (EDT) Received: from phl-mailfrontend-02 ([10.202.2.163]) by phl-compute-11.internal (MEProxy); Thu, 30 Oct 2025 03:30:31 -0400 Received: by mail.messagingengine.com (Postfix) with ESMTPA; Thu, 30 Oct 2025 03:30:30 -0400 (EDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=irrelevant.dk; h=cc:cc:content-transfer-encoding:content-type:date:date:from :from:in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:subject:subject:to:to; s=fm2; t=1761809431; x= 1761895831; bh=Fe5bhLuyG5WOblCIlnczmwsx9+pG/Wxr2BLnDKiVnbY=; b=m k5votI4OdSQPp2PaJMZMYx+wDSHYOyAxN7kZ42He0kyLge9VxLNg8kGo+9WiHrS8 I1bdNQmW648q14d1ejyXFKTs3zUBKF2atgj2rvMvgOHeONQ/nFXNgc6mvjgV5Ie6 xnmK0WSkuIZ3wyHHuPUasTpOCaTRSuE/D3yD5/yjcJdMVYluv3A3UbGvMMV0trY1 LXPhAFeFNWCUxrMGSsdhaWWIUrHJljUnMkf2055mOkJa1CRVhSMO8UkbkzqIu5m3 nbv/YlUlFX8cdTnzozLvk1vpspuR07chs7BKWZA/SOzqN85w+JH+9toa2QpAFjIr Elfu2TN/zbrOB8bdZKrTg== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:date:date:feedback-id:feedback-id:from:from :in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:subject:subject:to:to:x-me-proxy:x-me-sender :x-me-sender:x-sasl-enc; s=fm3; t=1761809431; x=1761895831; bh=F e5bhLuyG5WOblCIlnczmwsx9+pG/Wxr2BLnDKiVnbY=; b=RMRxdEqf9fuE+ihJM TKrUrQehtnB4+dRgdhI0pQn+D8SRkNmXABuZOFZDulVFKqzddO33bg4VN87pnWLW WKQu31dYPHRuiBbxqloIHoRAxPnElYoR6sso5RREAnaL5CPwt/KTqVtOtUvLIflC 2Dnbz/NS5PsbiKuYwem2Ko0Gl5sjBQtg65nM6pWjKArmgASDGtc94URXYY1EQeSJ sdJt0Ra06ID3mj5EavgCwJC08KN7JqMZ/5oEa3pgMISjgh+GuRxvMzdk1f5lumWs O9O9v4UnytetONxoTQTsoaruCHQIyGNn5FDp2FdVzH5wSU9VlzW9/mfv0iY4thuR /A5bQ== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeeffedrtdeggdduieeitdduucetufdoteggodetrf dotffvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfurfetoffkrfgpnffqhgenuceu rghilhhouhhtmecufedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmnecujf gurhephffvvefufffkofgjfhgggfestdekredtredttdenucfhrhhomhepmfhlrghushcu lfgvnhhsvghnuceoihhtshesihhrrhgvlhgvvhgrnhhtrdgukheqnecuggftrfgrthhtvg hrnhepjefgieelgfeiveehkeeuveehheekfeevgeeigfehfefgjeejhefffeegudejudeg necuvehluhhsthgvrhfuihiivgepudenucfrrghrrghmpehmrghilhhfrhhomhepihhtsh esihhrrhgvlhgvvhgrnhhtrdgukhdpnhgspghrtghpthhtohepkedpmhhouggvpehsmhht phhouhhtpdhrtghpthhtohepqhgvmhhuqdguvghvvghlsehnohhnghhnuhdrohhrghdprh gtphhtthhopehpvghtvghrrdhmrgihuggvlhhlsehlihhnrghrohdrohhrghdprhgtphht thhopegrlhgrnhdrrggurghmshhonhesohhrrggtlhgvrdgtohhmpdhrtghpthhtohepfh hoshhsseguvghfmhgrtghrohdrihhtpdhrtghpthhtohepkhdrjhgvnhhsvghnsehsrghm shhunhhgrdgtohhmpdhrtghpthhtohepkhgsuhhstghhsehkvghrnhgvlhdrohhrghdprh gtphhtthhopehithhssehirhhrvghlvghvrghnthdrughkpdhrtghpthhtohepqhgvmhhu qdgslhhotghksehnohhnghhnuhdrohhrgh X-ME-Proxy: Feedback-ID: idc91472f:Fastmail From: Klaus Jensen To: qemu-devel@nongnu.org Cc: Peter Maydell , Alan Adamson , Jesper Wendel Devantier , Klaus Jensen , Keith Busch , Klaus Jensen , qemu-block@nongnu.org Subject: [PULL 7/7] hw/nvme: add atomic boundary support Date: Thu, 30 Oct 2025 08:29:55 +0100 Message-ID: <20251030072956.1194-8-its@irrelevant.dk> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20251030072956.1194-1-its@irrelevant.dk> References: <20251030072956.1194-1-its@irrelevant.dk> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=103.168.172.149; envelope-from=its@irrelevant.dk; helo=fout-a6-smtp.messagingengine.com X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @irrelevant.dk) X-ZM-MESSAGEID: 1761809526249158500 Content-Type: text/plain; charset="utf-8" From: Alan Adamson Add support for the namespace atomic boundary paramters: NABO, NABSN, and N= ABSPF. Writes that cross an atomic boundary whose size is less than or equal to va= lues reported by AWUN/AWUPF are guaranteed to be atomic. If AWUN/AWUPF is set to= zero, writes that cross an atomic boundary are not guaranteed to be atomic. The value reported by NABO field indicates the LBA on this namespace where = the first atomic boundary starts. New NVMe QEMU Paramters (See NVMe Specification for details): atomic.nabo=3DUINT16 (default: 0) atomic.nabsn=3DUINT16 (default: 0) atomic.nabspf=3DUINT16 (default: 0) See the NVMe Specification for more information. Signed-off-by: Alan Adamson Reviewed-by: Jesper Wendel Devantier Signed-off-by: Klaus Jensen --- hw/nvme/ctrl.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++ hw/nvme/ns.c | 36 ++++++++++++++++++++++++++++++++++ hw/nvme/nvme.h | 8 ++++++++ 3 files changed, 97 insertions(+) diff --git a/hw/nvme/ctrl.c b/hw/nvme/ctrl.c index 121a95b2e373..4d150c7206ad 100644 --- a/hw/nvme/ctrl.c +++ b/hw/nvme/ctrl.c @@ -6711,9 +6711,21 @@ static uint16_t nvme_set_feature(NvmeCtrl *n, NvmeRe= quest *req) if (n->dn) { ns->atomic.atomic_max_write_size =3D le16_to_cpu(ns->id_ns.nawupf) + 1; + if (ns->id_ns.nabspf) { + ns->atomic.atomic_boundary =3D + le16_to_cpu(ns->id_ns.nabspf) + 1; + } else { + ns->atomic.atomic_boundary =3D 0; + } } else { ns->atomic.atomic_max_write_size =3D le16_to_cpu(ns->id_ns.nawun) + 1; + if (ns->id_ns.nabsn) { + ns->atomic.atomic_boundary =3D + le16_to_cpu(ns->id_ns.nabsn) + 1; + } else { + ns->atomic.atomic_boundary =3D 0; + } } if (ns->atomic.atomic_max_write_size =3D=3D 1) { ns->atomic.atomic_writes =3D 0; @@ -7636,6 +7648,36 @@ static void nvme_update_sq_tail(NvmeSQueue *sq) trace_pci_nvme_update_sq_tail(sq->sqid, sq->tail); } =20 +static int nvme_atomic_boundary_check(NvmeCtrl *n, NvmeCmd *cmd, + NvmeAtomic *atomic) +{ + NvmeRwCmd *rw =3D (NvmeRwCmd *)cmd; + + if (atomic->atomic_boundary) { + uint64_t slba =3D le64_to_cpu(rw->slba); + uint32_t nlb =3D (uint32_t)le16_to_cpu(rw->nlb); + uint64_t elba =3D slba + nlb; + uint64_t imask; + + if ((slba < atomic->atomic_nabo) || (elba < atomic->atomic_nabo)) { + return 0; + } + + /* Update slba/elba based on boundary offset */ + slba =3D slba - atomic->atomic_nabo; + elba =3D slba + nlb; + + imask =3D ~(atomic->atomic_boundary - 1); + if ((slba & imask) !=3D (elba & imask)) { + if (n->atomic.atomic_max_write_size && + ((nlb + 1) <=3D n->atomic.atomic_max_write_size)) { + return 1; + } + return 0; + } + } + return 1; +} #define NVME_ATOMIC_NO_START 0 #define NVME_ATOMIC_START_ATOMIC 1 #define NVME_ATOMIC_START_NONATOMIC 2 @@ -7655,6 +7697,15 @@ static int nvme_atomic_write_check(NvmeCtrl *n, Nvme= Cmd *cmd, cmd_atomic_wr =3D false; } =20 + /* + * Check if a write crosses an atomic boundary. + */ + if (cmd->opcode =3D=3D NVME_CMD_WRITE) { + if (!nvme_atomic_boundary_check(n, cmd, atomic)) { + cmd_atomic_wr =3D false; + } + } + /* * Walk the queues to see if there are any atomic conflicts. */ @@ -8741,6 +8792,8 @@ static void nvme_init_state(NvmeCtrl *n) } else { atomic->atomic_writes =3D 1; } + atomic->atomic_boundary =3D 0; + atomic->atomic_nabo =3D 0; } } =20 diff --git a/hw/nvme/ns.c b/hw/nvme/ns.c index 28aacb8db59a..86f5ab0a7572 100644 --- a/hw/nvme/ns.c +++ b/hw/nvme/ns.c @@ -747,6 +747,28 @@ static void nvme_ns_realize(DeviceState *dev, Error **= errp) error_report("Invalid: NAWUN=3D%x NAWUPF=3D%x", id_ns->nawun, id_ns->nawupf); } + id_ns->nabsn =3D cpu_to_le16(ns->params.atomic_nabsn); + id_ns->nabspf =3D cpu_to_le16(ns->params.atomic_nabspf); + id_ns->nabo =3D cpu_to_le16(ns->params.atomic_nabo); + if (!id->awun || (id_ns->nabsn && ((id_ns->nabsn < id_ns->nawun) || + (id_ns->nabsn < id->awun)))) { + error_report("Invalid NABSN: %x NAWUN=3D%x AWUN=3D%x", + id_ns->nabsn, id_ns->nawun, id->awun); + } + if (!id->awupf || (id_ns->nabspf && ((id_ns->nabspf < id_ns->nawup= f) || + (id_ns->nawupf < id->awupf)))) { + error_report("Invalid NABSPF: %x NAWUPF=3D%x AWUPF=3D%x", + id_ns->nabspf, id_ns->nawupf, id->awupf); + } + if (id_ns->nabo && ((id_ns->nabo > id_ns->nabsn) || + (id_ns->nabo > id_ns->nabspf))) { + error_report("Invalid NABO: %x NABSN=3D%x NABSPF=3D%x", + id_ns->nabo, id_ns->nabsn, id_ns->nabspf); + } + if (id_ns->nawupf > id_ns->nawun) { + error_report("Invalid: NAWUN=3D%x NAWUPF=3D%x", id_ns->nawun, + id_ns->nawupf); + } } =20 if (id_ns->nawun || id_ns->nawupf) { @@ -754,14 +776,25 @@ static void nvme_ns_realize(DeviceState *dev, Error *= *errp) =20 if (n->dn) { atomic->atomic_max_write_size =3D cpu_to_le16(id_ns->nawupf) += 1; + if (id_ns->nabspf) { + atomic->atomic_boundary =3D cpu_to_le16(id_ns->nabspf) + 1; + } else { + atomic->atomic_boundary =3D 0; + } } else { atomic->atomic_max_write_size =3D cpu_to_le16(id_ns->nawun) + = 1; + if (id_ns->nabsn) { + atomic->atomic_boundary =3D cpu_to_le16(id_ns->nabsn) + 1; + } else { + atomic->atomic_boundary =3D 0; + } } if (atomic->atomic_max_write_size =3D=3D 1) { atomic->atomic_writes =3D 0; } else { atomic->atomic_writes =3D 1; } + atomic->atomic_nabo =3D cpu_to_le16(id_ns->nabo); } =20 /* reparent to subsystem bus */ @@ -841,6 +874,9 @@ static const Property nvme_ns_props[] =3D { DEFINE_PROP_STRING("fdp.ruhs", NvmeNamespace, params.fdp.ruhs), DEFINE_PROP_UINT16("atomic.nawun", NvmeNamespace, params.atomic_nawun,= 0), DEFINE_PROP_UINT16("atomic.nawupf", NvmeNamespace, params.atomic_nawup= f, 0), + DEFINE_PROP_UINT16("atomic.nabspf", NvmeNamespace, params.atomic_nabsp= f, 0), + DEFINE_PROP_UINT16("atomic.nabsn", NvmeNamespace, params.atomic_nabsn,= 0), + DEFINE_PROP_UINT16("atomic.nabo", NvmeNamespace, params.atomic_nabo, 0= ), DEFINE_PROP_BOOL("atomic.nsfeat", NvmeNamespace, params.atomic_nsfeat,= 0), }; =20 diff --git a/hw/nvme/nvme.h b/hw/nvme/nvme.h index 7d01080fc1f9..a7d225d2d80b 100644 --- a/hw/nvme/nvme.h +++ b/hw/nvme/nvme.h @@ -220,11 +220,16 @@ typedef struct NvmeNamespaceParams { } fdp; uint16_t atomic_nawun; uint16_t atomic_nawupf; + uint16_t atomic_nabsn; + uint16_t atomic_nabspf; + uint16_t atomic_nabo; bool atomic_nsfeat; } NvmeNamespaceParams; =20 typedef struct NvmeAtomic { uint32_t atomic_max_write_size; + uint64_t atomic_boundary; + uint64_t atomic_nabo; bool atomic_writes; } NvmeAtomic; =20 @@ -285,6 +290,9 @@ typedef struct NvmeNamespace { } fdp; uint16_t atomic_nawun; uint16_t atomic_nawupf; + uint16_t atomic_nabsn; + uint16_t atomic_nabspf; + uint16_t atomic_nabo; NvmeAtomic atomic; } NvmeNamespace; =20 --=20 2.51.0