@ -15,14 +15,19 @@ typedef struct QEMU_PACKED NvmeBar {
uint64_t acq ;
uint32_t cmbloc ;
uint32_t cmbsz ;
uint8_t padding [ 3520 ] ; /* not used by QEMU */
uint32_t bpinfo ;
uint32_t bprsel ;
uint64_t bpmbl ;
uint64_t cmbmsc ;
uint32_t cmbsts ;
uint8_t rsvd92 [ 3492 ] ;
uint32_t pmrcap ;
uint32_t pmrctl ;
uint32_t pmrsts ;
uint32_t pmrebs ;
uint32_t pmrswtp ;
uint64_t pmrmsc ;
uint8_t reserved [ 484 ] ;
uint8_t css [ 484 ] ;
} NvmeBar ;
enum NvmeCapShift {
@ -35,7 +40,8 @@ enum NvmeCapShift {
CAP_CSS_SHIFT = 37 ,
CAP_MPSMIN_SHIFT = 48 ,
CAP_MPSMAX_SHIFT = 52 ,
CAP_PMR_SHIFT = 56 ,
CAP_PMRS_SHIFT = 56 ,
CAP_CMBS_SHIFT = 57 ,
} ;
enum NvmeCapMask {
@ -48,7 +54,8 @@ enum NvmeCapMask {
CAP_CSS_MASK = 0xff ,
CAP_MPSMIN_MASK = 0xf ,
CAP_MPSMAX_MASK = 0xf ,
CAP_PMR_MASK = 0x1 ,
CAP_PMRS_MASK = 0x1 ,
CAP_CMBS_MASK = 0x1 ,
} ;
# define NVME_CAP_MQES(cap) (((cap) >> CAP_MQES_SHIFT) & CAP_MQES_MASK)
@ -60,6 +67,8 @@ enum NvmeCapMask {
# define NVME_CAP_CSS(cap) (((cap) >> CAP_CSS_SHIFT) & CAP_CSS_MASK)
# define NVME_CAP_MPSMIN(cap)(((cap) >> CAP_MPSMIN_SHIFT) & CAP_MPSMIN_MASK)
# define NVME_CAP_MPSMAX(cap)(((cap) >> CAP_MPSMAX_SHIFT) & CAP_MPSMAX_MASK)
# define NVME_CAP_PMRS(cap) (((cap) >> CAP_PMRS_SHIFT) & CAP_PMRS_MASK)
# define NVME_CAP_CMBS(cap) (((cap) >> CAP_CMBS_SHIFT) & CAP_CMBS_MASK)
# define NVME_CAP_SET_MQES(cap, val) (cap |= (uint64_t)(val & CAP_MQES_MASK) \
< < CAP_MQES_SHIFT )
@ -78,12 +87,15 @@ enum NvmeCapMask {
# define NVME_CAP_SET_MPSMIN(cap, val) (cap |= (uint64_t)(val & CAP_MPSMIN_MASK)\
< < CAP_MPSMIN_SHIFT )
# define NVME_CAP_SET_MPSMAX(cap, val) (cap |= (uint64_t)(val & CAP_MPSMAX_MASK)\
< < CAP_MPSMAX_SHIFT )
# define NVME_CAP_SET_PMRS(cap, val) (cap |= (uint64_t)(val & CAP_PMR_MASK)\
< < CAP_PMR_SHIFT )
< < CAP_MPSMAX_SHIFT )
# define NVME_CAP_SET_PMRS(cap, val) (cap |= (uint64_t)(val & CAP_PMRS_MASK) \
< < CAP_PMRS_SHIFT )
# define NVME_CAP_SET_CMBS(cap, val) (cap |= (uint64_t)(val & CAP_CMBS_MASK) \
< < CAP_CMBS_SHIFT )
enum NvmeCapCss {
NVME_CAP_CSS_NVM = 1 < < 0 ,
NVME_CAP_CSS_CSI_SUPP = 1 < < 6 ,
NVME_CAP_CSS_ADMIN_ONLY = 1 < < 7 ,
} ;
@ -117,9 +129,25 @@ enum NvmeCcMask {
enum NvmeCcCss {
NVME_CC_CSS_NVM = 0x0 ,
NVME_CC_CSS_CSI = 0x6 ,
NVME_CC_CSS_ADMIN_ONLY = 0x7 ,
} ;
# define NVME_SET_CC_EN(cc, val) \
( cc | = ( uint32_t ) ( ( val ) & CC_EN_MASK ) < < CC_EN_SHIFT )
# define NVME_SET_CC_CSS(cc, val) \
( cc | = ( uint32_t ) ( ( val ) & CC_CSS_MASK ) < < CC_CSS_SHIFT )
# define NVME_SET_CC_MPS(cc, val) \
( cc | = ( uint32_t ) ( ( val ) & CC_MPS_MASK ) < < CC_MPS_SHIFT )
# define NVME_SET_CC_AMS(cc, val) \
( cc | = ( uint32_t ) ( ( val ) & CC_AMS_MASK ) < < CC_AMS_SHIFT )
# define NVME_SET_CC_SHN(cc, val) \
( cc | = ( uint32_t ) ( ( val ) & CC_SHN_MASK ) < < CC_SHN_SHIFT )
# define NVME_SET_CC_IOSQES(cc, val) \
( cc | = ( uint32_t ) ( ( val ) & CC_IOSQES_MASK ) < < CC_IOSQES_SHIFT )
# define NVME_SET_CC_IOCQES(cc, val) \
( cc | = ( uint32_t ) ( ( val ) & CC_IOCQES_MASK ) < < CC_IOCQES_SHIFT )
enum NvmeCstsShift {
CSTS_RDY_SHIFT = 0 ,
CSTS_CFS_SHIFT = 1 ,
@ -162,25 +190,64 @@ enum NvmeAqaMask {
# define NVME_AQA_ACQS(aqa) ((aqa >> AQA_ACQS_SHIFT) & AQA_ACQS_MASK)
enum NvmeCmblocShift {
CMBLOC_BIR_SHIFT = 0 ,
CMBLOC_OFST_SHIFT = 12 ,
CMBLOC_BIR_SHIFT = 0 ,
CMBLOC_CQMMS_SHIFT = 3 ,
CMBLOC_CQPDS_SHIFT = 4 ,
CMBLOC_CDPMLS_SHIFT = 5 ,
CMBLOC_CDPCILS_SHIFT = 6 ,
CMBLOC_CDMMMS_SHIFT = 7 ,
CMBLOC_CQDA_SHIFT = 8 ,
CMBLOC_OFST_SHIFT = 12 ,
} ;
enum NvmeCmblocMask {
CMBLOC_BIR_MASK = 0x7 ,
CMBLOC_OFST_MASK = 0xfffff ,
CMBLOC_BIR_MASK = 0x7 ,
CMBLOC_CQMMS_MASK = 0x1 ,
CMBLOC_CQPDS_MASK = 0x1 ,
CMBLOC_CDPMLS_MASK = 0x1 ,
CMBLOC_CDPCILS_MASK = 0x1 ,
CMBLOC_CDMMMS_MASK = 0x1 ,
CMBLOC_CQDA_MASK = 0x1 ,
CMBLOC_OFST_MASK = 0xfffff ,
} ;
# define NVME_CMBLOC_BIR(cmbloc) ((cmbloc >> CMBLOC_BIR_SHIFT) & \
CMBLOC_BIR_MASK )
# define NVME_CMBLOC_OFST(cmbloc)((cmbloc >> CMBLOC_OFST_SHIFT) & \
CMBLOC_OFST_MASK )
# define NVME_CMBLOC_SET_BIR(cmbloc, val) \
# define NVME_CMBLOC_BIR(cmbloc) \
( ( cmbloc > > CMBLOC_BIR_SHIFT ) & CMBLOC_BIR_MASK )
# define NVME_CMBLOC_CQMMS(cmbloc) \
( ( cmbloc > > CMBLOC_CQMMS_SHIFT ) & CMBLOC_CQMMS_MASK )
# define NVME_CMBLOC_CQPDS(cmbloc) \
( ( cmbloc > > CMBLOC_CQPDS_SHIFT ) & CMBLOC_CQPDS_MASK )
# define NVME_CMBLOC_CDPMLS(cmbloc) \
( ( cmbloc > > CMBLOC_CDPMLS_SHIFT ) & CMBLOC_CDPMLS_MASK )
# define NVME_CMBLOC_CDPCILS(cmbloc) \
( ( cmbloc > > CMBLOC_CDPCILS_SHIFT ) & CMBLOC_CDPCILS_MASK )
# define NVME_CMBLOC_CDMMMS(cmbloc) \
( ( cmbloc > > CMBLOC_CDMMMS_SHIFT ) & CMBLOC_CDMMMS_MASK )
# define NVME_CMBLOC_CQDA(cmbloc) \
( ( cmbloc > > CMBLOC_CQDA_SHIFT ) & CMBLOC_CQDA_MASK )
# define NVME_CMBLOC_OFST(cmbloc) \
( ( cmbloc > > CMBLOC_OFST_SHIFT ) & CMBLOC_OFST_MASK )
# define NVME_CMBLOC_SET_BIR(cmbloc, val) \
( cmbloc | = ( uint64_t ) ( val & CMBLOC_BIR_MASK ) < < CMBLOC_BIR_SHIFT )
# define NVME_CMBLOC_SET_CQMMS(cmbloc, val) \
( cmbloc | = ( uint64_t ) ( val & CMBLOC_CQMMS_MASK ) < < CMBLOC_CQMMS_SHIFT )
# define NVME_CMBLOC_SET_CQPDS(cmbloc, val) \
( cmbloc | = ( uint64_t ) ( val & CMBLOC_CQPDS_MASK ) < < CMBLOC_CQPDS_SHIFT )
# define NVME_CMBLOC_SET_CDPMLS(cmbloc, val) \
( cmbloc | = ( uint64_t ) ( val & CMBLOC_CDPMLS_MASK ) < < CMBLOC_CDPMLS_SHIFT )
# define NVME_CMBLOC_SET_CDPCILS(cmbloc, val) \
( cmbloc | = ( uint64_t ) ( val & CMBLOC_CDPCILS_MASK ) < < CMBLOC_CDPCILS_SHIFT )
# define NVME_CMBLOC_SET_CDMMMS(cmbloc, val) \
( cmbloc | = ( uint64_t ) ( val & CMBLOC_CDMMMS_MASK ) < < CMBLOC_CDMMMS_SHIFT )
# define NVME_CMBLOC_SET_CQDA(cmbloc, val) \
( cmbloc | = ( uint64_t ) ( val & CMBLOC_CQDA_MASK ) < < CMBLOC_CQDA_SHIFT )
# define NVME_CMBLOC_SET_OFST(cmbloc, val) \
( cmbloc | = ( uint64_t ) ( val & CMBLOC_OFST_MASK ) < < CMBLOC_OFST_SHIFT )
# define NVME_CMBMSMC_SET_CRE (cmbmsc, val) \
( cmbmsc | = ( uint64_t ) ( val & CMBLOC_OFST_MASK ) < < CMBMSC_CRE_SHIFT )
enum NvmeCmbszShift {
CMBSZ_SQS_SHIFT = 0 ,
CMBSZ_CQS_SHIFT = 1 ,
@ -227,6 +294,46 @@ enum NvmeCmbszMask {
# define NVME_CMBSZ_GETSIZE(cmbsz) \
( NVME_CMBSZ_SZ ( cmbsz ) * ( 1 < < ( 12 + 4 * NVME_CMBSZ_SZU ( cmbsz ) ) ) )
enum NvmeCmbmscShift {
CMBMSC_CRE_SHIFT = 0 ,
CMBMSC_CMSE_SHIFT = 1 ,
CMBMSC_CBA_SHIFT = 12 ,
} ;
enum NvmeCmbmscMask {
CMBMSC_CRE_MASK = 0x1 ,
CMBMSC_CMSE_MASK = 0x1 ,
CMBMSC_CBA_MASK = ( ( 1ULL < < 52 ) - 1 ) ,
} ;
# define NVME_CMBMSC_CRE(cmbmsc) \
( ( cmbmsc > > CMBMSC_CRE_SHIFT ) & CMBMSC_CRE_MASK )
# define NVME_CMBMSC_CMSE(cmbmsc) \
( ( cmbmsc > > CMBMSC_CMSE_SHIFT ) & CMBMSC_CMSE_MASK )
# define NVME_CMBMSC_CBA(cmbmsc) \
( ( cmbmsc > > CMBMSC_CBA_SHIFT ) & CMBMSC_CBA_MASK )
# define NVME_CMBMSC_SET_CRE(cmbmsc, val) \
( cmbmsc | = ( uint64_t ) ( val & CMBMSC_CRE_MASK ) < < CMBMSC_CRE_SHIFT )
# define NVME_CMBMSC_SET_CMSE(cmbmsc, val) \
( cmbmsc | = ( uint64_t ) ( val & CMBMSC_CMSE_MASK ) < < CMBMSC_CMSE_SHIFT )
# define NVME_CMBMSC_SET_CBA(cmbmsc, val) \
( cmbmsc | = ( uint64_t ) ( val & CMBMSC_CBA_MASK ) < < CMBMSC_CBA_SHIFT )
enum NvmeCmbstsShift {
CMBSTS_CBAI_SHIFT = 0 ,
} ;
enum NvmeCmbstsMask {
CMBSTS_CBAI_MASK = 0x1 ,
} ;
# define NVME_CMBSTS_CBAI(cmbsts) \
( ( cmbsts > > CMBSTS_CBAI_SHIFT ) & CMBSTS_CBAI_MASK )
# define NVME_CMBSTS_SET_CBAI(cmbsts, val) \
( cmbsts | = ( uint64_t ) ( val & CMBSTS_CBAI_MASK ) < < CMBSTS_CBAI_SHIFT )
enum NvmePmrcapShift {
PMRCAP_RDS_SHIFT = 3 ,
PMRCAP_WDS_SHIFT = 4 ,
@ -472,6 +579,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 {
@ -540,8 +650,13 @@ typedef struct QEMU_PACKED NvmeIdentify {
uint64_t rsvd2 [ 2 ] ;
uint64_t prp1 ;
uint64_t prp2 ;
uint32_t cns ;
uint32_t rsvd11 [ 5 ] ;
uint8_t cns ;
uint8_t rsvd10 ;
uint16_t ctrlid ;
uint16_t nvmsetid ;
uint8_t rsvd11 ;
uint8_t csi ;
uint32_t rsvd12 [ 4 ] ;
} NvmeIdentify ;
typedef struct QEMU_PACKED NvmeRwCmd {
@ -632,9 +747,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 ;
@ -662,6 +781,8 @@ enum NvmeStatusCodes {
NVME_SGL_DESCR_TYPE_INVALID = 0x0011 ,
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 ,
@ -686,6 +807,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 ,
@ -693,6 +822,7 @@ enum NvmeStatusCodes {
NVME_E2E_REF_ERROR = 0x0284 ,
NVME_CMP_FAILURE = 0x0285 ,
NVME_ACCESS_DENIED = 0x0286 ,
NVME_DULB = 0x0287 ,
NVME_MORE = 0x2000 ,
NVME_DNR = 0x4000 ,
NVME_NO_COMPLETE = 0xffff ,
@ -743,18 +873,37 @@ typedef struct QEMU_PACKED NvmeSmartLog {
uint8_t reserved2 [ 320 ] ;
} NvmeSmartLog ;
# define NVME_SMART_WARN_MAX 6
enum NvmeSmartWarn {
NVME_SMART_SPARE = 1 < < 0 ,
NVME_SMART_TEMPERATURE = 1 < < 1 ,
NVME_SMART_RELIABILITY = 1 < < 2 ,
NVME_SMART_MEDIA_READ_ONLY = 1 < < 3 ,
NVME_SMART_FAILED_VOLATILE_MEDIA = 1 < < 4 ,
NVME_SMART_PMR_UNRELIABLE = 1 < < 5 ,
} ;
typedef struct NvmeEffectsLog {
uint32_t acs [ 256 ] ;
uint32_t iocs [ 256 ] ;
uint8_t resv [ 2048 ] ;
} NvmeEffectsLog ;
enum {
NVME_CMD_EFF_CSUPP = 1 < < 0 ,
NVME_CMD_EFF_LBCC = 1 < < 1 ,
NVME_CMD_EFF_NCC = 1 < < 2 ,
NVME_CMD_EFF_NIC = 1 < < 3 ,
NVME_CMD_EFF_CCC = 1 < < 4 ,
NVME_CMD_EFF_CSE_MASK = 3 < < 16 ,
NVME_CMD_EFF_UUID_SEL = 1 < < 19 ,
} ;
enum NvmeLogIdentifier {
NVME_LOG_ERROR_INFO = 0x01 ,
NVME_LOG_SMART_INFO = 0x02 ,
NVME_LOG_FW_SLOT_INFO = 0x03 ,
NVME_LOG_CMD_EFFECTS = 0x05 ,
} ;
typedef struct QEMU_PACKED NvmePSD {
@ -771,11 +920,19 @@ typedef struct QEMU_PACKED NvmePSD {
# define NVME_IDENTIFY_DATA_SIZE 4096
enum {
NVME_ID_CNS_NS = 0x0 ,
NVME_ID_CNS_CTRL = 0x1 ,
NVME_ID_CNS_NS_ACTIVE_LIST = 0x2 ,
NVME_ID_CNS_NS_DESCR_LIST = 0x3 ,
enum NvmeIdCns {
NVME_ID_CNS_NS = 0x00 ,
NVME_ID_CNS_CTRL = 0x01 ,
NVME_ID_CNS_NS_ACTIVE_LIST = 0x02 ,
NVME_ID_CNS_NS_DESCR_LIST = 0x03 ,
NVME_ID_CNS_CS_NS = 0x05 ,
NVME_ID_CNS_CS_CTRL = 0x06 ,
NVME_ID_CNS_CS_NS_ACTIVE_LIST = 0x07 ,
NVME_ID_CNS_NS_PRESENT_LIST = 0x10 ,
NVME_ID_CNS_NS_PRESENT = 0x11 ,
NVME_ID_CNS_CS_NS_PRESENT_LIST = 0x1a ,
NVME_ID_CNS_CS_NS_PRESENT = 0x1b ,
NVME_ID_CNS_IO_COMMAND_SET = 0x1c ,
} ;
typedef struct QEMU_PACKED NvmeIdCtrl {
@ -794,7 +951,8 @@ typedef struct QEMU_PACKED NvmeIdCtrl {
uint32_t rtd3e ;
uint32_t oaes ;
uint32_t ctratt ;
uint8_t rsvd100 [ 12 ] ;
uint8_t rsvd100 [ 11 ] ;
uint8_t cntrltype ;
uint8_t fguid [ 16 ] ;
uint8_t rsvd128 [ 128 ] ;
uint16_t oacs ;
@ -845,6 +1003,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 ,
@ -867,6 +1030,7 @@ enum NvmeIdCtrlFrmw {
enum NvmeIdCtrlLpa {
NVME_LPA_NS_SMART = 1 < < 0 ,
NVME_LPA_CSE = 1 < < 1 ,
NVME_LPA_EXTENDED = 1 < < 2 ,
} ;
@ -909,6 +1073,9 @@ enum NvmeIdCtrlLpa {
# define NVME_AEC_NS_ATTR(aec) ((aec >> 8) & 0x1)
# define NVME_AEC_FW_ACTIVATION(aec) ((aec >> 9) & 0x1)
# define NVME_ERR_REC_TLER(err_rec) (err_rec & 0xffff)
# define NVME_ERR_REC_DULBE(err_rec) (err_rec & 0x10000)
enum NvmeFeatureIds {
NVME_ARBITRATION = 0x1 ,
NVME_POWER_MANAGEMENT = 0x2 ,
@ -922,6 +1089,7 @@ enum NvmeFeatureIds {
NVME_WRITE_ATOMICITY = 0xa ,
NVME_ASYNCHRONOUS_EVENT_CONF = 0xb ,
NVME_TIMESTAMP = 0xe ,
NVME_COMMAND_SET_PROFILE = 0x19 ,
NVME_SOFTWARE_PROGRESS_MARKER = 0x80 ,
NVME_FID_MAX = 0x100 ,
} ;
@ -968,6 +1136,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 {
@ -992,7 +1166,12 @@ typedef struct QEMU_PACKED NvmeIdNs {
uint16_t nabspf ;
uint16_t noiob ;
uint8_t nvmcap [ 16 ] ;
uint8_t rsvd64 [ 40 ] ;
uint16_t npwg ;
uint16_t npwa ;
uint16_t npdg ;
uint16_t npda ;
uint16_t nows ;
uint8_t rsvd74 [ 30 ] ;
uint8_t nguid [ 16 ] ;
uint64_t eui64 ;
NvmeLBAF lbaf [ 16 ] ;
@ -1006,18 +1185,40 @@ typedef struct QEMU_PACKED NvmeIdNsDescr {
uint8_t rsvd2 [ 2 ] ;
} NvmeIdNsDescr ;
enum {
NVME_NIDT_EUI64_LEN = 8 ,
NVME_NIDT_NGUID_LEN = 16 ,
NVME_NIDT_UUID_LEN = 16 ,
enum NvmeNsIdentifierLength {
NVME_NIDL_EUI64 = 8 ,
NVME_NIDL_NGUID = 16 ,
NVME_NIDL_UUID = 16 ,
NVME_NIDL_CSI = 1 ,
} ;
enum NvmeNsIdentifierType {
NVME_NIDT_EUI64 = 0x1 ,
NVME_NIDT_NGUID = 0x2 ,
NVME_NIDT_UUID = 0x3 ,
NVME_NIDT_EUI64 = 0x01 ,
NVME_NIDT_NGUID = 0x02 ,
NVME_NIDT_UUID = 0x03 ,
NVME_NIDT_CSI = 0x04 ,
} ;
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)
@ -1029,6 +1230,7 @@ enum NvmeNsIdentifierType {
# define NVME_ID_NS_NSFEAT_THIN(nsfeat) ((nsfeat & 0x1))
# define NVME_ID_NS_NSFEAT_DULBE(nsfeat) ((nsfeat >> 2) & 0x1)
# define NVME_ID_NS_FLBAS_EXTENDED(flbas) ((flbas >> 4) & 0x1)
# define NVME_ID_NS_FLBAS_INDEX(flbas) ((flbas & 0xf))
# define NVME_ID_NS_MC_SEPARATE(mc) ((mc >> 1) & 0x1)
@ -1049,10 +1251,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 ;
typedef 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 ,
} NvmeZoneState ;
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 ) ;
@ -1066,9 +1334,15 @@ static inline void _nvme_check_size(void)
QEMU_BUILD_BUG_ON ( sizeof ( NvmeErrorLog ) ! = 64 ) ;
QEMU_BUILD_BUG_ON ( sizeof ( NvmeFwSlotInfoLog ) ! = 512 ) ;
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