From nobody Thu Apr 18 04:29:55 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; 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 1637826308101425.2917954743614; Wed, 24 Nov 2021 23:45:08 -0800 (PST) Received: from localhost ([::1]:47944 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mq9RF-0002kD-AX for importer@patchew.org; Thu, 25 Nov 2021 02:45:03 -0500 Received: from eggs.gnu.org ([209.51.188.92]:58150) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mq9KC-0007ku-0l; Thu, 25 Nov 2021 02:37:44 -0500 Received: from out2-smtp.messagingengine.com ([66.111.4.26]:49045) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mq9KA-0000Vs-Du; Thu, 25 Nov 2021 02:37:43 -0500 Received: from compute5.internal (compute5.nyi.internal [10.202.2.45]) by mailout.nyi.internal (Postfix) with ESMTP id 55E1C5C01A8; Thu, 25 Nov 2021 02:37:41 -0500 (EST) Received: from mailfrontend1 ([10.202.2.162]) by compute5.internal (MEProxy); Thu, 25 Nov 2021 02:37:41 -0500 Received: by mail.messagingengine.com (Postfix) with ESMTPA; Thu, 25 Nov 2021 02:37:39 -0500 (EST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=irrelevant.dk; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; s=fm1; bh=JrWb3UuoCg2iu wQY6MWzFJnuH+rEfBZLhpbZba1Wb5A=; b=MMpvK9K111KdLpPKhicI2cUzeD6RI UFR3JmqBEzSimeg/RzOfOMJLjL1E6PD+D+3m6ZYm1OgLWWQnwXpno/FqhUzcKXfd kHg6hMYwXRSD3DvFQR76kLqX/vbHK2Mcv62idvSJxCxqz3UFj4/JVTQfm5lwYPl/ kormEX4Z2Iz3hBaDxUh+0Mu3rGtjsNpm0x6MEO1BXbKYaFT5VZhdZdAg3KzpoVk9 VQCAJg4Dw0Abzvf6vnSY3rJdMKmZtAahlSRAvLsxUg+NsI9sC/WJP2y+nxLhdpgz xvz6mdly3b9SzUag3fPbIchzcp9Qh7ivDL0bGz0yNWRuQ0Ej7sPSm4WlA== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:content-transfer-encoding:date:from :in-reply-to:message-id:mime-version:references:subject:to :x-me-proxy:x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s= fm1; bh=JrWb3UuoCg2iuwQY6MWzFJnuH+rEfBZLhpbZba1Wb5A=; b=R1xK22Ct LqnvvCO6alk36UMj5Osj456kXmkO8/jGU62ZFD/u0YAe/sYueTREy8Kxo50ILK9F FhPNW2vWfKRkwRbS0oVg00uSqQwNYLTyW9jMHr6IpOKcCIGGhDToX9dyJeb5RzCa DiD1816cgUhnGvDqflPfbSju3dvI6ItDOHyzBn/Vc9QHyFyVaBFvLu4WkL/Z4HdQ j9HHhNvV+6Ru/OL6PilZHE3tBWBhl/eDGPbK7fvWzudf/4L9smfU4ahuqpncqn03 WBm662BDinoWO/77brK+ZoPV4PJ++CGe89lhp+t9buNLpwX7ItSaQ/FtQYS0ihKd Mf9Z3EgvDhMDWQ== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedvuddrgeelgddutdeiucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmne cujfgurhephffvufffkffojghfggfgsedtkeertdertddtnecuhfhrohhmpefmlhgruhhs ucflvghnshgvnhcuoehithhssehirhhrvghlvghvrghnthdrughkqeenucggtffrrghtth gvrhhnpeeuleetgeeiuefhgfekfefgveejiefgteekiedtgfdtieefhfdthfefueffvefg keenucevlhhushhtvghrufhiiigvpedtnecurfgrrhgrmhepmhgrihhlfhhrohhmpehith hssehirhhrvghlvghvrghnthdrughk X-ME-Proxy: From: Klaus Jensen To: qemu-devel@nongnu.org, qemu-block@nongnu.org Subject: [PATCH for-7.0 1/4] hw/nvme: add struct for zone management send Date: Thu, 25 Nov 2021 08:37:32 +0100 Message-Id: <20211125073735.248403-2-its@irrelevant.dk> X-Mailer: git-send-email 2.34.0 In-Reply-To: <20211125073735.248403-1-its@irrelevant.dk> References: <20211125073735.248403-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=66.111.4.26; envelope-from=its@irrelevant.dk; helo=out2-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_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=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: , Cc: Kevin Wolf , Fam Zheng , Klaus Jensen , Keith Busch , Hanna Reitz , Stefan Hajnoczi , Klaus Jensen , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZM-MESSAGEID: 1637826310546100001 Content-Type: text/plain; charset="utf-8" From: Klaus Jensen Add struct for Zone Management Send in preparation for more zone send flags. Signed-off-by: Klaus Jensen Reviewed-by: Keith Busch --- hw/nvme/ctrl.c | 10 ++++------ include/block/nvme.h | 18 ++++++++++++++++++ 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/hw/nvme/ctrl.c b/hw/nvme/ctrl.c index 5f573c417b3d..489d586ab9d7 100644 --- a/hw/nvme/ctrl.c +++ b/hw/nvme/ctrl.c @@ -3593,26 +3593,24 @@ done: =20 static uint16_t nvme_zone_mgmt_send(NvmeCtrl *n, NvmeRequest *req) { - NvmeCmd *cmd =3D (NvmeCmd *)&req->cmd; + NvmeZoneSendCmd *cmd =3D (NvmeZoneSendCmd *)&req->cmd; NvmeNamespace *ns =3D req->ns; NvmeZone *zone; NvmeZoneResetAIOCB *iocb; uint8_t *zd_ext; - uint32_t dw13 =3D le32_to_cpu(cmd->cdw13); uint64_t slba =3D 0; uint32_t zone_idx =3D 0; uint16_t status; - uint8_t action; + uint8_t action =3D cmd->zsa; bool all; enum NvmeZoneProcessingMask proc_mask =3D NVME_PROC_CURRENT_ZONE; =20 - action =3D dw13 & 0xff; - all =3D !!(dw13 & 0x100); + all =3D cmd->zsflags[0] & NVME_ZSFLAG_SELECT_ALL; =20 req->status =3D NVME_SUCCESS; =20 if (!all) { - status =3D nvme_get_mgmt_zone_slba_idx(ns, cmd, &slba, &zone_idx); + status =3D nvme_get_mgmt_zone_slba_idx(ns, &req->cmd, &slba, &zone= _idx); if (status) { return status; } diff --git a/include/block/nvme.h b/include/block/nvme.h index e3bd47bf76ab..2ee227760265 100644 --- a/include/block/nvme.h +++ b/include/block/nvme.h @@ -1433,6 +1433,20 @@ enum NvmeZoneType { NVME_ZONE_TYPE_SEQ_WRITE =3D 0x02, }; =20 +typedef struct QEMU_PACKED NvmeZoneSendCmd { + uint8_t opcode; + uint8_t flags; + uint16_t cid; + uint32_t nsid; + uint32_t rsvd2[4]; + NvmeCmdDptr dptr; + uint64_t slba; + uint32_t rsvd12; + uint8_t zsa; + uint8_t zsflags[3]; + uint32_t rsvd14[2]; +} NvmeZoneSendCmd; + enum NvmeZoneSendAction { NVME_ZONE_ACTION_RSD =3D 0x00, NVME_ZONE_ACTION_CLOSE =3D 0x01, @@ -1443,6 +1457,10 @@ enum NvmeZoneSendAction { NVME_ZONE_ACTION_SET_ZD_EXT =3D 0x10, }; =20 +enum { + NVME_ZSFLAG_SELECT_ALL =3D 1 << 0, +}; + typedef struct QEMU_PACKED NvmeZoneDescr { uint8_t zt; uint8_t zs; --=20 2.34.0 From nobody Thu Apr 18 04:29:55 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; 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 1637826877387762.053424947954; Wed, 24 Nov 2021 23:54:37 -0800 (PST) Received: from localhost ([::1]:33190 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mq9aU-00043A-In for importer@patchew.org; Thu, 25 Nov 2021 02:54:34 -0500 Received: from eggs.gnu.org ([209.51.188.92]:58168) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mq9KD-0007nS-PX; Thu, 25 Nov 2021 02:37:45 -0500 Received: from out2-smtp.messagingengine.com ([66.111.4.26]:55243) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mq9KC-0000W5-1m; Thu, 25 Nov 2021 02:37:45 -0500 Received: from compute3.internal (compute3.nyi.internal [10.202.2.43]) by mailout.nyi.internal (Postfix) with ESMTP id 57B735C01B4; Thu, 25 Nov 2021 02:37:43 -0500 (EST) Received: from mailfrontend1 ([10.202.2.162]) by compute3.internal (MEProxy); Thu, 25 Nov 2021 02:37:43 -0500 Received: by mail.messagingengine.com (Postfix) with ESMTPA; Thu, 25 Nov 2021 02:37:41 -0500 (EST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=irrelevant.dk; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; s=fm1; bh=dubePG3IYWBn5 PpSnm2cVUSzv0Simk3Rk9Oi/pWAjGg=; b=B3fIcLWIdoLjpKbYJa3kM6osG0vYk H0AU/UEMC4AoHcuw5D0HY21KIHwQtucFApMip68gDdIqJtlbmAAL7TzYzusMAD0f k2IFYv1OnbWJWArLwvopiMHKc2go4uS7p5CfJPoinbipkrfknE/Uer8oG61lYMY2 s0FbikUOAfLizHY/okFZti9HZlwMj0555LcvudFSUvzRZhg6mXhLWi4gg4KrTP/J TroRBWFcFam3Omc+1kwyxZ/I2viKw/2JU+1BZIqrv0+OGBpcxeg7JOmibnTJGGBq h3wqtvSlPfQ2zRuumvLDVflgtbobY1Audf8qUNEMynj3BBq4nlWYIVztA== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:content-transfer-encoding:date:from :in-reply-to:message-id:mime-version:references:subject:to :x-me-proxy:x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s= fm1; bh=dubePG3IYWBn5PpSnm2cVUSzv0Simk3Rk9Oi/pWAjGg=; b=E1DysK9T ZH5YIKPci62rEbTtuSVbMgdwjyFmmaydJNWoy35WmMZGoMyp+GrQl9tQHNRIUoBk LJqnsvEKcttO3XOi0/UXRQ3k5RYMVEWQBjlvvhlHzu7jAWceH0mcUknv0ITNXJJf eucPSxooxsxC4SDtCOx2XmK1qwtgAN2VTk9NI8r+3CS1ODdJDwvF9GnpCQoUjBy2 Huu463X+pVxqZLGVQpeYma62/6wz94fQGN+buesKzMTGiE/lAuoFfF3pSrzhjB1w Zm0+CYOtP3gakZUm8Fw61j3EzrOjH9AacJj3isqhgX2iVdVxy+MJ8JXxmNQRXdaF IZGpW9MEXXjeCw== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedvuddrgeelgddutdeiucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmne cujfgurhephffvufffkffojghfggfgsedtkeertdertddtnecuhfhrohhmpefmlhgruhhs ucflvghnshgvnhcuoehithhssehirhhrvghlvghvrghnthdrughkqeenucggtffrrghtth gvrhhnpeeuleetgeeiuefhgfekfefgveejiefgteekiedtgfdtieefhfdthfefueffvefg keenucevlhhushhtvghrufhiiigvpedtnecurfgrrhgrmhepmhgrihhlfhhrohhmpehith hssehirhhrvghlvghvrghnthdrughk X-ME-Proxy: From: Klaus Jensen To: qemu-devel@nongnu.org, qemu-block@nongnu.org Subject: [PATCH for-7.0 2/4] hw/nvme: add zone attribute get/set helpers Date: Thu, 25 Nov 2021 08:37:33 +0100 Message-Id: <20211125073735.248403-3-its@irrelevant.dk> X-Mailer: git-send-email 2.34.0 In-Reply-To: <20211125073735.248403-1-its@irrelevant.dk> References: <20211125073735.248403-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=66.111.4.26; envelope-from=its@irrelevant.dk; helo=out2-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_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=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: , Cc: Kevin Wolf , Fam Zheng , Klaus Jensen , Keith Busch , Hanna Reitz , Stefan Hajnoczi , Klaus Jensen , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZM-MESSAGEID: 1637826878746100001 Content-Type: text/plain; charset="utf-8" From: Klaus Jensen Add some get/set helpers for zone attributes. Signed-off-by: Klaus Jensen --- hw/nvme/ctrl.c | 4 ++-- include/block/nvme.h | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/hw/nvme/ctrl.c b/hw/nvme/ctrl.c index 489d586ab9d7..7ac6ec50a0d1 100644 --- a/hw/nvme/ctrl.c +++ b/hw/nvme/ctrl.c @@ -295,7 +295,7 @@ static void nvme_assign_zone_state(NvmeNamespace *ns, N= vmeZone *zone, case NVME_ZONE_STATE_READ_ONLY: break; default: - zone->d.za =3D 0; + NVME_ZA_CLEAR_ALL(zone->d.za); } } =20 @@ -3356,7 +3356,7 @@ static uint16_t nvme_set_zd_ext(NvmeNamespace *ns, Nv= meZone *zone) return status; } nvme_aor_inc_active(ns); - zone->d.za |=3D NVME_ZA_ZD_EXT_VALID; + NVME_ZA_SET(zone->d.za, NVME_ZA_ZD_EXT_VALID); nvme_assign_zone_state(ns, zone, NVME_ZONE_STATE_CLOSED); return NVME_SUCCESS; } diff --git a/include/block/nvme.h b/include/block/nvme.h index 2ee227760265..2b8b906466ab 100644 --- a/include/block/nvme.h +++ b/include/block/nvme.h @@ -1407,6 +1407,10 @@ enum NvmeZoneAttr { NVME_ZA_ZD_EXT_VALID =3D 1 << 7, }; =20 +#define NVME_ZA_SET(za, attrs) ((za) |=3D (attrs)) +#define NVME_ZA_CLEAR(za, attrs) ((za) &=3D ~(attrs)) +#define NVME_ZA_CLEAR_ALL(za) ((za) =3D 0x0) + typedef struct QEMU_PACKED NvmeZoneReportHeader { uint64_t nr_zones; uint8_t rsvd[56]; --=20 2.34.0 From nobody Thu Apr 18 04:29:55 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; 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 1637826444476778.7590860775566; Wed, 24 Nov 2021 23:47:24 -0800 (PST) Received: from localhost ([::1]:50190 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mq9TX-0004PD-1Z for importer@patchew.org; Thu, 25 Nov 2021 02:47:23 -0500 Received: from eggs.gnu.org ([209.51.188.92]:58190) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mq9KF-0007rZ-Oe; Thu, 25 Nov 2021 02:37:47 -0500 Received: from out2-smtp.messagingengine.com ([66.111.4.26]:45987) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mq9KE-0000WN-B5; Thu, 25 Nov 2021 02:37:47 -0500 Received: from compute6.internal (compute6.nyi.internal [10.202.2.46]) by mailout.nyi.internal (Postfix) with ESMTP id 271D25C0109; Thu, 25 Nov 2021 02:37:45 -0500 (EST) Received: from mailfrontend1 ([10.202.2.162]) by compute6.internal (MEProxy); Thu, 25 Nov 2021 02:37:45 -0500 Received: by mail.messagingengine.com (Postfix) with ESMTPA; Thu, 25 Nov 2021 02:37:43 -0500 (EST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=irrelevant.dk; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; s=fm1; bh=qGBD61aZ0WTI0 2c3CREOvlqAz4JE8ofVhaVhtFAyq5U=; b=QsTz+aqlOQcnpbB1TFMVyvgPX7iO5 wdWrGPW3tN49zuYl1fiK0iXG0Yp6GAkNZ4lwL88bV5wYSVAD5nlYBzqSAshM1Qvc ibWrR43ViqefZMIijg07CmbOVMmnGPcBVBKXSJkLrZxNHZfvzulTBbXeiGGZMciD N/3gPesUNBNmYNunWsLJitGl69RtPIw2yuSZcGkbhoWxQH5Jz9m8ylvKIqeVhfu3 f3QvhN9nsKLZfa6Ln0Wqi2vkEm28O5BTlhd90naga7W+b3AS7wV4ta58y6Ms/Cew lkKLEimwwh0/2qUeyXg20eGasIcPoN4wlWyuzCQ/IoETBkCPL+bAJ1KMQ== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:content-transfer-encoding:date:from :in-reply-to:message-id:mime-version:references:subject:to :x-me-proxy:x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s= fm1; bh=qGBD61aZ0WTI02c3CREOvlqAz4JE8ofVhaVhtFAyq5U=; b=W+2jQX2z gOKTyhWi8BdCnPBOthE7mIDydUzajjuiepaW7MAL3ZoLsE6g27q0yhsHYfaBCp8O BS/RwF79gGyrq2l5ztAQhiY+ERlaRrO6o3KVx1WPCubqew5NckBQlvVRuUd/3/RT JJS99LiHy6yvy7Xsc9QJ2RC3Nn19Mz/jYkFpbO+238LzzTOKgfs7Z8gxCUYbKRqo 4F71A/ReIYWt5sfgieQoljG2bYoKuFZVtThr8rQUAd78h8SLdVH/J0EmaCoAvX0o jxa56CkyJ7tqqigTQOC6Ihmi+LJj6w7ViFlH8YvmIPpE5IutnWsKgjtNwE3iS8Dx /4bOdPCxVXz8CQ== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedvuddrgeelgddutdeiucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmne cujfgurhephffvufffkffojghfggfgsedtkeertdertddtnecuhfhrohhmpefmlhgruhhs ucflvghnshgvnhcuoehithhssehirhhrvghlvghvrghnthdrughkqeenucggtffrrghtth gvrhhnpeeuleetgeeiuefhgfekfefgveejiefgteekiedtgfdtieefhfdthfefueffvefg keenucevlhhushhtvghrufhiiigvpedtnecurfgrrhgrmhepmhgrihhlfhhrohhmpehith hssehirhhrvghlvghvrghnthdrughk X-ME-Proxy: From: Klaus Jensen To: qemu-devel@nongnu.org, qemu-block@nongnu.org Subject: [PATCH for-7.0 3/4] hw/nvme: add ozcs enum Date: Thu, 25 Nov 2021 08:37:34 +0100 Message-Id: <20211125073735.248403-4-its@irrelevant.dk> X-Mailer: git-send-email 2.34.0 In-Reply-To: <20211125073735.248403-1-its@irrelevant.dk> References: <20211125073735.248403-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=66.111.4.26; envelope-from=its@irrelevant.dk; helo=out2-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_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=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: , Cc: Kevin Wolf , Fam Zheng , Klaus Jensen , Keith Busch , Hanna Reitz , Stefan Hajnoczi , Klaus Jensen , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZM-MESSAGEID: 1637826445194100001 Content-Type: text/plain; charset="utf-8" From: Klaus Jensen Add enumeration for OZCS values. Signed-off-by: Klaus Jensen Reviewed-by: Keith Busch --- hw/nvme/ns.c | 3 ++- include/block/nvme.h | 4 ++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/hw/nvme/ns.c b/hw/nvme/ns.c index 8b5f98c76180..356b6c1c2f14 100644 --- a/hw/nvme/ns.c +++ b/hw/nvme/ns.c @@ -266,7 +266,8 @@ static void nvme_ns_init_zoned(NvmeNamespace *ns) id_ns_z->mar =3D cpu_to_le32(ns->params.max_active_zones - 1); id_ns_z->mor =3D cpu_to_le32(ns->params.max_open_zones - 1); id_ns_z->zoc =3D 0; - id_ns_z->ozcs =3D ns->params.cross_zone_read ? 0x01 : 0x00; + id_ns_z->ozcs =3D ns->params.cross_zone_read ? + NVME_ID_NS_ZONED_OZCS_RAZB : 0x00; =20 for (i =3D 0; i <=3D ns->id_ns.nlbaf; i++) { id_ns_z->lbafe[i].zsze =3D cpu_to_le64(ns->zone_size); diff --git a/include/block/nvme.h b/include/block/nvme.h index 2b8b906466ab..d33ff2c184cf 100644 --- a/include/block/nvme.h +++ b/include/block/nvme.h @@ -1351,6 +1351,10 @@ typedef struct QEMU_PACKED NvmeIdNsZoned { uint8_t vs[256]; } NvmeIdNsZoned; =20 +enum NvmeIdNsZonedOzcs { + NVME_ID_NS_ZONED_OZCS_RAZB =3D 1 << 0, +}; + /*Deallocate Logical Block Features*/ #define NVME_ID_NS_DLFEAT_GUARD_CRC(dlfeat) ((dlfeat) & 0x10) #define NVME_ID_NS_DLFEAT_WRITE_ZEROES(dlfeat) ((dlfeat) & 0x08) --=20 2.34.0 From nobody Thu Apr 18 04:29:55 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; 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 1637826350243318.5336385631772; Wed, 24 Nov 2021 23:45:50 -0800 (PST) Received: from localhost ([::1]:48642 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mq9Rz-0003Ft-UF for importer@patchew.org; Thu, 25 Nov 2021 02:45:48 -0500 Received: from eggs.gnu.org ([209.51.188.92]:58236) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mq9KH-0007vd-UR; Thu, 25 Nov 2021 02:37:50 -0500 Received: from out2-smtp.messagingengine.com ([66.111.4.26]:56057) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mq9KF-0000Wf-MC; Thu, 25 Nov 2021 02:37:49 -0500 Received: from compute5.internal (compute5.nyi.internal [10.202.2.45]) by mailout.nyi.internal (Postfix) with ESMTP id F12055C0191; Thu, 25 Nov 2021 02:37:46 -0500 (EST) Received: from mailfrontend1 ([10.202.2.162]) by compute5.internal (MEProxy); Thu, 25 Nov 2021 02:37:46 -0500 Received: by mail.messagingengine.com (Postfix) with ESMTPA; Thu, 25 Nov 2021 02:37:45 -0500 (EST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=irrelevant.dk; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; s=fm1; bh=1XV+HBe17X0yR kD5SAzmuTcGwPFsZzNuh3VYp69+SHM=; b=dS+fUMYjeFeKlkXBcsRTylJtK1FFy W7j15iQZzU+RJkRRminZbeoqUow6odcBh1Afe6ke2/q3v8QTHGye/4n176qDHCA5 qjb4ztra9zdxNAwKVWDL3LKUzEjphDRQr4t+lrjIYocbkYSWYI4OSgJZ3yRSsrkn H/6Z+GzbhdUyqTEil5GGxth4qlsHOoug/3oQdt40uauIGZ4/j+VNAg3QFpu6/9/k M9eMKNlAQh5hnSCkvPBniWujniz9Z2ysKtmz4tWgLXFaaMBeT2MHrQDrUn3eMjST uWWyEKo0ivWtOB49sfs3Euh7ikIDaH4A99R4pN4KZaxz0lSlDvHabiA/A== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:content-transfer-encoding:date:from :in-reply-to:message-id:mime-version:references:subject:to :x-me-proxy:x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s= fm1; bh=1XV+HBe17X0yRkD5SAzmuTcGwPFsZzNuh3VYp69+SHM=; b=IdyZOrNq nEWbhqZa8o92LBd/XCiSZzgyGiV8xWpPKmkSxvDAr2d9aBa2UejxGhTPNNjaTYNx 1qLvkbRhY/zA2IDbrr9Yl0hUNEorlhzwSyPv+5/HflcBgCekmmNA1gHRCHXXhpf/ 8zZNH1X57z+DSX6qRhe2NfkjxPs8sL4USdYbBwTu/HHh92LpQTpGzPbFx/YzG5pJ KmiJg/VeevV9rENl8K6LAydjVY5zuWKmNeDf+BNUPWYsMi23zO9ClNSk8mJrsCDr PLnl4tGSrocHHjxU3EMxoYmqvT4jUNjfli1ul4tr5Mcg3ujd3qrH+xmpmTl7cDi2 Oz7kjvaTjmWnPg== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedvuddrgeelgddutdeiucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmne cujfgurhephffvufffkffojghfggfgsedtkeertdertddtnecuhfhrohhmpefmlhgruhhs ucflvghnshgvnhcuoehithhssehirhhrvghlvghvrghnthdrughkqeenucggtffrrghtth gvrhhnpeeuleetgeeiuefhgfekfefgveejiefgteekiedtgfdtieefhfdthfefueffvefg keenucevlhhushhtvghrufhiiigvpedunecurfgrrhgrmhepmhgrihhlfhhrohhmpehith hssehirhhrvghlvghvrghnthdrughk X-ME-Proxy: From: Klaus Jensen To: qemu-devel@nongnu.org, qemu-block@nongnu.org Subject: [PATCH for-7.0 4/4] hw/nvme: add support for zoned random write area Date: Thu, 25 Nov 2021 08:37:35 +0100 Message-Id: <20211125073735.248403-5-its@irrelevant.dk> X-Mailer: git-send-email 2.34.0 In-Reply-To: <20211125073735.248403-1-its@irrelevant.dk> References: <20211125073735.248403-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=66.111.4.26; envelope-from=its@irrelevant.dk; helo=out2-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_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=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: , Cc: Kevin Wolf , Fam Zheng , Klaus Jensen , Keith Busch , Hanna Reitz , Stefan Hajnoczi , Klaus Jensen , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZM-MESSAGEID: 1637826351787100001 Content-Type: text/plain; charset="utf-8" From: Klaus Jensen Add support for TP 4076 ("Zoned Random Write Area"), v2021.08.23 ("Ratified"). This adds three new namespace parameters: "zoned.numzrwa" (number of zrwa resources, i.e. number of zones that can have a zrwa), "zoned.zrwas" (zrwa size in LBAs), "zoned.zrwafg" (granularity in LBAs for flushes). Signed-off-by: Klaus Jensen Reviewed-by: Keith Busch --- hw/nvme/ctrl.c | 171 ++++++++++++++++++++++++++++++++++++++----- hw/nvme/ns.c | 58 +++++++++++++++ hw/nvme/nvme.h | 10 +++ hw/nvme/trace-events | 1 + include/block/nvme.h | 17 ++++- 5 files changed, 237 insertions(+), 20 deletions(-) diff --git a/hw/nvme/ctrl.c b/hw/nvme/ctrl.c index 7ac6ec50a0d1..4c9b303dfdca 100644 --- a/hw/nvme/ctrl.c +++ b/hw/nvme/ctrl.c @@ -299,26 +299,37 @@ static void nvme_assign_zone_state(NvmeNamespace *ns,= NvmeZone *zone, } } =20 -/* - * Check if we can open a zone without exceeding open/active limits. - * AOR stands for "Active and Open Resources" (see TP 4053 section 2.5). - */ -static int nvme_aor_check(NvmeNamespace *ns, uint32_t act, uint32_t opn) +static uint16_t nvme_zns_check_resources(NvmeNamespace *ns, uint32_t act, + uint32_t opn, uint32_t zrwa) { if (ns->params.max_active_zones !=3D 0 && ns->nr_active_zones + act > ns->params.max_active_zones) { trace_pci_nvme_err_insuff_active_res(ns->params.max_active_zones); return NVME_ZONE_TOO_MANY_ACTIVE | NVME_DNR; } + if (ns->params.max_open_zones !=3D 0 && ns->nr_open_zones + opn > ns->params.max_open_zones) { trace_pci_nvme_err_insuff_open_res(ns->params.max_open_zones); return NVME_ZONE_TOO_MANY_OPEN | NVME_DNR; } =20 + if (zrwa > ns->zns.numzrwa) { + return NVME_NOZRWA | NVME_DNR; + } + return NVME_SUCCESS; } =20 +/* + * Check if we can open a zone without exceeding open/active limits. + * AOR stands for "Active and Open Resources" (see TP 4053 section 2.5). + */ +static uint16_t nvme_aor_check(NvmeNamespace *ns, uint32_t act, uint32_t o= pn) +{ + return nvme_zns_check_resources(ns, act, opn, 0); +} + static bool nvme_addr_is_cmb(NvmeCtrl *n, hwaddr addr) { hwaddr hi, lo; @@ -1605,9 +1616,19 @@ static uint16_t nvme_check_zone_write(NvmeNamespace = *ns, NvmeZone *zone, return status; } =20 - if (unlikely(slba !=3D zone->w_ptr)) { - trace_pci_nvme_err_write_not_at_wp(slba, zone->d.zslba, zone->w_pt= r); - return NVME_ZONE_INVALID_WRITE; + if (zone->d.za & NVME_ZA_ZRWA_VALID) { + uint64_t ezrwa =3D zone->w_ptr + 2 * ns->zns.zrwas; + + if (slba < zone->w_ptr || slba + nlb > ezrwa) { + trace_pci_nvme_err_zone_invalid_write(slba, zone->w_ptr); + return NVME_ZONE_INVALID_WRITE; + } + } else { + if (unlikely(slba !=3D zone->w_ptr)) { + trace_pci_nvme_err_write_not_at_wp(slba, zone->d.zslba, + zone->w_ptr); + return NVME_ZONE_INVALID_WRITE; + } } =20 if (unlikely((slba + nlb) > zcap)) { @@ -1687,6 +1708,14 @@ static uint16_t nvme_zrm_finish(NvmeNamespace *ns, N= vmeZone *zone) /* fallthrough */ case NVME_ZONE_STATE_CLOSED: nvme_aor_dec_active(ns); + + if (zone->d.za & NVME_ZA_ZRWA_VALID) { + NVME_ZA_CLEAR(zone->d.za, NVME_ZA_ZRWA_VALID); + if (ns->params.numzrwa) { + ns->zns.numzrwa++; + } + } + /* fallthrough */ case NVME_ZONE_STATE_EMPTY: nvme_assign_zone_state(ns, zone, NVME_ZONE_STATE_FULL); @@ -1722,6 +1751,13 @@ static uint16_t nvme_zrm_reset(NvmeNamespace *ns, Nv= meZone *zone) /* fallthrough */ case NVME_ZONE_STATE_CLOSED: nvme_aor_dec_active(ns); + + if (zone->d.za & NVME_ZA_ZRWA_VALID) { + if (ns->params.numzrwa) { + ns->zns.numzrwa++; + } + } + /* fallthrough */ case NVME_ZONE_STATE_FULL: zone->w_ptr =3D zone->d.zslba; @@ -1755,6 +1791,7 @@ static void nvme_zrm_auto_transition_zone(NvmeNamespa= ce *ns) =20 enum { NVME_ZRM_AUTO =3D 1 << 0, + NVME_ZRM_ZRWA =3D 1 << 1, }; =20 static uint16_t nvme_zrm_open_flags(NvmeCtrl *n, NvmeNamespace *ns, @@ -1773,7 +1810,8 @@ static uint16_t nvme_zrm_open_flags(NvmeCtrl *n, Nvme= Namespace *ns, if (n->params.auto_transition_zones) { nvme_zrm_auto_transition_zone(ns); } - status =3D nvme_aor_check(ns, act, 1); + status =3D nvme_zns_check_resources(ns, act, 1, + (flags & NVME_ZRM_ZRWA) ? 1 : 0); if (status) { return status; } @@ -1801,6 +1839,12 @@ static uint16_t nvme_zrm_open_flags(NvmeCtrl *n, Nvm= eNamespace *ns, /* fallthrough */ =20 case NVME_ZONE_STATE_EXPLICITLY_OPEN: + if (flags & NVME_ZRM_ZRWA) { + ns->zns.numzrwa--; + + NVME_ZA_SET(zone->d.za, NVME_ZA_ZRWA_VALID); + } + return NVME_SUCCESS; =20 default: @@ -1814,12 +1858,6 @@ static inline uint16_t nvme_zrm_auto(NvmeCtrl *n, Nv= meNamespace *ns, return nvme_zrm_open_flags(n, ns, zone, NVME_ZRM_AUTO); } =20 -static inline uint16_t nvme_zrm_open(NvmeCtrl *n, NvmeNamespace *ns, - NvmeZone *zone) -{ - return nvme_zrm_open_flags(n, ns, zone, 0); -} - static void nvme_advance_zone_wp(NvmeNamespace *ns, NvmeZone *zone, uint32_t nlb) { @@ -1830,6 +1868,20 @@ static void nvme_advance_zone_wp(NvmeNamespace *ns, = NvmeZone *zone, } } =20 +static void nvme_zoned_zrwa_implicit_flush(NvmeNamespace *ns, NvmeZone *zo= ne, + uint32_t nlbc) +{ + uint16_t nzrwafgs =3D DIV_ROUND_UP(nlbc, ns->zns.zrwafg); + + nlbc =3D nzrwafgs * ns->zns.zrwafg; + + trace_pci_nvme_zoned_zrwa_implicit_flush(zone->d.zslba, nlbc); + + zone->w_ptr +=3D nlbc; + + nvme_advance_zone_wp(ns, zone, nlbc); +} + static void nvme_finalize_zoned_write(NvmeNamespace *ns, NvmeRequest *req) { NvmeRwCmd *rw =3D (NvmeRwCmd *)&req->cmd; @@ -1842,6 +1894,17 @@ static void nvme_finalize_zoned_write(NvmeNamespace = *ns, NvmeRequest *req) zone =3D nvme_get_zone_by_slba(ns, slba); assert(zone); =20 + if (zone->d.za & NVME_ZA_ZRWA_VALID) { + uint64_t ezrwa =3D zone->w_ptr + ns->zns.zrwas - 1; + uint64_t elba =3D slba + nlb - 1; + + if (elba > ezrwa) { + nvme_zoned_zrwa_implicit_flush(ns, zone, elba - ezrwa); + } + + return; + } + nvme_advance_zone_wp(ns, zone, nlb); } =20 @@ -2642,7 +2705,9 @@ static void nvme_copy_in_completed_cb(void *opaque, i= nt ret) goto invalid; } =20 - iocb->zone->w_ptr +=3D nlb; + if (!(iocb->zone->d.za & NVME_ZA_ZRWA_VALID)) { + iocb->zone->w_ptr +=3D nlb; + } } =20 qemu_iovec_reset(&iocb->iov); @@ -3181,6 +3246,10 @@ static uint16_t nvme_do_write(NvmeCtrl *n, NvmeReque= st *req, bool append, if (append) { bool piremap =3D !!(ctrl & NVME_RW_PIREMAP); =20 + if (unlikely(zone->d.za & NVME_ZA_ZRWA_VALID)) { + return NVME_INVALID_ZONE_OP | NVME_DNR; + } + if (unlikely(slba !=3D zone->d.zslba)) { trace_pci_nvme_err_append_not_at_start(slba, zone->d.zslba= ); status =3D NVME_INVALID_FIELD; @@ -3232,7 +3301,9 @@ static uint16_t nvme_do_write(NvmeCtrl *n, NvmeReques= t *req, bool append, goto invalid; } =20 - zone->w_ptr +=3D nlb; + if (!(zone->d.za & NVME_ZA_ZRWA_VALID)) { + zone->w_ptr +=3D nlb; + } } =20 data_offset =3D nvme_l2b(ns, slba); @@ -3316,7 +3387,24 @@ enum NvmeZoneProcessingMask { static uint16_t nvme_open_zone(NvmeNamespace *ns, NvmeZone *zone, NvmeZoneState state, NvmeRequest *req) { - return nvme_zrm_open(nvme_ctrl(req), ns, zone); + NvmeZoneSendCmd *cmd =3D (NvmeZoneSendCmd *)&req->cmd; + int flags =3D 0; + + if (cmd->zsflags[0] & NVME_ZSFLAG_ZRWA_ALLOC) { + uint16_t ozcs =3D le16_to_cpu(ns->id_ns_zoned->ozcs); + + if (!(ozcs & NVME_ID_NS_ZONED_OZCS_ZRWASUP)) { + return NVME_INVALID_ZONE_OP | NVME_DNR; + } + + if (zone->w_ptr % ns->zns.zrwafg) { + return NVME_NOZRWA | NVME_DNR; + } + + flags =3D NVME_ZRM_ZRWA; + } + + return nvme_zrm_open_flags(nvme_ctrl(req), ns, zone, flags); } =20 static uint16_t nvme_close_zone(NvmeNamespace *ns, NvmeZone *zone, @@ -3591,6 +3679,44 @@ done: } } =20 +static uint16_t nvme_zone_mgmt_send_zrwa_flush(NvmeCtrl *n, NvmeZone *zone, + uint64_t elba, NvmeRequest = *req) +{ + NvmeNamespace *ns =3D req->ns; + uint16_t ozcs =3D le16_to_cpu(ns->id_ns_zoned->ozcs); + uint64_t wp =3D zone->d.wp; + uint32_t nlb =3D elba - wp + 1; + uint16_t status; + + + if (!(ozcs & NVME_ID_NS_ZONED_OZCS_ZRWASUP)) { + return NVME_INVALID_ZONE_OP | NVME_DNR; + } + + if (!(zone->d.za & NVME_ZA_ZRWA_VALID)) { + return NVME_INVALID_FIELD | NVME_DNR; + } + + if (elba < wp || elba > wp + ns->zns.zrwas) { + return NVME_ZONE_BOUNDARY_ERROR | NVME_DNR; + } + + if (nlb % ns->zns.zrwafg) { + return NVME_INVALID_FIELD | NVME_DNR; + } + + status =3D nvme_zrm_auto(n, ns, zone); + if (status) { + return status; + } + + zone->w_ptr +=3D nlb; + + nvme_advance_zone_wp(ns, zone, nlb); + + return NVME_SUCCESS; +} + static uint16_t nvme_zone_mgmt_send(NvmeCtrl *n, NvmeRequest *req) { NvmeZoneSendCmd *cmd =3D (NvmeZoneSendCmd *)&req->cmd; @@ -3617,7 +3743,7 @@ static uint16_t nvme_zone_mgmt_send(NvmeCtrl *n, Nvme= Request *req) } =20 zone =3D &ns->zone_array[zone_idx]; - if (slba !=3D zone->d.zslba) { + if (slba !=3D zone->d.zslba && action !=3D NVME_ZONE_ACTION_ZRWA_FLUSH= ) { trace_pci_nvme_err_unaligned_zone_cmd(action, slba, zone->d.zslba); return NVME_INVALID_FIELD | NVME_DNR; } @@ -3693,6 +3819,13 @@ static uint16_t nvme_zone_mgmt_send(NvmeCtrl *n, Nvm= eRequest *req) } break; =20 + case NVME_ZONE_ACTION_ZRWA_FLUSH: + if (all) { + return NVME_INVALID_FIELD | NVME_DNR; + } + + return nvme_zone_mgmt_send_zrwa_flush(n, zone, slba, req); + default: trace_pci_nvme_err_invalid_mgmt_action(action); status =3D NVME_INVALID_FIELD; diff --git a/hw/nvme/ns.c b/hw/nvme/ns.c index 356b6c1c2f14..461e8ec5b879 100644 --- a/hw/nvme/ns.c +++ b/hw/nvme/ns.c @@ -275,6 +275,23 @@ static void nvme_ns_init_zoned(NvmeNamespace *ns) ns->params.zd_extension_size >> 6; /* Units of 64B */ } =20 + if (ns->params.zrwas) { + ns->zns.numzrwa =3D ns->params.numzrwa ? + ns->params.numzrwa : ns->num_zones; + + ns->zns.zrwas =3D ns->params.zrwas >> ns->lbaf.ds; + ns->zns.zrwafg =3D ns->params.zrwafg >> ns->lbaf.ds; + + id_ns_z->ozcs |=3D NVME_ID_NS_ZONED_OZCS_ZRWASUP; + id_ns_z->zrwacap =3D NVME_ID_NS_ZONED_ZRWACAP_EXPFLUSHSUP; + + id_ns_z->numzrwa =3D cpu_to_le32(ns->params.numzrwa); + id_ns_z->zrwas =3D cpu_to_le16(ns->zns.zrwas); + id_ns_z->zrwafg =3D cpu_to_le16(ns->zns.zrwafg); + } + + id_ns_z->ozcs =3D cpu_to_le16(id_ns_z->ozcs); + ns->csi =3D NVME_CSI_ZONED; ns->id_ns.nsze =3D cpu_to_le64(ns->num_zones * ns->zone_size); ns->id_ns.ncap =3D ns->id_ns.nsze; @@ -315,6 +332,10 @@ static void nvme_clear_zone(NvmeNamespace *ns, NvmeZon= e *zone) QTAILQ_INSERT_HEAD(&ns->closed_zones, zone, entry); } else { trace_pci_nvme_clear_ns_reset(state, zone->d.zslba); + if (zone->d.za & NVME_ZA_ZRWA_VALID) { + NVME_ZA_CLEAR(zone->d.za, NVME_ZA_ZRWA_VALID); + ns->zns.numzrwa++; + } nvme_set_zone_state(zone, NVME_ZONE_STATE_EMPTY); } } @@ -392,6 +413,40 @@ static int nvme_ns_check_constraints(NvmeNamespace *ns= , Error **errp) return -1; } } + + if (ns->params.zrwas) { + if (ns->params.zrwas % ns->blkconf.logical_block_size) { + error_setg(errp, "zone random write area size (zoned.zrwas= " + "%"PRIu64") must be a multiple of the logical " + "block size (logical_block_size %"PRIu32")", + ns->params.zrwas, ns->blkconf.logical_block_siz= e); + return -1; + } + + if (ns->params.zrwafg =3D=3D -1) { + ns->params.zrwafg =3D ns->blkconf.logical_block_size; + } + + if (ns->params.zrwas % ns->params.zrwafg) { + error_setg(errp, "zone random write area size (zoned.zrwas= " + "%"PRIu64") must be a multiple of the zone rand= om " + "write area flush granularity (zoned.zrwafg, " + "%"PRIu64")", ns->params.zrwas, ns->params.zrwa= fg); + return -1; + } + + if (ns->params.max_active_zones) { + if (ns->params.numzrwa > ns->params.max_active_zones) { + error_setg(errp, "number of zone random write area " + "resources (zoned.numzrwa, %d) must be less= " + "than or equal to maximum active resources " + "(zoned.max_active_zones, %d)", + ns->params.numzrwa, + ns->params.max_active_zones); + return -1; + } + } + } } =20 return 0; @@ -551,6 +606,9 @@ static Property nvme_ns_props[] =3D { params.max_open_zones, 0), DEFINE_PROP_UINT32("zoned.descr_ext_size", NvmeNamespace, params.zd_extension_size, 0), + DEFINE_PROP_UINT32("zoned.numzrwa", NvmeNamespace, params.numzrwa, 0), + DEFINE_PROP_SIZE("zoned.zrwas", NvmeNamespace, params.zrwas, 0), + DEFINE_PROP_SIZE("zoned.zrwafg", NvmeNamespace, params.zrwafg, -1), DEFINE_PROP_BOOL("eui64-default", NvmeNamespace, params.eui64_default, true), DEFINE_PROP_END_OF_LIST(), diff --git a/hw/nvme/nvme.h b/hw/nvme/nvme.h index 83ffabade4cf..fab2ead5fa44 100644 --- a/hw/nvme/nvme.h +++ b/hw/nvme/nvme.h @@ -114,6 +114,10 @@ typedef struct NvmeNamespaceParams { uint32_t max_active_zones; uint32_t max_open_zones; uint32_t zd_extension_size; + + uint32_t numzrwa; + uint64_t zrwas; + uint64_t zrwafg; } NvmeNamespaceParams; =20 typedef struct NvmeNamespace { @@ -130,6 +134,12 @@ typedef struct NvmeNamespace { uint16_t status; int attached; =20 + struct { + uint16_t zrwas; + uint16_t zrwafg; + uint32_t numzrwa; + } zns; + QTAILQ_ENTRY(NvmeNamespace) entry; =20 NvmeIdNsZoned *id_ns_zoned; diff --git a/hw/nvme/trace-events b/hw/nvme/trace-events index ff6cafd520df..90730d802fe3 100644 --- a/hw/nvme/trace-events +++ b/hw/nvme/trace-events @@ -103,6 +103,7 @@ pci_nvme_set_descriptor_extension(uint64_t slba, uint32= _t zone_idx) "set zone de pci_nvme_zd_extension_set(uint32_t zone_idx) "set descriptor extension for= zone_idx=3D%"PRIu32"" pci_nvme_clear_ns_close(uint32_t state, uint64_t slba) "zone state=3D%"PRI= u32", slba=3D%"PRIu64" transitioned to Closed state" pci_nvme_clear_ns_reset(uint32_t state, uint64_t slba) "zone state=3D%"PRI= u32", slba=3D%"PRIu64" transitioned to Empty state" +pci_nvme_zoned_zrwa_implicit_flush(uint64_t zslba, uint32_t nlb) "zslba 0x= %"PRIx64" nlb %"PRIu32"" =20 # error conditions pci_nvme_err_mdts(size_t len) "len %zu" diff --git a/include/block/nvme.h b/include/block/nvme.h index d33ff2c184cf..1a1d2b38ab13 100644 --- a/include/block/nvme.h +++ b/include/block/nvme.h @@ -890,6 +890,8 @@ enum NvmeStatusCodes { NVME_INVALID_PROT_INFO =3D 0x0181, NVME_WRITE_TO_RO =3D 0x0182, NVME_CMD_SIZE_LIMIT =3D 0x0183, + NVME_INVALID_ZONE_OP =3D 0x01b6, + NVME_NOZRWA =3D 0x01b7, NVME_ZONE_BOUNDARY_ERROR =3D 0x01b8, NVME_ZONE_FULL =3D 0x01b9, NVME_ZONE_READ_ONLY =3D 0x01ba, @@ -1345,7 +1347,12 @@ typedef struct QEMU_PACKED NvmeIdNsZoned { uint32_t mor; uint32_t rrl; uint32_t frl; - uint8_t rsvd20[2796]; + uint8_t rsvd12[24]; + uint32_t numzrwa; + uint16_t zrwafg; + uint16_t zrwas; + uint8_t zrwacap; + uint8_t rsvd53[2763]; NvmeLBAFE lbafe[16]; uint8_t rsvd3072[768]; uint8_t vs[256]; @@ -1353,6 +1360,11 @@ typedef struct QEMU_PACKED NvmeIdNsZoned { =20 enum NvmeIdNsZonedOzcs { NVME_ID_NS_ZONED_OZCS_RAZB =3D 1 << 0, + NVME_ID_NS_ZONED_OZCS_ZRWASUP =3D 1 << 1, +}; + +enum NvmeIdNsZonedZrwacap { + NVME_ID_NS_ZONED_ZRWACAP_EXPFLUSHSUP =3D 1 << 0, }; =20 /*Deallocate Logical Block Features*/ @@ -1408,6 +1420,7 @@ enum NvmeZoneAttr { NVME_ZA_FINISHED_BY_CTLR =3D 1 << 0, NVME_ZA_FINISH_RECOMMENDED =3D 1 << 1, NVME_ZA_RESET_RECOMMENDED =3D 1 << 2, + NVME_ZA_ZRWA_VALID =3D 1 << 3, NVME_ZA_ZD_EXT_VALID =3D 1 << 7, }; =20 @@ -1463,10 +1476,12 @@ enum NvmeZoneSendAction { NVME_ZONE_ACTION_RESET =3D 0x04, NVME_ZONE_ACTION_OFFLINE =3D 0x05, NVME_ZONE_ACTION_SET_ZD_EXT =3D 0x10, + NVME_ZONE_ACTION_ZRWA_FLUSH =3D 0x11, }; =20 enum { NVME_ZSFLAG_SELECT_ALL =3D 1 << 0, + NVME_ZSFLAG_ZRWA_ALLOC =3D 1 << 1, }; =20 typedef struct QEMU_PACKED NvmeZoneDescr { --=20 2.34.0