linux-headers (unknown)

(root)/
include/
linux/
virtio_blk.h
       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 */