zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

virtio_blk.h (9978B) - Raw


      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 /* Old (deprecated) name for VIRTIO_BLK_F_FLUSH. */
     53 #define VIRTIO_BLK_F_WCE VIRTIO_BLK_F_FLUSH
     54 #endif /* !VIRTIO_BLK_NO_LEGACY */
     55 
     56 #define VIRTIO_BLK_ID_BYTES	20	/* ID string length */
     57 
     58 struct virtio_blk_config {
     59 	/* The capacity (in 512-byte sectors). */
     60 	__virtio64 capacity;
     61 	/* The maximum segment size (if VIRTIO_BLK_F_SIZE_MAX) */
     62 	__virtio32 size_max;
     63 	/* The maximum number of segments (if VIRTIO_BLK_F_SEG_MAX) */
     64 	__virtio32 seg_max;
     65 	/* geometry of the device (if VIRTIO_BLK_F_GEOMETRY) */
     66 	struct virtio_blk_geometry {
     67 		__virtio16 cylinders;
     68 		__u8 heads;
     69 		__u8 sectors;
     70 	} geometry;
     71 
     72 	/* block size of device (if VIRTIO_BLK_F_BLK_SIZE) */
     73 	__virtio32 blk_size;
     74 
     75 	/* the next 4 entries are guarded by VIRTIO_BLK_F_TOPOLOGY  */
     76 	/* exponent for physical block per logical block. */
     77 	__u8 physical_block_exp;
     78 	/* alignment offset in logical blocks. */
     79 	__u8 alignment_offset;
     80 	/* minimum I/O size without performance penalty in logical blocks. */
     81 	__virtio16 min_io_size;
     82 	/* optimal sustained I/O size in logical blocks. */
     83 	__virtio32 opt_io_size;
     84 
     85 	/* writeback mode (if VIRTIO_BLK_F_CONFIG_WCE) */
     86 	__u8 wce;
     87 	__u8 unused;
     88 
     89 	/* number of vqs, only available when VIRTIO_BLK_F_MQ is set */
     90 	__virtio16 num_queues;
     91 
     92 	/* the next 3 entries are guarded by VIRTIO_BLK_F_DISCARD */
     93 	/*
     94 	 * The maximum discard sectors (in 512-byte sectors) for
     95 	 * one segment.
     96 	 */
     97 	__virtio32 max_discard_sectors;
     98 	/*
     99 	 * The maximum number of discard segments in a
    100 	 * discard command.
    101 	 */
    102 	__virtio32 max_discard_seg;
    103 	/* Discard commands must be aligned to this number of sectors. */
    104 	__virtio32 discard_sector_alignment;
    105 
    106 	/* the next 3 entries are guarded by VIRTIO_BLK_F_WRITE_ZEROES */
    107 	/*
    108 	 * The maximum number of write zeroes sectors (in 512-byte sectors) in
    109 	 * one segment.
    110 	 */
    111 	__virtio32 max_write_zeroes_sectors;
    112 	/*
    113 	 * The maximum number of segments in a write zeroes
    114 	 * command.
    115 	 */
    116 	__virtio32 max_write_zeroes_seg;
    117 	/*
    118 	 * Set if a VIRTIO_BLK_T_WRITE_ZEROES request may result in the
    119 	 * deallocation of one or more of the sectors.
    120 	 */
    121 	__u8 write_zeroes_may_unmap;
    122 
    123 	__u8 unused1[3];
    124 
    125 	/* the next 3 entries are guarded by VIRTIO_BLK_F_SECURE_ERASE */
    126 	/*
    127 	 * The maximum secure erase sectors (in 512-byte sectors) for
    128 	 * one segment.
    129 	 */
    130 	__virtio32 max_secure_erase_sectors;
    131 	/*
    132 	 * The maximum number of secure erase segments in a
    133 	 * secure erase command.
    134 	 */
    135 	__virtio32 max_secure_erase_seg;
    136 	/* Secure erase commands must be aligned to this number of sectors. */
    137 	__virtio32 secure_erase_sector_alignment;
    138 
    139 	/* Zoned block device characteristics (if VIRTIO_BLK_F_ZONED) */
    140 	struct virtio_blk_zoned_characteristics {
    141 		__virtio32 zone_sectors;
    142 		__virtio32 max_open_zones;
    143 		__virtio32 max_active_zones;
    144 		__virtio32 max_append_sectors;
    145 		__virtio32 write_granularity;
    146 		__u8 model;
    147 		__u8 unused2[3];
    148 	} zoned;
    149 } __attribute__((packed));
    150 
    151 /*
    152  * Command types
    153  *
    154  * Usage is a bit tricky as some bits are used as flags and some are not.
    155  *
    156  * Rules:
    157  *   VIRTIO_BLK_T_OUT may be combined with VIRTIO_BLK_T_SCSI_CMD or
    158  *   VIRTIO_BLK_T_BARRIER.  VIRTIO_BLK_T_FLUSH is a command of its own
    159  *   and may not be combined with any of the other flags.
    160  */
    161 
    162 /* These two define direction. */
    163 #define VIRTIO_BLK_T_IN		0
    164 #define VIRTIO_BLK_T_OUT	1
    165 
    166 #ifndef VIRTIO_BLK_NO_LEGACY
    167 /* This bit says it's a scsi command, not an actual read or write. */
    168 #define VIRTIO_BLK_T_SCSI_CMD	2
    169 #endif /* VIRTIO_BLK_NO_LEGACY */
    170 
    171 /* Cache flush command */
    172 #define VIRTIO_BLK_T_FLUSH	4
    173 
    174 /* Get device ID command */
    175 #define VIRTIO_BLK_T_GET_ID    8
    176 
    177 /* Discard command */
    178 #define VIRTIO_BLK_T_DISCARD	11
    179 
    180 /* Write zeroes command */
    181 #define VIRTIO_BLK_T_WRITE_ZEROES	13
    182 
    183 /* Secure erase command */
    184 #define VIRTIO_BLK_T_SECURE_ERASE	14
    185 
    186 /* Zone append command */
    187 #define VIRTIO_BLK_T_ZONE_APPEND    15
    188 
    189 /* Report zones command */
    190 #define VIRTIO_BLK_T_ZONE_REPORT    16
    191 
    192 /* Open zone command */
    193 #define VIRTIO_BLK_T_ZONE_OPEN      18
    194 
    195 /* Close zone command */
    196 #define VIRTIO_BLK_T_ZONE_CLOSE     20
    197 
    198 /* Finish zone command */
    199 #define VIRTIO_BLK_T_ZONE_FINISH    22
    200 
    201 /* Reset zone command */
    202 #define VIRTIO_BLK_T_ZONE_RESET     24
    203 
    204 /* Reset All zones command */
    205 #define VIRTIO_BLK_T_ZONE_RESET_ALL 26
    206 
    207 #ifndef VIRTIO_BLK_NO_LEGACY
    208 /* Barrier before this op. */
    209 #define VIRTIO_BLK_T_BARRIER	0x80000000
    210 #endif /* !VIRTIO_BLK_NO_LEGACY */
    211 
    212 /*
    213  * This comes first in the read scatter-gather list.
    214  * For legacy virtio, if VIRTIO_F_ANY_LAYOUT is not negotiated,
    215  * this is the first element of the read scatter-gather list.
    216  */
    217 struct virtio_blk_outhdr {
    218 	/* VIRTIO_BLK_T* */
    219 	__virtio32 type;
    220 	/* io priority. */
    221 	__virtio32 ioprio;
    222 	/* Sector (ie. 512 byte offset) */
    223 	__virtio64 sector;
    224 };
    225 
    226 /*
    227  * Supported zoned device models.
    228  */
    229 
    230 /* Regular block device */
    231 #define VIRTIO_BLK_Z_NONE      0
    232 /* Host-managed zoned device */
    233 #define VIRTIO_BLK_Z_HM        1
    234 /* Host-aware zoned device */
    235 #define VIRTIO_BLK_Z_HA        2
    236 
    237 /*
    238  * Zone descriptor. A part of VIRTIO_BLK_T_ZONE_REPORT command reply.
    239  */
    240 struct virtio_blk_zone_descriptor {
    241 	/* Zone capacity */
    242 	__virtio64 z_cap;
    243 	/* The starting sector of the zone */
    244 	__virtio64 z_start;
    245 	/* Zone write pointer position in sectors */
    246 	__virtio64 z_wp;
    247 	/* Zone type */
    248 	__u8 z_type;
    249 	/* Zone state */
    250 	__u8 z_state;
    251 	__u8 reserved[38];
    252 };
    253 
    254 struct virtio_blk_zone_report {
    255 	__virtio64 nr_zones;
    256 	__u8 reserved[56];
    257 	struct virtio_blk_zone_descriptor zones[];
    258 };
    259 
    260 /*
    261  * Supported zone types.
    262  */
    263 
    264 /* Conventional zone */
    265 #define VIRTIO_BLK_ZT_CONV         1
    266 /* Sequential Write Required zone */
    267 #define VIRTIO_BLK_ZT_SWR          2
    268 /* Sequential Write Preferred zone */
    269 #define VIRTIO_BLK_ZT_SWP          3
    270 
    271 /*
    272  * Zone states that are available for zones of all types.
    273  */
    274 
    275 /* Not a write pointer (conventional zones only) */
    276 #define VIRTIO_BLK_ZS_NOT_WP       0
    277 /* Empty */
    278 #define VIRTIO_BLK_ZS_EMPTY        1
    279 /* Implicitly Open */
    280 #define VIRTIO_BLK_ZS_IOPEN        2
    281 /* Explicitly Open */
    282 #define VIRTIO_BLK_ZS_EOPEN        3
    283 /* Closed */
    284 #define VIRTIO_BLK_ZS_CLOSED       4
    285 /* Read-Only */
    286 #define VIRTIO_BLK_ZS_RDONLY       13
    287 /* Full */
    288 #define VIRTIO_BLK_ZS_FULL         14
    289 /* Offline */
    290 #define VIRTIO_BLK_ZS_OFFLINE      15
    291 
    292 /* Unmap this range (only valid for write zeroes command) */
    293 #define VIRTIO_BLK_WRITE_ZEROES_FLAG_UNMAP	0x00000001
    294 
    295 /* Discard/write zeroes range for each request. */
    296 struct virtio_blk_discard_write_zeroes {
    297 	/* discard/write zeroes start sector */
    298 	__le64 sector;
    299 	/* number of discard/write zeroes sectors */
    300 	__le32 num_sectors;
    301 	/* flags for this range */
    302 	__le32 flags;
    303 };
    304 
    305 #ifndef VIRTIO_BLK_NO_LEGACY
    306 struct virtio_scsi_inhdr {
    307 	__virtio32 errors;
    308 	__virtio32 data_len;
    309 	__virtio32 sense_len;
    310 	__virtio32 residual;
    311 };
    312 #endif /* !VIRTIO_BLK_NO_LEGACY */
    313 
    314 /* And this is the final byte of the write scatter-gather list. */
    315 #define VIRTIO_BLK_S_OK		0
    316 #define VIRTIO_BLK_S_IOERR	1
    317 #define VIRTIO_BLK_S_UNSUPP	2
    318 
    319 /* Error codes that are specific to zoned block devices */
    320 #define VIRTIO_BLK_S_ZONE_INVALID_CMD     3
    321 #define VIRTIO_BLK_S_ZONE_UNALIGNED_WP    4
    322 #define VIRTIO_BLK_S_ZONE_OPEN_RESOURCE   5
    323 #define VIRTIO_BLK_S_ZONE_ACTIVE_RESOURCE 6
    324 
    325 #endif /* _LINUX_VIRTIO_BLK_H */