Blame view

include/linux/nvme.h 36.3 KB
fadccd8fc   Christoph Hellwig   nvme_ioctl.h: rem...
1
  /* SPDX-License-Identifier: GPL-2.0 */
b60503ba4   Matthew Wilcox   NVMe: New driver
2
3
  /*
   * Definitions for the NVM Express interface
8757ad65d   Matthew Wilcox   NVMe: Update copy...
4
   * Copyright (c) 2011-2014, Intel Corporation.
b60503ba4   Matthew Wilcox   NVMe: New driver
5
6
7
8
   */
  
  #ifndef _LINUX_NVME_H
  #define _LINUX_NVME_H
2812dfe37   Christoph Hellwig   nvme: include <li...
9
  #include <linux/types.h>
8e4122632   Christoph Hellwig   nvme: switch to u...
10
  #include <linux/uuid.h>
eb793e2c9   Christoph Hellwig   nvme.h: add NVMe ...
11
12
13
14
15
16
17
18
19
20
21
22
23
24
  
  /* NQN names in commands fields specified one size */
  #define NVMF_NQN_FIELD_LEN	256
  
  /* However the max length of a qualified name is another size */
  #define NVMF_NQN_SIZE		223
  
  #define NVMF_TRSVCID_SIZE	32
  #define NVMF_TRADDR_SIZE	256
  #define NVMF_TSAS_SIZE		256
  
  #define NVME_DISC_SUBSYS_NAME	"nqn.2014-08.org.nvmexpress.discovery"
  
  #define NVME_RDMA_IP_PORT	4420
62346eaeb   Arnav Dawn   nvme: define NVME...
25
  #define NVME_NSID_ALL		0xffffffff
eb793e2c9   Christoph Hellwig   nvme.h: add NVMe ...
26
27
28
29
30
31
32
33
34
35
36
37
  enum nvme_subsys_type {
  	NVME_NQN_DISC	= 1,		/* Discovery type target subsystem */
  	NVME_NQN_NVME	= 2,		/* NVME type target subsystem */
  };
  
  /* Address Family codes for Discovery Log Page entry ADRFAM field */
  enum {
  	NVMF_ADDR_FAMILY_PCI	= 0,	/* PCIe */
  	NVMF_ADDR_FAMILY_IP4	= 1,	/* IP4 */
  	NVMF_ADDR_FAMILY_IP6	= 2,	/* IP6 */
  	NVMF_ADDR_FAMILY_IB	= 3,	/* InfiniBand */
  	NVMF_ADDR_FAMILY_FC	= 4,	/* Fibre Channel */
d02abd198   Chaitanya Kulkarni   nvmet: align addr...
38
39
  	NVMF_ADDR_FAMILY_LOOP	= 254,	/* Reserved for host usage */
  	NVMF_ADDR_FAMILY_MAX,
eb793e2c9   Christoph Hellwig   nvme.h: add NVMe ...
40
41
42
43
44
45
  };
  
  /* Transport Type codes for Discovery Log Page entry TRTYPE field */
  enum {
  	NVMF_TRTYPE_RDMA	= 1,	/* RDMA */
  	NVMF_TRTYPE_FC		= 2,	/* Fibre Channel */
fc221d054   Sagi Grimberg   nvme-tcp: Add pro...
46
  	NVMF_TRTYPE_TCP		= 3,	/* TCP/IP */
eb793e2c9   Christoph Hellwig   nvme.h: add NVMe ...
47
48
49
50
51
52
  	NVMF_TRTYPE_LOOP	= 254,	/* Reserved for host usage */
  	NVMF_TRTYPE_MAX,
  };
  
  /* Transport Requirements codes for Discovery Log Page entry TREQ field */
  enum {
9b95d2fb8   Sagi Grimberg   nvmet: expose sup...
53
54
55
  	NVMF_TREQ_NOT_SPECIFIED	= 0,		/* Not specified */
  	NVMF_TREQ_REQUIRED	= 1,		/* Required */
  	NVMF_TREQ_NOT_REQUIRED	= 2,		/* Not Required */
0445e1b5a   Sagi Grimberg   nvmet: don't over...
56
57
  #define NVME_TREQ_SECURE_CHANNEL_MASK \
  	(NVMF_TREQ_REQUIRED | NVMF_TREQ_NOT_REQUIRED)
9b95d2fb8   Sagi Grimberg   nvmet: expose sup...
58
59
  
  	NVMF_TREQ_DISABLE_SQFLOW = (1 << 2),	/* Supports SQ flow control disable */
eb793e2c9   Christoph Hellwig   nvme.h: add NVMe ...
60
61
62
63
64
65
  };
  
  /* RDMA QP Service Type codes for Discovery Log Page entry TSAS
   * RDMA_QPTYPE field
   */
  enum {
bf17aa36c   Roland Dreier   nvme: Correct NVM...
66
67
  	NVMF_RDMA_QPTYPE_CONNECTED	= 1, /* Reliable Connected */
  	NVMF_RDMA_QPTYPE_DATAGRAM	= 2, /* Reliable Datagram */
eb793e2c9   Christoph Hellwig   nvme.h: add NVMe ...
68
69
70
71
72
73
  };
  
  /* RDMA QP Service Type codes for Discovery Log Page entry TSAS
   * RDMA_QPTYPE field
   */
  enum {
bf17aa36c   Roland Dreier   nvme: Correct NVM...
74
75
76
77
78
  	NVMF_RDMA_PRTYPE_NOT_SPECIFIED	= 1, /* No Provider Specified */
  	NVMF_RDMA_PRTYPE_IB		= 2, /* InfiniBand */
  	NVMF_RDMA_PRTYPE_ROCE		= 3, /* InfiniBand RoCE */
  	NVMF_RDMA_PRTYPE_ROCEV2		= 4, /* InfiniBand RoCEV2 */
  	NVMF_RDMA_PRTYPE_IWARP		= 5, /* IWARP */
eb793e2c9   Christoph Hellwig   nvme.h: add NVMe ...
79
80
81
82
83
84
  };
  
  /* RDMA Connection Management Service Type codes for Discovery Log Page
   * entry TSAS RDMA_CMS field
   */
  enum {
bf17aa36c   Roland Dreier   nvme: Correct NVM...
85
  	NVMF_RDMA_CMS_RDMA_CM	= 1, /* Sockets based endpoint addressing */
eb793e2c9   Christoph Hellwig   nvme.h: add NVMe ...
86
  };
7aa1f4275   Sagi Grimberg   nvme: use a singl...
87
  #define NVME_AQ_DEPTH		32
38dabe210   Keith Busch   nvme: centralize ...
88
89
90
91
92
93
94
95
  #define NVME_NR_AEN_COMMANDS	1
  #define NVME_AQ_BLK_MQ_DEPTH	(NVME_AQ_DEPTH - NVME_NR_AEN_COMMANDS)
  
  /*
   * Subtract one to leave an empty queue entry for 'Full Queue' condition. See
   * NVM-Express 1.2 specification, section 4.1.2.
   */
  #define NVME_AQ_MQ_TAG_DEPTH	(NVME_AQ_BLK_MQ_DEPTH - 1)
2812dfe37   Christoph Hellwig   nvme: include <li...
96

7a67cbea6   Christoph Hellwig   nvme: use offset ...
97
98
99
100
  enum {
  	NVME_REG_CAP	= 0x0000,	/* Controller Capabilities */
  	NVME_REG_VS	= 0x0008,	/* Version */
  	NVME_REG_INTMS	= 0x000c,	/* Interrupt Mask Set */
a5b714ad3   Wang Sheng-Hui   NVMe: correct com...
101
  	NVME_REG_INTMC	= 0x0010,	/* Interrupt Mask Clear */
7a67cbea6   Christoph Hellwig   nvme: use offset ...
102
103
104
105
106
  	NVME_REG_CC	= 0x0014,	/* Controller Configuration */
  	NVME_REG_CSTS	= 0x001c,	/* Controller Status */
  	NVME_REG_NSSR	= 0x0020,	/* NVM Subsystem Reset */
  	NVME_REG_AQA	= 0x0024,	/* Admin Queue Attributes */
  	NVME_REG_ASQ	= 0x0028,	/* Admin SQ Base Address */
a5b714ad3   Wang Sheng-Hui   NVMe: correct com...
107
  	NVME_REG_ACQ	= 0x0030,	/* Admin CQ Base Address */
48c9e85b2   Revanth Rajashekar   nvme: resync incl...
108
  	NVME_REG_CMBLOC	= 0x0038,	/* Controller Memory Buffer Location */
7a67cbea6   Christoph Hellwig   nvme: use offset ...
109
  	NVME_REG_CMBSZ	= 0x003c,	/* Controller Memory Buffer Size */
48c9e85b2   Revanth Rajashekar   nvme: resync incl...
110
111
112
113
114
115
116
117
118
119
120
121
122
123
  	NVME_REG_BPINFO	= 0x0040,	/* Boot Partition Information */
  	NVME_REG_BPRSEL	= 0x0044,	/* Boot Partition Read Select */
  	NVME_REG_BPMBL	= 0x0048,	/* Boot Partition Memory Buffer
  					 * Location
  					 */
  	NVME_REG_PMRCAP	= 0x0e00,	/* Persistent Memory Capabilities */
  	NVME_REG_PMRCTL	= 0x0e04,	/* Persistent Memory Region Control */
  	NVME_REG_PMRSTS	= 0x0e08,	/* Persistent Memory Region Status */
  	NVME_REG_PMREBS	= 0x0e0c,	/* Persistent Memory Region Elasticity
  					 * Buffer Size
  					 */
  	NVME_REG_PMRSWTP = 0x0e10,	/* Persistent Memory Region Sustained
  					 * Write Throughput
  					 */
97f6ef646   Xu Yu   nvme-pci: remap B...
124
  	NVME_REG_DBS	= 0x1000,	/* SQ 0 Tail Doorbell */
b60503ba4   Matthew Wilcox   NVMe: New driver
125
  };
a0cadb85b   Keith Busch   NVMe: Do not set ...
126
  #define NVME_CAP_MQES(cap)	((cap) & 0xffff)
22605f968   Matthew Wilcox   NVMe: Time out in...
127
  #define NVME_CAP_TIMEOUT(cap)	(((cap) >> 24) & 0xff)
f1938f6e1   Matthew Wilcox   NVMe: Implement d...
128
  #define NVME_CAP_STRIDE(cap)	(((cap) >> 32) & 0xf)
dfbac8c7a   Keith Busch   NVMe: Add nvme su...
129
  #define NVME_CAP_NSSRC(cap)	(((cap) >> 36) & 0x1)
71010c309   Niklas Cassel   nvme: implement m...
130
  #define NVME_CAP_CSS(cap)	(((cap) >> 37) & 0xff)
8fc23e032   Keith Busch   NVMe: Set block q...
131
  #define NVME_CAP_MPSMIN(cap)	(((cap) >> 48) & 0xf)
1d0906246   Keith Busch   NVMe: Mismatched ...
132
  #define NVME_CAP_MPSMAX(cap)	(((cap) >> 52) & 0xf)
22605f968   Matthew Wilcox   NVMe: Time out in...
133

8ffaadf74   Jon Derrick   NVMe: Use CMB for...
134
135
  #define NVME_CMB_BIR(cmbloc)	((cmbloc) & 0x7)
  #define NVME_CMB_OFST(cmbloc)	(((cmbloc) >> 12) & 0xfffff)
88de4598b   Christoph Hellwig   nvme-pci: clean u...
136
137
138
139
140
141
142
143
144
145
146
147
148
149
  
  enum {
  	NVME_CMBSZ_SQS		= 1 << 0,
  	NVME_CMBSZ_CQS		= 1 << 1,
  	NVME_CMBSZ_LISTS	= 1 << 2,
  	NVME_CMBSZ_RDS		= 1 << 3,
  	NVME_CMBSZ_WDS		= 1 << 4,
  
  	NVME_CMBSZ_SZ_SHIFT	= 12,
  	NVME_CMBSZ_SZ_MASK	= 0xfffff,
  
  	NVME_CMBSZ_SZU_SHIFT	= 8,
  	NVME_CMBSZ_SZU_MASK	= 0xf,
  };
8ffaadf74   Jon Derrick   NVMe: Use CMB for...
150

69cd27e25   Christoph Hellwig   nvme.h: add NVM c...
151
152
153
154
  /*
   * Submission and Completion Queue Entry Sizes for the NVM command set.
   * (In bytes and specified as a power of two (2^n)).
   */
c1e0cc7e1   Benjamin Herrenschmidt   nvme-pci: Add sup...
155
  #define NVME_ADM_SQES       6
69cd27e25   Christoph Hellwig   nvme.h: add NVM c...
156
157
  #define NVME_NVM_IOSQES		6
  #define NVME_NVM_IOCQES		4
b60503ba4   Matthew Wilcox   NVMe: New driver
158
159
  enum {
  	NVME_CC_ENABLE		= 1 << 0,
ad4e05b24   Max Gurtovoy   nvme: add symboli...
160
161
  	NVME_CC_EN_SHIFT	= 0,
  	NVME_CC_CSS_SHIFT	= 4,
b60503ba4   Matthew Wilcox   NVMe: New driver
162
  	NVME_CC_MPS_SHIFT	= 7,
ad4e05b24   Max Gurtovoy   nvme: add symboli...
163
164
165
166
  	NVME_CC_AMS_SHIFT	= 11,
  	NVME_CC_SHN_SHIFT	= 14,
  	NVME_CC_IOSQES_SHIFT	= 16,
  	NVME_CC_IOCQES_SHIFT	= 20,
71010c309   Niklas Cassel   nvme: implement m...
167
168
169
  	NVME_CC_CSS_NVM		= 0 << NVME_CC_CSS_SHIFT,
  	NVME_CC_CSS_CSI		= 6 << NVME_CC_CSS_SHIFT,
  	NVME_CC_CSS_MASK	= 7 << NVME_CC_CSS_SHIFT,
60b43f627   Max Gurtovoy   nvme: rename AMS ...
170
171
172
  	NVME_CC_AMS_RR		= 0 << NVME_CC_AMS_SHIFT,
  	NVME_CC_AMS_WRRU	= 1 << NVME_CC_AMS_SHIFT,
  	NVME_CC_AMS_VS		= 7 << NVME_CC_AMS_SHIFT,
ad4e05b24   Max Gurtovoy   nvme: add symboli...
173
174
175
176
177
178
  	NVME_CC_SHN_NONE	= 0 << NVME_CC_SHN_SHIFT,
  	NVME_CC_SHN_NORMAL	= 1 << NVME_CC_SHN_SHIFT,
  	NVME_CC_SHN_ABRUPT	= 2 << NVME_CC_SHN_SHIFT,
  	NVME_CC_SHN_MASK	= 3 << NVME_CC_SHN_SHIFT,
  	NVME_CC_IOSQES		= NVME_NVM_IOSQES << NVME_CC_IOSQES_SHIFT,
  	NVME_CC_IOCQES		= NVME_NVM_IOCQES << NVME_CC_IOCQES_SHIFT,
71010c309   Niklas Cassel   nvme: implement m...
179
180
  	NVME_CAP_CSS_NVM	= 1 << 0,
  	NVME_CAP_CSS_CSI	= 1 << 6,
b60503ba4   Matthew Wilcox   NVMe: New driver
181
182
  	NVME_CSTS_RDY		= 1 << 0,
  	NVME_CSTS_CFS		= 1 << 1,
dfbac8c7a   Keith Busch   NVMe: Add nvme su...
183
  	NVME_CSTS_NSSRO		= 1 << 4,
b6dccf7fa   Arnav Dawn   nvme: add support...
184
  	NVME_CSTS_PP		= 1 << 5,
b60503ba4   Matthew Wilcox   NVMe: New driver
185
186
187
  	NVME_CSTS_SHST_NORMAL	= 0 << 2,
  	NVME_CSTS_SHST_OCCUR	= 1 << 2,
  	NVME_CSTS_SHST_CMPLT	= 2 << 2,
1894d8f16   Keith Busch   NVMe: Use normal ...
188
  	NVME_CSTS_SHST_MASK	= 3 << 2,
b60503ba4   Matthew Wilcox   NVMe: New driver
189
  };
9d99a8dda   Christoph Hellwig   nvme: move hardwa...
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
  struct nvme_id_power_state {
  	__le16			max_power;	/* centiwatts */
  	__u8			rsvd2;
  	__u8			flags;
  	__le32			entry_lat;	/* microseconds */
  	__le32			exit_lat;	/* microseconds */
  	__u8			read_tput;
  	__u8			read_lat;
  	__u8			write_tput;
  	__u8			write_lat;
  	__le16			idle_power;
  	__u8			idle_scale;
  	__u8			rsvd19;
  	__le16			active_power;
  	__u8			active_work_scale;
  	__u8			rsvd23[9];
  };
  
  enum {
  	NVME_PS_FLAGS_MAX_POWER_SCALE	= 1 << 0,
  	NVME_PS_FLAGS_NON_OP_STATE	= 1 << 1,
  };
12b211716   Sagi Grimberg   nvme: introduce c...
212
213
  enum nvme_ctrl_attr {
  	NVME_CTRL_ATTR_HID_128_BIT	= (1 << 0),
6e3ca03ee   Sagi Grimberg   nvme: support tra...
214
  	NVME_CTRL_ATTR_TBKAS		= (1 << 6),
12b211716   Sagi Grimberg   nvme: introduce c...
215
  };
9d99a8dda   Christoph Hellwig   nvme: move hardwa...
216
217
218
219
220
221
222
223
  struct nvme_id_ctrl {
  	__le16			vid;
  	__le16			ssvid;
  	char			sn[20];
  	char			mn[40];
  	char			fr[8];
  	__u8			rab;
  	__u8			ieee[3];
a446c0840   Christoph Hellwig   nvme.h: resync wi...
224
  	__u8			cmic;
9d99a8dda   Christoph Hellwig   nvme: move hardwa...
225
  	__u8			mdts;
08c69640c   Christoph Hellwig   nvme.h: add missi...
226
227
  	__le16			cntlid;
  	__le32			ver;
14e974a84   Christoph Hellwig   nvme.h: add RTD3R...
228
229
230
  	__le32			rtd3r;
  	__le32			rtd3e;
  	__le32			oaes;
eb793e2c9   Christoph Hellwig   nvme.h: add NVMe ...
231
  	__le32			ctratt;
49cd84b6f   Keith Busch   nvme: implement E...
232
233
234
235
236
  	__u8			rsvd100[28];
  	__le16			crdt1;
  	__le16			crdt2;
  	__le16			crdt3;
  	__u8			rsvd134[122];
9d99a8dda   Christoph Hellwig   nvme: move hardwa...
237
238
239
240
241
242
243
244
245
246
247
  	__le16			oacs;
  	__u8			acl;
  	__u8			aerl;
  	__u8			frmw;
  	__u8			lpa;
  	__u8			elpe;
  	__u8			npss;
  	__u8			avscc;
  	__u8			apsta;
  	__le16			wctemp;
  	__le16			cctemp;
a446c0840   Christoph Hellwig   nvme.h: resync wi...
248
249
250
251
252
253
  	__le16			mtfa;
  	__le32			hmpre;
  	__le32			hmmin;
  	__u8			tnvmcap[16];
  	__u8			unvmcap[16];
  	__le32			rpmbs;
435e80905   Guan Junxiong   nvme: add fields ...
254
255
256
  	__le16			edstt;
  	__u8			dsto;
  	__u8			fwug;
7b89eae29   Sagi Grimberg   nvme.h: Add keep-...
257
  	__le16			kas;
435e80905   Guan Junxiong   nvme: add fields ...
258
259
260
261
  	__le16			hctma;
  	__le16			mntmt;
  	__le16			mxtmt;
  	__le32			sanicap;
044a9df1a   Christoph Hellwig   nvme-pci: impleme...
262
263
  	__le32			hmminds;
  	__le16			hmmaxd;
1a3762165   Christoph Hellwig   nvme.h: add ANA d...
264
265
266
267
268
269
  	__u8			rsvd338[4];
  	__u8			anatt;
  	__u8			anacap;
  	__le32			anagrpmax;
  	__le32			nanagrpid;
  	__u8			rsvd352[160];
9d99a8dda   Christoph Hellwig   nvme: move hardwa...
270
271
  	__u8			sqes;
  	__u8			cqes;
eb793e2c9   Christoph Hellwig   nvme.h: add NVMe ...
272
  	__le16			maxcmd;
9d99a8dda   Christoph Hellwig   nvme: move hardwa...
273
274
275
276
277
278
279
280
  	__le32			nn;
  	__le16			oncs;
  	__le16			fuses;
  	__u8			fna;
  	__u8			vwc;
  	__le16			awun;
  	__le16			awupf;
  	__u8			nvscc;
93045d594   Chaitanya Kulkarni   nvme.h: add suppo...
281
  	__u8			nwpc;
9d99a8dda   Christoph Hellwig   nvme: move hardwa...
282
283
284
  	__le16			acwu;
  	__u8			rsvd534[2];
  	__le32			sgls;
1a3762165   Christoph Hellwig   nvme.h: add ANA d...
285
286
  	__le32			mnan;
  	__u8			rsvd544[224];
eb793e2c9   Christoph Hellwig   nvme.h: add NVMe ...
287
288
289
290
291
292
293
294
  	char			subnqn[256];
  	__u8			rsvd1024[768];
  	__le32			ioccsz;
  	__le32			iorcsz;
  	__le16			icdoff;
  	__u8			ctrattr;
  	__u8			msdbd;
  	__u8			rsvd1804[244];
9d99a8dda   Christoph Hellwig   nvme: move hardwa...
295
296
297
298
299
  	struct nvme_id_power_state	psd[32];
  	__u8			vs[1024];
  };
  
  enum {
92decf118   Keith Busch   nvme: define cons...
300
301
  	NVME_CTRL_CMIC_MULTI_CTRL		= 1 << 1,
  	NVME_CTRL_CMIC_ANA			= 1 << 3,
9d99a8dda   Christoph Hellwig   nvme: move hardwa...
302
303
304
  	NVME_CTRL_ONCS_COMPARE			= 1 << 0,
  	NVME_CTRL_ONCS_WRITE_UNCORRECTABLE	= 1 << 1,
  	NVME_CTRL_ONCS_DSM			= 1 << 2,
3b7c33b28   Chaitanya Kulkarni   nvme.h: add Write...
305
  	NVME_CTRL_ONCS_WRITE_ZEROES		= 1 << 3,
c1fef73f7   Logan Gunthorpe   nvmet: add passth...
306
  	NVME_CTRL_ONCS_RESERVATIONS		= 1 << 5,
dbf86b390   Jon Derrick   nvme: add support...
307
  	NVME_CTRL_ONCS_TIMESTAMP		= 1 << 6,
9d99a8dda   Christoph Hellwig   nvme: move hardwa...
308
  	NVME_CTRL_VWC_PRESENT			= 1 << 0,
8a9ae5232   Scott Bauer   nvme: Check for S...
309
  	NVME_CTRL_OACS_SEC_SUPP                 = 1 << 0,
f5d118406   Jens Axboe   nvme: add support...
310
  	NVME_CTRL_OACS_DIRECTIVES		= 1 << 5,
223694b9a   Changpeng Liu   nvme: fix the def...
311
  	NVME_CTRL_OACS_DBBUF_SUPP		= 1 << 8,
84fef62d1   Keith Busch   nvme: check admin...
312
  	NVME_CTRL_LPA_CMD_EFFECTS_LOG		= 1 << 1,
48c9e85b2   Revanth Rajashekar   nvme: resync incl...
313
314
315
316
317
318
319
320
  	NVME_CTRL_CTRATT_128_ID			= 1 << 0,
  	NVME_CTRL_CTRATT_NON_OP_PSP		= 1 << 1,
  	NVME_CTRL_CTRATT_NVM_SETS		= 1 << 2,
  	NVME_CTRL_CTRATT_READ_RECV_LVLS		= 1 << 3,
  	NVME_CTRL_CTRATT_ENDURANCE_GROUPS	= 1 << 4,
  	NVME_CTRL_CTRATT_PREDICTABLE_LAT	= 1 << 5,
  	NVME_CTRL_CTRATT_NAMESPACE_GRANULARITY	= 1 << 7,
  	NVME_CTRL_CTRATT_UUID_LIST		= 1 << 9,
9d99a8dda   Christoph Hellwig   nvme: move hardwa...
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
  };
  
  struct nvme_lbaf {
  	__le16			ms;
  	__u8			ds;
  	__u8			rp;
  };
  
  struct nvme_id_ns {
  	__le64			nsze;
  	__le64			ncap;
  	__le64			nuse;
  	__u8			nsfeat;
  	__u8			nlbaf;
  	__u8			flbas;
  	__u8			mc;
  	__u8			dpc;
  	__u8			dps;
  	__u8			nmic;
  	__u8			rescap;
  	__u8			fpi;
6605bdd59   Bart Van Assche   nvme: add I/O cha...
342
  	__u8			dlfeat;
9d99a8dda   Christoph Hellwig   nvme: move hardwa...
343
344
345
346
347
348
  	__le16			nawun;
  	__le16			nawupf;
  	__le16			nacwu;
  	__le16			nabsn;
  	__le16			nabo;
  	__le16			nabspf;
6b8190d61   Scott Bauer   nvme: implement N...
349
  	__le16			noiob;
a446c0840   Christoph Hellwig   nvme.h: resync wi...
350
  	__u8			nvmcap[16];
6605bdd59   Bart Van Assche   nvme: add I/O cha...
351
352
353
354
355
356
  	__le16			npwg;
  	__le16			npwa;
  	__le16			npdg;
  	__le16			npda;
  	__le16			nows;
  	__u8			rsvd74[18];
1a3762165   Christoph Hellwig   nvme.h: add ANA d...
357
  	__le32			anagrpid;
93045d594   Chaitanya Kulkarni   nvme.h: add suppo...
358
359
  	__u8			rsvd96[3];
  	__u8			nsattr;
6605bdd59   Bart Van Assche   nvme: add I/O cha...
360
361
  	__le16			nvmsetid;
  	__le16			endgid;
9d99a8dda   Christoph Hellwig   nvme: move hardwa...
362
363
364
365
366
367
  	__u8			nguid[16];
  	__u8			eui64[8];
  	struct nvme_lbaf	lbaf[16];
  	__u8			rsvd192[192];
  	__u8			vs[3712];
  };
240e6ee27   Keith Busch   nvme: support for...
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
  struct nvme_zns_lbafe {
  	__le64			zsze;
  	__u8			zdes;
  	__u8			rsvd9[7];
  };
  
  struct nvme_id_ns_zns {
  	__le16			zoc;
  	__le16			ozcs;
  	__le32			mar;
  	__le32			mor;
  	__le32			rrl;
  	__le32			frl;
  	__u8			rsvd20[2796];
  	struct nvme_zns_lbafe	lbafe[16];
  	__u8			rsvd3072[768];
  	__u8			vs[256];
  };
  
  struct nvme_id_ctrl_zns {
  	__u8	zasl;
  	__u8	rsvd1[4095];
  };
9d99a8dda   Christoph Hellwig   nvme: move hardwa...
391
  enum {
329dd7681   Christoph Hellwig   nvme.h: add an en...
392
393
394
  	NVME_ID_CNS_NS			= 0x00,
  	NVME_ID_CNS_CTRL		= 0x01,
  	NVME_ID_CNS_NS_ACTIVE_LIST	= 0x02,
af8b86e9a   Johannes Thumshirn   nvme: introduce N...
395
  	NVME_ID_CNS_NS_DESC_LIST	= 0x03,
71010c309   Niklas Cassel   nvme: implement m...
396
397
  	NVME_ID_CNS_CS_NS		= 0x05,
  	NVME_ID_CNS_CS_CTRL		= 0x06,
329dd7681   Christoph Hellwig   nvme.h: add an en...
398
399
400
401
  	NVME_ID_CNS_NS_PRESENT_LIST	= 0x10,
  	NVME_ID_CNS_NS_PRESENT		= 0x11,
  	NVME_ID_CNS_CTRL_NS_LIST	= 0x12,
  	NVME_ID_CNS_CTRL_LIST		= 0x13,
48c9e85b2   Revanth Rajashekar   nvme: resync incl...
402
403
404
  	NVME_ID_CNS_SCNDRY_CTRL_LIST	= 0x15,
  	NVME_ID_CNS_NS_GRANULARITY	= 0x16,
  	NVME_ID_CNS_UUID_LIST		= 0x17,
329dd7681   Christoph Hellwig   nvme.h: add an en...
405
406
407
  };
  
  enum {
71010c309   Niklas Cassel   nvme: implement m...
408
  	NVME_CSI_NVM			= 0,
240e6ee27   Keith Busch   nvme: support for...
409
  	NVME_CSI_ZNS			= 2,
71010c309   Niklas Cassel   nvme: implement m...
410
411
412
  };
  
  enum {
f5d118406   Jens Axboe   nvme: add support...
413
414
415
416
417
418
419
420
421
422
423
424
425
  	NVME_DIR_IDENTIFY		= 0x00,
  	NVME_DIR_STREAMS		= 0x01,
  	NVME_DIR_SND_ID_OP_ENABLE	= 0x01,
  	NVME_DIR_SND_ST_OP_REL_ID	= 0x01,
  	NVME_DIR_SND_ST_OP_REL_RSC	= 0x02,
  	NVME_DIR_RCV_ID_OP_PARAM	= 0x01,
  	NVME_DIR_RCV_ST_OP_PARAM	= 0x01,
  	NVME_DIR_RCV_ST_OP_STATUS	= 0x02,
  	NVME_DIR_RCV_ST_OP_RESOURCE	= 0x03,
  	NVME_DIR_ENDIR			= 0x01,
  };
  
  enum {
9d99a8dda   Christoph Hellwig   nvme: move hardwa...
426
  	NVME_NS_FEAT_THIN	= 1 << 0,
92decf118   Keith Busch   nvme: define cons...
427
428
429
  	NVME_NS_FEAT_ATOMICS	= 1 << 1,
  	NVME_NS_FEAT_IO_OPT	= 1 << 4,
  	NVME_NS_ATTR_RO		= 1 << 0,
9d99a8dda   Christoph Hellwig   nvme: move hardwa...
430
431
  	NVME_NS_FLBAS_LBA_MASK	= 0xf,
  	NVME_NS_FLBAS_META_EXT	= 0x10,
92decf118   Keith Busch   nvme: define cons...
432
  	NVME_NS_NMIC_SHARED	= 1 << 0,
9d99a8dda   Christoph Hellwig   nvme: move hardwa...
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
  	NVME_LBAF_RP_BEST	= 0,
  	NVME_LBAF_RP_BETTER	= 1,
  	NVME_LBAF_RP_GOOD	= 2,
  	NVME_LBAF_RP_DEGRADED	= 3,
  	NVME_NS_DPC_PI_LAST	= 1 << 4,
  	NVME_NS_DPC_PI_FIRST	= 1 << 3,
  	NVME_NS_DPC_PI_TYPE3	= 1 << 2,
  	NVME_NS_DPC_PI_TYPE2	= 1 << 1,
  	NVME_NS_DPC_PI_TYPE1	= 1 << 0,
  	NVME_NS_DPS_PI_FIRST	= 1 << 3,
  	NVME_NS_DPS_PI_MASK	= 0x7,
  	NVME_NS_DPS_PI_TYPE1	= 1,
  	NVME_NS_DPS_PI_TYPE2	= 2,
  	NVME_NS_DPS_PI_TYPE3	= 3,
  };
39481fbd1   Israel Rukshin   nvme: add Metadat...
448
449
450
451
452
  /* Identify Namespace Metadata Capabilities (MC): */
  enum {
  	NVME_MC_EXTENDED_LBA	= (1 << 0),
  	NVME_MC_METADATA_PTR	= (1 << 1),
  };
af8b86e9a   Johannes Thumshirn   nvme: introduce N...
453
454
455
456
457
458
459
460
461
  struct nvme_ns_id_desc {
  	__u8 nidt;
  	__u8 nidl;
  	__le16 reserved;
  };
  
  #define NVME_NIDT_EUI64_LEN	8
  #define NVME_NIDT_NGUID_LEN	16
  #define NVME_NIDT_UUID_LEN	16
71010c309   Niklas Cassel   nvme: implement m...
462
  #define NVME_NIDT_CSI_LEN	1
af8b86e9a   Johannes Thumshirn   nvme: introduce N...
463
464
465
466
467
  
  enum {
  	NVME_NIDT_EUI64		= 0x01,
  	NVME_NIDT_NGUID		= 0x02,
  	NVME_NIDT_UUID		= 0x03,
71010c309   Niklas Cassel   nvme: implement m...
468
  	NVME_NIDT_CSI		= 0x04,
af8b86e9a   Johannes Thumshirn   nvme: introduce N...
469
  };
9d99a8dda   Christoph Hellwig   nvme: move hardwa...
470
471
472
473
474
475
  struct nvme_smart_log {
  	__u8			critical_warning;
  	__u8			temperature[2];
  	__u8			avail_spare;
  	__u8			spare_thresh;
  	__u8			percent_used;
48c9e85b2   Revanth Rajashekar   nvme: resync incl...
476
477
  	__u8			endu_grp_crit_warn_sumry;
  	__u8			rsvd7[25];
9d99a8dda   Christoph Hellwig   nvme: move hardwa...
478
479
480
481
482
483
484
485
486
487
488
489
490
  	__u8			data_units_read[16];
  	__u8			data_units_written[16];
  	__u8			host_reads[16];
  	__u8			host_writes[16];
  	__u8			ctrl_busy_time[16];
  	__u8			power_cycles[16];
  	__u8			power_on_hours[16];
  	__u8			unsafe_shutdowns[16];
  	__u8			media_errors[16];
  	__u8			num_err_log_entries[16];
  	__le32			warning_temp_time;
  	__le32			critical_comp_time;
  	__le16			temp_sensor[8];
48c9e85b2   Revanth Rajashekar   nvme: resync incl...
491
492
493
494
495
  	__le32			thm_temp1_trans_count;
  	__le32			thm_temp2_trans_count;
  	__le32			thm_temp1_total_time;
  	__le32			thm_temp2_total_time;
  	__u8			rsvd232[280];
9d99a8dda   Christoph Hellwig   nvme: move hardwa...
496
  };
b6dccf7fa   Arnav Dawn   nvme: add support...
497
498
499
500
501
502
  struct nvme_fw_slot_info_log {
  	__u8			afi;
  	__u8			rsvd1[7];
  	__le64			frs[7];
  	__u8			rsvd64[448];
  };
9d99a8dda   Christoph Hellwig   nvme: move hardwa...
503
  enum {
84fef62d1   Keith Busch   nvme: check admin...
504
505
506
507
508
509
  	NVME_CMD_EFFECTS_CSUPP		= 1 << 0,
  	NVME_CMD_EFFECTS_LBCC		= 1 << 1,
  	NVME_CMD_EFFECTS_NCC		= 1 << 2,
  	NVME_CMD_EFFECTS_NIC		= 1 << 3,
  	NVME_CMD_EFFECTS_CCC		= 1 << 4,
  	NVME_CMD_EFFECTS_CSE_MASK	= 3 << 16,
48c9e85b2   Revanth Rajashekar   nvme: resync incl...
510
  	NVME_CMD_EFFECTS_UUID_SEL	= 1 << 19,
84fef62d1   Keith Busch   nvme: check admin...
511
512
513
514
515
516
517
  };
  
  struct nvme_effects_log {
  	__le32 acs[256];
  	__le32 iocs[256];
  	__u8   resv[2048];
  };
1a3762165   Christoph Hellwig   nvme.h: add ANA d...
518
519
520
521
522
523
524
525
526
527
528
529
530
  enum nvme_ana_state {
  	NVME_ANA_OPTIMIZED		= 0x01,
  	NVME_ANA_NONOPTIMIZED		= 0x02,
  	NVME_ANA_INACCESSIBLE		= 0x03,
  	NVME_ANA_PERSISTENT_LOSS	= 0x04,
  	NVME_ANA_CHANGE			= 0x0f,
  };
  
  struct nvme_ana_group_desc {
  	__le32	grpid;
  	__le32	nnsids;
  	__le64	chgcnt;
  	__u8	state;
8b92d0e3d   Hannes Reinecke   nvme.h: fixup ANA...
531
  	__u8	rsvd17[15];
1a3762165   Christoph Hellwig   nvme.h: add ANA d...
532
533
534
535
536
537
538
539
540
541
542
  	__le32	nsids[];
  };
  
  /* flag for the log specific field of the ANA log */
  #define NVME_ANA_LOG_RGO	(1 << 0)
  
  struct nvme_ana_rsp_hdr {
  	__le64	chgcnt;
  	__le16	ngrps;
  	__le16	rsvd10[3];
  };
240e6ee27   Keith Busch   nvme: support for...
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
  struct nvme_zone_descriptor {
  	__u8		zt;
  	__u8		zs;
  	__u8		za;
  	__u8		rsvd3[5];
  	__le64		zcap;
  	__le64		zslba;
  	__le64		wp;
  	__u8		rsvd32[32];
  };
  
  enum {
  	NVME_ZONE_TYPE_SEQWRITE_REQ	= 0x2,
  };
  
  struct nvme_zone_report {
  	__le64		nr_zones;
  	__u8		resv8[56];
  	struct nvme_zone_descriptor entries[];
  };
84fef62d1   Keith Busch   nvme: check admin...
563
  enum {
9d99a8dda   Christoph Hellwig   nvme: move hardwa...
564
565
566
567
568
569
570
571
  	NVME_SMART_CRIT_SPARE		= 1 << 0,
  	NVME_SMART_CRIT_TEMPERATURE	= 1 << 1,
  	NVME_SMART_CRIT_RELIABILITY	= 1 << 2,
  	NVME_SMART_CRIT_MEDIA		= 1 << 3,
  	NVME_SMART_CRIT_VOLATILE_MEMORY	= 1 << 4,
  };
  
  enum {
e3d7874dc   Keith Busch   nvme: send uevent...
572
573
  	NVME_AER_ERROR			= 0,
  	NVME_AER_SMART			= 1,
868c2392a   Christoph Hellwig   nvme.h: untangle ...
574
  	NVME_AER_NOTICE			= 2,
e3d7874dc   Keith Busch   nvme: send uevent...
575
576
  	NVME_AER_CSS			= 6,
  	NVME_AER_VS			= 7,
868c2392a   Christoph Hellwig   nvme.h: untangle ...
577
578
579
580
581
  };
  
  enum {
  	NVME_AER_NOTICE_NS_CHANGED	= 0x00,
  	NVME_AER_NOTICE_FW_ACT_STARTING = 0x01,
1a3762165   Christoph Hellwig   nvme.h: add ANA d...
582
  	NVME_AER_NOTICE_ANA		= 0x03,
f301c2b13   Jay Sternberg   nvmet: add define...
583
  	NVME_AER_NOTICE_DISC_CHANGED	= 0xf0,
9d99a8dda   Christoph Hellwig   nvme: move hardwa...
584
  };
aafd3afe9   Hannes Reinecke   nvme.h: add AEN c...
585
  enum {
7114ddeb4   Jay Sternberg   nvmet: change aen...
586
587
588
  	NVME_AEN_BIT_NS_ATTR		= 8,
  	NVME_AEN_BIT_FW_ACT		= 9,
  	NVME_AEN_BIT_ANA_CHANGE		= 11,
f301c2b13   Jay Sternberg   nvmet: add define...
589
  	NVME_AEN_BIT_DISC_CHANGE	= 31,
7114ddeb4   Jay Sternberg   nvmet: change aen...
590
591
592
593
594
595
  };
  
  enum {
  	NVME_AEN_CFG_NS_ATTR		= 1 << NVME_AEN_BIT_NS_ATTR,
  	NVME_AEN_CFG_FW_ACT		= 1 << NVME_AEN_BIT_FW_ACT,
  	NVME_AEN_CFG_ANA_CHANGE		= 1 << NVME_AEN_BIT_ANA_CHANGE,
f301c2b13   Jay Sternberg   nvmet: add define...
596
  	NVME_AEN_CFG_DISC_CHANGE	= 1 << NVME_AEN_BIT_DISC_CHANGE,
aafd3afe9   Hannes Reinecke   nvme.h: add AEN c...
597
  };
9d99a8dda   Christoph Hellwig   nvme: move hardwa...
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
  struct nvme_lba_range_type {
  	__u8			type;
  	__u8			attributes;
  	__u8			rsvd2[14];
  	__u64			slba;
  	__u64			nlb;
  	__u8			guid[16];
  	__u8			rsvd48[16];
  };
  
  enum {
  	NVME_LBART_TYPE_FS	= 0x01,
  	NVME_LBART_TYPE_RAID	= 0x02,
  	NVME_LBART_TYPE_CACHE	= 0x03,
  	NVME_LBART_TYPE_SWAP	= 0x04,
  
  	NVME_LBART_ATTRIB_TEMP	= 1 << 0,
  	NVME_LBART_ATTRIB_HIDE	= 1 << 1,
  };
  
  struct nvme_reservation_status {
  	__le32	gen;
  	__u8	rtype;
  	__u8	regctl[2];
  	__u8	resv5[2];
  	__u8	ptpls;
  	__u8	resv10[13];
  	struct {
  		__le16	cntlid;
  		__u8	rcsts;
  		__u8	resv3[5];
  		__le64	hostid;
  		__le64	rkey;
  	} regctl_ds[];
  };
79f370eac   Christoph Hellwig   nvme.h: add AER c...
633
634
635
636
637
  enum nvme_async_event_type {
  	NVME_AER_TYPE_ERROR	= 0,
  	NVME_AER_TYPE_SMART	= 1,
  	NVME_AER_TYPE_NOTICE	= 2,
  };
9d99a8dda   Christoph Hellwig   nvme: move hardwa...
638
639
640
641
642
643
644
645
646
647
  /* I/O commands */
  
  enum nvme_opcode {
  	nvme_cmd_flush		= 0x00,
  	nvme_cmd_write		= 0x01,
  	nvme_cmd_read		= 0x02,
  	nvme_cmd_write_uncor	= 0x04,
  	nvme_cmd_compare	= 0x05,
  	nvme_cmd_write_zeroes	= 0x08,
  	nvme_cmd_dsm		= 0x09,
48c9e85b2   Revanth Rajashekar   nvme: resync incl...
648
  	nvme_cmd_verify		= 0x0c,
9d99a8dda   Christoph Hellwig   nvme: move hardwa...
649
650
651
652
  	nvme_cmd_resv_register	= 0x0d,
  	nvme_cmd_resv_report	= 0x0e,
  	nvme_cmd_resv_acquire	= 0x11,
  	nvme_cmd_resv_release	= 0x15,
240e6ee27   Keith Busch   nvme: support for...
653
654
655
  	nvme_cmd_zone_mgmt_send	= 0x79,
  	nvme_cmd_zone_mgmt_recv	= 0x7a,
  	nvme_cmd_zone_append	= 0x7d,
9d99a8dda   Christoph Hellwig   nvme: move hardwa...
656
  };
26f2990d8   Minwoo Im   nvme-trace: move ...
657
658
659
660
661
662
663
664
665
666
667
668
669
670
  #define nvme_opcode_name(opcode)	{ opcode, #opcode }
  #define show_nvm_opcode_name(val)				\
  	__print_symbolic(val,					\
  		nvme_opcode_name(nvme_cmd_flush),		\
  		nvme_opcode_name(nvme_cmd_write),		\
  		nvme_opcode_name(nvme_cmd_read),		\
  		nvme_opcode_name(nvme_cmd_write_uncor),		\
  		nvme_opcode_name(nvme_cmd_compare),		\
  		nvme_opcode_name(nvme_cmd_write_zeroes),	\
  		nvme_opcode_name(nvme_cmd_dsm),			\
  		nvme_opcode_name(nvme_cmd_resv_register),	\
  		nvme_opcode_name(nvme_cmd_resv_report),		\
  		nvme_opcode_name(nvme_cmd_resv_acquire),	\
  		nvme_opcode_name(nvme_cmd_resv_release))
3972be23b   James Smart   nvme.h: add const...
671
  /*
eb793e2c9   Christoph Hellwig   nvme.h: add NVMe ...
672
673
674
675
   * Descriptor subtype - lower 4 bits of nvme_(keyed_)sgl_desc identifier
   *
   * @NVME_SGL_FMT_ADDRESS:     absolute address of the data block
   * @NVME_SGL_FMT_OFFSET:      relative offset of the in-capsule data block
d85cf2074   James Smart   nvme: add transpo...
676
   * @NVME_SGL_FMT_TRANSPORT_A: transport defined format, value 0xA
eb793e2c9   Christoph Hellwig   nvme.h: add NVMe ...
677
678
679
680
681
682
   * @NVME_SGL_FMT_INVALIDATE:  RDMA transport specific remote invalidation
   *                            request subtype
   */
  enum {
  	NVME_SGL_FMT_ADDRESS		= 0x00,
  	NVME_SGL_FMT_OFFSET		= 0x01,
d85cf2074   James Smart   nvme: add transpo...
683
  	NVME_SGL_FMT_TRANSPORT_A	= 0x0A,
eb793e2c9   Christoph Hellwig   nvme.h: add NVMe ...
684
685
686
687
688
689
690
691
692
693
694
695
696
  	NVME_SGL_FMT_INVALIDATE		= 0x0f,
  };
  
  /*
   * Descriptor type - upper 4 bits of nvme_(keyed_)sgl_desc identifier
   *
   * For struct nvme_sgl_desc:
   *   @NVME_SGL_FMT_DATA_DESC:		data block descriptor
   *   @NVME_SGL_FMT_SEG_DESC:		sgl segment descriptor
   *   @NVME_SGL_FMT_LAST_SEG_DESC:	last sgl segment descriptor
   *
   * For struct nvme_keyed_sgl_desc:
   *   @NVME_KEY_SGL_FMT_DATA_DESC:	keyed data block descriptor
d85cf2074   James Smart   nvme: add transpo...
697
698
699
   *
   * Transport-specific SGL types:
   *   @NVME_TRANSPORT_SGL_DATA_DESC:	Transport SGL data dlock descriptor
eb793e2c9   Christoph Hellwig   nvme.h: add NVMe ...
700
701
702
703
704
705
   */
  enum {
  	NVME_SGL_FMT_DATA_DESC		= 0x00,
  	NVME_SGL_FMT_SEG_DESC		= 0x02,
  	NVME_SGL_FMT_LAST_SEG_DESC	= 0x03,
  	NVME_KEY_SGL_FMT_DATA_DESC	= 0x04,
d85cf2074   James Smart   nvme: add transpo...
706
  	NVME_TRANSPORT_SGL_DATA_DESC	= 0x05,
eb793e2c9   Christoph Hellwig   nvme.h: add NVMe ...
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
  };
  
  struct nvme_sgl_desc {
  	__le64	addr;
  	__le32	length;
  	__u8	rsvd[3];
  	__u8	type;
  };
  
  struct nvme_keyed_sgl_desc {
  	__le64	addr;
  	__u8	length[3];
  	__u8	key[4];
  	__u8	type;
  };
  
  union nvme_data_ptr {
  	struct {
  		__le64	prp1;
  		__le64	prp2;
  	};
  	struct nvme_sgl_desc	sgl;
  	struct nvme_keyed_sgl_desc ksgl;
  };
  
  /*
3972be23b   James Smart   nvme.h: add const...
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
   * Lowest two bits of our flags field (FUSE field in the spec):
   *
   * @NVME_CMD_FUSE_FIRST:   Fused Operation, first command
   * @NVME_CMD_FUSE_SECOND:  Fused Operation, second command
   *
   * Highest two bits in our flags field (PSDT field in the spec):
   *
   * @NVME_CMD_PSDT_SGL_METABUF:	Use SGLS for this transfer,
   *	If used, MPTR contains addr of single physical buffer (byte aligned).
   * @NVME_CMD_PSDT_SGL_METASEG:	Use SGLS for this transfer,
   *	If used, MPTR contains an address of an SGL segment containing
   *	exactly 1 SGL descriptor (qword aligned).
   */
  enum {
  	NVME_CMD_FUSE_FIRST	= (1 << 0),
  	NVME_CMD_FUSE_SECOND	= (1 << 1),
  
  	NVME_CMD_SGL_METABUF	= (1 << 6),
  	NVME_CMD_SGL_METASEG	= (1 << 7),
  	NVME_CMD_SGL_ALL	= NVME_CMD_SGL_METABUF | NVME_CMD_SGL_METASEG,
  };
9d99a8dda   Christoph Hellwig   nvme: move hardwa...
754
755
756
757
758
759
760
  struct nvme_common_command {
  	__u8			opcode;
  	__u8			flags;
  	__u16			command_id;
  	__le32			nsid;
  	__le32			cdw2[2];
  	__le64			metadata;
eb793e2c9   Christoph Hellwig   nvme.h: add NVMe ...
761
  	union nvme_data_ptr	dptr;
b7c8f3663   Chaitanya Kulkarni   nvme: remove nvme...
762
763
764
765
766
767
  	__le32			cdw10;
  	__le32			cdw11;
  	__le32			cdw12;
  	__le32			cdw13;
  	__le32			cdw14;
  	__le32			cdw15;
9d99a8dda   Christoph Hellwig   nvme: move hardwa...
768
769
770
771
772
773
774
775
776
  };
  
  struct nvme_rw_command {
  	__u8			opcode;
  	__u8			flags;
  	__u16			command_id;
  	__le32			nsid;
  	__u64			rsvd2;
  	__le64			metadata;
eb793e2c9   Christoph Hellwig   nvme.h: add NVMe ...
777
  	union nvme_data_ptr	dptr;
9d99a8dda   Christoph Hellwig   nvme: move hardwa...
778
779
780
781
782
783
784
785
786
787
788
789
  	__le64			slba;
  	__le16			length;
  	__le16			control;
  	__le32			dsmgmt;
  	__le32			reftag;
  	__le16			apptag;
  	__le16			appmask;
  };
  
  enum {
  	NVME_RW_LR			= 1 << 15,
  	NVME_RW_FUA			= 1 << 14,
240e6ee27   Keith Busch   nvme: support for...
790
  	NVME_RW_APPEND_PIREMAP		= 1 << 9,
9d99a8dda   Christoph Hellwig   nvme: move hardwa...
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
  	NVME_RW_DSM_FREQ_UNSPEC		= 0,
  	NVME_RW_DSM_FREQ_TYPICAL	= 1,
  	NVME_RW_DSM_FREQ_RARE		= 2,
  	NVME_RW_DSM_FREQ_READS		= 3,
  	NVME_RW_DSM_FREQ_WRITES		= 4,
  	NVME_RW_DSM_FREQ_RW		= 5,
  	NVME_RW_DSM_FREQ_ONCE		= 6,
  	NVME_RW_DSM_FREQ_PREFETCH	= 7,
  	NVME_RW_DSM_FREQ_TEMP		= 8,
  	NVME_RW_DSM_LATENCY_NONE	= 0 << 4,
  	NVME_RW_DSM_LATENCY_IDLE	= 1 << 4,
  	NVME_RW_DSM_LATENCY_NORM	= 2 << 4,
  	NVME_RW_DSM_LATENCY_LOW		= 3 << 4,
  	NVME_RW_DSM_SEQ_REQ		= 1 << 6,
  	NVME_RW_DSM_COMPRESSED		= 1 << 7,
  	NVME_RW_PRINFO_PRCHK_REF	= 1 << 10,
  	NVME_RW_PRINFO_PRCHK_APP	= 1 << 11,
  	NVME_RW_PRINFO_PRCHK_GUARD	= 1 << 12,
  	NVME_RW_PRINFO_PRACT		= 1 << 13,
f5d118406   Jens Axboe   nvme: add support...
810
  	NVME_RW_DTYPE_STREAMS		= 1 << 4,
9d99a8dda   Christoph Hellwig   nvme: move hardwa...
811
812
813
814
815
816
817
818
  };
  
  struct nvme_dsm_cmd {
  	__u8			opcode;
  	__u8			flags;
  	__u16			command_id;
  	__le32			nsid;
  	__u64			rsvd2[2];
eb793e2c9   Christoph Hellwig   nvme.h: add NVMe ...
819
  	union nvme_data_ptr	dptr;
9d99a8dda   Christoph Hellwig   nvme: move hardwa...
820
821
822
823
824
825
826
827
828
829
  	__le32			nr;
  	__le32			attributes;
  	__u32			rsvd12[4];
  };
  
  enum {
  	NVME_DSMGMT_IDR		= 1 << 0,
  	NVME_DSMGMT_IDW		= 1 << 1,
  	NVME_DSMGMT_AD		= 1 << 2,
  };
b35ba01ea   Christoph Hellwig   nvme: support ran...
830
  #define NVME_DSM_MAX_RANGES	256
9d99a8dda   Christoph Hellwig   nvme: move hardwa...
831
832
833
834
835
  struct nvme_dsm_range {
  	__le32			cattr;
  	__le32			nlb;
  	__le64			slba;
  };
3b7c33b28   Chaitanya Kulkarni   nvme.h: add Write...
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
  struct nvme_write_zeroes_cmd {
  	__u8			opcode;
  	__u8			flags;
  	__u16			command_id;
  	__le32			nsid;
  	__u64			rsvd2;
  	__le64			metadata;
  	union nvme_data_ptr	dptr;
  	__le64			slba;
  	__le16			length;
  	__le16			control;
  	__le32			dsmgmt;
  	__le32			reftag;
  	__le16			apptag;
  	__le16			appmask;
  };
240e6ee27   Keith Busch   nvme: support for...
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
  enum nvme_zone_mgmt_action {
  	NVME_ZONE_CLOSE		= 0x1,
  	NVME_ZONE_FINISH	= 0x2,
  	NVME_ZONE_OPEN		= 0x3,
  	NVME_ZONE_RESET		= 0x4,
  	NVME_ZONE_OFFLINE	= 0x5,
  	NVME_ZONE_SET_DESC_EXT	= 0x10,
  };
  
  struct nvme_zone_mgmt_send_cmd {
  	__u8			opcode;
  	__u8			flags;
  	__u16			command_id;
  	__le32			nsid;
  	__le32			cdw2[2];
  	__le64			metadata;
  	union nvme_data_ptr	dptr;
  	__le64			slba;
  	__le32			cdw12;
  	__u8			zsa;
  	__u8			select_all;
  	__u8			rsvd13[2];
  	__le32			cdw14[2];
  };
  
  struct nvme_zone_mgmt_recv_cmd {
  	__u8			opcode;
  	__u8			flags;
  	__u16			command_id;
  	__le32			nsid;
  	__le64			rsvd2[2];
  	union nvme_data_ptr	dptr;
  	__le64			slba;
  	__le32			numd;
  	__u8			zra;
  	__u8			zrasf;
  	__u8			pr;
  	__u8			rsvd13;
  	__le32			cdw14[2];
  };
  
  enum {
  	NVME_ZRA_ZONE_REPORT		= 0,
  	NVME_ZRASF_ZONE_REPORT_ALL	= 0,
  	NVME_REPORT_ZONE_PARTIAL	= 1,
  };
c5552fde1   Andy Lutomirski   nvme: Enable auto...
898
  /* Features */
52deba0f0   Akinobu Mita   nvme: hwmon: prov...
899
900
901
902
903
  enum {
  	NVME_TEMP_THRESH_MASK		= 0xffff,
  	NVME_TEMP_THRESH_SELECT_SHIFT	= 16,
  	NVME_TEMP_THRESH_TYPE_UNDER	= 0x100000,
  };
c5552fde1   Andy Lutomirski   nvme: Enable auto...
904
905
906
  struct nvme_feat_auto_pst {
  	__le64 entries[32];
  };
39673e199   Christoph Hellwig   nvme.h: add struc...
907
908
909
910
  enum {
  	NVME_HOST_MEM_ENABLE	= (1 << 0),
  	NVME_HOST_MEM_RETURN	= (1 << 1),
  };
49cd84b6f   Keith Busch   nvme: implement E...
911
912
913
914
915
916
917
918
  struct nvme_feat_host_behavior {
  	__u8 acre;
  	__u8 resv1[511];
  };
  
  enum {
  	NVME_ENABLE_ACRE	= 1,
  };
9d99a8dda   Christoph Hellwig   nvme: move hardwa...
919
920
921
922
923
924
925
926
927
928
929
930
931
  /* Admin commands */
  
  enum nvme_admin_opcode {
  	nvme_admin_delete_sq		= 0x00,
  	nvme_admin_create_sq		= 0x01,
  	nvme_admin_get_log_page		= 0x02,
  	nvme_admin_delete_cq		= 0x04,
  	nvme_admin_create_cq		= 0x05,
  	nvme_admin_identify		= 0x06,
  	nvme_admin_abort_cmd		= 0x08,
  	nvme_admin_set_features		= 0x09,
  	nvme_admin_get_features		= 0x0a,
  	nvme_admin_async_event		= 0x0c,
a446c0840   Christoph Hellwig   nvme.h: resync wi...
932
  	nvme_admin_ns_mgmt		= 0x0d,
9d99a8dda   Christoph Hellwig   nvme: move hardwa...
933
934
  	nvme_admin_activate_fw		= 0x10,
  	nvme_admin_download_fw		= 0x11,
48c9e85b2   Revanth Rajashekar   nvme: resync incl...
935
  	nvme_admin_dev_self_test	= 0x14,
a446c0840   Christoph Hellwig   nvme.h: resync wi...
936
  	nvme_admin_ns_attach		= 0x15,
7b89eae29   Sagi Grimberg   nvme.h: Add keep-...
937
  	nvme_admin_keep_alive		= 0x18,
f5d118406   Jens Axboe   nvme: add support...
938
939
  	nvme_admin_directive_send	= 0x19,
  	nvme_admin_directive_recv	= 0x1a,
48c9e85b2   Revanth Rajashekar   nvme: resync incl...
940
941
942
  	nvme_admin_virtual_mgmt		= 0x1c,
  	nvme_admin_nvme_mi_send		= 0x1d,
  	nvme_admin_nvme_mi_recv		= 0x1e,
f9f38e333   Helen Koike   nvme: improve per...
943
  	nvme_admin_dbbuf		= 0x7C,
9d99a8dda   Christoph Hellwig   nvme: move hardwa...
944
945
946
  	nvme_admin_format_nvm		= 0x80,
  	nvme_admin_security_send	= 0x81,
  	nvme_admin_security_recv	= 0x82,
84fef62d1   Keith Busch   nvme: check admin...
947
  	nvme_admin_sanitize_nvm		= 0x84,
c63898452   Minwoo Im   nvme: add Get LBA...
948
  	nvme_admin_get_lba_status	= 0x86,
c1fef73f7   Logan Gunthorpe   nvmet: add passth...
949
  	nvme_admin_vendor_start		= 0xC0,
9d99a8dda   Christoph Hellwig   nvme: move hardwa...
950
  };
26f2990d8   Minwoo Im   nvme-trace: move ...
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
  #define nvme_admin_opcode_name(opcode)	{ opcode, #opcode }
  #define show_admin_opcode_name(val)					\
  	__print_symbolic(val,						\
  		nvme_admin_opcode_name(nvme_admin_delete_sq),		\
  		nvme_admin_opcode_name(nvme_admin_create_sq),		\
  		nvme_admin_opcode_name(nvme_admin_get_log_page),	\
  		nvme_admin_opcode_name(nvme_admin_delete_cq),		\
  		nvme_admin_opcode_name(nvme_admin_create_cq),		\
  		nvme_admin_opcode_name(nvme_admin_identify),		\
  		nvme_admin_opcode_name(nvme_admin_abort_cmd),		\
  		nvme_admin_opcode_name(nvme_admin_set_features),	\
  		nvme_admin_opcode_name(nvme_admin_get_features),	\
  		nvme_admin_opcode_name(nvme_admin_async_event),		\
  		nvme_admin_opcode_name(nvme_admin_ns_mgmt),		\
  		nvme_admin_opcode_name(nvme_admin_activate_fw),		\
  		nvme_admin_opcode_name(nvme_admin_download_fw),		\
  		nvme_admin_opcode_name(nvme_admin_ns_attach),		\
  		nvme_admin_opcode_name(nvme_admin_keep_alive),		\
  		nvme_admin_opcode_name(nvme_admin_directive_send),	\
  		nvme_admin_opcode_name(nvme_admin_directive_recv),	\
  		nvme_admin_opcode_name(nvme_admin_dbbuf),		\
  		nvme_admin_opcode_name(nvme_admin_format_nvm),		\
  		nvme_admin_opcode_name(nvme_admin_security_send),	\
  		nvme_admin_opcode_name(nvme_admin_security_recv),	\
a5ef75720   Minwoo Im   nvme: trace: supp...
975
976
  		nvme_admin_opcode_name(nvme_admin_sanitize_nvm),	\
  		nvme_admin_opcode_name(nvme_admin_get_lba_status))
26f2990d8   Minwoo Im   nvme-trace: move ...
977

9d99a8dda   Christoph Hellwig   nvme: move hardwa...
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
  enum {
  	NVME_QUEUE_PHYS_CONTIG	= (1 << 0),
  	NVME_CQ_IRQ_ENABLED	= (1 << 1),
  	NVME_SQ_PRIO_URGENT	= (0 << 1),
  	NVME_SQ_PRIO_HIGH	= (1 << 1),
  	NVME_SQ_PRIO_MEDIUM	= (2 << 1),
  	NVME_SQ_PRIO_LOW	= (3 << 1),
  	NVME_FEAT_ARBITRATION	= 0x01,
  	NVME_FEAT_POWER_MGMT	= 0x02,
  	NVME_FEAT_LBA_RANGE	= 0x03,
  	NVME_FEAT_TEMP_THRESH	= 0x04,
  	NVME_FEAT_ERR_RECOVERY	= 0x05,
  	NVME_FEAT_VOLATILE_WC	= 0x06,
  	NVME_FEAT_NUM_QUEUES	= 0x07,
  	NVME_FEAT_IRQ_COALESCE	= 0x08,
  	NVME_FEAT_IRQ_CONFIG	= 0x09,
  	NVME_FEAT_WRITE_ATOMIC	= 0x0a,
  	NVME_FEAT_ASYNC_EVENT	= 0x0b,
  	NVME_FEAT_AUTO_PST	= 0x0c,
a446c0840   Christoph Hellwig   nvme.h: resync wi...
997
  	NVME_FEAT_HOST_MEM_BUF	= 0x0d,
dbf86b390   Jon Derrick   nvme: add support...
998
  	NVME_FEAT_TIMESTAMP	= 0x0e,
7b89eae29   Sagi Grimberg   nvme.h: Add keep-...
999
  	NVME_FEAT_KATO		= 0x0f,
40c6f9c28   Revanth Rajashekar   nvme.h: resync wi...
1000
1001
1002
1003
1004
  	NVME_FEAT_HCTM		= 0x10,
  	NVME_FEAT_NOPSC		= 0x11,
  	NVME_FEAT_RRL		= 0x12,
  	NVME_FEAT_PLM_CONFIG	= 0x13,
  	NVME_FEAT_PLM_WINDOW	= 0x14,
49cd84b6f   Keith Busch   nvme: implement E...
1005
  	NVME_FEAT_HOST_BEHAVIOR	= 0x16,
48c9e85b2   Revanth Rajashekar   nvme: resync incl...
1006
  	NVME_FEAT_SANITIZE	= 0x17,
9d99a8dda   Christoph Hellwig   nvme: move hardwa...
1007
1008
1009
1010
  	NVME_FEAT_SW_PROGRESS	= 0x80,
  	NVME_FEAT_HOST_ID	= 0x81,
  	NVME_FEAT_RESV_MASK	= 0x82,
  	NVME_FEAT_RESV_PERSIST	= 0x83,
93045d594   Chaitanya Kulkarni   nvme.h: add suppo...
1011
  	NVME_FEAT_WRITE_PROTECT	= 0x84,
c1fef73f7   Logan Gunthorpe   nvmet: add passth...
1012
1013
  	NVME_FEAT_VENDOR_START	= 0xC0,
  	NVME_FEAT_VENDOR_END	= 0xFF,
9d99a8dda   Christoph Hellwig   nvme: move hardwa...
1014
1015
1016
  	NVME_LOG_ERROR		= 0x01,
  	NVME_LOG_SMART		= 0x02,
  	NVME_LOG_FW_SLOT	= 0x03,
b3984e064   Christoph Hellwig   nvme.h: add the c...
1017
  	NVME_LOG_CHANGED_NS	= 0x04,
84fef62d1   Keith Busch   nvme: check admin...
1018
  	NVME_LOG_CMD_EFFECTS	= 0x05,
48c9e85b2   Revanth Rajashekar   nvme: resync incl...
1019
1020
1021
1022
  	NVME_LOG_DEVICE_SELF_TEST = 0x06,
  	NVME_LOG_TELEMETRY_HOST = 0x07,
  	NVME_LOG_TELEMETRY_CTRL = 0x08,
  	NVME_LOG_ENDURANCE_GROUP = 0x09,
1a3762165   Christoph Hellwig   nvme.h: add ANA d...
1023
  	NVME_LOG_ANA		= 0x0c,
eb793e2c9   Christoph Hellwig   nvme.h: add NVMe ...
1024
  	NVME_LOG_DISC		= 0x70,
9d99a8dda   Christoph Hellwig   nvme: move hardwa...
1025
1026
1027
1028
1029
  	NVME_LOG_RESERVATION	= 0x80,
  	NVME_FWACT_REPL		= (0 << 3),
  	NVME_FWACT_REPL_ACTV	= (1 << 3),
  	NVME_FWACT_ACTV		= (2 << 3),
  };
93045d594   Chaitanya Kulkarni   nvme.h: add suppo...
1030
1031
1032
1033
1034
1035
1036
  /* NVMe Namespace Write Protect State */
  enum {
  	NVME_NS_NO_WRITE_PROTECT = 0,
  	NVME_NS_WRITE_PROTECT,
  	NVME_NS_WRITE_PROTECT_POWER_CYCLE,
  	NVME_NS_WRITE_PROTECT_PERMANENT,
  };
b3984e064   Christoph Hellwig   nvme.h: add the c...
1037
  #define NVME_MAX_CHANGED_NAMESPACES	1024
9d99a8dda   Christoph Hellwig   nvme: move hardwa...
1038
1039
1040
1041
1042
1043
  struct nvme_identify {
  	__u8			opcode;
  	__u8			flags;
  	__u16			command_id;
  	__le32			nsid;
  	__u64			rsvd2[2];
eb793e2c9   Christoph Hellwig   nvme.h: add NVMe ...
1044
  	union nvme_data_ptr	dptr;
986994a27   Parav Pandit   nvme: Use CNS as ...
1045
1046
1047
  	__u8			cns;
  	__u8			rsvd3;
  	__le16			ctrlid;
71010c309   Niklas Cassel   nvme: implement m...
1048
1049
1050
  	__u8			rsvd11[3];
  	__u8			csi;
  	__u32			rsvd12[4];
9d99a8dda   Christoph Hellwig   nvme: move hardwa...
1051
  };
0add5e8e5   Johannes Thumshirn   nvmet: use NVME_I...
1052
  #define NVME_IDENTIFY_DATA_SIZE 4096
9d99a8dda   Christoph Hellwig   nvme: move hardwa...
1053
1054
1055
1056
1057
1058
  struct nvme_features {
  	__u8			opcode;
  	__u8			flags;
  	__u16			command_id;
  	__le32			nsid;
  	__u64			rsvd2[2];
eb793e2c9   Christoph Hellwig   nvme.h: add NVMe ...
1059
  	union nvme_data_ptr	dptr;
9d99a8dda   Christoph Hellwig   nvme: move hardwa...
1060
1061
  	__le32			fid;
  	__le32			dword11;
b85cf7348   Arnav Dawn   nvme.h: add dword...
1062
1063
1064
1065
  	__le32                  dword12;
  	__le32                  dword13;
  	__le32                  dword14;
  	__le32                  dword15;
9d99a8dda   Christoph Hellwig   nvme: move hardwa...
1066
  };
39673e199   Christoph Hellwig   nvme.h: add struc...
1067
1068
1069
1070
1071
  struct nvme_host_mem_buf_desc {
  	__le64			addr;
  	__le32			size;
  	__u32			rsvd;
  };
9d99a8dda   Christoph Hellwig   nvme: move hardwa...
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
  struct nvme_create_cq {
  	__u8			opcode;
  	__u8			flags;
  	__u16			command_id;
  	__u32			rsvd1[5];
  	__le64			prp1;
  	__u64			rsvd8;
  	__le16			cqid;
  	__le16			qsize;
  	__le16			cq_flags;
  	__le16			irq_vector;
  	__u32			rsvd12[4];
  };
  
  struct nvme_create_sq {
  	__u8			opcode;
  	__u8			flags;
  	__u16			command_id;
  	__u32			rsvd1[5];
  	__le64			prp1;
  	__u64			rsvd8;
  	__le16			sqid;
  	__le16			qsize;
  	__le16			sq_flags;
  	__le16			cqid;
  	__u32			rsvd12[4];
  };
  
  struct nvme_delete_queue {
  	__u8			opcode;
  	__u8			flags;
  	__u16			command_id;
  	__u32			rsvd1[9];
  	__le16			qid;
  	__u16			rsvd10;
  	__u32			rsvd11[5];
  };
  
  struct nvme_abort_cmd {
  	__u8			opcode;
  	__u8			flags;
  	__u16			command_id;
  	__u32			rsvd1[9];
  	__le16			sqid;
  	__u16			cid;
  	__u32			rsvd11[5];
  };
  
  struct nvme_download_firmware {
  	__u8			opcode;
  	__u8			flags;
  	__u16			command_id;
  	__u32			rsvd1[5];
eb793e2c9   Christoph Hellwig   nvme.h: add NVMe ...
1125
  	union nvme_data_ptr	dptr;
9d99a8dda   Christoph Hellwig   nvme: move hardwa...
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
  	__le32			numd;
  	__le32			offset;
  	__u32			rsvd12[4];
  };
  
  struct nvme_format_cmd {
  	__u8			opcode;
  	__u8			flags;
  	__u16			command_id;
  	__le32			nsid;
  	__u64			rsvd2[4];
  	__le32			cdw10;
  	__u32			rsvd11[5];
  };
725b35883   Armen Baloyan   nvme.h: Add get_l...
1140
1141
1142
1143
1144
1145
  struct nvme_get_log_page_command {
  	__u8			opcode;
  	__u8			flags;
  	__u16			command_id;
  	__le32			nsid;
  	__u64			rsvd2[2];
eb793e2c9   Christoph Hellwig   nvme.h: add NVMe ...
1146
  	union nvme_data_ptr	dptr;
725b35883   Armen Baloyan   nvme.h: Add get_l...
1147
  	__u8			lid;
9b89bc385   Christoph Hellwig   nvme.h: add suppo...
1148
  	__u8			lsp; /* upper 4 bits reserved */
725b35883   Armen Baloyan   nvme.h: Add get_l...
1149
1150
1151
  	__le16			numdl;
  	__le16			numdu;
  	__u16			rsvd11;
d808b7f75   Keith Busch   nvmet: fix discov...
1152
1153
1154
1155
1156
1157
1158
  	union {
  		struct {
  			__le32 lpol;
  			__le32 lpou;
  		};
  		__le64 lpo;
  	};
be93e87e7   Keith Busch   nvme: support for...
1159
1160
1161
  	__u8			rsvd14[3];
  	__u8			csi;
  	__u32			rsvd15;
725b35883   Armen Baloyan   nvme.h: Add get_l...
1162
  };
f5d118406   Jens Axboe   nvme: add support...
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
  struct nvme_directive_cmd {
  	__u8			opcode;
  	__u8			flags;
  	__u16			command_id;
  	__le32			nsid;
  	__u64			rsvd2[2];
  	union nvme_data_ptr	dptr;
  	__le32			numd;
  	__u8			doper;
  	__u8			dtype;
  	__le16			dspec;
  	__u8			endir;
  	__u8			tdtype;
  	__u16			rsvd15;
  
  	__u32			rsvd16[3];
  };
eb793e2c9   Christoph Hellwig   nvme.h: add NVMe ...
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
  /*
   * Fabrics subcommands.
   */
  enum nvmf_fabrics_opcode {
  	nvme_fabrics_command		= 0x7f,
  };
  
  enum nvmf_capsule_command {
  	nvme_fabrics_type_property_set	= 0x00,
  	nvme_fabrics_type_connect	= 0x01,
  	nvme_fabrics_type_property_get	= 0x04,
  };
ad795e47c   Minwoo Im   nvme-trace: suppo...
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
  #define nvme_fabrics_type_name(type)   { type, #type }
  #define show_fabrics_type_name(type)					\
  	__print_symbolic(type,						\
  		nvme_fabrics_type_name(nvme_fabrics_type_property_set),	\
  		nvme_fabrics_type_name(nvme_fabrics_type_connect),	\
  		nvme_fabrics_type_name(nvme_fabrics_type_property_get))
  
  /*
   * If not fabrics command, fctype will be ignored.
   */
  #define show_opcode_name(qid, opcode, fctype)			\
  	((opcode) == nvme_fabrics_command ?			\
  	 show_fabrics_type_name(fctype) :			\
  	((qid) ?						\
  	 show_nvm_opcode_name(opcode) :				\
  	 show_admin_opcode_name(opcode)))
eb793e2c9   Christoph Hellwig   nvme.h: add NVMe ...
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
  struct nvmf_common_command {
  	__u8	opcode;
  	__u8	resv1;
  	__u16	command_id;
  	__u8	fctype;
  	__u8	resv2[35];
  	__u8	ts[24];
  };
  
  /*
   * The legal cntlid range a NVMe Target will provide.
   * Note that cntlid of value 0 is considered illegal in the fabrics world.
   * Devices based on earlier specs did not have the subsystem concept;
   * therefore, those devices had their cntlid value set to 0 as a result.
   */
  #define NVME_CNTLID_MIN		1
  #define NVME_CNTLID_MAX		0xffef
  #define NVME_CNTLID_DYNAMIC	0xffff
  
  #define MAX_DISC_LOGS	255
  
  /* Discovery log page entry */
  struct nvmf_disc_rsp_page_entry {
  	__u8		trtype;
  	__u8		adrfam;
a446c0840   Christoph Hellwig   nvme.h: resync wi...
1233
  	__u8		subtype;
eb793e2c9   Christoph Hellwig   nvme.h: add NVMe ...
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
  	__u8		treq;
  	__le16		portid;
  	__le16		cntlid;
  	__le16		asqsz;
  	__u8		resv8[22];
  	char		trsvcid[NVMF_TRSVCID_SIZE];
  	__u8		resv64[192];
  	char		subnqn[NVMF_NQN_FIELD_LEN];
  	char		traddr[NVMF_TRADDR_SIZE];
  	union tsas {
  		char		common[NVMF_TSAS_SIZE];
  		struct rdma {
  			__u8	qptype;
  			__u8	prtype;
  			__u8	cms;
  			__u8	resv3[5];
  			__u16	pkey;
  			__u8	resv10[246];
  		} rdma;
  	} tsas;
  };
  
  /* Discovery log page header */
  struct nvmf_disc_rsp_page_hdr {
  	__le64		genctr;
  	__le64		numrec;
  	__le16		recfmt;
  	__u8		resv14[1006];
f1e71d75f   Gustavo A. R. Silva   nvme: replace zer...
1262
  	struct nvmf_disc_rsp_page_entry entries[];
eb793e2c9   Christoph Hellwig   nvme.h: add NVMe ...
1263
  };
e6a622fd6   Sagi Grimberg   nvmet: support fa...
1264
1265
1266
  enum {
  	NVME_CONNECT_DISABLE_SQFLOW	= (1 << 2),
  };
eb793e2c9   Christoph Hellwig   nvme.h: add NVMe ...
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
  struct nvmf_connect_command {
  	__u8		opcode;
  	__u8		resv1;
  	__u16		command_id;
  	__u8		fctype;
  	__u8		resv2[19];
  	union nvme_data_ptr dptr;
  	__le16		recfmt;
  	__le16		qid;
  	__le16		sqsize;
  	__u8		cattr;
  	__u8		resv3;
  	__le32		kato;
  	__u8		resv4[12];
  };
  
  struct nvmf_connect_data {
8e4122632   Christoph Hellwig   nvme: switch to u...
1284
  	uuid_t		hostid;
eb793e2c9   Christoph Hellwig   nvme.h: add NVMe ...
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
  	__le16		cntlid;
  	char		resv4[238];
  	char		subsysnqn[NVMF_NQN_FIELD_LEN];
  	char		hostnqn[NVMF_NQN_FIELD_LEN];
  	char		resv5[256];
  };
  
  struct nvmf_property_set_command {
  	__u8		opcode;
  	__u8		resv1;
  	__u16		command_id;
  	__u8		fctype;
  	__u8		resv2[35];
  	__u8		attrib;
  	__u8		resv3[3];
  	__le32		offset;
  	__le64		value;
  	__u8		resv4[8];
  };
  
  struct nvmf_property_get_command {
  	__u8		opcode;
  	__u8		resv1;
  	__u16		command_id;
  	__u8		fctype;
  	__u8		resv2[35];
  	__u8		attrib;
  	__u8		resv3[3];
  	__le32		offset;
  	__u8		resv4[16];
  };
f9f38e333   Helen Koike   nvme: improve per...
1316
1317
1318
1319
1320
1321
1322
1323
1324
  struct nvme_dbbuf {
  	__u8			opcode;
  	__u8			flags;
  	__u16			command_id;
  	__u32			rsvd1[5];
  	__le64			prp1;
  	__le64			prp2;
  	__u32			rsvd12[6];
  };
f5d118406   Jens Axboe   nvme: add support...
1325
  struct streams_directive_params {
dc1a0afba   Christoph Hellwig   nvme: fix byte sw...
1326
1327
1328
  	__le16	msl;
  	__le16	nssa;
  	__le16	nsso;
f5d118406   Jens Axboe   nvme: add support...
1329
  	__u8	rsvd[10];
dc1a0afba   Christoph Hellwig   nvme: fix byte sw...
1330
1331
1332
1333
  	__le32	sws;
  	__le16	sgs;
  	__le16	nsa;
  	__le16	nso;
f5d118406   Jens Axboe   nvme: add support...
1334
1335
  	__u8	rsvd2[6];
  };
9d99a8dda   Christoph Hellwig   nvme: move hardwa...
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
  struct nvme_command {
  	union {
  		struct nvme_common_command common;
  		struct nvme_rw_command rw;
  		struct nvme_identify identify;
  		struct nvme_features features;
  		struct nvme_create_cq create_cq;
  		struct nvme_create_sq create_sq;
  		struct nvme_delete_queue delete_queue;
  		struct nvme_download_firmware dlfw;
  		struct nvme_format_cmd format;
  		struct nvme_dsm_cmd dsm;
3b7c33b28   Chaitanya Kulkarni   nvme.h: add Write...
1348
  		struct nvme_write_zeroes_cmd write_zeroes;
240e6ee27   Keith Busch   nvme: support for...
1349
1350
  		struct nvme_zone_mgmt_send_cmd zms;
  		struct nvme_zone_mgmt_recv_cmd zmr;
9d99a8dda   Christoph Hellwig   nvme: move hardwa...
1351
  		struct nvme_abort_cmd abort;
725b35883   Armen Baloyan   nvme.h: Add get_l...
1352
  		struct nvme_get_log_page_command get_log_page;
eb793e2c9   Christoph Hellwig   nvme.h: add NVMe ...
1353
1354
1355
1356
  		struct nvmf_common_command fabrics;
  		struct nvmf_connect_command connect;
  		struct nvmf_property_set_command prop_set;
  		struct nvmf_property_get_command prop_get;
f9f38e333   Helen Koike   nvme: improve per...
1357
  		struct nvme_dbbuf dbbuf;
f5d118406   Jens Axboe   nvme: add support...
1358
  		struct nvme_directive_cmd directive;
9d99a8dda   Christoph Hellwig   nvme: move hardwa...
1359
1360
  	};
  };
7a1f46e3f   Minwoo Im   nvme: introduce n...
1361
1362
1363
1364
  static inline bool nvme_is_fabrics(struct nvme_command *cmd)
  {
  	return cmd->common.opcode == nvme_fabrics_command;
  }
b34de7cee   Chaitanya Kulkarni   nvme: add error l...
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
  struct nvme_error_slot {
  	__le64		error_count;
  	__le16		sqid;
  	__le16		cmdid;
  	__le16		status_field;
  	__le16		param_error_location;
  	__le64		lba;
  	__le32		nsid;
  	__u8		vs;
  	__u8		resv[3];
  	__le64		cs;
  	__u8		resv2[24];
  };
7a5abb4b4   Christoph Hellwig   nvme: factor out ...
1378
1379
  static inline bool nvme_is_write(struct nvme_command *cmd)
  {
eb793e2c9   Christoph Hellwig   nvme.h: add NVMe ...
1380
1381
1382
1383
1384
  	/*
  	 * What a mess...
  	 *
  	 * Why can't we simply have a Fabrics In and Fabrics out command?
  	 */
7a1f46e3f   Minwoo Im   nvme: introduce n...
1385
  	if (unlikely(nvme_is_fabrics(cmd)))
2fd4167fa   Jon Derrick   nvme: fabrics com...
1386
  		return cmd->fabrics.fctype & 1;
7a5abb4b4   Christoph Hellwig   nvme: factor out ...
1387
1388
  	return cmd->common.opcode & 1;
  }
9d99a8dda   Christoph Hellwig   nvme: move hardwa...
1389
  enum {
eb793e2c9   Christoph Hellwig   nvme.h: add NVMe ...
1390
1391
1392
  	/*
  	 * Generic Command Status:
  	 */
9d99a8dda   Christoph Hellwig   nvme: move hardwa...
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
  	NVME_SC_SUCCESS			= 0x0,
  	NVME_SC_INVALID_OPCODE		= 0x1,
  	NVME_SC_INVALID_FIELD		= 0x2,
  	NVME_SC_CMDID_CONFLICT		= 0x3,
  	NVME_SC_DATA_XFER_ERROR		= 0x4,
  	NVME_SC_POWER_LOSS		= 0x5,
  	NVME_SC_INTERNAL		= 0x6,
  	NVME_SC_ABORT_REQ		= 0x7,
  	NVME_SC_ABORT_QUEUE		= 0x8,
  	NVME_SC_FUSED_FAIL		= 0x9,
  	NVME_SC_FUSED_MISSING		= 0xa,
  	NVME_SC_INVALID_NS		= 0xb,
  	NVME_SC_CMD_SEQ_ERROR		= 0xc,
  	NVME_SC_SGL_INVALID_LAST	= 0xd,
  	NVME_SC_SGL_INVALID_COUNT	= 0xe,
  	NVME_SC_SGL_INVALID_DATA	= 0xf,
  	NVME_SC_SGL_INVALID_METADATA	= 0x10,
  	NVME_SC_SGL_INVALID_TYPE	= 0x11,
eb793e2c9   Christoph Hellwig   nvme.h: add NVMe ...
1411
1412
1413
  
  	NVME_SC_SGL_INVALID_OFFSET	= 0x16,
  	NVME_SC_SGL_INVALID_SUBTYPE	= 0x17,
48c9e85b2   Revanth Rajashekar   nvme: resync incl...
1414
1415
  	NVME_SC_SANITIZE_FAILED		= 0x1C,
  	NVME_SC_SANITIZE_IN_PROGRESS	= 0x1D,
93045d594   Chaitanya Kulkarni   nvme.h: add suppo...
1416
  	NVME_SC_NS_WRITE_PROTECTED	= 0x20,
48c9e85b2   Revanth Rajashekar   nvme: resync incl...
1417
  	NVME_SC_CMD_INTERRUPTED		= 0x21,
93045d594   Chaitanya Kulkarni   nvme.h: add suppo...
1418

9d99a8dda   Christoph Hellwig   nvme: move hardwa...
1419
1420
1421
1422
  	NVME_SC_LBA_RANGE		= 0x80,
  	NVME_SC_CAP_EXCEEDED		= 0x81,
  	NVME_SC_NS_NOT_READY		= 0x82,
  	NVME_SC_RESERVATION_CONFLICT	= 0x83,
eb793e2c9   Christoph Hellwig   nvme.h: add NVMe ...
1423
1424
1425
1426
  
  	/*
  	 * Command Specific Status:
  	 */
9d99a8dda   Christoph Hellwig   nvme: move hardwa...
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
  	NVME_SC_CQ_INVALID		= 0x100,
  	NVME_SC_QID_INVALID		= 0x101,
  	NVME_SC_QUEUE_SIZE		= 0x102,
  	NVME_SC_ABORT_LIMIT		= 0x103,
  	NVME_SC_ABORT_MISSING		= 0x104,
  	NVME_SC_ASYNC_LIMIT		= 0x105,
  	NVME_SC_FIRMWARE_SLOT		= 0x106,
  	NVME_SC_FIRMWARE_IMAGE		= 0x107,
  	NVME_SC_INVALID_VECTOR		= 0x108,
  	NVME_SC_INVALID_LOG_PAGE	= 0x109,
  	NVME_SC_INVALID_FORMAT		= 0x10a,
a446c0840   Christoph Hellwig   nvme.h: resync wi...
1438
  	NVME_SC_FW_NEEDS_CONV_RESET	= 0x10b,
9d99a8dda   Christoph Hellwig   nvme: move hardwa...
1439
1440
1441
1442
  	NVME_SC_INVALID_QUEUE		= 0x10c,
  	NVME_SC_FEATURE_NOT_SAVEABLE	= 0x10d,
  	NVME_SC_FEATURE_NOT_CHANGEABLE	= 0x10e,
  	NVME_SC_FEATURE_NOT_PER_NS	= 0x10f,
a446c0840   Christoph Hellwig   nvme.h: resync wi...
1443
1444
1445
  	NVME_SC_FW_NEEDS_SUBSYS_RESET	= 0x110,
  	NVME_SC_FW_NEEDS_RESET		= 0x111,
  	NVME_SC_FW_NEEDS_MAX_TIME	= 0x112,
9581ae4f0   Minwoo Im   nvme: fix typos i...
1446
  	NVME_SC_FW_ACTIVATE_PROHIBITED	= 0x113,
a446c0840   Christoph Hellwig   nvme.h: resync wi...
1447
  	NVME_SC_OVERLAPPING_RANGE	= 0x114,
9581ae4f0   Minwoo Im   nvme: fix typos i...
1448
  	NVME_SC_NS_INSUFFICIENT_CAP	= 0x115,
a446c0840   Christoph Hellwig   nvme.h: resync wi...
1449
1450
1451
1452
1453
1454
  	NVME_SC_NS_ID_UNAVAILABLE	= 0x116,
  	NVME_SC_NS_ALREADY_ATTACHED	= 0x118,
  	NVME_SC_NS_IS_PRIVATE		= 0x119,
  	NVME_SC_NS_NOT_ATTACHED		= 0x11a,
  	NVME_SC_THIN_PROV_NOT_SUPP	= 0x11b,
  	NVME_SC_CTRL_LIST_INVALID	= 0x11c,
48c9e85b2   Revanth Rajashekar   nvme: resync incl...
1455
1456
  	NVME_SC_BP_WRITE_PROHIBITED	= 0x11e,
  	NVME_SC_PMR_SAN_PROHIBITED	= 0x123,
eb793e2c9   Christoph Hellwig   nvme.h: add NVMe ...
1457
1458
1459
1460
  
  	/*
  	 * I/O Command Set Specific - NVM commands:
  	 */
9d99a8dda   Christoph Hellwig   nvme: move hardwa...
1461
1462
1463
  	NVME_SC_BAD_ATTRIBUTES		= 0x180,
  	NVME_SC_INVALID_PI		= 0x181,
  	NVME_SC_READ_ONLY		= 0x182,
3b7c33b28   Chaitanya Kulkarni   nvme.h: add Write...
1464
  	NVME_SC_ONCS_NOT_SUPPORTED	= 0x183,
eb793e2c9   Christoph Hellwig   nvme.h: add NVMe ...
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
  
  	/*
  	 * I/O Command Set Specific - Fabrics commands:
  	 */
  	NVME_SC_CONNECT_FORMAT		= 0x180,
  	NVME_SC_CONNECT_CTRL_BUSY	= 0x181,
  	NVME_SC_CONNECT_INVALID_PARAM	= 0x182,
  	NVME_SC_CONNECT_RESTART_DISC	= 0x183,
  	NVME_SC_CONNECT_INVALID_HOST	= 0x184,
  
  	NVME_SC_DISCOVERY_RESTART	= 0x190,
  	NVME_SC_AUTH_REQUIRED		= 0x191,
  
  	/*
240e6ee27   Keith Busch   nvme: support for...
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
  	 * I/O Command Set Specific - Zoned commands:
  	 */
  	NVME_SC_ZONE_BOUNDARY_ERROR	= 0x1b8,
  	NVME_SC_ZONE_FULL		= 0x1b9,
  	NVME_SC_ZONE_READ_ONLY		= 0x1ba,
  	NVME_SC_ZONE_OFFLINE		= 0x1bb,
  	NVME_SC_ZONE_INVALID_WRITE	= 0x1bc,
  	NVME_SC_ZONE_TOO_MANY_ACTIVE	= 0x1bd,
  	NVME_SC_ZONE_TOO_MANY_OPEN	= 0x1be,
  	NVME_SC_ZONE_INVALID_TRANSITION	= 0x1bf,
  
  	/*
eb793e2c9   Christoph Hellwig   nvme.h: add NVMe ...
1491
1492
  	 * Media and Data Integrity Errors:
  	 */
9d99a8dda   Christoph Hellwig   nvme: move hardwa...
1493
1494
1495
1496
1497
1498
1499
  	NVME_SC_WRITE_FAULT		= 0x280,
  	NVME_SC_READ_ERROR		= 0x281,
  	NVME_SC_GUARD_CHECK		= 0x282,
  	NVME_SC_APPTAG_CHECK		= 0x283,
  	NVME_SC_REFTAG_CHECK		= 0x284,
  	NVME_SC_COMPARE_FAILED		= 0x285,
  	NVME_SC_ACCESS_DENIED		= 0x286,
a446c0840   Christoph Hellwig   nvme.h: resync wi...
1500
  	NVME_SC_UNWRITTEN_BLOCK		= 0x287,
eb793e2c9   Christoph Hellwig   nvme.h: add NVMe ...
1501

1a3762165   Christoph Hellwig   nvme.h: add ANA d...
1502
1503
1504
1505
1506
1507
  	/*
  	 * Path-related Errors:
  	 */
  	NVME_SC_ANA_PERSISTENT_LOSS	= 0x301,
  	NVME_SC_ANA_INACCESSIBLE	= 0x302,
  	NVME_SC_ANA_TRANSITION		= 0x303,
783f4a440   James Smart   nvme: call nvme_c...
1508
  	NVME_SC_HOST_PATH_ERROR		= 0x370,
2dc3947b5   Max Gurtovoy   nvme: introduce "...
1509
  	NVME_SC_HOST_ABORTED_CMD	= 0x371,
1a3762165   Christoph Hellwig   nvme.h: add ANA d...
1510

49cd84b6f   Keith Busch   nvme: implement E...
1511
  	NVME_SC_CRD			= 0x1800,
9d99a8dda   Christoph Hellwig   nvme: move hardwa...
1512
1513
1514
1515
  	NVME_SC_DNR			= 0x4000,
  };
  
  struct nvme_completion {
eb793e2c9   Christoph Hellwig   nvme.h: add NVMe ...
1516
1517
1518
  	/*
  	 * Used by Admin and Fabrics commands to return data:
  	 */
d49187e97   Christoph Hellwig   nvme: introduce s...
1519
1520
1521
1522
1523
  	union nvme_result {
  		__le16	u16;
  		__le32	u32;
  		__le64	u64;
  	} result;
9d99a8dda   Christoph Hellwig   nvme: move hardwa...
1524
1525
1526
1527
1528
  	__le16	sq_head;	/* how much of this queue may be reclaimed */
  	__le16	sq_id;		/* submission queue that generated this entry */
  	__u16	command_id;	/* of the command which completed */
  	__le16	status;		/* did the command fail, and if so, why? */
  };
8ef2074d2   Gabriel Krisman Bertazi   nvme: Add tertiar...
1529
1530
  #define NVME_VS(major, minor, tertiary) \
  	(((major) << 16) | ((minor) << 8) | (tertiary))
9d99a8dda   Christoph Hellwig   nvme: move hardwa...
1531

c61d788b8   Johannes Thumshirn   nvmet: allow over...
1532
1533
1534
  #define NVME_MAJOR(ver)		((ver) >> 16)
  #define NVME_MINOR(ver)		(((ver) >> 8) & 0xff)
  #define NVME_TERTIARY(ver)	((ver) & 0xff)
b60503ba4   Matthew Wilcox   NVMe: New driver
1535
  #endif /* _LINUX_NVME_H */