4 * Copyright IBM, Corp. 2007
7 * Anthony Liguori <aliguori@us.ibm.com>
9 * This work is licensed under the terms of the GNU GPL, version 2. See
10 * the COPYING file in the top-level directory.
14 #ifndef _QEMU_VIRTIO_H
15 #define _QEMU_VIRTIO_H
20 #include "sysemu/sysemu.h"
21 #include "qemu/event_notifier.h"
22 #include "standard-headers/linux/virtio_config.h"
23 #include "standard-headers/linux/virtio_ring.h"
25 /* A guest should never accept this. It implies negotiation is broken. */
26 #define VIRTIO_F_BAD_FEATURE 30
30 static inline hwaddr
vring_align(hwaddr addr
,
33 return (addr
+ align
- 1) & ~(align
- 1);
36 typedef struct VirtQueue VirtQueue
;
38 #define VIRTQUEUE_MAX_SIZE 1024
40 typedef struct VirtQueueElement
45 hwaddr in_addr
[VIRTQUEUE_MAX_SIZE
];
46 hwaddr out_addr
[VIRTQUEUE_MAX_SIZE
];
47 struct iovec in_sg
[VIRTQUEUE_MAX_SIZE
];
48 struct iovec out_sg
[VIRTQUEUE_MAX_SIZE
];
51 #define VIRTIO_PCI_QUEUE_MAX 64
53 #define VIRTIO_NO_VECTOR 0xffff
55 #define TYPE_VIRTIO_DEVICE "virtio-device"
56 #define VIRTIO_DEVICE_GET_CLASS(obj) \
57 OBJECT_GET_CLASS(VirtioDeviceClass, obj, TYPE_VIRTIO_DEVICE)
58 #define VIRTIO_DEVICE_CLASS(klass) \
59 OBJECT_CLASS_CHECK(VirtioDeviceClass, klass, TYPE_VIRTIO_DEVICE)
60 #define VIRTIO_DEVICE(obj) \
61 OBJECT_CHECK(VirtIODevice, (obj), TYPE_VIRTIO_DEVICE)
63 enum virtio_device_endian
{
64 VIRTIO_DEVICE_ENDIAN_UNKNOWN
,
65 VIRTIO_DEVICE_ENDIAN_LITTLE
,
66 VIRTIO_DEVICE_ENDIAN_BIG
,
71 DeviceState parent_obj
;
76 uint32_t guest_features
;
79 uint16_t config_vector
;
84 VMChangeStateEntry
*vmstate
;
86 uint8_t device_endian
;
89 typedef struct VirtioDeviceClass
{
94 /* This is what a VirtioDevice must implement */
95 DeviceRealize realize
;
96 DeviceUnrealize unrealize
;
97 uint32_t (*get_features
)(VirtIODevice
*vdev
, uint32_t requested_features
);
98 uint32_t (*bad_features
)(VirtIODevice
*vdev
);
99 void (*set_features
)(VirtIODevice
*vdev
, uint32_t val
);
100 void (*get_config
)(VirtIODevice
*vdev
, uint8_t *config
);
101 void (*set_config
)(VirtIODevice
*vdev
, const uint8_t *config
);
102 void (*reset
)(VirtIODevice
*vdev
);
103 void (*set_status
)(VirtIODevice
*vdev
, uint8_t val
);
104 /* Test and clear event pending status.
105 * Should be called after unmask to avoid losing events.
106 * If backend does not support masking,
107 * must check in frontend instead.
109 bool (*guest_notifier_pending
)(VirtIODevice
*vdev
, int n
);
110 /* Mask/unmask events from this vq. Any events reported
111 * while masked will become pending.
112 * If backend does not support masking,
113 * must mask in frontend instead.
115 void (*guest_notifier_mask
)(VirtIODevice
*vdev
, int n
, bool mask
);
116 void (*save
)(VirtIODevice
*vdev
, QEMUFile
*f
);
117 int (*load
)(VirtIODevice
*vdev
, QEMUFile
*f
, int version_id
);
120 void virtio_instance_init_common(Object
*proxy_obj
, void *data
,
121 size_t vdev_size
, const char *vdev_name
);
123 void virtio_init(VirtIODevice
*vdev
, const char *name
,
124 uint16_t device_id
, size_t config_size
);
125 void virtio_cleanup(VirtIODevice
*vdev
);
127 /* Set the child bus name. */
128 void virtio_device_set_child_bus_name(VirtIODevice
*vdev
, char *bus_name
);
130 VirtQueue
*virtio_add_queue(VirtIODevice
*vdev
, int queue_size
,
131 void (*handle_output
)(VirtIODevice
*,
134 void virtio_del_queue(VirtIODevice
*vdev
, int n
);
136 void virtqueue_push(VirtQueue
*vq
, const VirtQueueElement
*elem
,
138 void virtqueue_flush(VirtQueue
*vq
, unsigned int count
);
139 void virtqueue_fill(VirtQueue
*vq
, const VirtQueueElement
*elem
,
140 unsigned int len
, unsigned int idx
);
142 void virtqueue_map_sg(struct iovec
*sg
, hwaddr
*addr
,
143 size_t num_sg
, int is_write
);
144 int virtqueue_pop(VirtQueue
*vq
, VirtQueueElement
*elem
);
145 int virtqueue_avail_bytes(VirtQueue
*vq
, unsigned int in_bytes
,
146 unsigned int out_bytes
);
147 void virtqueue_get_avail_bytes(VirtQueue
*vq
, unsigned int *in_bytes
,
148 unsigned int *out_bytes
,
149 unsigned max_in_bytes
, unsigned max_out_bytes
);
151 void virtio_notify(VirtIODevice
*vdev
, VirtQueue
*vq
);
153 void virtio_save(VirtIODevice
*vdev
, QEMUFile
*f
);
155 int virtio_load(VirtIODevice
*vdev
, QEMUFile
*f
, int version_id
);
157 void virtio_notify_config(VirtIODevice
*vdev
);
159 void virtio_queue_set_notification(VirtQueue
*vq
, int enable
);
161 int virtio_queue_ready(VirtQueue
*vq
);
163 int virtio_queue_empty(VirtQueue
*vq
);
165 /* Host binding interface. */
167 uint32_t virtio_config_readb(VirtIODevice
*vdev
, uint32_t addr
);
168 uint32_t virtio_config_readw(VirtIODevice
*vdev
, uint32_t addr
);
169 uint32_t virtio_config_readl(VirtIODevice
*vdev
, uint32_t addr
);
170 void virtio_config_writeb(VirtIODevice
*vdev
, uint32_t addr
, uint32_t data
);
171 void virtio_config_writew(VirtIODevice
*vdev
, uint32_t addr
, uint32_t data
);
172 void virtio_config_writel(VirtIODevice
*vdev
, uint32_t addr
, uint32_t data
);
173 void virtio_queue_set_addr(VirtIODevice
*vdev
, int n
, hwaddr addr
);
174 hwaddr
virtio_queue_get_addr(VirtIODevice
*vdev
, int n
);
175 void virtio_queue_set_num(VirtIODevice
*vdev
, int n
, int num
);
176 int virtio_queue_get_num(VirtIODevice
*vdev
, int n
);
177 void virtio_queue_set_align(VirtIODevice
*vdev
, int n
, int align
);
178 void virtio_queue_notify(VirtIODevice
*vdev
, int n
);
179 uint16_t virtio_queue_vector(VirtIODevice
*vdev
, int n
);
180 void virtio_queue_set_vector(VirtIODevice
*vdev
, int n
, uint16_t vector
);
181 void virtio_set_status(VirtIODevice
*vdev
, uint8_t val
);
182 void virtio_reset(void *opaque
);
183 void virtio_update_irq(VirtIODevice
*vdev
);
184 int virtio_set_features(VirtIODevice
*vdev
, uint32_t val
);
187 typedef struct VirtIOBlkConf VirtIOBlkConf
;
188 struct virtio_net_conf
;
189 typedef struct virtio_serial_conf virtio_serial_conf
;
190 typedef struct VirtIOSCSIConf VirtIOSCSIConf
;
191 typedef struct VirtIORNGConf VirtIORNGConf
;
193 #define DEFINE_VIRTIO_COMMON_FEATURES(_state, _field) \
194 DEFINE_PROP_BIT("indirect_desc", _state, _field, \
195 VIRTIO_RING_F_INDIRECT_DESC, true), \
196 DEFINE_PROP_BIT("event_idx", _state, _field, \
197 VIRTIO_RING_F_EVENT_IDX, true)
199 hwaddr
virtio_queue_get_desc_addr(VirtIODevice
*vdev
, int n
);
200 hwaddr
virtio_queue_get_avail_addr(VirtIODevice
*vdev
, int n
);
201 hwaddr
virtio_queue_get_used_addr(VirtIODevice
*vdev
, int n
);
202 hwaddr
virtio_queue_get_ring_addr(VirtIODevice
*vdev
, int n
);
203 hwaddr
virtio_queue_get_desc_size(VirtIODevice
*vdev
, int n
);
204 hwaddr
virtio_queue_get_avail_size(VirtIODevice
*vdev
, int n
);
205 hwaddr
virtio_queue_get_used_size(VirtIODevice
*vdev
, int n
);
206 hwaddr
virtio_queue_get_ring_size(VirtIODevice
*vdev
, int n
);
207 uint16_t virtio_queue_get_last_avail_idx(VirtIODevice
*vdev
, int n
);
208 void virtio_queue_set_last_avail_idx(VirtIODevice
*vdev
, int n
, uint16_t idx
);
209 void virtio_queue_invalidate_signalled_used(VirtIODevice
*vdev
, int n
);
210 VirtQueue
*virtio_get_queue(VirtIODevice
*vdev
, int n
);
211 uint16_t virtio_get_queue_index(VirtQueue
*vq
);
212 int virtio_queue_get_id(VirtQueue
*vq
);
213 EventNotifier
*virtio_queue_get_guest_notifier(VirtQueue
*vq
);
214 void virtio_queue_set_guest_notifier_fd_handler(VirtQueue
*vq
, bool assign
,
216 EventNotifier
*virtio_queue_get_host_notifier(VirtQueue
*vq
);
217 void virtio_queue_set_host_notifier_fd_handler(VirtQueue
*vq
, bool assign
,
219 void virtio_queue_notify_vq(VirtQueue
*vq
);
220 void virtio_irq(VirtQueue
*vq
);
222 static inline bool virtio_is_big_endian(VirtIODevice
*vdev
)
224 assert(vdev
->device_endian
!= VIRTIO_DEVICE_ENDIAN_UNKNOWN
);
225 return vdev
->device_endian
== VIRTIO_DEVICE_ENDIAN_BIG
;