1/* 2 * Virtio Block Device 3 * 4 * Copyright IBM, Corp. 2007 5 * 6 * Authors: 7 * Anthony Liguori <aliguori@us.ibm.com> 8 * 9 * This work is licensed under the terms of the GNU GPL, version 2. See 10 * the COPYING file in the top-level directory. 11 * 12 */ 13 14#ifndef _QEMU_VIRTIO_BLK_H 15#define _QEMU_VIRTIO_BLK_H 16 17#include "virtio.h" 18#include "block.h" 19 20/* from Linux's linux/virtio_blk.h */ 21 22/* The ID for virtio_block */ 23#define VIRTIO_ID_BLOCK 2 24 25/* Feature bits */ 26#define VIRTIO_BLK_F_BARRIER 0 /* Does host support barriers? */ 27#define VIRTIO_BLK_F_SIZE_MAX 1 /* Indicates maximum segment size */ 28#define VIRTIO_BLK_F_SEG_MAX 2 /* Indicates maximum # of segments */ 29#define VIRTIO_BLK_F_GEOMETRY 4 /* Indicates support of legacy geometry */ 30#define VIRTIO_BLK_F_RO 5 /* Disk is read-only */ 31#define VIRTIO_BLK_F_BLK_SIZE 6 /* Block size of disk is available*/ 32#define VIRTIO_BLK_F_SCSI 7 /* Supports scsi command passthru */ 33/* #define VIRTIO_BLK_F_IDENTIFY 8 ATA IDENTIFY supported, DEPRECATED */ 34#define VIRTIO_BLK_F_WCACHE 9 /* write cache enabled */ 35#define VIRTIO_BLK_F_TOPOLOGY 10 /* Topology information is available */ 36 37struct virtio_blk_config 38{ 39 uint64_t capacity; 40 uint32_t size_max; 41 uint32_t seg_max; 42 uint16_t cylinders; 43 uint8_t heads; 44 uint8_t sectors; 45 uint32_t blk_size; 46 uint8_t physical_block_exp; 47 uint8_t alignment_offset; 48 uint16_t min_io_size; 49 uint32_t opt_io_size; 50} __attribute__((packed)); 51 52/* These two define direction. */ 53#define VIRTIO_BLK_T_IN 0 54#define VIRTIO_BLK_T_OUT 1 55 56/* This bit says it's a scsi command, not an actual read or write. */ 57#define VIRTIO_BLK_T_SCSI_CMD 2 58 59/* Flush the volatile write cache */ 60#define VIRTIO_BLK_T_FLUSH 4 61 62/* return the device ID string */ 63#define VIRTIO_BLK_T_GET_ID 8 64 65/* Barrier before this op. */ 66#define VIRTIO_BLK_T_BARRIER 0x80000000 67 68/* This is the first element of the read scatter-gather list. */ 69struct virtio_blk_outhdr 70{ 71 /* VIRTIO_BLK_T* */ 72 uint32_t type; 73 /* io priority. */ 74 uint32_t ioprio; 75 /* Sector (ie. 512 byte offset) */ 76 uint64_t sector; 77}; 78 79#define VIRTIO_BLK_S_OK 0 80#define VIRTIO_BLK_S_IOERR 1 81#define VIRTIO_BLK_S_UNSUPP 2 82 83/* This is the last element of the write scatter-gather list */ 84struct virtio_blk_inhdr 85{ 86 unsigned char status; 87}; 88 89/* SCSI pass-through header */ 90struct virtio_scsi_inhdr 91{ 92 uint32_t errors; 93 uint32_t data_len; 94 uint32_t sense_len; 95 uint32_t residual; 96}; 97 98#ifdef __linux__ 99#define DEFINE_VIRTIO_BLK_FEATURES(_state, _field) \ 100 DEFINE_VIRTIO_COMMON_FEATURES(_state, _field), \ 101 DEFINE_PROP_BIT("scsi", _state, _field, VIRTIO_BLK_F_SCSI, true) 102#else 103#define DEFINE_VIRTIO_BLK_FEATURES(_state, _field) \ 104 DEFINE_VIRTIO_COMMON_FEATURES(_state, _field) 105#endif 106#endif 107