]>
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 | ||
14 | #ifndef _QEMU_VIRTIO_BLK_H | |
15 | #define _QEMU_VIRTIO_BLK_H | |
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; |
a6c5c84a | 38 | uint32_t scsi; |
8a873ba7 | 39 | uint32_t config_wce; |
c99495ac | 40 | uint32_t request_merging; |
12c5674b PB |
41 | }; |
42 | ||
0d09e41a PB |
43 | struct VirtIOBlockDataPlane; |
44 | ||
bf4bd461 | 45 | struct VirtIOBlockReq; |
f1b24e84 | 46 | typedef struct VirtIOBlock { |
1cc91b7d | 47 | VirtIODevice parent_obj; |
4be74634 | 48 | BlockBackend *blk; |
f1b24e84 FK |
49 | VirtQueue *vq; |
50 | void *rq; | |
51 | QEMUBH *bh; | |
2a30307f | 52 | VirtIOBlkConf conf; |
f1b24e84 | 53 | unsigned short sector_mask; |
ef5bc962 | 54 | bool original_wce; |
f1b24e84 | 55 | VMChangeStateEntry *change; |
bf4bd461 FZ |
56 | /* Function to push to vq and notify guest */ |
57 | void (*complete_request)(struct VirtIOBlockReq *req, unsigned char status); | |
84db52d0 | 58 | Notifier migration_state_notifier; |
0d09e41a | 59 | struct VirtIOBlockDataPlane *dataplane; |
f1b24e84 FK |
60 | } VirtIOBlock; |
61 | ||
09f64587 | 62 | typedef struct VirtIOBlockReq { |
6aa46d8f | 63 | VirtQueueElement elem; |
95f7142a | 64 | int64_t sector_num; |
09f64587 | 65 | VirtIOBlock *dev; |
09f64587 | 66 | struct virtio_blk_inhdr *in; |
827805a2 | 67 | struct virtio_blk_outhdr out; |
09f64587 | 68 | QEMUIOVector qiov; |
2a6cdd6d | 69 | size_t in_len; |
09f64587 | 70 | struct VirtIOBlockReq *next; |
95f7142a | 71 | struct VirtIOBlockReq *mr_next; |
09f64587 FZ |
72 | BlockAcctCookie acct; |
73 | } VirtIOBlockReq; | |
74 | ||
95f7142a PL |
75 | #define VIRTIO_BLK_MAX_MERGE_REQS 32 |
76 | ||
77 | typedef struct MultiReqBuffer { | |
78 | VirtIOBlockReq *reqs[VIRTIO_BLK_MAX_MERGE_REQS]; | |
79 | unsigned int num_reqs; | |
80 | bool is_write; | |
81 | } MultiReqBuffer; | |
82 | ||
51b19ebe | 83 | void virtio_blk_init_request(VirtIOBlock *s, VirtIOBlockReq *req); |
f897bf75 SH |
84 | void virtio_blk_free_request(VirtIOBlockReq *req); |
85 | ||
fee65db7 FZ |
86 | void virtio_blk_handle_request(VirtIOBlockReq *req, MultiReqBuffer *mrb); |
87 | ||
95f7142a | 88 | void virtio_blk_submit_multireq(BlockBackend *blk, MultiReqBuffer *mrb); |
fee65db7 | 89 | |
6e02c38d | 90 | #endif |