From nobody Mon Feb 9 12:15:06 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail header.i=@wdc.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; dmarc=fail(p=none dis=none) header.from=wdc.com ARC-Seal: i=1; a=rsa-sha256; t=1607462794; cv=none; d=zohomail.com; s=zohoarc; b=Apn/TIFCHTc4k38zydW41tsg39rRzi4zBMpr5DgeLtOAGjiZfees7fThUfWn7ebdD91JN9eailUJcvHK4mCQYSLMI1EnpkcsnrURTKWXKWxH4fyp6rKfK6TwZT1QcmxX2YCsYjjIrvbFt4F5pfWNkdjjdy459vpzX/Ch/ssRMUo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1607462794; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=0V9Y7DavBKQm1yWNBZwgRemf9TJCaHF0jPjwHg9CEcc=; b=j5Vrq8f49mno5dTWMqS0llN2ZEWrMBUuZhvwGHBcnFxDpceEu1pLSsl69zs/4uiCVH+wqjL9GG38bQzWGojPJyRhvzmVfLTXzOk3fdlfr++z7PPHPc9LaDC4eFX9Xo6LeuT/M+PS73g/b1iqMxIzt+46+8Xj1orEeGSpJXJr/pU= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail header.i=@wdc.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; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1607462794691488.69169593644506; Tue, 8 Dec 2020 13:26:34 -0800 (PST) Received: from localhost ([::1]:36792 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kmkDm-000380-W4 for importer@patchew.org; Tue, 08 Dec 2020 16:08:31 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:56290) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kmjE0-0002Sg-19; Tue, 08 Dec 2020 15:04:41 -0500 Received: from esa2.hgst.iphmx.com ([68.232.143.124]:42903) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kmjDw-00062i-V3; Tue, 08 Dec 2020 15:04:39 -0500 Received: from h199-255-45-15.hgst.com (HELO uls-op-cesaep02.wdc.com) ([199.255.45.15]) by ob1.hgst.iphmx.com with ESMTP; 09 Dec 2020 04:20:44 +0800 Received: from uls-op-cesaip02.wdc.com ([10.248.3.37]) by uls-op-cesaep02.wdc.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 08 Dec 2020 11:48:32 -0800 Received: from unknown (HELO redsun50.ssa.fujisawa.hgst.com) ([10.149.66.24]) by uls-op-cesaip02.wdc.com with ESMTP; 08 Dec 2020 12:04:31 -0800 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=wdc.com; i=@wdc.com; q=dns/txt; s=dkim.wdc.com; t=1607458851; x=1638994851; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=yECLRmoQrfOVSBLC5ZL4ZWs46Z8eo1EYdx7ccsy96A4=; b=EG3Nvwr/0Ck4kWcs39NTKpSuqn9lkcjg53hahG045qGyPGBLidLZGxXX nYKehrJkqFvt9grFVIi6CfLnpowlL/fMYCq2iwkSVyhGf4w0P7/ji0tuO uI2a+5avyBxcNaLip+eZpTZ946CwrzHz/Dg4aIAU7PDGpZr60VcMqHzh2 4dyhHsyIt6tPeYLdjwXaS38IMhqnZRjjbZbwxlnIDTqWjSnfNlrxjlmyZ qLU8gX5irrQJtUKZOnK6E3Cj2c/EEuAxd8RtcOcWnIfmyO48TNeS/km9b a8wjy7xTZ+y2zU+kBAtp/68HqRe5TqvOHguWLe6RjM5BobD4hs3+SgX4k g==; IronPort-SDR: AcSalXwo8tkjAF60hDqLOjMr1FtTIKkLWWirN7ZI+6ysbgs7mNVGmaYcCTPtP1t5Ok9AX44vBS pHuhGZjY6jO/bmvptoNro3DMhZK4IwAa8NumVLTGGhHyXVT2icTQXc2wVB2lOrRaJbuxv3rxlq yBgMmASYOf9y7GT1+btMrsXopiYgFQ589UA4oeCx8hO0QdPBu0T0kmCm7VNu1EI5/ztiyp+ups cRPwdBVY9KY0ADwCLANTBdM7EUFDVAtU9yLcU/6hOuqcAFxsSG0K/n2+nxyl2FHz9IG92OEBOW LRE= X-IronPort-AV: E=Sophos;i="5.78,403,1599494400"; d="scan'208";a="258433462" IronPort-SDR: dIblBzoSG9i+Ou1UxeYIsyYktME3NlHgGeujd+Ly3lKhgwdfI3qx79O1+iFVx7fTFo+HQ9AgGk HKHmq/JdQFkPXzTDhoRuTuzau0R5e5beA= IronPort-SDR: 6DSh740VjKYsHfiaW7Dm1OmdOB+VD5FFWExEaqVVVUQIDSOurAAcm8e50khweVFZIant2ISBb4 oPuzomyR8uOA== WDCIronportException: Internal From: Dmitry Fomichev To: Keith Busch , Klaus Jensen , Kevin Wolf , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Max Reitz , Maxim Levitsky , Fam Zheng Subject: [PATCH v11 08/13] block/nvme: Make ZNS-related definitions Date: Wed, 9 Dec 2020 05:04:05 +0900 Message-Id: <20201208200410.27900-9-dmitry.fomichev@wdc.com> X-Mailer: git-send-email 2.28.0 In-Reply-To: <20201208200410.27900-1-dmitry.fomichev@wdc.com> References: <20201208200410.27900-1-dmitry.fomichev@wdc.com> 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=68.232.143.124; envelope-from=prvs=604abd949=dmitry.fomichev@wdc.com; helo=esa2.hgst.iphmx.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 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_NONE=-0.0001, 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.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Niklas Cassel , Damien Le Moal , qemu-block@nongnu.org, Dmitry Fomichev , qemu-devel@nongnu.org, Alistair Francis , Matias Bjorling Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" Define values and structures that are needed to support Zoned Namespace Command Set (NVMe TP 4053). Signed-off-by: Dmitry Fomichev --- include/block/nvme.h | 114 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 113 insertions(+), 1 deletion(-) diff --git a/include/block/nvme.h b/include/block/nvme.h index 29d826ab19..a9165402d6 100644 --- a/include/block/nvme.h +++ b/include/block/nvme.h @@ -489,6 +489,9 @@ enum NvmeIoCommands { NVME_CMD_COMPARE =3D 0x05, NVME_CMD_WRITE_ZEROES =3D 0x08, NVME_CMD_DSM =3D 0x09, + NVME_CMD_ZONE_MGMT_SEND =3D 0x79, + NVME_CMD_ZONE_MGMT_RECV =3D 0x7a, + NVME_CMD_ZONE_APPEND =3D 0x7d, }; =20 typedef struct QEMU_PACKED NvmeDeleteQ { @@ -648,9 +651,13 @@ typedef struct QEMU_PACKED NvmeAerResult { uint8_t resv; } NvmeAerResult; =20 +typedef struct QEMU_PACKED NvmeZonedResult { + uint64_t slba; +} NvmeZonedResult; + typedef struct QEMU_PACKED NvmeCqe { uint32_t result; - uint32_t rsvd; + uint32_t dw1; uint16_t sq_head; uint16_t sq_id; uint16_t cid; @@ -679,6 +686,7 @@ enum NvmeStatusCodes { NVME_INVALID_USE_OF_CMB =3D 0x0012, NVME_INVALID_PRP_OFFSET =3D 0x0013, NVME_CMD_SET_CMB_REJECTED =3D 0x002b, + NVME_INVALID_CMD_SET =3D 0x002c, NVME_LBA_RANGE =3D 0x0080, NVME_CAP_EXCEEDED =3D 0x0081, NVME_NS_NOT_READY =3D 0x0082, @@ -703,6 +711,14 @@ enum NvmeStatusCodes { NVME_CONFLICTING_ATTRS =3D 0x0180, NVME_INVALID_PROT_INFO =3D 0x0181, NVME_WRITE_TO_RO =3D 0x0182, + NVME_ZONE_BOUNDARY_ERROR =3D 0x01b8, + NVME_ZONE_FULL =3D 0x01b9, + NVME_ZONE_READ_ONLY =3D 0x01ba, + NVME_ZONE_OFFLINE =3D 0x01bb, + NVME_ZONE_INVALID_WRITE =3D 0x01bc, + NVME_ZONE_TOO_MANY_ACTIVE =3D 0x01bd, + NVME_ZONE_TOO_MANY_OPEN =3D 0x01be, + NVME_ZONE_INVAL_TRANSITION =3D 0x01bf, NVME_WRITE_FAULT =3D 0x0280, NVME_UNRECOVERED_READ =3D 0x0281, NVME_E2E_GUARD_ERROR =3D 0x0282, @@ -888,6 +904,11 @@ typedef struct QEMU_PACKED NvmeIdCtrl { uint8_t vs[1024]; } NvmeIdCtrl; =20 +typedef struct NvmeIdCtrlZoned { + uint8_t zasl; + uint8_t rsvd1[4095]; +} NvmeIdCtrlZoned; + enum NvmeIdCtrlOacs { NVME_OACS_SECURITY =3D 1 << 0, NVME_OACS_FORMAT =3D 1 << 1, @@ -1016,6 +1037,12 @@ typedef struct QEMU_PACKED NvmeLBAF { uint8_t rp; } NvmeLBAF; =20 +typedef struct QEMU_PACKED NvmeLBAFE { + uint64_t zsze; + uint8_t zdes; + uint8_t rsvd9[7]; +} NvmeLBAFE; + #define NVME_NSID_BROADCAST 0xffffffff =20 typedef struct QEMU_PACKED NvmeIdNs { @@ -1075,10 +1102,24 @@ enum NvmeNsIdentifierType { =20 enum NvmeCsi { NVME_CSI_NVM =3D 0x00, + NVME_CSI_ZONED =3D 0x02, }; =20 #define NVME_SET_CSI(vec, csi) (vec |=3D (uint8_t)(1 << (csi))) =20 +typedef struct QEMU_PACKED NvmeIdNsZoned { + uint16_t zoc; + uint16_t ozcs; + uint32_t mar; + uint32_t mor; + uint32_t rrl; + uint32_t frl; + uint8_t rsvd20[2796]; + NvmeLBAFE lbafe[16]; + uint8_t rsvd3072[768]; + uint8_t vs[256]; +} NvmeIdNsZoned; + /*Deallocate Logical Block Features*/ #define NVME_ID_NS_DLFEAT_GUARD_CRC(dlfeat) ((dlfeat) & 0x10) #define NVME_ID_NS_DLFEAT_WRITE_ZEROES(dlfeat) ((dlfeat) & 0x08) @@ -1111,10 +1152,76 @@ enum NvmeIdNsDps { DPS_FIRST_EIGHT =3D 8, }; =20 +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_ZD_EXT_VALID =3D 1 << 7, +}; + +typedef struct QEMU_PACKED NvmeZoneReportHeader { + uint64_t nr_zones; + uint8_t rsvd[56]; +} NvmeZoneReportHeader; + +enum NvmeZoneReceiveAction { + NVME_ZONE_REPORT =3D 0, + NVME_ZONE_REPORT_EXTENDED =3D 1, +}; + +enum NvmeZoneReportType { + NVME_ZONE_REPORT_ALL =3D 0, + NVME_ZONE_REPORT_EMPTY =3D 1, + NVME_ZONE_REPORT_IMPLICITLY_OPEN =3D 2, + NVME_ZONE_REPORT_EXPLICITLY_OPEN =3D 3, + NVME_ZONE_REPORT_CLOSED =3D 4, + NVME_ZONE_REPORT_FULL =3D 5, + NVME_ZONE_REPORT_READ_ONLY =3D 6, + NVME_ZONE_REPORT_OFFLINE =3D 7, +}; + +enum NvmeZoneType { + NVME_ZONE_TYPE_RESERVED =3D 0x00, + NVME_ZONE_TYPE_SEQ_WRITE =3D 0x02, +}; + +enum NvmeZoneSendAction { + NVME_ZONE_ACTION_RSD =3D 0x00, + NVME_ZONE_ACTION_CLOSE =3D 0x01, + NVME_ZONE_ACTION_FINISH =3D 0x02, + NVME_ZONE_ACTION_OPEN =3D 0x03, + NVME_ZONE_ACTION_RESET =3D 0x04, + NVME_ZONE_ACTION_OFFLINE =3D 0x05, + NVME_ZONE_ACTION_SET_ZD_EXT =3D 0x10, +}; + +typedef struct QEMU_PACKED NvmeZoneDescr { + uint8_t zt; + uint8_t zs; + uint8_t za; + uint8_t rsvd3[5]; + uint64_t zcap; + uint64_t zslba; + uint64_t wp; + uint8_t rsvd32[32]; +} NvmeZoneDescr; + +enum NvmeZoneState { + NVME_ZONE_STATE_RESERVED =3D 0x00, + NVME_ZONE_STATE_EMPTY =3D 0x01, + NVME_ZONE_STATE_IMPLICITLY_OPEN =3D 0x02, + NVME_ZONE_STATE_EXPLICITLY_OPEN =3D 0x03, + NVME_ZONE_STATE_CLOSED =3D 0x04, + NVME_ZONE_STATE_READ_ONLY =3D 0x0D, + NVME_ZONE_STATE_FULL =3D 0x0E, + NVME_ZONE_STATE_OFFLINE =3D 0x0F, +}; + static inline void _nvme_check_size(void) { QEMU_BUILD_BUG_ON(sizeof(NvmeBar) !=3D 4096); QEMU_BUILD_BUG_ON(sizeof(NvmeAerResult) !=3D 4); + QEMU_BUILD_BUG_ON(sizeof(NvmeZonedResult) !=3D 8); QEMU_BUILD_BUG_ON(sizeof(NvmeCqe) !=3D 16); QEMU_BUILD_BUG_ON(sizeof(NvmeDsmRange) !=3D 16); QEMU_BUILD_BUG_ON(sizeof(NvmeCmd) !=3D 64); @@ -1130,8 +1237,13 @@ static inline void _nvme_check_size(void) QEMU_BUILD_BUG_ON(sizeof(NvmeSmartLog) !=3D 512); QEMU_BUILD_BUG_ON(sizeof(NvmeEffectsLog) !=3D 4096); QEMU_BUILD_BUG_ON(sizeof(NvmeIdCtrl) !=3D 4096); + QEMU_BUILD_BUG_ON(sizeof(NvmeIdCtrlZoned) !=3D 4096); + QEMU_BUILD_BUG_ON(sizeof(NvmeLBAF) !=3D 4); + QEMU_BUILD_BUG_ON(sizeof(NvmeLBAFE) !=3D 16); QEMU_BUILD_BUG_ON(sizeof(NvmeIdNs) !=3D 4096); + QEMU_BUILD_BUG_ON(sizeof(NvmeIdNsZoned) !=3D 4096); QEMU_BUILD_BUG_ON(sizeof(NvmeSglDescriptor) !=3D 16); QEMU_BUILD_BUG_ON(sizeof(NvmeIdNsDescr) !=3D 4); + QEMU_BUILD_BUG_ON(sizeof(NvmeZoneDescr) !=3D 64); } #endif --=20 2.28.0