hc
2024-05-10 37f49e37ab4cb5d0bc4c60eb5c6d4dd57db767bb
kernel/include/linux/nvme.h
....@@ -1,20 +1,13 @@
1
+/* SPDX-License-Identifier: GPL-2.0 */
12 /*
23 * Definitions for the NVM Express interface
34 * Copyright (c) 2011-2014, Intel Corporation.
4
- *
5
- * This program is free software; you can redistribute it and/or modify it
6
- * under the terms and conditions of the GNU General Public License,
7
- * version 2, as published by the Free Software Foundation.
8
- *
9
- * This program is distributed in the hope it will be useful, but WITHOUT
10
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12
- * more details.
135 */
146
157 #ifndef _LINUX_NVME_H
168 #define _LINUX_NVME_H
179
10
+#include <linux/bits.h>
1811 #include <linux/types.h>
1912 #include <linux/uuid.h>
2013
....@@ -46,21 +39,28 @@
4639 NVMF_ADDR_FAMILY_IP6 = 2, /* IP6 */
4740 NVMF_ADDR_FAMILY_IB = 3, /* InfiniBand */
4841 NVMF_ADDR_FAMILY_FC = 4, /* Fibre Channel */
42
+ NVMF_ADDR_FAMILY_LOOP = 254, /* Reserved for host usage */
43
+ NVMF_ADDR_FAMILY_MAX,
4944 };
5045
5146 /* Transport Type codes for Discovery Log Page entry TRTYPE field */
5247 enum {
5348 NVMF_TRTYPE_RDMA = 1, /* RDMA */
5449 NVMF_TRTYPE_FC = 2, /* Fibre Channel */
50
+ NVMF_TRTYPE_TCP = 3, /* TCP/IP */
5551 NVMF_TRTYPE_LOOP = 254, /* Reserved for host usage */
5652 NVMF_TRTYPE_MAX,
5753 };
5854
5955 /* Transport Requirements codes for Discovery Log Page entry TREQ field */
6056 enum {
61
- NVMF_TREQ_NOT_SPECIFIED = 0, /* Not specified */
62
- NVMF_TREQ_REQUIRED = 1, /* Required */
63
- NVMF_TREQ_NOT_REQUIRED = 2, /* Not Required */
57
+ NVMF_TREQ_NOT_SPECIFIED = 0, /* Not specified */
58
+ NVMF_TREQ_REQUIRED = 1, /* Required */
59
+ NVMF_TREQ_NOT_REQUIRED = 2, /* Not Required */
60
+#define NVME_TREQ_SECURE_CHANNEL_MASK \
61
+ (NVMF_TREQ_REQUIRED | NVMF_TREQ_NOT_REQUIRED)
62
+
63
+ NVMF_TREQ_DISABLE_SQFLOW = (1 << 2), /* Supports SQ flow control disable */
6464 };
6565
6666 /* RDMA QP Service Type codes for Discovery Log Page entry TSAS
....@@ -110,8 +110,25 @@
110110 NVME_REG_AQA = 0x0024, /* Admin Queue Attributes */
111111 NVME_REG_ASQ = 0x0028, /* Admin SQ Base Address */
112112 NVME_REG_ACQ = 0x0030, /* Admin CQ Base Address */
113
- NVME_REG_CMBLOC = 0x0038, /* Controller Memory Buffer Location */
113
+ NVME_REG_CMBLOC = 0x0038, /* Controller Memory Buffer Location */
114114 NVME_REG_CMBSZ = 0x003c, /* Controller Memory Buffer Size */
115
+ NVME_REG_BPINFO = 0x0040, /* Boot Partition Information */
116
+ NVME_REG_BPRSEL = 0x0044, /* Boot Partition Read Select */
117
+ NVME_REG_BPMBL = 0x0048, /* Boot Partition Memory Buffer
118
+ * Location
119
+ */
120
+ NVME_REG_CMBMSC = 0x0050, /* Controller Memory Buffer Memory
121
+ * Space Control
122
+ */
123
+ NVME_REG_PMRCAP = 0x0e00, /* Persistent Memory Capabilities */
124
+ NVME_REG_PMRCTL = 0x0e04, /* Persistent Memory Region Control */
125
+ NVME_REG_PMRSTS = 0x0e08, /* Persistent Memory Region Status */
126
+ NVME_REG_PMREBS = 0x0e0c, /* Persistent Memory Region Elasticity
127
+ * Buffer Size
128
+ */
129
+ NVME_REG_PMRSWTP = 0x0e10, /* Persistent Memory Region Sustained
130
+ * Write Throughput
131
+ */
115132 NVME_REG_DBS = 0x1000, /* SQ 0 Tail Doorbell */
116133 };
117134
....@@ -119,8 +136,10 @@
119136 #define NVME_CAP_TIMEOUT(cap) (((cap) >> 24) & 0xff)
120137 #define NVME_CAP_STRIDE(cap) (((cap) >> 32) & 0xf)
121138 #define NVME_CAP_NSSRC(cap) (((cap) >> 36) & 0x1)
139
+#define NVME_CAP_CSS(cap) (((cap) >> 37) & 0xff)
122140 #define NVME_CAP_MPSMIN(cap) (((cap) >> 48) & 0xf)
123141 #define NVME_CAP_MPSMAX(cap) (((cap) >> 52) & 0xf)
142
+#define NVME_CAP_CMBS(cap) (((cap) >> 57) & 0x1)
124143
125144 #define NVME_CMB_BIR(cmbloc) ((cmbloc) & 0x7)
126145 #define NVME_CMB_OFST(cmbloc) (((cmbloc) >> 12) & 0xfffff)
....@@ -143,12 +162,12 @@
143162 * Submission and Completion Queue Entry Sizes for the NVM command set.
144163 * (In bytes and specified as a power of two (2^n)).
145164 */
165
+#define NVME_ADM_SQES 6
146166 #define NVME_NVM_IOSQES 6
147167 #define NVME_NVM_IOCQES 4
148168
149169 enum {
150170 NVME_CC_ENABLE = 1 << 0,
151
- NVME_CC_CSS_NVM = 0 << 4,
152171 NVME_CC_EN_SHIFT = 0,
153172 NVME_CC_CSS_SHIFT = 4,
154173 NVME_CC_MPS_SHIFT = 7,
....@@ -156,6 +175,9 @@
156175 NVME_CC_SHN_SHIFT = 14,
157176 NVME_CC_IOSQES_SHIFT = 16,
158177 NVME_CC_IOCQES_SHIFT = 20,
178
+ NVME_CC_CSS_NVM = 0 << NVME_CC_CSS_SHIFT,
179
+ NVME_CC_CSS_CSI = 6 << NVME_CC_CSS_SHIFT,
180
+ NVME_CC_CSS_MASK = 7 << NVME_CC_CSS_SHIFT,
159181 NVME_CC_AMS_RR = 0 << NVME_CC_AMS_SHIFT,
160182 NVME_CC_AMS_WRRU = 1 << NVME_CC_AMS_SHIFT,
161183 NVME_CC_AMS_VS = 7 << NVME_CC_AMS_SHIFT,
....@@ -165,6 +187,8 @@
165187 NVME_CC_SHN_MASK = 3 << NVME_CC_SHN_SHIFT,
166188 NVME_CC_IOSQES = NVME_NVM_IOSQES << NVME_CC_IOSQES_SHIFT,
167189 NVME_CC_IOCQES = NVME_NVM_IOCQES << NVME_CC_IOCQES_SHIFT,
190
+ NVME_CAP_CSS_NVM = 1 << 0,
191
+ NVME_CAP_CSS_CSI = 1 << 6,
168192 NVME_CSTS_RDY = 1 << 0,
169193 NVME_CSTS_CFS = 1 << 1,
170194 NVME_CSTS_NSSRO = 1 << 4,
....@@ -173,6 +197,8 @@
173197 NVME_CSTS_SHST_OCCUR = 1 << 2,
174198 NVME_CSTS_SHST_CMPLT = 2 << 2,
175199 NVME_CSTS_SHST_MASK = 3 << 2,
200
+ NVME_CMBMSC_CRE = 1 << 0,
201
+ NVME_CMBMSC_CMSE = 1 << 1,
176202 };
177203
178204 struct nvme_id_power_state {
....@@ -198,6 +224,11 @@
198224 NVME_PS_FLAGS_NON_OP_STATE = 1 << 1,
199225 };
200226
227
+enum nvme_ctrl_attr {
228
+ NVME_CTRL_ATTR_HID_128_BIT = (1 << 0),
229
+ NVME_CTRL_ATTR_TBKAS = (1 << 6),
230
+};
231
+
201232 struct nvme_id_ctrl {
202233 __le16 vid;
203234 __le16 ssvid;
....@@ -214,7 +245,11 @@
214245 __le32 rtd3e;
215246 __le32 oaes;
216247 __le32 ctratt;
217
- __u8 rsvd100[156];
248
+ __u8 rsvd100[28];
249
+ __le16 crdt1;
250
+ __le16 crdt2;
251
+ __le16 crdt3;
252
+ __u8 rsvd134[122];
218253 __le16 oacs;
219254 __u8 acl;
220255 __u8 aerl;
....@@ -278,16 +313,27 @@
278313 };
279314
280315 enum {
316
+ NVME_CTRL_CMIC_MULTI_CTRL = 1 << 1,
317
+ NVME_CTRL_CMIC_ANA = 1 << 3,
281318 NVME_CTRL_ONCS_COMPARE = 1 << 0,
282319 NVME_CTRL_ONCS_WRITE_UNCORRECTABLE = 1 << 1,
283320 NVME_CTRL_ONCS_DSM = 1 << 2,
284321 NVME_CTRL_ONCS_WRITE_ZEROES = 1 << 3,
322
+ NVME_CTRL_ONCS_RESERVATIONS = 1 << 5,
285323 NVME_CTRL_ONCS_TIMESTAMP = 1 << 6,
286324 NVME_CTRL_VWC_PRESENT = 1 << 0,
287325 NVME_CTRL_OACS_SEC_SUPP = 1 << 0,
288326 NVME_CTRL_OACS_DIRECTIVES = 1 << 5,
289327 NVME_CTRL_OACS_DBBUF_SUPP = 1 << 8,
290328 NVME_CTRL_LPA_CMD_EFFECTS_LOG = 1 << 1,
329
+ NVME_CTRL_CTRATT_128_ID = 1 << 0,
330
+ NVME_CTRL_CTRATT_NON_OP_PSP = 1 << 1,
331
+ NVME_CTRL_CTRATT_NVM_SETS = 1 << 2,
332
+ NVME_CTRL_CTRATT_READ_RECV_LVLS = 1 << 3,
333
+ NVME_CTRL_CTRATT_ENDURANCE_GROUPS = 1 << 4,
334
+ NVME_CTRL_CTRATT_PREDICTABLE_LAT = 1 << 5,
335
+ NVME_CTRL_CTRATT_NAMESPACE_GRANULARITY = 1 << 7,
336
+ NVME_CTRL_CTRATT_UUID_LIST = 1 << 9,
291337 };
292338
293339 struct nvme_lbaf {
....@@ -309,7 +355,7 @@
309355 __u8 nmic;
310356 __u8 rescap;
311357 __u8 fpi;
312
- __u8 rsvd33;
358
+ __u8 dlfeat;
313359 __le16 nawun;
314360 __le16 nawupf;
315361 __le16 nacwu;
....@@ -318,11 +364,17 @@
318364 __le16 nabspf;
319365 __le16 noiob;
320366 __u8 nvmcap[16];
321
- __u8 rsvd64[28];
367
+ __le16 npwg;
368
+ __le16 npwa;
369
+ __le16 npdg;
370
+ __le16 npda;
371
+ __le16 nows;
372
+ __u8 rsvd74[18];
322373 __le32 anagrpid;
323374 __u8 rsvd96[3];
324375 __u8 nsattr;
325
- __u8 rsvd100[4];
376
+ __le16 nvmsetid;
377
+ __le16 endgid;
326378 __u8 nguid[16];
327379 __u8 eui64[8];
328380 struct nvme_lbaf lbaf[16];
....@@ -330,15 +382,49 @@
330382 __u8 vs[3712];
331383 };
332384
385
+struct nvme_zns_lbafe {
386
+ __le64 zsze;
387
+ __u8 zdes;
388
+ __u8 rsvd9[7];
389
+};
390
+
391
+struct nvme_id_ns_zns {
392
+ __le16 zoc;
393
+ __le16 ozcs;
394
+ __le32 mar;
395
+ __le32 mor;
396
+ __le32 rrl;
397
+ __le32 frl;
398
+ __u8 rsvd20[2796];
399
+ struct nvme_zns_lbafe lbafe[16];
400
+ __u8 rsvd3072[768];
401
+ __u8 vs[256];
402
+};
403
+
404
+struct nvme_id_ctrl_zns {
405
+ __u8 zasl;
406
+ __u8 rsvd1[4095];
407
+};
408
+
333409 enum {
334410 NVME_ID_CNS_NS = 0x00,
335411 NVME_ID_CNS_CTRL = 0x01,
336412 NVME_ID_CNS_NS_ACTIVE_LIST = 0x02,
337413 NVME_ID_CNS_NS_DESC_LIST = 0x03,
414
+ NVME_ID_CNS_CS_NS = 0x05,
415
+ NVME_ID_CNS_CS_CTRL = 0x06,
338416 NVME_ID_CNS_NS_PRESENT_LIST = 0x10,
339417 NVME_ID_CNS_NS_PRESENT = 0x11,
340418 NVME_ID_CNS_CTRL_NS_LIST = 0x12,
341419 NVME_ID_CNS_CTRL_LIST = 0x13,
420
+ NVME_ID_CNS_SCNDRY_CTRL_LIST = 0x15,
421
+ NVME_ID_CNS_NS_GRANULARITY = 0x16,
422
+ NVME_ID_CNS_UUID_LIST = 0x17,
423
+};
424
+
425
+enum {
426
+ NVME_CSI_NVM = 0,
427
+ NVME_CSI_ZNS = 2,
342428 };
343429
344430 enum {
....@@ -356,8 +442,12 @@
356442
357443 enum {
358444 NVME_NS_FEAT_THIN = 1 << 0,
445
+ NVME_NS_FEAT_ATOMICS = 1 << 1,
446
+ NVME_NS_FEAT_IO_OPT = 1 << 4,
447
+ NVME_NS_ATTR_RO = 1 << 0,
359448 NVME_NS_FLBAS_LBA_MASK = 0xf,
360449 NVME_NS_FLBAS_META_EXT = 0x10,
450
+ NVME_NS_NMIC_SHARED = 1 << 0,
361451 NVME_LBAF_RP_BEST = 0,
362452 NVME_LBAF_RP_BETTER = 1,
363453 NVME_LBAF_RP_GOOD = 2,
....@@ -374,6 +464,12 @@
374464 NVME_NS_DPS_PI_TYPE3 = 3,
375465 };
376466
467
+/* Identify Namespace Metadata Capabilities (MC): */
468
+enum {
469
+ NVME_MC_EXTENDED_LBA = (1 << 0),
470
+ NVME_MC_METADATA_PTR = (1 << 1),
471
+};
472
+
377473 struct nvme_ns_id_desc {
378474 __u8 nidt;
379475 __u8 nidl;
....@@ -383,11 +479,13 @@
383479 #define NVME_NIDT_EUI64_LEN 8
384480 #define NVME_NIDT_NGUID_LEN 16
385481 #define NVME_NIDT_UUID_LEN 16
482
+#define NVME_NIDT_CSI_LEN 1
386483
387484 enum {
388485 NVME_NIDT_EUI64 = 0x01,
389486 NVME_NIDT_NGUID = 0x02,
390487 NVME_NIDT_UUID = 0x03,
488
+ NVME_NIDT_CSI = 0x04,
391489 };
392490
393491 struct nvme_smart_log {
....@@ -396,7 +494,8 @@
396494 __u8 avail_spare;
397495 __u8 spare_thresh;
398496 __u8 percent_used;
399
- __u8 rsvd6[26];
497
+ __u8 endu_grp_crit_warn_sumry;
498
+ __u8 rsvd7[25];
400499 __u8 data_units_read[16];
401500 __u8 data_units_written[16];
402501 __u8 host_reads[16];
....@@ -410,7 +509,11 @@
410509 __le32 warning_temp_time;
411510 __le32 critical_comp_time;
412511 __le16 temp_sensor[8];
413
- __u8 rsvd216[296];
512
+ __le32 thm_temp1_trans_count;
513
+ __le32 thm_temp2_trans_count;
514
+ __le32 thm_temp1_total_time;
515
+ __le32 thm_temp2_total_time;
516
+ __u8 rsvd232[280];
414517 };
415518
416519 struct nvme_fw_slot_info_log {
....@@ -426,7 +529,8 @@
426529 NVME_CMD_EFFECTS_NCC = 1 << 2,
427530 NVME_CMD_EFFECTS_NIC = 1 << 3,
428531 NVME_CMD_EFFECTS_CCC = 1 << 4,
429
- NVME_CMD_EFFECTS_CSE_MASK = 3 << 16,
532
+ NVME_CMD_EFFECTS_CSE_MASK = GENMASK(18, 16),
533
+ NVME_CMD_EFFECTS_UUID_SEL = 1 << 19,
430534 };
431535
432536 struct nvme_effects_log {
....@@ -461,6 +565,27 @@
461565 __le16 rsvd10[3];
462566 };
463567
568
+struct nvme_zone_descriptor {
569
+ __u8 zt;
570
+ __u8 zs;
571
+ __u8 za;
572
+ __u8 rsvd3[5];
573
+ __le64 zcap;
574
+ __le64 zslba;
575
+ __le64 wp;
576
+ __u8 rsvd32[32];
577
+};
578
+
579
+enum {
580
+ NVME_ZONE_TYPE_SEQWRITE_REQ = 0x2,
581
+};
582
+
583
+struct nvme_zone_report {
584
+ __le64 nr_zones;
585
+ __u8 resv8[56];
586
+ struct nvme_zone_descriptor entries[];
587
+};
588
+
464589 enum {
465590 NVME_SMART_CRIT_SPARE = 1 << 0,
466591 NVME_SMART_CRIT_TEMPERATURE = 1 << 1,
....@@ -478,15 +603,28 @@
478603 };
479604
480605 enum {
481
- NVME_AER_NOTICE_NS_CHANGED = 0x00,
482
- NVME_AER_NOTICE_FW_ACT_STARTING = 0x01,
483
- NVME_AER_NOTICE_ANA = 0x03,
606
+ NVME_AER_ERROR_PERSIST_INT_ERR = 0x03,
484607 };
485608
486609 enum {
487
- NVME_AEN_CFG_NS_ATTR = 1 << 8,
488
- NVME_AEN_CFG_FW_ACT = 1 << 9,
489
- NVME_AEN_CFG_ANA_CHANGE = 1 << 11,
610
+ NVME_AER_NOTICE_NS_CHANGED = 0x00,
611
+ NVME_AER_NOTICE_FW_ACT_STARTING = 0x01,
612
+ NVME_AER_NOTICE_ANA = 0x03,
613
+ NVME_AER_NOTICE_DISC_CHANGED = 0xf0,
614
+};
615
+
616
+enum {
617
+ NVME_AEN_BIT_NS_ATTR = 8,
618
+ NVME_AEN_BIT_FW_ACT = 9,
619
+ NVME_AEN_BIT_ANA_CHANGE = 11,
620
+ NVME_AEN_BIT_DISC_CHANGE = 31,
621
+};
622
+
623
+enum {
624
+ NVME_AEN_CFG_NS_ATTR = 1 << NVME_AEN_BIT_NS_ATTR,
625
+ NVME_AEN_CFG_FW_ACT = 1 << NVME_AEN_BIT_FW_ACT,
626
+ NVME_AEN_CFG_ANA_CHANGE = 1 << NVME_AEN_BIT_ANA_CHANGE,
627
+ NVME_AEN_CFG_DISC_CHANGE = 1 << NVME_AEN_BIT_DISC_CHANGE,
490628 };
491629
492630 struct nvme_lba_range_type {
....@@ -541,11 +679,31 @@
541679 nvme_cmd_compare = 0x05,
542680 nvme_cmd_write_zeroes = 0x08,
543681 nvme_cmd_dsm = 0x09,
682
+ nvme_cmd_verify = 0x0c,
544683 nvme_cmd_resv_register = 0x0d,
545684 nvme_cmd_resv_report = 0x0e,
546685 nvme_cmd_resv_acquire = 0x11,
547686 nvme_cmd_resv_release = 0x15,
687
+ nvme_cmd_zone_mgmt_send = 0x79,
688
+ nvme_cmd_zone_mgmt_recv = 0x7a,
689
+ nvme_cmd_zone_append = 0x7d,
548690 };
691
+
692
+#define nvme_opcode_name(opcode) { opcode, #opcode }
693
+#define show_nvm_opcode_name(val) \
694
+ __print_symbolic(val, \
695
+ nvme_opcode_name(nvme_cmd_flush), \
696
+ nvme_opcode_name(nvme_cmd_write), \
697
+ nvme_opcode_name(nvme_cmd_read), \
698
+ nvme_opcode_name(nvme_cmd_write_uncor), \
699
+ nvme_opcode_name(nvme_cmd_compare), \
700
+ nvme_opcode_name(nvme_cmd_write_zeroes), \
701
+ nvme_opcode_name(nvme_cmd_dsm), \
702
+ nvme_opcode_name(nvme_cmd_resv_register), \
703
+ nvme_opcode_name(nvme_cmd_resv_report), \
704
+ nvme_opcode_name(nvme_cmd_resv_acquire), \
705
+ nvme_opcode_name(nvme_cmd_resv_release))
706
+
549707
550708 /*
551709 * Descriptor subtype - lower 4 bits of nvme_(keyed_)sgl_desc identifier
....@@ -639,7 +797,12 @@
639797 __le32 cdw2[2];
640798 __le64 metadata;
641799 union nvme_data_ptr dptr;
642
- __le32 cdw10[6];
800
+ __le32 cdw10;
801
+ __le32 cdw11;
802
+ __le32 cdw12;
803
+ __le32 cdw13;
804
+ __le32 cdw14;
805
+ __le32 cdw15;
643806 };
644807
645808 struct nvme_rw_command {
....@@ -662,6 +825,7 @@
662825 enum {
663826 NVME_RW_LR = 1 << 15,
664827 NVME_RW_FUA = 1 << 14,
828
+ NVME_RW_APPEND_PIREMAP = 1 << 9,
665829 NVME_RW_DSM_FREQ_UNSPEC = 0,
666830 NVME_RW_DSM_FREQ_TYPICAL = 1,
667831 NVME_RW_DSM_FREQ_RARE = 2,
....@@ -727,7 +891,60 @@
727891 __le16 appmask;
728892 };
729893
894
+enum nvme_zone_mgmt_action {
895
+ NVME_ZONE_CLOSE = 0x1,
896
+ NVME_ZONE_FINISH = 0x2,
897
+ NVME_ZONE_OPEN = 0x3,
898
+ NVME_ZONE_RESET = 0x4,
899
+ NVME_ZONE_OFFLINE = 0x5,
900
+ NVME_ZONE_SET_DESC_EXT = 0x10,
901
+};
902
+
903
+struct nvme_zone_mgmt_send_cmd {
904
+ __u8 opcode;
905
+ __u8 flags;
906
+ __u16 command_id;
907
+ __le32 nsid;
908
+ __le32 cdw2[2];
909
+ __le64 metadata;
910
+ union nvme_data_ptr dptr;
911
+ __le64 slba;
912
+ __le32 cdw12;
913
+ __u8 zsa;
914
+ __u8 select_all;
915
+ __u8 rsvd13[2];
916
+ __le32 cdw14[2];
917
+};
918
+
919
+struct nvme_zone_mgmt_recv_cmd {
920
+ __u8 opcode;
921
+ __u8 flags;
922
+ __u16 command_id;
923
+ __le32 nsid;
924
+ __le64 rsvd2[2];
925
+ union nvme_data_ptr dptr;
926
+ __le64 slba;
927
+ __le32 numd;
928
+ __u8 zra;
929
+ __u8 zrasf;
930
+ __u8 pr;
931
+ __u8 rsvd13;
932
+ __le32 cdw14[2];
933
+};
934
+
935
+enum {
936
+ NVME_ZRA_ZONE_REPORT = 0,
937
+ NVME_ZRASF_ZONE_REPORT_ALL = 0,
938
+ NVME_REPORT_ZONE_PARTIAL = 1,
939
+};
940
+
730941 /* Features */
942
+
943
+enum {
944
+ NVME_TEMP_THRESH_MASK = 0xffff,
945
+ NVME_TEMP_THRESH_SELECT_SHIFT = 16,
946
+ NVME_TEMP_THRESH_TYPE_UNDER = 0x100000,
947
+};
731948
732949 struct nvme_feat_auto_pst {
733950 __le64 entries[32];
....@@ -736,6 +953,15 @@
736953 enum {
737954 NVME_HOST_MEM_ENABLE = (1 << 0),
738955 NVME_HOST_MEM_RETURN = (1 << 1),
956
+};
957
+
958
+struct nvme_feat_host_behavior {
959
+ __u8 acre;
960
+ __u8 resv1[511];
961
+};
962
+
963
+enum {
964
+ NVME_ENABLE_ACRE = 1,
739965 };
740966
741967 /* Admin commands */
....@@ -754,16 +980,49 @@
754980 nvme_admin_ns_mgmt = 0x0d,
755981 nvme_admin_activate_fw = 0x10,
756982 nvme_admin_download_fw = 0x11,
983
+ nvme_admin_dev_self_test = 0x14,
757984 nvme_admin_ns_attach = 0x15,
758985 nvme_admin_keep_alive = 0x18,
759986 nvme_admin_directive_send = 0x19,
760987 nvme_admin_directive_recv = 0x1a,
988
+ nvme_admin_virtual_mgmt = 0x1c,
989
+ nvme_admin_nvme_mi_send = 0x1d,
990
+ nvme_admin_nvme_mi_recv = 0x1e,
761991 nvme_admin_dbbuf = 0x7C,
762992 nvme_admin_format_nvm = 0x80,
763993 nvme_admin_security_send = 0x81,
764994 nvme_admin_security_recv = 0x82,
765995 nvme_admin_sanitize_nvm = 0x84,
996
+ nvme_admin_get_lba_status = 0x86,
997
+ nvme_admin_vendor_start = 0xC0,
766998 };
999
+
1000
+#define nvme_admin_opcode_name(opcode) { opcode, #opcode }
1001
+#define show_admin_opcode_name(val) \
1002
+ __print_symbolic(val, \
1003
+ nvme_admin_opcode_name(nvme_admin_delete_sq), \
1004
+ nvme_admin_opcode_name(nvme_admin_create_sq), \
1005
+ nvme_admin_opcode_name(nvme_admin_get_log_page), \
1006
+ nvme_admin_opcode_name(nvme_admin_delete_cq), \
1007
+ nvme_admin_opcode_name(nvme_admin_create_cq), \
1008
+ nvme_admin_opcode_name(nvme_admin_identify), \
1009
+ nvme_admin_opcode_name(nvme_admin_abort_cmd), \
1010
+ nvme_admin_opcode_name(nvme_admin_set_features), \
1011
+ nvme_admin_opcode_name(nvme_admin_get_features), \
1012
+ nvme_admin_opcode_name(nvme_admin_async_event), \
1013
+ nvme_admin_opcode_name(nvme_admin_ns_mgmt), \
1014
+ nvme_admin_opcode_name(nvme_admin_activate_fw), \
1015
+ nvme_admin_opcode_name(nvme_admin_download_fw), \
1016
+ nvme_admin_opcode_name(nvme_admin_ns_attach), \
1017
+ nvme_admin_opcode_name(nvme_admin_keep_alive), \
1018
+ nvme_admin_opcode_name(nvme_admin_directive_send), \
1019
+ nvme_admin_opcode_name(nvme_admin_directive_recv), \
1020
+ nvme_admin_opcode_name(nvme_admin_dbbuf), \
1021
+ nvme_admin_opcode_name(nvme_admin_format_nvm), \
1022
+ nvme_admin_opcode_name(nvme_admin_security_send), \
1023
+ nvme_admin_opcode_name(nvme_admin_security_recv), \
1024
+ nvme_admin_opcode_name(nvme_admin_sanitize_nvm), \
1025
+ nvme_admin_opcode_name(nvme_admin_get_lba_status))
7671026
7681027 enum {
7691028 NVME_QUEUE_PHYS_CONTIG = (1 << 0),
....@@ -792,16 +1051,24 @@
7921051 NVME_FEAT_RRL = 0x12,
7931052 NVME_FEAT_PLM_CONFIG = 0x13,
7941053 NVME_FEAT_PLM_WINDOW = 0x14,
1054
+ NVME_FEAT_HOST_BEHAVIOR = 0x16,
1055
+ NVME_FEAT_SANITIZE = 0x17,
7951056 NVME_FEAT_SW_PROGRESS = 0x80,
7961057 NVME_FEAT_HOST_ID = 0x81,
7971058 NVME_FEAT_RESV_MASK = 0x82,
7981059 NVME_FEAT_RESV_PERSIST = 0x83,
7991060 NVME_FEAT_WRITE_PROTECT = 0x84,
1061
+ NVME_FEAT_VENDOR_START = 0xC0,
1062
+ NVME_FEAT_VENDOR_END = 0xFF,
8001063 NVME_LOG_ERROR = 0x01,
8011064 NVME_LOG_SMART = 0x02,
8021065 NVME_LOG_FW_SLOT = 0x03,
8031066 NVME_LOG_CHANGED_NS = 0x04,
8041067 NVME_LOG_CMD_EFFECTS = 0x05,
1068
+ NVME_LOG_DEVICE_SELF_TEST = 0x06,
1069
+ NVME_LOG_TELEMETRY_HOST = 0x07,
1070
+ NVME_LOG_TELEMETRY_CTRL = 0x08,
1071
+ NVME_LOG_ENDURANCE_GROUP = 0x09,
8051072 NVME_LOG_ANA = 0x0c,
8061073 NVME_LOG_DISC = 0x70,
8071074 NVME_LOG_RESERVATION = 0x80,
....@@ -830,7 +1097,9 @@
8301097 __u8 cns;
8311098 __u8 rsvd3;
8321099 __le16 ctrlid;
833
- __u32 rsvd11[5];
1100
+ __u8 rsvd11[3];
1101
+ __u8 csi;
1102
+ __u32 rsvd12[4];
8341103 };
8351104
8361105 #define NVME_IDENTIFY_DATA_SIZE 4096
....@@ -937,9 +1206,16 @@
9371206 __le16 numdl;
9381207 __le16 numdu;
9391208 __u16 rsvd11;
940
- __le32 lpol;
941
- __le32 lpou;
942
- __u32 rsvd14[2];
1209
+ union {
1210
+ struct {
1211
+ __le32 lpol;
1212
+ __le32 lpou;
1213
+ };
1214
+ __le64 lpo;
1215
+ };
1216
+ __u8 rsvd14[3];
1217
+ __u8 csi;
1218
+ __u32 rsvd15;
9431219 };
9441220
9451221 struct nvme_directive_cmd {
....@@ -972,6 +1248,23 @@
9721248 nvme_fabrics_type_connect = 0x01,
9731249 nvme_fabrics_type_property_get = 0x04,
9741250 };
1251
+
1252
+#define nvme_fabrics_type_name(type) { type, #type }
1253
+#define show_fabrics_type_name(type) \
1254
+ __print_symbolic(type, \
1255
+ nvme_fabrics_type_name(nvme_fabrics_type_property_set), \
1256
+ nvme_fabrics_type_name(nvme_fabrics_type_connect), \
1257
+ nvme_fabrics_type_name(nvme_fabrics_type_property_get))
1258
+
1259
+/*
1260
+ * If not fabrics command, fctype will be ignored.
1261
+ */
1262
+#define show_opcode_name(qid, opcode, fctype) \
1263
+ ((opcode) == nvme_fabrics_command ? \
1264
+ show_fabrics_type_name(fctype) : \
1265
+ ((qid) ? \
1266
+ show_nvm_opcode_name(opcode) : \
1267
+ show_admin_opcode_name(opcode)))
9751268
9761269 struct nvmf_common_command {
9771270 __u8 opcode;
....@@ -1027,7 +1320,11 @@
10271320 __le64 numrec;
10281321 __le16 recfmt;
10291322 __u8 resv14[1006];
1030
- struct nvmf_disc_rsp_page_entry entries[0];
1323
+ struct nvmf_disc_rsp_page_entry entries[];
1324
+};
1325
+
1326
+enum {
1327
+ NVME_CONNECT_DISABLE_SQFLOW = (1 << 2),
10311328 };
10321329
10331330 struct nvmf_connect_command {
....@@ -1115,6 +1412,8 @@
11151412 struct nvme_format_cmd format;
11161413 struct nvme_dsm_cmd dsm;
11171414 struct nvme_write_zeroes_cmd write_zeroes;
1415
+ struct nvme_zone_mgmt_send_cmd zms;
1416
+ struct nvme_zone_mgmt_recv_cmd zmr;
11181417 struct nvme_abort_cmd abort;
11191418 struct nvme_get_log_page_command get_log_page;
11201419 struct nvmf_common_command fabrics;
....@@ -1126,6 +1425,25 @@
11261425 };
11271426 };
11281427
1428
+static inline bool nvme_is_fabrics(struct nvme_command *cmd)
1429
+{
1430
+ return cmd->common.opcode == nvme_fabrics_command;
1431
+}
1432
+
1433
+struct nvme_error_slot {
1434
+ __le64 error_count;
1435
+ __le16 sqid;
1436
+ __le16 cmdid;
1437
+ __le16 status_field;
1438
+ __le16 param_error_location;
1439
+ __le64 lba;
1440
+ __le32 nsid;
1441
+ __u8 vs;
1442
+ __u8 resv[3];
1443
+ __le64 cs;
1444
+ __u8 resv2[24];
1445
+};
1446
+
11291447 static inline bool nvme_is_write(struct nvme_command *cmd)
11301448 {
11311449 /*
....@@ -1133,7 +1451,7 @@
11331451 *
11341452 * Why can't we simply have a Fabrics In and Fabrics out command?
11351453 */
1136
- if (unlikely(cmd->common.opcode == nvme_fabrics_command))
1454
+ if (unlikely(nvme_is_fabrics(cmd)))
11371455 return cmd->fabrics.fctype & 1;
11381456 return cmd->common.opcode & 1;
11391457 }
....@@ -1164,7 +1482,11 @@
11641482 NVME_SC_SGL_INVALID_OFFSET = 0x16,
11651483 NVME_SC_SGL_INVALID_SUBTYPE = 0x17,
11661484
1485
+ NVME_SC_SANITIZE_FAILED = 0x1C,
1486
+ NVME_SC_SANITIZE_IN_PROGRESS = 0x1D,
1487
+
11671488 NVME_SC_NS_WRITE_PROTECTED = 0x20,
1489
+ NVME_SC_CMD_INTERRUPTED = 0x21,
11681490
11691491 NVME_SC_LBA_RANGE = 0x80,
11701492 NVME_SC_CAP_EXCEEDED = 0x81,
....@@ -1193,15 +1515,17 @@
11931515 NVME_SC_FW_NEEDS_SUBSYS_RESET = 0x110,
11941516 NVME_SC_FW_NEEDS_RESET = 0x111,
11951517 NVME_SC_FW_NEEDS_MAX_TIME = 0x112,
1196
- NVME_SC_FW_ACIVATE_PROHIBITED = 0x113,
1518
+ NVME_SC_FW_ACTIVATE_PROHIBITED = 0x113,
11971519 NVME_SC_OVERLAPPING_RANGE = 0x114,
1198
- NVME_SC_NS_INSUFFICENT_CAP = 0x115,
1520
+ NVME_SC_NS_INSUFFICIENT_CAP = 0x115,
11991521 NVME_SC_NS_ID_UNAVAILABLE = 0x116,
12001522 NVME_SC_NS_ALREADY_ATTACHED = 0x118,
12011523 NVME_SC_NS_IS_PRIVATE = 0x119,
12021524 NVME_SC_NS_NOT_ATTACHED = 0x11a,
12031525 NVME_SC_THIN_PROV_NOT_SUPP = 0x11b,
12041526 NVME_SC_CTRL_LIST_INVALID = 0x11c,
1527
+ NVME_SC_BP_WRITE_PROHIBITED = 0x11e,
1528
+ NVME_SC_PMR_SAN_PROHIBITED = 0x123,
12051529
12061530 /*
12071531 * I/O Command Set Specific - NVM commands:
....@@ -1224,6 +1548,18 @@
12241548 NVME_SC_AUTH_REQUIRED = 0x191,
12251549
12261550 /*
1551
+ * I/O Command Set Specific - Zoned commands:
1552
+ */
1553
+ NVME_SC_ZONE_BOUNDARY_ERROR = 0x1b8,
1554
+ NVME_SC_ZONE_FULL = 0x1b9,
1555
+ NVME_SC_ZONE_READ_ONLY = 0x1ba,
1556
+ NVME_SC_ZONE_OFFLINE = 0x1bb,
1557
+ NVME_SC_ZONE_INVALID_WRITE = 0x1bc,
1558
+ NVME_SC_ZONE_TOO_MANY_ACTIVE = 0x1bd,
1559
+ NVME_SC_ZONE_TOO_MANY_OPEN = 0x1be,
1560
+ NVME_SC_ZONE_INVALID_TRANSITION = 0x1bf,
1561
+
1562
+ /*
12271563 * Media and Data Integrity Errors:
12281564 */
12291565 NVME_SC_WRITE_FAULT = 0x280,
....@@ -1242,7 +1578,9 @@
12421578 NVME_SC_ANA_INACCESSIBLE = 0x302,
12431579 NVME_SC_ANA_TRANSITION = 0x303,
12441580 NVME_SC_HOST_PATH_ERROR = 0x370,
1581
+ NVME_SC_HOST_ABORTED_CMD = 0x371,
12451582
1583
+ NVME_SC_CRD = 0x1800,
12461584 NVME_SC_DNR = 0x4000,
12471585 };
12481586