mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-04 16:23:55 -06:00
hw/block/nvme updates
* NVMe subsystem support (`-device nvme-subsys`) (Minwoo Im) * Namespace (De|At)tachment support (Minwoo Im) * Simple Copy command support (Klaus Jensen) * Flush broadcast support (Gollu Appalanaidu) * QEMUIOVector/QEMUSGList duality refactoring (Klaus Jensen) plus various fixes from Minwoo, Gollu, Dmitry and me. v2: - add `nqn` nvme-subsys device parameter instead of using `id`. (Paolo) -----BEGIN PGP SIGNATURE----- iQEzBAABCAAdFiEEUigzqnXi3OaiR2bATeGvMW1PDekFAmBHX5EACgkQTeGvMW1P Dek7ygf9H1g1wwp0Epo3U9z3wCWGcGz6uhBcqEW/T7MtmFg0G50C9iUGKOSe7xtv bWDabGJj0VCCzceeVUtMLfDXtDsekdUEiP/40OWuD3GsMDE7BJj0YIEklPioqa14 maDuFoXbXvgmbPUGIf4IIvmQDTOg22K2oBkjCHA9nbaZM6qxIPC3wRtM77sxXDcW QdKQR4QXOs0lCXUlPdO9PhhnYcxt7k2/WxCKQsdF7ZL7USDkgZ/c7m54MUaw2st4 gQWUAh6vxa+oEjpAjgivCdnmd6B4srpUsvMK3U4UKSpYFXus7teK2x88e8t/plKR 9X0sgL40+PQVI9/CeBh0Z8l/vJYCvg== =WF8v -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/nvme/tags/nvme-next-pull-request' into staging hw/block/nvme updates * NVMe subsystem support (`-device nvme-subsys`) (Minwoo Im) * Namespace (De|At)tachment support (Minwoo Im) * Simple Copy command support (Klaus Jensen) * Flush broadcast support (Gollu Appalanaidu) * QEMUIOVector/QEMUSGList duality refactoring (Klaus Jensen) plus various fixes from Minwoo, Gollu, Dmitry and me. v2: - add `nqn` nvme-subsys device parameter instead of using `id`. (Paolo) # gpg: Signature made Tue 09 Mar 2021 11:44:17 GMT # gpg: using RSA key 522833AA75E2DCE6A24766C04DE1AF316D4F0DE9 # gpg: Good signature from "Klaus Jensen <its@irrelevant.dk>" [unknown] # gpg: aka "Klaus Jensen <k.jensen@samsung.com>" [unknown] # gpg: WARNING: This key is not certified with a trusted signature! # gpg: There is no indication that the signature belongs to the owner. # Primary key fingerprint: DDCA 4D9C 9EF9 31CC 3468 4272 63D5 6FC5 E55D A838 # Subkey fingerprint: 5228 33AA 75E2 DCE6 A247 66C0 4DE1 AF31 6D4F 0DE9 * remotes/nvme/tags/nvme-next-pull-request: (38 commits) hw/block/nvme: support Identify NS Attached Controller List hw/block/nvme: support changed namespace asynchronous event hw/block/nvme: support namespace attachment command hw/block/nvme: refactor nvme_select_ns_iocs hw/block/nvme: support allocated namespace type hw/block/nvme: fix allocated namespace list to 256 hw/block/nvme: fix namespaces array to 1-based hw/block/nvme: support namespace detach hw/block/nvme: refactor nvme_dma hw/block/nvme: remove the req dependency in map functions hw/block/nvme: try to deal with the iov/qsg duality hw/block/nvme: fix strerror printing hw/block/nvme: remove block accounting for write zeroes hw/block/nvme: remove redundant len member in compare context hw/block/nvme: report non-mdts command size limit for dsm hw/block/nvme: add trace event for zone read check hw/block/nvme: fix potential compilation error hw/block/nvme: add identify trace event hw/block/nvme: remove unnecessary endian conversion hw/block/nvme: align zoned.zasl with mdts ... Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
d689ecad07
9 changed files with 1447 additions and 397 deletions
|
@ -566,6 +566,7 @@ enum NvmeAdminCommands {
|
|||
NVME_ADM_CMD_ASYNC_EV_REQ = 0x0c,
|
||||
NVME_ADM_CMD_ACTIVATE_FW = 0x10,
|
||||
NVME_ADM_CMD_DOWNLOAD_FW = 0x11,
|
||||
NVME_ADM_CMD_NS_ATTACHMENT = 0x15,
|
||||
NVME_ADM_CMD_FORMAT_NVM = 0x80,
|
||||
NVME_ADM_CMD_SECURITY_SEND = 0x81,
|
||||
NVME_ADM_CMD_SECURITY_RECV = 0x82,
|
||||
|
@ -579,6 +580,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,9 +726,41 @@ typedef struct QEMU_PACKED NvmeDsmRange {
|
|||
uint64_t slba;
|
||||
} NvmeDsmRange;
|
||||
|
||||
enum {
|
||||
NVME_COPY_FORMAT_0 = 0x0,
|
||||
};
|
||||
|
||||
typedef struct QEMU_PACKED NvmeCopyCmd {
|
||||
uint8_t opcode;
|
||||
uint8_t flags;
|
||||
uint16_t cid;
|
||||
uint32_t nsid;
|
||||
uint32_t rsvd2[4];
|
||||
NvmeCmdDptr dptr;
|
||||
uint64_t sdlba;
|
||||
uint8_t nr;
|
||||
uint8_t control[3];
|
||||
uint16_t rsvd13;
|
||||
uint16_t dspec;
|
||||
uint32_t reftag;
|
||||
uint16_t apptag;
|
||||
uint16_t appmask;
|
||||
} NvmeCopyCmd;
|
||||
|
||||
typedef struct QEMU_PACKED NvmeCopySourceRange {
|
||||
uint8_t rsvd0[8];
|
||||
uint64_t slba;
|
||||
uint16_t nlb;
|
||||
uint8_t rsvd18[6];
|
||||
uint32_t reftag;
|
||||
uint16_t apptag;
|
||||
uint16_t appmask;
|
||||
} NvmeCopySourceRange;
|
||||
|
||||
enum NvmeAsyncEventRequest {
|
||||
NVME_AER_TYPE_ERROR = 0,
|
||||
NVME_AER_TYPE_SMART = 1,
|
||||
NVME_AER_TYPE_NOTICE = 2,
|
||||
NVME_AER_TYPE_IO_SPECIFIC = 6,
|
||||
NVME_AER_TYPE_VENDOR_SPECIFIC = 7,
|
||||
NVME_AER_INFO_ERR_INVALID_DB_REGISTER = 0,
|
||||
|
@ -738,6 +772,7 @@ enum NvmeAsyncEventRequest {
|
|||
NVME_AER_INFO_SMART_RELIABILITY = 0,
|
||||
NVME_AER_INFO_SMART_TEMP_THRESH = 1,
|
||||
NVME_AER_INFO_SMART_SPARE_THRESH = 2,
|
||||
NVME_AER_INFO_NOTICE_NS_ATTR_CHANGED = 0,
|
||||
};
|
||||
|
||||
typedef struct QEMU_PACKED NvmeAerResult {
|
||||
|
@ -804,9 +839,13 @@ enum NvmeStatusCodes {
|
|||
NVME_FEAT_NOT_CHANGEABLE = 0x010e,
|
||||
NVME_FEAT_NOT_NS_SPEC = 0x010f,
|
||||
NVME_FW_REQ_SUSYSTEM_RESET = 0x0110,
|
||||
NVME_NS_ALREADY_ATTACHED = 0x0118,
|
||||
NVME_NS_NOT_ATTACHED = 0x011A,
|
||||
NVME_NS_CTRL_LIST_INVALID = 0x011C,
|
||||
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,
|
||||
|
@ -903,6 +942,7 @@ enum NvmeLogIdentifier {
|
|||
NVME_LOG_ERROR_INFO = 0x01,
|
||||
NVME_LOG_SMART_INFO = 0x02,
|
||||
NVME_LOG_FW_SLOT_INFO = 0x03,
|
||||
NVME_LOG_CHANGED_NSLIST = 0x04,
|
||||
NVME_LOG_CMD_EFFECTS = 0x05,
|
||||
};
|
||||
|
||||
|
@ -918,6 +958,7 @@ typedef struct QEMU_PACKED NvmePSD {
|
|||
uint8_t resv[16];
|
||||
} NvmePSD;
|
||||
|
||||
#define NVME_CONTROLLER_LIST_SIZE 2048
|
||||
#define NVME_IDENTIFY_DATA_SIZE 4096
|
||||
|
||||
enum NvmeIdCns {
|
||||
|
@ -930,6 +971,7 @@ enum NvmeIdCns {
|
|||
NVME_ID_CNS_CS_NS_ACTIVE_LIST = 0x07,
|
||||
NVME_ID_CNS_NS_PRESENT_LIST = 0x10,
|
||||
NVME_ID_CNS_NS_PRESENT = 0x11,
|
||||
NVME_ID_CNS_NS_ATTACHED_CTRL_LIST = 0x12,
|
||||
NVME_ID_CNS_CS_NS_PRESENT_LIST = 0x1a,
|
||||
NVME_ID_CNS_CS_NS_PRESENT = 0x1b,
|
||||
NVME_ID_CNS_IO_COMMAND_SET = 0x1c,
|
||||
|
@ -994,7 +1036,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];
|
||||
|
@ -1008,10 +1050,25 @@ typedef struct NvmeIdCtrlZoned {
|
|||
uint8_t rsvd1[4095];
|
||||
} NvmeIdCtrlZoned;
|
||||
|
||||
typedef struct NvmeIdCtrlNvm {
|
||||
uint8_t vsl;
|
||||
uint8_t wzsl;
|
||||
uint8_t wusl;
|
||||
uint8_t dmrl;
|
||||
uint32_t dmrsl;
|
||||
uint64_t dmsl;
|
||||
uint8_t rsvd16[4080];
|
||||
} NvmeIdCtrlNvm;
|
||||
|
||||
enum NvmeIdCtrlOaes {
|
||||
NVME_OAES_NS_ATTR = 1 << 8,
|
||||
};
|
||||
|
||||
enum NvmeIdCtrlOacs {
|
||||
NVME_OACS_SECURITY = 1 << 0,
|
||||
NVME_OACS_FORMAT = 1 << 1,
|
||||
NVME_OACS_FW = 1 << 2,
|
||||
NVME_OACS_NS_MGMT = 1 << 3,
|
||||
};
|
||||
|
||||
enum NvmeIdCtrlOncs {
|
||||
|
@ -1022,6 +1079,19 @@ 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 NvmeIdctrlVwc {
|
||||
NVME_VWC_PRESENT = 1 << 0,
|
||||
NVME_VWC_NSID_BROADCAST_NO_SUPPORT = 0 << 1,
|
||||
NVME_VWC_NSID_BROADCAST_RESERVED = 1 << 1,
|
||||
NVME_VWC_NSID_BROADCAST_CTRL_SPEC = 2 << 1,
|
||||
NVME_VWC_NSID_BROADCAST_SUPPORT = 3 << 1,
|
||||
};
|
||||
|
||||
enum NvmeIdCtrlFrmw {
|
||||
|
@ -1034,6 +1104,10 @@ enum NvmeIdCtrlLpa {
|
|||
NVME_LPA_EXTENDED = 1 << 2,
|
||||
};
|
||||
|
||||
enum NvmeIdCtrlCmic {
|
||||
NVME_CMIC_MULTI_CTRL = 1 << 1,
|
||||
};
|
||||
|
||||
#define NVME_CTRL_SQES_MIN(sqes) ((sqes) & 0xf)
|
||||
#define NVME_CTRL_SQES_MAX(sqes) (((sqes) >> 4) & 0xf)
|
||||
#define NVME_CTRL_CQES_MIN(cqes) ((cqes) & 0xf)
|
||||
|
@ -1171,7 +1245,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];
|
||||
|
@ -1199,6 +1276,10 @@ enum NvmeNsIdentifierType {
|
|||
NVME_NIDT_CSI = 0x04,
|
||||
};
|
||||
|
||||
enum NvmeIdNsNmic {
|
||||
NVME_NMIC_NS_SHARED = 1 << 0,
|
||||
};
|
||||
|
||||
enum NvmeCsi {
|
||||
NVME_CSI_NVM = 0x00,
|
||||
NVME_CSI_ZONED = 0x02,
|
||||
|
@ -1323,6 +1404,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 +1412,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);
|
||||
|
@ -1337,6 +1420,7 @@ static inline void _nvme_check_size(void)
|
|||
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(NvmeIdCtrlNvm) != 4096);
|
||||
QEMU_BUILD_BUG_ON(sizeof(NvmeLBAF) != 4);
|
||||
QEMU_BUILD_BUG_ON(sizeof(NvmeLBAFE) != 16);
|
||||
QEMU_BUILD_BUG_ON(sizeof(NvmeIdNs) != 4096);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue