1
2
3
4
5
6
7
8
9
10
11
12
13
14#ifndef _QEMU_VIRTIO_H
15#define _QEMU_VIRTIO_H
16
17#include "hw/hw.h"
18#include "net/net.h"
19#include "hw/qdev.h"
20#include "sysemu/sysemu.h"
21#include "qemu/event_notifier.h"
22#ifdef CONFIG_VIRTFS
23#include "hw/virtio/virtio-9p.h"
24#endif
25
26
27
28
29
30#define VIRTIO_CONFIG_S_ACKNOWLEDGE 1
31
32#define VIRTIO_CONFIG_S_DRIVER 2
33
34#define VIRTIO_CONFIG_S_DRIVER_OK 4
35
36#define VIRTIO_CONFIG_S_FAILED 0x80
37
38
39
40#define VIRTIO_TRANSPORT_F_START 28
41#define VIRTIO_TRANSPORT_F_END 32
42
43
44
45#define VIRTIO_F_NOTIFY_ON_EMPTY 24
46
47#define VIRTIO_F_ANY_LAYOUT 27
48
49#define VIRTIO_RING_F_INDIRECT_DESC 28
50
51
52
53
54#define VIRTIO_RING_F_EVENT_IDX 29
55
56#define VIRTIO_F_BAD_FEATURE 30
57
58
59
60
61#define VRING_DESC_F_NEXT 1
62
63#define VRING_DESC_F_WRITE 2
64
65#define VRING_DESC_F_INDIRECT 4
66
67
68#define VRING_USED_F_NO_NOTIFY 1
69
70#define VRING_AVAIL_F_NO_INTERRUPT 1
71
72struct VirtQueue;
73
74static inline hwaddr vring_align(hwaddr addr,
75 unsigned long align)
76{
77 return (addr + align - 1) & ~(align - 1);
78}
79
80typedef struct VirtQueue VirtQueue;
81
82#define VIRTQUEUE_MAX_SIZE 1024
83
84typedef struct VirtQueueElement
85{
86 unsigned int index;
87 unsigned int out_num;
88 unsigned int in_num;
89 hwaddr in_addr[VIRTQUEUE_MAX_SIZE];
90 hwaddr out_addr[VIRTQUEUE_MAX_SIZE];
91 struct iovec in_sg[VIRTQUEUE_MAX_SIZE];
92 struct iovec out_sg[VIRTQUEUE_MAX_SIZE];
93} VirtQueueElement;
94
95#define VIRTIO_PCI_QUEUE_MAX 64
96
97#define VIRTIO_NO_VECTOR 0xffff
98
99#define TYPE_VIRTIO_DEVICE "virtio-device"
100#define VIRTIO_DEVICE_GET_CLASS(obj) \
101 OBJECT_GET_CLASS(VirtioDeviceClass, obj, TYPE_VIRTIO_DEVICE)
102#define VIRTIO_DEVICE_CLASS(klass) \
103 OBJECT_CLASS_CHECK(VirtioDeviceClass, klass, TYPE_VIRTIO_DEVICE)
104#define VIRTIO_DEVICE(obj) \
105 OBJECT_CHECK(VirtIODevice, (obj), TYPE_VIRTIO_DEVICE)
106
107struct VirtIODevice
108{
109 DeviceState parent_obj;
110 const char *name;
111 uint8_t status;
112 uint8_t isr;
113 uint16_t queue_sel;
114 uint32_t guest_features;
115 size_t config_len;
116 void *config;
117 uint16_t config_vector;
118 int nvectors;
119 VirtQueue *vq;
120 uint16_t device_id;
121 bool vm_running;
122 VMChangeStateEntry *vmstate;
123 char *bus_name;
124};
125
126typedef struct VirtioDeviceClass {
127
128 DeviceClass parent;
129 int (*init)(VirtIODevice *vdev);
130 uint32_t (*get_features)(VirtIODevice *vdev, uint32_t requested_features);
131 uint32_t (*bad_features)(VirtIODevice *vdev);
132 void (*set_features)(VirtIODevice *vdev, uint32_t val);
133 void (*get_config)(VirtIODevice *vdev, uint8_t *config);
134 void (*set_config)(VirtIODevice *vdev, const uint8_t *config);
135 void (*reset)(VirtIODevice *vdev);
136 void (*set_status)(VirtIODevice *vdev, uint8_t val);
137
138
139
140
141
142 bool (*guest_notifier_pending)(VirtIODevice *vdev, int n);
143
144
145
146
147
148 void (*guest_notifier_mask)(VirtIODevice *vdev, int n, bool mask);
149} VirtioDeviceClass;
150
151void virtio_init(VirtIODevice *vdev, const char *name,
152 uint16_t device_id, size_t config_size);
153void virtio_cleanup(VirtIODevice *vdev);
154
155
156void virtio_device_set_child_bus_name(VirtIODevice *vdev, char *bus_name);
157
158VirtQueue *virtio_add_queue(VirtIODevice *vdev, int queue_size,
159 void (*handle_output)(VirtIODevice *,
160 VirtQueue *));
161
162void virtio_del_queue(VirtIODevice *vdev, int n);
163
164void virtqueue_push(VirtQueue *vq, const VirtQueueElement *elem,
165 unsigned int len);
166void virtqueue_flush(VirtQueue *vq, unsigned int count);
167void virtqueue_fill(VirtQueue *vq, const VirtQueueElement *elem,
168 unsigned int len, unsigned int idx);
169
170void virtqueue_map_sg(struct iovec *sg, hwaddr *addr,
171 size_t num_sg, int is_write);
172int virtqueue_pop(VirtQueue *vq, VirtQueueElement *elem);
173int virtqueue_avail_bytes(VirtQueue *vq, unsigned int in_bytes,
174 unsigned int out_bytes);
175void virtqueue_get_avail_bytes(VirtQueue *vq, unsigned int *in_bytes,
176 unsigned int *out_bytes,
177 unsigned max_in_bytes, unsigned max_out_bytes);
178
179void virtio_notify(VirtIODevice *vdev, VirtQueue *vq);
180
181void virtio_save(VirtIODevice *vdev, QEMUFile *f);
182
183int virtio_load(VirtIODevice *vdev, QEMUFile *f);
184
185void virtio_notify_config(VirtIODevice *vdev);
186
187void virtio_queue_set_notification(VirtQueue *vq, int enable);
188
189int virtio_queue_ready(VirtQueue *vq);
190
191int virtio_queue_empty(VirtQueue *vq);
192
193
194
195uint32_t virtio_config_readb(VirtIODevice *vdev, uint32_t addr);
196uint32_t virtio_config_readw(VirtIODevice *vdev, uint32_t addr);
197uint32_t virtio_config_readl(VirtIODevice *vdev, uint32_t addr);
198void virtio_config_writeb(VirtIODevice *vdev, uint32_t addr, uint32_t data);
199void virtio_config_writew(VirtIODevice *vdev, uint32_t addr, uint32_t data);
200void virtio_config_writel(VirtIODevice *vdev, uint32_t addr, uint32_t data);
201void virtio_queue_set_addr(VirtIODevice *vdev, int n, hwaddr addr);
202hwaddr virtio_queue_get_addr(VirtIODevice *vdev, int n);
203void virtio_queue_set_num(VirtIODevice *vdev, int n, int num);
204int virtio_queue_get_num(VirtIODevice *vdev, int n);
205void virtio_queue_set_align(VirtIODevice *vdev, int n, int align);
206void virtio_queue_notify(VirtIODevice *vdev, int n);
207uint16_t virtio_queue_vector(VirtIODevice *vdev, int n);
208void virtio_queue_set_vector(VirtIODevice *vdev, int n, uint16_t vector);
209void virtio_set_status(VirtIODevice *vdev, uint8_t val);
210void virtio_reset(void *opaque);
211void virtio_update_irq(VirtIODevice *vdev);
212int virtio_set_features(VirtIODevice *vdev, uint32_t val);
213
214
215typedef struct VirtIOBlkConf VirtIOBlkConf;
216struct virtio_net_conf;
217VirtIODevice *virtio_net_init(DeviceState *dev, NICConf *conf,
218 struct virtio_net_conf *net,
219 uint32_t host_features);
220typedef struct virtio_serial_conf virtio_serial_conf;
221typedef struct VirtIOSCSIConf VirtIOSCSIConf;
222typedef struct VirtIORNGConf VirtIORNGConf;
223
224#define DEFINE_VIRTIO_COMMON_FEATURES(_state, _field) \
225 DEFINE_PROP_BIT("indirect_desc", _state, _field, \
226 VIRTIO_RING_F_INDIRECT_DESC, true), \
227 DEFINE_PROP_BIT("event_idx", _state, _field, \
228 VIRTIO_RING_F_EVENT_IDX, true)
229
230hwaddr virtio_queue_get_desc_addr(VirtIODevice *vdev, int n);
231hwaddr virtio_queue_get_avail_addr(VirtIODevice *vdev, int n);
232hwaddr virtio_queue_get_used_addr(VirtIODevice *vdev, int n);
233hwaddr virtio_queue_get_ring_addr(VirtIODevice *vdev, int n);
234hwaddr virtio_queue_get_desc_size(VirtIODevice *vdev, int n);
235hwaddr virtio_queue_get_avail_size(VirtIODevice *vdev, int n);
236hwaddr virtio_queue_get_used_size(VirtIODevice *vdev, int n);
237hwaddr virtio_queue_get_ring_size(VirtIODevice *vdev, int n);
238uint16_t virtio_queue_get_last_avail_idx(VirtIODevice *vdev, int n);
239void virtio_queue_set_last_avail_idx(VirtIODevice *vdev, int n, uint16_t idx);
240void virtio_queue_invalidate_signalled_used(VirtIODevice *vdev, int n);
241VirtQueue *virtio_get_queue(VirtIODevice *vdev, int n);
242uint16_t virtio_get_queue_index(VirtQueue *vq);
243int virtio_queue_get_id(VirtQueue *vq);
244EventNotifier *virtio_queue_get_guest_notifier(VirtQueue *vq);
245void virtio_queue_set_guest_notifier_fd_handler(VirtQueue *vq, bool assign,
246 bool with_irqfd);
247EventNotifier *virtio_queue_get_host_notifier(VirtQueue *vq);
248void virtio_queue_set_host_notifier_fd_handler(VirtQueue *vq, bool assign,
249 bool set_handler);
250void virtio_queue_notify_vq(VirtQueue *vq);
251void virtio_irq(VirtQueue *vq);
252#endif
253