Define values and structures that are needed to support Zoned
Namespace Command Set (NVMe TP 4053).
Signed-off-by: Dmitry Fomichev <dmitry.fomichev@wdc.com>
---
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_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 = 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_t zsze;
+ uint8_t zdes;
+ uint8_t rsvd9[7];
+} NvmeLBAFE;
+
#define NVME_NSID_BROADCAST 0xffffffff
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_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 = 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_t nr_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_t zcap;
+ uint64_t zslba;
+ uint64_t wp;
+ uint8_t rsvd32[32];
+} NvmeZoneDescr;
+
+enum NvmeZoneState {
+ NVME_ZONE_STATE_RESERVED = 0x00,
+ NVME_ZONE_STATE_EMPTY = 0x01,
+ NVME_ZONE_STATE_IMPLICITLY_OPEN = 0x02,
+ NVME_ZONE_STATE_EXPLICITLY_OPEN = 0x03,
+ NVME_ZONE_STATE_CLOSED = 0x04,
+ NVME_ZONE_STATE_READ_ONLY = 0x0D,
+ NVME_ZONE_STATE_FULL = 0x0E,
+ NVME_ZONE_STATE_OFFLINE = 0x0F,
+};
+
static inline void _nvme_check_size(void)
{
QEMU_BUILD_BUG_ON(sizeof(NvmeBar) != 4096);
QEMU_BUILD_BUG_ON(sizeof(NvmeAerResult) != 4);
+ QEMU_BUILD_BUG_ON(sizeof(NvmeZonedResult) != 8);
QEMU_BUILD_BUG_ON(sizeof(NvmeCqe) != 16);
QEMU_BUILD_BUG_ON(sizeof(NvmeDsmRange) != 16);
QEMU_BUILD_BUG_ON(sizeof(NvmeCmd) != 64);
@@ -1130,8 +1237,13 @@ static inline void _nvme_check_size(void)
QEMU_BUILD_BUG_ON(sizeof(NvmeSmartLog) != 512);
QEMU_BUILD_BUG_ON(sizeof(NvmeEffectsLog) != 4096);
QEMU_BUILD_BUG_ON(sizeof(NvmeIdCtrl) != 4096);
+ QEMU_BUILD_BUG_ON(sizeof(NvmeIdCtrlZoned) != 4096);
+ QEMU_BUILD_BUG_ON(sizeof(NvmeLBAF) != 4);
+ QEMU_BUILD_BUG_ON(sizeof(NvmeLBAFE) != 16);
QEMU_BUILD_BUG_ON(sizeof(NvmeIdNs) != 4096);
+ QEMU_BUILD_BUG_ON(sizeof(NvmeIdNsZoned) != 4096);
QEMU_BUILD_BUG_ON(sizeof(NvmeSglDescriptor) != 16);
QEMU_BUILD_BUG_ON(sizeof(NvmeIdNsDescr) != 4);
+ QEMU_BUILD_BUG_ON(sizeof(NvmeZoneDescr) != 64);
}
#endif
--
2.28.0
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 <dmitry.fomichev@wdc.com>
> ---
> 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_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 = 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_t zsze;
> + uint8_t zdes;
> + uint8_t rsvd9[7];
> +} NvmeLBAFE;
> +
> #define NVME_NSID_BROADCAST 0xffffffff
>
> 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_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 = 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_t nr_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_t zcap;
> + uint64_t zslba;
> + uint64_t wp;
> + uint8_t rsvd32[32];
> +} NvmeZoneDescr;
> +
> +enum NvmeZoneState {
> + NVME_ZONE_STATE_RESERVED = 0x00,
> + NVME_ZONE_STATE_EMPTY = 0x01,
> + NVME_ZONE_STATE_IMPLICITLY_OPEN = 0x02,
> + NVME_ZONE_STATE_EXPLICITLY_OPEN = 0x03,
> + NVME_ZONE_STATE_CLOSED = 0x04,
> + NVME_ZONE_STATE_READ_ONLY = 0x0D,
> + NVME_ZONE_STATE_FULL = 0x0E,
> + NVME_ZONE_STATE_OFFLINE = 0x0F,
> +};
> +
> static inline void _nvme_check_size(void)
> {
> QEMU_BUILD_BUG_ON(sizeof(NvmeBar) != 4096);
> QEMU_BUILD_BUG_ON(sizeof(NvmeAerResult) != 4);
> + QEMU_BUILD_BUG_ON(sizeof(NvmeZonedResult) != 8);
> QEMU_BUILD_BUG_ON(sizeof(NvmeCqe) != 16);
> QEMU_BUILD_BUG_ON(sizeof(NvmeDsmRange) != 16);
> QEMU_BUILD_BUG_ON(sizeof(NvmeCmd) != 64);
> @@ -1130,8 +1237,13 @@ static inline void _nvme_check_size(void)
> QEMU_BUILD_BUG_ON(sizeof(NvmeSmartLog) != 512);
> QEMU_BUILD_BUG_ON(sizeof(NvmeEffectsLog) != 4096);
> QEMU_BUILD_BUG_ON(sizeof(NvmeIdCtrl) != 4096);
> + QEMU_BUILD_BUG_ON(sizeof(NvmeIdCtrlZoned) != 4096);
> + QEMU_BUILD_BUG_ON(sizeof(NvmeLBAF) != 4);
> + QEMU_BUILD_BUG_ON(sizeof(NvmeLBAFE) != 16);
> QEMU_BUILD_BUG_ON(sizeof(NvmeIdNs) != 4096);
> + QEMU_BUILD_BUG_ON(sizeof(NvmeIdNsZoned) != 4096);
> QEMU_BUILD_BUG_ON(sizeof(NvmeSglDescriptor) != 16);
> QEMU_BUILD_BUG_ON(sizeof(NvmeIdNsDescr) != 4);
> + QEMU_BUILD_BUG_ON(sizeof(NvmeZoneDescr) != 64);
> }
> #endif
> --
> 2.28.0
>
>
--
One of us - No more doubt, silence or taboo about mental illness.
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 <dmitry.fomichev@wdc.com>
> > ---
> > 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_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 = 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_t zsze;
> > + uint8_t zdes;
> > + uint8_t rsvd9[7];
> > +} NvmeLBAFE;
> > +
> > #define NVME_NSID_BROADCAST 0xffffffff
> >
> > 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_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 = 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_t nr_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_t zcap;
> > + uint64_t zslba;
> > + uint64_t wp;
> > + uint8_t rsvd32[32];
> > +} NvmeZoneDescr;
> > +
> > +enum NvmeZoneState {
> > + NVME_ZONE_STATE_RESERVED = 0x00,
> > + NVME_ZONE_STATE_EMPTY = 0x01,
> > + NVME_ZONE_STATE_IMPLICITLY_OPEN = 0x02,
> > + NVME_ZONE_STATE_EXPLICITLY_OPEN = 0x03,
> > + NVME_ZONE_STATE_CLOSED = 0x04,
> > + NVME_ZONE_STATE_READ_ONLY = 0x0D,
> > + NVME_ZONE_STATE_FULL = 0x0E,
> > + NVME_ZONE_STATE_OFFLINE = 0x0F,
> > +};
> > +
> > static inline void _nvme_check_size(void)
> > {
> > QEMU_BUILD_BUG_ON(sizeof(NvmeBar) != 4096);
> > QEMU_BUILD_BUG_ON(sizeof(NvmeAerResult) != 4);
> > + QEMU_BUILD_BUG_ON(sizeof(NvmeZonedResult) != 8);
> > QEMU_BUILD_BUG_ON(sizeof(NvmeCqe) != 16);
> > QEMU_BUILD_BUG_ON(sizeof(NvmeDsmRange) != 16);
> > QEMU_BUILD_BUG_ON(sizeof(NvmeCmd) != 64);
> > @@ -1130,8 +1237,13 @@ static inline void _nvme_check_size(void)
> > QEMU_BUILD_BUG_ON(sizeof(NvmeSmartLog) != 512);
> > QEMU_BUILD_BUG_ON(sizeof(NvmeEffectsLog) != 4096);
> > QEMU_BUILD_BUG_ON(sizeof(NvmeIdCtrl) != 4096);
> > + QEMU_BUILD_BUG_ON(sizeof(NvmeIdCtrlZoned) != 4096);
> > + QEMU_BUILD_BUG_ON(sizeof(NvmeLBAF) != 4);
> > + QEMU_BUILD_BUG_ON(sizeof(NvmeLBAFE) != 16);
> > QEMU_BUILD_BUG_ON(sizeof(NvmeIdNs) != 4096);
> > + QEMU_BUILD_BUG_ON(sizeof(NvmeIdNsZoned) != 4096);
> > QEMU_BUILD_BUG_ON(sizeof(NvmeSglDescriptor) != 16);
> > QEMU_BUILD_BUG_ON(sizeof(NvmeIdNsDescr) != 4);
> > + QEMU_BUILD_BUG_ON(sizeof(NvmeZoneDescr) != 64);
> > }
> > #endif
> > --
> > 2.28.0
> >
> >
>
> --
> One of us - No more doubt, silence or taboo about mental illness.
Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
© 2016 - 2026 Red Hat, Inc.