brintos

brintos / linux-shallow public Read only

0
0
Text · 9.8 KiB · 3744e4d Raw
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