Message ID | 20210129091541.566330-5-its@irrelevant.dk |
---|---|
State | New |
Headers | show |
Series | hw/block/nvme: add simple copy command | expand |
On Fri, Jan 29, 2021 at 10:15:40AM +0100, Klaus Jensen wrote: > From: Klaus Jensen <k.jensen@samsung.com> > > Add new data structures and types for the Simple Copy command. > > Signed-off-by: Klaus Jensen <k.jensen@samsung.com> > Reviewed-by: Minwoo Im <minwoo.im.dev@gmail.com> > Acked-by: Stefan Hajnoczi <stefanha@redhat.com> > --- > include/block/nvme.h | 45 ++++++++++++++++++++++++++++++++++++++++++-- > 1 file changed, 43 insertions(+), 2 deletions(-) > > diff --git a/include/block/nvme.h b/include/block/nvme.h > index e4b918064df9..5977bcf0308a 100644 > --- a/include/block/nvme.h > +++ b/include/block/nvme.h > @@ -579,6 +579,7 @@ enum NvmeIoCommands { > NVME_CMD_COMPARE = 0x05, > NVME_CMD_WRITE_ZEROES = 0x08, > NVME_CMD_DSM = 0x09, > + NVME_CMD_COPY = 0x19, > NVME_CMD_ZONE_MGMT_SEND = 0x79, > NVME_CMD_ZONE_MGMT_RECV = 0x7a, > NVME_CMD_ZONE_APPEND = 0x7d, > @@ -724,6 +725,35 @@ typedef struct QEMU_PACKED NvmeDsmRange { > uint64_t slba; > } NvmeDsmRange; > > +enum { > + NVME_COPY_FORMAT_0 = 0x0, > +}; > + > +typedef struct NvmeCopyCmd { > + uint8_t opcode; > + uint8_t flags; > + uint16_t cid; > + uint32_t nsid; > + uint32_t rsvd2[4]; > + NvmeCmdDptr dptr; > + uint64_t sdlba; > + uint32_t cdw12; > + uint32_t cdw13; Can we find better names for the fields within cdw's 12 and 13? Something like: uint8_t nr; uint8_t control[3]; uint16_t rsvd13; uint16_t dspec;
On Feb 3 09:21, Keith Busch wrote: > On Fri, Jan 29, 2021 at 10:15:40AM +0100, Klaus Jensen wrote: > > From: Klaus Jensen <k.jensen@samsung.com> > > > > Add new data structures and types for the Simple Copy command. > > > > Signed-off-by: Klaus Jensen <k.jensen@samsung.com> > > Reviewed-by: Minwoo Im <minwoo.im.dev@gmail.com> > > Acked-by: Stefan Hajnoczi <stefanha@redhat.com> > > --- > > include/block/nvme.h | 45 ++++++++++++++++++++++++++++++++++++++++++-- > > 1 file changed, 43 insertions(+), 2 deletions(-) > > > > diff --git a/include/block/nvme.h b/include/block/nvme.h > > index e4b918064df9..5977bcf0308a 100644 > > --- a/include/block/nvme.h > > +++ b/include/block/nvme.h > > @@ -579,6 +579,7 @@ enum NvmeIoCommands { > > NVME_CMD_COMPARE = 0x05, > > NVME_CMD_WRITE_ZEROES = 0x08, > > NVME_CMD_DSM = 0x09, > > + NVME_CMD_COPY = 0x19, > > NVME_CMD_ZONE_MGMT_SEND = 0x79, > > NVME_CMD_ZONE_MGMT_RECV = 0x7a, > > NVME_CMD_ZONE_APPEND = 0x7d, > > @@ -724,6 +725,35 @@ typedef struct QEMU_PACKED NvmeDsmRange { > > uint64_t slba; > > } NvmeDsmRange; > > > > +enum { > > + NVME_COPY_FORMAT_0 = 0x0, > > +}; > > + > > +typedef struct NvmeCopyCmd { > > + uint8_t opcode; > > + uint8_t flags; > > + uint16_t cid; > > + uint32_t nsid; > > + uint32_t rsvd2[4]; > > + NvmeCmdDptr dptr; > > + uint64_t sdlba; > > + uint32_t cdw12; > > + uint32_t cdw13; > > Can we find better names for the fields within cdw's 12 and 13? > Something like: > > uint8_t nr; > uint8_t control[3]; > uint16_t rsvd13; > uint16_t dspec; > Absolutely. I honestly didn't think about doing an array-3 of those control bytes.
diff --git a/include/block/nvme.h b/include/block/nvme.h index e4b918064df9..5977bcf0308a 100644 --- a/include/block/nvme.h +++ b/include/block/nvme.h @@ -579,6 +579,7 @@ enum NvmeIoCommands { NVME_CMD_COMPARE = 0x05, NVME_CMD_WRITE_ZEROES = 0x08, NVME_CMD_DSM = 0x09, + NVME_CMD_COPY = 0x19, NVME_CMD_ZONE_MGMT_SEND = 0x79, NVME_CMD_ZONE_MGMT_RECV = 0x7a, NVME_CMD_ZONE_APPEND = 0x7d, @@ -724,6 +725,35 @@ typedef struct QEMU_PACKED NvmeDsmRange { uint64_t slba; } NvmeDsmRange; +enum { + NVME_COPY_FORMAT_0 = 0x0, +}; + +typedef struct NvmeCopyCmd { + uint8_t opcode; + uint8_t flags; + uint16_t cid; + uint32_t nsid; + uint32_t rsvd2[4]; + NvmeCmdDptr dptr; + uint64_t sdlba; + uint32_t cdw12; + uint32_t cdw13; + uint32_t ilbrt; + uint16_t lbat; + uint16_t lbatm; +} NvmeCopyCmd; + +typedef struct NvmeCopySourceRange { + uint8_t rsvd0[8]; + uint64_t slba; + uint16_t nlb; + uint8_t rsvd18[6]; + uint32_t eilbrt; + uint16_t elbat; + uint16_t elbatm; +} NvmeCopySourceRange; + enum NvmeAsyncEventRequest { NVME_AER_TYPE_ERROR = 0, NVME_AER_TYPE_SMART = 1, @@ -807,6 +837,7 @@ enum NvmeStatusCodes { NVME_CONFLICTING_ATTRS = 0x0180, NVME_INVALID_PROT_INFO = 0x0181, NVME_WRITE_TO_RO = 0x0182, + NVME_CMD_SIZE_LIMIT = 0x0183, NVME_ZONE_BOUNDARY_ERROR = 0x01b8, NVME_ZONE_FULL = 0x01b9, NVME_ZONE_READ_ONLY = 0x01ba, @@ -994,7 +1025,7 @@ typedef struct QEMU_PACKED NvmeIdCtrl { uint8_t nvscc; uint8_t rsvd531; uint16_t acwu; - uint8_t rsvd534[2]; + uint16_t ocfs; uint32_t sgls; uint8_t rsvd540[228]; uint8_t subnqn[256]; @@ -1022,6 +1053,11 @@ enum NvmeIdCtrlOncs { NVME_ONCS_FEATURES = 1 << 4, NVME_ONCS_RESRVATIONS = 1 << 5, NVME_ONCS_TIMESTAMP = 1 << 6, + NVME_ONCS_COPY = 1 << 8, +}; + +enum NvmeIdCtrlOcfs { + NVME_OCFS_COPY_FORMAT_0 = 1 << 0, }; enum NvmeIdCtrlFrmw { @@ -1171,7 +1207,10 @@ typedef struct QEMU_PACKED NvmeIdNs { uint16_t npdg; uint16_t npda; uint16_t nows; - uint8_t rsvd74[30]; + uint16_t mssrl; + uint32_t mcl; + uint8_t msrc; + uint8_t rsvd81[23]; uint8_t nguid[16]; uint64_t eui64; NvmeLBAF lbaf[16]; @@ -1323,6 +1362,7 @@ static inline void _nvme_check_size(void) 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(NvmeCopySourceRange) != 32); QEMU_BUILD_BUG_ON(sizeof(NvmeCmd) != 64); QEMU_BUILD_BUG_ON(sizeof(NvmeDeleteQ) != 64); QEMU_BUILD_BUG_ON(sizeof(NvmeCreateCq) != 64); @@ -1330,6 +1370,7 @@ static inline void _nvme_check_size(void) QEMU_BUILD_BUG_ON(sizeof(NvmeIdentify) != 64); QEMU_BUILD_BUG_ON(sizeof(NvmeRwCmd) != 64); QEMU_BUILD_BUG_ON(sizeof(NvmeDsmCmd) != 64); + QEMU_BUILD_BUG_ON(sizeof(NvmeCopyCmd) != 64); QEMU_BUILD_BUG_ON(sizeof(NvmeRangeType) != 64); QEMU_BUILD_BUG_ON(sizeof(NvmeErrorLog) != 64); QEMU_BUILD_BUG_ON(sizeof(NvmeFwSlotInfoLog) != 512);