cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

virtio_blk.h (6888B)


      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
     44/* Legacy feature bits */
     45#ifndef VIRTIO_BLK_NO_LEGACY
     46#define VIRTIO_BLK_F_BARRIER	0	/* Does host support barriers? */
     47#define VIRTIO_BLK_F_SCSI	7	/* Supports scsi command passthru */
     48#define VIRTIO_BLK_F_FLUSH	9	/* Flush command supported */
     49#define VIRTIO_BLK_F_CONFIG_WCE	11	/* Writeback mode available in config */
     50#ifndef __KERNEL__
     51/* Old (deprecated) name for VIRTIO_BLK_F_FLUSH. */
     52#define VIRTIO_BLK_F_WCE VIRTIO_BLK_F_FLUSH
     53#endif
     54#endif /* !VIRTIO_BLK_NO_LEGACY */
     55
     56#define VIRTIO_BLK_ID_BYTES	20	/* ID string length */
     57
     58struct 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} __attribute__((packed));
    125
    126/*
    127 * Command types
    128 *
    129 * Usage is a bit tricky as some bits are used as flags and some are not.
    130 *
    131 * Rules:
    132 *   VIRTIO_BLK_T_OUT may be combined with VIRTIO_BLK_T_SCSI_CMD or
    133 *   VIRTIO_BLK_T_BARRIER.  VIRTIO_BLK_T_FLUSH is a command of its own
    134 *   and may not be combined with any of the other flags.
    135 */
    136
    137/* These two define direction. */
    138#define VIRTIO_BLK_T_IN		0
    139#define VIRTIO_BLK_T_OUT	1
    140
    141#ifndef VIRTIO_BLK_NO_LEGACY
    142/* This bit says it's a scsi command, not an actual read or write. */
    143#define VIRTIO_BLK_T_SCSI_CMD	2
    144#endif /* VIRTIO_BLK_NO_LEGACY */
    145
    146/* Cache flush command */
    147#define VIRTIO_BLK_T_FLUSH	4
    148
    149/* Get device ID command */
    150#define VIRTIO_BLK_T_GET_ID    8
    151
    152/* Discard command */
    153#define VIRTIO_BLK_T_DISCARD	11
    154
    155/* Write zeroes command */
    156#define VIRTIO_BLK_T_WRITE_ZEROES	13
    157
    158#ifndef VIRTIO_BLK_NO_LEGACY
    159/* Barrier before this op. */
    160#define VIRTIO_BLK_T_BARRIER	0x80000000
    161#endif /* !VIRTIO_BLK_NO_LEGACY */
    162
    163/*
    164 * This comes first in the read scatter-gather list.
    165 * For legacy virtio, if VIRTIO_F_ANY_LAYOUT is not negotiated,
    166 * this is the first element of the read scatter-gather list.
    167 */
    168struct virtio_blk_outhdr {
    169	/* VIRTIO_BLK_T* */
    170	__virtio32 type;
    171	/* io priority. */
    172	__virtio32 ioprio;
    173	/* Sector (ie. 512 byte offset) */
    174	__virtio64 sector;
    175};
    176
    177/* Unmap this range (only valid for write zeroes command) */
    178#define VIRTIO_BLK_WRITE_ZEROES_FLAG_UNMAP	0x00000001
    179
    180/* Discard/write zeroes range for each request. */
    181struct virtio_blk_discard_write_zeroes {
    182	/* discard/write zeroes start sector */
    183	__le64 sector;
    184	/* number of discard/write zeroes sectors */
    185	__le32 num_sectors;
    186	/* flags for this range */
    187	__le32 flags;
    188};
    189
    190#ifndef VIRTIO_BLK_NO_LEGACY
    191struct virtio_scsi_inhdr {
    192	__virtio32 errors;
    193	__virtio32 data_len;
    194	__virtio32 sense_len;
    195	__virtio32 residual;
    196};
    197#endif /* !VIRTIO_BLK_NO_LEGACY */
    198
    199/* And this is the final byte of the write scatter-gather list. */
    200#define VIRTIO_BLK_S_OK		0
    201#define VIRTIO_BLK_S_IOERR	1
    202#define VIRTIO_BLK_S_UNSUPP	2
    203#endif /* _LINUX_VIRTIO_BLK_H */