crc: pull required crc16-t10 files from linux kernel
[fio.git] / engines / nvme.h
CommitLineData
b3d5e3fd
AK
1/*
2 * nvme structure declarations and helper functions for the
3 * io_uring_cmd engine.
4 */
5
6#ifndef FIO_NVME_H
7#define FIO_NVME_H
8
9#include <linux/nvme_ioctl.h>
10#include "../fio.h"
11
12/*
13 * If the uapi headers installed on the system lacks nvme uring command
14 * support, use the local version to prevent compilation issues.
15 */
16#ifndef CONFIG_NVME_URING_CMD
17struct nvme_uring_cmd {
18 __u8 opcode;
19 __u8 flags;
20 __u16 rsvd1;
21 __u32 nsid;
22 __u32 cdw2;
23 __u32 cdw3;
24 __u64 metadata;
25 __u64 addr;
26 __u32 metadata_len;
27 __u32 data_len;
28 __u32 cdw10;
29 __u32 cdw11;
30 __u32 cdw12;
31 __u32 cdw13;
32 __u32 cdw14;
33 __u32 cdw15;
34 __u32 timeout_ms;
35 __u32 rsvd2;
36};
37
38#define NVME_URING_CMD_IO _IOWR('N', 0x80, struct nvme_uring_cmd)
39#define NVME_URING_CMD_IO_VEC _IOWR('N', 0x81, struct nvme_uring_cmd)
40#endif /* CONFIG_NVME_URING_CMD */
41
42#define NVME_DEFAULT_IOCTL_TIMEOUT 0
43#define NVME_IDENTIFY_DATA_SIZE 4096
44#define NVME_IDENTIFY_CSI_SHIFT 24
3ee8311a 45#define NVME_NQN_LENGTH 256
b3d5e3fd 46
3d05e0ff
AK
47#define NVME_ZNS_ZRA_REPORT_ZONES 0
48#define NVME_ZNS_ZRAS_FEAT_ERZ (1 << 16)
49#define NVME_ZNS_ZSA_RESET 0x4
50#define NVME_ZONE_TYPE_SEQWRITE_REQ 0x2
51
16be6037
AK
52#define NVME_ATTRIBUTE_DEALLOCATE (1 << 2)
53
b3d5e3fd 54enum nvme_identify_cns {
3d05e0ff 55 NVME_IDENTIFY_CNS_NS = 0x00,
3ee8311a 56 NVME_IDENTIFY_CNS_CTRL = 0x01,
3d05e0ff
AK
57 NVME_IDENTIFY_CNS_CSI_NS = 0x05,
58 NVME_IDENTIFY_CNS_CSI_CTRL = 0x06,
b3d5e3fd
AK
59};
60
61enum nvme_csi {
62 NVME_CSI_NVM = 0,
63 NVME_CSI_KV = 1,
64 NVME_CSI_ZNS = 2,
65};
66
67enum nvme_admin_opcode {
68 nvme_admin_identify = 0x06,
69};
70
71enum nvme_io_opcode {
72 nvme_cmd_write = 0x01,
73 nvme_cmd_read = 0x02,
16be6037 74 nvme_cmd_dsm = 0x09,
a7e8aae0 75 nvme_cmd_io_mgmt_recv = 0x12,
3d05e0ff
AK
76 nvme_zns_cmd_mgmt_send = 0x79,
77 nvme_zns_cmd_mgmt_recv = 0x7a,
78};
79
80enum nvme_zns_zs {
81 NVME_ZNS_ZS_EMPTY = 0x1,
82 NVME_ZNS_ZS_IMPL_OPEN = 0x2,
83 NVME_ZNS_ZS_EXPL_OPEN = 0x3,
84 NVME_ZNS_ZS_CLOSED = 0x4,
85 NVME_ZNS_ZS_READ_ONLY = 0xd,
86 NVME_ZNS_ZS_FULL = 0xe,
87 NVME_ZNS_ZS_OFFLINE = 0xf,
b3d5e3fd
AK
88};
89
3ee8311a
AK
90enum nvme_id_ctrl_ctratt {
91 NVME_CTRL_CTRATT_ELBAS = 1 << 15,
92};
93
94enum {
95 NVME_ID_NS_NVM_STS_MASK = 0x7f,
96 NVME_ID_NS_NVM_GUARD_SHIFT = 7,
97 NVME_ID_NS_NVM_GUARD_MASK = 0x3,
98};
99
100enum {
101 NVME_NVM_NS_16B_GUARD = 0,
102 NVME_NVM_NS_32B_GUARD = 1,
103 NVME_NVM_NS_64B_GUARD = 2,
104};
105
b3d5e3fd
AK
106struct nvme_data {
107 __u32 nsid;
108 __u32 lba_shift;
e7e5023b 109 __u32 lba_size;
345fa8fd 110 __u32 lba_ext;
e7e5023b 111 __u16 ms;
3ee8311a
AK
112 __u16 pi_size;
113 __u8 pi_type;
114 __u8 guard_type;
115 __u8 pi_loc;
116};
117
118enum nvme_id_ns_dps {
119 NVME_NS_DPS_PI_NONE = 0,
120 NVME_NS_DPS_PI_TYPE1 = 1,
121 NVME_NS_DPS_PI_TYPE2 = 2,
122 NVME_NS_DPS_PI_TYPE3 = 3,
123 NVME_NS_DPS_PI_MASK = 7 << 0,
124 NVME_NS_DPS_PI_FIRST = 1 << 3,
125};
126
127enum nvme_io_control_flags {
128 NVME_IO_PRINFO_PRCHK_REF = 1U << 26,
129 NVME_IO_PRINFO_PRCHK_APP = 1U << 27,
130 NVME_IO_PRINFO_PRCHK_GUARD = 1U << 28,
131 NVME_IO_PRINFO_PRACT = 1U << 29,
b3d5e3fd
AK
132};
133
134struct nvme_lbaf {
135 __le16 ms;
136 __u8 ds;
137 __u8 rp;
138};
139
3ee8311a
AK
140/* 16 bit guard protection Information format */
141struct nvme_16b_guard_pif {
142 __be16 guard;
143 __be16 apptag;
144 __be32 srtag;
145};
146
147/* 64 bit guard protection Information format */
148struct nvme_64b_guard_pif {
149 __be64 guard;
150 __be16 apptag;
151 __u8 srtag[6];
152};
153
b3d5e3fd
AK
154struct nvme_id_ns {
155 __le64 nsze;
156 __le64 ncap;
157 __le64 nuse;
158 __u8 nsfeat;
159 __u8 nlbaf;
160 __u8 flbas;
161 __u8 mc;
162 __u8 dpc;
163 __u8 dps;
164 __u8 nmic;
165 __u8 rescap;
166 __u8 fpi;
167 __u8 dlfeat;
168 __le16 nawun;
169 __le16 nawupf;
170 __le16 nacwu;
171 __le16 nabsn;
172 __le16 nabo;
173 __le16 nabspf;
174 __le16 noiob;
175 __u8 nvmcap[16];
176 __le16 npwg;
177 __le16 npwa;
178 __le16 npdg;
179 __le16 npda;
180 __le16 nows;
181 __le16 mssrl;
182 __le32 mcl;
183 __u8 msrc;
184 __u8 rsvd81[11];
185 __le32 anagrpid;
186 __u8 rsvd96[3];
187 __u8 nsattr;
188 __le16 nvmsetid;
189 __le16 endgid;
190 __u8 nguid[16];
191 __u8 eui64[8];
01a7d384 192 struct nvme_lbaf lbaf[64];
b3d5e3fd
AK
193 __u8 vs[3712];
194};
195
3ee8311a
AK
196struct nvme_id_psd {
197 __le16 mp;
198 __u8 rsvd2;
199 __u8 flags;
200 __le32 enlat;
201 __le32 exlat;
202 __u8 rrt;
203 __u8 rrl;
204 __u8 rwt;
205 __u8 rwl;
206 __le16 idlp;
207 __u8 ips;
208 __u8 rsvd19;
209 __le16 actp;
210 __u8 apws;
211 __u8 rsvd23[9];
212};
213
214struct nvme_id_ctrl {
215 __le16 vid;
216 __le16 ssvid;
217 char sn[20];
218 char mn[40];
219 char fr[8];
220 __u8 rab;
221 __u8 ieee[3];
222 __u8 cmic;
223 __u8 mdts;
224 __le16 cntlid;
225 __le32 ver;
226 __le32 rtd3r;
227 __le32 rtd3e;
228 __le32 oaes;
229 __le32 ctratt;
230 __le16 rrls;
231 __u8 rsvd102[9];
232 __u8 cntrltype;
233 __u8 fguid[16];
234 __le16 crdt1;
235 __le16 crdt2;
236 __le16 crdt3;
237 __u8 rsvd134[119];
238 __u8 nvmsr;
239 __u8 vwci;
240 __u8 mec;
241 __le16 oacs;
242 __u8 acl;
243 __u8 aerl;
244 __u8 frmw;
245 __u8 lpa;
246 __u8 elpe;
247 __u8 npss;
248 __u8 avscc;
249 __u8 apsta;
250 __le16 wctemp;
251 __le16 cctemp;
252 __le16 mtfa;
253 __le32 hmpre;
254 __le32 hmmin;
255 __u8 tnvmcap[16];
256 __u8 unvmcap[16];
257 __le32 rpmbs;
258 __le16 edstt;
259 __u8 dsto;
260 __u8 fwug;
261 __le16 kas;
262 __le16 hctma;
263 __le16 mntmt;
264 __le16 mxtmt;
265 __le32 sanicap;
266 __le32 hmminds;
267 __le16 hmmaxd;
268 __le16 nsetidmax;
269 __le16 endgidmax;
270 __u8 anatt;
271 __u8 anacap;
272 __le32 anagrpmax;
273 __le32 nanagrpid;
274 __le32 pels;
275 __le16 domainid;
276 __u8 rsvd358[10];
277 __u8 megcap[16];
278 __u8 rsvd384[128];
279 __u8 sqes;
280 __u8 cqes;
281 __le16 maxcmd;
282 __le32 nn;
283 __le16 oncs;
284 __le16 fuses;
285 __u8 fna;
286 __u8 vwc;
287 __le16 awun;
288 __le16 awupf;
289 __u8 icsvscc;
290 __u8 nwpc;
291 __le16 acwu;
292 __le16 ocfs;
293 __le32 sgls;
294 __le32 mnan;
295 __u8 maxdna[16];
296 __le32 maxcna;
297 __u8 rsvd564[204];
298 char subnqn[NVME_NQN_LENGTH];
299 __u8 rsvd1024[768];
300
301 /* Fabrics Only */
302 __le32 ioccsz;
303 __le32 iorcsz;
304 __le16 icdoff;
305 __u8 fcatt;
306 __u8 msdbd;
307 __le16 ofcs;
308 __u8 dctype;
309 __u8 rsvd1807[241];
310
311 struct nvme_id_psd psd[32];
312 __u8 vs[1024];
313};
314
315struct nvme_nvm_id_ns {
316 __le64 lbstm;
317 __u8 pic;
318 __u8 rsvd9[3];
319 __le32 elbaf[64];
320 __u8 rsvd268[3828];
321};
322
b3d5e3fd
AK
323static inline int ilog2(uint32_t i)
324{
325 int log = -1;
326
327 while (i) {
328 i >>= 1;
329 log++;
330 }
331 return log;
332}
333
3d05e0ff
AK
334struct nvme_zns_lbafe {
335 __le64 zsze;
336 __u8 zdes;
337 __u8 rsvd9[7];
338};
339
340struct nvme_zns_id_ns {
341 __le16 zoc;
342 __le16 ozcs;
343 __le32 mar;
344 __le32 mor;
345 __le32 rrl;
346 __le32 frl;
347 __le32 rrl1;
348 __le32 rrl2;
349 __le32 rrl3;
350 __le32 frl1;
351 __le32 frl2;
352 __le32 frl3;
353 __le32 numzrwa;
354 __le16 zrwafg;
355 __le16 zrwasz;
356 __u8 zrwacap;
357 __u8 rsvd53[2763];
358 struct nvme_zns_lbafe lbafe[64];
359 __u8 vs[256];
360};
361
362struct nvme_zns_desc {
363 __u8 zt;
364 __u8 zs;
365 __u8 za;
366 __u8 zai;
367 __u8 rsvd4[4];
368 __le64 zcap;
369 __le64 zslba;
370 __le64 wp;
371 __u8 rsvd32[32];
372};
373
374struct nvme_zone_report {
375 __le64 nr_zones;
376 __u8 rsvd8[56];
377 struct nvme_zns_desc entries[];
378};
379
a7e8aae0
KB
380struct nvme_fdp_ruh_status_desc {
381 __u16 pid;
382 __u16 ruhid;
383 __u32 earutr;
384 __u64 ruamw;
385 __u8 rsvd16[16];
386};
387
388struct nvme_fdp_ruh_status {
389 __u8 rsvd0[14];
390 __le16 nruhsd;
391 struct nvme_fdp_ruh_status_desc ruhss[];
392};
393
16be6037
AK
394struct nvme_dsm_range {
395 __le32 cattr;
396 __le32 nlb;
397 __le64 slba;
398};
399
3ee8311a
AK
400struct nvme_cmd_ext_io_opts {
401 __u32 io_flags;
402 __u16 apptag;
403 __u16 apptag_mask;
404};
405
a7e8aae0
KB
406int fio_nvme_iomgmt_ruhs(struct thread_data *td, struct fio_file *f,
407 struct nvme_fdp_ruh_status *ruhs, __u32 bytes);
408
3ee8311a
AK
409int fio_nvme_get_info(struct fio_file *f, __u64 *nlba, __u32 pi_act,
410 struct nvme_data *data);
b3d5e3fd
AK
411
412int fio_nvme_uring_cmd_prep(struct nvme_uring_cmd *cmd, struct io_u *io_u,
4885a6eb 413 struct iovec *iov, struct nvme_dsm_range *dsm);
b3d5e3fd 414
3ee8311a
AK
415void fio_nvme_pi_fill(struct nvme_uring_cmd *cmd, struct io_u *io_u,
416 struct nvme_cmd_ext_io_opts *opts);
417
3d05e0ff
AK
418int fio_nvme_get_zoned_model(struct thread_data *td, struct fio_file *f,
419 enum zbd_zoned_model *model);
420
421int fio_nvme_report_zones(struct thread_data *td, struct fio_file *f,
422 uint64_t offset, struct zbd_zone *zbdz,
423 unsigned int nr_zones);
424
425int fio_nvme_reset_wp(struct thread_data *td, struct fio_file *f,
426 uint64_t offset, uint64_t length);
427
428int fio_nvme_get_max_open_zones(struct thread_data *td, struct fio_file *f,
429 unsigned int *max_open_zones);
430
b3d5e3fd 431#endif