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.fomic...@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 <stefa...@redhat.com>
signature.asc
Description: PGP signature