libxnvme_spec.h#
Enums#
xnvme_nvm_scopy_fmt#
-
enum xnvme_nvm_scopy_fmt#
Structure conversion for support Kernel format.
Values:
-
enumerator XNVME_NVM_SCOPY_FMT_ZERO#
user provides entries formatted as XNVME_NVM_SCOPY_FMT_ZERO
-
enumerator XNVME_NVM_SCOPY_FMT_SRCLEN#
user provides entries formatted as XNVME_NVM_SCOPY_FMT_SRCLEN
-
enumerator XNVME_NVM_SCOPY_FMT_ZERO#
xnvme_nvme_sgl_descriptor_type#
-
enum xnvme_nvme_sgl_descriptor_type#
Values:
-
enumerator XNVME_SPEC_SGL_DESCR_TYPE_DATA_BLOCK#
XNVME_SPEC_SGL_DESCR_TYPE_DATA_BLOCK.
-
enumerator XNVME_SPEC_SGL_DESCR_TYPE_BIT_BUCKET#
XNVME_SPEC_SGL_DESCR_TYPE_BIT_BUCKET.
-
enumerator XNVME_SPEC_SGL_DESCR_TYPE_SEGMENT#
XNVME_SPEC_SGL_DESCR_TYPE_SEGMENT.
-
enumerator XNVME_SPEC_SGL_DESCR_TYPE_LAST_SEGMENT#
XNVME_SPEC_SGL_DESCR_TYPE_LAST_SEGMENT.
-
enumerator XNVME_SPEC_SGL_DESCR_TYPE_KEYED_DATA_BLOCK#
XNVME_SPEC_SGL_DESCR_TYPE_KEYED_DATA_BLOCK.
-
enumerator XNVME_SPEC_SGL_DESCR_TYPE_VENDOR_SPECIFIC#
XNVME_SPEC_SGL_DESCR_TYPE_VENDOR_SPECIFIC.
-
enumerator XNVME_SPEC_SGL_DESCR_TYPE_DATA_BLOCK#
xnvme_spec_adm_opc#
-
enum xnvme_spec_adm_opc#
NVMe Admin Command Opcodes.
See also
specification Section xx, figure yy
Values:
-
enumerator XNVME_SPEC_ADM_OPC_LOG#
XNVME_SPEC_ADM_OPC_LOG.
-
enumerator XNVME_SPEC_ADM_OPC_IDFY#
XNVME_SPEC_ADM_OPC_IDFY.
-
enumerator XNVME_SPEC_ADM_OPC_SFEAT#
XNVME_SPEC_ADM_OPC_SFEAT.
-
enumerator XNVME_SPEC_ADM_OPC_GFEAT#
XNVME_SPEC_ADM_OPC_GFEAT.
-
enumerator XNVME_SPEC_ADM_OPC_DSEND#
XNVME_SPEC_ADM_OPC_DSEND.
-
enumerator XNVME_SPEC_ADM_OPC_DRECV#
XNVME_SPEC_ADM_OPC_DRECV.
-
enumerator XNVME_SPEC_ADM_OPC_LOG#
xnvme_spec_csi#
xnvme_spec_dir_types#
xnvme_spec_drecv_idfy_doper#
xnvme_spec_drecv_streams_doper#
xnvme_spec_dsend_idfy_doper#
xnvme_spec_dsend_streams_doper#
xnvme_spec_feat_id#
-
enum xnvme_spec_feat_id#
NVMe Feature Identifiers.
TODO: expand these
Values:
-
enumerator XNVME_SPEC_FEAT_ARBITRATION#
XNVME_SPEC_FEAT_ARBITRATION.
-
enumerator XNVME_SPEC_FEAT_PWR_MGMT#
XNVME_SPEC_FEAT_PWR_MGMT.
-
enumerator XNVME_SPEC_FEAT_LBA_RANGETYPE#
XNVME_SPEC_FEAT_LBA_RANGETYPE.
-
enumerator XNVME_SPEC_FEAT_TEMP_THRESHOLD#
XNVME_SPEC_FEAT_TEMP_THRESHOLD.
-
enumerator XNVME_SPEC_FEAT_ERROR_RECOVERY#
XNVME_SPEC_FEAT_ERROR_RECOVERY.
-
enumerator XNVME_SPEC_FEAT_VWCACHE#
XNVME_SPEC_FEAT_VWCACHE.
-
enumerator XNVME_SPEC_FEAT_NQUEUES#
XNVME_SPEC_FEAT_NQUEUES.
-
enumerator XNVME_SPEC_FEAT_FDP_MODE#
XNVME_SPEC_FEAT_FDP_MODE.
-
enumerator XNVME_SPEC_FEAT_FDP_EVENTS#
XNVME_SPEC_FEAT_FDP_EVENTS.
-
enumerator XNVME_SPEC_FEAT_ARBITRATION#
xnvme_spec_feat_sel#
-
enum xnvme_spec_feat_sel#
Values:
-
enumerator XNVME_SPEC_FEAT_SEL_CURRENT#
XNVME_SPEC_FEAT_SEL_CURRENT.
-
enumerator XNVME_SPEC_FEAT_SEL_DEFAULT#
XNVME_SPEC_FEAT_SEL_DEFAULT.
-
enumerator XNVME_SPEC_FEAT_SEL_SAVED#
XNVME_SPEC_FEAT_SEL_SAVED.
-
enumerator XNVME_SPEC_FEAT_SEL_SUPPORTED#
XNVME_SPEC_FEAT_SEL_SUPPORTED.
-
enumerator XNVME_SPEC_FEAT_SEL_CURRENT#
xnvme_spec_flag#
-
enum xnvme_spec_flag#
Enumeration of NVMe flags.
TODO: document
Values:
-
enumerator XNVME_SPEC_FLAG_LIMITED_RETRY#
-
enumerator XNVME_SPEC_FLAG_FORCE_UNIT_ACCESS#
-
enumerator XNVME_SPEC_FLAG_PRINFO_PRCHK_REF#
-
enumerator XNVME_SPEC_FLAG_PRINFO_PRCHK_APP#
-
enumerator XNVME_SPEC_FLAG_PRINFO_PRCHK_GUARD#
-
enumerator XNVME_SPEC_FLAG_PRINFO_PRACT#
-
enumerator XNVME_SPEC_FLAG_LIMITED_RETRY#
xnvme_spec_idfy_cns#
-
enum xnvme_spec_idfy_cns#
Values:
-
enumerator XNVME_SPEC_IDFY_NS#
XNVME_SPEC_IDFY_NS.
-
enumerator XNVME_SPEC_IDFY_CTRLR#
XNVME_SPEC_IDFY_CTRLR.
-
enumerator XNVME_SPEC_IDFY_NSLIST#
XNVME_SPEC_IDFY_NSLIST.
-
enumerator XNVME_SPEC_IDFY_NSDSCR#
XNVME_SPEC_IDFY_NSDSCR.
-
enumerator XNVME_SPEC_IDFY_SETL#
XNVME_SPEC_IDFY_SETL.
-
enumerator XNVME_SPEC_IDFY_NS_IOCS#
XNVME_SPEC_IDFY_NS_IOCS.
-
enumerator XNVME_SPEC_IDFY_CTRLR_IOCS#
XNVME_SPEC_IDFY_CTRLR_IOCS.
-
enumerator XNVME_SPEC_IDFY_NSLIST_IOCS#
XNVME_SPEC_IDFY_NSLIST_IOCS.
-
enumerator XNVME_SPEC_IDFY_NSLIST_ALLOC#
XNVME_SPEC_IDFY_NSLIST_ALLOC.
-
enumerator XNVME_SPEC_IDFY_NS_ALLOC#
XNVME_SPEC_IDFY_NS_ALLOC.
-
enumerator XNVME_SPEC_IDFY_CTRLR_NS#
XNVME_SPEC_IDFY_CTRLR_NS.
-
enumerator XNVME_SPEC_IDFY_CTRLR_SUB#
XNVME_SPEC_IDFY_CTRLR_SUB.
-
enumerator XNVME_SPEC_IDFY_CTRLR_PRI#
XNVME_SPEC_IDFY_CTRLR_PRI.
-
enumerator XNVME_SPEC_IDFY_CTRLR_SEC#
XNVME_SPEC_IDFY_CTRLR_SEC.
-
enumerator XNVME_SPEC_IDFY_NSGRAN#
XNVME_SPEC_IDFY_NSGRAN.
-
enumerator XNVME_SPEC_IDFY_UUIDL#
XNVME_SPEC_IDFY_UUIDL.
-
enumerator XNVME_SPEC_IDFY_NSLIST_ALLOC_IOCS#
XNVME_SPEC_IDFY_NSLIST_ALLOC_IOCS.
-
enumerator XNVME_SPEC_IDFY_NS_ALLOC_IOCS#
XNVME_SPEC_IDFY_NS_ALLOC_IOCS.
-
enumerator XNVME_SPEC_IDFY_IOCS#
XNVME_SPEC_IDFY_IOCS.
-
enumerator XNVME_SPEC_IDFY_NS#
xnvme_spec_io_mgmt_recv_mo#
xnvme_spec_io_mgmt_send_mo#
xnvme_spec_kv_opc#
-
enum xnvme_spec_kv_opc#
Values:
-
enumerator XNVME_SPEC_KV_OPC_STORE#
XNVME_SPEC_KV_OPC_STORE.
-
enumerator XNVME_SPEC_KV_OPC_RETRIEVE#
XNVME_SPEC_KV_OPC_RETRIEVE.
-
enumerator XNVME_SPEC_KV_OPC_DELETE#
XNVME_SPEC_KV_OPC_DELETE.
-
enumerator XNVME_SPEC_KV_OPC_EXIST#
XNVME_SPEC_KV_OPC_EXIST.
-
enumerator XNVME_SPEC_KV_OPC_LIST#
XNVME_SPEC_KV_OPC_LIST.
-
enumerator XNVME_SPEC_KV_OPC_STORE#
xnvme_spec_kv_status_code#
-
enum xnvme_spec_kv_status_code#
Command-set specific status codes related to key-value Namespaces.
See also
Key Value Command Set Specification Revision 1.0c, Figure 4
Values:
-
enumerator XNVME_SPEC_KV_SC_CAPACITY_EXCEEDED#
XNVME_SPEC_KV_SC_CAPACITY_EXCEEDED.
-
enumerator XNVME_SPEC_KV_SC_NS_NOT_READY#
XNVME_SPEC_KV_SC_NS_NOT_READY.
-
enumerator XNVME_SPEC_KV_SC_RESERVATION_CONFLICT#
XNVME_SPEC_KV_SC_RESERVATION_CONFLICT.
-
enumerator XNVME_SPEC_KV_SC_FORMAT_IN_PROGRESS#
XNVME_SPEC_KV_SC_FORMAT_IN_PROGRESS.
-
enumerator XNVME_SPEC_KV_SC_INVALID_VAL_SIZE#
XNVME_SPEC_KV_SC_INVALID_VAL_SIZE.
-
enumerator XNVME_SPEC_KV_SC_INVALID_KEY_SIZE#
XNVME_SPEC_KV_SC_INVALID_KEY_SIZE.
-
enumerator XNVME_SPEC_KV_SC_KEY_NOT_EXISTS#
XNVME_SPEC_KV_SC_KEY_NOT_EXISTS.
-
enumerator XNVME_SPEC_KV_SC_UNRECOVERED_ERR#
XNVME_SPEC_KV_SC_UNRECOVERED_ERR.
-
enumerator XNVME_SPEC_KV_SC_KEY_EXISTS#
XNVME_SPEC_KV_SC_KEY_EXISTS.
-
enumerator XNVME_SPEC_KV_SC_CAPACITY_EXCEEDED#
xnvme_spec_log_lpi#
-
enum xnvme_spec_log_lpi#
Identifiers (lpi) for NVMe get-log-page.
NVMe 1.4 - Figure ?
Values:
-
enumerator XNVME_SPEC_LOG_RSVD#
XNVME_SPEC_LOG_RSVD.
-
enumerator XNVME_SPEC_LOG_ERRI#
XNVME_SPEC_LOG_ERRI.
-
enumerator XNVME_SPEC_LOG_HEALTH#
XNVME_SPEC_LOG_HEALTH.
-
enumerator XNVME_SPEC_LOG_FW#
XNVME_SPEC_LOG_FW.
-
enumerator XNVME_SPEC_LOG_CHNS#
XNVME_SPEC_LOG_CHNS.
-
enumerator XNVME_SPEC_LOG_CSAE#
XNVME_SPEC_LOG_CSAE.
-
enumerator XNVME_SPEC_LOG_SELFTEST#
XNVME_SPEC_LOG_SELFTEST.
-
enumerator XNVME_SPEC_LOG_TELEHOST#
XNVME_SPEC_LOG_TELEHOST.
-
enumerator XNVME_SPEC_LOG_TELECTRLR#
XNVME_SPEC_LOG_TELECTRLR.
-
enumerator XNVME_SPEC_LOG_FDPCONF#
XNVME_SPEC_LOG_FDPCONF.
-
enumerator XNVME_SPEC_LOG_FDPRUHU#
XNVME_SPEC_LOG_FDPRUHU.
-
enumerator XNVME_SPEC_LOG_FDPSTATS#
XNVME_SPEC_LOG_FDPSTATS.
-
enumerator XNVME_SPEC_LOG_FDPEVENTS#
XNVME_SPEC_LOG_FDPEVENTS.
-
enumerator XNVME_SPEC_LOG_RSVD#
xnvme_spec_nvm_cmd_cpl_sc#
xnvme_spec_nvm_ns_pif#
xnvme_spec_nvm_opc#
-
enum xnvme_spec_nvm_opc#
NVMe Non-Volatile Memory Command Opcodes.
See also
specification Section xx, figure yy
Values:
-
enumerator XNVME_SPEC_NVM_OPC_FLUSH#
XNVME_SPEC_NVM_OPC_FLUSH.
-
enumerator XNVME_SPEC_NVM_OPC_WRITE#
XNVME_SPEC_NVM_OPC_WRITE.
-
enumerator XNVME_SPEC_NVM_OPC_READ#
XNVME_SPEC_NVM_OPC_READ.
-
enumerator XNVME_SPEC_NVM_OPC_WRITE_UNCORRECTABLE#
XNVME_SPEC_NVM_OPC_WRITE_UNCORRECTABLE.
-
enumerator XNVME_SPEC_NVM_OPC_COMPARE#
XNVME_SPEC_NVM_OPC_COMPARE.
-
enumerator XNVME_SPEC_NVM_OPC_WRITE_ZEROES#
XNVME_SPEC_NVM_OPC_WRITE_ZEROES.
-
enumerator XNVME_SPEC_NVM_OPC_DATASET_MANAGEMENT#
XNVME_SPEC_NVM_OPC_DATASET_MANAGEMENT.
-
enumerator XNVME_SPEC_NVM_OPC_SCOPY#
XNVME_SPEC_NVM_OPC_SCOPY.
-
enumerator XNVME_SPEC_NVM_OPC_IO_MGMT_RECV#
XNVME_SPEC_NVM_OPC_IO_MGMT.
-
enumerator XNVME_SPEC_NVM_OPC_IO_MGMT_SEND#
XNVME_SPEC_NVM_OPC_IO_MGMT_SEND.
-
enumerator XNVME_SPEC_NVM_OPC_FMT#
XNVME_SPEC_NVM_OPC_FMT.
-
enumerator XNVME_SPEC_NVM_OPC_SANITIZE#
XNVME_SPEC_NVM_OPC_SANITIZE.
-
enumerator XNVME_SPEC_NVM_OPC_FLUSH#
xnvme_spec_psdt#
xnvme_spec_sgl_descriptor_subtype#
xnvme_spec_status_code#
xnvme_spec_status_code_type#
-
enum xnvme_spec_status_code_type#
NVMe Command Status Code Types.
Values:
-
enumerator XNVME_STATUS_CODE_TYPE_GENERIC#
Generic.
-
enumerator XNVME_STATUS_CODE_TYPE_CMDSPEC#
Command Specific.
-
enumerator XNVME_STATUS_CODE_TYPE_MEDIA#
Media and data integrity error.
-
enumerator XNVME_STATUS_CODE_TYPE_PATH#
Path related status.
-
enumerator XNVME_STATUS_CODE_TYPE_VENDOR#
Vendor specific.
-
enumerator XNVME_STATUS_CODE_TYPE_GENERIC#
xnvme_spec_znd_cmd_mgmt_recv_action#
-
enum xnvme_spec_znd_cmd_mgmt_recv_action#
Zoned Receive Action.
See also
Specification Section 6.2, figure TBDZMRDW13
Values:
-
enumerator XNVME_SPEC_ZND_CMD_MGMT_RECV_ACTION_REPORT#
XNvME_SPEC_ZND_CMD_MGMT_RECV_ACTION_REPORT.
XNvME_SPEC_ZND_CMD_MGMT_RECV_ACTION_REPORT_EXTENDED
-
enumerator XNVME_SPEC_ZND_CMD_MGMT_RECV_ACTION_REPORT_EXTENDED#
-
enumerator XNVME_SPEC_ZND_CMD_MGMT_RECV_ACTION_REPORT#
xnvme_spec_znd_cmd_mgmt_recv_action_sf#
-
enum xnvme_spec_znd_cmd_mgmt_recv_action_sf#
Zone Receive Action (xnvme_spec_znd_cmd_mgmt_recv_action) specific field values.
See also
Specification Section 6.2, figure TBDZMRDW13
Values:
-
enumerator XNVME_SPEC_ZND_CMD_MGMT_RECV_SF_ALL#
XNVME_SPEC_ZND_CMD_MGMT_RECV_SF_ALL.
-
enumerator XNVME_SPEC_ZND_CMD_MGMT_RECV_SF_EMPTY#
XNVME_SPEC_ZND_CMD_MGMT_RECV_SF_EMPTY.
-
enumerator XNVME_SPEC_ZND_CMD_MGMT_RECV_SF_IOPEN#
XNVME_SPEC_ZND_CMD_MGMT_RECV_SF_IOPEN.
-
enumerator XNVME_SPEC_ZND_CMD_MGMT_RECV_SF_EOPEN#
XNVME_SPEC_ZND_CMD_MGMT_RECV_SF_EOPEN.
-
enumerator XNVME_SPEC_ZND_CMD_MGMT_RECV_SF_CLOSED#
XNVME_SPEC_ZND_CMD_MGMT_RECV_SF_CLOSED.
-
enumerator XNVME_SPEC_ZND_CMD_MGMT_RECV_SF_FULL#
XNVME_SPEC_ZND_CMD_MGMT_RECV_SF_FULL.
-
enumerator XNVME_SPEC_ZND_CMD_MGMT_RECV_SF_RONLY#
XNVME_SPEC_ZND_CMD_MGMT_RECV_SF_RONLY.
-
enumerator XNVME_SPEC_ZND_CMD_MGMT_RECV_SF_OFFLINE#
XNVME_SPEC_ZND_CMD_MGMT_RECV_SF_OFFLINE.
-
enumerator XNVME_SPEC_ZND_CMD_MGMT_RECV_SF_ALL#
xnvme_spec_znd_cmd_mgmt_send_action#
-
enum xnvme_spec_znd_cmd_mgmt_send_action#
Actions for the Zone Management Send command.
See also
Specification Section 6.1, figure TBDZMDW13
Values:
-
enumerator XNVME_SPEC_ZND_CMD_MGMT_SEND_CLOSE#
XNVME_SPEC_ZND_CMD_MGMT_SEND_CLOSE.
-
enumerator XNVME_SPEC_ZND_CMD_MGMT_SEND_FINISH#
XNVME_SPEC_ZND_CMD_MGMT_SEND_FINISH.
-
enumerator XNVME_SPEC_ZND_CMD_MGMT_SEND_OPEN#
XNVME_SPEC_ZND_CMD_MGMT_SEND_OPEN.
-
enumerator XNVME_SPEC_ZND_CMD_MGMT_SEND_RESET#
XNVME_SPEC_ZND_CMD_MGMT_SEND_RESET.
-
enumerator XNVME_SPEC_ZND_CMD_MGMT_SEND_OFFLINE#
XNVME_SPEC_ZND_CMD_MGMT_SEND_OFFLINE.
-
enumerator XNVME_SPEC_ZND_CMD_MGMT_SEND_DESCRIPTOR#
XNVME_SPEC_ZND_CMD_MGMT_SEND_DESCRIPTOR.
-
enumerator XNVME_SPEC_ZND_CMD_MGMT_SEND_FLUSH#
XNVME_SPEC_ZND_CMD_MGMT_SEND_FLUSH.
-
enumerator XNVME_SPEC_ZND_CMD_MGMT_SEND_CLOSE#
xnvme_spec_znd_log_lid#
xnvme_spec_znd_mgmt_send_action_so#
xnvme_spec_znd_opc#
xnvme_spec_znd_state#
-
enum xnvme_spec_znd_state#
Zone State as reported by Zone Management Receive.
See also
Specification Section 6.2.2.3, figure TBDZMRZD
Values:
-
enumerator XNVME_SPEC_ZND_STATE_EMPTY#
XNVME_SPEC_ZND_STATE_EMPTY.
-
enumerator XNVME_SPEC_ZND_STATE_IOPEN#
XNVME_SPEC_ZND_STATE_IOPEN.
-
enumerator XNVME_SPEC_ZND_STATE_EOPEN#
XNVME_SPEC_ZND_STATE_EOPEN.
-
enumerator XNVME_SPEC_ZND_STATE_CLOSED#
XNVME_SPEC_ZND_STATE_CLOSED.
-
enumerator XNVME_SPEC_ZND_STATE_RONLY#
XNVME_SPEC_ZND_STATE_RONLY.
-
enumerator XNVME_SPEC_ZND_STATE_FULL#
XNVME_SPEC_ZND_STATE_FULL.
-
enumerator XNVME_SPEC_ZND_STATE_OFFLINE#
XNVME_SPEC_ZND_STATE_OFFLINE.
-
enumerator XNVME_SPEC_ZND_STATE_EMPTY#
xnvme_spec_znd_status_code#
-
enum xnvme_spec_znd_status_code#
Command-set specific status codes related to Zoned Namespaces.
See also
Specification Section 4.1.1.1.1, figures GENERICSTATUSCODES and STATUSCODES
Values:
-
enumerator XNVME_SPEC_ZND_SC_INVALID_FORMAT#
ZND_SC_INVALID_FORMAT.
-
enumerator XNVME_SPEC_ZND_SC_INVALID_ZONE_OP#
Zoned Command Set.
ZND_SC_INVALID_ZONE_OP
-
enumerator XNVME_SPEC_ZND_SC_NOZRWA#
ZND_SC_NOZRWA.
-
enumerator XNVME_SPEC_ZND_SC_BOUNDARY_ERROR#
ZND_SC_BOUNDARY_ERROR.
-
enumerator XNVME_SPEC_ZND_SC_IS_FULL#
ZND_SC_IS_FULL.
-
enumerator XNVME_SPEC_ZND_SC_IS_READONLY#
ZND_SC_IS_READONLY.
-
enumerator XNVME_SPEC_ZND_SC_IS_OFFLINE#
ZND_SC_IS_OFFLINE.
-
enumerator XNVME_SPEC_ZND_SC_INVALID_WRITE#
ZND_SC_INVALID_WRITE.
-
enumerator XNVME_SPEC_ZND_SC_TOO_MANY_ACTIVE#
ZND_SC_TOO_MANY_ACTIVE.
-
enumerator XNVME_SPEC_ZND_SC_TOO_MANY_OPEN#
ZND_SC_TOO_MANY_OPEN.
-
enumerator XNVME_SPEC_ZND_SC_INVALID_TRANS#
ZND_SC_INVALID_TRANS.
-
enumerator XNVME_SPEC_ZND_SC_INVALID_FORMAT#
xnvme_spec_znd_type#
Structs#
xnvme_pif#
-
struct xnvme_pif#
xnvme_spec_alloc_resource#
-
struct xnvme_spec_alloc_resource#
This structure is encapsulation for values provided by allocate resource.
Public Members
-
union xnvme_spec_alloc_resource.[anonymous] [anonymous]#
-
union xnvme_spec_alloc_resource.[anonymous] [anonymous]#
xnvme_spec_cmd#
-
struct xnvme_spec_cmd#
NVMe Command Accessors.
Public Members
-
union xnvme_spec_cmd.[anonymous] [anonymous]#
-
union xnvme_spec_cmd.[anonymous] [anonymous]#
xnvme_spec_cmd_common#
-
struct xnvme_spec_cmd_common#
NVMe Command Accessor for common use of the 64byte NVMe command.
See also
Specification section 4.3, figure 2
See also
Specification section 4.3, figure 3
Public Members
-
uint16_t opcode#
OPC: Command Opcode.
-
uint16_t fuse#
FUSE: Fused Operation.
-
uint16_t rsvd#
-
uint16_t psdt#
-
uint16_t cid#
CID: Command Identifier.
-
uint32_t nsid#
NSID: Namespace identifier.
-
uint32_t cdw02#
-
uint32_t cdw03#
-
uint64_t mptr#
MPTR — metadata pointer.
-
union xnvme_spec_cmd_common.[anonymous] dptr#
< DPTR — data pointer
-
uint32_t ndt#
NDT: Number of dwords in Data Transfer.
-
uint32_t ndm#
NDM: Number of dwords in Meta Transfer.
-
uint32_t cdw12#
-
uint32_t cdw13#
-
uint32_t cdw14#
-
uint32_t cdw15#
-
uint16_t opcode#
xnvme_spec_cmd_drecv#
-
struct xnvme_spec_cmd_drecv#
xnvme_spec_cmd_dsend#
-
struct xnvme_spec_cmd_dsend#
NVMe Command Accessor for the directive send command.
xnvme_spec_cmd_dsm#
-
struct xnvme_spec_cmd_dsm#
The Dataset Management command is used by the host to indicate attributes for ranges of logical blocks.
xnvme_spec_cmd_format#
-
struct xnvme_spec_cmd_format#
NVMe Command Accessor for the NVM-format command.
Public Members
-
uint32_t cdw00_09[10]#
Command dword 0 to 9.
-
uint32_t lbafl#
Least significant 4 bits of LBA Format Index.
-
uint32_t mset#
Meta-data settings.
-
uint32_t pi#
Protection Information.
-
uint32_t pil#
Protection Information Loc.
-
uint32_t ses#
Secure Erase Settings.
-
uint32_t lbafu#
Most significant 2 bits of LBA Format Index.
-
uint32_t rsvd#
-
uint32_t cdw11_15[5]#
Command dword 11 to 15.
-
uint32_t cdw00_09[10]#
xnvme_spec_cmd_gfeat#
xnvme_spec_cmd_idfy#
-
struct xnvme_spec_cmd_idfy#
NVMe Command Accessor for the identify command.
Public Members
-
uint32_t cdw00_09[10]#
Command dword 0 to 9.
-
uint32_t cns#
Controller or Namespace Structure.
-
uint32_t rsvd1#
-
uint32_t cntid#
Controller Identifier.
-
uint32_t nvmsetid#
NVM Set Identifier.
-
uint32_t rsvd2#
-
uint32_t csi#
Command Set Identifier.
-
uint32_t cdw12_13[2]#
Command dword 12 to 13.
-
uint32_t uuid#
UUID index.
-
uint32_t rsvd3#
-
uint32_t cdw15#
Command dword 15.
-
uint32_t cdw00_09[10]#
xnvme_spec_cmd_log#
-
struct xnvme_spec_cmd_log#
NVMe Command Accessor for the get-log-page command.
Public Members
-
uint32_t cdw00_09[10]#
Command dword 0 to 9.
-
uint32_t lid#
Log Page Identifier.
-
uint32_t lsp#
Log Specific Field.
-
uint32_t rae#
Retain Async. Event.
-
uint32_t numdl#
Nr. of DWORDS lower-bits.
-
uint32_t numdu#
Nr. of DWORDS upper-bits.
-
uint32_t lsi#
Log Specific Identifier.
-
uint32_t lpol#
Log-page offset lower 32bits.
-
uint32_t lpou#
Log-page offset upper 32bits.
-
uint32_t uuidx#
UUID Index.
-
uint32_t rsvd1#
-
uint32_t ot#
Offset Type.
-
uint32_t csi#
Command Specific Identifier.
-
uint32_t cdw15#
Command dword 15.
-
uint32_t cdw00_09[10]#
xnvme_spec_cmd_nvm#
-
struct xnvme_spec_cmd_nvm#
NVMe Command Accessors for the NVM Command Set.
Public Members
-
uint32_t cdw00_09[10]#
Command dword 0 to 9.
-
uint64_t slba#
SLBA: Start Logical Block Address.
-
uint32_t nlb#
NLB: Number of logical blocks.
-
uint32_t rsvd#
-
uint32_t dtype#
DT: Directive Type.
-
uint32_t rsvd2#
-
uint32_t prinfo#
PI: Protection Information Field.
-
uint32_t fua#
FUA: Force unit access.
-
uint32_t lr#
LR: Limited retry.
-
union xnvme_spec_cmd_nvm.[anonymous] cdw13#
-
uint32_t ilbrt#
Initial Logical Block Reference Tag.
-
uint32_t lbat#
Logical Block Application Tag.
-
uint32_t lbatm#
logical Block Application Tag Mask
-
uint32_t cdw00_09[10]#
xnvme_spec_cmd_sanitize#
-
struct xnvme_spec_cmd_sanitize#
NVMe Command Accessor for the Sanitize command.
Public Members
-
uint32_t cdw00_09[10]#
Command dword 0 to 9.
-
uint32_t sanact#
Sanitize Action.
-
uint32_t ause#
Allow unrestr. San. Exit.
-
uint32_t owpass#
Overwrite Pass Count.
-
uint32_t oipbp#
Overwrite Invert.
-
uint32_t nodas#
NoDeallocate after Sanitize.
-
uint32_t rsvd#
-
uint32_t ovrpat#
Overwrite Pattern.
-
uint32_t cdw12_15[4]#
Command dword 12 to 15.
-
uint32_t cdw00_09[10]#
xnvme_spec_cmd_sfeat#
-
struct xnvme_spec_cmd_sfeat#
NVMe Command Accessor for the set-features command.
Public Members
-
uint32_t cdw00_09[10]#
Command dword 0 to 9.
-
union xnvme_spec_cmd_sfeat.[anonymous] cdw10#
-
struct xnvme_spec_feat feat#
Feature.
-
uint32_t cdw12#
Command dword 12.
-
uint32_t cdw13_15[3]#
Command dword 13 to 15.
-
uint32_t cdw00_09[10]#
xnvme_spec_cpl#
-
struct xnvme_spec_cpl#
Completion Queue Entry.
Public Members
-
union xnvme_spec_cpl.[anonymous] [anonymous]#
-
uint16_t sqhd#
submission queue head pointer
-
uint16_t sqid#
submission queue identifier
-
uint16_t cid#
command identifier
-
struct xnvme_spec_status status#
-
union xnvme_spec_cpl.[anonymous] [anonymous]#
xnvme_spec_cs_vector#
-
struct xnvme_spec_cs_vector#
Representation of I/O Command Set Vector.
See NVMe spec tbd, section xyz, for details
Public Members
-
union xnvme_spec_cs_vector.[anonymous] [anonymous]#
-
union xnvme_spec_cs_vector.[anonymous] [anonymous]#
xnvme_spec_ctrlr_bar#
-
struct xnvme_spec_ctrlr_bar#
libxnvme_spec - NVMe structs, enum, values and helper function declarations
If an entity is defined in the NVMe specification, then an enum or struct should exist in this header file. The purpose of this is to provide a single point of entry for spec. definitions for the purpose of providing structs with accessors, possibly bit-fields, and enums for values such as command opcodes.
Auxilary header files are provided for the different IO command-sets, e.g.
libxnvme_nvm.h
, providing utility functions such asxnvme_nvm_read
,xnvme_nvm_write
, and similarlylibxnvme_znd.h
with utilities such asxnvme_znd_append
,xnvme_znd_mgmt_send
. These can also contain enums and structs, however, these are not based on definitions in the NVMe specification, rather, these build on the spec. definition in order to provide something sligthly more convenient to the user.A special class of utility functions are pretty-printers, all spec. defintions have two associated pretty-printers named by the type, suffixed by
_fpr
and_pr
, for example:xnvme_spec_cpl_fpr(), prints the given
struct xnvme_spec_cpl
struct to the given fstreamxnvme_spec_cpl_pr(), prints the given
struct xnvme_spec_cpl
struct to stdout
These functions are auto-generated and available by importing
libxnvme_spec_pp.h
. Thus, when you see a definition inlibxnvme_spec.h
then you can count on always having a textual representation available for that definition by importinglibxnvme_spec_pp.h
. You can also choose to add thelibxnvme_pp.h
which includes pretty-printers for all enums and struct known by xNVMe.SPDX-FileCopyrightText: Samsung Electronics Co., Ltd
SPDX-License-Identifier: BSD-3-Clause NVMe PCIe BAR0 as-a-struct.
Public Members
-
uint64_t cap#
-
uint32_t vs#
-
uint32_t intms#
-
uint32_t intmc#
-
uint32_t cc#
-
uint32_t rsvd24#
-
uint32_t csts#
-
uint32_t nssr#
-
uint32_t aqa#
-
uint64_t asq#
-
uint64_t acq#
-
uint32_t cmbloc#
-
uint32_t cmbsz#
-
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#
-
uint32_t pmrmscl#
-
uint32_t pmrmscu#
-
uint8_t css[484]#
xnvme_spec_dsm_range#
-
struct xnvme_spec_dsm_range#
Representation of DSM ranges as defined in NVM Express 1.3 Figure 207 Dataset Management Range Definition Figure 207.
xnvme_spec_elbaf#
-
struct xnvme_spec_elbaf#
xnvme_spec_fdp_conf_desc#
-
struct xnvme_spec_fdp_conf_desc#
NVMe FDP configuration descriptor.
Public Members
-
uint16_t ds#
-
union xnvme_spec_fdp_conf_desc.[anonymous] fdpa#
FDP attributes.
-
uint8_t vss#
Vendor specific size.
-
uint32_t nrg#
Number of reclaim groups.
-
uint16_t nruh#
Number of reclaim unit handles.
-
uint16_t maxpids#
Max placement identifiers.
-
uint32_t nns#
Number of namespaces supported.
-
uint64_t runs#
Reclaim unit nominal size.
-
uint32_t erutl#
Estimated reclaim unit time limit.
-
uint8_t rsvd28[36]#
-
struct xnvme_spec_ruh_desc ruh_desc[]#
-
uint16_t ds#
xnvme_spec_fdp_event#
-
struct xnvme_spec_fdp_event#
NVMe FDP event.
xnvme_spec_fdp_event_desc#
-
struct xnvme_spec_fdp_event_desc#
NVMe FDP event descriptor.
Public Members
-
uint8_t type#
Event type.
-
union xnvme_spec_fdp_event_desc.[anonymous] fdpeta#
FDP event type attributes.
-
uint8_t type#
xnvme_spec_fdp_event_media_reallocated#
-
struct xnvme_spec_fdp_event_media_reallocated#
Media reallocated.
xnvme_spec_feat#
-
struct xnvme_spec_feat#
Encapsulation of NVMe/NVM features.
This structure is an accessor for Command Dword 11 of an Get Features Cmd. and encapsulation of values provided to the
xnvme_cmd_gfeat
.Public Members
-
union xnvme_spec_feat.[anonymous] [anonymous]#
-
union xnvme_spec_feat.[anonymous] [anonymous]#
xnvme_spec_idfy#
-
struct xnvme_spec_idfy#
NVMe completion result accessor.
TODO: clarify
Public Members
-
union xnvme_spec_idfy.[anonymous] [anonymous]#
-
union xnvme_spec_idfy.[anonymous] [anonymous]#
xnvme_spec_idfy_cs#
-
struct xnvme_spec_idfy_cs#
Representation of I/O Command Set data structure.
See NVMe spec tbd, section xyz, for details
Public Members
-
struct xnvme_spec_cs_vector iocsc[XNVME_SPEC_IDFY_CS_IOCSC_LEN]#
-
struct xnvme_spec_cs_vector iocsc[XNVME_SPEC_IDFY_CS_IOCSC_LEN]#
xnvme_spec_idfy_ctrlr#
-
struct xnvme_spec_idfy_ctrlr#
Public Members
-
uint16_t vid#
PCI Vendor ID.
-
uint16_t ssvid#
PCI Subsystem Vendor ID.
-
int8_t sn[XNVME_SPEC_CTRLR_SN_LEN]#
SerialNumber.
-
int8_t mn[XNVME_SPEC_CTRLR_MN_LEN]#
Model Number.
-
uint8_t fr[XNVME_SPEC_CTRLR_FR_LEN]#
Firmware Revision.
-
uint8_t rab#
Recomm. Arbitration Burst.
-
uint8_t ieee[3]#
IEEE OUI Identifier.
-
union xnvme_spec_idfy_ctrlr.[anonymous] cmic#
controller multi-path I/O and namespace sharing capabilities
-
uint8_t mdts#
Maximum Data Transfer Size.
-
uint16_t cntlid#
Controller ID.
-
union xnvme_spec_vs_register ver#
Version.
-
uint32_t rtd3r#
RTD3 Resume Latency.
-
uint32_t rtd3e#
RTD3 Resume Latency.
-
union xnvme_spec_idfy_ctrlr.[anonymous] oaes#
optional asynchronous events supported
-
union xnvme_spec_idfy_ctrlr.[anonymous] ctratt#
controller attributes
-
uint16_t rrls#
Read Recovery Levels Supported.
-
uint8_t reserved_102[9]#
-
uint8_t cntrltype#
Controller Type.
-
uint8_t fguid[16]#
FRU Globally Unique Ident.
-
uint16_t crdt1#
Command Retry Delay Time1.
-
uint16_t crdt2#
Command Retry Delay Time2.
-
uint16_t crdt3#
Command Retry Delay Time3.
-
uint8_t reserved_134[119]#
-
union xnvme_spec_idfy_ctrlr.[anonymous] nvmsr#
NVM Subsystem Report.
-
union xnvme_spec_idfy_ctrlr.[anonymous] vwci#
VPD Write Cycle Information.
-
union xnvme_spec_idfy_ctrlr.[anonymous] mec#
Management Endpoint Capabilities.
-
union xnvme_spec_idfy_ctrlr.[anonymous] oacs#
optional admin command support
-
uint8_t acl#
abort command limit
-
uint8_t aerl#
asynchronous event request limit
-
union xnvme_spec_idfy_ctrlr.[anonymous] frmw#
firmware updates
-
union xnvme_spec_idfy_ctrlr.[anonymous] lpa#
Log Page Attributes.
-
uint8_t elpe#
Error Log Page Entries.
-
uint8_t npss#
Number of Power States Supported.
-
union xnvme_spec_idfy_ctrlr.[anonymous] avscc#
admin vendor specific command configuration
-
union xnvme_spec_idfy_ctrlr.[anonymous] apsta#
autonomous power state transition attributes
-
uint16_t wctemp#
Warning Composite Temperature threshold.
-
uint16_t cctemp#
Critical Composite Temperature threshold.
-
uint16_t mtfa#
Maximum Time for Firmware Activation.
-
uint32_t hmpre#
Host Memory Buffer Preferred size.
-
uint32_t hmmin#
Host Memory Buffer Minimum size.
-
uint64_t tnvmcap[2]#
total NVM capacity
-
uint64_t unvmcap[2]#
unallocated NVM capacity
-
union xnvme_spec_idfy_ctrlr.[anonymous] rpmbs#
replay protected memory block support
-
uint16_t edstt#
extended device self-test time (in minutes)
-
union xnvme_spec_idfy_ctrlr.[anonymous] dsto#
device self-test options
-
uint8_t fwug#
Firmware update granularity.
4KB units 0x00 = no information provided 0xFF = no restriction
-
uint16_t kas#
Keep Alive Support.
Granularity of keep alive timer in 100 ms units 0 = keep alive not supported
-
union xnvme_spec_idfy_ctrlr.[anonymous] hctma#
Host controlled thermal management attributes.
-
uint16_t mntmt#
Minimum Thermal Management Temperature.
-
uint16_t mxtmt#
Maximum Thermal Management Temperature.
-
union xnvme_spec_idfy_ctrlr.[anonymous] sanicap#
Sanitize capabilities.
-
uint32_t hmminds#
Host Memory Buffer Minimum Descriptor Entry Size.
-
uint16_t hmmaxd#
Host Memory Maximum Descriptor Entries.
-
uint16_t nsetidmax#
NVM Set Identifier Maximum.
-
uint16_t endgidmax#
Endurance Group Identifier Maximum.
-
uint8_t anatt#
ANA Transition Time.
-
union xnvme_spec_idfy_ctrlr.[anonymous] anacap#
Asymmetric Namespace Access capabilities.
-
uint32_t anagrpmax#
ANA Group Identifier Maximum.
-
uint32_t nanagrpid#
Number of ANA Group Identifiers.
-
uint32_t pels#
Persistent Event Log Size.
-
uint16_t domain_identifier#
Domain Identifier.
-
uint8_t reserved_358[10]#
-
uint64_t megcap[2]#
Max Endurance Group Capacity.
-
uint8_t reserved_384[128]#
-
union xnvme_spec_idfy_ctrlr.[anonymous] sqes#
submission queue entry size
-
union xnvme_spec_idfy_ctrlr.[anonymous] cqes#
completion queue entry size
-
uint16_t maxcmd#
-
uint32_t nn#
Number of Namespaces.
-
union xnvme_spec_idfy_ctrlr.[anonymous] oncs#
optional nvm command support
-
uint16_t fuses#
Fused Operation Support.
-
union xnvme_spec_idfy_ctrlr.[anonymous] fna#
format nvm attributes
-
union xnvme_spec_idfy_ctrlr.[anonymous] vwc#
volatile write cache
-
uint16_t awun#
Atomic Write Unit Normal.
-
uint16_t awupf#
Atomic Write Unit Power Fail.
-
uint8_t nvscc#
NVM vendor specific command configuration.
-
uint8_t nwpc#
Namespace write protection capabilities.
-
uint16_t acwu#
atomic compare & write unit
-
union xnvme_spec_idfy_ctrlr.[anonymous] cdfs#
Copy descriptors formats supported.
-
union xnvme_spec_idfy_ctrlr.[anonymous] sgls#
SGL support.
-
uint32_t mnan#
Maximum Number of Allowed Namespaces.
-
uint64_t maxdna[2]#
Maximum Domain Namespace Attachments.
-
uint32_t maxcna#
Maximum I/O Controllers Namespace Attachments.
-
uint8_t reserved_564[204]#
-
uint8_t subnqn[256]#
NVM Subsystems NVMe Qualified Name.
-
uint8_t reserved_1024[768]#
-
struct xnvme_spec_idfy_ctrlr.[anonymous] nvmf_specific#
NVMe over Fabrics-specific fields.
-
struct xnvme_spec_power_state psd[32]#
-
uint8_t vs[1024]#
-
uint16_t vid#
xnvme_spec_idfy_dir_rp#
-
struct xnvme_spec_idfy_dir_rp#
This structure holds the return parameters data structure for identify directive.
Public Members
-
struct xnvme_spec_idfy_dir_rp.[anonymous] directives_supported#
-
struct xnvme_spec_idfy_dir_rp.[anonymous] directives_enabled#
-
struct xnvme_spec_idfy_dir_rp.[anonymous] directives_persistence#
-
uint8_t rsvd4[4000]#
-
struct xnvme_spec_idfy_dir_rp.[anonymous] directives_supported#
xnvme_spec_idfy_ns#
-
struct xnvme_spec_idfy_ns#
Representation of NVMe completion result Identify Namespace.
That is, for opcode XNVME_SPEC_OPC_IDFY(0x06) with XNVME_SPEC_IDFY_NS(0x0)
Public Members
-
uint64_t nsze#
namespace size
-
uint64_t ncap#
namespace capacity
-
uint64_t nuse#
namespace utilization
-
struct xnvme_spec_idfy_ns.[anonymous] nsfeat#
namespace features
-
uint8_t nlbaf#
number of lba formats
-
struct xnvme_spec_idfy_ns.[anonymous] flbas#
formatted lba size
-
struct xnvme_spec_idfy_ns.[anonymous] mc#
metadata capabilities
-
union xnvme_spec_idfy_ns.[anonymous] dpc#
end-to-end data protection capabilities
-
union xnvme_spec_idfy_ns.[anonymous] dps#
end-to-end data protection type settings
-
struct xnvme_spec_idfy_ns.[anonymous] nmic#
namespace multi-path I/O and namespace sharing capabilities
-
union xnvme_spec_idfy_ns.[anonymous] nsrescap#
reservation capabilities
-
union xnvme_spec_idfy_ns.[anonymous] fpi#
format progress indicator
-
union xnvme_spec_idfy_ns.[anonymous] dlfeat#
deallocate logical features
-
uint16_t nawun#
namespace atomic write unit normal
-
uint16_t nawupf#
namespace atomic write unit power fail
-
uint16_t nacwu#
namespace atomic compare & write unit
-
uint16_t nabsn#
namespace atomic boundary size normal
-
uint16_t nabo#
namespace atomic boundary offset
-
uint16_t nabspf#
namespace atomic boundary size power fail
-
uint16_t noiob#
namespace optimal I/O boundary in logical blocks
-
uint64_t nvmcap[2]#
NVM Capacity.
-
uint16_t npwg#
namespace preferred write granularity
-
uint16_t npwa#
namespace preferred write alignment
-
uint16_t npdg#
namespace preferred deallocate granularity
-
uint16_t npda#
namespace preferred deallocate alignment
-
uint16_t nows#
namespace optimal write size
-
uint16_t mssrl#
maximum single source range length
-
uint32_t mcl#
max copy length
-
uint8_t msrc#
maximum source range count
-
uint8_t reserved81[11]#
-
uint32_t anagrpid#
ANA group identifier.
-
uint8_t reserved96[3]#
-
uint8_t nsattr#
namespace attributes
-
uint16_t nvmsetid#
NVM set identifier.
-
uint16_t endgid#
Endurance group identifier.
-
uint8_t nguid[16]#
namespace globally unique identifier
-
uint64_t eui64#
IEEE extended unique identifier.
-
struct xnvme_spec_lbaf lbaf[64]#
-
uint8_t vendor_specific[3712]#
LBA format support.
-
uint64_t nsze#
xnvme_spec_io_mgmt_cmd#
-
struct xnvme_spec_io_mgmt_cmd#
NVMe Command Accessors for I/O management.
Public Members
-
union xnvme_spec_io_mgmt_cmd.[anonymous] [anonymous]#
-
union xnvme_spec_io_mgmt_cmd.[anonymous] [anonymous]#
xnvme_spec_io_mgmt_recv_cmd#
-
struct xnvme_spec_io_mgmt_recv_cmd#
NVMe Command Accessor for io management receive command.
xnvme_spec_io_mgmt_send_cmd#
-
struct xnvme_spec_io_mgmt_send_cmd#
NVMe Command Accessor for I/O management send.
xnvme_spec_kvs_cmd#
-
struct xnvme_spec_kvs_cmd#
NVMe Command Accessors for the KV Command Set.
See also
Key Value Command Set Specification Revision 1.0c, Section 3
Public Members
-
uint32_t cdw0#
-
uint32_t nsid#
-
uint64_t key#
KV key bits 0:63.
-
uint64_t mptr#
Reserverd for MPTR.
-
uint32_t cdw06#
< DPTR — data pointer
-
uint32_t cdw07#
-
uint32_t cdw08#
-
uint32_t cdw09#
-
uint32_t cdw10#
Host Buffer Size or Value Size.
-
struct xnvme_spec_kvs_cmd.[anonymous] cdw11#
-
uint32_t cdw12#
-
uint32_t cdw13#
-
uint64_t key_hi#
KV key bits 64:127.
-
uint32_t cdw0#
xnvme_spec_kvs_idfy#
-
struct xnvme_spec_kvs_idfy#
Public Members
-
union xnvme_spec_kvs_idfy.[anonymous] [anonymous]#
-
union xnvme_spec_kvs_idfy.[anonymous] [anonymous]#
xnvme_spec_kvs_idfy_ns#
-
struct xnvme_spec_kvs_idfy_ns#
Key Value Command Set identify namespace data structure.
See also
Key Value Command Set Specification Revision 1.0c, Figure 39
Public Members
-
uint64_t nsze#
Namespace Size.
-
uint8_t rsvd8[8]#
-
uint64_t nuse#
Namespace Utilization.
-
uint8_t nsfeat#
Namespace Features.
-
uint8_t nkvf#
Number of KV Formats.
-
uint8_t nmic#
Namespace Multi-path I/O and Namespace Sharing Capabilities.
-
uint8_t rescap#
Reservation Capabilities.
-
uint8_t fpi#
Format Progress Indicator.
-
uint8_t rsvd29[3]#
-
uint32_t novg#
Namespace Optimal Value Granularity.
-
uint32_t anagrpid#
ANA Group Identifier.
-
uint8_t rsvd40[3]#
-
uint8_t nsattr#
Namespace Attributes.
-
uint16_t nvmsetid#
NVM Set Identifier.
-
uint16_t endgid#
Endurance Group Identifier.
-
uint64_t nguid[2]#
Namespace Globally Unique Identifier.
-
uint64_t eui64#
IEEE Extended Unique Identifier.
-
struct xnvme_spec_kvs_idfy_ns_format kvf[16]#
KV Format 0 to 15.
-
uint8_t rsvd328[3512]#
-
uint8_t vs[256]#
-
uint64_t nsze#
xnvme_spec_kvs_idfy_ns_format#
-
struct xnvme_spec_kvs_idfy_ns_format#
Key Value Command Set KV Format data structure.
See also
Key Value Command Set Specification Revision 1.0c, Figure 40
xnvme_spec_lbaf#
-
struct xnvme_spec_lbaf#
xnvme_spec_log_erri_entry#
-
struct xnvme_spec_log_erri_entry#
NVMe get-log-page entry for error information.
NVMe 1.4 - Figure ?
xnvme_spec_log_fdp_conf#
-
struct xnvme_spec_log_fdp_conf#
NVMe FDP configurations log page.
xnvme_spec_log_fdp_events#
-
struct xnvme_spec_log_fdp_events#
NVMe FDP events log page.
Public Members
-
uint32_t nevents#
Number of FDP events.
-
uint8_t rsvd[60]#
-
struct xnvme_spec_fdp_event event[]#
-
uint32_t nevents#
xnvme_spec_log_fdp_stats#
-
struct xnvme_spec_log_fdp_stats#
NVMe FDP statistics log page.
xnvme_spec_log_health_entry#
-
struct xnvme_spec_log_health_entry#
NVMe get-log-page entry for error information.
NVMe 1.4: Figure 194
NOTE: using attribute((packed))__ as GCC does not like “uint16_t ct” for some reason. Without the packing it becomes 2 bytes larger
xnvme_spec_log_ruhu#
-
struct xnvme_spec_log_ruhu#
NVMe Reclaim unit handle usage log page.
Public Members
-
uint16_t nruh#
Number of Reclaim Unit Handles.
-
uint8_t rsvd[6]#
-
struct xnvme_spec_ruhu_desc ruhu_desc[]#
-
uint16_t nruh#
xnvme_spec_nvm_cmd#
-
struct xnvme_spec_nvm_cmd#
NVMe Command Accessors for the NVM Command Set.
Public Members
-
union xnvme_spec_nvm_cmd.[anonymous] [anonymous]#
-
union xnvme_spec_nvm_cmd.[anonymous] [anonymous]#
xnvme_spec_nvm_cmd_scopy#
-
struct xnvme_spec_nvm_cmd_scopy#
NVMe Command Accessor for command with opcode XNVME_SPEC_NVM_CMD_OPC_SCOPY.
Public Members
-
uint32_t cdw00_09[10]#
Command dword 0 to 9.
-
uint64_t sdlba#
Start Destination LBA.
-
uint32_t nr#
Number of Ranges.
-
uint32_t df#
Descriptor Format.
-
uint32_t prinfor#
Protection Info. Field Read.
-
uint32_t rsvd1#
-
uint32_t dtype#
Directive Type.
-
uint32_t rsvd2#
-
uint32_t prinfow#
Protection Info. Field Write.
-
uint32_t fua#
Force Unit Access.
-
uint32_t lr#
Limited Retry.
-
uint32_t rsvd3#
-
uint32_t dspec#
Directive Specific.
-
uint32_t ilbrt#
Initial Logical Block Ref. Tag.
-
uint32_t lbat#
Logical Block App. Tag.
-
uint32_t lbatm#
Logical Block App. Tag Mask.
-
uint32_t cdw00_09[10]#
xnvme_spec_nvm_cmd_scopy_fmt_srclen#
-
struct xnvme_spec_nvm_cmd_scopy_fmt_srclen#
Kernel format structure for scopy.
Note
Intruder alert!T his is not defined in the NVMe specification. Yet, it is provided here as though it was. It is intensionally done so to provide a format within the framework provided by NVMe.
xnvme_spec_nvm_compare#
-
struct xnvme_spec_nvm_compare#
Public Members
-
uint32_t cdw00_09[10]#
Command dword 0 to 9.
-
uint64_t slba#
Start LBA.
-
uint32_t nlb#
Number of logical blocks, zero-based.
-
uint32_t rsvd1#
-
uint32_t stc#
Storage Tag Check.
-
uint32_t rsvd2#
-
uint32_t prinfo#
Protection Information.
-
uint32_t fua#
Force Unit Access.
-
uint32_t lr#
Limited Retry.
-
uint32_t cdw_13#
Command dword 13.
-
uint32_t ilbrt#
Initial Logical Block Reference Tag.
-
uint32_t lbat#
Logical Block Application Tag.
-
uint32_t lbatm#
logical Block Application Tag Mask
-
uint32_t cdw00_09[10]#
xnvme_spec_nvm_idfy#
-
struct xnvme_spec_nvm_idfy#
Public Members
-
union xnvme_spec_nvm_idfy.[anonymous] [anonymous]#
-
union xnvme_spec_nvm_idfy.[anonymous] [anonymous]#
xnvme_spec_nvm_idfy_ctrlr#
-
struct xnvme_spec_nvm_idfy_ctrlr#
Representation of NVMe completion result for NVM command set I/O command set specific Identify Controller.
That is, for opcode XNVME_SPEC_OPC_IDFY(0x06) with XNVME_SPEC_IDFY_CTLR_IOCS(0x6)
Public Members
-
uint8_t vsl#
Verify Size Limit.
-
uint8_t wzsl#
Write Zeroes Size Limit.
-
uint8_t wusl#
Write Uncorrectable Size Limit.
-
uint8_t dmrl#
Dataset Management Ranges Limit.
-
uint32_t dmrsl#
Dataset Management Range Size Limit.
-
uint64_t dmsl#
Dataset Management Size Limit.
-
uint8_t reserved16[4080]#
-
uint8_t vsl#
xnvme_spec_nvm_idfy_ns#
-
struct xnvme_spec_nvm_idfy_ns#
Representation of NVMe completion result for NVM command set I/O command set specific Identify Namespace.
That is, for opcode XNVME_SPEC_OPC_IDFY(0x06) with XNVME_SPEC_IDFY_NS_IOCS(0x05)
Public Members
-
uint64_t lbstm#
Logical block storage tag mask.
-
union xnvme_spec_nvm_idfy_ns.[anonymous] pic#
Protection information capabilities.
-
uint8_t reserved9[3]#
-
struct xnvme_spec_elbaf elbaf[64]#
-
uint8_t reserved268[3828]#
-
uint64_t lbstm#
xnvme_spec_nvm_scopy_fmt_zero#
-
struct xnvme_spec_nvm_scopy_fmt_zero#
xnvme_spec_nvm_scopy_source_range#
-
struct xnvme_spec_nvm_scopy_source_range#
See also
Specification Section 6.TBD.1
Public Members
-
struct xnvme_spec_nvm_scopy_fmt_zero entry[XNVME_SPEC_NVM_SCOPY_NENTRY_MAX]#
-
struct xnvme_spec_nvm_scopy_fmt_zero entry[XNVME_SPEC_NVM_SCOPY_NENTRY_MAX]#
xnvme_spec_nvm_write_zeroes#
-
struct xnvme_spec_nvm_write_zeroes#
Public Members
-
uint32_t cdw00_09[10]#
Command dword 0 to 9.
-
uint64_t slba#
Start LBA.
-
uint32_t nlb#
Number of logical blocks, zero-based.
-
uint32_t rsvd1#
-
uint32_t stc#
Storage Tag Check.
-
uint32_t deac#
Dealocate.
-
uint32_t prinfo#
Protection Info.
-
uint32_t fua#
Force Unit Access.
-
uint32_t lr#
Limited Retry.
-
uint32_t cdw_13#
Command dword 13.
-
uint32_t ilbrt#
Initial Logical Block Reference Tag.
-
uint32_t lbat#
Logical Block Application Tag.
-
uint32_t lbatm#
logical Block Application Tag Mask
-
uint32_t cdw00_09[10]#
xnvme_spec_power_state#
-
struct xnvme_spec_power_state#
Public Members
-
uint16_t mp#
-
uint8_t reserved1#
-
uint8_t mps#
-
uint8_t nops#
-
uint8_t reserved2#
-
uint32_t enlat#
-
uint32_t exlat#
-
uint8_t rrt#
-
uint8_t reserved3#
-
uint8_t rrl#
-
uint8_t reserved4#
-
uint8_t rwt#
-
uint8_t reserved5#
-
uint8_t rwl#
-
uint8_t reserved6#
-
uint16_t idlp#
-
uint8_t reserved7#
-
uint8_t ips#
-
uint8_t reserved8#
-
uint16_t actp#
-
uint8_t apw#
-
uint8_t reserved9#
-
uint8_t aps#
-
uint8_t reserved10[9]#
-
uint16_t mp#
xnvme_spec_ruh_desc#
-
struct xnvme_spec_ruh_desc#
NVMe Reclaim unit handle descriptor.
xnvme_spec_ruhs#
-
struct xnvme_spec_ruhs#
NVMe Reclaim Unit Handle Status.
Public Members
-
uint8_t rsvd[14]#
-
uint16_t nruhsd#
Number of Reclaim Unit Handle Status Descriptors.
-
struct xnvme_spec_ruhs_desc desc[]#
-
uint8_t rsvd[14]#
xnvme_spec_ruhs_desc#
-
struct xnvme_spec_ruhs_desc#
NVMe Reclaim unit handle status descriptor.
xnvme_spec_ruhu_desc#
-
struct xnvme_spec_ruhu_desc#
NVMe Reclaim unit handle usage descriptor.
xnvme_spec_sgl_descriptor#
-
struct xnvme_spec_sgl_descriptor#
SGL descriptor.
xnvme_spec_status#
-
struct xnvme_spec_status#
NVMe Command Completion Status field.
Public Members
-
union xnvme_spec_status.[anonymous] [anonymous]#
-
union xnvme_spec_status.[anonymous] [anonymous]#
xnvme_spec_streams_dir_gs#
-
struct xnvme_spec_streams_dir_gs#
This structure holds the get status data structure for streams directive.
xnvme_spec_streams_dir_rp#
-
struct xnvme_spec_streams_dir_rp#
This structure holds the return parameters data structure for streams directive.
Public Members
-
uint16_t msl#
Max streams limit.
-
uint16_t nssa#
NVM subsystem streams available.
-
uint16_t nsso#
NVM subsystems streams open.
-
union xnvme_spec_streams_dir_rp.[anonymous] nssc#
-
uint8_t reserved1[9]#
-
uint32_t sws#
Stream write size.
-
uint16_t sgs#
Stream granularity size.
-
uint16_t nsa#
Namespace streams allocated.
-
uint16_t nso#
Namespace streams open.
-
uint8_t reserved2[6]#
-
uint16_t msl#
xnvme_spec_znd_cmd#
-
struct xnvme_spec_znd_cmd#
NVMe Command Accessors for the Zoned Command Set.
Public Members
-
union xnvme_spec_znd_cmd.[anonymous] [anonymous]#
-
union xnvme_spec_znd_cmd.[anonymous] [anonymous]#
xnvme_spec_znd_cmd_append#
-
struct xnvme_spec_znd_cmd_append#
NVMe Command Accessor for a command with opcode ZND_CMD_OPC_APPEND.
Public Members
-
uint32_t cdw00_09[10]#
Command dword 0 to 9.
-
uint64_t zslba#
SLBA: Start Logical Block Address.
-
uint32_t nlb#
NLB: Number of logical blocks.
-
uint32_t rsvd#
-
uint32_t dtype#
DT: Directive Type.
-
uint32_t prinfo#
PI: Protection Information Field.
-
uint32_t rsvd2#
-
uint32_t fua#
FUA: Force unit access.
-
uint32_t lr#
LR: Limited retry.
-
uint32_t cdw13_15[3]#
Command dword 13 to 15.
-
uint32_t cdw00_09[10]#
xnvme_spec_znd_cmd_mgmt_recv#
-
struct xnvme_spec_znd_cmd_mgmt_recv#
NVMe Command Accessor for a command with opcode XNVME_SPEC_ZND_OPC_MGMT_RECV.
See also
Public Members
-
uint32_t cdw00_09[10]#
Command dword 0 to 9.
-
uint64_t slba#
Start LBA.
-
uint32_t ndwords#
Number of dwords in data-payload.
-
uint32_t zra#
Zone Receive Action.
-
uint32_t zrasf#
Zone Receive Action Specific Field.
-
uint32_t partial#
Partial.
-
uint32_t rsvd#
-
uint64_t addrs_dst#
destination addresses
-
uint32_t cdw00_09[10]#
xnvme_spec_znd_cmd_mgmt_send#
-
struct xnvme_spec_znd_cmd_mgmt_send#
NVMe Command Accessor for command with opcode ZND_CMD_OPC_MGMT_SEND.
Public Members
-
uint32_t cdw00_09[10]#
Command dword 0 to 9.
-
uint64_t slba#
Start LBA.
-
uint32_t nrange#
Number of ranges <= 32.
-
uint32_t zsa#
Zone Send Action.
-
uint32_t select_all#
Select All, that is, ignore the slba, affects all LBAs.
-
uint32_t zsaso#
Zone Send Action Specific Option.
-
uint32_t rsvd#
-
uint32_t cdw14_15[2]#
Command dword 14 to 15.
-
uint32_t cdw00_09[10]#
xnvme_spec_znd_descr#
-
struct xnvme_spec_znd_descr#
Zone Descriptor as reported by Zone Management Receive command.
See also
Specification Section 6.2.2.3, figure TBDZMRZD
xnvme_spec_znd_idfy#
-
struct xnvme_spec_znd_idfy#
Representation of the NVMe Identify Namespace command completion result.
- Todo:
merge this into the libxnvme_spec.h providing a one-stop shop for idfy-representation
Public Members
-
union xnvme_spec_znd_idfy.[anonymous] [anonymous]#
xnvme_spec_znd_idfy_ctrlr#
-
struct xnvme_spec_znd_idfy_ctrlr#
Identify controller accessor only for Zoned specific fields.
See also
Specification, section 3.1.2
xnvme_spec_znd_idfy_lbafe#
-
struct xnvme_spec_znd_idfy_lbafe#
LBA Format Extension.
See also
Specification Section 5.1.2, figure LBAFE
xnvme_spec_znd_idfy_ns#
-
struct xnvme_spec_znd_idfy_ns#
Zoned Command Set specific identify namespace data structure.
See also
TP4053, section 3
Public Members
-
union xnvme_spec_znd_idfy_ns.[anonymous] zoc#
Zone Operation Characteristics.
-
union xnvme_spec_znd_idfy_ns.[anonymous] ozcs#
-
uint32_t mar#
Maximum Active Resources.
-
uint32_t mor#
Maximum Open Resources.
-
uint32_t rrl#
Reset Recommended Limit.
-
uint32_t frl#
Finish Recommended Limit.
-
uint8_t rsvd12[24]#
-
uint32_t numzrwa#
Number of ZRWA resources available to the namespace.
-
uint16_t zrwafg#
ZRWA Flush Granularity; in unit of LBAs.
-
uint16_t zrwas#
ZRWA Size; in unit of LBAs.
-
union xnvme_spec_znd_idfy_ns.[anonymous] zrwacap#
-
uint8_t rsvd53[2763]#
-
struct xnvme_spec_znd_idfy_lbafe lbafe[16]#
-
uint8_t rsvd3072[768]#
-
uint8_t vs[256]#
Vendor Specific.
-
union xnvme_spec_znd_idfy_ns.[anonymous] zoc#
xnvme_spec_znd_log_changes#
-
struct xnvme_spec_znd_log_changes#
Zone Identifier List as returned by get-log-page.
See also
Specification Section 5.3.1.1, figure TBDZONELIST
xnvme_spec_znd_report_hdr#
-
struct xnvme_spec_znd_report_hdr#
Report Zones Data Structure header.
The first 16 bytes of the two Report Zoned data structures
See also
Specification Section 6.2.2.1, figure TBDZMRRZ
See also
Specification Section 6.2.2.2, figure TBDZMRERZ
Functions#
xnvme_spec_cmd_fpr#
-
int xnvme_spec_cmd_fpr(FILE *stream, struct xnvme_spec_cmd *cmd, int opts)#
Prints the given :;xnvme_spec_cmd to the given output stream.
- Parameters:
stream – output stream used for printing
cmd – pointer to structure to print
opts – printer options, see xnvme_pr
- Returns:
On success, the number of characters printed is returned.
xnvme_spec_cmd_pr#
-
int xnvme_spec_cmd_pr(struct xnvme_spec_cmd *cmd, int opts)#
Prints the given :;xnvme_spec_cmd to stdout.
- Parameters:
cmd – pointer to structure to print
opts – printer options, see xnvme_pr
- Returns:
On success, the number of characters printed is returned.
xnvme_spec_drecv_idfy_pr#
-
int xnvme_spec_drecv_idfy_pr(struct xnvme_spec_idfy_dir_rp *idfy, int opts)#
Prints the given :;xnvme_spec_idfy_dir_rp to stdout.
- Parameters:
idfy – pointer to structure to print
opts – printer options, see xnvme_pr
- Returns:
On success, the number of characters printed is returned.
xnvme_spec_drecv_sar_pr#
-
int xnvme_spec_drecv_sar_pr(struct xnvme_spec_alloc_resource sar, int opts)#
Prints the given :;xnvme_spec_alloc_resource to stdout.
- Parameters:
sar – structure to print
opts – printer options, see xnvme_pr
- Returns:
On success, the number of characters printed is returned.
xnvme_spec_drecv_sgs_pr#
-
int xnvme_spec_drecv_sgs_pr(struct xnvme_spec_streams_dir_gs *sgs, int opts)#
Prints the given :;xnvme_spec_streams_dir_gs to stdout.
- Parameters:
sgs – pointer to structure to print
opts – printer options, see xnvme_pr
- Returns:
On success, the number of characters printed is returned.
xnvme_spec_drecv_srp_pr#
-
int xnvme_spec_drecv_srp_pr(struct xnvme_spec_streams_dir_rp *srp, int opts)#
Prints the given :;xnvme_spec_streams_dir_rp to stdout.
- Parameters:
srp – pointer to structure to print
opts – printer options, see xnvme_pr
- Returns:
On success, the number of characters printed is returned.
xnvme_spec_feat_fdp_events_pr#
-
int xnvme_spec_feat_fdp_events_pr(void *buf, struct xnvme_spec_feat feat, int opts)#
Prints the :;xnvme_spec_fdp_event_desc to the given output stream.
- Parameters:
buf – Buffer which contains xnvme_spec_fdp_event_desc
feat – to get number of events
opts – printer options, see xnvme_pr
- Returns:
On success, the number of characters printed is returned.
xnvme_spec_feat_fpr#
-
int xnvme_spec_feat_fpr(FILE *stream, uint8_t fid, struct xnvme_spec_feat feat, int opts)#
Prints the given :;xnvme_spec_feat to the given output stream.
- Parameters:
stream – output stream used for printing
fid – feature identifier
feat – feature values
opts – printer options, see xnvme_pr
- Returns:
On success, the number of characters printed is returned.
xnvme_spec_feat_pr#
-
int xnvme_spec_feat_pr(uint8_t fid, struct xnvme_spec_feat feat, int opts)#
Prints the given :;xnvme_spec_feat to the given output stream.
- Parameters:
fid – feature identifier
feat – feature values
opts – printer options, see xnvme_pr
- Returns:
On success, the number of characters printed is returned.
xnvme_spec_idfy_cs_fpr#
-
int xnvme_spec_idfy_cs_fpr(FILE *stream, const struct xnvme_spec_idfy_cs *idfy, int opts)#
xnvme_spec_idfy_cs_pr#
-
int xnvme_spec_idfy_cs_pr(const struct xnvme_spec_idfy_cs *idfy, int opts)#
xnvme_spec_idfy_ctrlr_fpr#
-
int xnvme_spec_idfy_ctrlr_fpr(FILE *stream, const struct xnvme_spec_idfy_ctrlr *idfy, int opts)#
Prints the given :;xnvme_spec_idfy_ctrlr to the given output stream.
- Parameters:
stream – output stream used for printing
idfy – pointer to structure to print
opts – printer options, see xnvme_pr
- Returns:
On success, the number of characters printed is returned.
xnvme_spec_idfy_ctrlr_pr#
-
int xnvme_spec_idfy_ctrlr_pr(const struct xnvme_spec_idfy_ctrlr *idfy, int opts)#
Prints the given :;xnvme_spec_idfy_ctrlr to stdout.
- Parameters:
idfy – pointer to structure to print
opts – printer options, see xnvme_pr
- Returns:
On success, the number of characters printed is returned.
xnvme_spec_idfy_ns_fpr#
-
int xnvme_spec_idfy_ns_fpr(FILE *stream, const struct xnvme_spec_idfy_ns *idfy, int opts)#
Prints the given :;xnvme_spec_idfy_ns to the given output stream.
- Parameters:
stream – output stream used for printing
idfy – pointer to structure to print
opts – printer options, see xnvme_pr
- Returns:
On success, the number of characters printed is returned.
xnvme_spec_idfy_ns_pr#
-
int xnvme_spec_idfy_ns_pr(const struct xnvme_spec_idfy_ns *idfy, int opts)#
Prints the given :;xnvme_spec_idfy_ns to stdout.
- Parameters:
idfy – pointer to structure to print
opts – printer options, see xnvme_pr
- Returns:
On success, the number of characters printed is returned.
xnvme_spec_kvs_idfy_ns_fpr#
-
int xnvme_spec_kvs_idfy_ns_fpr(FILE *stream, const struct xnvme_spec_kvs_idfy_ns *idfy, int opts)#
Prints the given xnvme_spec_kvs_idfy to the given output stream.
- Parameters:
stream – output stream used for printing
idfy – pointer to structure to print
opts – printer options, see xnvme_pr
- Returns:
On success, the number of characters printed is returned.
xnvme_spec_kvs_idfy_ns_pr#
-
int xnvme_spec_kvs_idfy_ns_pr(const struct xnvme_spec_kvs_idfy_ns *idfy, int opts)#
Prints the given :;xnvme_spec_kvs_idfy to stdout.
- Parameters:
idfy – pointer to structure to print
opts – printer options, see xnvme_pr
- Returns:
On success, the number of characters printed is returned.
xnvme_spec_log_erri_fpr#
-
int xnvme_spec_log_erri_fpr(FILE *stream, const struct xnvme_spec_log_erri_entry *log, int limit, int opts)#
Prints the given :;xnvme_spec_log_erri_entry to stdout.
- Parameters:
stream – output stream used for printing
log
limit
opts
- Returns:
On success, the number of characters printed is returned.
xnvme_spec_log_erri_pr#
-
int xnvme_spec_log_erri_pr(const struct xnvme_spec_log_erri_entry *log, int limit, int opts)#
Prints the given :;xnvme_spec_log_erri_entry to stdout.
- Parameters:
log
limit
opts – printer options, see xnvme_pr
- Returns:
On success, the number of characters printed is returned.
xnvme_spec_log_fdp_conf_pr#
-
int xnvme_spec_log_fdp_conf_pr(const struct xnvme_spec_log_fdp_conf *log, int opts)#
Prints the given :;xnvme_spec_log_fdp_conf to stdout.
- Parameters:
log
opts
- Returns:
On success, the number of characters printed is returned.
xnvme_spec_log_fdp_events_pr#
-
int xnvme_spec_log_fdp_events_pr(const struct xnvme_spec_log_fdp_events *log, int limit, int opts)#
Prints the given :;xnvme_spec_log_fdp_events_entry to stdout.
- Parameters:
log
limit
opts – printer options, see xnvme_pr
- Returns:
On success, the number of characters printed is returned.
xnvme_spec_log_fdp_stats_pr#
-
int xnvme_spec_log_fdp_stats_pr(const struct xnvme_spec_log_fdp_stats *log, int opts)#
Prints the given :;xnvme_spec_log_fdp_stats to stdout.
- Parameters:
log
opts
- Returns:
On success, the number of characters printed is returned.
xnvme_spec_log_health_fpr#
-
int xnvme_spec_log_health_fpr(FILE *stream, const struct xnvme_spec_log_health_entry *log, int opts)#
Prints the given :;xnvme_spec_log_health_entry to the given output stream.
- Parameters:
stream – output stream used for printing
log – pointer to the structure to print
opts – printer options, see xnvme_pr
- Returns:
On success, the number of characters printed is returned.
xnvme_spec_log_health_pr#
-
int xnvme_spec_log_health_pr(const struct xnvme_spec_log_health_entry *log, int opts)#
Prints the given :;xnvme_spec_log_health_entry to stdout.
- Parameters:
log
opts
- Returns:
On success, the number of characters printed is returned.
xnvme_spec_log_ruhu_pr#
-
int xnvme_spec_log_ruhu_pr(const struct xnvme_spec_log_ruhu *log, int limit, int opts)#
Prints the given :;xnvme_spec_log_ruhu to stdout.
- Parameters:
log
limit
opts – printer options, see xnvme_pr
- Returns:
On success, the number of characters printed is returned.
xnvme_spec_nvm_idfy_ctrlr_fpr#
-
int xnvme_spec_nvm_idfy_ctrlr_fpr(FILE *stream, struct xnvme_spec_nvm_idfy_ctrlr *idfy, int opts)#
Prints the given xnvme_spec_nvm_idfy_ctrlr to the given output stream.
- Parameters:
stream – output stream used for printing
idfy – pointer to the structure to print
opts – printer options, see xnvme_pr
- Returns:
On success, the number of characters printed is returned
xnvme_spec_nvm_idfy_ctrlr_pr#
-
int xnvme_spec_nvm_idfy_ctrlr_pr(struct xnvme_spec_nvm_idfy_ctrlr *idfy, int opts)#
Prints the given xnvme_spec_nvm_idfy_ctrlr to stdout.
- Parameters:
idfy – pointer to xnvme_spec_nvm_idfy_ctrlr
opts – printer options, see xnvme_pr
- Returns:
On success, the number of characters printed is returned
xnvme_spec_nvm_idfy_ns_fpr#
-
int xnvme_spec_nvm_idfy_ns_fpr(FILE *stream, struct xnvme_spec_nvm_idfy_ns *idfy, int opts)#
Prints the given xnvme_spec_nvm_idfy_ns to the given output stream.
Only fields specific to Logical Block Namespaces are printed by this function
- Parameters:
stream – output stream used for printing
idfy – pointer to the structure to print
opts – printer options, see xnvme_pr
- Returns:
On success, the number of characters printed is returned
xnvme_spec_nvm_idfy_ns_pr#
-
int xnvme_spec_nvm_idfy_ns_pr(struct xnvme_spec_nvm_idfy_ns *idfy, int opts)#
Prints the given xnvme_spec_nvm_idfy_ns to stdout.
- Parameters:
idfy – pointer to xnvme_spec_nvm_idfy_ns
opts – printer options, see xnvme_pr
- Returns:
On success, the number of characters printed is returned
xnvme_spec_nvm_scopy_fmt_zero_fpr#
-
int xnvme_spec_nvm_scopy_fmt_zero_fpr(FILE *stream, const struct xnvme_spec_nvm_scopy_fmt_zero *entry, int opts)#
xnvme_spec_nvm_scopy_fmt_zero_pr#
-
int xnvme_spec_nvm_scopy_fmt_zero_pr(const struct xnvme_spec_nvm_scopy_fmt_zero *entry, int opts)#
Prints the given xnvme_spec_nvm_scopy_fmt_zero to stdout.
- Parameters:
entry – pointer to structure to print
opts – printer options, see xnvme_pr
- Returns:
On success, the number of characters printed is returned
xnvme_spec_nvm_scopy_source_range_fpr#
-
int xnvme_spec_nvm_scopy_source_range_fpr(FILE *stream, const struct xnvme_spec_nvm_scopy_source_range *srange, uint8_t nr, int opts)#
Prints the given xnvme_spec_nvm_scopy_source_range to the given output stream.
- Parameters:
stream – output stream used for printing
srange – pointer to structure to print
nr – zero-based number of entries, at most XNVME_SPEC_NVM_SCOPY_NENTRY_MAX -1
opts – printer options, see xnvme_pr
- Returns:
On success, the number of characters printed is returned
xnvme_spec_nvm_scopy_source_range_pr#
-
int xnvme_spec_nvm_scopy_source_range_pr(const struct xnvme_spec_nvm_scopy_source_range *srange, uint8_t nr, int opts)#
Prints the given xnvme_spec_nvm_scopy_source_range to stdout.
- Parameters:
srange – pointer to structure to print
nr – nr=0: print XNVME_SPEC_NVM_SCOPY_NENTRY_MAX entries from the given , nr>0: print no more than nr
opts – printer options, see xnvme_pr
- Returns:
On success, the number of characters printed is returned
xnvme_spec_ruhs_pr#
-
int xnvme_spec_ruhs_pr(const struct xnvme_spec_ruhs *ruhs, int limit, int opts)#
Prints the given :;xnvme_spec_ruhs to stdout.
- Parameters:
ruhs
limit
opts – printer options, see xnvme_pr
- Returns:
On success, the number of characters printed is returned.
xnvme_spec_znd_descr_fpr#
-
int xnvme_spec_znd_descr_fpr(FILE *stream, const struct xnvme_spec_znd_descr *descr, int opts)#
Prints the given xnvme_spec_znd_descr to the given stream.
- Parameters:
stream – output stream used for printing
descr – the struct to print
opts – printer options, see xnvme_pr
- Returns:
On success, the number of characters printed is returned.
xnvme_spec_znd_descr_fpr_yaml#
-
int xnvme_spec_znd_descr_fpr_yaml(FILE *stream, const struct xnvme_spec_znd_descr *descr, int indent, const char *sep)#
xnvme_spec_znd_descr_pr#
-
int xnvme_spec_znd_descr_pr(const struct xnvme_spec_znd_descr *descr, int opts)#
Prints the given xnvme_spec_znd_descr to stdout.
- Parameters:
descr – the structure to print
opts – printer options, see xnvme_pr
- Returns:
On success, the number of characters printed is returned.
xnvme_spec_znd_idfy_ctrlr_fpr#
-
int xnvme_spec_znd_idfy_ctrlr_fpr(FILE *stream, struct xnvme_spec_znd_idfy_ctrlr *zctrlr, int opts)#
Prints the given xnvme_spec_znd_idfy_ctrlr to the given output stream.
Only fields specific to Zoned Namespaces are printed by this function
- Parameters:
stream – output stream used for printing
zctrlr – pointer to the structure to print
opts – printer options, see xnvme_pr
- Returns:
On success, the number of characters printed is returned
xnvme_spec_znd_idfy_ctrlr_pr#
-
int xnvme_spec_znd_idfy_ctrlr_pr(struct xnvme_spec_znd_idfy_ctrlr *zctrlr, int opts)#
Prints the given xnvme_spec_znd_idfy_ctrlr to the given output stream.
Only fields specific to Zoned Namespaces are printed by this function
- Parameters:
zctrlr – pointer to the structure to print
opts – printer options, see xnvme_pr
- Returns:
On success, the number of characters printed is returned
xnvme_spec_znd_idfy_lbafe_fpr#
-
int xnvme_spec_znd_idfy_lbafe_fpr(FILE *stream, struct xnvme_spec_znd_idfy_lbafe *zonef, int opts)#
Prints the given xnvme_spec_znd_idfy_lbafe to the given output stream.
- Parameters:
stream – output stream used for printing
zonef – pointer to structure to print
opts – printer options, see xnvme_pr
- Returns:
On success, the number of characters printed is returned
xnvme_spec_znd_idfy_ns_fpr#
-
int xnvme_spec_znd_idfy_ns_fpr(FILE *stream, struct xnvme_spec_znd_idfy_ns *zns, int opts)#
Prints the given xnvme_spec_znd_idfy_ns to the given output stream.
Only fields specific to Zoned Namespaces are printed by this function
- Parameters:
stream – output stream used for printing
zns – pointer to the structure to print
opts – printer options, see xnvme_pr
- Returns:
On success, the number of characters printed is returned
xnvme_spec_znd_idfy_ns_pr#
-
int xnvme_spec_znd_idfy_ns_pr(struct xnvme_spec_znd_idfy_ns *zns, int opts)#
Prints the given xnvme_spec_znd_idfy_ns to stdout.
- Parameters:
zns – pointer to xnvme_spec_znd_idfy_ns
opts – printer options, see xnvme_pr
- Returns:
On success, the number of characters printed is returned
xnvme_spec_znd_log_changes_fpr#
-
int xnvme_spec_znd_log_changes_fpr(FILE *stream, const struct xnvme_spec_znd_log_changes *changes, int opts)#
Prints the given xnvme_spec_znd_log_changes to the given output stream.
- Parameters:
stream – output stream used for printing
changes – pointer to subject to print
opts – printer options, see xnvme_pr
- Returns:
On success, the number of characters printed is returned.
xnvme_spec_znd_log_changes_pr#
-
int xnvme_spec_znd_log_changes_pr(const struct xnvme_spec_znd_log_changes *changes, int opts)#
Pretty-printer of xnvme_spec_znd_log_changes.
- Parameters:
changes – pointer to subject to print
opts – printer options, see xnvme_pr
- Returns:
On success, the number of characters printed is returned.
xnvme_spec_znd_report_hdr_fpr#
-
int xnvme_spec_znd_report_hdr_fpr(FILE *stream, const struct xnvme_spec_znd_report_hdr *hdr, int opts)#
Print the given xnvme_spec_znd_report_hdr to the given output stream.
- Parameters:
stream – output stream used for printing
hdr – the struct to print
opts – printer options, see xnvme_pr
- Returns:
On success, the number of characters printed is returned.
xnvme_spec_znd_report_hdr_pr#
-
int xnvme_spec_znd_report_hdr_pr(const struct xnvme_spec_znd_report_hdr *hdr, int opts)#
Print the given xnvme_spec_znd_report_hdr to the stdout.
- Parameters:
hdr – the struct to print
opts – printer options, see xnvme_pr
- Returns:
On success, the number of characters printed is returned.
Header#
/**
* libxnvme_spec - NVMe structs, enum, values and helper function declarations
*
* If an entity is defined in the NVMe specification, then an enum or struct
* should exist in this header file. The purpose of this is to provide a single
* point of entry for spec. definitions for the purpose of providing structs
* with accessors, possibly bit-fields, and enums for values such as command
* opcodes.
*
* Auxilary header files are provided for the different IO command-sets, e.g.
* ``libxnvme_nvm.h``, providing utility functions such as ``xnvme_nvm_read``,
* ``xnvme_nvm_write``, and similarly ``libxnvme_znd.h`` with utilities such as
* ``xnvme_znd_append``, ``xnvme_znd_mgmt_send``. These can also contain enums
* and structs, however, these are not based on definitions in the NVMe
* specification, rather, these build on the spec. definition in order to
* provide something sligthly more convenient to the user.
*
* A special class of utility functions are pretty-printers, all spec.
* defintions have two associated pretty-printers named by the type, suffixed
* by ``_fpr`` and ``_pr``, for example:
*
* - xnvme_spec_cpl_fpr(), prints the given ``struct xnvme_spec_cpl`` struct to the given fstream
* - xnvme_spec_cpl_pr(), prints the given ``struct xnvme_spec_cpl`` struct to stdout
*
* These functions are auto-generated and available by importing
* ``libxnvme_spec_pp.h``. Thus, when you see a definition in
* ``libxnvme_spec.h`` then you can count on always having a textual
* representation available for that definition by importing
* ``libxnvme_spec_pp.h``. You can also choose to add the ``libxnvme_pp.h``
* which includes pretty-printers for all enums and struct known by xNVMe.
*
* SPDX-FileCopyrightText: Samsung Electronics Co., Ltd
*
* SPDX-License-Identifier: BSD-3-Clause
*
* @headerfile libxnvme_spec.h
*/
/**
* NVMe PCIe BAR0 as-a-struct.
*
* @struct xnvme_spec_ctrlr_bar
*/
struct xnvme_spec_ctrlr_bar {
uint64_t cap;
uint32_t vs;
uint32_t intms;
uint32_t intmc;
uint32_t cc;
uint32_t rsvd24;
uint32_t csts;
uint32_t nssr;
uint32_t aqa;
uint64_t asq;
uint64_t acq;
uint32_t cmbloc;
uint32_t cmbsz;
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;
uint32_t pmrmscl;
uint32_t pmrmscu;
uint8_t css[484];
} __attribute__((__packed__));
/**
* NVMe Command Status Code Types
*
* @enum xnvme_spec_status_code_type
*/
enum xnvme_spec_status_code_type {
XNVME_STATUS_CODE_TYPE_GENERIC = 0x0, ///< Generic
XNVME_STATUS_CODE_TYPE_CMDSPEC = 0x1, ///< Command Specific
XNVME_STATUS_CODE_TYPE_MEDIA = 0x2, ///< Media and data integrity error
XNVME_STATUS_CODE_TYPE_PATH = 0x3, ///< Path related status
XNVME_STATUS_CODE_TYPE_VENDOR = 0x7, ///< Vendor specific
};
/**
* NVMe Command Status Code
*
* @enum xnvme_spec_status_code
*/
enum xnvme_spec_status_code {
// TODO: Add remaining status codes from spec
XNVME_STATUS_CODE_INVALID_FIELD = 0x02, ///< Invalid Field
};
/**
* NVMe Command Completion Status field
*
* @struct xnvme_spec_status
*/
struct xnvme_spec_status {
union {
struct {
uint16_t p : 1; ///< Phase tag
uint16_t sc : 8; ///< Status codes
uint16_t sct : 3; ///< Status code type
uint16_t rsvd2 : 2;
uint16_t m : 1; ///< More
uint16_t dnr : 1; ///< Do not retry
};
uint16_t val;
};
};
XNVME_STATIC_ASSERT(sizeof(struct xnvme_spec_status) == 2, "Incorrect size")
/**
* Completion Queue Entry
*
* @struct xnvme_spec_cpl
*/
struct xnvme_spec_cpl {
union {
struct {
/* dword 0 */
uint32_t cdw0; ///< command-specific
/* dword 1 */
uint32_t rsvd1;
};
uint64_t result; /* Combined result of cdw 0 and cdw 1 */
};
/* dword 2 */
uint16_t sqhd; ///< submission queue head pointer
uint16_t sqid; ///< submission queue identifier
/* dword 3 */
uint16_t cid; ///< command identifier
struct xnvme_spec_status status;
};
XNVME_STATIC_ASSERT(sizeof(struct xnvme_spec_cpl) == 16, "Incorrect size")
/**
* NVMe get-log-page entry for error information
*
* NVMe 1.4: Figure 194
*
* NOTE: using __attribute__((packed))__ as GCC does not like "uint16_t ct"
* for some reason. Without the packing it becomes 2 bytes larger
*
* @struct xnvme_spec_log_health_entry
*/
struct __attribute__((packed)) xnvme_spec_log_health_entry {
uint8_t crit_warn; ///< Critical Warning
uint16_t comp_temp; ///< Composite Temperature (Temp.)
uint8_t avail_spare; ///< Available Spare (pct)
uint8_t avail_spare_thresh; ///< Available Spare Threshold (pct)
uint8_t pct_used; ///< Percentage used (pct), can exceed 100
uint8_t eg_crit_warn_sum; ///< Endurance Group Critical Warning Summary
uint8_t rsvd8[25];
uint8_t data_units_read[16]; ///< Data Units Read
uint8_t data_units_written[16]; ///< Data Units Written
uint8_t host_read_cmds[16]; ///< Host Read Commands
uint8_t host_write_cmds[16]; ///< Host Write Commands
uint8_t ctrlr_busy_time[16]; ///< Controller Busy Time
uint8_t pwr_cycles[16]; ///< Power Cycles
uint8_t pwr_on_hours[16]; ///< Power On Hours
uint8_t unsafe_shutdowns[16]; ///< Unsafe Shutdowns
uint8_t mdi_errs[16]; ///< Media and Data Integrity Errors
uint8_t nr_err_logs[16]; ///< Nr. of Error Information Log Entries (life)
uint32_t warn_comp_temp_time; ///< Warning Composite Temp. Time
uint32_t crit_comp_temp_time; ///< Critical Composite Temp. Time
uint16_t temp_sens[8]; ///< Temp. Sensor Temp. 1-8
uint32_t tmt1tc; ///< Thermal Management Temp. 1 Trans. Count
uint32_t tmt2tc; ///< Thermal Management Temp. 2 Trans. Count
uint32_t tttmt1; ///< Total Time for Thermal Mgmt. Temp. 1
uint32_t tttmt2; ///< Total Time for Thermal Mgmt. Temp. 2
uint8_t rsvd[280];
};
XNVME_STATIC_ASSERT(sizeof(struct xnvme_spec_log_health_entry) == 512, "Incorrect size")
/**
* NVMe get-log-page entry for error information
*
* NVMe 1.4 - Figure ?
*
* @struct xnvme_spec_log_erri_entry
*/
struct xnvme_spec_log_erri_entry {
uint64_t ecnt;
uint16_t sqid;
uint16_t cid;
struct xnvme_spec_status status;
uint16_t eloc;
uint64_t lba;
uint32_t nsid;
uint8_t ven_si;
uint8_t trtype;
uint8_t reserved30[2];
uint64_t cmd_si;
uint16_t trtype_si;
uint8_t reserved42[22];
};
XNVME_STATIC_ASSERT(sizeof(struct xnvme_spec_log_erri_entry) == 64, "Incorrect size")
/**
* NVMe Reclaim unit handle descriptor
*
* @struct xnvme_spec_ruh_desc
*/
struct xnvme_spec_ruh_desc {
uint8_t ruht; ///< Reclaim unit handle type
uint8_t rsvd[3];
};
XNVME_STATIC_ASSERT(sizeof(struct xnvme_spec_ruh_desc) == 4, "Incorrect size")
/**
* NVMe FDP configuration descriptor
*
* @struct xnvme_spec_fdp_conf_desc
*/
struct xnvme_spec_fdp_conf_desc {
uint16_t ds;
/** FDP attributes */
union {
struct {
uint8_t rgif : 4; ///< Reclaim group identifier format
uint8_t fdpvwc : 1; ///< FDP volatile write cache
uint8_t rsvd1 : 2;
uint8_t fdpcv : 1; ///< FDP configuration valid
};
uint8_t val;
} fdpa;
uint8_t vss; ///< Vendor specific size
uint32_t nrg; ///< Number of reclaim groups
uint16_t nruh; ///< Number of reclaim unit handles
uint16_t maxpids; ///< Max placement identifiers
uint32_t nns; ///< Number of namespaces supported
uint64_t runs; ///< Reclaim unit nominal size
uint32_t erutl; ///< Estimated reclaim unit time limit
uint8_t rsvd28[36];
struct xnvme_spec_ruh_desc ruh_desc[];
};
XNVME_STATIC_ASSERT(sizeof(struct xnvme_spec_fdp_conf_desc) == 64, "Incorrect size")
/**
* NVMe FDP configurations log page
*
* @struct xnvme_spec_log_fdp_conf
*/
struct xnvme_spec_log_fdp_conf {
uint16_t ncfg; ///< Number of FDP configurations
uint8_t version;
uint8_t rsvd1;
uint32_t size;
uint8_t rsvd2[8];
struct xnvme_spec_fdp_conf_desc conf_desc[];
};
XNVME_STATIC_ASSERT(sizeof(struct xnvme_spec_log_fdp_conf) == 16, "Incorrect size")
/**
* NVMe Reclaim unit handle usage descriptor
*
* @struct xnvme_spec_ruhu_desc
*/
struct xnvme_spec_ruhu_desc {
uint8_t ruha; ///< Reclaim unit handle attributes
uint8_t rsvd[7];
};
XNVME_STATIC_ASSERT(sizeof(struct xnvme_spec_ruhu_desc) == 8, "Incorrect size")
/**
* NVMe Reclaim unit handle usage log page
*
* @struct xnvme_spec_log_ruhu
*/
struct xnvme_spec_log_ruhu {
uint16_t nruh; ///< Number of Reclaim Unit Handles
uint8_t rsvd[6];
struct xnvme_spec_ruhu_desc ruhu_desc[];
};
XNVME_STATIC_ASSERT(sizeof(struct xnvme_spec_log_ruhu) == 8, "Incorrect size")
/**
* NVMe FDP statistics log page
*
* @struct xnvme_spec_log_fdp_stats
*/
struct xnvme_spec_log_fdp_stats {
uint64_t hbmw[2]; ///< Host bytes with metadata written
uint64_t mbmw[2]; ///< Media bytes with metadata written
uint64_t mbe[2]; ///< Media bytes erased
uint8_t rsvd48[16];
};
XNVME_STATIC_ASSERT(sizeof(struct xnvme_spec_log_fdp_stats) == 64, "Incorrect size")
/**
* Media reallocated
*
* @struct xnvme_spec_fdp_event_media_reallocated
*/
struct __attribute__((packed)) xnvme_spec_fdp_event_media_reallocated {
/** Specific event flags */
union {
struct {
uint8_t lbav : 1; ///< LLBA valid
uint8_t rsvd : 7;
};
uint8_t val;
} sef;
uint8_t rsvd1;
uint16_t nlbam; ///< Number of LBAs moved
uint64_t lba; ///< Logical block address
uint8_t rsvd2[4];
};
XNVME_STATIC_ASSERT(sizeof(struct xnvme_spec_fdp_event_media_reallocated) == 16, "Incorrect size")
/**
* NVMe FDP event
*
* @struct xnvme_spec_fdp_event
*/
struct __attribute__((packed)) xnvme_spec_fdp_event {
uint8_t type; ///< Event type
/** FDP event flags */
union {
struct {
uint8_t piv : 1; ///< Placement identifier valid
uint8_t nsidv : 1; ///< NSID valid
uint8_t lv : 1; ///< Location valid
uint8_t rsvd1 : 5;
};
uint8_t val;
} fdpef;
uint16_t pid; ///< Placement identifier
uint64_t timestamp; ///< Event timestamp
uint32_t nsid; ///< Namespace identifier
uint8_t type_specific[16]; ///< Event type specific
uint16_t rgid; ///< Reclaim group identifier
uint16_t ruhid; ///< Reclaim unit handle identifier
uint8_t rsvd1[4];
uint8_t vs[24];
};
XNVME_STATIC_ASSERT(sizeof(struct xnvme_spec_fdp_event) == 64, "Incorrect size")
/**
* NVMe FDP events log page
*
* @struct xnvme_spec_log_fdp_events
*/
struct xnvme_spec_log_fdp_events {
uint32_t nevents; ///< Number of FDP events
uint8_t rsvd[60];
struct xnvme_spec_fdp_event event[];
};
XNVME_STATIC_ASSERT(sizeof(struct xnvme_spec_log_fdp_events) == 64, "Incorrect size")
/**
* NVMe FDP event descriptor
*
* @struct xnvme_spec_fdp_event_desc
*/
struct xnvme_spec_fdp_event_desc {
uint8_t type; ///< Event type
/** FDP event type attributes */
union {
struct {
uint8_t ee : 1; ///< FDP event enabled
uint8_t rsvd : 7;
};
uint8_t val;
} fdpeta;
};
XNVME_STATIC_ASSERT(sizeof(struct xnvme_spec_fdp_event_desc) == 2, "Incorrect size")
/**
* Identifiers (lpi) for NVMe get-log-page
*
* NVMe 1.4 - Figure ?
*
* @enum xnvme_spec_log_lpi
*/
enum xnvme_spec_log_lpi {
XNVME_SPEC_LOG_RSVD = 0x0, ///< XNVME_SPEC_LOG_RSVD
XNVME_SPEC_LOG_ERRI = 0x1, ///< XNVME_SPEC_LOG_ERRI
XNVME_SPEC_LOG_HEALTH = 0x2, ///< XNVME_SPEC_LOG_HEALTH
XNVME_SPEC_LOG_FW = 0x3, ///< XNVME_SPEC_LOG_FW
XNVME_SPEC_LOG_CHNS = 0x4, ///< XNVME_SPEC_LOG_CHNS
XNVME_SPEC_LOG_CSAE = 0x5, ///< XNVME_SPEC_LOG_CSAE
XNVME_SPEC_LOG_SELFTEST = 0x6, ///< XNVME_SPEC_LOG_SELFTEST
XNVME_SPEC_LOG_TELEHOST = 0x7, ///< XNVME_SPEC_LOG_TELEHOST
XNVME_SPEC_LOG_TELECTRLR = 0x8, ///< XNVME_SPEC_LOG_TELECTRLR
XNVME_SPEC_LOG_FDPCONF = 0x20, ///< XNVME_SPEC_LOG_FDPCONF
XNVME_SPEC_LOG_FDPRUHU = 0x21, ///< XNVME_SPEC_LOG_FDPRUHU
XNVME_SPEC_LOG_FDPSTATS = 0x22, ///< XNVME_SPEC_LOG_FDPSTATS
XNVME_SPEC_LOG_FDPEVENTS = 0x23, ///< XNVME_SPEC_LOG_FDPEVENTS
};
/**
* @enum xnvme_spec_io_mgmt_recv_mo
*/
enum xnvme_spec_io_mgmt_recv_mo {
// Reclaim Unit Handle Status
XNVME_SPEC_IO_MGMT_RECV_RUHS = 0x1,
};
/**
* NVMe Reclaim unit handle status descriptor
*
* @struct xnvme_spec_ruhs_desc
*/
struct xnvme_spec_ruhs_desc {
uint16_t pi; ///< Placement Identifier
uint16_t ruhi; ///< Reclaim Unit Handle Identifier
uint32_t earutr; ///< Estimated Active Reclaim Unit Time Remaining
uint64_t ruamw; ///< Reclaim Unit Available Media Writes
uint8_t rsvd[16];
};
XNVME_STATIC_ASSERT(sizeof(struct xnvme_spec_ruhs_desc) == 32, "Incorrect size")
/**
* NVMe Reclaim Unit Handle Status
*
* @struct xnvme_spec_ruhs
*/
struct xnvme_spec_ruhs {
uint8_t rsvd[14];
uint16_t nruhsd; ///< Number of Reclaim Unit Handle Status Descriptors
struct xnvme_spec_ruhs_desc desc[];
};
XNVME_STATIC_ASSERT(sizeof(struct xnvme_spec_ruhs) == 16, "Incorrect size")
/**
* @enum xnvme_spec_io_mgmt_send_mo
*/
enum xnvme_spec_io_mgmt_send_mo {
// Reclaim Unit Handle Update
XNVME_SPEC_IO_MGMT_SEND_RUHU = 0x1,
};
/**
* @enum xnvme_spec_idfy_cns
*/
enum xnvme_spec_idfy_cns {
XNVME_SPEC_IDFY_NS = 0x0, ///< XNVME_SPEC_IDFY_NS
XNVME_SPEC_IDFY_CTRLR = 0x1, ///< XNVME_SPEC_IDFY_CTRLR
XNVME_SPEC_IDFY_NSLIST = 0x2, ///< XNVME_SPEC_IDFY_NSLIST
XNVME_SPEC_IDFY_NSDSCR = 0x3, ///< XNVME_SPEC_IDFY_NSDSCR
XNVME_SPEC_IDFY_SETL = 0x4, ///< XNVME_SPEC_IDFY_SETL
XNVME_SPEC_IDFY_NS_IOCS = 0x05, ///< XNVME_SPEC_IDFY_NS_IOCS
XNVME_SPEC_IDFY_CTRLR_IOCS = 0x6, ///< XNVME_SPEC_IDFY_CTRLR_IOCS
XNVME_SPEC_IDFY_NSLIST_IOCS = 0x7, ///< XNVME_SPEC_IDFY_NSLIST_IOCS
XNVME_SPEC_IDFY_NSLIST_ALLOC = 0x10, ///< XNVME_SPEC_IDFY_NSLIST_ALLOC
XNVME_SPEC_IDFY_NS_ALLOC = 0x11, ///< XNVME_SPEC_IDFY_NS_ALLOC
XNVME_SPEC_IDFY_CTRLR_NS = 0x12, ///< XNVME_SPEC_IDFY_CTRLR_NS
XNVME_SPEC_IDFY_CTRLR_SUB = 0x13, ///< XNVME_SPEC_IDFY_CTRLR_SUB
XNVME_SPEC_IDFY_CTRLR_PRI = 0x14, ///< XNVME_SPEC_IDFY_CTRLR_PRI
XNVME_SPEC_IDFY_CTRLR_SEC = 0x15, ///< XNVME_SPEC_IDFY_CTRLR_SEC
XNVME_SPEC_IDFY_NSGRAN = 0x16, ///< XNVME_SPEC_IDFY_NSGRAN
XNVME_SPEC_IDFY_UUIDL = 0x17, ///< XNVME_SPEC_IDFY_UUIDL
XNVME_SPEC_IDFY_NSLIST_ALLOC_IOCS = 0x1A, ///< XNVME_SPEC_IDFY_NSLIST_ALLOC_IOCS
XNVME_SPEC_IDFY_NS_ALLOC_IOCS = 0x1B, ///< XNVME_SPEC_IDFY_NS_ALLOC_IOCS
XNVME_SPEC_IDFY_IOCS = 0x1C, ///< XNVME_SPEC_IDFY_IOCS
};
/**
* @struct xnvme_spec_lbaf
*/
struct xnvme_spec_lbaf {
uint16_t ms; ///< metadata size
uint8_t ds; ///< lba data size
uint8_t rp : 2; ///< relative performance
uint8_t rsvd : 6;
};
XNVME_STATIC_ASSERT(sizeof(struct xnvme_spec_lbaf) == 4, "Incorrect size")
/**
* Command Set Identifiers
*
* @see Specification Section 5.15.2.1, figure X1
*
* @enum xnvme_spec_csi
*/
enum xnvme_spec_csi {
XNVME_SPEC_CSI_NVM = 0x0, ///< XNVME_SPEC_CSI_NVM
XNVME_SPEC_CSI_KV = 0x1, ///< XNVME_SPEC_CSI_KV
XNVME_SPEC_CSI_ZONED = 0x2, ///< XNVME_SPEC_CSI_ZONED
};
/**
* Representation of NVMe completion result Identify Namespace
*
* That is, for opcode XNVME_SPEC_OPC_IDFY(0x06) with XNVME_SPEC_IDFY_NS(0x0)
*
* @struct xnvme_spec_idfy_ns
*/
struct xnvme_spec_idfy_ns {
uint64_t nsze; ///< namespace size
uint64_t ncap; ///< namespace capacity
uint64_t nuse; ///< namespace utilization
/** namespace features */
struct {
uint8_t thin_prov : 1; ///< thin provisioning
uint8_t ns_atomic_write_unit : 1; ///< NAWUN, NAWUPF, and NACWU
uint8_t dealloc_or_unwritten_error : 1;
uint8_t guid_never_reused : 1; ///< Non-zero NGUID and EUI64
uint8_t optimal_performance : 1; ///< NPWG, NPWA, NPDG, NPDA
uint8_t reserved1 : 3;
} nsfeat;
uint8_t nlbaf; ///< number of lba formats
/** formatted lba size */
struct {
uint8_t format : 4;
uint8_t extended : 1;
uint8_t format_msb : 2;
uint8_t reserved2 : 1;
} flbas;
/** metadata capabilities */
struct {
/** metadata can be transferred as part of data prp list */
uint8_t extended : 1;
/** metadata can be transferred with separate metadata pointer */
uint8_t pointer : 1;
/** reserved */
uint8_t reserved3 : 6;
} mc;
/** end-to-end data protection capabilities */
union {
struct {
/** protection information type 1 */
uint8_t pit1 : 1;
/** protection information type 2 */
uint8_t pit2 : 1;
/** protection information type 3 */
uint8_t pit3 : 1;
/** first eight bytes of metadata */
uint8_t md_start : 1;
/** last eight bytes of metadata */
uint8_t md_end : 1;
uint8_t reserved : 3;
};
uint8_t val;
} dpc;
/** end-to-end data protection type settings */
union {
struct {
/** protection information type */
uint8_t pit : 3;
/** 1 == protection info transferred at start of metadata */
/** 0 == protection info transferred at end of metadata */
uint8_t md_start : 1;
uint8_t reserved4 : 4;
};
uint8_t val;
} dps;
/** namespace multi-path I/O and namespace sharing capabilities */
struct {
uint8_t can_share : 1;
uint8_t reserved : 7;
} nmic;
/** reservation capabilities */
union {
struct {
/** supports persist through power loss */
uint8_t persist : 1;
/** supports write exclusive */
uint8_t write_exclusive : 1;
/** supports exclusive access */
uint8_t exclusive_access : 1;
/** supports write exclusive - registrants only */
uint8_t write_exclusive_reg_only : 1;
/** supports exclusive access - registrants only */
uint8_t exclusive_access_reg_only : 1;
/** supports write exclusive - all registrants */
uint8_t write_exclusive_all_reg : 1;
/** supports exclusive access - all registrants */
uint8_t exclusive_access_all_reg : 1;
/** supports ignore existing key */
uint8_t ignore_existing_key : 1;
};
uint8_t val;
} nsrescap;
/** format progress indicator */
union {
struct {
uint8_t percentage_remaining : 7;
uint8_t fpi_supported : 1;
};
uint8_t val;
} fpi;
/** deallocate logical features */
union {
struct {
/**
* Value read from deallocated blocks
*
* 000b = not reported
* 001b = all bytes 0x00
* 010b = all bytes 0xFF
*
*/
uint8_t read_value : 3;
/** Supports Deallocate bit in Write Zeroes */
uint8_t write_zero_deallocate : 1;
/**
* Guard field behavior for deallocated logical blocks
* 0: contains 0xFFFF
* 1: contains CRC for read value
*/
uint8_t guard_value : 1;
uint8_t reserved : 3;
} bits;
uint8_t val;
} dlfeat;
/** namespace atomic write unit normal */
uint16_t nawun;
/** namespace atomic write unit power fail */
uint16_t nawupf;
/** namespace atomic compare & write unit */
uint16_t nacwu;
/** namespace atomic boundary size normal */
uint16_t nabsn;
/** namespace atomic boundary offset */
uint16_t nabo;
/** namespace atomic boundary size power fail */
uint16_t nabspf;
/** namespace optimal I/O boundary in logical blocks */
uint16_t noiob;
uint64_t nvmcap[2]; ///< NVM Capacity
/** namespace preferred write granularity */
uint16_t npwg;
/** namespace preferred write alignment */
uint16_t npwa;
/** namespace preferred deallocate granularity */
uint16_t npdg;
/** namespace preferred deallocate alignment */
uint16_t npda;
/** namespace optimal write size */
uint16_t nows;
/** maximum single source range length */
uint16_t mssrl;
/** max copy length */
uint32_t mcl;
/** maximum source range count */
uint8_t msrc;
uint8_t reserved81[11];
/** ANA group identifier */
uint32_t anagrpid;
uint8_t reserved96[3];
/** namespace attributes */
uint8_t nsattr;
/** NVM set identifier */
uint16_t nvmsetid;
/** Endurance group identifier */
uint16_t endgid;
/** namespace globally unique identifier */
uint8_t nguid[16];
/** IEEE extended unique identifier */
uint64_t eui64;
struct xnvme_spec_lbaf lbaf[64]; /// LBA format support
uint8_t vendor_specific[3712];
};
XNVME_STATIC_ASSERT(sizeof(struct xnvme_spec_idfy_ns) == 4096, "Incorrect size")
struct xnvme_pif {
union {
struct {
uint16_t guard;
uint16_t app_tag;
uint32_t stor_ref_space;
} g16;
struct {
uint64_t guard;
uint16_t app_tag;
uint16_t stor_ref_space_p1;
uint32_t stor_ref_space_p2;
} g64;
};
};
XNVME_STATIC_ASSERT(XNVME_SIZEOF_MEMBER(struct xnvme_pif, g16) == 8, "Incorrect size");
XNVME_STATIC_ASSERT(XNVME_SIZEOF_MEMBER(struct xnvme_pif, g64) == 16, "Incorrect size");
/**
* @enum xnvme_spec_nvm_ns_pif
*/
enum xnvme_spec_nvm_ns_pif {
// 16 bit guard protection information
XNVME_SPEC_NVM_NS_16B_GUARD = 0x0,
// 32 bit guard protection information
XNVME_SPEC_NVM_NS_32B_GUARD = 0x1,
// 64 bit guard protection information
XNVME_SPEC_NVM_NS_64B_GUARD = 0x2,
};
/**
* @struct xnvme_spec_elbaf
*/
struct xnvme_spec_elbaf {
uint32_t sts : 7; ///< storage tag size
uint32_t pif : 2; ///< protection information format
uint32_t rsvd : 23;
};
XNVME_STATIC_ASSERT(sizeof(struct xnvme_spec_elbaf) == 4, "Incorrect size")
#define XNVME_SPEC_CTRLR_SN_LEN 20
#define XNVME_SPEC_CTRLR_MN_LEN 40
#define XNVME_SPEC_CTRLR_FR_LEN 8
/**
* @struct xnvme_spec_power_state
*/
struct xnvme_spec_power_state {
uint16_t mp; /* bits 15:00: maximum power */
uint8_t reserved1;
uint8_t mps : 1; /* bit 24: max power scale */
uint8_t nops : 1; /* bit 25: non-operational state */
uint8_t reserved2 : 6;
uint32_t enlat; /* bits 63:32: entry latency in microseconds */
uint32_t exlat; /* bits 95:64: exit latency in microseconds */
uint8_t rrt : 5; /* bits 100:96: relative read throughput */
uint8_t reserved3 : 3;
uint8_t rrl : 5; /* bits 108:104: relative read latency */
uint8_t reserved4 : 3;
uint8_t rwt : 5; /* bits 116:112: relative write throughput */
uint8_t reserved5 : 3;
uint8_t rwl : 5; /* bits 124:120: relative write latency */
uint8_t reserved6 : 3;
uint16_t idlp; /* bits 143:128: idle power */
uint8_t reserved7 : 6;
uint8_t ips : 2; /* bits 151:150: idle power scale */
uint8_t reserved8;
uint16_t actp; /* bits 175:160: active power */
uint8_t apw : 3; /* bits 178:176: active power workload */
uint8_t reserved9 : 3;
uint8_t aps : 2; /* bits 183:182: active power scale */
uint8_t reserved10[9];
};
XNVME_STATIC_ASSERT(sizeof(struct xnvme_spec_power_state) == 32, "Incorrect size")
/**
* @struct xnvme_spec_vs_register
*/
union xnvme_spec_vs_register {
struct {
uint32_t ter : 8; ///< Tertiary version
uint32_t mnr : 8; ///< Indicated Minor Version
uint32_t mjr : 16; ///< Indicated Major Version
} bits;
uint32_t val;
};
XNVME_STATIC_ASSERT(sizeof(union xnvme_spec_vs_register) == 4, "Incorrect size")
/**
* @struct xnvme_spec_idfy_ctrlr
*/
struct xnvme_spec_idfy_ctrlr {
/* bytes 0-255: controller capabilities and features */
uint16_t vid; ///< PCI Vendor ID
uint16_t ssvid; ///< PCI Subsystem Vendor ID
int8_t sn[XNVME_SPEC_CTRLR_SN_LEN]; ///< SerialNumber
int8_t mn[XNVME_SPEC_CTRLR_MN_LEN]; ///< Model Number
uint8_t fr[XNVME_SPEC_CTRLR_FR_LEN]; ///< Firmware Revision
uint8_t rab; ///< Recomm. Arbitration Burst
uint8_t ieee[3]; ///< IEEE OUI Identifier
/** controller multi-path I/O and namespace sharing capabilities */
union {
struct {
uint8_t multi_port : 1;
uint8_t multi_host : 1;
uint8_t sr_iov : 1;
uint8_t ana_rprt : 1;
uint8_t reserved : 4;
};
uint8_t val;
} cmic;
uint8_t mdts; ///< Maximum Data Transfer Size
uint16_t cntlid; ///< Controller ID
union xnvme_spec_vs_register ver; ///< Version
uint32_t rtd3r; ///< RTD3 Resume Latency
uint32_t rtd3e; ///< RTD3 Resume Latency
/** optional asynchronous events supported */
union {
struct {
uint32_t reserved1 : 8;
/** Supports sending Namespace Attribute Notices. */
uint32_t ns_attribute_notices : 1;
/** Supports sending Firmware Activation Notices. */
uint32_t fw_activation_notices : 1;
uint32_t reserved2 : 1;
/** Supports sending Asymmetric Namespace access Change Notices. */
uint32_t ana_notices : 1;
/** Supports sending Predictable Latency Event Aggregate Log Change
* Notices. */
uint32_t pleal_notices : 1;
/** Supports sending LBA Status Information Alert Notices. */
uint32_t lba_sia_notices : 1;
/** Supports sending Endurance Group Event Aggregate Log Change Notices. */
uint32_t egea_notices : 1;
/** Supports sending Normal NVM Subsystem Shutdown event. */
uint32_t normal_nvm_ss : 1;
uint32_t reserved3 : 11;
/** Supports Zone Descriptor Changed Notices/Changed Zoned List log page*/
uint32_t zone_changes : 1;
uint32_t reserved4 : 3;
/** Supports sending Discovery Log Page Change Notices. */
uint32_t discovery_log_notices : 1;
};
uint32_t val;
} oaes;
/** controller attributes */
union {
struct {
/** Supports 128-bit host identifier */
uint32_t host_id_exhid_supported : 1;
/** Supports non-operational power state permissive mode */
uint32_t non_operational_power_state_permissive_mode : 1;
/** Supports NVM sets */
uint32_t nvm_sets : 1;
/** Supports Read recovery levels */
uint32_t read_recovery_levels : 1;
/** Supports endurance groups */
uint32_t endurance_groups : 1;
/** Suports predictable latency mode */
uint32_t predictable_latency_mode : 1;
/** Supports Traffic based keep alive */
uint32_t tbkas : 1;
/** Supports Namespace granularity */
uint32_t namespace_granularity : 1;
/** Supports SQ associations */
uint32_t sq_associations : 1;
/** Supports UUID list */
uint32_t uuid_list : 1;
/** Supports multi-domain subsystem */
uint32_t multi_domain_subsystem : 1;
/** Supports fixed capacity management */
uint32_t fixed_capacity_management : 1;
/** Supports variable capacity management */
uint32_t variable_capacity_management : 1;
/** Supports delete endurance group */
uint32_t delete_endurance_group : 1;
/** Supports delete NVM set */
uint32_t delete_nvm_set : 1;
/** Supports Extended lba formats */
uint32_t extended_lba_formats : 1;
uint32_t reserved1 : 3;
/** Supports flexible data placement */
uint32_t flexible_data_placement : 1;
uint32_t reserved2 : 12;
};
uint32_t val;
} ctratt;
uint16_t rrls; ///< Read Recovery Levels Supported
uint8_t reserved_102[9];
uint8_t cntrltype; ///< Controller Type
uint8_t fguid[16]; ///< FRU Globally Unique Ident.
uint16_t crdt1; ///< Command Retry Delay Time1
uint16_t crdt2; ///< Command Retry Delay Time2
uint16_t crdt3; ///< Command Retry Delay Time3
uint8_t reserved_134[119];
/** NVM Subsystem Report */
union {
struct {
/* NVMe storage device */
uint8_t nvmesd : 1;
/* NVMe enclosure */
uint8_t nvmee : 1;
uint8_t nvmsr_rsvd : 6;
};
uint8_t val;
} nvmsr;
/** VPD Write Cycle Information */
union {
struct {
/* VPD Write Cycles Remaining */
uint8_t vwcr : 7;
/* VPD Write Cycles Remaining Valid */
uint8_t vwcrv : 1;
};
uint8_t val;
} vwci;
/** Management Endpoint Capabilities */
union {
struct {
/* SMBus/I2C Port Management Endpoint */
uint8_t smbusme : 1;
/* PCIe Port Management Endpoint */
uint8_t pcieme : 1;
uint8_t mec_rsvd : 6;
};
uint8_t val;
} mec;
/* bytes 256-511: admin command set attributes */
/** optional admin command support */
union {
struct {
/* supports security send/receive commands */
uint16_t security : 1;
/* supports format nvm command */
uint16_t format : 1;
/* supports firmware activate/download commands */
uint16_t firmware : 1;
/* supports ns manage/ns attach commands */
uint16_t ns_manage : 1;
/* supports device self test command */
uint16_t device_self_test : 1;
/* supports directives */
uint16_t directives : 1;
/* supports NVMe-MI Send/receive commands */
uint16_t nvme_mi : 1;
/** Supports virtualization management command */
uint16_t virtualization_management : 1;
/** Supports doorbell buffer config command */
uint16_t doorbell_buffer_config : 1;
/** Supports Get LBA status capability */
uint16_t lba_status : 1;
/** Supports command and feature lockdown capability */
uint16_t cmd_feature_lockdown : 1;
uint16_t oacs_rsvd : 5;
};
uint16_t val;
} oacs;
/** abort command limit */
uint8_t acl;
/** asynchronous event request limit */
uint8_t aerl;
/** firmware updates */
union {
struct {
/* first slot is read-only */
uint8_t slot1_ro : 1;
/* number of firmware slots */
uint8_t num_slots : 3;
/* support activation without reset */
uint8_t activation_without_reset : 1;
/* support multiple update detection */
uint8_t mul_update_detection : 1;
uint8_t frmw_rsvd : 2;
};
uint8_t val;
} frmw;
/** Log Page Attributes */
union {
struct {
/* per namespace smart/health log page */
uint8_t ns_smart : 1;
/* command effects log page */
uint8_t celp : 1;
/* extended data (32bit vs 12bit) for get log page */
uint8_t edlp : 1;
/* telemetry log pages and notices */
uint8_t telemetry : 1;
/* Persistent event log */
uint8_t pel : 1;
/* Miscellaneous log */
uint8_t mel : 1;
/* Data area 4 for telemetry */
uint8_t tel_da4 : 1;
uint8_t lpa_rsvd : 1;
};
uint8_t val;
} lpa;
uint8_t elpe; ///< Error Log Page Entries
uint8_t npss; ///< Number of Power States Supported
/** admin vendor specific command configuration */
union {
struct {
/* admin vendor specific commands use disk format */
uint8_t spec_format : 1;
uint8_t avscc_rsvd : 7;
};
uint8_t val;
} avscc;
/** autonomous power state transition attributes */
union {
struct {
uint8_t supported : 1;
uint8_t apsta_rsvd : 7;
};
uint8_t val;
} apsta;
uint16_t wctemp; ///< Warning Composite Temperature threshold
uint16_t cctemp; ///< Critical Composite Temperature threshold
uint16_t mtfa; ///< Maximum Time for Firmware Activation
uint32_t hmpre; ///< Host Memory Buffer Preferred size
uint32_t hmmin; ///< Host Memory Buffer Minimum size
/** total NVM capacity */
uint64_t tnvmcap[2];
/** unallocated NVM capacity */
uint64_t unvmcap[2];
/** replay protected memory block support */
union {
struct {
uint8_t num_rpmb_units : 3;
uint8_t auth_method : 3;
uint8_t reserved1 : 2;
uint8_t reserved2;
uint8_t total_size;
uint8_t access_size;
};
uint32_t val;
} rpmbs;
/** extended device self-test time (in minutes) */
uint16_t edstt;
/** device self-test options */
union {
struct {
/** Device supports only one device self-test operation at a time */
uint8_t one_only : 1;
uint8_t reserved : 7;
} bits;
uint8_t val;
} dsto;
/**
* Firmware update granularity
*
* 4KB units
* 0x00 = no information provided
* 0xFF = no restriction
*/
uint8_t fwug;
/**
* Keep Alive Support
*
* Granularity of keep alive timer in 100 ms units
* 0 = keep alive not supported
*/
uint16_t kas;
/** Host controlled thermal management attributes */
union {
struct {
uint16_t supported : 1;
uint16_t reserved : 15;
} bits;
uint16_t val;
} hctma;
uint16_t mntmt; ///< Minimum Thermal Management Temperature
uint16_t mxtmt; ///< Maximum Thermal Management Temperature
/** Sanitize capabilities */
union {
struct {
uint32_t crypto_erase : 1;
uint32_t block_erase : 1;
uint32_t overwrite : 1;
uint32_t reserved : 26;
uint32_t ndi : 1;
uint32_t nodmmas : 2;
} bits;
uint32_t val;
} sanicap;
uint32_t hmminds; ///< Host Memory Buffer Minimum Descriptor Entry Size
uint16_t hmmaxd; ///< Host Memory Maximum Descriptor Entries
uint16_t nsetidmax; ///< NVM Set Identifier Maximum
uint16_t endgidmax; ///< Endurance Group Identifier Maximum
uint8_t anatt; ///< ANA Transition Time
/** Asymmetric Namespace Access capabilities */
union {
struct {
uint8_t optimize : 1;
uint8_t non_optimize : 1;
uint8_t inaccessible : 1;
uint8_t persist_loss : 1;
uint8_t change : 1;
uint8_t reserved1 : 1;
uint8_t ns_anagrpid : 1;
uint8_t mgt_anagrpid : 1;
} bits;
uint8_t val;
} anacap;
uint32_t anagrpmax; ///< ANA Group Identifier Maximum
uint32_t nanagrpid; ///< Number of ANA Group Identifiers
uint32_t pels; ///< Persistent Event Log Size
uint16_t domain_identifier; ///< Domain Identifier
uint8_t reserved_358[10];
uint64_t megcap[2]; ///< Max Endurance Group Capacity
uint8_t reserved_384[128];
/* bytes 512-703: nvm command set attributes */
/** submission queue entry size */
union {
struct {
uint8_t min : 4;
uint8_t max : 4;
};
uint8_t val;
} sqes;
/** completion queue entry size */
union {
struct {
uint8_t min : 4;
uint8_t max : 4;
};
uint8_t val;
} cqes;
uint16_t maxcmd;
uint32_t nn; ///< Number of Namespaces
/** optional nvm command support */
union {
struct {
uint16_t compare : 1;
uint16_t write_unc : 1;
uint16_t dsm : 1;
uint16_t write_zeroes : 1;
uint16_t set_features_save : 1;
uint16_t reservations : 1;
uint16_t timestamp : 1;
uint16_t verify : 1;
uint16_t copy : 1;
uint16_t reserved : 7;
};
uint16_t val;
} oncs;
uint16_t fuses; ///< Fused Operation Support
/** format nvm attributes */
union {
struct {
uint8_t format_all_ns : 1;
uint8_t erase_all_ns : 1;
uint8_t crypto_erase_supported : 1;
uint8_t nsid_ffffffff : 1;
uint8_t reserved : 4;
};
uint8_t val;
} fna;
/** volatile write cache */
union {
struct {
uint8_t present : 1;
uint8_t flush_broadcast : 2;
uint8_t reserved : 5;
};
uint8_t val;
} vwc;
uint16_t awun; ///< Atomic Write Unit Normal
uint16_t awupf; ///< Atomic Write Unit Power Fail
uint8_t nvscc; ///< NVM vendor specific command configuration
uint8_t nwpc; ///< Namespace write protection capabilities
uint16_t acwu; ///< atomic compare & write unit
/** Copy descriptors formats supported */
union {
struct {
uint16_t format0 : 1;
uint16_t format1 : 1;
uint16_t reserved : 14;
};
uint16_t val;
} cdfs;
/** SGL support */
union {
struct {
uint32_t supported : 2;
uint32_t keyed_sgl : 1;
uint32_t reserved1 : 5;
uint32_t sgl_desc_threshold : 8;
uint32_t bit_bucket_descriptor : 1;
uint32_t metadata_pointer : 1;
uint32_t oversized_sgl : 1;
uint32_t metadata_address : 1;
uint32_t sgl_offset : 1;
uint32_t transport_sgl : 1;
uint32_t reserved2 : 10;
};
uint32_t val;
} sgls;
uint32_t mnan; ///< Maximum Number of Allowed Namespaces
uint64_t maxdna[2]; ///< Maximum Domain Namespace Attachments
uint32_t maxcna; ///< Maximum I/O Controllers Namespace Attachments
uint8_t reserved_564[204];
uint8_t subnqn[256]; ///< NVM Subsystems NVMe Qualified Name
uint8_t reserved_1024[768];
/** NVMe over Fabrics-specific fields */
struct {
/** I/O queue command capsule supported size (16-byte units) */
uint32_t ioccsz;
/** I/O queue response capsule supported size (16-byte units) */
uint32_t iorcsz;
/** In-capsule data offset (16-byte units) */
uint16_t icdoff;
/** Controller attributes */
struct {
uint8_t ctrlr_model : 1;
uint8_t reserved : 7;
} ctrattr;
/** Maximum SGL block descriptors (0 = no limit) */
uint8_t msdbd;
/** Optional Fabric Commands supported */
struct {
uint16_t disc_del : 1;
uint16_t reserved : 15;
} ofcs;
uint8_t reserved[242];
} nvmf_specific;
/* bytes 2048-3071: power state descriptors */
struct xnvme_spec_power_state psd[32];
/* bytes 3072-4095: vendor specific */
uint8_t vs[1024];
};
XNVME_STATIC_ASSERT(sizeof(struct xnvme_spec_idfy_ctrlr) == 4096, "Incorrect size")
/**
* Representation of I/O Command Set Vector
*
* See NVMe spec tbd, section xyz, for details
*
* @struct xnvme_spec_cs_vector
*/
struct xnvme_spec_cs_vector {
union {
struct {
uint64_t nvm : 1;
uint64_t kv : 1;
uint64_t zns : 1;
uint64_t rsvd : 61;
};
uint64_t val;
};
};
XNVME_STATIC_ASSERT(sizeof(struct xnvme_spec_cs_vector) == 8, "Incorrect size")
#define XNVME_SPEC_IDFY_CS_IOCSC_LEN 512
/**
* Representation of I/O Command Set data structure
*
* See NVMe spec tbd, section xyz, for details
*
* @struct xnvme_spec_idfy_cs
*/
struct xnvme_spec_idfy_cs {
// I/O Command Set Combinations
struct xnvme_spec_cs_vector iocsc[XNVME_SPEC_IDFY_CS_IOCSC_LEN];
};
XNVME_STATIC_ASSERT(sizeof(struct xnvme_spec_idfy_cs) == 4096, "Incorrect size")
/**
* NVMe completion result accessor
*
* TODO: clarify
*
* @struct xnvme_spec_idfy
*/
struct xnvme_spec_idfy {
union {
struct xnvme_spec_idfy_ctrlr ctrlr;
struct xnvme_spec_idfy_ns ns;
struct xnvme_spec_idfy_cs cs;
};
};
XNVME_STATIC_ASSERT(sizeof(struct xnvme_spec_idfy) == 4096, "Incorrect size")
/**
* NVMe Admin Command Opcodes
*
* @see specification Section xx, figure yy
*
* @enum xnvme_spec_adm_opc
*/
enum xnvme_spec_adm_opc {
XNVME_SPEC_ADM_OPC_LOG = 0x02, ///< XNVME_SPEC_ADM_OPC_LOG
XNVME_SPEC_ADM_OPC_IDFY = 0x06, ///< XNVME_SPEC_ADM_OPC_IDFY
XNVME_SPEC_ADM_OPC_SFEAT = 0x09, ///< XNVME_SPEC_ADM_OPC_SFEAT
XNVME_SPEC_ADM_OPC_GFEAT = 0x0A, ///< XNVME_SPEC_ADM_OPC_GFEAT
XNVME_SPEC_ADM_OPC_DSEND = 0x19, ///< XNVME_SPEC_ADM_OPC_DSEND
XNVME_SPEC_ADM_OPC_DRECV = 0x1A, ///< XNVME_SPEC_ADM_OPC_DRECV
};
/**
* NVMe Non-Volatile Memory Command Opcodes
*
* @see specification Section xx, figure yy
*
* @enum xnvme_spec_nvm_opc
*/
enum xnvme_spec_nvm_opc {
XNVME_SPEC_NVM_OPC_FLUSH = 0x00, ///< XNVME_SPEC_NVM_OPC_FLUSH
XNVME_SPEC_NVM_OPC_WRITE = 0x01, ///< XNVME_SPEC_NVM_OPC_WRITE
XNVME_SPEC_NVM_OPC_READ = 0x02, ///< XNVME_SPEC_NVM_OPC_READ
XNVME_SPEC_NVM_OPC_WRITE_UNCORRECTABLE = 0x04, ///< XNVME_SPEC_NVM_OPC_WRITE_UNCORRECTABLE
XNVME_SPEC_NVM_OPC_COMPARE = 0x05, ///< XNVME_SPEC_NVM_OPC_COMPARE
XNVME_SPEC_NVM_OPC_WRITE_ZEROES = 0x08, ///< XNVME_SPEC_NVM_OPC_WRITE_ZEROES
XNVME_SPEC_NVM_OPC_DATASET_MANAGEMENT = 0x09, ///< XNVME_SPEC_NVM_OPC_DATASET_MANAGEMENT
XNVME_SPEC_NVM_OPC_SCOPY = 0x19, ///< XNVME_SPEC_NVM_OPC_SCOPY
XNVME_SPEC_NVM_OPC_IO_MGMT_RECV = 0x12, ///< XNVME_SPEC_NVM_OPC_IO_MGMT
XNVME_SPEC_NVM_OPC_IO_MGMT_SEND = 0x1D, ///< XNVME_SPEC_NVM_OPC_IO_MGMT_SEND
XNVME_SPEC_NVM_OPC_FMT = 0x80, ///< XNVME_SPEC_NVM_OPC_FMT
XNVME_SPEC_NVM_OPC_SANITIZE = 0x84, ///< XNVME_SPEC_NVM_OPC_SANITIZE
};
/**
* NVMe Feature Identifiers
*
* TODO: expand these
*
* @enum xnvme_spec_feat_id
*/
enum xnvme_spec_feat_id {
XNVME_SPEC_FEAT_ARBITRATION = 0x1, ///< XNVME_SPEC_FEAT_ARBITRATION
XNVME_SPEC_FEAT_PWR_MGMT = 0x2, ///< XNVME_SPEC_FEAT_PWR_MGMT
XNVME_SPEC_FEAT_LBA_RANGETYPE = 0x3, ///< XNVME_SPEC_FEAT_LBA_RANGETYPE
XNVME_SPEC_FEAT_TEMP_THRESHOLD = 0x4, ///< XNVME_SPEC_FEAT_TEMP_THRESHOLD
XNVME_SPEC_FEAT_ERROR_RECOVERY = 0x5, ///< XNVME_SPEC_FEAT_ERROR_RECOVERY
XNVME_SPEC_FEAT_VWCACHE = 0x6, ///< XNVME_SPEC_FEAT_VWCACHE
XNVME_SPEC_FEAT_NQUEUES = 0x7, ///< XNVME_SPEC_FEAT_NQUEUES
XNVME_SPEC_FEAT_FDP_MODE = 0x1D, ///< XNVME_SPEC_FEAT_FDP_MODE
XNVME_SPEC_FEAT_FDP_EVENTS = 0x1E, ///< XNVME_SPEC_FEAT_FDP_EVENTS
};
/**
* @enum xnvme_spec_feat_sel
*/
enum xnvme_spec_feat_sel {
XNVME_SPEC_FEAT_SEL_CURRENT = 0x0, ///< XNVME_SPEC_FEAT_SEL_CURRENT
XNVME_SPEC_FEAT_SEL_DEFAULT = 0x1, ///< XNVME_SPEC_FEAT_SEL_DEFAULT
XNVME_SPEC_FEAT_SEL_SAVED = 0x2, ///< XNVME_SPEC_FEAT_SEL_SAVED
XNVME_SPEC_FEAT_SEL_SUPPORTED = 0x3 ///< XNVME_SPEC_FEAT_SEL_SUPPORTED
};
/**
* @enum xnvme_spec_dir_types
*/
enum xnvme_spec_dir_types {
XNVME_SPEC_DIR_IDENTIFY = 0x0, ///< XNVME_SPEC_DIR_IDENTIFY
XNVME_SPEC_DIR_STREAMS = 0x1, ///< XNVME_SPEC_DIR_STREAMS
};
/**
* @enum xnvme_spec_dsend_idfy_doper
*/
enum xnvme_spec_dsend_idfy_doper {
// Identify directive send enable directive
XNVME_SPEC_DSEND_IDFY_ENDIR = 0x1,
};
/**
* @enum xnvme_spec_dsend_streams_doper
*/
enum xnvme_spec_dsend_streams_doper {
// Streams directive send, release identifier
XNVME_SPEC_DSEND_STREAMS_RELID = 0x1,
// Streams directive send, release resources
XNVME_SPEC_DSEND_STREAMS_RELRS = 0x2,
};
/**
* @enum xnvme_spec_drecv_idfy_doper
*/
enum xnvme_spec_drecv_idfy_doper {
// Identify directive receive return parameters
XNVME_SPEC_DRECV_IDFY_RETPR = 0x1,
};
/**
* @enum xnvme_spec_drecv_streams_doper
*/
enum xnvme_spec_drecv_streams_doper {
// Streams directive receive, return parameters
XNVME_SPEC_DRECV_STREAMS_RETPR = 0x1,
// Streams directive receive, get status
XNVME_SPEC_DRECV_STREAMS_GETST = 0x2,
// Streams directive receive, allocate resource
XNVME_SPEC_DRECV_STREAMS_ALLRS = 0x3,
};
/**
* This structure holds the return parameters data structure for identify directive
*
* @struct xnvme_spec_idfy_dir_rp
*/
struct xnvme_spec_idfy_dir_rp {
/* Directives Supported */
struct {
uint8_t identify : 1; ///< Identify
uint8_t streams : 1; ///< Streams
uint8_t data_placement : 1; ///< Data placement
uint8_t rsvd1 : 5;
uint8_t rsvd2[31];
} directives_supported;
/* Directives Enabled */
struct {
uint8_t identify : 1; ///< Identify
uint8_t streams : 1; ///< Streams
uint8_t data_placement : 1; ///< Data placement
uint8_t rsvd1 : 5;
uint8_t rsvd2[31];
} directives_enabled;
/* Directives Persistence */
struct {
uint8_t identify : 1; ///< Identify
uint8_t streams : 1; ///< Streams
uint8_t data_placement : 1; ///< Data placement
uint8_t rsvd1 : 5;
uint8_t rsvd2[31];
} directives_persistence;
uint8_t rsvd4[4000];
};
XNVME_STATIC_ASSERT(sizeof(struct xnvme_spec_idfy_dir_rp) == 4096, "Incorrect size")
/**
* This structure holds the return parameters data structure for streams directive
*
* @struct xnvme_spec_streams_dir_rp
*/
struct xnvme_spec_streams_dir_rp {
uint16_t msl; ///< Max streams limit
uint16_t nssa; ///< NVM subsystem streams available
uint16_t nsso; ///< NVM subsystems streams open
union {
struct {
/* Stream id shared by multiple zon-zero host identifier */
uint8_t multi_host : 1;
uint8_t reserved : 7;
} bits;
uint8_t val;
} nssc;
uint8_t reserved1[9];
uint32_t sws; ///< Stream write size
uint16_t sgs; ///< Stream granularity size
uint16_t nsa; ///< Namespace streams allocated
uint16_t nso; ///< Namespace streams open
uint8_t reserved2[6];
};
XNVME_STATIC_ASSERT(sizeof(struct xnvme_spec_streams_dir_rp) == 32, "Incorrect size")
/**
* This structure holds the get status data structure for streams directive
*
* @struct xnvme_spec_streams_dir_gs
*/
struct xnvme_spec_streams_dir_gs {
uint16_t open_sc; ///< Open stream count
uint16_t sid[]; ///< Stream identifier
};
/**
* This structure is encapsulation for values provided by allocate resource
*
* @struct xnvme_spec_alloc_resource
*/
struct xnvme_spec_alloc_resource {
union {
struct {
uint32_t nsa : 16; ///< Namespace streams allocated
uint32_t rsvd : 16;
} bits;
uint32_t val;
};
};
/**
* Encapsulation of NVMe/NVM features
*
* This structure is an accessor for Command Dword 11 of an Get Features Cmd.
* and encapsulation of values provided to the `xnvme_cmd_gfeat`.
*
* @struct xnvme_spec_feat
*/
struct xnvme_spec_feat {
union {
struct {
uint32_t tmpth : 16; ///< Temperature threshold
uint32_t tmpsel : 4; ///< Threshold Temp. Select
uint32_t thsel : 3; ///< Threshold Type Select
uint32_t rsvd : 9;
} temp_threshold;
struct {
uint32_t tler : 16;
uint32_t dulbe : 1;
uint32_t rsvd : 15;
} error_recovery; // Error recovery attributes
struct {
uint32_t nsqa : 16;
uint32_t ncqa : 16;
} nqueues;
struct {
uint32_t fdpe : 1; ///< Flexible data placement enable
uint32_t rsvd1 : 7;
uint32_t fdpci : 8; ///< Flexible data placement configuration index
uint32_t rsvd2 : 16;
} fdp_mode;
uint32_t val; ///< For constructing feature without accessors
};
};
XNVME_STATIC_ASSERT(sizeof(struct xnvme_spec_feat) == 4, "Incorrect size")
#define XNVME_SPEC_FEAT_ERROR_RECOVERY_DULBE(feat) (feat & (1 << 16))
#define XNVME_SPEC_FEAT_ERROR_RECOVERY_TLER(feat) (feat & 0xffff)
#define XNVME_SPEC_FEAT_MEDIA_FEEDBACK_HECC(feat) (feat & 0x1)
#define XNVME_SPEC_FEAT_MEDIA_FEEDBACK_VHECC(feat) (feat & 0x2)
/**
* Representation of DSM ranges as defined in NVM Express 1.3 Figure 207 Dataset
* Management Range Definition Figure 207
*
* @struct xnvme_spec_dsm_range
*/
struct xnvme_spec_dsm_range {
uint32_t cattr; ///< Context attributes
uint32_t llb; ///< Length in logical blocks (this is a 1-based value)
uint64_t slba; ///< Starting LBA
};
XNVME_STATIC_ASSERT(sizeof(struct xnvme_spec_dsm_range) == 16, "Incorrect size")
/**
* Enumeration of NVMe flags
*
* TODO: document
* @enum xnvme_spec_flag
*/
enum xnvme_spec_flag {
// Limited Retry (LR)
XNVME_SPEC_FLAG_LIMITED_RETRY = 0x1 << 15,
// Force Unit Access (FUA)
XNVME_SPEC_FLAG_FORCE_UNIT_ACCESS = 0x1 << 14,
// Protection Information Check (PRCK)
XNVME_SPEC_FLAG_PRINFO_PRCHK_REF = 0x1 << 10,
XNVME_SPEC_FLAG_PRINFO_PRCHK_APP = 0x1 << 11,
XNVME_SPEC_FLAG_PRINFO_PRCHK_GUARD = 0x1 << 12,
// Protection Information Action (PRACT)
XNVME_SPEC_FLAG_PRINFO_PRACT = 0x1 << 13,
};
/**
* @enum xnvme_nvme_sgl_descriptor_type
*/
enum xnvme_nvme_sgl_descriptor_type {
XNVME_SPEC_SGL_DESCR_TYPE_DATA_BLOCK = 0x0, ///< XNVME_SPEC_SGL_DESCR_TYPE_DATA_BLOCK
XNVME_SPEC_SGL_DESCR_TYPE_BIT_BUCKET = 0x1, ///< XNVME_SPEC_SGL_DESCR_TYPE_BIT_BUCKET
XNVME_SPEC_SGL_DESCR_TYPE_SEGMENT = 0x2, ///< XNVME_SPEC_SGL_DESCR_TYPE_SEGMENT
XNVME_SPEC_SGL_DESCR_TYPE_LAST_SEGMENT = 0x3, ///< XNVME_SPEC_SGL_DESCR_TYPE_LAST_SEGMENT
XNVME_SPEC_SGL_DESCR_TYPE_KEYED_DATA_BLOCK =
0x4, ///< XNVME_SPEC_SGL_DESCR_TYPE_KEYED_DATA_BLOCK
XNVME_SPEC_SGL_DESCR_TYPE_VENDOR_SPECIFIC =
0xf, ///< XNVME_SPEC_SGL_DESCR_TYPE_VENDOR_SPECIFIC
};
/**
* @enum xnvme_spec_sgl_descriptor_subtype
*/
enum xnvme_spec_sgl_descriptor_subtype {
XNVME_SPEC_SGL_DESCR_SUBTYPE_ADDRESS = 0x0, ///< XNVME_SPEC_SGL_DESCR_SUBTYPE_ADDRESS
XNVME_SPEC_SGL_DESCR_SUBTYPE_OFFSET = 0x1, ///< XNVME_SPEC_SGL_DESCR_SUBTYPE_OFFSET
};
/**
* SGL descriptor
*
* @struct xnvme_spec_sgl_descriptor
*/
struct xnvme_spec_sgl_descriptor {
uint64_t addr; ///< common field
union {
struct {
uint64_t rsvd : 56;
uint64_t subtype : 4; ///< SGL subtype
uint64_t type : 4; ///< SGL type
} generic;
struct {
uint64_t len : 32; ///< Length of entry
uint64_t rsvd : 24;
uint64_t subtype : 4; ///< SGL subtype
uint64_t type : 4; ///< SGL type
} unkeyed;
};
};
XNVME_STATIC_ASSERT(sizeof(struct xnvme_spec_sgl_descriptor) == 16, "Incorrect size")
/**
* PRP or SGL for Data Transfer field
*
* @enum xnvme_spec_psdt
*/
enum xnvme_spec_psdt {
XNVME_SPEC_PSDT_PRP = 0x0,
XNVME_SPEC_PSDT_SGL_MPTR_CONTIGUOUS = 0x1,
XNVME_SPEC_PSDT_SGL_MPTR_SGL = 0x2,
};
/**
* NVMe Command Accessor for common use of the 64byte NVMe command
*
* @see Specification section 4.3, figure 2
* @see Specification section 4.3, figure 3
*
* @struct xnvme_spec_cmd_common
*/
struct xnvme_spec_cmd_common {
/* cdw 00 */
uint16_t opcode : 8; ///< OPC: Command Opcode
uint16_t fuse : 2; ///< FUSE: Fused Operation
uint16_t rsvd : 4;
uint16_t psdt : 2;
uint16_t cid; ///< CID: Command Identifier
/* cdw 01 */
uint32_t nsid; ///< NSID: Namespace identifier
uint32_t cdw02;
uint32_t cdw03;
/* cdw 04-05 */
uint64_t mptr; ///< MPTR -- metadata pointer
/* cdw 06-09: */ ///< DPTR -- data pointer
union {
struct {
uint64_t prp1; ///< PRP entry 1
uint64_t prp2; ///< PRP entry 2
} prp;
struct xnvme_spec_sgl_descriptor sgl; ///< SGL
/**
* Accessors used by the IOCTL of the Linux Kernel NVMe driver
*/
struct {
uint64_t data;
uint32_t metadata_len;
uint32_t data_len;
} lnx_ioctl;
} dptr;
/* cdw 10 */
uint32_t ndt; ///< NDT: Number of dwords in Data Transfer
/* cdw 11 */
uint32_t ndm; ///< NDM: Number of dwords in Meta Transfer
uint32_t cdw12;
uint32_t cdw13;
uint32_t cdw14;
uint32_t cdw15;
};
XNVME_STATIC_ASSERT(sizeof(struct xnvme_spec_cmd_common) == 64, "Incorrect size")
/**
* NVMe Command Accessor for the Sanitize command
*
* @struct xnvme_spec_cmd_sanitize
*/
struct xnvme_spec_cmd_sanitize {
uint32_t cdw00_09[10]; ///< Command dword 0 to 9
uint32_t sanact : 3; ///< Sanitize Action
uint32_t ause : 1; ///< Allow unrestr. San. Exit
uint32_t owpass : 4; ///< Overwrite Pass Count
uint32_t oipbp : 1; ///< Overwrite Invert
uint32_t nodas : 1; ///< NoDeallocate after Sanitize
uint32_t rsvd : 22;
uint32_t ovrpat; ///< Overwrite Pattern
uint32_t cdw12_15[4]; ///< Command dword 12 to 15
};
XNVME_STATIC_ASSERT(sizeof(struct xnvme_spec_cmd_sanitize) == 64, "Incorrect size")
/**
* NVMe Command Accessor for the NVM-format command
*
* @struct xnvme_spec_cmd_format
*/
struct xnvme_spec_cmd_format {
uint32_t cdw00_09[10]; ///< Command dword 0 to 9
uint32_t lbafl : 4; ///< Least significant 4 bits of LBA Format Index
uint32_t mset : 1; ///< Meta-data settings
uint32_t pi : 3; ///< Protection Information
uint32_t pil : 1; ///< Protection Information Loc.
uint32_t ses : 3; ///< Secure Erase Settings
uint32_t lbafu : 2; ///< Most significant 2 bits of LBA Format Index
uint32_t rsvd : 18;
uint32_t cdw11_15[5]; ///< Command dword 11 to 15
};
XNVME_STATIC_ASSERT(sizeof(struct xnvme_spec_cmd_format) == 64, "Incorrect size")
/**
* NVMe Command Accessor for the get-features command
*
* @struct xnvme_spec_cmd_gfeat
*/
struct xnvme_spec_cmd_gfeat {
uint32_t cdw00_09[10]; ///< Command dword 0 to 9
union {
struct {
uint32_t fid : 8; ///< Feature Identifier
uint32_t sel : 3; ///< Select
uint32_t rsvd10 : 21;
};
uint32_t val;
} cdw10;
uint32_t cdw11; ///< Command dword 11
uint32_t cdw12_15[4]; ///< Command dword 12 to 15
};
XNVME_STATIC_ASSERT(sizeof(struct xnvme_spec_cmd_gfeat) == 64, "Incorrect size")
/**
* NVMe Command Accessor for the set-features command
*
* @struct xnvme_spec_cmd_sfeat
*/
struct xnvme_spec_cmd_sfeat {
uint32_t cdw00_09[10]; ///< Command dword 0 to 9
union {
struct {
uint32_t fid : 8; ///< Feature Identifier
uint32_t rsvd10 : 23;
uint32_t save : 1; ///< Save
};
uint32_t val;
} cdw10;
struct xnvme_spec_feat feat; ///< Feature
uint32_t cdw12; ///< Command dword 12
uint32_t cdw13_15[3]; ///< Command dword 13 to 15
};
XNVME_STATIC_ASSERT(sizeof(struct xnvme_spec_cmd_sfeat) == 64, "Incorrect size")
/**
* NVMe Command Accessor for the directive send command
*
* @struct xnvme_spec_cmd_dsend
*/
struct xnvme_spec_cmd_dsend {
uint32_t cdw00_09[10]; ///< Command dword 0 to 9
uint32_t numd; ///< Command dowrd 10
/* Command dword 11 */
uint32_t doper : 8; ///< Directive operation
uint32_t dtype : 8; ///< Directive type
uint32_t dspec : 16; ///< Directive specific
/* Command dword 12 */
union {
struct {
uint32_t endir : 1; ///< Enable directive
uint32_t rsvd1 : 7;
uint32_t tdtype : 8; ///< Target directive to enable / disable
uint32_t rsvd2 : 16;
};
uint32_t val;
} cdw12;
uint32_t cdw13_15[3]; ///< Command dword 13 to 15
};
XNVME_STATIC_ASSERT(sizeof(struct xnvme_spec_cmd_dsend) == 64, "Incorrect size")
/**
* NVMe Command Accessor for the directive receive command
*
* @struct xnvme_spec_cmd_recv
*/
struct xnvme_spec_cmd_drecv {
uint32_t cdw00_09[10]; ///< Command dword 0 to 9
uint32_t numd; ///< Command dowrd 10
/* Command dword 11 */
uint32_t doper : 8; ///< Directive operation
uint32_t dtype : 8; ///< Directive type
uint32_t dspec : 16; ///< Directive specific
/* Command dword 12 */
union {
struct {
uint32_t nsr : 16; ///< Namespace streams requested
uint32_t rsvd : 16;
};
uint32_t val;
} cdw12;
uint32_t cdw13_15[3]; ///< Command dword 13 to 15
};
XNVME_STATIC_ASSERT(sizeof(struct xnvme_spec_cmd_drecv) == 64, "Incorrect size")
/**
* NVMe Command Accessor for the identify command
*
* @struct xnvme_spec_cmd_idfy
*/
struct xnvme_spec_cmd_idfy {
uint32_t cdw00_09[10]; ///< Command dword 0 to 9
uint32_t cns : 8; ///< Controller or Namespace Structure
uint32_t rsvd1 : 8;
uint32_t cntid : 16; ///< Controller Identifier
uint32_t nvmsetid : 16; ///< NVM Set Identifier
uint32_t rsvd2 : 8;
uint32_t csi : 8; ///< Command Set Identifier
uint32_t cdw12_13[2]; ///< Command dword 12 to 13
uint32_t uuid : 7; ///< UUID index
uint32_t rsvd3 : 25;
uint32_t cdw15; ///< Command dword 15
};
XNVME_STATIC_ASSERT(sizeof(struct xnvme_spec_cmd_idfy) == 64, "Incorrect size")
/**
* NVMe Command Accessor for the get-log-page command
*
* @struct xnvme_spec_cmd_log
*/
struct xnvme_spec_cmd_log {
uint32_t cdw00_09[10]; ///< Command dword 0 to 9
uint32_t lid : 8; ///< Log Page Identifier
uint32_t lsp : 7; ///< Log Specific Field
uint32_t rae : 1; ///< Retain Async. Event
uint32_t numdl : 16; ///< Nr. of DWORDS lower-bits
uint32_t numdu : 16; ///< Nr. of DWORDS upper-bits
uint32_t lsi : 16; ///< Log Specific Identifier
uint32_t lpol; ///< Log-page offset lower 32bits
uint32_t lpou; ///< Log-page offset upper 32bits
uint32_t uuidx : 7; ///< UUID Index
uint32_t rsvd1 : 16;
uint32_t ot : 1; ///< Offset Type
uint32_t csi : 8; ///< Command Specific Identifier
uint32_t cdw15; ///< Command dword 15
};
XNVME_STATIC_ASSERT(sizeof(struct xnvme_spec_cmd_log) == 64, "Incorrect size")
/**
* NVMe Command Accessors for the NVM Command Set
*
* @struct xnvme_spec_cmd_nvm
*/
struct xnvme_spec_cmd_nvm {
uint32_t cdw00_09[10]; ///< Command dword 0 to 9
uint64_t slba; ///< SLBA: Start Logical Block Address
uint32_t nlb : 16; ///< NLB: Number of logical blocks
uint32_t rsvd : 4;
uint32_t dtype : 4; ///< DT: Directive Type
uint32_t rsvd2 : 2;
uint32_t prinfo : 4; ///< PI: Protection Information Field
uint32_t fua : 1; ///< FUA: Force unit access
uint32_t lr : 1; ///< LR: Limited retry
/* cdw 13 */
union {
struct {
uint32_t af : 4; ///< Access Frequency
uint32_t al : 2; ///< Access Latency
uint32_t sr : 1; ///< Sequential Request
uint32_t incom : 1; ///< Incompressible
uint32_t rsvd3 : 8;
uint32_t dspec : 16; ///< Directive Specific
};
uint32_t val;
} cdw13;
/* cdw 14 */
uint32_t ilbrt : 32; ///< Initial Logical Block Reference Tag
/* cdw 15 */
uint32_t lbat : 16; ///< Logical Block Application Tag
uint32_t lbatm : 16; ///< logical Block Application Tag Mask
};
XNVME_STATIC_ASSERT(sizeof(struct xnvme_spec_cmd_nvm) == 64, "Incorrect size")
/**
* The Dataset Management command is used by the host to indicate attributes for ranges of logical
* blocks
*
* @struct xnvme_spec_cmd_dsm
*/
struct xnvme_spec_cmd_dsm {
uint32_t cdw00_09[10]; ///< Command dword 0 to 9
// dword 10
uint32_t nr : 8; ///< NR: Number of Ranges
uint32_t rsvd1 : 24;
// dword 11
uint32_t idr : 1; ///< IDR: Integral Dataset for Read
uint32_t idw : 1; ///< IDW: Integral Dataset for Write
uint32_t ad : 1; ///< AD: Deallocate
uint32_t rsvd2 : 29;
uint32_t cdw12_15[4]; ///< Command dword 12 to 15
};
XNVME_STATIC_ASSERT(sizeof(struct xnvme_spec_cmd_dsm) == 64, "Incorrect size")
struct xnvme_spec_nvm_write_zeroes {
uint32_t cdw00_09[10]; ///< Command dword 0 to 9
/* cdw 10-11 */
uint64_t slba; ///< Start LBA
/* cdw 12 */
uint32_t nlb : 16; ///< Number of logical blocks, zero-based
uint32_t rsvd1 : 8;
uint32_t stc : 1; ///< Storage Tag Check
uint32_t deac : 1; ///< Dealocate
uint32_t prinfo : 4; ///< Protection Info.
uint32_t fua : 1; ///< Force Unit Access
uint32_t lr : 1; ///< Limited Retry
/* cdw 13 */
uint32_t cdw_13; ///< Command dword 13
/* cdw 14 */
uint32_t ilbrt : 32; ///< Initial Logical Block Reference Tag
/* cdw 15 */
uint32_t lbat : 16; ///< Logical Block Application Tag
uint32_t lbatm : 16; ///< logical Block Application Tag Mask
};
XNVME_STATIC_ASSERT(sizeof(struct xnvme_spec_nvm_write_zeroes) == 64, "Incorrect size")
/**
* Command-set specific status codes related to Logical Block Namespaces
*
* @see Specification Section 6.TBD.1, figure 355
*/
enum xnvme_spec_nvm_cmd_cpl_sc {
/// Copy Command Specific Status Values
XNVME_SPEC_NVM_CMD_CPL_SC_WRITE_TO_RONLY =
0x82, ///< XNVME_SPEC_NVM_CMD_CPL_SC_WRITE_TO_RONLY
};
/**
* @struct xnvme_spec_nvm_scopy_fmt_zero
*/
struct xnvme_spec_nvm_scopy_fmt_zero {
uint8_t rsvd0[8];
uint64_t slba; ///< Start LBA
uint32_t nlb : 16; ///< Number of logical blocks, zero-based
uint32_t rsvd20 : 16;
uint32_t eilbrt; ///< Expected Initial Logical Block Ref. Tag
uint32_t elbatm; ///< Expected Logical Block App. Tag Mask
uint32_t elbat; ///< Expected Logical Block App. Tag
};
XNVME_STATIC_ASSERT(sizeof(struct xnvme_spec_nvm_scopy_fmt_zero) == 32, "Incorrect size")
/**
* Structure conversion for support Kernel format
*
* @enum xnvme_nvm_scopy_fmt
*/
enum xnvme_nvm_scopy_fmt {
XNVME_NVM_SCOPY_FMT_ZERO =
0x1, ///< user provides entries formatted as ::XNVME_NVM_SCOPY_FMT_ZERO
XNVME_NVM_SCOPY_FMT_SRCLEN =
0x1 << 8, ///< user provides entries formatted as ::XNVME_NVM_SCOPY_FMT_SRCLEN
};
#define XNVME_SPEC_NVM_SCOPY_NENTRY_MAX 128
/**
* @see Specification Section 6.TBD.1
*/
struct xnvme_spec_nvm_scopy_source_range {
struct xnvme_spec_nvm_scopy_fmt_zero entry[XNVME_SPEC_NVM_SCOPY_NENTRY_MAX];
};
XNVME_STATIC_ASSERT(sizeof(struct xnvme_spec_nvm_scopy_source_range) == 4096, "Incorrect size")
/**
* NVMe Command Accessor for command with opcode XNVME_SPEC_NVM_CMD_OPC_SCOPY
*
* @struct xnvme_spec_nvm_cmd_scopy
*/
struct xnvme_spec_nvm_cmd_scopy {
uint32_t cdw00_09[10]; ///< Command dword 0 to 9
/* cdw 10-11 */
uint64_t sdlba; ///< Start Destination LBA
/* cdw 12 */
uint32_t nr : 8; ///< Number of Ranges
uint32_t df : 4; ///< Descriptor Format
uint32_t prinfor : 4; ///< Protection Info. Field Read
uint32_t rsvd1 : 4;
uint32_t dtype : 4; ///< Directive Type
uint32_t rsvd2 : 2;
uint32_t prinfow : 4; ///< Protection Info. Field Write
uint32_t fua : 1; ///< Force Unit Access
uint32_t lr : 1; ///< Limited Retry
/* cdw 13 */
uint32_t rsvd3 : 16;
uint32_t dspec : 16; ///< Directive Specific
/* cdw 14 */
uint32_t ilbrt; ///< Initial Logical Block Ref. Tag
/* cdw 15 */
uint32_t lbat : 16; ///< Logical Block App. Tag
uint32_t lbatm : 16; ///< Logical Block App. Tag Mask
};
XNVME_STATIC_ASSERT(sizeof(struct xnvme_spec_nvm_cmd_scopy) == 64, "Incorrect size")
/**
* Kernel format structure for scopy
*
* @note Intruder alert!T his is not defined in the NVMe specification. Yet, it is provided here as
* though it was. It is intensionally done so to provide a format within the framework provided by
* NVMe.
*
* @struct xnvme_spec_nvm_cmd_scopy_fmt_srclen
*/
struct xnvme_spec_nvm_cmd_scopy_fmt_srclen {
uint64_t start;
uint64_t len;
};
/**
* NVMe Command Accessors for the NVM Command Set
*
* @struct xnvme_spec_nvm_cmd
*/
struct xnvme_spec_nvm_cmd {
union {
struct xnvme_spec_nvm_cmd_scopy scopy;
};
};
XNVME_STATIC_ASSERT(sizeof(struct xnvme_spec_nvm_cmd) == 64, "Incorrect size")
/**
* Representation of NVMe completion result for NVM command set I/O command set
* specific Identify Controller
*
* That is, for opcode XNVME_SPEC_OPC_IDFY(0x06) with XNVME_SPEC_IDFY_CTLR_IOCS(0x6)
*
* @struct xnvme_spec_nvm_idfy_ctrlr
*/
struct xnvme_spec_nvm_idfy_ctrlr {
uint8_t vsl; ///< Verify Size Limit
uint8_t wzsl; ///< Write Zeroes Size Limit
uint8_t wusl; ///< Write Uncorrectable Size Limit
uint8_t dmrl; ///< Dataset Management Ranges Limit
uint32_t dmrsl; ///< Dataset Management Range Size Limit
uint64_t dmsl; ///< Dataset Management Size Limit
uint8_t reserved16[4080];
};
XNVME_STATIC_ASSERT(sizeof(struct xnvme_spec_nvm_idfy_ctrlr) == 4096, "Incorrect size")
/**
* Representation of NVMe completion result for NVM command set I/O command set
* specific Identify Namespace
*
* That is, for opcode XNVME_SPEC_OPC_IDFY(0x06) with XNVME_SPEC_IDFY_NS_IOCS(0x05)
*
* @struct xnvme_spec_nvm_idfy_ns
*/
struct xnvme_spec_nvm_idfy_ns {
uint64_t lbstm; ///< Logical block storage tag mask
/** Protection information capabilities */
union {
struct {
/** 16b guard protection information storage tag support */
uint8_t gpists : 1;
/** 16b guard protection information storage tag mask */
uint8_t gpistm : 1;
/** storage tag check read support */
uint8_t stcrs : 1;
uint8_t reserved3 : 5;
};
uint8_t val;
} pic;
uint8_t reserved9[3];
struct xnvme_spec_elbaf elbaf[64];
uint8_t reserved268[3828];
};
XNVME_STATIC_ASSERT(sizeof(struct xnvme_spec_nvm_idfy_ns) == 4096, "Incorrect size")
/**
* Representation of the NVMe Identify Namespace command completion result
*
* @struct xnvme_spec_znd_idfy
*/
struct xnvme_spec_nvm_idfy {
union {
struct xnvme_spec_idfy base;
struct xnvme_spec_nvm_idfy_ctrlr ctrlr;
struct xnvme_spec_nvm_idfy_ns ns;
};
};
XNVME_STATIC_ASSERT(sizeof(struct xnvme_spec_nvm_idfy) == 4096, "Incorrect size")
/**
* Log identifiers for Zoned Namespaces
*
* TODO: merge this with the set of log-identifiers
*
* @enum xnvme_spec_znd_log_lid
*/
enum xnvme_spec_znd_log_lid {
XNVME_SPEC_LOG_ZND_CHANGES = 0xBF, ///< ZND_CMD_LOG_CHANGES
};
/**
* Zoned Command Set opcodes
*
* @see Specification Section 6, figure ZONEDOPCODES
*
* @struct xnvme_spec_znd_opc
*/
enum xnvme_spec_znd_opc {
XNVME_SPEC_ZND_OPC_MGMT_SEND = 0x79, ///< XNVME_SPEC_ZND_OPC_MGMT_SEND
XNVME_SPEC_ZND_OPC_MGMT_RECV = 0x7A, ///< XNVME_SPEC_ZND_OPC_MGMT_RECV
XNVME_SPEC_ZND_OPC_APPEND = 0x7D, ///< XNVME_SPEC_ZND_OPC_APPEND
};
/**
* NVMe Command Accessor for command with opcode ZND_CMD_OPC_MGMT_SEND
*
* @struct xnvme_spec_znd_cmd_mgmt_send
*/
struct xnvme_spec_znd_cmd_mgmt_send {
uint32_t cdw00_09[10]; ///< Command dword 0 to 9
/* cdw 10-11 */
uint64_t slba; ///< Start LBA
/* cdw 12 */
uint32_t nrange; ///< Number of ranges <= 32
/* cdw 13 */
uint32_t zsa : 8; ///< Zone Send Action
uint32_t select_all : 1; ///< Select All, that is, ignore the slba, affects all LBAs
uint32_t zsaso : 1; ///< Zone Send Action Specific Option
uint32_t rsvd : 22;
uint32_t cdw14_15[2]; ///< Command dword 14 to 15
};
XNVME_STATIC_ASSERT(sizeof(struct xnvme_spec_znd_cmd_mgmt_send) == 64, "Incorrect size")
/**
* NVMe Command Accessor for a command with opcode XNVME_SPEC_ZND_OPC_MGMT_RECV
*
* @see enum xnvme_spec_znd_cmd_mgmt_recv
* @struct xnvme_spec_znd_cmd_mgmt_recv
*/
struct xnvme_spec_znd_cmd_mgmt_recv {
uint32_t cdw00_09[10]; ///< Command dword 0 to 9
/* cdw 10-11 */
uint64_t slba; ///< Start LBA
/* cdw 12 */
uint32_t ndwords; ///< Number of dwords in data-payload
/* cdw 13 */
uint32_t zra : 8; ///< Zone Receive Action
uint32_t zrasf : 8; ///< Zone Receive Action Specific Field
uint32_t partial : 1; ///< Partial
uint32_t rsvd : 15;
/* cdw 14-15 */
uint64_t addrs_dst; ///< destination addresses
};
XNVME_STATIC_ASSERT(sizeof(struct xnvme_spec_znd_cmd_mgmt_recv) == 64, "Incorrect size")
/**
* NVMe Command Accessor for a command with opcode ZND_CMD_OPC_APPEND
*
* @struct xnvme_spec_znd_cmd_append
*/
struct xnvme_spec_znd_cmd_append {
uint32_t cdw00_09[10]; ///< Command dword 0 to 9
uint64_t zslba; ///< SLBA: Start Logical Block Address
uint32_t nlb : 16; ///< NLB: Number of logical blocks
uint32_t rsvd : 4;
uint32_t dtype : 4; ///< DT: Directive Type
uint32_t prinfo : 4; ///< PI: Protection Information Field
uint32_t rsvd2 : 2;
uint32_t fua : 1; ///< FUA: Force unit access
uint32_t lr : 1; ///< LR: Limited retry
uint32_t cdw13_15[3]; ///< Command dword 13 to 15
};
XNVME_STATIC_ASSERT(sizeof(struct xnvme_spec_znd_cmd_append) == 64, "Incorrect size")
/**
* NVMe Command Accessors for the Zoned Command Set
*
* @struct xnvme_spec_znd_cmd
*/
struct xnvme_spec_znd_cmd {
union {
struct xnvme_spec_znd_cmd_mgmt_send mgmt_send;
struct xnvme_spec_znd_cmd_mgmt_recv mgmt_recv;
struct xnvme_spec_znd_cmd_append append;
};
};
XNVME_STATIC_ASSERT(sizeof(struct xnvme_spec_znd_cmd) == 64, "Incorrect size")
/**
* NVMe Command Accessor for io management receive command
*
* @struct xnvme_spec_io_mgmt_recv_cmd
*/
struct xnvme_spec_io_mgmt_recv_cmd {
uint32_t cdw00_09[10]; ///< Command dword 0 to 9
uint32_t mo : 8; ///< Management Operation
uint32_t rsvd : 8;
uint32_t mos : 16; ///< Management Operation Specific
uint32_t numd; ///< cdw11
uint32_t cdw12_15[4]; ///< Command dword 12 to 15
};
XNVME_STATIC_ASSERT(sizeof(struct xnvme_spec_io_mgmt_recv_cmd) == 64, "Incorrect size")
/**
* NVMe Command Accessor for I/O management send
*
* @struct xnvme_spec_io_mgmt_send_cmd
*/
struct xnvme_spec_io_mgmt_send_cmd {
uint32_t cdw00_09[10]; ///< Command dword 0 to 9
uint32_t mo : 8; ///< Management Operation
uint32_t rsvd : 8;
uint32_t mos : 16; ///< Management Operation Specific
uint32_t cdw11_15[5]; ///< Command dword 11 to 15
};
XNVME_STATIC_ASSERT(sizeof(struct xnvme_spec_io_mgmt_send_cmd) == 64, "Incorrect size")
/**
* NVMe Command Accessors for I/O management
*
* @struct xnvme_spec_io_mgmt_cmd
*/
struct xnvme_spec_io_mgmt_cmd {
union {
struct xnvme_spec_io_mgmt_recv_cmd mgmt_recv;
struct xnvme_spec_io_mgmt_send_cmd mgmt_send;
};
};
XNVME_STATIC_ASSERT(sizeof(struct xnvme_spec_io_mgmt_cmd) == 64, "Incorrect size")
/**
* KV Command Set opcodes
*
* @see Key Value Command Set Specification Revision 1.0c, Figure 5
*
* @struct xnvme_spec_kv_opc
*/
enum xnvme_spec_kv_opc {
XNVME_SPEC_KV_OPC_STORE = 0x01, ///< XNVME_SPEC_KV_OPC_STORE
XNVME_SPEC_KV_OPC_RETRIEVE = 0x02, ///< XNVME_SPEC_KV_OPC_RETRIEVE
XNVME_SPEC_KV_OPC_DELETE = 0x10, ///< XNVME_SPEC_KV_OPC_DELETE
XNVME_SPEC_KV_OPC_EXIST = 0x14, ///< XNVME_SPEC_KV_OPC_EXIST
XNVME_SPEC_KV_OPC_LIST = 0x06, ///< XNVME_SPEC_KV_OPC_LIST
};
/**
* Command-set specific status codes related to key-value Namespaces
*
* @see Key Value Command Set Specification Revision 1.0c, Figure 4
*
* @enum xnvme_spec_kv_status_code
*/
enum xnvme_spec_kv_status_code {
XNVME_SPEC_KV_SC_CAPACITY_EXCEEDED = 0x81, ///< XNVME_SPEC_KV_SC_CAPACITY_EXCEEDED
XNVME_SPEC_KV_SC_NS_NOT_READY = 0x82, ///< XNVME_SPEC_KV_SC_NS_NOT_READY
XNVME_SPEC_KV_SC_RESERVATION_CONFLICT = 0x83, ///< XNVME_SPEC_KV_SC_RESERVATION_CONFLICT
XNVME_SPEC_KV_SC_FORMAT_IN_PROGRESS = 0x84, ///< XNVME_SPEC_KV_SC_FORMAT_IN_PROGRESS
XNVME_SPEC_KV_SC_INVALID_VAL_SIZE = 0x85, ///< XNVME_SPEC_KV_SC_INVALID_VAL_SIZE
XNVME_SPEC_KV_SC_INVALID_KEY_SIZE = 0x86, ///< XNVME_SPEC_KV_SC_INVALID_KEY_SIZE
XNVME_SPEC_KV_SC_KEY_NOT_EXISTS = 0x87, ///< XNVME_SPEC_KV_SC_KEY_NOT_EXISTS
XNVME_SPEC_KV_SC_UNRECOVERED_ERR = 0x88, ///< XNVME_SPEC_KV_SC_UNRECOVERED_ERR
XNVME_SPEC_KV_SC_KEY_EXISTS = 0x89, ///< XNVME_SPEC_KV_SC_KEY_EXISTS
};
/**
* NVMe Command Accessors for the KV Command Set
*
* @see Key Value Command Set Specification Revision 1.0c, Section 3
*
* @struct xnvme_spec_kvs_cmd
*/
struct xnvme_spec_kvs_cmd {
uint32_t cdw0;
uint32_t nsid;
/* cdw 02-03 */
uint64_t key; ///< KV key bits 0:63
uint64_t mptr; ///< Reserverd for MPTR
/* cdw 06-09: */ ///< DPTR -- data pointer
uint32_t cdw06;
uint32_t cdw07;
uint32_t cdw08;
uint32_t cdw09;
uint32_t cdw10; ///< Host Buffer Size or Value Size
/* cdw 11 */
struct {
uint8_t kl;
uint8_t ro;
uint16_t rsvd;
} cdw11;
uint32_t cdw12;
uint32_t cdw13;
/* cdw 14-15 */
uint64_t key_hi; ///< KV key bits 64:127
};
XNVME_STATIC_ASSERT(sizeof(struct xnvme_spec_kvs_cmd) == 64, "Incorrect size")
struct xnvme_spec_nvm_compare {
uint32_t cdw00_09[10]; ///< Command dword 0 to 9
/* cdw 10-11 */
uint64_t slba; ///< Start LBA
/* cdw 12 */
uint32_t nlb : 16; ///< Number of logical blocks, zero-based
uint32_t rsvd1 : 8;
uint32_t stc : 1; ///< Storage Tag Check
uint32_t rsvd2 : 1;
uint32_t prinfo : 4; ///< Protection Information
uint32_t fua : 1; ///< Force Unit Access
uint32_t lr : 1; ///< Limited Retry
/* cdw 13 */
uint32_t cdw_13; ///< Command dword 13
/* cdw 14 */
uint32_t ilbrt : 32; ///< Initial Logical Block Reference Tag
/* cdw 15 */
uint32_t lbat : 16; ///< Logical Block Application Tag
uint32_t lbatm : 16; ///< logical Block Application Tag Mask
};
XNVME_STATIC_ASSERT(sizeof(struct xnvme_spec_nvm_compare) == 64, "Incorrect size")
/**
* NVMe Command Accessors
*
* @struct xnvme_spec_cmd
*/
struct xnvme_spec_cmd {
union {
struct xnvme_spec_cmd_common common;
struct xnvme_spec_cmd_sanitize sanitize;
struct xnvme_spec_cmd_format format;
struct xnvme_spec_cmd_log log;
struct xnvme_spec_cmd_gfeat gfeat;
struct xnvme_spec_cmd_sfeat sfeat;
struct xnvme_spec_cmd_idfy idfy;
struct xnvme_spec_cmd_dsend dsend;
struct xnvme_spec_cmd_drecv drecv;
struct xnvme_spec_cmd_nvm nvm;
struct xnvme_spec_cmd_dsm dsm;
struct xnvme_spec_nvm_cmd_scopy scopy;
struct xnvme_spec_nvm_write_zeroes write_zeroes;
struct xnvme_spec_znd_cmd znd;
struct xnvme_spec_io_mgmt_cmd mgmt;
struct xnvme_spec_kvs_cmd kvs;
struct xnvme_spec_nvm_compare compare;
};
};
XNVME_STATIC_ASSERT(sizeof(struct xnvme_spec_cmd) == 64, "Incorrect size")
/**
* Command-set specific status codes related to Zoned Namespaces
*
* @see Specification Section 4.1.1.1.1, figures GENERICSTATUSCODES and
* STATUSCODES
*
* @enum xnvme_spec_znd_status_code
*/
enum xnvme_spec_znd_status_code {
// Namespace Management
XNVME_SPEC_ZND_SC_INVALID_FORMAT = 0x7F, ///< ZND_SC_INVALID_FORMAT
/// Zoned Command Set
XNVME_SPEC_ZND_SC_INVALID_ZONE_OP = 0xB6, ///< ZND_SC_INVALID_ZONE_OP
XNVME_SPEC_ZND_SC_NOZRWA = 0xB7, ///< ZND_SC_NOZRWA
XNVME_SPEC_ZND_SC_BOUNDARY_ERROR = 0xB8, ///< ZND_SC_BOUNDARY_ERROR
XNVME_SPEC_ZND_SC_IS_FULL = 0xB9, ///< ZND_SC_IS_FULL
XNVME_SPEC_ZND_SC_IS_READONLY = 0xBA, ///< ZND_SC_IS_READONLY
XNVME_SPEC_ZND_SC_IS_OFFLINE = 0xBB, ///< ZND_SC_IS_OFFLINE
XNVME_SPEC_ZND_SC_INVALID_WRITE = 0xBC, ///< ZND_SC_INVALID_WRITE
XNVME_SPEC_ZND_SC_TOO_MANY_ACTIVE = 0xBD, ///< ZND_SC_TOO_MANY_ACTIVE
XNVME_SPEC_ZND_SC_TOO_MANY_OPEN = 0xBE, ///< ZND_SC_TOO_MANY_OPEN
XNVME_SPEC_ZND_SC_INVALID_TRANS = 0xBF, ///< ZND_SC_INVALID_TRANS
};
/**
* This is not defined in any spec... it would just seem sane if it was...
*
* @enum xnvme_spec_znd_mgmt_send_action_so
*/
enum xnvme_spec_znd_mgmt_send_action_so {
XNVME_SPEC_ZND_MGMT_OPEN_WITH_ZRWA = 0x1, ///< XNVME_SPEC_ZND_MGMT_OPEN_WITH_ZRWA
};
/**
* Actions for the Zone Management Send command
*
* @see Specification Section 6.1, figure TBDZMDW13
*
* @enum xnvme_spec_znd_cmd_mgmt_send_action
*/
enum xnvme_spec_znd_cmd_mgmt_send_action {
XNVME_SPEC_ZND_CMD_MGMT_SEND_CLOSE = 0x1, ///< XNVME_SPEC_ZND_CMD_MGMT_SEND_CLOSE
XNVME_SPEC_ZND_CMD_MGMT_SEND_FINISH = 0x2, ///< XNVME_SPEC_ZND_CMD_MGMT_SEND_FINISH
XNVME_SPEC_ZND_CMD_MGMT_SEND_OPEN = 0x3, ///< XNVME_SPEC_ZND_CMD_MGMT_SEND_OPEN
XNVME_SPEC_ZND_CMD_MGMT_SEND_RESET = 0x4, ///< XNVME_SPEC_ZND_CMD_MGMT_SEND_RESET
XNVME_SPEC_ZND_CMD_MGMT_SEND_OFFLINE = 0x5, ///< XNVME_SPEC_ZND_CMD_MGMT_SEND_OFFLINE
XNVME_SPEC_ZND_CMD_MGMT_SEND_DESCRIPTOR =
0x10, ///< XNVME_SPEC_ZND_CMD_MGMT_SEND_DESCRIPTOR
XNVME_SPEC_ZND_CMD_MGMT_SEND_FLUSH = 0x11, ///< XNVME_SPEC_ZND_CMD_MGMT_SEND_FLUSH
};
/**
* Zone Receive Action (::xnvme_spec_znd_cmd_mgmt_recv_action) specific field values
*
* @see Specification Section 6.2, figure TBDZMRDW13
*
* @enum xnvme_spec_znd_cmd_mgmt_recv_action_sf
*/
enum xnvme_spec_znd_cmd_mgmt_recv_action_sf {
XNVME_SPEC_ZND_CMD_MGMT_RECV_SF_ALL = 0x0, ///< XNVME_SPEC_ZND_CMD_MGMT_RECV_SF_ALL
XNVME_SPEC_ZND_CMD_MGMT_RECV_SF_EMPTY = 0x1, ///< XNVME_SPEC_ZND_CMD_MGMT_RECV_SF_EMPTY
XNVME_SPEC_ZND_CMD_MGMT_RECV_SF_IOPEN = 0x2, ///< XNVME_SPEC_ZND_CMD_MGMT_RECV_SF_IOPEN
XNVME_SPEC_ZND_CMD_MGMT_RECV_SF_EOPEN = 0x3, ///< XNVME_SPEC_ZND_CMD_MGMT_RECV_SF_EOPEN
XNVME_SPEC_ZND_CMD_MGMT_RECV_SF_CLOSED = 0x4, ///< XNVME_SPEC_ZND_CMD_MGMT_RECV_SF_CLOSED
XNVME_SPEC_ZND_CMD_MGMT_RECV_SF_FULL = 0x5, ///< XNVME_SPEC_ZND_CMD_MGMT_RECV_SF_FULL
XNVME_SPEC_ZND_CMD_MGMT_RECV_SF_RONLY = 0x6, ///< XNVME_SPEC_ZND_CMD_MGMT_RECV_SF_RONLY
XNVME_SPEC_ZND_CMD_MGMT_RECV_SF_OFFLINE = 0x7, ///< XNVME_SPEC_ZND_CMD_MGMT_RECV_SF_OFFLINE
};
/**
* Zoned Receive Action
*
* @see Specification Section 6.2, figure TBDZMRDW13
* @enum xnvme_spec_znd_cmd_mgmt_recv_action
*/
enum xnvme_spec_znd_cmd_mgmt_recv_action {
///< XNvME_SPEC_ZND_CMD_MGMT_RECV_ACTION_REPORT
XNVME_SPEC_ZND_CMD_MGMT_RECV_ACTION_REPORT = 0x0,
///< XNvME_SPEC_ZND_CMD_MGMT_RECV_ACTION_REPORT_EXTENDED
XNVME_SPEC_ZND_CMD_MGMT_RECV_ACTION_REPORT_EXTENDED = 0x1,
};
/**
* Zone Type
*
* @see Specification Section 6.2.2.3, figure TBDZMRD
* @enum xnvme_spec_znd_type
*/
enum xnvme_spec_znd_type {
XNVME_SPEC_ZND_TYPE_SEQWR = 0x2, ///< XNVME_SPEC_ZND_TYPE_SEQWR
};
/**
* Zone State as reported by Zone Management Receive
*
* @see Specification Section 6.2.2.3, figure TBDZMRZD
* @enum xnvme_spec_znd_state
*/
enum xnvme_spec_znd_state {
XNVME_SPEC_ZND_STATE_EMPTY = 0x1, ///< XNVME_SPEC_ZND_STATE_EMPTY
XNVME_SPEC_ZND_STATE_IOPEN = 0x2, ///< XNVME_SPEC_ZND_STATE_IOPEN
XNVME_SPEC_ZND_STATE_EOPEN = 0x3, ///< XNVME_SPEC_ZND_STATE_EOPEN
XNVME_SPEC_ZND_STATE_CLOSED = 0x4, ///< XNVME_SPEC_ZND_STATE_CLOSED
XNVME_SPEC_ZND_STATE_RONLY = 0xD, ///< XNVME_SPEC_ZND_STATE_RONLY
XNVME_SPEC_ZND_STATE_FULL = 0xE, ///< XNVME_SPEC_ZND_STATE_FULL
XNVME_SPEC_ZND_STATE_OFFLINE = 0xF, ///< XNVME_SPEC_ZND_STATE_OFFLINE
};
/**
* Identify controller accessor only for Zoned specific fields
*
* @see Specification, section 3.1.2
* @struct xnvme_spec_znd_idfy_ctrlr
*/
struct xnvme_spec_znd_idfy_ctrlr {
uint8_t zasl; ///< Zone Append Size Limit
uint8_t rsvd8[4095];
};
XNVME_STATIC_ASSERT(sizeof(struct xnvme_spec_znd_idfy_ctrlr) == 4096, "Incorrect size")
/**
* LBA Format Extension
*
* @see Specification Section 5.1.2, figure LBAFE
*
* @struct xnvme_spec_znd_idfy_lbafe
*/
struct xnvme_spec_znd_idfy_lbafe {
uint64_t zsze; ///< Zone Size in number of logical blocks
uint8_t zdes; ///< Zone Descriptor Extensions Size
uint8_t rsvd[7];
};
XNVME_STATIC_ASSERT(sizeof(struct xnvme_spec_znd_idfy_lbafe) == 16, "Incorrect size")
/**
* Zoned Command Set specific identify namespace data structure
*
* @see TP4053, section 3
* @struct xnvme_spec_znd_idfy_ns
*/
struct xnvme_spec_znd_idfy_ns {
union {
struct {
uint16_t vzcap : 1; ///< Variable Zone Capacity
uint16_t zae : 1; ///< Zone Active Excursions
uint16_t rsvd : 14;
} bits;
uint16_t val;
} zoc; ///< Zone Operation Characteristics
union {
struct {
uint16_t razb : 1; ///< Read Across zone boundaries
uint16_t zrwasup : 1; ///< Namespace supports Zone-Random-Write-Area (ZRWA)
uint16_t rsvd : 14;
} bits; ///< Optional Zoned Command Support
uint16_t val;
} ozcs;
uint32_t mar; ///< Maximum Active Resources
uint32_t mor; ///< Maximum Open Resources
uint32_t rrl; ///< Reset Recommended Limit
uint32_t frl; ///< Finish Recommended Limit
uint8_t rsvd12[24];
uint32_t numzrwa; ///< Number of ZRWA resources available to the namespace
uint16_t zrwafg; ///< ZRWA Flush Granularity; in unit of LBAs
uint16_t zrwas; ///< ZRWA Size; in unit of LBAs
union {
struct {
uint8_t expflushsup : 1; ///< Explicit Flush Supported
uint8_t rsvd0 : 7;
} bits;
uint8_t val;
} zrwacap;
uint8_t rsvd53[2763];
struct xnvme_spec_znd_idfy_lbafe lbafe[16];
uint8_t rsvd3072[768];
uint8_t vs[256]; ///< Vendor Specific
};
XNVME_STATIC_ASSERT(sizeof(struct xnvme_spec_znd_idfy_ns) == 4096, "Incorrect size")
/**
* Representation of the NVMe Identify Namespace command completion result
*
* @todo merge this into the libxnvme_spec.h providing a one-stop shop for idfy-representation
* @struct xnvme_spec_znd_idfy
*/
struct xnvme_spec_znd_idfy {
union {
struct xnvme_spec_idfy base;
struct xnvme_spec_znd_idfy_ctrlr zctrlr;
struct xnvme_spec_znd_idfy_ns zns;
};
};
XNVME_STATIC_ASSERT(sizeof(struct xnvme_spec_znd_idfy) == 4096, "Incorrect size")
#define ZND_CHANGES_LEN 511
/**
* Zone Identifier List as returned by get-log-page
*
* @see Specification Section 5.3.1.1, figure TBDZONELIST
*
* @struct xnvme_spec_znd_log_changes
*/
struct xnvme_spec_znd_log_changes {
uint16_t nidents; ///< Number of Zone Identifiers
uint8_t rsvd2[6];
uint64_t idents[ZND_CHANGES_LEN]; ///< Zone Identifiers
};
XNVME_STATIC_ASSERT(sizeof(struct xnvme_spec_znd_log_changes) == 4096, "Incorrect size")
/**
* Zone Descriptor as reported by Zone Management Receive command
*
* @see Specification Section 6.2.2.3, figure TBDZMRZD
*
* @struct xnvme_spec_znd_descr
*/
struct xnvme_spec_znd_descr {
uint8_t zt : 4; ///< Zone Type
uint8_t rsvd0 : 4;
uint8_t rsvd1 : 4;
uint8_t zs : 4; ///< Zone State
/**
* Zone Attributes
*/
union {
struct {
uint8_t zfc : 1; ///< Zone Finished by controller
uint8_t zfr : 1; ///< Zone Finish Recommended
uint8_t rzr : 1; ///< Reset Zone Recommended
uint8_t zrwav : 1; ///< Zone has a ZRWA associated
uint8_t rsvd3 : 3;
uint8_t zdev : 1; ///< Zone Descriptor Valid
};
uint8_t val;
} za;
uint8_t rsvd7[5];
uint64_t zcap; ///< Zone Capacity (in number of LBAs)
uint64_t zslba; ///< Zone Start LBA
uint64_t wp; ///< Write Pointer
uint8_t rsvd63[32];
};
XNVME_STATIC_ASSERT(sizeof(struct xnvme_spec_znd_descr) == 64, "Incorrect size")
/**
* Report Zones Data Structure header
*
* The first 16 bytes of the two Report Zoned data structures
*
* @see Specification Section 6.2.2.1, figure TBDZMRRZ
* @see Specification Section 6.2.2.2, figure TBDZMRERZ
* @struct xnvme_spec_znd_report_hdr
*/
struct xnvme_spec_znd_report_hdr {
/**
* Number of zones in namespace when receiving with partial=0
* Number of zones in the data-buffer, when receiving with partial=1
*/
uint64_t nzones;
uint8_t rsvd[56];
};
XNVME_STATIC_ASSERT(sizeof(struct xnvme_spec_znd_report_hdr) == 64, "Incorrect size")
/**
* Key Value Command Set KV Format data structure
*
* @see Key Value Command Set Specification Revision 1.0c, Figure 40
*
* @struct xnvme_spec_kvs_idfy_ns_format
*/
struct xnvme_spec_kvs_idfy_ns_format {
uint16_t kml; ///< KV Key Max Length
uint8_t rsvd2;
uint8_t fopt; ///< Additional format options
uint32_t vml; ///< KV Value Max Length
uint32_t mnk; ///< Max Num Keys
uint8_t rsvd12[4];
};
/**
* Key Value Command Set identify namespace data structure
*
* @see Key Value Command Set Specification Revision 1.0c, Figure 39
*
* @struct xnvme_spec_kvs_idfy_ns
*/
struct xnvme_spec_kvs_idfy_ns {
uint64_t nsze; ///< Namespace Size
uint8_t rsvd8[8];
uint64_t nuse; ///< Namespace Utilization
uint8_t nsfeat; ///< Namespace Features
uint8_t nkvf; ///< Number of KV Formats
uint8_t nmic; ///< Namespace Multi-path I/O and Namespace Sharing Capabilities
uint8_t rescap; ///< Reservation Capabilities
uint8_t fpi; ///< Format Progress Indicator
uint8_t rsvd29[3];
uint32_t novg; ///< Namespace Optimal Value Granularity
uint32_t anagrpid; ///< ANA Group Identifier
uint8_t rsvd40[3];
uint8_t nsattr; ///< Namespace Attributes
uint16_t nvmsetid; ///< NVM Set Identifier
uint16_t endgid; ///< Endurance Group Identifier
uint64_t nguid[2]; ///< Namespace Globally Unique Identifier
uint64_t eui64; ///< IEEE Extended Unique Identifier
struct xnvme_spec_kvs_idfy_ns_format kvf[16]; ///< KV Format 0 to 15
uint8_t rsvd328[3512]; // 3839:328
uint8_t vs[256];
};
XNVME_STATIC_ASSERT(sizeof(struct xnvme_spec_kvs_idfy_ns) == 4096, "Incorrect size")
struct xnvme_spec_kvs_idfy {
union {
struct xnvme_spec_idfy base;
struct xnvme_spec_kvs_idfy_ns ns;
};
};
XNVME_STATIC_ASSERT(sizeof(struct xnvme_spec_kvs_idfy) == 4096, "Incorrect size")
/**
* Prints the given :;xnvme_spec_log_health_entry to the given output stream
*
* @param stream output stream used for printing
* @param log pointer to the structure to print
* @param opts printer options, see ::xnvme_pr
* @return On success, the number of characters printed is returned.
*/
int
xnvme_spec_log_health_fpr(FILE *stream, const struct xnvme_spec_log_health_entry *log, int opts);
/**
* Prints the given :;xnvme_spec_log_health_entry to stdout
*
* @param log
* @param opts
* @return On success, the number of characters printed is returned.
*/
int
xnvme_spec_log_health_pr(const struct xnvme_spec_log_health_entry *log, int opts);
/**
* Prints the given :;xnvme_spec_log_erri_entry to stdout
*
* @param stream output stream used for printing
* @param log
* @param limit
* @param opts
* @return On success, the number of characters printed is returned.
*/
int
xnvme_spec_log_erri_fpr(FILE *stream, const struct xnvme_spec_log_erri_entry *log, int limit,
int opts);
/**
* Prints the given :;xnvme_spec_log_erri_entry to stdout
*
* @param log
* @param limit
* @param opts printer options, see ::xnvme_pr
* @return On success, the number of characters printed is returned.
*/
int
xnvme_spec_log_erri_pr(const struct xnvme_spec_log_erri_entry *log, int limit, int opts);
/**
* Prints the given :;xnvme_spec_log_fdp_conf to stdout
*
* @param log
* @param opts
* @return On success, the number of characters printed is returned.
*/
int
xnvme_spec_log_fdp_conf_pr(const struct xnvme_spec_log_fdp_conf *log, int opts);
/**
* Prints the given :;xnvme_spec_log_fdp_stats to stdout
*
* @param log
* @param opts
* @return On success, the number of characters printed is returned.
*/
int
xnvme_spec_log_fdp_stats_pr(const struct xnvme_spec_log_fdp_stats *log, int opts);
/**
* Prints the given :;xnvme_spec_log_fdp_events_entry to stdout
*
* @param log
* @param limit
* @param opts printer options, see ::xnvme_pr
* @return On success, the number of characters printed is returned.
*/
int
xnvme_spec_log_fdp_events_pr(const struct xnvme_spec_log_fdp_events *log, int limit, int opts);
/**
* Prints the given :;xnvme_spec_log_ruhu to stdout
*
* @param log
* @param limit
* @param opts printer options, see ::xnvme_pr
* @return On success, the number of characters printed is returned.
*/
int
xnvme_spec_log_ruhu_pr(const struct xnvme_spec_log_ruhu *log, int limit, int opts);
/**
* Prints the given :;xnvme_spec_ruhs to stdout
*
* @param ruhs
* @param limit
* @param opts printer options, see ::xnvme_pr
* @return On success, the number of characters printed is returned.
*/
int
xnvme_spec_ruhs_pr(const struct xnvme_spec_ruhs *ruhs, int limit, int opts);
/**
* Prints the given :;xnvme_spec_idfy_ns to the given output stream
*
* @param stream output stream used for printing
* @param idfy pointer to structure to print
* @param opts printer options, see ::xnvme_pr
*
* @return On success, the number of characters printed is returned.
*/
int
xnvme_spec_idfy_ns_fpr(FILE *stream, const struct xnvme_spec_idfy_ns *idfy, int opts);
/**
* Prints the given :;xnvme_spec_idfy_ns to stdout
*
* @param idfy pointer to structure to print
* @param opts printer options, see ::xnvme_pr
* @return On success, the number of characters printed is returned.
*/
int
xnvme_spec_idfy_ns_pr(const struct xnvme_spec_idfy_ns *idfy, int opts);
/**
* Prints the given :;xnvme_spec_idfy_ctrlr to the given output stream
*
* @param stream output stream used for printing
* @param idfy pointer to structure to print
* @param opts printer options, see ::xnvme_pr
* @return On success, the number of characters printed is returned.
*/
int
xnvme_spec_idfy_ctrlr_fpr(FILE *stream, const struct xnvme_spec_idfy_ctrlr *idfy, int opts);
/**
* Prints the given :;xnvme_spec_idfy_ctrlr to stdout
*
* @param idfy pointer to structure to print
* @param opts printer options, see ::xnvme_pr
* @return On success, the number of characters printed is returned.
*/
int
xnvme_spec_idfy_ctrlr_pr(const struct xnvme_spec_idfy_ctrlr *idfy, int opts);
int
xnvme_spec_idfy_cs_fpr(FILE *stream, const struct xnvme_spec_idfy_cs *idfy, int opts);
int
xnvme_spec_idfy_cs_pr(const struct xnvme_spec_idfy_cs *idfy, int opts);
/**
* Prints the given :;xnvme_spec_feat to the given output stream
*
* @param stream output stream used for printing
* @param fid feature identifier
* @param feat feature values
* @param opts printer options, see ::xnvme_pr
* @return On success, the number of characters printed is returned.
*/
int
xnvme_spec_feat_fpr(FILE *stream, uint8_t fid, struct xnvme_spec_feat feat, int opts);
/**
* Prints the given :;xnvme_spec_feat to the given output stream
*
* @param fid feature identifier
* @param feat feature values
* @param opts printer options, see ::xnvme_pr
* @return On success, the number of characters printed is returned.
*/
int
xnvme_spec_feat_pr(uint8_t fid, struct xnvme_spec_feat feat, int opts);
/**
* Prints the :;xnvme_spec_fdp_event_desc to the given output stream
*
* @param buf Buffer which contains xnvme_spec_fdp_event_desc
* @param feat to get number of events
* @param opts printer options, see ::xnvme_pr
* @return On success, the number of characters printed is returned.
*/
int
xnvme_spec_feat_fdp_events_pr(void *buf, struct xnvme_spec_feat feat, int opts);
/**
* Prints the given :;xnvme_spec_cmd to the given output stream
*
* @param stream output stream used for printing
* @param cmd pointer to structure to print
* @param opts printer options, see ::xnvme_pr
* @return On success, the number of characters printed is returned.
*/
int
xnvme_spec_cmd_fpr(FILE *stream, struct xnvme_spec_cmd *cmd, int opts);
/**
* Prints the given :;xnvme_spec_cmd to stdout
*
* @param cmd pointer to structure to print
* @param opts printer options, see ::xnvme_pr
* @return On success, the number of characters printed is returned.
*/
int
xnvme_spec_cmd_pr(struct xnvme_spec_cmd *cmd, int opts);
/**
* Prints the given :;xnvme_spec_idfy_dir_rp to stdout
*
* @param idfy pointer to structure to print
* @param opts printer options, see ::xnvme_pr
* @return On success, the number of characters printed is returned.
*/
int
xnvme_spec_drecv_idfy_pr(struct xnvme_spec_idfy_dir_rp *idfy, int opts);
/**
* Prints the given :;xnvme_spec_streams_dir_rp to stdout
*
* @param srp pointer to structure to print
* @param opts printer options, see ::xnvme_pr
* @return On success, the number of characters printed is returned.
*/
int
xnvme_spec_drecv_srp_pr(struct xnvme_spec_streams_dir_rp *srp, int opts);
/**
* Prints the given :;xnvme_spec_streams_dir_gs to stdout
*
* @param sgs pointer to structure to print
* @param opts printer options, see ::xnvme_pr
* @return On success, the number of characters printed is returned.
*/
int
xnvme_spec_drecv_sgs_pr(struct xnvme_spec_streams_dir_gs *sgs, int opts);
/**
* Prints the given :;xnvme_spec_alloc_resource to stdout
*
* @param sar structure to print
* @param opts printer options, see ::xnvme_pr
* @return On success, the number of characters printed is returned.
*/
int
xnvme_spec_drecv_sar_pr(struct xnvme_spec_alloc_resource sar, int opts);
int
xnvme_spec_nvm_scopy_fmt_zero_fpr(FILE *stream, const struct xnvme_spec_nvm_scopy_fmt_zero *entry,
int opts);
/**
* Prints the given ::xnvme_spec_nvm_scopy_fmt_zero to stdout
*
* @param entry pointer to structure to print
* @param opts printer options, see ::xnvme_pr
*
* @return On success, the number of characters printed is returned
*/
int
xnvme_spec_nvm_scopy_fmt_zero_pr(const struct xnvme_spec_nvm_scopy_fmt_zero *entry, int opts);
/**
* Prints the given ::xnvme_spec_nvm_scopy_source_range to the given output stream
*
* @param stream output stream used for printing
* @param srange pointer to structure to print
* @param nr zero-based number of entries, at most ::XNVME_SPEC_NVM_SCOPY_NENTRY_MAX -1
* @param opts printer options, see ::xnvme_pr
*
* @return On success, the number of characters printed is returned
*/
int
xnvme_spec_nvm_scopy_source_range_fpr(FILE *stream,
const struct xnvme_spec_nvm_scopy_source_range *srange,
uint8_t nr, int opts);
/**
* Prints the given ::xnvme_spec_nvm_scopy_source_range to stdout
*
* @param srange pointer to structure to print
* @param nr nr=0: print ::XNVME_SPEC_NVM_SCOPY_NENTRY_MAX entries from the given , nr>0:
* print no more than nr
* @param opts printer options, see ::xnvme_pr
*
* @return On success, the number of characters printed is returned
*/
int
xnvme_spec_nvm_scopy_source_range_pr(const struct xnvme_spec_nvm_scopy_source_range *srange,
uint8_t nr, int opts);
/**
* Prints the given ::xnvme_spec_nvm_idfy_ctrlr to the given output stream
*
* @param stream output stream used for printing
* @param idfy pointer to the structure to print
* @param opts printer options, see ::xnvme_pr
*
* @return On success, the number of characters printed is returned
*/
int
xnvme_spec_nvm_idfy_ctrlr_fpr(FILE *stream, struct xnvme_spec_nvm_idfy_ctrlr *idfy, int opts);
/**
* Prints the given ::xnvme_spec_nvm_idfy_ctrlr to stdout
*
* @param idfy pointer to ::xnvme_spec_nvm_idfy_ctrlr
* @param opts printer options, see ::xnvme_pr
*
* @return On success, the number of characters printed is returned
*/
int
xnvme_spec_nvm_idfy_ctrlr_pr(struct xnvme_spec_nvm_idfy_ctrlr *idfy, int opts);
/**
* Prints the given ::xnvme_spec_nvm_idfy_ns to the given output stream
*
* Only fields specific to Logical Block Namespaces are printed by this function
*
* @param stream output stream used for printing
* @param idfy pointer to the structure to print
* @param opts printer options, see ::xnvme_pr
*
* @return On success, the number of characters printed is returned
*/
int
xnvme_spec_nvm_idfy_ns_fpr(FILE *stream, struct xnvme_spec_nvm_idfy_ns *idfy, int opts);
/**
* Prints the given ::xnvme_spec_nvm_idfy_ns to stdout
*
* @param idfy pointer to ::xnvme_spec_nvm_idfy_ns
* @param opts printer options, see ::xnvme_pr
*
* @return On success, the number of characters printed is returned
*/
int
xnvme_spec_nvm_idfy_ns_pr(struct xnvme_spec_nvm_idfy_ns *idfy, int opts);
/**
* Prints the given ::xnvme_spec_znd_idfy_ctrlr to the given output stream
*
* Only fields specific to Zoned Namespaces are printed by this function
*
* @param stream output stream used for printing
* @param zctrlr pointer to the structure to print
* @param opts printer options, see ::xnvme_pr
*
* @return On success, the number of characters printed is returned
*/
int
xnvme_spec_znd_idfy_ctrlr_fpr(FILE *stream, struct xnvme_spec_znd_idfy_ctrlr *zctrlr, int opts);
/**
* Prints the given ::xnvme_spec_znd_idfy_ctrlr to the given output stream
*
* Only fields specific to Zoned Namespaces are printed by this function
*
* @param zctrlr pointer to the structure to print
* @param opts printer options, see ::xnvme_pr
*
* @return On success, the number of characters printed is returned
*/
int
xnvme_spec_znd_idfy_ctrlr_pr(struct xnvme_spec_znd_idfy_ctrlr *zctrlr, int opts);
/**
* Prints the given ::xnvme_spec_znd_idfy_lbafe to the given output stream
*
* @param stream output stream used for printing
* @param zonef pointer to structure to print
* @param opts printer options, see ::xnvme_pr
*
* @return On success, the number of characters printed is returned
*/
int
xnvme_spec_znd_idfy_lbafe_fpr(FILE *stream, struct xnvme_spec_znd_idfy_lbafe *zonef, int opts);
/**
* Prints the given ::xnvme_spec_znd_idfy_ns to the given output stream
*
* Only fields specific to Zoned Namespaces are printed by this function
*
* @param stream output stream used for printing
* @param zns pointer to the structure to print
* @param opts printer options, see ::xnvme_pr
*
* @return On success, the number of characters printed is returned
*/
int
xnvme_spec_znd_idfy_ns_fpr(FILE *stream, struct xnvme_spec_znd_idfy_ns *zns, int opts);
/**
* Prints the given ::xnvme_spec_znd_idfy_ns to stdout
*
* @param zns pointer to ::xnvme_spec_znd_idfy_ns
* @param opts printer options, see ::xnvme_pr
*
* @return On success, the number of characters printed is returned
*/
int
xnvme_spec_znd_idfy_ns_pr(struct xnvme_spec_znd_idfy_ns *zns, int opts);
/**
* Prints the given ::xnvme_spec_znd_log_changes to the given output stream
*
* @param stream output stream used for printing
* @param changes pointer to subject to print
* @param opts printer options, see ::xnvme_pr
*
* @return On success, the number of characters printed is returned.
*/
int
xnvme_spec_znd_log_changes_fpr(FILE *stream, const struct xnvme_spec_znd_log_changes *changes,
int opts);
/**
* Pretty-printer of ::xnvme_spec_znd_log_changes
*
* @param changes pointer to subject to print
* @param opts printer options, see ::xnvme_pr
*
* @return On success, the number of characters printed is returned.
*/
int
xnvme_spec_znd_log_changes_pr(const struct xnvme_spec_znd_log_changes *changes, int opts);
/**
* Prints the given ::xnvme_spec_znd_descr to the given stream
*
* @param stream output stream used for printing
* @param descr the struct to print
* @param opts printer options, see ::xnvme_pr
*
* @return On success, the number of characters printed is returned.
*/
int
xnvme_spec_znd_descr_fpr(FILE *stream, const struct xnvme_spec_znd_descr *descr, int opts);
/**
* Prints the given ::xnvme_spec_znd_descr to stdout
*
* @param descr the structure to print
* @param opts printer options, see ::xnvme_pr
*
* @return On success, the number of characters printed is returned.
*/
int
xnvme_spec_znd_descr_pr(const struct xnvme_spec_znd_descr *descr, int opts);
/**
* Print the given ::xnvme_spec_znd_report_hdr to the given output stream
*
* @param stream output stream used for printing
* @param hdr the struct to print
* @param opts printer options, see ::xnvme_pr
*
* @return On success, the number of characters printed is returned.
*/
int
xnvme_spec_znd_report_hdr_fpr(FILE *stream, const struct xnvme_spec_znd_report_hdr *hdr, int opts);
/**
* Print the given ::xnvme_spec_znd_report_hdr to the stdout
*
* @param hdr the struct to print
* @param opts printer options, see ::xnvme_pr
*
* @return On success, the number of characters printed is returned.
*/
int
xnvme_spec_znd_report_hdr_pr(const struct xnvme_spec_znd_report_hdr *hdr, int opts);
int
xnvme_spec_znd_descr_fpr_yaml(FILE *stream, const struct xnvme_spec_znd_descr *descr, int indent,
const char *sep);
/**
* Prints the given xnvme_spec_kvs_idfy to the given output stream
*
* @param stream output stream used for printing
* @param idfy pointer to structure to print
* @param opts printer options, see ::xnvme_pr
* @return On success, the number of characters printed is returned.
*/
int
xnvme_spec_kvs_idfy_ns_fpr(FILE *stream, const struct xnvme_spec_kvs_idfy_ns *idfy, int opts);
/**
* Prints the given :;xnvme_spec_kvs_idfy to stdout
*
* @param idfy pointer to structure to print
* @param opts printer options, see ::xnvme_pr
* @return On success, the number of characters printed is returned.
*/
int
xnvme_spec_kvs_idfy_ns_pr(const struct xnvme_spec_kvs_idfy_ns *idfy, int opts);