nvme: Make ZNS-related definitions
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> Acked-by: Stefan Hajnoczi <stefanha@redhat.com> Reviewed-by: Keith Busch <kbusch@kernel.org> Signed-off-by: Klaus Jensen <k.jensen@samsung.com>
This commit is contained in:
parent
922e6f4ebd
commit
e9ba46eeaf
@ -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 {
|
||||
@ -654,9 +657,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;
|
||||
@ -685,6 +692,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,
|
||||
@ -709,6 +717,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,
|
||||
@ -894,6 +910,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,
|
||||
@ -1022,6 +1043,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 {
|
||||
@ -1081,10 +1108,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)
|
||||
@ -1117,10 +1158,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);
|
||||
@ -1136,8 +1243,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
|
||||
|
Loading…
Reference in New Issue
Block a user