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