0001
0002
0003
0004
0005
0006
0007 #ifndef _LINUX_NVME_H
0008 #define _LINUX_NVME_H
0009
0010 #include <linux/types.h>
0011 #include <linux/uuid.h>
0012
0013
0014 #define NVMF_NQN_FIELD_LEN 256
0015
0016
0017 #define NVMF_NQN_SIZE 223
0018
0019 #define NVMF_TRSVCID_SIZE 32
0020 #define NVMF_TRADDR_SIZE 256
0021 #define NVMF_TSAS_SIZE 256
0022 #define NVMF_AUTH_HASH_LEN 64
0023
0024 #define NVME_DISC_SUBSYS_NAME "nqn.2014-08.org.nvmexpress.discovery"
0025
0026 #define NVME_RDMA_IP_PORT 4420
0027
0028 #define NVME_NSID_ALL 0xffffffff
0029
0030 enum nvme_subsys_type {
0031
0032 NVME_NQN_DISC = 1,
0033
0034
0035 NVME_NQN_NVME = 2,
0036
0037
0038 NVME_NQN_CURR = 3,
0039 };
0040
0041 enum nvme_ctrl_type {
0042 NVME_CTRL_IO = 1,
0043 NVME_CTRL_DISC = 2,
0044 NVME_CTRL_ADMIN = 3,
0045 };
0046
0047 enum nvme_dctype {
0048 NVME_DCTYPE_NOT_REPORTED = 0,
0049 NVME_DCTYPE_DDC = 1,
0050 NVME_DCTYPE_CDC = 2,
0051 };
0052
0053
0054 enum {
0055 NVMF_ADDR_FAMILY_PCI = 0,
0056 NVMF_ADDR_FAMILY_IP4 = 1,
0057 NVMF_ADDR_FAMILY_IP6 = 2,
0058 NVMF_ADDR_FAMILY_IB = 3,
0059 NVMF_ADDR_FAMILY_FC = 4,
0060 NVMF_ADDR_FAMILY_LOOP = 254,
0061 NVMF_ADDR_FAMILY_MAX,
0062 };
0063
0064
0065 enum {
0066 NVMF_TRTYPE_RDMA = 1,
0067 NVMF_TRTYPE_FC = 2,
0068 NVMF_TRTYPE_TCP = 3,
0069 NVMF_TRTYPE_LOOP = 254,
0070 NVMF_TRTYPE_MAX,
0071 };
0072
0073
0074 enum {
0075 NVMF_TREQ_NOT_SPECIFIED = 0,
0076 NVMF_TREQ_REQUIRED = 1,
0077 NVMF_TREQ_NOT_REQUIRED = 2,
0078 #define NVME_TREQ_SECURE_CHANNEL_MASK \
0079 (NVMF_TREQ_REQUIRED | NVMF_TREQ_NOT_REQUIRED)
0080
0081 NVMF_TREQ_DISABLE_SQFLOW = (1 << 2),
0082 };
0083
0084
0085
0086
0087 enum {
0088 NVMF_RDMA_QPTYPE_CONNECTED = 1,
0089 NVMF_RDMA_QPTYPE_DATAGRAM = 2,
0090 };
0091
0092
0093
0094
0095 enum {
0096 NVMF_RDMA_PRTYPE_NOT_SPECIFIED = 1,
0097 NVMF_RDMA_PRTYPE_IB = 2,
0098 NVMF_RDMA_PRTYPE_ROCE = 3,
0099 NVMF_RDMA_PRTYPE_ROCEV2 = 4,
0100 NVMF_RDMA_PRTYPE_IWARP = 5,
0101 };
0102
0103
0104
0105
0106 enum {
0107 NVMF_RDMA_CMS_RDMA_CM = 1,
0108 };
0109
0110 #define NVME_AQ_DEPTH 32
0111 #define NVME_NR_AEN_COMMANDS 1
0112 #define NVME_AQ_BLK_MQ_DEPTH (NVME_AQ_DEPTH - NVME_NR_AEN_COMMANDS)
0113
0114
0115
0116
0117
0118 #define NVME_AQ_MQ_TAG_DEPTH (NVME_AQ_BLK_MQ_DEPTH - 1)
0119
0120 enum {
0121 NVME_REG_CAP = 0x0000,
0122 NVME_REG_VS = 0x0008,
0123 NVME_REG_INTMS = 0x000c,
0124 NVME_REG_INTMC = 0x0010,
0125 NVME_REG_CC = 0x0014,
0126 NVME_REG_CSTS = 0x001c,
0127 NVME_REG_NSSR = 0x0020,
0128 NVME_REG_AQA = 0x0024,
0129 NVME_REG_ASQ = 0x0028,
0130 NVME_REG_ACQ = 0x0030,
0131 NVME_REG_CMBLOC = 0x0038,
0132 NVME_REG_CMBSZ = 0x003c,
0133 NVME_REG_BPINFO = 0x0040,
0134 NVME_REG_BPRSEL = 0x0044,
0135 NVME_REG_BPMBL = 0x0048,
0136
0137
0138 NVME_REG_CMBMSC = 0x0050,
0139
0140
0141 NVME_REG_CRTO = 0x0068,
0142 NVME_REG_PMRCAP = 0x0e00,
0143 NVME_REG_PMRCTL = 0x0e04,
0144 NVME_REG_PMRSTS = 0x0e08,
0145 NVME_REG_PMREBS = 0x0e0c,
0146
0147
0148 NVME_REG_PMRSWTP = 0x0e10,
0149
0150
0151 NVME_REG_DBS = 0x1000,
0152 };
0153
0154 #define NVME_CAP_MQES(cap) ((cap) & 0xffff)
0155 #define NVME_CAP_TIMEOUT(cap) (((cap) >> 24) & 0xff)
0156 #define NVME_CAP_STRIDE(cap) (((cap) >> 32) & 0xf)
0157 #define NVME_CAP_NSSRC(cap) (((cap) >> 36) & 0x1)
0158 #define NVME_CAP_CSS(cap) (((cap) >> 37) & 0xff)
0159 #define NVME_CAP_MPSMIN(cap) (((cap) >> 48) & 0xf)
0160 #define NVME_CAP_MPSMAX(cap) (((cap) >> 52) & 0xf)
0161 #define NVME_CAP_CMBS(cap) (((cap) >> 57) & 0x1)
0162
0163 #define NVME_CMB_BIR(cmbloc) ((cmbloc) & 0x7)
0164 #define NVME_CMB_OFST(cmbloc) (((cmbloc) >> 12) & 0xfffff)
0165
0166 #define NVME_CRTO_CRIMT(crto) ((crto) >> 16)
0167 #define NVME_CRTO_CRWMT(crto) ((crto) & 0xffff)
0168
0169 enum {
0170 NVME_CMBSZ_SQS = 1 << 0,
0171 NVME_CMBSZ_CQS = 1 << 1,
0172 NVME_CMBSZ_LISTS = 1 << 2,
0173 NVME_CMBSZ_RDS = 1 << 3,
0174 NVME_CMBSZ_WDS = 1 << 4,
0175
0176 NVME_CMBSZ_SZ_SHIFT = 12,
0177 NVME_CMBSZ_SZ_MASK = 0xfffff,
0178
0179 NVME_CMBSZ_SZU_SHIFT = 8,
0180 NVME_CMBSZ_SZU_MASK = 0xf,
0181 };
0182
0183
0184
0185
0186
0187 #define NVME_ADM_SQES 6
0188 #define NVME_NVM_IOSQES 6
0189 #define NVME_NVM_IOCQES 4
0190
0191 enum {
0192 NVME_CC_ENABLE = 1 << 0,
0193 NVME_CC_EN_SHIFT = 0,
0194 NVME_CC_CSS_SHIFT = 4,
0195 NVME_CC_MPS_SHIFT = 7,
0196 NVME_CC_AMS_SHIFT = 11,
0197 NVME_CC_SHN_SHIFT = 14,
0198 NVME_CC_IOSQES_SHIFT = 16,
0199 NVME_CC_IOCQES_SHIFT = 20,
0200 NVME_CC_CSS_NVM = 0 << NVME_CC_CSS_SHIFT,
0201 NVME_CC_CSS_CSI = 6 << NVME_CC_CSS_SHIFT,
0202 NVME_CC_CSS_MASK = 7 << NVME_CC_CSS_SHIFT,
0203 NVME_CC_AMS_RR = 0 << NVME_CC_AMS_SHIFT,
0204 NVME_CC_AMS_WRRU = 1 << NVME_CC_AMS_SHIFT,
0205 NVME_CC_AMS_VS = 7 << NVME_CC_AMS_SHIFT,
0206 NVME_CC_SHN_NONE = 0 << NVME_CC_SHN_SHIFT,
0207 NVME_CC_SHN_NORMAL = 1 << NVME_CC_SHN_SHIFT,
0208 NVME_CC_SHN_ABRUPT = 2 << NVME_CC_SHN_SHIFT,
0209 NVME_CC_SHN_MASK = 3 << NVME_CC_SHN_SHIFT,
0210 NVME_CC_IOSQES = NVME_NVM_IOSQES << NVME_CC_IOSQES_SHIFT,
0211 NVME_CC_IOCQES = NVME_NVM_IOCQES << NVME_CC_IOCQES_SHIFT,
0212 NVME_CC_CRIME = 1 << 24,
0213 };
0214
0215 enum {
0216 NVME_CSTS_RDY = 1 << 0,
0217 NVME_CSTS_CFS = 1 << 1,
0218 NVME_CSTS_NSSRO = 1 << 4,
0219 NVME_CSTS_PP = 1 << 5,
0220 NVME_CSTS_SHST_NORMAL = 0 << 2,
0221 NVME_CSTS_SHST_OCCUR = 1 << 2,
0222 NVME_CSTS_SHST_CMPLT = 2 << 2,
0223 NVME_CSTS_SHST_MASK = 3 << 2,
0224 };
0225
0226 enum {
0227 NVME_CMBMSC_CRE = 1 << 0,
0228 NVME_CMBMSC_CMSE = 1 << 1,
0229 };
0230
0231 enum {
0232 NVME_CAP_CSS_NVM = 1 << 0,
0233 NVME_CAP_CSS_CSI = 1 << 6,
0234 };
0235
0236 enum {
0237 NVME_CAP_CRMS_CRWMS = 1ULL << 59,
0238 NVME_CAP_CRMS_CRIMS = 1ULL << 60,
0239 };
0240
0241 struct nvme_id_power_state {
0242 __le16 max_power;
0243 __u8 rsvd2;
0244 __u8 flags;
0245 __le32 entry_lat;
0246 __le32 exit_lat;
0247 __u8 read_tput;
0248 __u8 read_lat;
0249 __u8 write_tput;
0250 __u8 write_lat;
0251 __le16 idle_power;
0252 __u8 idle_scale;
0253 __u8 rsvd19;
0254 __le16 active_power;
0255 __u8 active_work_scale;
0256 __u8 rsvd23[9];
0257 };
0258
0259 enum {
0260 NVME_PS_FLAGS_MAX_POWER_SCALE = 1 << 0,
0261 NVME_PS_FLAGS_NON_OP_STATE = 1 << 1,
0262 };
0263
0264 enum nvme_ctrl_attr {
0265 NVME_CTRL_ATTR_HID_128_BIT = (1 << 0),
0266 NVME_CTRL_ATTR_TBKAS = (1 << 6),
0267 NVME_CTRL_ATTR_ELBAS = (1 << 15),
0268 };
0269
0270 struct nvme_id_ctrl {
0271 __le16 vid;
0272 __le16 ssvid;
0273 char sn[20];
0274 char mn[40];
0275 char fr[8];
0276 __u8 rab;
0277 __u8 ieee[3];
0278 __u8 cmic;
0279 __u8 mdts;
0280 __le16 cntlid;
0281 __le32 ver;
0282 __le32 rtd3r;
0283 __le32 rtd3e;
0284 __le32 oaes;
0285 __le32 ctratt;
0286 __u8 rsvd100[11];
0287 __u8 cntrltype;
0288 __u8 fguid[16];
0289 __le16 crdt1;
0290 __le16 crdt2;
0291 __le16 crdt3;
0292 __u8 rsvd134[122];
0293 __le16 oacs;
0294 __u8 acl;
0295 __u8 aerl;
0296 __u8 frmw;
0297 __u8 lpa;
0298 __u8 elpe;
0299 __u8 npss;
0300 __u8 avscc;
0301 __u8 apsta;
0302 __le16 wctemp;
0303 __le16 cctemp;
0304 __le16 mtfa;
0305 __le32 hmpre;
0306 __le32 hmmin;
0307 __u8 tnvmcap[16];
0308 __u8 unvmcap[16];
0309 __le32 rpmbs;
0310 __le16 edstt;
0311 __u8 dsto;
0312 __u8 fwug;
0313 __le16 kas;
0314 __le16 hctma;
0315 __le16 mntmt;
0316 __le16 mxtmt;
0317 __le32 sanicap;
0318 __le32 hmminds;
0319 __le16 hmmaxd;
0320 __u8 rsvd338[4];
0321 __u8 anatt;
0322 __u8 anacap;
0323 __le32 anagrpmax;
0324 __le32 nanagrpid;
0325 __u8 rsvd352[160];
0326 __u8 sqes;
0327 __u8 cqes;
0328 __le16 maxcmd;
0329 __le32 nn;
0330 __le16 oncs;
0331 __le16 fuses;
0332 __u8 fna;
0333 __u8 vwc;
0334 __le16 awun;
0335 __le16 awupf;
0336 __u8 nvscc;
0337 __u8 nwpc;
0338 __le16 acwu;
0339 __u8 rsvd534[2];
0340 __le32 sgls;
0341 __le32 mnan;
0342 __u8 rsvd544[224];
0343 char subnqn[256];
0344 __u8 rsvd1024[768];
0345 __le32 ioccsz;
0346 __le32 iorcsz;
0347 __le16 icdoff;
0348 __u8 ctrattr;
0349 __u8 msdbd;
0350 __u8 rsvd1804[2];
0351 __u8 dctype;
0352 __u8 rsvd1807[241];
0353 struct nvme_id_power_state psd[32];
0354 __u8 vs[1024];
0355 };
0356
0357 enum {
0358 NVME_CTRL_CMIC_MULTI_PORT = 1 << 0,
0359 NVME_CTRL_CMIC_MULTI_CTRL = 1 << 1,
0360 NVME_CTRL_CMIC_ANA = 1 << 3,
0361 NVME_CTRL_ONCS_COMPARE = 1 << 0,
0362 NVME_CTRL_ONCS_WRITE_UNCORRECTABLE = 1 << 1,
0363 NVME_CTRL_ONCS_DSM = 1 << 2,
0364 NVME_CTRL_ONCS_WRITE_ZEROES = 1 << 3,
0365 NVME_CTRL_ONCS_RESERVATIONS = 1 << 5,
0366 NVME_CTRL_ONCS_TIMESTAMP = 1 << 6,
0367 NVME_CTRL_VWC_PRESENT = 1 << 0,
0368 NVME_CTRL_OACS_SEC_SUPP = 1 << 0,
0369 NVME_CTRL_OACS_NS_MNGT_SUPP = 1 << 3,
0370 NVME_CTRL_OACS_DIRECTIVES = 1 << 5,
0371 NVME_CTRL_OACS_DBBUF_SUPP = 1 << 8,
0372 NVME_CTRL_LPA_CMD_EFFECTS_LOG = 1 << 1,
0373 NVME_CTRL_CTRATT_128_ID = 1 << 0,
0374 NVME_CTRL_CTRATT_NON_OP_PSP = 1 << 1,
0375 NVME_CTRL_CTRATT_NVM_SETS = 1 << 2,
0376 NVME_CTRL_CTRATT_READ_RECV_LVLS = 1 << 3,
0377 NVME_CTRL_CTRATT_ENDURANCE_GROUPS = 1 << 4,
0378 NVME_CTRL_CTRATT_PREDICTABLE_LAT = 1 << 5,
0379 NVME_CTRL_CTRATT_NAMESPACE_GRANULARITY = 1 << 7,
0380 NVME_CTRL_CTRATT_UUID_LIST = 1 << 9,
0381 };
0382
0383 struct nvme_lbaf {
0384 __le16 ms;
0385 __u8 ds;
0386 __u8 rp;
0387 };
0388
0389 struct nvme_id_ns {
0390 __le64 nsze;
0391 __le64 ncap;
0392 __le64 nuse;
0393 __u8 nsfeat;
0394 __u8 nlbaf;
0395 __u8 flbas;
0396 __u8 mc;
0397 __u8 dpc;
0398 __u8 dps;
0399 __u8 nmic;
0400 __u8 rescap;
0401 __u8 fpi;
0402 __u8 dlfeat;
0403 __le16 nawun;
0404 __le16 nawupf;
0405 __le16 nacwu;
0406 __le16 nabsn;
0407 __le16 nabo;
0408 __le16 nabspf;
0409 __le16 noiob;
0410 __u8 nvmcap[16];
0411 __le16 npwg;
0412 __le16 npwa;
0413 __le16 npdg;
0414 __le16 npda;
0415 __le16 nows;
0416 __u8 rsvd74[18];
0417 __le32 anagrpid;
0418 __u8 rsvd96[3];
0419 __u8 nsattr;
0420 __le16 nvmsetid;
0421 __le16 endgid;
0422 __u8 nguid[16];
0423 __u8 eui64[8];
0424 struct nvme_lbaf lbaf[64];
0425 __u8 vs[3712];
0426 };
0427
0428
0429 struct nvme_id_ns_cs_indep {
0430 __u8 nsfeat;
0431 __u8 nmic;
0432 __u8 rescap;
0433 __u8 fpi;
0434 __le32 anagrpid;
0435 __u8 nsattr;
0436 __u8 rsvd9;
0437 __le16 nvmsetid;
0438 __le16 endgid;
0439 __u8 nstat;
0440 __u8 rsvd15[4081];
0441 };
0442
0443 struct nvme_zns_lbafe {
0444 __le64 zsze;
0445 __u8 zdes;
0446 __u8 rsvd9[7];
0447 };
0448
0449 struct nvme_id_ns_zns {
0450 __le16 zoc;
0451 __le16 ozcs;
0452 __le32 mar;
0453 __le32 mor;
0454 __le32 rrl;
0455 __le32 frl;
0456 __u8 rsvd20[2796];
0457 struct nvme_zns_lbafe lbafe[64];
0458 __u8 vs[256];
0459 };
0460
0461 struct nvme_id_ctrl_zns {
0462 __u8 zasl;
0463 __u8 rsvd1[4095];
0464 };
0465
0466 struct nvme_id_ns_nvm {
0467 __le64 lbstm;
0468 __u8 pic;
0469 __u8 rsvd9[3];
0470 __le32 elbaf[64];
0471 __u8 rsvd268[3828];
0472 };
0473
0474 enum {
0475 NVME_ID_NS_NVM_STS_MASK = 0x3f,
0476 NVME_ID_NS_NVM_GUARD_SHIFT = 7,
0477 NVME_ID_NS_NVM_GUARD_MASK = 0x3,
0478 };
0479
0480 static inline __u8 nvme_elbaf_sts(__u32 elbaf)
0481 {
0482 return elbaf & NVME_ID_NS_NVM_STS_MASK;
0483 }
0484
0485 static inline __u8 nvme_elbaf_guard_type(__u32 elbaf)
0486 {
0487 return (elbaf >> NVME_ID_NS_NVM_GUARD_SHIFT) & NVME_ID_NS_NVM_GUARD_MASK;
0488 }
0489
0490 struct nvme_id_ctrl_nvm {
0491 __u8 vsl;
0492 __u8 wzsl;
0493 __u8 wusl;
0494 __u8 dmrl;
0495 __le32 dmrsl;
0496 __le64 dmsl;
0497 __u8 rsvd16[4080];
0498 };
0499
0500 enum {
0501 NVME_ID_CNS_NS = 0x00,
0502 NVME_ID_CNS_CTRL = 0x01,
0503 NVME_ID_CNS_NS_ACTIVE_LIST = 0x02,
0504 NVME_ID_CNS_NS_DESC_LIST = 0x03,
0505 NVME_ID_CNS_CS_NS = 0x05,
0506 NVME_ID_CNS_CS_CTRL = 0x06,
0507 NVME_ID_CNS_NS_CS_INDEP = 0x08,
0508 NVME_ID_CNS_NS_PRESENT_LIST = 0x10,
0509 NVME_ID_CNS_NS_PRESENT = 0x11,
0510 NVME_ID_CNS_CTRL_NS_LIST = 0x12,
0511 NVME_ID_CNS_CTRL_LIST = 0x13,
0512 NVME_ID_CNS_SCNDRY_CTRL_LIST = 0x15,
0513 NVME_ID_CNS_NS_GRANULARITY = 0x16,
0514 NVME_ID_CNS_UUID_LIST = 0x17,
0515 };
0516
0517 enum {
0518 NVME_CSI_NVM = 0,
0519 NVME_CSI_ZNS = 2,
0520 };
0521
0522 enum {
0523 NVME_DIR_IDENTIFY = 0x00,
0524 NVME_DIR_STREAMS = 0x01,
0525 NVME_DIR_SND_ID_OP_ENABLE = 0x01,
0526 NVME_DIR_SND_ST_OP_REL_ID = 0x01,
0527 NVME_DIR_SND_ST_OP_REL_RSC = 0x02,
0528 NVME_DIR_RCV_ID_OP_PARAM = 0x01,
0529 NVME_DIR_RCV_ST_OP_PARAM = 0x01,
0530 NVME_DIR_RCV_ST_OP_STATUS = 0x02,
0531 NVME_DIR_RCV_ST_OP_RESOURCE = 0x03,
0532 NVME_DIR_ENDIR = 0x01,
0533 };
0534
0535 enum {
0536 NVME_NS_FEAT_THIN = 1 << 0,
0537 NVME_NS_FEAT_ATOMICS = 1 << 1,
0538 NVME_NS_FEAT_IO_OPT = 1 << 4,
0539 NVME_NS_ATTR_RO = 1 << 0,
0540 NVME_NS_FLBAS_LBA_MASK = 0xf,
0541 NVME_NS_FLBAS_LBA_UMASK = 0x60,
0542 NVME_NS_FLBAS_LBA_SHIFT = 1,
0543 NVME_NS_FLBAS_META_EXT = 0x10,
0544 NVME_NS_NMIC_SHARED = 1 << 0,
0545 NVME_LBAF_RP_BEST = 0,
0546 NVME_LBAF_RP_BETTER = 1,
0547 NVME_LBAF_RP_GOOD = 2,
0548 NVME_LBAF_RP_DEGRADED = 3,
0549 NVME_NS_DPC_PI_LAST = 1 << 4,
0550 NVME_NS_DPC_PI_FIRST = 1 << 3,
0551 NVME_NS_DPC_PI_TYPE3 = 1 << 2,
0552 NVME_NS_DPC_PI_TYPE2 = 1 << 1,
0553 NVME_NS_DPC_PI_TYPE1 = 1 << 0,
0554 NVME_NS_DPS_PI_FIRST = 1 << 3,
0555 NVME_NS_DPS_PI_MASK = 0x7,
0556 NVME_NS_DPS_PI_TYPE1 = 1,
0557 NVME_NS_DPS_PI_TYPE2 = 2,
0558 NVME_NS_DPS_PI_TYPE3 = 3,
0559 };
0560
0561 enum {
0562 NVME_NSTAT_NRDY = 1 << 0,
0563 };
0564
0565 enum {
0566 NVME_NVM_NS_16B_GUARD = 0,
0567 NVME_NVM_NS_32B_GUARD = 1,
0568 NVME_NVM_NS_64B_GUARD = 2,
0569 };
0570
0571 static inline __u8 nvme_lbaf_index(__u8 flbas)
0572 {
0573 return (flbas & NVME_NS_FLBAS_LBA_MASK) |
0574 ((flbas & NVME_NS_FLBAS_LBA_UMASK) >> NVME_NS_FLBAS_LBA_SHIFT);
0575 }
0576
0577
0578 enum {
0579 NVME_MC_EXTENDED_LBA = (1 << 0),
0580 NVME_MC_METADATA_PTR = (1 << 1),
0581 };
0582
0583 struct nvme_ns_id_desc {
0584 __u8 nidt;
0585 __u8 nidl;
0586 __le16 reserved;
0587 };
0588
0589 #define NVME_NIDT_EUI64_LEN 8
0590 #define NVME_NIDT_NGUID_LEN 16
0591 #define NVME_NIDT_UUID_LEN 16
0592 #define NVME_NIDT_CSI_LEN 1
0593
0594 enum {
0595 NVME_NIDT_EUI64 = 0x01,
0596 NVME_NIDT_NGUID = 0x02,
0597 NVME_NIDT_UUID = 0x03,
0598 NVME_NIDT_CSI = 0x04,
0599 };
0600
0601 struct nvme_smart_log {
0602 __u8 critical_warning;
0603 __u8 temperature[2];
0604 __u8 avail_spare;
0605 __u8 spare_thresh;
0606 __u8 percent_used;
0607 __u8 endu_grp_crit_warn_sumry;
0608 __u8 rsvd7[25];
0609 __u8 data_units_read[16];
0610 __u8 data_units_written[16];
0611 __u8 host_reads[16];
0612 __u8 host_writes[16];
0613 __u8 ctrl_busy_time[16];
0614 __u8 power_cycles[16];
0615 __u8 power_on_hours[16];
0616 __u8 unsafe_shutdowns[16];
0617 __u8 media_errors[16];
0618 __u8 num_err_log_entries[16];
0619 __le32 warning_temp_time;
0620 __le32 critical_comp_time;
0621 __le16 temp_sensor[8];
0622 __le32 thm_temp1_trans_count;
0623 __le32 thm_temp2_trans_count;
0624 __le32 thm_temp1_total_time;
0625 __le32 thm_temp2_total_time;
0626 __u8 rsvd232[280];
0627 };
0628
0629 struct nvme_fw_slot_info_log {
0630 __u8 afi;
0631 __u8 rsvd1[7];
0632 __le64 frs[7];
0633 __u8 rsvd64[448];
0634 };
0635
0636 enum {
0637 NVME_CMD_EFFECTS_CSUPP = 1 << 0,
0638 NVME_CMD_EFFECTS_LBCC = 1 << 1,
0639 NVME_CMD_EFFECTS_NCC = 1 << 2,
0640 NVME_CMD_EFFECTS_NIC = 1 << 3,
0641 NVME_CMD_EFFECTS_CCC = 1 << 4,
0642 NVME_CMD_EFFECTS_CSE_MASK = 3 << 16,
0643 NVME_CMD_EFFECTS_UUID_SEL = 1 << 19,
0644 };
0645
0646 struct nvme_effects_log {
0647 __le32 acs[256];
0648 __le32 iocs[256];
0649 __u8 resv[2048];
0650 };
0651
0652 enum nvme_ana_state {
0653 NVME_ANA_OPTIMIZED = 0x01,
0654 NVME_ANA_NONOPTIMIZED = 0x02,
0655 NVME_ANA_INACCESSIBLE = 0x03,
0656 NVME_ANA_PERSISTENT_LOSS = 0x04,
0657 NVME_ANA_CHANGE = 0x0f,
0658 };
0659
0660 struct nvme_ana_group_desc {
0661 __le32 grpid;
0662 __le32 nnsids;
0663 __le64 chgcnt;
0664 __u8 state;
0665 __u8 rsvd17[15];
0666 __le32 nsids[];
0667 };
0668
0669
0670 #define NVME_ANA_LOG_RGO (1 << 0)
0671
0672 struct nvme_ana_rsp_hdr {
0673 __le64 chgcnt;
0674 __le16 ngrps;
0675 __le16 rsvd10[3];
0676 };
0677
0678 struct nvme_zone_descriptor {
0679 __u8 zt;
0680 __u8 zs;
0681 __u8 za;
0682 __u8 rsvd3[5];
0683 __le64 zcap;
0684 __le64 zslba;
0685 __le64 wp;
0686 __u8 rsvd32[32];
0687 };
0688
0689 enum {
0690 NVME_ZONE_TYPE_SEQWRITE_REQ = 0x2,
0691 };
0692
0693 struct nvme_zone_report {
0694 __le64 nr_zones;
0695 __u8 resv8[56];
0696 struct nvme_zone_descriptor entries[];
0697 };
0698
0699 enum {
0700 NVME_SMART_CRIT_SPARE = 1 << 0,
0701 NVME_SMART_CRIT_TEMPERATURE = 1 << 1,
0702 NVME_SMART_CRIT_RELIABILITY = 1 << 2,
0703 NVME_SMART_CRIT_MEDIA = 1 << 3,
0704 NVME_SMART_CRIT_VOLATILE_MEMORY = 1 << 4,
0705 };
0706
0707 enum {
0708 NVME_AER_ERROR = 0,
0709 NVME_AER_SMART = 1,
0710 NVME_AER_NOTICE = 2,
0711 NVME_AER_CSS = 6,
0712 NVME_AER_VS = 7,
0713 };
0714
0715 enum {
0716 NVME_AER_ERROR_PERSIST_INT_ERR = 0x03,
0717 };
0718
0719 enum {
0720 NVME_AER_NOTICE_NS_CHANGED = 0x00,
0721 NVME_AER_NOTICE_FW_ACT_STARTING = 0x01,
0722 NVME_AER_NOTICE_ANA = 0x03,
0723 NVME_AER_NOTICE_DISC_CHANGED = 0xf0,
0724 };
0725
0726 enum {
0727 NVME_AEN_BIT_NS_ATTR = 8,
0728 NVME_AEN_BIT_FW_ACT = 9,
0729 NVME_AEN_BIT_ANA_CHANGE = 11,
0730 NVME_AEN_BIT_DISC_CHANGE = 31,
0731 };
0732
0733 enum {
0734 NVME_AEN_CFG_NS_ATTR = 1 << NVME_AEN_BIT_NS_ATTR,
0735 NVME_AEN_CFG_FW_ACT = 1 << NVME_AEN_BIT_FW_ACT,
0736 NVME_AEN_CFG_ANA_CHANGE = 1 << NVME_AEN_BIT_ANA_CHANGE,
0737 NVME_AEN_CFG_DISC_CHANGE = 1 << NVME_AEN_BIT_DISC_CHANGE,
0738 };
0739
0740 struct nvme_lba_range_type {
0741 __u8 type;
0742 __u8 attributes;
0743 __u8 rsvd2[14];
0744 __le64 slba;
0745 __le64 nlb;
0746 __u8 guid[16];
0747 __u8 rsvd48[16];
0748 };
0749
0750 enum {
0751 NVME_LBART_TYPE_FS = 0x01,
0752 NVME_LBART_TYPE_RAID = 0x02,
0753 NVME_LBART_TYPE_CACHE = 0x03,
0754 NVME_LBART_TYPE_SWAP = 0x04,
0755
0756 NVME_LBART_ATTRIB_TEMP = 1 << 0,
0757 NVME_LBART_ATTRIB_HIDE = 1 << 1,
0758 };
0759
0760 struct nvme_reservation_status {
0761 __le32 gen;
0762 __u8 rtype;
0763 __u8 regctl[2];
0764 __u8 resv5[2];
0765 __u8 ptpls;
0766 __u8 resv10[13];
0767 struct {
0768 __le16 cntlid;
0769 __u8 rcsts;
0770 __u8 resv3[5];
0771 __le64 hostid;
0772 __le64 rkey;
0773 } regctl_ds[];
0774 };
0775
0776 enum nvme_async_event_type {
0777 NVME_AER_TYPE_ERROR = 0,
0778 NVME_AER_TYPE_SMART = 1,
0779 NVME_AER_TYPE_NOTICE = 2,
0780 };
0781
0782
0783
0784 enum nvme_opcode {
0785 nvme_cmd_flush = 0x00,
0786 nvme_cmd_write = 0x01,
0787 nvme_cmd_read = 0x02,
0788 nvme_cmd_write_uncor = 0x04,
0789 nvme_cmd_compare = 0x05,
0790 nvme_cmd_write_zeroes = 0x08,
0791 nvme_cmd_dsm = 0x09,
0792 nvme_cmd_verify = 0x0c,
0793 nvme_cmd_resv_register = 0x0d,
0794 nvme_cmd_resv_report = 0x0e,
0795 nvme_cmd_resv_acquire = 0x11,
0796 nvme_cmd_resv_release = 0x15,
0797 nvme_cmd_zone_mgmt_send = 0x79,
0798 nvme_cmd_zone_mgmt_recv = 0x7a,
0799 nvme_cmd_zone_append = 0x7d,
0800 };
0801
0802 #define nvme_opcode_name(opcode) { opcode, #opcode }
0803 #define show_nvm_opcode_name(val) \
0804 __print_symbolic(val, \
0805 nvme_opcode_name(nvme_cmd_flush), \
0806 nvme_opcode_name(nvme_cmd_write), \
0807 nvme_opcode_name(nvme_cmd_read), \
0808 nvme_opcode_name(nvme_cmd_write_uncor), \
0809 nvme_opcode_name(nvme_cmd_compare), \
0810 nvme_opcode_name(nvme_cmd_write_zeroes), \
0811 nvme_opcode_name(nvme_cmd_dsm), \
0812 nvme_opcode_name(nvme_cmd_resv_register), \
0813 nvme_opcode_name(nvme_cmd_resv_report), \
0814 nvme_opcode_name(nvme_cmd_resv_acquire), \
0815 nvme_opcode_name(nvme_cmd_resv_release), \
0816 nvme_opcode_name(nvme_cmd_zone_mgmt_send), \
0817 nvme_opcode_name(nvme_cmd_zone_mgmt_recv), \
0818 nvme_opcode_name(nvme_cmd_zone_append))
0819
0820
0821
0822
0823
0824
0825
0826
0827
0828
0829
0830
0831 enum {
0832 NVME_SGL_FMT_ADDRESS = 0x00,
0833 NVME_SGL_FMT_OFFSET = 0x01,
0834 NVME_SGL_FMT_TRANSPORT_A = 0x0A,
0835 NVME_SGL_FMT_INVALIDATE = 0x0f,
0836 };
0837
0838
0839
0840
0841
0842
0843
0844
0845
0846
0847
0848
0849
0850
0851
0852 enum {
0853 NVME_SGL_FMT_DATA_DESC = 0x00,
0854 NVME_SGL_FMT_SEG_DESC = 0x02,
0855 NVME_SGL_FMT_LAST_SEG_DESC = 0x03,
0856 NVME_KEY_SGL_FMT_DATA_DESC = 0x04,
0857 NVME_TRANSPORT_SGL_DATA_DESC = 0x05,
0858 };
0859
0860 struct nvme_sgl_desc {
0861 __le64 addr;
0862 __le32 length;
0863 __u8 rsvd[3];
0864 __u8 type;
0865 };
0866
0867 struct nvme_keyed_sgl_desc {
0868 __le64 addr;
0869 __u8 length[3];
0870 __u8 key[4];
0871 __u8 type;
0872 };
0873
0874 union nvme_data_ptr {
0875 struct {
0876 __le64 prp1;
0877 __le64 prp2;
0878 };
0879 struct nvme_sgl_desc sgl;
0880 struct nvme_keyed_sgl_desc ksgl;
0881 };
0882
0883
0884
0885
0886
0887
0888
0889
0890
0891
0892
0893
0894
0895
0896
0897 enum {
0898 NVME_CMD_FUSE_FIRST = (1 << 0),
0899 NVME_CMD_FUSE_SECOND = (1 << 1),
0900
0901 NVME_CMD_SGL_METABUF = (1 << 6),
0902 NVME_CMD_SGL_METASEG = (1 << 7),
0903 NVME_CMD_SGL_ALL = NVME_CMD_SGL_METABUF | NVME_CMD_SGL_METASEG,
0904 };
0905
0906 struct nvme_common_command {
0907 __u8 opcode;
0908 __u8 flags;
0909 __u16 command_id;
0910 __le32 nsid;
0911 __le32 cdw2[2];
0912 __le64 metadata;
0913 union nvme_data_ptr dptr;
0914 struct_group(cdws,
0915 __le32 cdw10;
0916 __le32 cdw11;
0917 __le32 cdw12;
0918 __le32 cdw13;
0919 __le32 cdw14;
0920 __le32 cdw15;
0921 );
0922 };
0923
0924 struct nvme_rw_command {
0925 __u8 opcode;
0926 __u8 flags;
0927 __u16 command_id;
0928 __le32 nsid;
0929 __le32 cdw2;
0930 __le32 cdw3;
0931 __le64 metadata;
0932 union nvme_data_ptr dptr;
0933 __le64 slba;
0934 __le16 length;
0935 __le16 control;
0936 __le32 dsmgmt;
0937 __le32 reftag;
0938 __le16 apptag;
0939 __le16 appmask;
0940 };
0941
0942 enum {
0943 NVME_RW_LR = 1 << 15,
0944 NVME_RW_FUA = 1 << 14,
0945 NVME_RW_APPEND_PIREMAP = 1 << 9,
0946 NVME_RW_DSM_FREQ_UNSPEC = 0,
0947 NVME_RW_DSM_FREQ_TYPICAL = 1,
0948 NVME_RW_DSM_FREQ_RARE = 2,
0949 NVME_RW_DSM_FREQ_READS = 3,
0950 NVME_RW_DSM_FREQ_WRITES = 4,
0951 NVME_RW_DSM_FREQ_RW = 5,
0952 NVME_RW_DSM_FREQ_ONCE = 6,
0953 NVME_RW_DSM_FREQ_PREFETCH = 7,
0954 NVME_RW_DSM_FREQ_TEMP = 8,
0955 NVME_RW_DSM_LATENCY_NONE = 0 << 4,
0956 NVME_RW_DSM_LATENCY_IDLE = 1 << 4,
0957 NVME_RW_DSM_LATENCY_NORM = 2 << 4,
0958 NVME_RW_DSM_LATENCY_LOW = 3 << 4,
0959 NVME_RW_DSM_SEQ_REQ = 1 << 6,
0960 NVME_RW_DSM_COMPRESSED = 1 << 7,
0961 NVME_RW_PRINFO_PRCHK_REF = 1 << 10,
0962 NVME_RW_PRINFO_PRCHK_APP = 1 << 11,
0963 NVME_RW_PRINFO_PRCHK_GUARD = 1 << 12,
0964 NVME_RW_PRINFO_PRACT = 1 << 13,
0965 NVME_RW_DTYPE_STREAMS = 1 << 4,
0966 };
0967
0968 struct nvme_dsm_cmd {
0969 __u8 opcode;
0970 __u8 flags;
0971 __u16 command_id;
0972 __le32 nsid;
0973 __u64 rsvd2[2];
0974 union nvme_data_ptr dptr;
0975 __le32 nr;
0976 __le32 attributes;
0977 __u32 rsvd12[4];
0978 };
0979
0980 enum {
0981 NVME_DSMGMT_IDR = 1 << 0,
0982 NVME_DSMGMT_IDW = 1 << 1,
0983 NVME_DSMGMT_AD = 1 << 2,
0984 };
0985
0986 #define NVME_DSM_MAX_RANGES 256
0987
0988 struct nvme_dsm_range {
0989 __le32 cattr;
0990 __le32 nlb;
0991 __le64 slba;
0992 };
0993
0994 struct nvme_write_zeroes_cmd {
0995 __u8 opcode;
0996 __u8 flags;
0997 __u16 command_id;
0998 __le32 nsid;
0999 __u64 rsvd2;
1000 __le64 metadata;
1001 union nvme_data_ptr dptr;
1002 __le64 slba;
1003 __le16 length;
1004 __le16 control;
1005 __le32 dsmgmt;
1006 __le32 reftag;
1007 __le16 apptag;
1008 __le16 appmask;
1009 };
1010
1011 enum nvme_zone_mgmt_action {
1012 NVME_ZONE_CLOSE = 0x1,
1013 NVME_ZONE_FINISH = 0x2,
1014 NVME_ZONE_OPEN = 0x3,
1015 NVME_ZONE_RESET = 0x4,
1016 NVME_ZONE_OFFLINE = 0x5,
1017 NVME_ZONE_SET_DESC_EXT = 0x10,
1018 };
1019
1020 struct nvme_zone_mgmt_send_cmd {
1021 __u8 opcode;
1022 __u8 flags;
1023 __u16 command_id;
1024 __le32 nsid;
1025 __le32 cdw2[2];
1026 __le64 metadata;
1027 union nvme_data_ptr dptr;
1028 __le64 slba;
1029 __le32 cdw12;
1030 __u8 zsa;
1031 __u8 select_all;
1032 __u8 rsvd13[2];
1033 __le32 cdw14[2];
1034 };
1035
1036 struct nvme_zone_mgmt_recv_cmd {
1037 __u8 opcode;
1038 __u8 flags;
1039 __u16 command_id;
1040 __le32 nsid;
1041 __le64 rsvd2[2];
1042 union nvme_data_ptr dptr;
1043 __le64 slba;
1044 __le32 numd;
1045 __u8 zra;
1046 __u8 zrasf;
1047 __u8 pr;
1048 __u8 rsvd13;
1049 __le32 cdw14[2];
1050 };
1051
1052 enum {
1053 NVME_ZRA_ZONE_REPORT = 0,
1054 NVME_ZRASF_ZONE_REPORT_ALL = 0,
1055 NVME_ZRASF_ZONE_STATE_EMPTY = 0x01,
1056 NVME_ZRASF_ZONE_STATE_IMP_OPEN = 0x02,
1057 NVME_ZRASF_ZONE_STATE_EXP_OPEN = 0x03,
1058 NVME_ZRASF_ZONE_STATE_CLOSED = 0x04,
1059 NVME_ZRASF_ZONE_STATE_READONLY = 0x05,
1060 NVME_ZRASF_ZONE_STATE_FULL = 0x06,
1061 NVME_ZRASF_ZONE_STATE_OFFLINE = 0x07,
1062 NVME_REPORT_ZONE_PARTIAL = 1,
1063 };
1064
1065
1066
1067 enum {
1068 NVME_TEMP_THRESH_MASK = 0xffff,
1069 NVME_TEMP_THRESH_SELECT_SHIFT = 16,
1070 NVME_TEMP_THRESH_TYPE_UNDER = 0x100000,
1071 };
1072
1073 struct nvme_feat_auto_pst {
1074 __le64 entries[32];
1075 };
1076
1077 enum {
1078 NVME_HOST_MEM_ENABLE = (1 << 0),
1079 NVME_HOST_MEM_RETURN = (1 << 1),
1080 };
1081
1082 struct nvme_feat_host_behavior {
1083 __u8 acre;
1084 __u8 etdas;
1085 __u8 lbafee;
1086 __u8 resv1[509];
1087 };
1088
1089 enum {
1090 NVME_ENABLE_ACRE = 1,
1091 NVME_ENABLE_LBAFEE = 1,
1092 };
1093
1094
1095
1096 enum nvme_admin_opcode {
1097 nvme_admin_delete_sq = 0x00,
1098 nvme_admin_create_sq = 0x01,
1099 nvme_admin_get_log_page = 0x02,
1100 nvme_admin_delete_cq = 0x04,
1101 nvme_admin_create_cq = 0x05,
1102 nvme_admin_identify = 0x06,
1103 nvme_admin_abort_cmd = 0x08,
1104 nvme_admin_set_features = 0x09,
1105 nvme_admin_get_features = 0x0a,
1106 nvme_admin_async_event = 0x0c,
1107 nvme_admin_ns_mgmt = 0x0d,
1108 nvme_admin_activate_fw = 0x10,
1109 nvme_admin_download_fw = 0x11,
1110 nvme_admin_dev_self_test = 0x14,
1111 nvme_admin_ns_attach = 0x15,
1112 nvme_admin_keep_alive = 0x18,
1113 nvme_admin_directive_send = 0x19,
1114 nvme_admin_directive_recv = 0x1a,
1115 nvme_admin_virtual_mgmt = 0x1c,
1116 nvme_admin_nvme_mi_send = 0x1d,
1117 nvme_admin_nvme_mi_recv = 0x1e,
1118 nvme_admin_dbbuf = 0x7C,
1119 nvme_admin_format_nvm = 0x80,
1120 nvme_admin_security_send = 0x81,
1121 nvme_admin_security_recv = 0x82,
1122 nvme_admin_sanitize_nvm = 0x84,
1123 nvme_admin_get_lba_status = 0x86,
1124 nvme_admin_vendor_start = 0xC0,
1125 };
1126
1127 #define nvme_admin_opcode_name(opcode) { opcode, #opcode }
1128 #define show_admin_opcode_name(val) \
1129 __print_symbolic(val, \
1130 nvme_admin_opcode_name(nvme_admin_delete_sq), \
1131 nvme_admin_opcode_name(nvme_admin_create_sq), \
1132 nvme_admin_opcode_name(nvme_admin_get_log_page), \
1133 nvme_admin_opcode_name(nvme_admin_delete_cq), \
1134 nvme_admin_opcode_name(nvme_admin_create_cq), \
1135 nvme_admin_opcode_name(nvme_admin_identify), \
1136 nvme_admin_opcode_name(nvme_admin_abort_cmd), \
1137 nvme_admin_opcode_name(nvme_admin_set_features), \
1138 nvme_admin_opcode_name(nvme_admin_get_features), \
1139 nvme_admin_opcode_name(nvme_admin_async_event), \
1140 nvme_admin_opcode_name(nvme_admin_ns_mgmt), \
1141 nvme_admin_opcode_name(nvme_admin_activate_fw), \
1142 nvme_admin_opcode_name(nvme_admin_download_fw), \
1143 nvme_admin_opcode_name(nvme_admin_ns_attach), \
1144 nvme_admin_opcode_name(nvme_admin_keep_alive), \
1145 nvme_admin_opcode_name(nvme_admin_directive_send), \
1146 nvme_admin_opcode_name(nvme_admin_directive_recv), \
1147 nvme_admin_opcode_name(nvme_admin_dbbuf), \
1148 nvme_admin_opcode_name(nvme_admin_format_nvm), \
1149 nvme_admin_opcode_name(nvme_admin_security_send), \
1150 nvme_admin_opcode_name(nvme_admin_security_recv), \
1151 nvme_admin_opcode_name(nvme_admin_sanitize_nvm), \
1152 nvme_admin_opcode_name(nvme_admin_get_lba_status))
1153
1154 enum {
1155 NVME_QUEUE_PHYS_CONTIG = (1 << 0),
1156 NVME_CQ_IRQ_ENABLED = (1 << 1),
1157 NVME_SQ_PRIO_URGENT = (0 << 1),
1158 NVME_SQ_PRIO_HIGH = (1 << 1),
1159 NVME_SQ_PRIO_MEDIUM = (2 << 1),
1160 NVME_SQ_PRIO_LOW = (3 << 1),
1161 NVME_FEAT_ARBITRATION = 0x01,
1162 NVME_FEAT_POWER_MGMT = 0x02,
1163 NVME_FEAT_LBA_RANGE = 0x03,
1164 NVME_FEAT_TEMP_THRESH = 0x04,
1165 NVME_FEAT_ERR_RECOVERY = 0x05,
1166 NVME_FEAT_VOLATILE_WC = 0x06,
1167 NVME_FEAT_NUM_QUEUES = 0x07,
1168 NVME_FEAT_IRQ_COALESCE = 0x08,
1169 NVME_FEAT_IRQ_CONFIG = 0x09,
1170 NVME_FEAT_WRITE_ATOMIC = 0x0a,
1171 NVME_FEAT_ASYNC_EVENT = 0x0b,
1172 NVME_FEAT_AUTO_PST = 0x0c,
1173 NVME_FEAT_HOST_MEM_BUF = 0x0d,
1174 NVME_FEAT_TIMESTAMP = 0x0e,
1175 NVME_FEAT_KATO = 0x0f,
1176 NVME_FEAT_HCTM = 0x10,
1177 NVME_FEAT_NOPSC = 0x11,
1178 NVME_FEAT_RRL = 0x12,
1179 NVME_FEAT_PLM_CONFIG = 0x13,
1180 NVME_FEAT_PLM_WINDOW = 0x14,
1181 NVME_FEAT_HOST_BEHAVIOR = 0x16,
1182 NVME_FEAT_SANITIZE = 0x17,
1183 NVME_FEAT_SW_PROGRESS = 0x80,
1184 NVME_FEAT_HOST_ID = 0x81,
1185 NVME_FEAT_RESV_MASK = 0x82,
1186 NVME_FEAT_RESV_PERSIST = 0x83,
1187 NVME_FEAT_WRITE_PROTECT = 0x84,
1188 NVME_FEAT_VENDOR_START = 0xC0,
1189 NVME_FEAT_VENDOR_END = 0xFF,
1190 NVME_LOG_ERROR = 0x01,
1191 NVME_LOG_SMART = 0x02,
1192 NVME_LOG_FW_SLOT = 0x03,
1193 NVME_LOG_CHANGED_NS = 0x04,
1194 NVME_LOG_CMD_EFFECTS = 0x05,
1195 NVME_LOG_DEVICE_SELF_TEST = 0x06,
1196 NVME_LOG_TELEMETRY_HOST = 0x07,
1197 NVME_LOG_TELEMETRY_CTRL = 0x08,
1198 NVME_LOG_ENDURANCE_GROUP = 0x09,
1199 NVME_LOG_ANA = 0x0c,
1200 NVME_LOG_DISC = 0x70,
1201 NVME_LOG_RESERVATION = 0x80,
1202 NVME_FWACT_REPL = (0 << 3),
1203 NVME_FWACT_REPL_ACTV = (1 << 3),
1204 NVME_FWACT_ACTV = (2 << 3),
1205 };
1206
1207
1208 enum {
1209 NVME_NS_NO_WRITE_PROTECT = 0,
1210 NVME_NS_WRITE_PROTECT,
1211 NVME_NS_WRITE_PROTECT_POWER_CYCLE,
1212 NVME_NS_WRITE_PROTECT_PERMANENT,
1213 };
1214
1215 #define NVME_MAX_CHANGED_NAMESPACES 1024
1216
1217 struct nvme_identify {
1218 __u8 opcode;
1219 __u8 flags;
1220 __u16 command_id;
1221 __le32 nsid;
1222 __u64 rsvd2[2];
1223 union nvme_data_ptr dptr;
1224 __u8 cns;
1225 __u8 rsvd3;
1226 __le16 ctrlid;
1227 __u8 rsvd11[3];
1228 __u8 csi;
1229 __u32 rsvd12[4];
1230 };
1231
1232 #define NVME_IDENTIFY_DATA_SIZE 4096
1233
1234 struct nvme_features {
1235 __u8 opcode;
1236 __u8 flags;
1237 __u16 command_id;
1238 __le32 nsid;
1239 __u64 rsvd2[2];
1240 union nvme_data_ptr dptr;
1241 __le32 fid;
1242 __le32 dword11;
1243 __le32 dword12;
1244 __le32 dword13;
1245 __le32 dword14;
1246 __le32 dword15;
1247 };
1248
1249 struct nvme_host_mem_buf_desc {
1250 __le64 addr;
1251 __le32 size;
1252 __u32 rsvd;
1253 };
1254
1255 struct nvme_create_cq {
1256 __u8 opcode;
1257 __u8 flags;
1258 __u16 command_id;
1259 __u32 rsvd1[5];
1260 __le64 prp1;
1261 __u64 rsvd8;
1262 __le16 cqid;
1263 __le16 qsize;
1264 __le16 cq_flags;
1265 __le16 irq_vector;
1266 __u32 rsvd12[4];
1267 };
1268
1269 struct nvme_create_sq {
1270 __u8 opcode;
1271 __u8 flags;
1272 __u16 command_id;
1273 __u32 rsvd1[5];
1274 __le64 prp1;
1275 __u64 rsvd8;
1276 __le16 sqid;
1277 __le16 qsize;
1278 __le16 sq_flags;
1279 __le16 cqid;
1280 __u32 rsvd12[4];
1281 };
1282
1283 struct nvme_delete_queue {
1284 __u8 opcode;
1285 __u8 flags;
1286 __u16 command_id;
1287 __u32 rsvd1[9];
1288 __le16 qid;
1289 __u16 rsvd10;
1290 __u32 rsvd11[5];
1291 };
1292
1293 struct nvme_abort_cmd {
1294 __u8 opcode;
1295 __u8 flags;
1296 __u16 command_id;
1297 __u32 rsvd1[9];
1298 __le16 sqid;
1299 __u16 cid;
1300 __u32 rsvd11[5];
1301 };
1302
1303 struct nvme_download_firmware {
1304 __u8 opcode;
1305 __u8 flags;
1306 __u16 command_id;
1307 __u32 rsvd1[5];
1308 union nvme_data_ptr dptr;
1309 __le32 numd;
1310 __le32 offset;
1311 __u32 rsvd12[4];
1312 };
1313
1314 struct nvme_format_cmd {
1315 __u8 opcode;
1316 __u8 flags;
1317 __u16 command_id;
1318 __le32 nsid;
1319 __u64 rsvd2[4];
1320 __le32 cdw10;
1321 __u32 rsvd11[5];
1322 };
1323
1324 struct nvme_get_log_page_command {
1325 __u8 opcode;
1326 __u8 flags;
1327 __u16 command_id;
1328 __le32 nsid;
1329 __u64 rsvd2[2];
1330 union nvme_data_ptr dptr;
1331 __u8 lid;
1332 __u8 lsp;
1333 __le16 numdl;
1334 __le16 numdu;
1335 __u16 rsvd11;
1336 union {
1337 struct {
1338 __le32 lpol;
1339 __le32 lpou;
1340 };
1341 __le64 lpo;
1342 };
1343 __u8 rsvd14[3];
1344 __u8 csi;
1345 __u32 rsvd15;
1346 };
1347
1348 struct nvme_directive_cmd {
1349 __u8 opcode;
1350 __u8 flags;
1351 __u16 command_id;
1352 __le32 nsid;
1353 __u64 rsvd2[2];
1354 union nvme_data_ptr dptr;
1355 __le32 numd;
1356 __u8 doper;
1357 __u8 dtype;
1358 __le16 dspec;
1359 __u8 endir;
1360 __u8 tdtype;
1361 __u16 rsvd15;
1362
1363 __u32 rsvd16[3];
1364 };
1365
1366
1367
1368
1369 enum nvmf_fabrics_opcode {
1370 nvme_fabrics_command = 0x7f,
1371 };
1372
1373 enum nvmf_capsule_command {
1374 nvme_fabrics_type_property_set = 0x00,
1375 nvme_fabrics_type_connect = 0x01,
1376 nvme_fabrics_type_property_get = 0x04,
1377 nvme_fabrics_type_auth_send = 0x05,
1378 nvme_fabrics_type_auth_receive = 0x06,
1379 };
1380
1381 #define nvme_fabrics_type_name(type) { type, #type }
1382 #define show_fabrics_type_name(type) \
1383 __print_symbolic(type, \
1384 nvme_fabrics_type_name(nvme_fabrics_type_property_set), \
1385 nvme_fabrics_type_name(nvme_fabrics_type_connect), \
1386 nvme_fabrics_type_name(nvme_fabrics_type_property_get), \
1387 nvme_fabrics_type_name(nvme_fabrics_type_auth_send), \
1388 nvme_fabrics_type_name(nvme_fabrics_type_auth_receive))
1389
1390
1391
1392
1393 #define show_opcode_name(qid, opcode, fctype) \
1394 ((opcode) == nvme_fabrics_command ? \
1395 show_fabrics_type_name(fctype) : \
1396 ((qid) ? \
1397 show_nvm_opcode_name(opcode) : \
1398 show_admin_opcode_name(opcode)))
1399
1400 struct nvmf_common_command {
1401 __u8 opcode;
1402 __u8 resv1;
1403 __u16 command_id;
1404 __u8 fctype;
1405 __u8 resv2[35];
1406 __u8 ts[24];
1407 };
1408
1409
1410
1411
1412
1413
1414
1415 #define NVME_CNTLID_MIN 1
1416 #define NVME_CNTLID_MAX 0xffef
1417 #define NVME_CNTLID_DYNAMIC 0xffff
1418
1419 #define MAX_DISC_LOGS 255
1420
1421
1422 enum {
1423 NVME_DISC_EFLAGS_EPCSD = (1 << 1),
1424 NVME_DISC_EFLAGS_DUPRETINFO = (1 << 0),
1425 };
1426
1427
1428 struct nvmf_disc_rsp_page_entry {
1429 __u8 trtype;
1430 __u8 adrfam;
1431 __u8 subtype;
1432 __u8 treq;
1433 __le16 portid;
1434 __le16 cntlid;
1435 __le16 asqsz;
1436 __le16 eflags;
1437 __u8 resv10[20];
1438 char trsvcid[NVMF_TRSVCID_SIZE];
1439 __u8 resv64[192];
1440 char subnqn[NVMF_NQN_FIELD_LEN];
1441 char traddr[NVMF_TRADDR_SIZE];
1442 union tsas {
1443 char common[NVMF_TSAS_SIZE];
1444 struct rdma {
1445 __u8 qptype;
1446 __u8 prtype;
1447 __u8 cms;
1448 __u8 resv3[5];
1449 __u16 pkey;
1450 __u8 resv10[246];
1451 } rdma;
1452 } tsas;
1453 };
1454
1455
1456 struct nvmf_disc_rsp_page_hdr {
1457 __le64 genctr;
1458 __le64 numrec;
1459 __le16 recfmt;
1460 __u8 resv14[1006];
1461 struct nvmf_disc_rsp_page_entry entries[];
1462 };
1463
1464 enum {
1465 NVME_CONNECT_DISABLE_SQFLOW = (1 << 2),
1466 };
1467
1468 struct nvmf_connect_command {
1469 __u8 opcode;
1470 __u8 resv1;
1471 __u16 command_id;
1472 __u8 fctype;
1473 __u8 resv2[19];
1474 union nvme_data_ptr dptr;
1475 __le16 recfmt;
1476 __le16 qid;
1477 __le16 sqsize;
1478 __u8 cattr;
1479 __u8 resv3;
1480 __le32 kato;
1481 __u8 resv4[12];
1482 };
1483
1484 enum {
1485 NVME_CONNECT_AUTHREQ_ASCR = (1 << 2),
1486 NVME_CONNECT_AUTHREQ_ATR = (1 << 1),
1487 };
1488
1489 struct nvmf_connect_data {
1490 uuid_t hostid;
1491 __le16 cntlid;
1492 char resv4[238];
1493 char subsysnqn[NVMF_NQN_FIELD_LEN];
1494 char hostnqn[NVMF_NQN_FIELD_LEN];
1495 char resv5[256];
1496 };
1497
1498 struct nvmf_property_set_command {
1499 __u8 opcode;
1500 __u8 resv1;
1501 __u16 command_id;
1502 __u8 fctype;
1503 __u8 resv2[35];
1504 __u8 attrib;
1505 __u8 resv3[3];
1506 __le32 offset;
1507 __le64 value;
1508 __u8 resv4[8];
1509 };
1510
1511 struct nvmf_property_get_command {
1512 __u8 opcode;
1513 __u8 resv1;
1514 __u16 command_id;
1515 __u8 fctype;
1516 __u8 resv2[35];
1517 __u8 attrib;
1518 __u8 resv3[3];
1519 __le32 offset;
1520 __u8 resv4[16];
1521 };
1522
1523 struct nvmf_auth_common_command {
1524 __u8 opcode;
1525 __u8 resv1;
1526 __u16 command_id;
1527 __u8 fctype;
1528 __u8 resv2[19];
1529 union nvme_data_ptr dptr;
1530 __u8 resv3;
1531 __u8 spsp0;
1532 __u8 spsp1;
1533 __u8 secp;
1534 __le32 al_tl;
1535 __u8 resv4[16];
1536 };
1537
1538 struct nvmf_auth_send_command {
1539 __u8 opcode;
1540 __u8 resv1;
1541 __u16 command_id;
1542 __u8 fctype;
1543 __u8 resv2[19];
1544 union nvme_data_ptr dptr;
1545 __u8 resv3;
1546 __u8 spsp0;
1547 __u8 spsp1;
1548 __u8 secp;
1549 __le32 tl;
1550 __u8 resv4[16];
1551 };
1552
1553 struct nvmf_auth_receive_command {
1554 __u8 opcode;
1555 __u8 resv1;
1556 __u16 command_id;
1557 __u8 fctype;
1558 __u8 resv2[19];
1559 union nvme_data_ptr dptr;
1560 __u8 resv3;
1561 __u8 spsp0;
1562 __u8 spsp1;
1563 __u8 secp;
1564 __le32 al;
1565 __u8 resv4[16];
1566 };
1567
1568
1569 enum {
1570 NVME_AUTH_DHCHAP_PROTOCOL_IDENTIFIER = 0xe9,
1571 };
1572
1573
1574 enum {
1575 NVME_AUTH_COMMON_MESSAGES = 0x00,
1576 NVME_AUTH_DHCHAP_MESSAGES = 0x01,
1577 };
1578
1579
1580 enum {
1581 NVME_AUTH_DHCHAP_MESSAGE_NEGOTIATE = 0x00,
1582 NVME_AUTH_DHCHAP_MESSAGE_CHALLENGE = 0x01,
1583 NVME_AUTH_DHCHAP_MESSAGE_REPLY = 0x02,
1584 NVME_AUTH_DHCHAP_MESSAGE_SUCCESS1 = 0x03,
1585 NVME_AUTH_DHCHAP_MESSAGE_SUCCESS2 = 0x04,
1586 NVME_AUTH_DHCHAP_MESSAGE_FAILURE2 = 0xf0,
1587 NVME_AUTH_DHCHAP_MESSAGE_FAILURE1 = 0xf1,
1588 };
1589
1590 struct nvmf_auth_dhchap_protocol_descriptor {
1591 __u8 authid;
1592 __u8 rsvd;
1593 __u8 halen;
1594 __u8 dhlen;
1595 __u8 idlist[60];
1596 };
1597
1598 enum {
1599 NVME_AUTH_DHCHAP_AUTH_ID = 0x01,
1600 };
1601
1602
1603 enum {
1604 NVME_AUTH_HASH_SHA256 = 0x01,
1605 NVME_AUTH_HASH_SHA384 = 0x02,
1606 NVME_AUTH_HASH_SHA512 = 0x03,
1607 NVME_AUTH_HASH_INVALID = 0xff,
1608 };
1609
1610
1611 enum {
1612 NVME_AUTH_DHGROUP_NULL = 0x00,
1613 NVME_AUTH_DHGROUP_2048 = 0x01,
1614 NVME_AUTH_DHGROUP_3072 = 0x02,
1615 NVME_AUTH_DHGROUP_4096 = 0x03,
1616 NVME_AUTH_DHGROUP_6144 = 0x04,
1617 NVME_AUTH_DHGROUP_8192 = 0x05,
1618 NVME_AUTH_DHGROUP_INVALID = 0xff,
1619 };
1620
1621 union nvmf_auth_protocol {
1622 struct nvmf_auth_dhchap_protocol_descriptor dhchap;
1623 };
1624
1625 struct nvmf_auth_dhchap_negotiate_data {
1626 __u8 auth_type;
1627 __u8 auth_id;
1628 __le16 rsvd;
1629 __le16 t_id;
1630 __u8 sc_c;
1631 __u8 napd;
1632 union nvmf_auth_protocol auth_protocol[];
1633 };
1634
1635 struct nvmf_auth_dhchap_challenge_data {
1636 __u8 auth_type;
1637 __u8 auth_id;
1638 __u16 rsvd1;
1639 __le16 t_id;
1640 __u8 hl;
1641 __u8 rsvd2;
1642 __u8 hashid;
1643 __u8 dhgid;
1644 __le16 dhvlen;
1645 __le32 seqnum;
1646
1647 __u8 cval[];
1648
1649 };
1650
1651 struct nvmf_auth_dhchap_reply_data {
1652 __u8 auth_type;
1653 __u8 auth_id;
1654 __le16 rsvd1;
1655 __le16 t_id;
1656 __u8 hl;
1657 __u8 rsvd2;
1658 __u8 cvalid;
1659 __u8 rsvd3;
1660 __le16 dhvlen;
1661 __le32 seqnum;
1662
1663 __u8 rval[];
1664
1665
1666 };
1667
1668 enum {
1669 NVME_AUTH_DHCHAP_RESPONSE_VALID = (1 << 0),
1670 };
1671
1672 struct nvmf_auth_dhchap_success1_data {
1673 __u8 auth_type;
1674 __u8 auth_id;
1675 __le16 rsvd1;
1676 __le16 t_id;
1677 __u8 hl;
1678 __u8 rsvd2;
1679 __u8 rvalid;
1680 __u8 rsvd3[7];
1681
1682 __u8 rval[];
1683 };
1684
1685 struct nvmf_auth_dhchap_success2_data {
1686 __u8 auth_type;
1687 __u8 auth_id;
1688 __le16 rsvd1;
1689 __le16 t_id;
1690 __u8 rsvd2[10];
1691 };
1692
1693 struct nvmf_auth_dhchap_failure_data {
1694 __u8 auth_type;
1695 __u8 auth_id;
1696 __le16 rsvd1;
1697 __le16 t_id;
1698 __u8 rescode;
1699 __u8 rescode_exp;
1700 };
1701
1702 enum {
1703 NVME_AUTH_DHCHAP_FAILURE_REASON_FAILED = 0x01,
1704 };
1705
1706 enum {
1707 NVME_AUTH_DHCHAP_FAILURE_FAILED = 0x01,
1708 NVME_AUTH_DHCHAP_FAILURE_NOT_USABLE = 0x02,
1709 NVME_AUTH_DHCHAP_FAILURE_CONCAT_MISMATCH = 0x03,
1710 NVME_AUTH_DHCHAP_FAILURE_HASH_UNUSABLE = 0x04,
1711 NVME_AUTH_DHCHAP_FAILURE_DHGROUP_UNUSABLE = 0x05,
1712 NVME_AUTH_DHCHAP_FAILURE_INCORRECT_PAYLOAD = 0x06,
1713 NVME_AUTH_DHCHAP_FAILURE_INCORRECT_MESSAGE = 0x07,
1714 };
1715
1716
1717 struct nvme_dbbuf {
1718 __u8 opcode;
1719 __u8 flags;
1720 __u16 command_id;
1721 __u32 rsvd1[5];
1722 __le64 prp1;
1723 __le64 prp2;
1724 __u32 rsvd12[6];
1725 };
1726
1727 struct streams_directive_params {
1728 __le16 msl;
1729 __le16 nssa;
1730 __le16 nsso;
1731 __u8 rsvd[10];
1732 __le32 sws;
1733 __le16 sgs;
1734 __le16 nsa;
1735 __le16 nso;
1736 __u8 rsvd2[6];
1737 };
1738
1739 struct nvme_command {
1740 union {
1741 struct nvme_common_command common;
1742 struct nvme_rw_command rw;
1743 struct nvme_identify identify;
1744 struct nvme_features features;
1745 struct nvme_create_cq create_cq;
1746 struct nvme_create_sq create_sq;
1747 struct nvme_delete_queue delete_queue;
1748 struct nvme_download_firmware dlfw;
1749 struct nvme_format_cmd format;
1750 struct nvme_dsm_cmd dsm;
1751 struct nvme_write_zeroes_cmd write_zeroes;
1752 struct nvme_zone_mgmt_send_cmd zms;
1753 struct nvme_zone_mgmt_recv_cmd zmr;
1754 struct nvme_abort_cmd abort;
1755 struct nvme_get_log_page_command get_log_page;
1756 struct nvmf_common_command fabrics;
1757 struct nvmf_connect_command connect;
1758 struct nvmf_property_set_command prop_set;
1759 struct nvmf_property_get_command prop_get;
1760 struct nvmf_auth_common_command auth_common;
1761 struct nvmf_auth_send_command auth_send;
1762 struct nvmf_auth_receive_command auth_receive;
1763 struct nvme_dbbuf dbbuf;
1764 struct nvme_directive_cmd directive;
1765 };
1766 };
1767
1768 static inline bool nvme_is_fabrics(struct nvme_command *cmd)
1769 {
1770 return cmd->common.opcode == nvme_fabrics_command;
1771 }
1772
1773 struct nvme_error_slot {
1774 __le64 error_count;
1775 __le16 sqid;
1776 __le16 cmdid;
1777 __le16 status_field;
1778 __le16 param_error_location;
1779 __le64 lba;
1780 __le32 nsid;
1781 __u8 vs;
1782 __u8 resv[3];
1783 __le64 cs;
1784 __u8 resv2[24];
1785 };
1786
1787 static inline bool nvme_is_write(struct nvme_command *cmd)
1788 {
1789
1790
1791
1792
1793
1794 if (unlikely(nvme_is_fabrics(cmd)))
1795 return cmd->fabrics.fctype & 1;
1796 return cmd->common.opcode & 1;
1797 }
1798
1799 enum {
1800
1801
1802
1803 NVME_SC_SUCCESS = 0x0,
1804 NVME_SC_INVALID_OPCODE = 0x1,
1805 NVME_SC_INVALID_FIELD = 0x2,
1806 NVME_SC_CMDID_CONFLICT = 0x3,
1807 NVME_SC_DATA_XFER_ERROR = 0x4,
1808 NVME_SC_POWER_LOSS = 0x5,
1809 NVME_SC_INTERNAL = 0x6,
1810 NVME_SC_ABORT_REQ = 0x7,
1811 NVME_SC_ABORT_QUEUE = 0x8,
1812 NVME_SC_FUSED_FAIL = 0x9,
1813 NVME_SC_FUSED_MISSING = 0xa,
1814 NVME_SC_INVALID_NS = 0xb,
1815 NVME_SC_CMD_SEQ_ERROR = 0xc,
1816 NVME_SC_SGL_INVALID_LAST = 0xd,
1817 NVME_SC_SGL_INVALID_COUNT = 0xe,
1818 NVME_SC_SGL_INVALID_DATA = 0xf,
1819 NVME_SC_SGL_INVALID_METADATA = 0x10,
1820 NVME_SC_SGL_INVALID_TYPE = 0x11,
1821 NVME_SC_CMB_INVALID_USE = 0x12,
1822 NVME_SC_PRP_INVALID_OFFSET = 0x13,
1823 NVME_SC_ATOMIC_WU_EXCEEDED = 0x14,
1824 NVME_SC_OP_DENIED = 0x15,
1825 NVME_SC_SGL_INVALID_OFFSET = 0x16,
1826 NVME_SC_RESERVED = 0x17,
1827 NVME_SC_HOST_ID_INCONSIST = 0x18,
1828 NVME_SC_KA_TIMEOUT_EXPIRED = 0x19,
1829 NVME_SC_KA_TIMEOUT_INVALID = 0x1A,
1830 NVME_SC_ABORTED_PREEMPT_ABORT = 0x1B,
1831 NVME_SC_SANITIZE_FAILED = 0x1C,
1832 NVME_SC_SANITIZE_IN_PROGRESS = 0x1D,
1833 NVME_SC_SGL_INVALID_GRANULARITY = 0x1E,
1834 NVME_SC_CMD_NOT_SUP_CMB_QUEUE = 0x1F,
1835 NVME_SC_NS_WRITE_PROTECTED = 0x20,
1836 NVME_SC_CMD_INTERRUPTED = 0x21,
1837 NVME_SC_TRANSIENT_TR_ERR = 0x22,
1838 NVME_SC_ADMIN_COMMAND_MEDIA_NOT_READY = 0x24,
1839 NVME_SC_INVALID_IO_CMD_SET = 0x2C,
1840
1841 NVME_SC_LBA_RANGE = 0x80,
1842 NVME_SC_CAP_EXCEEDED = 0x81,
1843 NVME_SC_NS_NOT_READY = 0x82,
1844 NVME_SC_RESERVATION_CONFLICT = 0x83,
1845 NVME_SC_FORMAT_IN_PROGRESS = 0x84,
1846
1847
1848
1849
1850 NVME_SC_CQ_INVALID = 0x100,
1851 NVME_SC_QID_INVALID = 0x101,
1852 NVME_SC_QUEUE_SIZE = 0x102,
1853 NVME_SC_ABORT_LIMIT = 0x103,
1854 NVME_SC_ABORT_MISSING = 0x104,
1855 NVME_SC_ASYNC_LIMIT = 0x105,
1856 NVME_SC_FIRMWARE_SLOT = 0x106,
1857 NVME_SC_FIRMWARE_IMAGE = 0x107,
1858 NVME_SC_INVALID_VECTOR = 0x108,
1859 NVME_SC_INVALID_LOG_PAGE = 0x109,
1860 NVME_SC_INVALID_FORMAT = 0x10a,
1861 NVME_SC_FW_NEEDS_CONV_RESET = 0x10b,
1862 NVME_SC_INVALID_QUEUE = 0x10c,
1863 NVME_SC_FEATURE_NOT_SAVEABLE = 0x10d,
1864 NVME_SC_FEATURE_NOT_CHANGEABLE = 0x10e,
1865 NVME_SC_FEATURE_NOT_PER_NS = 0x10f,
1866 NVME_SC_FW_NEEDS_SUBSYS_RESET = 0x110,
1867 NVME_SC_FW_NEEDS_RESET = 0x111,
1868 NVME_SC_FW_NEEDS_MAX_TIME = 0x112,
1869 NVME_SC_FW_ACTIVATE_PROHIBITED = 0x113,
1870 NVME_SC_OVERLAPPING_RANGE = 0x114,
1871 NVME_SC_NS_INSUFFICIENT_CAP = 0x115,
1872 NVME_SC_NS_ID_UNAVAILABLE = 0x116,
1873 NVME_SC_NS_ALREADY_ATTACHED = 0x118,
1874 NVME_SC_NS_IS_PRIVATE = 0x119,
1875 NVME_SC_NS_NOT_ATTACHED = 0x11a,
1876 NVME_SC_THIN_PROV_NOT_SUPP = 0x11b,
1877 NVME_SC_CTRL_LIST_INVALID = 0x11c,
1878 NVME_SC_SELT_TEST_IN_PROGRESS = 0x11d,
1879 NVME_SC_BP_WRITE_PROHIBITED = 0x11e,
1880 NVME_SC_CTRL_ID_INVALID = 0x11f,
1881 NVME_SC_SEC_CTRL_STATE_INVALID = 0x120,
1882 NVME_SC_CTRL_RES_NUM_INVALID = 0x121,
1883 NVME_SC_RES_ID_INVALID = 0x122,
1884 NVME_SC_PMR_SAN_PROHIBITED = 0x123,
1885 NVME_SC_ANA_GROUP_ID_INVALID = 0x124,
1886 NVME_SC_ANA_ATTACH_FAILED = 0x125,
1887
1888
1889
1890
1891 NVME_SC_BAD_ATTRIBUTES = 0x180,
1892 NVME_SC_INVALID_PI = 0x181,
1893 NVME_SC_READ_ONLY = 0x182,
1894 NVME_SC_ONCS_NOT_SUPPORTED = 0x183,
1895
1896
1897
1898
1899 NVME_SC_CONNECT_FORMAT = 0x180,
1900 NVME_SC_CONNECT_CTRL_BUSY = 0x181,
1901 NVME_SC_CONNECT_INVALID_PARAM = 0x182,
1902 NVME_SC_CONNECT_RESTART_DISC = 0x183,
1903 NVME_SC_CONNECT_INVALID_HOST = 0x184,
1904
1905 NVME_SC_DISCOVERY_RESTART = 0x190,
1906 NVME_SC_AUTH_REQUIRED = 0x191,
1907
1908
1909
1910
1911 NVME_SC_ZONE_BOUNDARY_ERROR = 0x1b8,
1912 NVME_SC_ZONE_FULL = 0x1b9,
1913 NVME_SC_ZONE_READ_ONLY = 0x1ba,
1914 NVME_SC_ZONE_OFFLINE = 0x1bb,
1915 NVME_SC_ZONE_INVALID_WRITE = 0x1bc,
1916 NVME_SC_ZONE_TOO_MANY_ACTIVE = 0x1bd,
1917 NVME_SC_ZONE_TOO_MANY_OPEN = 0x1be,
1918 NVME_SC_ZONE_INVALID_TRANSITION = 0x1bf,
1919
1920
1921
1922
1923 NVME_SC_WRITE_FAULT = 0x280,
1924 NVME_SC_READ_ERROR = 0x281,
1925 NVME_SC_GUARD_CHECK = 0x282,
1926 NVME_SC_APPTAG_CHECK = 0x283,
1927 NVME_SC_REFTAG_CHECK = 0x284,
1928 NVME_SC_COMPARE_FAILED = 0x285,
1929 NVME_SC_ACCESS_DENIED = 0x286,
1930 NVME_SC_UNWRITTEN_BLOCK = 0x287,
1931
1932
1933
1934
1935 NVME_SC_INTERNAL_PATH_ERROR = 0x300,
1936 NVME_SC_ANA_PERSISTENT_LOSS = 0x301,
1937 NVME_SC_ANA_INACCESSIBLE = 0x302,
1938 NVME_SC_ANA_TRANSITION = 0x303,
1939 NVME_SC_CTRL_PATH_ERROR = 0x360,
1940 NVME_SC_HOST_PATH_ERROR = 0x370,
1941 NVME_SC_HOST_ABORTED_CMD = 0x371,
1942
1943 NVME_SC_CRD = 0x1800,
1944 NVME_SC_MORE = 0x2000,
1945 NVME_SC_DNR = 0x4000,
1946 };
1947
1948 struct nvme_completion {
1949
1950
1951
1952 union nvme_result {
1953 __le16 u16;
1954 __le32 u32;
1955 __le64 u64;
1956 } result;
1957 __le16 sq_head;
1958 __le16 sq_id;
1959 __u16 command_id;
1960 __le16 status;
1961 };
1962
1963 #define NVME_VS(major, minor, tertiary) \
1964 (((major) << 16) | ((minor) << 8) | (tertiary))
1965
1966 #define NVME_MAJOR(ver) ((ver) >> 16)
1967 #define NVME_MINOR(ver) (((ver) >> 8) & 0xff)
1968 #define NVME_TERTIARY(ver) ((ver) & 0xff)
1969
1970 #endif