Re: [PATCH v11 08/13] block/nvme: Make ZNS-related definitions

2020-12-15 Thread Stefan Hajnoczi
On Wed, Dec 09, 2020 at 07:37:11AM +0100, Klaus Jensen wrote:
> CC for Stefan (nvme block driver co-maintainer).
> 
> On Dec  9 05:04, Dmitry Fomichev wrote:
> > 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= 0x05,
> >  NVME_CMD_WRITE_ZEROES   = 0x08,
> >  NVME_CMD_DSM= 0x09,
> > +NVME_CMD_ZONE_MGMT_SEND = 0x79,
> > +NVME_CMD_ZONE_MGMT_RECV = 0x7a,
> > +NVME_CMD_ZONE_APPEND= 0x7d,
> >  };
> >  
> >  typedef struct QEMU_PACKED NvmeDeleteQ {
> > @@ -648,9 +651,13 @@ typedef struct QEMU_PACKED NvmeAerResult {
> >  uint8_t resv;
> >  } NvmeAerResult;
> >  
> > +typedef struct QEMU_PACKED NvmeZonedResult {
> > +uint64_t slba;
> > +} NvmeZonedResult;
> > +
> >  typedef struct QEMU_PACKED NvmeCqe {
> >  uint32_tresult;
> > -uint32_trsvd;
> > +uint32_tdw1;
> >  uint16_tsq_head;
> >  uint16_tsq_id;
> >  uint16_tcid;
> > @@ -679,6 +686,7 @@ enum NvmeStatusCodes {
> >  NVME_INVALID_USE_OF_CMB = 0x0012,
> >  NVME_INVALID_PRP_OFFSET = 0x0013,
> >  NVME_CMD_SET_CMB_REJECTED   = 0x002b,
> > +NVME_INVALID_CMD_SET= 0x002c,
> >  NVME_LBA_RANGE  = 0x0080,
> >  NVME_CAP_EXCEEDED   = 0x0081,
> >  NVME_NS_NOT_READY   = 0x0082,
> > @@ -703,6 +711,14 @@ enum NvmeStatusCodes {
> >  NVME_CONFLICTING_ATTRS  = 0x0180,
> >  NVME_INVALID_PROT_INFO  = 0x0181,
> >  NVME_WRITE_TO_RO= 0x0182,
> > +NVME_ZONE_BOUNDARY_ERROR= 0x01b8,
> > +NVME_ZONE_FULL  = 0x01b9,
> > +NVME_ZONE_READ_ONLY = 0x01ba,
> > +NVME_ZONE_OFFLINE   = 0x01bb,
> > +NVME_ZONE_INVALID_WRITE = 0x01bc,
> > +NVME_ZONE_TOO_MANY_ACTIVE   = 0x01bd,
> > +NVME_ZONE_TOO_MANY_OPEN = 0x01be,
> > +NVME_ZONE_INVAL_TRANSITION  = 0x01bf,
> >  NVME_WRITE_FAULT= 0x0280,
> >  NVME_UNRECOVERED_READ   = 0x0281,
> >  NVME_E2E_GUARD_ERROR= 0x0282,
> > @@ -888,6 +904,11 @@ typedef struct QEMU_PACKED NvmeIdCtrl {
> >  uint8_t vs[1024];
> >  } NvmeIdCtrl;
> >  
> > +typedef struct NvmeIdCtrlZoned {
> > +uint8_t zasl;
> > +uint8_t rsvd1[4095];
> > +} NvmeIdCtrlZoned;
> > +
> >  enum NvmeIdCtrlOacs {
> >  NVME_OACS_SECURITY  = 1 << 0,
> >  NVME_OACS_FORMAT= 1 << 1,
> > @@ -1016,6 +1037,12 @@ typedef struct QEMU_PACKED NvmeLBAF {
> >  uint8_t rp;
> >  } NvmeLBAF;
> >  
> > +typedef struct QEMU_PACKED NvmeLBAFE {
> > +uint64_tzsze;
> > +uint8_t zdes;
> > +uint8_t rsvd9[7];
> > +} NvmeLBAFE;
> > +
> >  #define NVME_NSID_BROADCAST 0x
> >  
> >  typedef struct QEMU_PACKED NvmeIdNs {
> > @@ -1075,10 +1102,24 @@ enum NvmeNsIdentifierType {
> >  
> >  enum NvmeCsi {
> >  NVME_CSI_NVM= 0x00,
> > +NVME_CSI_ZONED  = 0x02,
> >  };
> >  
> >  #define NVME_SET_CSI(vec, csi) (vec |= (uint8_t)(1 << (csi)))
> >  
> > +typedef struct QEMU_PACKED NvmeIdNsZoned {
> > +uint16_tzoc;
> > +uint16_tozcs;
> > +uint32_tmar;
> > +uint32_tmor;
> > +uint32_trrl;
> > +uint32_tfrl;
> > +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)
> > @@ -,10 +1152,76 @@ enum NvmeIdNsDps {
> >  DPS_FIRST_EIGHT = 8,
> >  };
> >  
> > +enum NvmeZoneAttr {
> > +NVME_ZA_FINISHED_BY_CTLR = 1 << 0,
> > +NVME_ZA_FINISH_RECOMMENDED   = 1 << 1,
> > +NVME_ZA_RESET_RECOMMENDED= 1 << 2,
> > +NVME_ZA_ZD_EXT_VALID = 1 << 7,
> > +};
> > +
> > +typedef struct QEMU_PACKED NvmeZoneReportHeader {
> > +uint64_tnr_zones;
> > +uint8_t rsvd[56];
> > +} NvmeZoneReportHeader;
> > +
> > +enum NvmeZoneReceiveAction {
> > +NVME_ZONE_REPORT = 0,
> > +NVME_ZONE_REPORT_EXTENDED= 1,
> > +};
> > +
> > +enum NvmeZoneReportType {
> > +NVME_ZONE_REPORT_ALL = 0,
> > +NVME_ZONE_REPORT_EMPTY   = 1,
> > +NVME_ZONE_REPORT_IMPLICITLY_OPEN = 2,
> > +NVME_ZONE_REPORT_EXPLICITLY_OPEN = 3,
> > +NVME_ZONE_REPORT_CLOSED  = 4,
> > +NVME_ZONE_REPORT_FULL= 5,
> > +NVME_ZONE_REPOR

Re: [PATCH v11 08/13] block/nvme: Make ZNS-related definitions

2020-12-08 Thread Klaus Jensen
CC for Stefan (nvme block driver co-maintainer).

On Dec  9 05:04, Dmitry Fomichev wrote:
> 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= 0x05,
>  NVME_CMD_WRITE_ZEROES   = 0x08,
>  NVME_CMD_DSM= 0x09,
> +NVME_CMD_ZONE_MGMT_SEND = 0x79,
> +NVME_CMD_ZONE_MGMT_RECV = 0x7a,
> +NVME_CMD_ZONE_APPEND= 0x7d,
>  };
>  
>  typedef struct QEMU_PACKED NvmeDeleteQ {
> @@ -648,9 +651,13 @@ typedef struct QEMU_PACKED NvmeAerResult {
>  uint8_t resv;
>  } NvmeAerResult;
>  
> +typedef struct QEMU_PACKED NvmeZonedResult {
> +uint64_t slba;
> +} NvmeZonedResult;
> +
>  typedef struct QEMU_PACKED NvmeCqe {
>  uint32_tresult;
> -uint32_trsvd;
> +uint32_tdw1;
>  uint16_tsq_head;
>  uint16_tsq_id;
>  uint16_tcid;
> @@ -679,6 +686,7 @@ enum NvmeStatusCodes {
>  NVME_INVALID_USE_OF_CMB = 0x0012,
>  NVME_INVALID_PRP_OFFSET = 0x0013,
>  NVME_CMD_SET_CMB_REJECTED   = 0x002b,
> +NVME_INVALID_CMD_SET= 0x002c,
>  NVME_LBA_RANGE  = 0x0080,
>  NVME_CAP_EXCEEDED   = 0x0081,
>  NVME_NS_NOT_READY   = 0x0082,
> @@ -703,6 +711,14 @@ enum NvmeStatusCodes {
>  NVME_CONFLICTING_ATTRS  = 0x0180,
>  NVME_INVALID_PROT_INFO  = 0x0181,
>  NVME_WRITE_TO_RO= 0x0182,
> +NVME_ZONE_BOUNDARY_ERROR= 0x01b8,
> +NVME_ZONE_FULL  = 0x01b9,
> +NVME_ZONE_READ_ONLY = 0x01ba,
> +NVME_ZONE_OFFLINE   = 0x01bb,
> +NVME_ZONE_INVALID_WRITE = 0x01bc,
> +NVME_ZONE_TOO_MANY_ACTIVE   = 0x01bd,
> +NVME_ZONE_TOO_MANY_OPEN = 0x01be,
> +NVME_ZONE_INVAL_TRANSITION  = 0x01bf,
>  NVME_WRITE_FAULT= 0x0280,
>  NVME_UNRECOVERED_READ   = 0x0281,
>  NVME_E2E_GUARD_ERROR= 0x0282,
> @@ -888,6 +904,11 @@ typedef struct QEMU_PACKED NvmeIdCtrl {
>  uint8_t vs[1024];
>  } NvmeIdCtrl;
>  
> +typedef struct NvmeIdCtrlZoned {
> +uint8_t zasl;
> +uint8_t rsvd1[4095];
> +} NvmeIdCtrlZoned;
> +
>  enum NvmeIdCtrlOacs {
>  NVME_OACS_SECURITY  = 1 << 0,
>  NVME_OACS_FORMAT= 1 << 1,
> @@ -1016,6 +1037,12 @@ typedef struct QEMU_PACKED NvmeLBAF {
>  uint8_t rp;
>  } NvmeLBAF;
>  
> +typedef struct QEMU_PACKED NvmeLBAFE {
> +uint64_tzsze;
> +uint8_t zdes;
> +uint8_t rsvd9[7];
> +} NvmeLBAFE;
> +
>  #define NVME_NSID_BROADCAST 0x
>  
>  typedef struct QEMU_PACKED NvmeIdNs {
> @@ -1075,10 +1102,24 @@ enum NvmeNsIdentifierType {
>  
>  enum NvmeCsi {
>  NVME_CSI_NVM= 0x00,
> +NVME_CSI_ZONED  = 0x02,
>  };
>  
>  #define NVME_SET_CSI(vec, csi) (vec |= (uint8_t)(1 << (csi)))
>  
> +typedef struct QEMU_PACKED NvmeIdNsZoned {
> +uint16_tzoc;
> +uint16_tozcs;
> +uint32_tmar;
> +uint32_tmor;
> +uint32_trrl;
> +uint32_tfrl;
> +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)
> @@ -,10 +1152,76 @@ enum NvmeIdNsDps {
>  DPS_FIRST_EIGHT = 8,
>  };
>  
> +enum NvmeZoneAttr {
> +NVME_ZA_FINISHED_BY_CTLR = 1 << 0,
> +NVME_ZA_FINISH_RECOMMENDED   = 1 << 1,
> +NVME_ZA_RESET_RECOMMENDED= 1 << 2,
> +NVME_ZA_ZD_EXT_VALID = 1 << 7,
> +};
> +
> +typedef struct QEMU_PACKED NvmeZoneReportHeader {
> +uint64_tnr_zones;
> +uint8_t rsvd[56];
> +} NvmeZoneReportHeader;
> +
> +enum NvmeZoneReceiveAction {
> +NVME_ZONE_REPORT = 0,
> +NVME_ZONE_REPORT_EXTENDED= 1,
> +};
> +
> +enum NvmeZoneReportType {
> +NVME_ZONE_REPORT_ALL = 0,
> +NVME_ZONE_REPORT_EMPTY   = 1,
> +NVME_ZONE_REPORT_IMPLICITLY_OPEN = 2,
> +NVME_ZONE_REPORT_EXPLICITLY_OPEN = 3,
> +NVME_ZONE_REPORT_CLOSED  = 4,
> +NVME_ZONE_REPORT_FULL= 5,
> +NVME_ZONE_REPORT_READ_ONLY   = 6,
> +NVME_ZONE_REPORT_OFFLINE = 7,
> +};
> +
> +enum NvmeZoneType {
> +NVME_ZONE_TYPE_RESERVED  = 0x00,
> +NVME_ZONE_TYPE_SEQ_WRITE = 0x02,
> +};
> +
> +enum NvmeZoneSendAction {
> +NVME_ZONE_ACTION_RSD = 0x00,
> +NVME_ZONE_ACTION_CLOSE   = 0x01,
> +NVME_ZO

[PATCH v11 08/13] block/nvme: Make ZNS-related definitions

2020-12-08 Thread Dmitry Fomichev
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= 0x05,
 NVME_CMD_WRITE_ZEROES   = 0x08,
 NVME_CMD_DSM= 0x09,
+NVME_CMD_ZONE_MGMT_SEND = 0x79,
+NVME_CMD_ZONE_MGMT_RECV = 0x7a,
+NVME_CMD_ZONE_APPEND= 0x7d,
 };
 
 typedef struct QEMU_PACKED NvmeDeleteQ {
@@ -648,9 +651,13 @@ typedef struct QEMU_PACKED NvmeAerResult {
 uint8_t resv;
 } NvmeAerResult;
 
+typedef struct QEMU_PACKED NvmeZonedResult {
+uint64_t slba;
+} NvmeZonedResult;
+
 typedef struct QEMU_PACKED NvmeCqe {
 uint32_tresult;
-uint32_trsvd;
+uint32_tdw1;
 uint16_tsq_head;
 uint16_tsq_id;
 uint16_tcid;
@@ -679,6 +686,7 @@ enum NvmeStatusCodes {
 NVME_INVALID_USE_OF_CMB = 0x0012,
 NVME_INVALID_PRP_OFFSET = 0x0013,
 NVME_CMD_SET_CMB_REJECTED   = 0x002b,
+NVME_INVALID_CMD_SET= 0x002c,
 NVME_LBA_RANGE  = 0x0080,
 NVME_CAP_EXCEEDED   = 0x0081,
 NVME_NS_NOT_READY   = 0x0082,
@@ -703,6 +711,14 @@ enum NvmeStatusCodes {
 NVME_CONFLICTING_ATTRS  = 0x0180,
 NVME_INVALID_PROT_INFO  = 0x0181,
 NVME_WRITE_TO_RO= 0x0182,
+NVME_ZONE_BOUNDARY_ERROR= 0x01b8,
+NVME_ZONE_FULL  = 0x01b9,
+NVME_ZONE_READ_ONLY = 0x01ba,
+NVME_ZONE_OFFLINE   = 0x01bb,
+NVME_ZONE_INVALID_WRITE = 0x01bc,
+NVME_ZONE_TOO_MANY_ACTIVE   = 0x01bd,
+NVME_ZONE_TOO_MANY_OPEN = 0x01be,
+NVME_ZONE_INVAL_TRANSITION  = 0x01bf,
 NVME_WRITE_FAULT= 0x0280,
 NVME_UNRECOVERED_READ   = 0x0281,
 NVME_E2E_GUARD_ERROR= 0x0282,
@@ -888,6 +904,11 @@ typedef struct QEMU_PACKED NvmeIdCtrl {
 uint8_t vs[1024];
 } NvmeIdCtrl;
 
+typedef struct NvmeIdCtrlZoned {
+uint8_t zasl;
+uint8_t rsvd1[4095];
+} NvmeIdCtrlZoned;
+
 enum NvmeIdCtrlOacs {
 NVME_OACS_SECURITY  = 1 << 0,
 NVME_OACS_FORMAT= 1 << 1,
@@ -1016,6 +1037,12 @@ typedef struct QEMU_PACKED NvmeLBAF {
 uint8_t rp;
 } NvmeLBAF;
 
+typedef struct QEMU_PACKED NvmeLBAFE {
+uint64_tzsze;
+uint8_t zdes;
+uint8_t rsvd9[7];
+} NvmeLBAFE;
+
 #define NVME_NSID_BROADCAST 0x
 
 typedef struct QEMU_PACKED NvmeIdNs {
@@ -1075,10 +1102,24 @@ enum NvmeNsIdentifierType {
 
 enum NvmeCsi {
 NVME_CSI_NVM= 0x00,
+NVME_CSI_ZONED  = 0x02,
 };
 
 #define NVME_SET_CSI(vec, csi) (vec |= (uint8_t)(1 << (csi)))
 
+typedef struct QEMU_PACKED NvmeIdNsZoned {
+uint16_tzoc;
+uint16_tozcs;
+uint32_tmar;
+uint32_tmor;
+uint32_trrl;
+uint32_tfrl;
+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)
@@ -,10 +1152,76 @@ enum NvmeIdNsDps {
 DPS_FIRST_EIGHT = 8,
 };
 
+enum NvmeZoneAttr {
+NVME_ZA_FINISHED_BY_CTLR = 1 << 0,
+NVME_ZA_FINISH_RECOMMENDED   = 1 << 1,
+NVME_ZA_RESET_RECOMMENDED= 1 << 2,
+NVME_ZA_ZD_EXT_VALID = 1 << 7,
+};
+
+typedef struct QEMU_PACKED NvmeZoneReportHeader {
+uint64_tnr_zones;
+uint8_t rsvd[56];
+} NvmeZoneReportHeader;
+
+enum NvmeZoneReceiveAction {
+NVME_ZONE_REPORT = 0,
+NVME_ZONE_REPORT_EXTENDED= 1,
+};
+
+enum NvmeZoneReportType {
+NVME_ZONE_REPORT_ALL = 0,
+NVME_ZONE_REPORT_EMPTY   = 1,
+NVME_ZONE_REPORT_IMPLICITLY_OPEN = 2,
+NVME_ZONE_REPORT_EXPLICITLY_OPEN = 3,
+NVME_ZONE_REPORT_CLOSED  = 4,
+NVME_ZONE_REPORT_FULL= 5,
+NVME_ZONE_REPORT_READ_ONLY   = 6,
+NVME_ZONE_REPORT_OFFLINE = 7,
+};
+
+enum NvmeZoneType {
+NVME_ZONE_TYPE_RESERVED  = 0x00,
+NVME_ZONE_TYPE_SEQ_WRITE = 0x02,
+};
+
+enum NvmeZoneSendAction {
+NVME_ZONE_ACTION_RSD = 0x00,
+NVME_ZONE_ACTION_CLOSE   = 0x01,
+NVME_ZONE_ACTION_FINISH  = 0x02,
+NVME_ZONE_ACTION_OPEN= 0x03,
+NVME_ZONE_ACTION_RESET   = 0x04,
+NVME_ZONE_ACTION_OFFLINE = 0x05,
+NVME_ZONE_ACTION_SET_ZD_EXT  = 0x10,
+};
+
+typedef struct QEMU_PACKED NvmeZoneDescr {
+uint8_t zt;
+uint8_t zs;
+uint8_t za;
+uint8_t rsvd3[5];
+uint64_tzcap;
+uint64