]>
Commit | Line | Data |
---|---|---|
6e02c38d AL |
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 | ||
2a6a4076 MA |
14 | #ifndef QEMU_VIRTIO_BLK_H |
15 | #define QEMU_VIRTIO_BLK_H | |
6e02c38d | 16 | |
907eb3e5 | 17 | #include "standard-headers/linux/virtio_blk.h" |
0d09e41a PB |
18 | #include "hw/virtio/virtio.h" |
19 | #include "hw/block/block.h" | |
48ff2692 | 20 | #include "sysemu/iothread.h" |
4be74634 | 21 | #include "sysemu/block-backend.h" |
6e02c38d | 22 | |
f574fa8b | 23 | #define TYPE_VIRTIO_BLK "virtio-blk-device" |
1c028ddf FK |
24 | #define VIRTIO_BLK(obj) \ |
25 | OBJECT_CHECK(VirtIOBlock, (obj), TYPE_VIRTIO_BLK) | |
26 | ||
8b91408b | 27 | /* This is the last element of the write scatter-gather list */ |
6e02c38d AL |
28 | struct virtio_blk_inhdr |
29 | { | |
30 | unsigned char status; | |
31 | }; | |
32 | ||
12c5674b PB |
33 | struct VirtIOBlkConf |
34 | { | |
35 | BlockConf conf; | |
48ff2692 | 36 | IOThread *iothread; |
12c5674b | 37 | char *serial; |
c99495ac | 38 | uint32_t request_merging; |
84419863 | 39 | uint16_t num_queues; |
6040aedd | 40 | uint16_t queue_size; |
37b06f8d SG |
41 | uint32_t max_discard_sectors; |
42 | uint32_t max_write_zeroes_sectors; | |
12c5674b PB |
43 | }; |
44 | ||
0d09e41a PB |
45 | struct VirtIOBlockDataPlane; |
46 | ||
bf4bd461 | 47 | struct VirtIOBlockReq; |
f1b24e84 | 48 | typedef struct VirtIOBlock { |
1cc91b7d | 49 | VirtIODevice parent_obj; |
4be74634 | 50 | BlockBackend *blk; |
f1b24e84 FK |
51 | void *rq; |
52 | QEMUBH *bh; | |
2a30307f | 53 | VirtIOBlkConf conf; |
f1b24e84 | 54 | unsigned short sector_mask; |
ef5bc962 | 55 | bool original_wce; |
f1b24e84 | 56 | VMChangeStateEntry *change; |
eb41cf78 | 57 | bool dataplane_disabled; |
2906cddf | 58 | bool dataplane_started; |
0d09e41a | 59 | struct VirtIOBlockDataPlane *dataplane; |
bbe8bd4d | 60 | uint64_t host_features; |
20764be0 | 61 | size_t config_size; |
f1b24e84 FK |
62 | } VirtIOBlock; |
63 | ||
09f64587 | 64 | typedef struct VirtIOBlockReq { |
6aa46d8f | 65 | VirtQueueElement elem; |
95f7142a | 66 | int64_t sector_num; |
09f64587 | 67 | VirtIOBlock *dev; |
edaffd9f | 68 | VirtQueue *vq; |
09f64587 | 69 | struct virtio_blk_inhdr *in; |
827805a2 | 70 | struct virtio_blk_outhdr out; |
09f64587 | 71 | QEMUIOVector qiov; |
2a6cdd6d | 72 | size_t in_len; |
09f64587 | 73 | struct VirtIOBlockReq *next; |
95f7142a | 74 | struct VirtIOBlockReq *mr_next; |
09f64587 FZ |
75 | BlockAcctCookie acct; |
76 | } VirtIOBlockReq; | |
77 | ||
95f7142a PL |
78 | #define VIRTIO_BLK_MAX_MERGE_REQS 32 |
79 | ||
80 | typedef struct MultiReqBuffer { | |
81 | VirtIOBlockReq *reqs[VIRTIO_BLK_MAX_MERGE_REQS]; | |
82 | unsigned int num_reqs; | |
83 | bool is_write; | |
84 | } MultiReqBuffer; | |
85 | ||
07931698 | 86 | bool virtio_blk_handle_vq(VirtIOBlock *s, VirtQueue *vq); |
8a2fad57 | 87 | |
6e02c38d | 88 | #endif |