#ifndef _NVME_COMMON_H
#define _NVME_COMMON_H
#include <sys/stdbool.h>
#include <sys/nvme.h>
#include <sys/nvme/discovery.h>
#ifdef __cplusplus
extern "C" {
#endif
extern const nvme_version_t nvme_vers_1v0;
extern const nvme_version_t nvme_vers_1v1;
extern const nvme_version_t nvme_vers_1v2;
extern const nvme_version_t nvme_vers_1v3;
extern const nvme_version_t nvme_vers_1v4;
extern const nvme_version_t nvme_vers_2v0;
extern const nvme_version_t nvme_vers_2v1;
extern bool nvme_vers_atleast(const nvme_version_t *, const nvme_version_t *);
typedef struct nvme_valid_ctrl_data {
const nvme_version_t *vcd_vers;
const nvme_identify_ctrl_t *vcd_id;
} nvme_valid_ctrl_data_t;
struct nvme_field_info;
typedef bool (*nvme_field_sup_f)(const struct nvme_field_info *,
const nvme_valid_ctrl_data_t *, char *, size_t);
typedef bool (*nvme_field_valid_f)(const struct nvme_field_info *,
const nvme_valid_ctrl_data_t *, uint64_t, char *, size_t);
typedef struct nvme_field_info {
const nvme_version_t *nlfi_vers;
nvme_field_sup_f nlfi_sup;
uint64_t nlfi_max_size;
nvme_field_valid_f nlfi_valid;
const char *nlfi_spec;
const char *nlfi_human;
bool nlfi_def_req;
bool nlfi_def_allow;
} nvme_field_info_t;
typedef enum {
NVME_FIELD_ERR_OK = 0,
NVME_FIELD_ERR_UNSUP_VERSION,
NVME_FIELD_ERR_UNSUP_FIELD,
NVME_FIELD_ERR_BAD_VALUE
} nvme_field_error_t;
extern nvme_field_error_t nvme_field_validate(const nvme_field_info_t *,
const nvme_valid_ctrl_data_t *, uint64_t, char *, size_t);
extern bool nvme_field_atleast(const nvme_valid_ctrl_data_t *,
const nvme_version_t *);
extern bool nvme_field_valid_nsid(const nvme_field_info_t *,
const nvme_valid_ctrl_data_t *, uint64_t, char *, size_t);
extern bool nvme_field_range_check(const nvme_field_info_t *, uint64_t,
uint64_t, char *, size_t, uint64_t);
extern bool nvme_field_mask_check(const nvme_field_info_t *, uint64_t, char *,
size_t, uint64_t);
typedef enum {
NVME_LOG_REQ_FIELD_LID = 0,
NVME_LOG_REQ_FIELD_LSP,
NVME_LOG_REQ_FIELD_LSI,
NVME_LOG_REQ_FIELD_SIZE,
NVME_LOG_REQ_FIELD_CSI,
NVME_LOG_REQ_FIELD_RAE,
NVME_LOG_REQ_FIELD_OFFSET,
NVME_LOG_REQ_FIELD_NSID
} nvme_log_req_field_t;
extern const nvme_field_info_t nvme_log_fields[];
extern const size_t nvme_log_nfields;
typedef struct nvme_log_page_info nvme_log_page_info_t;
typedef bool (*nvme_log_page_sup_f)(const nvme_valid_ctrl_data_t *,
const nvme_log_page_info_t *);
typedef uint64_t (*nvme_log_page_len_f)(const nvme_valid_ctrl_data_t *,
const nvme_log_page_info_t *);
typedef nvme_log_disc_scope_t (*nvme_log_page_scope_f)(
const nvme_valid_ctrl_data_t *, const nvme_log_page_info_t *);
typedef bool (*nvme_log_page_var_len_f)(uint64_t *, const void *, size_t);
struct nvme_log_page_info {
const char *nlpi_short;
const char *nlpi_human;
const char *const *nlpi_aliases;
size_t nlpi_naliases;
uint32_t nlpi_lid;
nvme_csi_t nlpi_csi;
const nvme_version_t *nlpi_vers;
const nvme_log_page_sup_f nlpi_sup_func;
nvme_log_disc_kind_t nlpi_kind;
nvme_log_disc_source_t nlpi_source;
nvme_log_disc_fields_t nlpi_disc;
nvme_log_disc_scope_t nlpi_scope;
nvme_log_page_scope_f nlpi_scope_func;
uint64_t nlpi_len;
nvme_log_page_len_f nlpi_len_func;
nvme_log_page_var_len_f nlpi_var_func;
};
extern const nvme_log_page_info_t nvme_std_log_pages[];
extern const size_t nvme_std_log_npages;
extern nvme_log_disc_scope_t nvme_log_page_info_scope(
const nvme_log_page_info_t *, const nvme_valid_ctrl_data_t *);
extern uint64_t nvme_log_page_info_size(const nvme_log_page_info_t *,
const nvme_valid_ctrl_data_t *, bool *);
extern bool nvme_log_page_info_supported(const nvme_log_page_info_t *,
const nvme_valid_ctrl_data_t *);
typedef enum {
NVME_ID_REQ_F_CNS = 0,
NVME_ID_REQ_F_NSID,
NVME_ID_REQ_F_CTRLID,
NVME_ID_REQ_F_BUF,
} nvme_identify_req_field_t;
typedef enum {
NVME_IDENTIFY_INFO_F_NS_OK = 1 << 0,
NVME_IDENTIFY_INFO_F_BCAST = 1 << 1,
NVME_IDENTIFY_INFO_F_NSID_LIST = 1 << 2
} nvme_identify_info_flags_t;
typedef struct nvme_identify_info nvme_identify_info_t;
typedef bool (*nvme_identify_sup_f)(const nvme_valid_ctrl_data_t *);
struct nvme_identify_info {
const char *nii_name;
nvme_csi_t nii_csi;
uint32_t nii_cns;
const nvme_version_t *nii_vers;
nvme_identify_sup_f nii_sup_func;
nvme_identify_req_field_t nii_fields;
nvme_identify_info_flags_t nii_flags;
};
extern const nvme_field_info_t nvme_identify_fields[];
extern const size_t nvme_identify_nfields;
extern const nvme_identify_info_t nvme_identify_cmds[];
extern const size_t nvme_identify_ncmds;
extern bool nvme_identify_info_supported(const nvme_identify_info_t *,
const nvme_valid_ctrl_data_t *);
typedef enum {
NVME_VUC_REQ_FIELD_OPC = 0,
NVME_VUC_REQ_FIELD_NSID,
NVME_VUC_REQ_FIELD_CDW12,
NVME_VUC_REQ_FIELD_CDW13,
NVME_VUC_REQ_FIELD_CDW14,
NVME_VUC_REQ_FIELD_CDW15,
NVME_VUC_REQ_FIELD_NDT,
NVME_VUC_REQ_FIELD_TO
} nvme_vuc_req_field_t;
extern const nvme_field_info_t nvme_vuc_fields[];
extern const size_t nvme_vuc_nfields;
typedef enum {
NVME_FW_LOAD_REQ_FIELD_NUMD = 0,
NVME_FW_LOAD_REQ_FIELD_OFFSET
} nvme_fw_load_req_field_t;
extern const nvme_field_info_t nvme_fw_load_fields[];
extern const size_t nvme_fw_load_nfields;
extern bool nvme_fw_cmds_supported(const nvme_valid_ctrl_data_t *);
extern uint32_t nvme_fw_load_granularity(const nvme_valid_ctrl_data_t *);
typedef enum {
NVME_FW_COMMIT_REQ_FIELD_SLOT = 0,
NVME_FW_COMMIT_REQ_FIELD_ACT
} nvme_fw_commit_req_field_t;
extern const nvme_field_info_t nvme_fw_commit_fields[];
extern const size_t nvme_fw_commit_nfields;
typedef enum {
NVME_FORMAT_REQ_FIELD_LBAF = 0,
NVME_FORMAT_REQ_FIELD_SES,
NVME_FORMAT_REQ_FIELD_NSID
} nvme_format_req_field_t;
extern const nvme_field_info_t nvme_format_fields[];
extern const size_t nvme_format_nfields;
extern bool nvme_format_cmds_supported(const nvme_valid_ctrl_data_t *);
typedef enum {
NVME_GET_FEAT_REQ_FIELD_FID = 0,
NVME_GET_FEAT_REQ_FIELD_SEL,
NVME_GET_FEAT_REQ_FIELD_DPTR,
NVME_GET_FEAT_REQ_FIELD_CDW11,
NVME_GET_FEAT_REQ_FIELD_NSID
} nvme_get_feat_req_field_t;
extern const nvme_field_info_t nvme_get_feat_fields[];
extern const size_t nvme_get_feat_nfields;
typedef struct nvme_feat_info nvme_feat_info_t;
typedef bool (*nvme_feat_sup_f)(const nvme_valid_ctrl_data_t *,
const nvme_feat_info_t *);
struct nvme_feat_info {
const char *nfeat_short;
const char *nfeat_spec;
uint32_t nfeat_fid;
const nvme_version_t *nfeat_vers;
const nvme_feat_sup_f nfeat_sup_func;
nvme_feat_kind_t nfeat_kind;
nvme_feat_scope_t nfeat_scope;
nvme_feat_csi_t nfeat_csi;
nvme_feat_flags_t nfeat_flags;
nvme_get_feat_fields_t nfeat_in_get;
nvme_set_feat_fields_t nfeat_in_set;
nvme_feat_output_t nfeat_out_get;
nvme_feat_output_t nfeat_out_set;
uint64_t nfeat_len;
};
extern const nvme_feat_info_t nvme_std_feats[];
extern const size_t nvme_std_nfeats;
extern nvme_feat_impl_t nvme_feat_supported(const nvme_feat_info_t *,
const nvme_valid_ctrl_data_t *);
typedef enum {
NVME_NS_CREATE_REQ_FIELD_CSI = 0,
NVME_NS_CREATE_REQ_FIELD_NSZE,
NVME_NS_CREATE_REQ_FIELD_NCAP,
NVME_NS_CREATE_REQ_FIELD_FLBAS,
NVME_NS_CREATE_REQ_FIELD_NMIC
} nvme_ns_create_req_field_t;
typedef enum {
NVME_NS_DELETE_REQ_FIELD_NSID = 0
} nvme_ns_delete_req_field_t;
typedef enum {
NVME_NS_ATTACH_REQ_FIELD_SEL = 0,
NVME_NS_ATTACH_REQ_FIELD_NSID,
NVME_NS_ATTACH_REQ_FIELD_DPTR
} nvme_ns_attach_req_field_t;
extern bool nvme_nsmgmt_cmds_supported(const nvme_valid_ctrl_data_t *);
extern const nvme_field_info_t nvme_ns_attach_fields[];
extern const size_t nvme_ns_attach_nfields;
extern const nvme_field_info_t nvme_ns_create_fields[];
extern const size_t nvme_ns_create_nfields;
extern const nvme_field_info_t nvme_ns_delete_fields[];
extern const size_t nvme_ns_delete_nfields;
extern const nvme_ns_create_req_field_t nvme_ns_create_fields_nvm_req[];
extern const size_t nvme_ns_create_fields_nvm_nreq;
extern const nvme_ns_create_req_field_t nvme_ns_create_fields_nvm_allow[];
extern const size_t nvme_ns_create_fields_nvm_nallow;
#ifdef __cplusplus
}
#endif
#endif