328 lines · c
1#ifndef _LINUX_VIRTIO_BLK_H2#define _LINUX_VIRTIO_BLK_H3/* This header is BSD licensed so anyone can use the definitions to implement4 * compatible drivers/servers.5 *6 * Redistribution and use in source and binary forms, with or without7 * modification, are permitted provided that the following conditions8 * are met:9 * 1. Redistributions of source code must retain the above copyright10 * notice, this list of conditions and the following disclaimer.11 * 2. Redistributions in binary form must reproduce the above copyright12 * notice, this list of conditions and the following disclaimer in the13 * documentation and/or other materials provided with the distribution.14 * 3. Neither the name of IBM nor the names of its contributors15 * may be used to endorse or promote products derived from this software16 * without specific prior written permission.17 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE20 * ARE DISCLAIMED. IN NO EVENT SHALL IBM OR CONTRIBUTORS BE LIABLE21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF27 * 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_LEGACY48#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_FLUSH55#endif56#endif /* !VIRTIO_BLK_NO_LEGACY */57 58#define VIRTIO_BLK_ID_BYTES 20 /* ID string length */59 60struct 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) for97 * one segment.98 */99 __virtio32 max_discard_sectors;100 /*101 * The maximum number of discard segments in a102 * 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) in111 * one segment.112 */113 __virtio32 max_write_zeroes_sectors;114 /*115 * The maximum number of segments in a write zeroes116 * command.117 */118 __virtio32 max_write_zeroes_seg;119 /*120 * Set if a VIRTIO_BLK_T_WRITE_ZEROES request may result in the121 * 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) for130 * one segment.131 */132 __virtio32 max_secure_erase_sectors;133 /*134 * The maximum number of secure erase segments in a135 * 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 types155 *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 or160 * VIRTIO_BLK_T_BARRIER. VIRTIO_BLK_T_FLUSH is a command of its own161 * and may not be combined with any of the other flags.162 */163 164/* These two define direction. */165#define VIRTIO_BLK_T_IN 0166#define VIRTIO_BLK_T_OUT 1167 168#ifndef VIRTIO_BLK_NO_LEGACY169/* This bit says it's a scsi command, not an actual read or write. */170#define VIRTIO_BLK_T_SCSI_CMD 2171#endif /* VIRTIO_BLK_NO_LEGACY */172 173/* Cache flush command */174#define VIRTIO_BLK_T_FLUSH 4175 176/* Get device ID command */177#define VIRTIO_BLK_T_GET_ID 8178 179/* Discard command */180#define VIRTIO_BLK_T_DISCARD 11181 182/* Write zeroes command */183#define VIRTIO_BLK_T_WRITE_ZEROES 13184 185/* Secure erase command */186#define VIRTIO_BLK_T_SECURE_ERASE 14187 188/* Zone append command */189#define VIRTIO_BLK_T_ZONE_APPEND 15190 191/* Report zones command */192#define VIRTIO_BLK_T_ZONE_REPORT 16193 194/* Open zone command */195#define VIRTIO_BLK_T_ZONE_OPEN 18196 197/* Close zone command */198#define VIRTIO_BLK_T_ZONE_CLOSE 20199 200/* Finish zone command */201#define VIRTIO_BLK_T_ZONE_FINISH 22202 203/* Reset zone command */204#define VIRTIO_BLK_T_ZONE_RESET 24205 206/* Reset All zones command */207#define VIRTIO_BLK_T_ZONE_RESET_ALL 26208 209#ifndef VIRTIO_BLK_NO_LEGACY210/* Barrier before this op. */211#define VIRTIO_BLK_T_BARRIER 0x80000000212#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 */219struct 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 0234/* Host-managed zoned device */235#define VIRTIO_BLK_Z_HM 1236/* Host-aware zoned device */237#define VIRTIO_BLK_Z_HA 2238 239/*240 * Zone descriptor. A part of VIRTIO_BLK_T_ZONE_REPORT command reply.241 */242struct 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 256struct 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 1268/* Sequential Write Required zone */269#define VIRTIO_BLK_ZT_SWR 2270/* Sequential Write Preferred zone */271#define VIRTIO_BLK_ZT_SWP 3272 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 0279/* Empty */280#define VIRTIO_BLK_ZS_EMPTY 1281/* Implicitly Open */282#define VIRTIO_BLK_ZS_IOPEN 2283/* Explicitly Open */284#define VIRTIO_BLK_ZS_EOPEN 3285/* Closed */286#define VIRTIO_BLK_ZS_CLOSED 4287/* Read-Only */288#define VIRTIO_BLK_ZS_RDONLY 13289/* Full */290#define VIRTIO_BLK_ZS_FULL 14291/* Offline */292#define VIRTIO_BLK_ZS_OFFLINE 15293 294/* Unmap this range (only valid for write zeroes command) */295#define VIRTIO_BLK_WRITE_ZEROES_FLAG_UNMAP 0x00000001296 297/* Discard/write zeroes range for each request. */298struct 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_LEGACY308struct 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 0318#define VIRTIO_BLK_S_IOERR 1319#define VIRTIO_BLK_S_UNSUPP 2320 321/* Error codes that are specific to zoned block devices */322#define VIRTIO_BLK_S_ZONE_INVALID_CMD 3323#define VIRTIO_BLK_S_ZONE_UNALIGNED_WP 4324#define VIRTIO_BLK_S_ZONE_OPEN_RESOURCE 5325#define VIRTIO_BLK_S_ZONE_ACTIVE_RESOURCE 6326 327#endif /* _LINUX_VIRTIO_BLK_H */328