1 | #ifndef _LINUX_VIRTIO_BLK_H |
2 | #define _LINUX_VIRTIO_BLK_H |
3 | /* This header is BSD licensed so anyone can use the definitions to implement |
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. */ |
28 | #include <linux/types.h> |
29 | #include <linux/virtio_ids.h> |
30 | #include <linux/virtio_config.h> |
31 | #include <linux/virtio_types.h> |
32 | |
33 | /* Feature bits */ |
34 | #define VIRTIO_BLK_F_SIZE_MAX 1 /* Indicates maximum segment size */ |
35 | #define VIRTIO_BLK_F_SEG_MAX 2 /* Indicates maximum # of segments */ |
36 | #define VIRTIO_BLK_F_GEOMETRY 4 /* Legacy geometry available */ |
37 | #define VIRTIO_BLK_F_RO 5 /* Disk is read-only */ |
38 | #define VIRTIO_BLK_F_BLK_SIZE 6 /* Block size of disk is available*/ |
39 | #define VIRTIO_BLK_F_TOPOLOGY 10 /* Topology information is available */ |
40 | #define VIRTIO_BLK_F_MQ 12 /* support more than one vq */ |
41 | #define VIRTIO_BLK_F_DISCARD 13 /* DISCARD is supported */ |
42 | #define VIRTIO_BLK_F_WRITE_ZEROES 14 /* WRITE ZEROES is supported */ |
43 | #define VIRTIO_BLK_F_SECURE_ERASE 16 /* Secure Erase is supported */ |
44 | #define VIRTIO_BLK_F_ZONED 17 /* Zoned block device */ |
45 | |
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 */ |
50 | #define VIRTIO_BLK_F_FLUSH 9 /* Flush command supported */ |
51 | #define VIRTIO_BLK_F_CONFIG_WCE 11 /* Writeback mode available in config */ |
52 | #ifndef __KERNEL__ |
53 | /* Old (deprecated) name for VIRTIO_BLK_F_FLUSH. */ |
54 | #define VIRTIO_BLK_F_WCE VIRTIO_BLK_F_FLUSH |
55 | #endif |
56 | #endif /* !VIRTIO_BLK_NO_LEGACY */ |
57 | |
58 | #define VIRTIO_BLK_ID_BYTES 20 /* ID string length */ |
59 | |
60 | struct virtio_blk_config { |
61 | /* The capacity (in 512-byte sectors). */ |
62 | __virtio64 capacity; |
63 | /* The maximum segment size (if VIRTIO_BLK_F_SIZE_MAX) */ |
64 | __virtio32 size_max; |
65 | /* The maximum number of segments (if VIRTIO_BLK_F_SEG_MAX) */ |
66 | __virtio32 seg_max; |
67 | /* geometry of the device (if VIRTIO_BLK_F_GEOMETRY) */ |
68 | struct virtio_blk_geometry { |
69 | __virtio16 cylinders; |
70 | __u8 heads; |
71 | __u8 sectors; |
72 | } geometry; |
73 | |
74 | /* block size of device (if VIRTIO_BLK_F_BLK_SIZE) */ |
75 | __virtio32 blk_size; |
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. */ |
83 | __virtio16 min_io_size; |
84 | /* optimal sustained I/O size in logical blocks. */ |
85 | __virtio32 opt_io_size; |
86 | |
87 | /* writeback mode (if VIRTIO_BLK_F_CONFIG_WCE) */ |
88 | __u8 wce; |
89 | __u8 unused; |
90 | |
91 | /* number of vqs, only available when VIRTIO_BLK_F_MQ is set */ |
92 | __virtio16 num_queues; |
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 | */ |
99 | __virtio32 max_discard_sectors; |
100 | /* |
101 | * The maximum number of discard segments in a |
102 | * discard command. |
103 | */ |
104 | __virtio32 max_discard_seg; |
105 | /* Discard commands must be aligned to this number of sectors. */ |
106 | __virtio32 discard_sector_alignment; |
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 | */ |
113 | __virtio32 max_write_zeroes_sectors; |
114 | /* |
115 | * The maximum number of segments in a write zeroes |
116 | * command. |
117 | */ |
118 | __virtio32 max_write_zeroes_seg; |
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]; |
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 | |
141 | /* Zoned block device characteristics (if VIRTIO_BLK_F_ZONED) */ |
142 | struct virtio_blk_zoned_characteristics { |
143 | __virtio32 zone_sectors; |
144 | __virtio32 max_open_zones; |
145 | __virtio32 max_active_zones; |
146 | __virtio32 max_append_sectors; |
147 | __virtio32 write_granularity; |
148 | __u8 model; |
149 | __u8 unused2[3]; |
150 | } zoned; |
151 | } __attribute__((packed)); |
152 | |
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 | |
164 | /* These two define direction. */ |
165 | #define VIRTIO_BLK_T_IN 0 |
166 | #define VIRTIO_BLK_T_OUT 1 |
167 | |
168 | #ifndef VIRTIO_BLK_NO_LEGACY |
169 | /* This bit says it's a scsi command, not an actual read or write. */ |
170 | #define VIRTIO_BLK_T_SCSI_CMD 2 |
171 | #endif /* VIRTIO_BLK_NO_LEGACY */ |
172 | |
173 | /* Cache flush command */ |
174 | #define VIRTIO_BLK_T_FLUSH 4 |
175 | |
176 | /* Get device ID command */ |
177 | #define VIRTIO_BLK_T_GET_ID 8 |
178 | |
179 | /* Discard command */ |
180 | #define VIRTIO_BLK_T_DISCARD 11 |
181 | |
182 | /* Write zeroes command */ |
183 | #define VIRTIO_BLK_T_WRITE_ZEROES 13 |
184 | |
185 | /* Secure erase command */ |
186 | #define VIRTIO_BLK_T_SECURE_ERASE 14 |
187 | |
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 | |
209 | #ifndef VIRTIO_BLK_NO_LEGACY |
210 | /* Barrier before this op. */ |
211 | #define VIRTIO_BLK_T_BARRIER 0x80000000 |
212 | #endif /* !VIRTIO_BLK_NO_LEGACY */ |
213 | |
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 | */ |
219 | struct virtio_blk_outhdr { |
220 | /* VIRTIO_BLK_T* */ |
221 | __virtio32 type; |
222 | /* io priority. */ |
223 | __virtio32 ioprio; |
224 | /* Sector (ie. 512 byte offset) */ |
225 | __virtio64 sector; |
226 | }; |
227 | |
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 */ |
244 | __virtio64 z_cap; |
245 | /* The starting sector of the zone */ |
246 | __virtio64 z_start; |
247 | /* Zone write pointer position in sectors */ |
248 | __virtio64 z_wp; |
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 { |
257 | __virtio64 nr_zones; |
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 | |
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 | |
307 | #ifndef VIRTIO_BLK_NO_LEGACY |
308 | struct virtio_scsi_inhdr { |
309 | __virtio32 errors; |
310 | __virtio32 data_len; |
311 | __virtio32 sense_len; |
312 | __virtio32 residual; |
313 | }; |
314 | #endif /* !VIRTIO_BLK_NO_LEGACY */ |
315 | |
316 | /* And this is the final byte of the write scatter-gather list. */ |
317 | #define VIRTIO_BLK_S_OK 0 |
318 | #define VIRTIO_BLK_S_IOERR 1 |
319 | #define VIRTIO_BLK_S_UNSUPP 2 |
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 | |
327 | #endif /* _LINUX_VIRTIO_BLK_H */ |
328 | |