Commit | Line | Data |
---|---|---|
e467cde2 RR |
1 | #ifndef _LINUX_VIRTIO_BLK_H |
2 | #define _LINUX_VIRTIO_BLK_H | |
674bfc23 | 3 | /* This header is BSD licensed so anyone can use the definitions to implement |
a1b38387 RR |
4 | * compatible drivers/servers. |
5 | * | |
6 | * Redistribution and use in source and binary forms, with or without | |
7 | * modification, are permitted provided that the following conditions | |
8 | * are met: | |
9 | * 1. Redistributions of source code must retain the above copyright | |
10 | * notice, this list of conditions and the following disclaimer. | |
11 | * 2. Redistributions in binary form must reproduce the above copyright | |
12 | * notice, this list of conditions and the following disclaimer in the | |
13 | * documentation and/or other materials provided with the distribution. | |
14 | * 3. Neither the name of IBM nor the names of its contributors | |
15 | * may be used to endorse or promote products derived from this software | |
16 | * without specific prior written permission. | |
17 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND | |
18 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
19 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | |
20 | * ARE DISCLAIMED. IN NO EVENT SHALL IBM OR CONTRIBUTORS BE LIABLE | |
21 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | |
22 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | |
23 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | |
24 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | |
25 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | |
26 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |
27 | * SUCH DAMAGE. */ | |
982f8184 | 28 | #include <linux/types.h> |
e95646c3 | 29 | #include <linux/virtio_ids.h> |
e467cde2 | 30 | #include <linux/virtio_config.h> |
19c1c5a6 | 31 | #include <linux/virtio_types.h> |
e467cde2 | 32 | |
e467cde2 | 33 | /* Feature bits */ |
a586d4f6 RR |
34 | #define VIRTIO_BLK_F_SIZE_MAX 1 /* Indicates maximum segment size */ |
35 | #define VIRTIO_BLK_F_SEG_MAX 2 /* Indicates maximum # of segments */ | |
48e4043d | 36 | #define VIRTIO_BLK_F_GEOMETRY 4 /* Legacy geometry available */ |
3ef53609 | 37 | #define VIRTIO_BLK_F_RO 5 /* Disk is read-only */ |
066f4d82 | 38 | #define VIRTIO_BLK_F_BLK_SIZE 6 /* Block size of disk is available*/ |
69740c8b | 39 | #define VIRTIO_BLK_F_TOPOLOGY 10 /* Topology information is available */ |
cb553215 | 40 | #define VIRTIO_BLK_F_MQ 12 /* support more than one vq */ |
1f23816b CL |
41 | #define VIRTIO_BLK_F_DISCARD 13 /* DISCARD is supported */ |
42 | #define VIRTIO_BLK_F_WRITE_ZEROES 14 /* WRITE ZEROES is supported */ | |
e60d6407 | 43 | #define VIRTIO_BLK_F_SECURE_ERASE 16 /* Secure Erase is supported */ |
95bfec41 | 44 | #define VIRTIO_BLK_F_ZONED 17 /* Zoned block device */ |
1d589bb1 | 45 | |
527100a4 RR |
46 | /* Legacy feature bits */ |
47 | #ifndef VIRTIO_BLK_NO_LEGACY | |
48 | #define VIRTIO_BLK_F_BARRIER 0 /* Does host support barriers? */ | |
49 | #define VIRTIO_BLK_F_SCSI 7 /* Supports scsi command passthru */ | |
592002f5 | 50 | #define VIRTIO_BLK_F_FLUSH 9 /* Flush command supported */ |
527100a4 | 51 | #define VIRTIO_BLK_F_CONFIG_WCE 11 /* Writeback mode available in config */ |
6a743897 | 52 | #ifndef __KERNEL__ |
592002f5 MT |
53 | /* Old (deprecated) name for VIRTIO_BLK_F_FLUSH. */ |
54 | #define VIRTIO_BLK_F_WCE VIRTIO_BLK_F_FLUSH | |
6a743897 | 55 | #endif |
527100a4 | 56 | #endif /* !VIRTIO_BLK_NO_LEGACY */ |
6a743897 | 57 | |
4cb2ea28 | 58 | #define VIRTIO_BLK_ID_BYTES 20 /* ID string length */ |
59 | ||
1842f23c | 60 | struct virtio_blk_config { |
a586d4f6 | 61 | /* The capacity (in 512-byte sectors). */ |
40e04c48 | 62 | __virtio64 capacity; |
a586d4f6 | 63 | /* The maximum segment size (if VIRTIO_BLK_F_SIZE_MAX) */ |
40e04c48 | 64 | __virtio32 size_max; |
a586d4f6 | 65 | /* The maximum number of segments (if VIRTIO_BLK_F_SEG_MAX) */ |
40e04c48 | 66 | __virtio32 seg_max; |
7e41a9de | 67 | /* geometry of the device (if VIRTIO_BLK_F_GEOMETRY) */ |
48e4043d | 68 | struct virtio_blk_geometry { |
40e04c48 | 69 | __virtio16 cylinders; |
48e4043d RH |
70 | __u8 heads; |
71 | __u8 sectors; | |
72 | } geometry; | |
69740c8b | 73 | |
066f4d82 | 74 | /* block size of device (if VIRTIO_BLK_F_BLK_SIZE) */ |
40e04c48 | 75 | __virtio32 blk_size; |
69740c8b CH |
76 | |
77 | /* the next 4 entries are guarded by VIRTIO_BLK_F_TOPOLOGY */ | |
78 | /* exponent for physical block per logical block. */ | |
79 | __u8 physical_block_exp; | |
80 | /* alignment offset in logical blocks. */ | |
81 | __u8 alignment_offset; | |
82 | /* minimum I/O size without performance penalty in logical blocks. */ | |
40e04c48 | 83 | __virtio16 min_io_size; |
69740c8b | 84 | /* optimal sustained I/O size in logical blocks. */ |
40e04c48 | 85 | __virtio32 opt_io_size; |
69740c8b | 86 | |
cd5d5038 PB |
87 | /* writeback mode (if VIRTIO_BLK_F_CONFIG_WCE) */ |
88 | __u8 wce; | |
cb553215 ML |
89 | __u8 unused; |
90 | ||
91 | /* number of vqs, only available when VIRTIO_BLK_F_MQ is set */ | |
40e04c48 | 92 | __virtio16 num_queues; |
1f23816b CL |
93 | |
94 | /* the next 3 entries are guarded by VIRTIO_BLK_F_DISCARD */ | |
95 | /* | |
96 | * The maximum discard sectors (in 512-byte sectors) for | |
97 | * one segment. | |
98 | */ | |
40e04c48 | 99 | __virtio32 max_discard_sectors; |
1f23816b CL |
100 | /* |
101 | * The maximum number of discard segments in a | |
102 | * discard command. | |
103 | */ | |
40e04c48 | 104 | __virtio32 max_discard_seg; |
1f23816b | 105 | /* Discard commands must be aligned to this number of sectors. */ |
40e04c48 | 106 | __virtio32 discard_sector_alignment; |
1f23816b CL |
107 | |
108 | /* the next 3 entries are guarded by VIRTIO_BLK_F_WRITE_ZEROES */ | |
109 | /* | |
110 | * The maximum number of write zeroes sectors (in 512-byte sectors) in | |
111 | * one segment. | |
112 | */ | |
40e04c48 | 113 | __virtio32 max_write_zeroes_sectors; |
1f23816b CL |
114 | /* |
115 | * The maximum number of segments in a write zeroes | |
116 | * command. | |
117 | */ | |
40e04c48 | 118 | __virtio32 max_write_zeroes_seg; |
1f23816b CL |
119 | /* |
120 | * Set if a VIRTIO_BLK_T_WRITE_ZEROES request may result in the | |
121 | * deallocation of one or more of the sectors. | |
122 | */ | |
123 | __u8 write_zeroes_may_unmap; | |
124 | ||
125 | __u8 unused1[3]; | |
e60d6407 AK |
126 | |
127 | /* the next 3 entries are guarded by VIRTIO_BLK_F_SECURE_ERASE */ | |
128 | /* | |
129 | * The maximum secure erase sectors (in 512-byte sectors) for | |
130 | * one segment. | |
131 | */ | |
132 | __virtio32 max_secure_erase_sectors; | |
133 | /* | |
134 | * The maximum number of secure erase segments in a | |
135 | * secure erase command. | |
136 | */ | |
137 | __virtio32 max_secure_erase_seg; | |
138 | /* Secure erase commands must be aligned to this number of sectors. */ | |
139 | __virtio32 secure_erase_sector_alignment; | |
140 | ||
95bfec41 DF |
141 | /* Zoned block device characteristics (if VIRTIO_BLK_F_ZONED) */ |
142 | struct virtio_blk_zoned_characteristics { | |
f1ba4e67 DF |
143 | __virtio32 zone_sectors; |
144 | __virtio32 max_open_zones; | |
145 | __virtio32 max_active_zones; | |
146 | __virtio32 max_append_sectors; | |
147 | __virtio32 write_granularity; | |
95bfec41 DF |
148 | __u8 model; |
149 | __u8 unused2[3]; | |
150 | } zoned; | |
a586d4f6 | 151 | } __attribute__((packed)); |
e467cde2 | 152 | |
f1b0ef06 CH |
153 | /* |
154 | * Command types | |
155 | * | |
156 | * Usage is a bit tricky as some bits are used as flags and some are not. | |
157 | * | |
158 | * Rules: | |
159 | * VIRTIO_BLK_T_OUT may be combined with VIRTIO_BLK_T_SCSI_CMD or | |
160 | * VIRTIO_BLK_T_BARRIER. VIRTIO_BLK_T_FLUSH is a command of its own | |
161 | * and may not be combined with any of the other flags. | |
162 | */ | |
163 | ||
e467cde2 RR |
164 | /* These two define direction. */ |
165 | #define VIRTIO_BLK_T_IN 0 | |
166 | #define VIRTIO_BLK_T_OUT 1 | |
167 | ||
527100a4 | 168 | #ifndef VIRTIO_BLK_NO_LEGACY |
e467cde2 RR |
169 | /* This bit says it's a scsi command, not an actual read or write. */ |
170 | #define VIRTIO_BLK_T_SCSI_CMD 2 | |
527100a4 | 171 | #endif /* VIRTIO_BLK_NO_LEGACY */ |
e467cde2 | 172 | |
f1b0ef06 CH |
173 | /* Cache flush command */ |
174 | #define VIRTIO_BLK_T_FLUSH 4 | |
175 | ||
4cb2ea28 | 176 | /* Get device ID command */ |
177 | #define VIRTIO_BLK_T_GET_ID 8 | |
178 | ||
1f23816b CL |
179 | /* Discard command */ |
180 | #define VIRTIO_BLK_T_DISCARD 11 | |
181 | ||
182 | /* Write zeroes command */ | |
183 | #define VIRTIO_BLK_T_WRITE_ZEROES 13 | |
184 | ||
e60d6407 AK |
185 | /* Secure erase command */ |
186 | #define VIRTIO_BLK_T_SECURE_ERASE 14 | |
187 | ||
95bfec41 DF |
188 | /* Zone append command */ |
189 | #define VIRTIO_BLK_T_ZONE_APPEND 15 | |
190 | ||
191 | /* Report zones command */ | |
192 | #define VIRTIO_BLK_T_ZONE_REPORT 16 | |
193 | ||
194 | /* Open zone command */ | |
195 | #define VIRTIO_BLK_T_ZONE_OPEN 18 | |
196 | ||
197 | /* Close zone command */ | |
198 | #define VIRTIO_BLK_T_ZONE_CLOSE 20 | |
199 | ||
200 | /* Finish zone command */ | |
201 | #define VIRTIO_BLK_T_ZONE_FINISH 22 | |
202 | ||
203 | /* Reset zone command */ | |
204 | #define VIRTIO_BLK_T_ZONE_RESET 24 | |
205 | ||
206 | /* Reset All zones command */ | |
207 | #define VIRTIO_BLK_T_ZONE_RESET_ALL 26 | |
208 | ||
527100a4 | 209 | #ifndef VIRTIO_BLK_NO_LEGACY |
e467cde2 RR |
210 | /* Barrier before this op. */ |
211 | #define VIRTIO_BLK_T_BARRIER 0x80000000 | |
527100a4 | 212 | #endif /* !VIRTIO_BLK_NO_LEGACY */ |
e467cde2 | 213 | |
0fa2a564 MT |
214 | /* |
215 | * This comes first in the read scatter-gather list. | |
216 | * For legacy virtio, if VIRTIO_F_ANY_LAYOUT is not negotiated, | |
217 | * this is the first element of the read scatter-gather list. | |
218 | */ | |
1842f23c | 219 | struct virtio_blk_outhdr { |
e467cde2 | 220 | /* VIRTIO_BLK_T* */ |
19c1c5a6 | 221 | __virtio32 type; |
e467cde2 | 222 | /* io priority. */ |
19c1c5a6 | 223 | __virtio32 ioprio; |
e467cde2 | 224 | /* Sector (ie. 512 byte offset) */ |
19c1c5a6 | 225 | __virtio64 sector; |
e467cde2 RR |
226 | }; |
227 | ||
95bfec41 DF |
228 | /* |
229 | * Supported zoned device models. | |
230 | */ | |
231 | ||
232 | /* Regular block device */ | |
233 | #define VIRTIO_BLK_Z_NONE 0 | |
234 | /* Host-managed zoned device */ | |
235 | #define VIRTIO_BLK_Z_HM 1 | |
236 | /* Host-aware zoned device */ | |
237 | #define VIRTIO_BLK_Z_HA 2 | |
238 | ||
239 | /* | |
240 | * Zone descriptor. A part of VIRTIO_BLK_T_ZONE_REPORT command reply. | |
241 | */ | |
242 | struct virtio_blk_zone_descriptor { | |
243 | /* Zone capacity */ | |
f1ba4e67 | 244 | __virtio64 z_cap; |
95bfec41 | 245 | /* The starting sector of the zone */ |
f1ba4e67 | 246 | __virtio64 z_start; |
95bfec41 | 247 | /* Zone write pointer position in sectors */ |
f1ba4e67 | 248 | __virtio64 z_wp; |
95bfec41 DF |
249 | /* Zone type */ |
250 | __u8 z_type; | |
251 | /* Zone state */ | |
252 | __u8 z_state; | |
253 | __u8 reserved[38]; | |
254 | }; | |
255 | ||
256 | struct virtio_blk_zone_report { | |
f1ba4e67 | 257 | __virtio64 nr_zones; |
95bfec41 DF |
258 | __u8 reserved[56]; |
259 | struct virtio_blk_zone_descriptor zones[]; | |
260 | }; | |
261 | ||
262 | /* | |
263 | * Supported zone types. | |
264 | */ | |
265 | ||
266 | /* Conventional zone */ | |
267 | #define VIRTIO_BLK_ZT_CONV 1 | |
268 | /* Sequential Write Required zone */ | |
269 | #define VIRTIO_BLK_ZT_SWR 2 | |
270 | /* Sequential Write Preferred zone */ | |
271 | #define VIRTIO_BLK_ZT_SWP 3 | |
272 | ||
273 | /* | |
274 | * Zone states that are available for zones of all types. | |
275 | */ | |
276 | ||
277 | /* Not a write pointer (conventional zones only) */ | |
278 | #define VIRTIO_BLK_ZS_NOT_WP 0 | |
279 | /* Empty */ | |
280 | #define VIRTIO_BLK_ZS_EMPTY 1 | |
281 | /* Implicitly Open */ | |
282 | #define VIRTIO_BLK_ZS_IOPEN 2 | |
283 | /* Explicitly Open */ | |
284 | #define VIRTIO_BLK_ZS_EOPEN 3 | |
285 | /* Closed */ | |
286 | #define VIRTIO_BLK_ZS_CLOSED 4 | |
287 | /* Read-Only */ | |
288 | #define VIRTIO_BLK_ZS_RDONLY 13 | |
289 | /* Full */ | |
290 | #define VIRTIO_BLK_ZS_FULL 14 | |
291 | /* Offline */ | |
292 | #define VIRTIO_BLK_ZS_OFFLINE 15 | |
293 | ||
1f23816b CL |
294 | /* Unmap this range (only valid for write zeroes command) */ |
295 | #define VIRTIO_BLK_WRITE_ZEROES_FLAG_UNMAP 0x00000001 | |
296 | ||
297 | /* Discard/write zeroes range for each request. */ | |
298 | struct virtio_blk_discard_write_zeroes { | |
299 | /* discard/write zeroes start sector */ | |
300 | __le64 sector; | |
301 | /* number of discard/write zeroes sectors */ | |
302 | __le32 num_sectors; | |
303 | /* flags for this range */ | |
304 | __le32 flags; | |
305 | }; | |
306 | ||
527100a4 | 307 | #ifndef VIRTIO_BLK_NO_LEGACY |
1cde26f9 | 308 | struct virtio_scsi_inhdr { |
19c1c5a6 MT |
309 | __virtio32 errors; |
310 | __virtio32 data_len; | |
311 | __virtio32 sense_len; | |
312 | __virtio32 residual; | |
1cde26f9 | 313 | }; |
527100a4 | 314 | #endif /* !VIRTIO_BLK_NO_LEGACY */ |
1cde26f9 | 315 | |
cb38fa23 | 316 | /* And this is the final byte of the write scatter-gather list. */ |
e467cde2 RR |
317 | #define VIRTIO_BLK_S_OK 0 |
318 | #define VIRTIO_BLK_S_IOERR 1 | |
319 | #define VIRTIO_BLK_S_UNSUPP 2 | |
95bfec41 DF |
320 | |
321 | /* Error codes that are specific to zoned block devices */ | |
322 | #define VIRTIO_BLK_S_ZONE_INVALID_CMD 3 | |
323 | #define VIRTIO_BLK_S_ZONE_UNALIGNED_WP 4 | |
324 | #define VIRTIO_BLK_S_ZONE_OPEN_RESOURCE 5 | |
325 | #define VIRTIO_BLK_S_ZONE_ACTIVE_RESOURCE 6 | |
326 | ||
e467cde2 | 327 | #endif /* _LINUX_VIRTIO_BLK_H */ |