engines:io_uring: generate and verify pi for 16b guard
[fio.git] / engines / nvme.h
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
17 struct 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
45 #define NVME_NQN_LENGTH 256
46
47 #define NVME_PI_APP_DISABLE 0xFFFF
48 #define NVME_PI_REF_DISABLE 0xFFFFFFFF
49
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
55 #define NVME_ATTRIBUTE_DEALLOCATE (1 << 2)
56
57 enum nvme_identify_cns {
58         NVME_IDENTIFY_CNS_NS            = 0x00,
59         NVME_IDENTIFY_CNS_CTRL          = 0x01,
60         NVME_IDENTIFY_CNS_CSI_NS        = 0x05,
61         NVME_IDENTIFY_CNS_CSI_CTRL      = 0x06,
62 };
63
64 enum nvme_csi {
65         NVME_CSI_NVM                    = 0,
66         NVME_CSI_KV                     = 1,
67         NVME_CSI_ZNS                    = 2,
68 };
69
70 enum nvme_admin_opcode {
71         nvme_admin_identify             = 0x06,
72 };
73
74 enum nvme_io_opcode {
75         nvme_cmd_write                  = 0x01,
76         nvme_cmd_read                   = 0x02,
77         nvme_cmd_dsm                    = 0x09,
78         nvme_cmd_io_mgmt_recv           = 0x12,
79         nvme_zns_cmd_mgmt_send          = 0x79,
80         nvme_zns_cmd_mgmt_recv          = 0x7a,
81 };
82
83 enum 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,
91 };
92
93 enum nvme_id_ctrl_ctratt {
94         NVME_CTRL_CTRATT_ELBAS          = 1 << 15,
95 };
96
97 enum {
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
103 enum {
104         NVME_NVM_NS_16B_GUARD           = 0,
105         NVME_NVM_NS_32B_GUARD           = 1,
106         NVME_NVM_NS_64B_GUARD           = 2,
107 };
108
109 struct nvme_data {
110         __u32 nsid;
111         __u32 lba_shift;
112         __u32 lba_size;
113         __u32 lba_ext;
114         __u16 ms;
115         __u16 pi_size;
116         __u8 pi_type;
117         __u8 guard_type;
118         __u8 pi_loc;
119 };
120
121 enum 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
130 enum 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,
135 };
136
137 struct nvme_pi_data {
138         __u32 interval;
139         __u32 io_flags;
140         __u16 apptag;
141         __u16 apptag_mask;
142 };
143
144 struct nvme_lbaf {
145         __le16                  ms;
146         __u8                    ds;
147         __u8                    rp;
148 };
149
150 /* 16 bit guard protection Information format */
151 struct nvme_16b_guard_pif {
152         __be16 guard;
153         __be16 apptag;
154         __be32 srtag;
155 };
156
157 /* 64 bit guard protection Information format */
158 struct nvme_64b_guard_pif {
159         __be64 guard;
160         __be16 apptag;
161         __u8 srtag[6];
162 };
163
164 struct 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];
202         struct nvme_lbaf        lbaf[64];
203         __u8                    vs[3712];
204 };
205
206 struct 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
224 struct 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
325 struct nvme_nvm_id_ns {
326         __le64                  lbstm;
327         __u8                    pic;
328         __u8                    rsvd9[3];
329         __le32                  elbaf[64];
330         __u8                    rsvd268[3828];
331 };
332
333 static 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
344 struct nvme_zns_lbafe {
345         __le64  zsze;
346         __u8    zdes;
347         __u8    rsvd9[7];
348 };
349
350 struct 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
372 struct 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
384 struct nvme_zone_report {
385         __le64                  nr_zones;
386         __u8                    rsvd8[56];
387         struct nvme_zns_desc    entries[];
388 };
389
390 struct nvme_fdp_ruh_status_desc {
391         __u16 pid;
392         __u16 ruhid;
393         __u32 earutr;
394         __u64 ruamw;
395         __u8  rsvd16[16];
396 };
397
398 struct nvme_fdp_ruh_status {
399         __u8  rsvd0[14];
400         __le16 nruhsd;
401         struct nvme_fdp_ruh_status_desc ruhss[];
402 };
403
404 struct nvme_dsm_range {
405         __le32  cattr;
406         __le32  nlb;
407         __le64  slba;
408 };
409
410 struct nvme_cmd_ext_io_opts {
411         __u32 io_flags;
412         __u16 apptag;
413         __u16 apptag_mask;
414 };
415
416 int fio_nvme_iomgmt_ruhs(struct thread_data *td, struct fio_file *f,
417                          struct nvme_fdp_ruh_status *ruhs, __u32 bytes);
418
419 int fio_nvme_get_info(struct fio_file *f, __u64 *nlba, __u32 pi_act,
420                       struct nvme_data *data);
421
422 int fio_nvme_uring_cmd_prep(struct nvme_uring_cmd *cmd, struct io_u *io_u,
423                             struct iovec *iov, struct nvme_dsm_range *dsm);
424
425 void fio_nvme_pi_fill(struct nvme_uring_cmd *cmd, struct io_u *io_u,
426                       struct nvme_cmd_ext_io_opts *opts);
427
428 int fio_nvme_pi_verify(struct nvme_data *data, struct io_u *io_u);
429
430 int fio_nvme_get_zoned_model(struct thread_data *td, struct fio_file *f,
431                              enum zbd_zoned_model *model);
432
433 int 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
437 int fio_nvme_reset_wp(struct thread_data *td, struct fio_file *f,
438                       uint64_t offset, uint64_t length);
439
440 int fio_nvme_get_max_open_zones(struct thread_data *td, struct fio_file *f,
441                                 unsigned int *max_open_zones);
442
443 #endif