engines:io_uring: enable support for separate metadata buffer
[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
45
3d05e0ff
AK
46#define NVME_ZNS_ZRA_REPORT_ZONES 0
47#define NVME_ZNS_ZRAS_FEAT_ERZ (1 << 16)
48#define NVME_ZNS_ZSA_RESET 0x4
49#define NVME_ZONE_TYPE_SEQWRITE_REQ 0x2
50
16be6037
AK
51#define NVME_ATTRIBUTE_DEALLOCATE (1 << 2)
52
b3d5e3fd 53enum nvme_identify_cns {
3d05e0ff
AK
54 NVME_IDENTIFY_CNS_NS = 0x00,
55 NVME_IDENTIFY_CNS_CSI_NS = 0x05,
56 NVME_IDENTIFY_CNS_CSI_CTRL = 0x06,
b3d5e3fd
AK
57};
58
59enum nvme_csi {
60 NVME_CSI_NVM = 0,
61 NVME_CSI_KV = 1,
62 NVME_CSI_ZNS = 2,
63};
64
65enum nvme_admin_opcode {
66 nvme_admin_identify = 0x06,
67};
68
69enum nvme_io_opcode {
70 nvme_cmd_write = 0x01,
71 nvme_cmd_read = 0x02,
16be6037 72 nvme_cmd_dsm = 0x09,
a7e8aae0 73 nvme_cmd_io_mgmt_recv = 0x12,
3d05e0ff
AK
74 nvme_zns_cmd_mgmt_send = 0x79,
75 nvme_zns_cmd_mgmt_recv = 0x7a,
76};
77
78enum nvme_zns_zs {
79 NVME_ZNS_ZS_EMPTY = 0x1,
80 NVME_ZNS_ZS_IMPL_OPEN = 0x2,
81 NVME_ZNS_ZS_EXPL_OPEN = 0x3,
82 NVME_ZNS_ZS_CLOSED = 0x4,
83 NVME_ZNS_ZS_READ_ONLY = 0xd,
84 NVME_ZNS_ZS_FULL = 0xe,
85 NVME_ZNS_ZS_OFFLINE = 0xf,
b3d5e3fd
AK
86};
87
88struct nvme_data {
89 __u32 nsid;
90 __u32 lba_shift;
e7e5023b 91 __u32 lba_size;
345fa8fd 92 __u32 lba_ext;
e7e5023b 93 __u16 ms;
b3d5e3fd
AK
94};
95
96struct nvme_lbaf {
97 __le16 ms;
98 __u8 ds;
99 __u8 rp;
100};
101
102struct nvme_id_ns {
103 __le64 nsze;
104 __le64 ncap;
105 __le64 nuse;
106 __u8 nsfeat;
107 __u8 nlbaf;
108 __u8 flbas;
109 __u8 mc;
110 __u8 dpc;
111 __u8 dps;
112 __u8 nmic;
113 __u8 rescap;
114 __u8 fpi;
115 __u8 dlfeat;
116 __le16 nawun;
117 __le16 nawupf;
118 __le16 nacwu;
119 __le16 nabsn;
120 __le16 nabo;
121 __le16 nabspf;
122 __le16 noiob;
123 __u8 nvmcap[16];
124 __le16 npwg;
125 __le16 npwa;
126 __le16 npdg;
127 __le16 npda;
128 __le16 nows;
129 __le16 mssrl;
130 __le32 mcl;
131 __u8 msrc;
132 __u8 rsvd81[11];
133 __le32 anagrpid;
134 __u8 rsvd96[3];
135 __u8 nsattr;
136 __le16 nvmsetid;
137 __le16 endgid;
138 __u8 nguid[16];
139 __u8 eui64[8];
01a7d384 140 struct nvme_lbaf lbaf[64];
b3d5e3fd
AK
141 __u8 vs[3712];
142};
143
144static inline int ilog2(uint32_t i)
145{
146 int log = -1;
147
148 while (i) {
149 i >>= 1;
150 log++;
151 }
152 return log;
153}
154
3d05e0ff
AK
155struct nvme_zns_lbafe {
156 __le64 zsze;
157 __u8 zdes;
158 __u8 rsvd9[7];
159};
160
161struct nvme_zns_id_ns {
162 __le16 zoc;
163 __le16 ozcs;
164 __le32 mar;
165 __le32 mor;
166 __le32 rrl;
167 __le32 frl;
168 __le32 rrl1;
169 __le32 rrl2;
170 __le32 rrl3;
171 __le32 frl1;
172 __le32 frl2;
173 __le32 frl3;
174 __le32 numzrwa;
175 __le16 zrwafg;
176 __le16 zrwasz;
177 __u8 zrwacap;
178 __u8 rsvd53[2763];
179 struct nvme_zns_lbafe lbafe[64];
180 __u8 vs[256];
181};
182
183struct nvme_zns_desc {
184 __u8 zt;
185 __u8 zs;
186 __u8 za;
187 __u8 zai;
188 __u8 rsvd4[4];
189 __le64 zcap;
190 __le64 zslba;
191 __le64 wp;
192 __u8 rsvd32[32];
193};
194
195struct nvme_zone_report {
196 __le64 nr_zones;
197 __u8 rsvd8[56];
198 struct nvme_zns_desc entries[];
199};
200
a7e8aae0
KB
201struct nvme_fdp_ruh_status_desc {
202 __u16 pid;
203 __u16 ruhid;
204 __u32 earutr;
205 __u64 ruamw;
206 __u8 rsvd16[16];
207};
208
209struct nvme_fdp_ruh_status {
210 __u8 rsvd0[14];
211 __le16 nruhsd;
212 struct nvme_fdp_ruh_status_desc ruhss[];
213};
214
16be6037
AK
215struct nvme_dsm_range {
216 __le32 cattr;
217 __le32 nlb;
218 __le64 slba;
219};
220
a7e8aae0
KB
221int fio_nvme_iomgmt_ruhs(struct thread_data *td, struct fio_file *f,
222 struct nvme_fdp_ruh_status *ruhs, __u32 bytes);
223
e7e5023b 224int fio_nvme_get_info(struct fio_file *f, __u64 *nlba, struct nvme_data *data);
b3d5e3fd
AK
225
226int fio_nvme_uring_cmd_prep(struct nvme_uring_cmd *cmd, struct io_u *io_u,
4885a6eb 227 struct iovec *iov, struct nvme_dsm_range *dsm);
b3d5e3fd 228
3d05e0ff
AK
229int fio_nvme_get_zoned_model(struct thread_data *td, struct fio_file *f,
230 enum zbd_zoned_model *model);
231
232int fio_nvme_report_zones(struct thread_data *td, struct fio_file *f,
233 uint64_t offset, struct zbd_zone *zbdz,
234 unsigned int nr_zones);
235
236int fio_nvme_reset_wp(struct thread_data *td, struct fio_file *f,
237 uint64_t offset, uint64_t length);
238
239int fio_nvme_get_max_open_zones(struct thread_data *td, struct fio_file *f,
240 unsigned int *max_open_zones);
241
b3d5e3fd 242#endif