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 "hw/virtio/virtio.h" 18 #include "hw/block/block.h" 19 #include "sysemu/iothread.h" 20 #include "block/block.h" 21 #include "block/accounting.h" 22 23 #define TYPE_VIRTIO_BLK "virtio-blk-device" 24 #define VIRTIO_BLK(obj) \ 25 OBJECT_CHECK(VirtIOBlock, (obj), TYPE_VIRTIO_BLK) 26 27 /* from Linux's linux/virtio_blk.h */ 28 29 /* The ID for virtio_block */ 30 #define VIRTIO_ID_BLOCK 2 31 32 /* Feature bits */ 33 #define VIRTIO_BLK_F_BARRIER 0 /* Does host support barriers? */ 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 /* Indicates support of legacy geometry */ 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_SCSI 7 /* Supports scsi command passthru */ 40 /* #define VIRTIO_BLK_F_IDENTIFY 8 ATA IDENTIFY supported, DEPRECATED */ 41 #define VIRTIO_BLK_F_WCE 9 /* write cache enabled */ 42 #define VIRTIO_BLK_F_TOPOLOGY 10 /* Topology information is available */ 43 #define VIRTIO_BLK_F_CONFIG_WCE 11 /* write cache configurable */ 44 45 #define VIRTIO_BLK_ID_BYTES 20 /* ID string length */ 46 47 struct virtio_blk_config 48 { 49 uint64_t capacity; 50 uint32_t size_max; 51 uint32_t seg_max; 52 uint16_t cylinders; 53 uint8_t heads; 54 uint8_t sectors; 55 uint32_t blk_size; 56 uint8_t physical_block_exp; 57 uint8_t alignment_offset; 58 uint16_t min_io_size; 59 uint32_t opt_io_size; 60 uint8_t wce; 61 } QEMU_PACKED; 62 63 /* These two define direction. */ 64 #define VIRTIO_BLK_T_IN 0 65 #define VIRTIO_BLK_T_OUT 1 66 67 /* This bit says it's a scsi command, not an actual read or write. */ 68 #define VIRTIO_BLK_T_SCSI_CMD 2 69 70 /* Flush the volatile write cache */ 71 #define VIRTIO_BLK_T_FLUSH 4 72 73 /* return the device ID string */ 74 #define VIRTIO_BLK_T_GET_ID 8 75 76 /* Barrier before this op. */ 77 #define VIRTIO_BLK_T_BARRIER 0x80000000 78 79 /* This is the first element of the read scatter-gather list. */ 80 struct virtio_blk_outhdr 81 { 82 /* VIRTIO_BLK_T* */ 83 uint32_t type; 84 /* io priority. */ 85 uint32_t ioprio; 86 /* Sector (ie. 512 byte offset) */ 87 uint64_t sector; 88 }; 89 90 #define VIRTIO_BLK_S_OK 0 91 #define VIRTIO_BLK_S_IOERR 1 92 #define VIRTIO_BLK_S_UNSUPP 2 93 94 /* This is the last element of the write scatter-gather list */ 95 struct virtio_blk_inhdr 96 { 97 unsigned char status; 98 }; 99 100 /* SCSI pass-through header */ 101 struct virtio_scsi_inhdr 102 { 103 uint32_t errors; 104 uint32_t data_len; 105 uint32_t sense_len; 106 uint32_t residual; 107 }; 108 109 struct VirtIOBlkConf 110 { 111 BlockConf conf; 112 IOThread *iothread; 113 char *serial; 114 uint32_t scsi; 115 uint32_t config_wce; 116 uint32_t data_plane; 117 }; 118 119 struct VirtIOBlockDataPlane; 120 121 struct VirtIOBlockReq; 122 typedef struct VirtIOBlock { 123 VirtIODevice parent_obj; 124 BlockDriverState *bs; 125 VirtQueue *vq; 126 void *rq; 127 QEMUBH *bh; 128 BlockConf *conf; 129 VirtIOBlkConf blk; 130 unsigned short sector_mask; 131 bool original_wce; 132 VMChangeStateEntry *change; 133 /* Function to push to vq and notify guest */ 134 void (*complete_request)(struct VirtIOBlockReq *req, unsigned char status); 135 Notifier migration_state_notifier; 136 struct VirtIOBlockDataPlane *dataplane; 137 } VirtIOBlock; 138 139 typedef struct MultiReqBuffer { 140 BlockRequest blkreq[32]; 141 unsigned int num_writes; 142 } MultiReqBuffer; 143 144 typedef struct VirtIOBlockReq { 145 VirtIOBlock *dev; 146 VirtQueueElement elem; 147 struct virtio_blk_inhdr *in; 148 struct virtio_blk_outhdr out; 149 QEMUIOVector qiov; 150 struct VirtIOBlockReq *next; 151 BlockAcctCookie acct; 152 } VirtIOBlockReq; 153 154 VirtIOBlockReq *virtio_blk_alloc_request(VirtIOBlock *s); 155 156 void virtio_blk_free_request(VirtIOBlockReq *req); 157 158 int virtio_blk_handle_scsi_req(VirtIOBlock *blk, 159 VirtQueueElement *elem); 160 161 void virtio_blk_handle_request(VirtIOBlockReq *req, MultiReqBuffer *mrb); 162 163 void virtio_submit_multiwrite(BlockDriverState *bs, MultiReqBuffer *mrb); 164 165 #endif 166