xref: /qemu/include/hw/virtio/virtio-pci.h (revision d584f1b9ca7452ed8d6cd80f7fccd79d667ae49b)
1 /*
2  * Virtio PCI Bindings
3  *
4  * Copyright IBM, Corp. 2007
5  * Copyright (c) 2009 CodeSourcery
6  *
7  * Authors:
8  *  Anthony Liguori   <aliguori@us.ibm.com>
9  *  Paul Brook        <paul@codesourcery.com>
10  *
11  * This work is licensed under the terms of the GNU GPL, version 2.  See
12  * the COPYING file in the top-level directory.
13  */
14 
15 #ifndef QEMU_VIRTIO_PCI_H
16 #define QEMU_VIRTIO_PCI_H
17 
18 #include "hw/pci/msi.h"
19 #include "hw/virtio/virtio-blk.h"
20 #include "hw/virtio/virtio-net.h"
21 #include "hw/virtio/virtio-rng.h"
22 #include "hw/virtio/virtio-serial.h"
23 #include "hw/virtio/virtio-scsi.h"
24 #include "hw/virtio/virtio-balloon.h"
25 #include "hw/virtio/virtio-bus.h"
26 #include "hw/virtio/virtio-input.h"
27 #include "hw/virtio/virtio-gpu.h"
28 #include "hw/virtio/virtio-crypto.h"
29 
30 #ifdef CONFIG_VIRTFS
31 #include "hw/9pfs/virtio-9p.h"
32 #endif
33 #ifdef CONFIG_VHOST_SCSI
34 #include "hw/virtio/vhost-scsi.h"
35 #endif
36 #ifdef CONFIG_VHOST_VSOCK
37 #include "hw/virtio/vhost-vsock.h"
38 #endif
39 
40 typedef struct VirtIOPCIProxy VirtIOPCIProxy;
41 typedef struct VirtIOBlkPCI VirtIOBlkPCI;
42 typedef struct VirtIOSCSIPCI VirtIOSCSIPCI;
43 typedef struct VirtIOBalloonPCI VirtIOBalloonPCI;
44 typedef struct VirtIOSerialPCI VirtIOSerialPCI;
45 typedef struct VirtIONetPCI VirtIONetPCI;
46 typedef struct VHostSCSIPCI VHostSCSIPCI;
47 typedef struct VirtIORngPCI VirtIORngPCI;
48 typedef struct VirtIOInputPCI VirtIOInputPCI;
49 typedef struct VirtIOInputHIDPCI VirtIOInputHIDPCI;
50 typedef struct VirtIOInputHostPCI VirtIOInputHostPCI;
51 typedef struct VirtIOGPUPCI VirtIOGPUPCI;
52 typedef struct VHostVSockPCI VHostVSockPCI;
53 typedef struct VirtIOCryptoPCI VirtIOCryptoPCI;
54 
55 /* virtio-pci-bus */
56 
57 typedef struct VirtioBusState VirtioPCIBusState;
58 typedef struct VirtioBusClass VirtioPCIBusClass;
59 
60 #define TYPE_VIRTIO_PCI_BUS "virtio-pci-bus"
61 #define VIRTIO_PCI_BUS(obj) \
62         OBJECT_CHECK(VirtioPCIBusState, (obj), TYPE_VIRTIO_PCI_BUS)
63 #define VIRTIO_PCI_BUS_GET_CLASS(obj) \
64         OBJECT_GET_CLASS(VirtioPCIBusClass, obj, TYPE_VIRTIO_PCI_BUS)
65 #define VIRTIO_PCI_BUS_CLASS(klass) \
66         OBJECT_CLASS_CHECK(VirtioPCIBusClass, klass, TYPE_VIRTIO_PCI_BUS)
67 
68 enum {
69     VIRTIO_PCI_FLAG_BUS_MASTER_BUG_MIGRATION_BIT,
70     VIRTIO_PCI_FLAG_USE_IOEVENTFD_BIT,
71     VIRTIO_PCI_FLAG_MIGRATE_EXTRA_BIT,
72     VIRTIO_PCI_FLAG_MODERN_PIO_NOTIFY_BIT,
73     VIRTIO_PCI_FLAG_DISABLE_PCIE_BIT,
74     VIRTIO_PCI_FLAG_PAGE_PER_VQ_BIT,
75     VIRTIO_PCI_FLAG_ATS_BIT,
76     VIRTIO_PCI_FLAG_INIT_DEVERR_BIT,
77     VIRTIO_PCI_FLAG_INIT_LNKCTL_BIT,
78 };
79 
80 /* Need to activate work-arounds for buggy guests at vmstate load. */
81 #define VIRTIO_PCI_FLAG_BUS_MASTER_BUG_MIGRATION \
82     (1 << VIRTIO_PCI_FLAG_BUS_MASTER_BUG_MIGRATION_BIT)
83 
84 /* Performance improves when virtqueue kick processing is decoupled from the
85  * vcpu thread using ioeventfd for some devices. */
86 #define VIRTIO_PCI_FLAG_USE_IOEVENTFD   (1 << VIRTIO_PCI_FLAG_USE_IOEVENTFD_BIT)
87 
88 /* virtio version flags */
89 #define VIRTIO_PCI_FLAG_DISABLE_PCIE (1 << VIRTIO_PCI_FLAG_DISABLE_PCIE_BIT)
90 
91 /* migrate extra state */
92 #define VIRTIO_PCI_FLAG_MIGRATE_EXTRA (1 << VIRTIO_PCI_FLAG_MIGRATE_EXTRA_BIT)
93 
94 /* have pio notification for modern device ? */
95 #define VIRTIO_PCI_FLAG_MODERN_PIO_NOTIFY \
96     (1 << VIRTIO_PCI_FLAG_MODERN_PIO_NOTIFY_BIT)
97 
98 /* page per vq flag to be used by split drivers within guests */
99 #define VIRTIO_PCI_FLAG_PAGE_PER_VQ \
100     (1 << VIRTIO_PCI_FLAG_PAGE_PER_VQ_BIT)
101 
102 /* address space translation service */
103 #define VIRTIO_PCI_FLAG_ATS (1 << VIRTIO_PCI_FLAG_ATS_BIT)
104 
105 /* Init error enabling flags */
106 #define VIRTIO_PCI_FLAG_INIT_DEVERR (1 << VIRTIO_PCI_FLAG_INIT_DEVERR_BIT)
107 
108 /* Init Link Control register */
109 #define VIRTIO_PCI_FLAG_INIT_LNKCTL (1 << VIRTIO_PCI_FLAG_INIT_LNKCTL_BIT)
110 
111 typedef struct {
112     MSIMessage msg;
113     int virq;
114     unsigned int users;
115 } VirtIOIRQFD;
116 
117 /*
118  * virtio-pci: This is the PCIDevice which has a virtio-pci-bus.
119  */
120 #define TYPE_VIRTIO_PCI "virtio-pci"
121 #define VIRTIO_PCI_GET_CLASS(obj) \
122         OBJECT_GET_CLASS(VirtioPCIClass, obj, TYPE_VIRTIO_PCI)
123 #define VIRTIO_PCI_CLASS(klass) \
124         OBJECT_CLASS_CHECK(VirtioPCIClass, klass, TYPE_VIRTIO_PCI)
125 #define VIRTIO_PCI(obj) \
126         OBJECT_CHECK(VirtIOPCIProxy, (obj), TYPE_VIRTIO_PCI)
127 
128 typedef struct VirtioPCIClass {
129     PCIDeviceClass parent_class;
130     DeviceRealize parent_dc_realize;
131     void (*realize)(VirtIOPCIProxy *vpci_dev, Error **errp);
132 } VirtioPCIClass;
133 
134 typedef struct VirtIOPCIRegion {
135     MemoryRegion mr;
136     uint32_t offset;
137     uint32_t size;
138     uint32_t type;
139 } VirtIOPCIRegion;
140 
141 typedef struct VirtIOPCIQueue {
142   uint16_t num;
143   bool enabled;
144   uint32_t desc[2];
145   uint32_t avail[2];
146   uint32_t used[2];
147 } VirtIOPCIQueue;
148 
149 struct VirtIOPCIProxy {
150     PCIDevice pci_dev;
151     MemoryRegion bar;
152     VirtIOPCIRegion common;
153     VirtIOPCIRegion isr;
154     VirtIOPCIRegion device;
155     VirtIOPCIRegion notify;
156     VirtIOPCIRegion notify_pio;
157     MemoryRegion modern_bar;
158     MemoryRegion io_bar;
159     MemoryRegion modern_cfg;
160     AddressSpace modern_as;
161     uint32_t legacy_io_bar_idx;
162     uint32_t msix_bar_idx;
163     uint32_t modern_io_bar_idx;
164     uint32_t modern_mem_bar_idx;
165     int config_cap;
166     uint32_t flags;
167     bool disable_modern;
168     bool ignore_backend_features;
169     OnOffAuto disable_legacy;
170     uint32_t class_code;
171     uint32_t nvectors;
172     uint32_t dfselect;
173     uint32_t gfselect;
174     uint32_t guest_features[2];
175     VirtIOPCIQueue vqs[VIRTIO_QUEUE_MAX];
176 
177     VirtIOIRQFD *vector_irqfd;
178     int nvqs_with_notifiers;
179     VirtioBusState bus;
180 };
181 
182 static inline bool virtio_pci_modern(VirtIOPCIProxy *proxy)
183 {
184     return !proxy->disable_modern;
185 }
186 
187 static inline bool virtio_pci_legacy(VirtIOPCIProxy *proxy)
188 {
189     return proxy->disable_legacy == ON_OFF_AUTO_OFF;
190 }
191 
192 static inline void virtio_pci_force_virtio_1(VirtIOPCIProxy *proxy)
193 {
194     proxy->disable_modern = false;
195     proxy->disable_legacy = ON_OFF_AUTO_ON;
196 }
197 
198 static inline void virtio_pci_disable_modern(VirtIOPCIProxy *proxy)
199 {
200     proxy->disable_modern = true;
201 }
202 
203 /*
204  * virtio-scsi-pci: This extends VirtioPCIProxy.
205  */
206 #define TYPE_VIRTIO_SCSI_PCI "virtio-scsi-pci"
207 #define VIRTIO_SCSI_PCI(obj) \
208         OBJECT_CHECK(VirtIOSCSIPCI, (obj), TYPE_VIRTIO_SCSI_PCI)
209 
210 struct VirtIOSCSIPCI {
211     VirtIOPCIProxy parent_obj;
212     VirtIOSCSI vdev;
213 };
214 
215 #ifdef CONFIG_VHOST_SCSI
216 /*
217  * vhost-scsi-pci: This extends VirtioPCIProxy.
218  */
219 #define TYPE_VHOST_SCSI_PCI "vhost-scsi-pci"
220 #define VHOST_SCSI_PCI(obj) \
221         OBJECT_CHECK(VHostSCSIPCI, (obj), TYPE_VHOST_SCSI_PCI)
222 
223 struct VHostSCSIPCI {
224     VirtIOPCIProxy parent_obj;
225     VHostSCSI vdev;
226 };
227 #endif
228 
229 /*
230  * virtio-blk-pci: This extends VirtioPCIProxy.
231  */
232 #define TYPE_VIRTIO_BLK_PCI "virtio-blk-pci"
233 #define VIRTIO_BLK_PCI(obj) \
234         OBJECT_CHECK(VirtIOBlkPCI, (obj), TYPE_VIRTIO_BLK_PCI)
235 
236 struct VirtIOBlkPCI {
237     VirtIOPCIProxy parent_obj;
238     VirtIOBlock vdev;
239 };
240 
241 /*
242  * virtio-balloon-pci: This extends VirtioPCIProxy.
243  */
244 #define TYPE_VIRTIO_BALLOON_PCI "virtio-balloon-pci"
245 #define VIRTIO_BALLOON_PCI(obj) \
246         OBJECT_CHECK(VirtIOBalloonPCI, (obj), TYPE_VIRTIO_BALLOON_PCI)
247 
248 struct VirtIOBalloonPCI {
249     VirtIOPCIProxy parent_obj;
250     VirtIOBalloon vdev;
251 };
252 
253 /*
254  * virtio-serial-pci: This extends VirtioPCIProxy.
255  */
256 #define TYPE_VIRTIO_SERIAL_PCI "virtio-serial-pci"
257 #define VIRTIO_SERIAL_PCI(obj) \
258         OBJECT_CHECK(VirtIOSerialPCI, (obj), TYPE_VIRTIO_SERIAL_PCI)
259 
260 struct VirtIOSerialPCI {
261     VirtIOPCIProxy parent_obj;
262     VirtIOSerial vdev;
263 };
264 
265 /*
266  * virtio-net-pci: This extends VirtioPCIProxy.
267  */
268 #define TYPE_VIRTIO_NET_PCI "virtio-net-pci"
269 #define VIRTIO_NET_PCI(obj) \
270         OBJECT_CHECK(VirtIONetPCI, (obj), TYPE_VIRTIO_NET_PCI)
271 
272 struct VirtIONetPCI {
273     VirtIOPCIProxy parent_obj;
274     VirtIONet vdev;
275 };
276 
277 /*
278  * virtio-9p-pci: This extends VirtioPCIProxy.
279  */
280 
281 #ifdef CONFIG_VIRTFS
282 
283 #define TYPE_VIRTIO_9P_PCI "virtio-9p-pci"
284 #define VIRTIO_9P_PCI(obj) \
285         OBJECT_CHECK(V9fsPCIState, (obj), TYPE_VIRTIO_9P_PCI)
286 
287 typedef struct V9fsPCIState {
288     VirtIOPCIProxy parent_obj;
289     V9fsVirtioState vdev;
290 } V9fsPCIState;
291 
292 #endif
293 
294 /*
295  * virtio-rng-pci: This extends VirtioPCIProxy.
296  */
297 #define TYPE_VIRTIO_RNG_PCI "virtio-rng-pci"
298 #define VIRTIO_RNG_PCI(obj) \
299         OBJECT_CHECK(VirtIORngPCI, (obj), TYPE_VIRTIO_RNG_PCI)
300 
301 struct VirtIORngPCI {
302     VirtIOPCIProxy parent_obj;
303     VirtIORNG vdev;
304 };
305 
306 /*
307  * virtio-input-pci: This extends VirtioPCIProxy.
308  */
309 #define TYPE_VIRTIO_INPUT_PCI "virtio-input-pci"
310 #define VIRTIO_INPUT_PCI(obj) \
311         OBJECT_CHECK(VirtIOInputPCI, (obj), TYPE_VIRTIO_INPUT_PCI)
312 
313 struct VirtIOInputPCI {
314     VirtIOPCIProxy parent_obj;
315     VirtIOInput vdev;
316 };
317 
318 #define TYPE_VIRTIO_INPUT_HID_PCI "virtio-input-hid-pci"
319 #define TYPE_VIRTIO_KEYBOARD_PCI  "virtio-keyboard-pci"
320 #define TYPE_VIRTIO_MOUSE_PCI     "virtio-mouse-pci"
321 #define TYPE_VIRTIO_TABLET_PCI    "virtio-tablet-pci"
322 #define VIRTIO_INPUT_HID_PCI(obj) \
323         OBJECT_CHECK(VirtIOInputHIDPCI, (obj), TYPE_VIRTIO_INPUT_HID_PCI)
324 
325 struct VirtIOInputHIDPCI {
326     VirtIOPCIProxy parent_obj;
327     VirtIOInputHID vdev;
328 };
329 
330 #ifdef CONFIG_LINUX
331 
332 #define TYPE_VIRTIO_INPUT_HOST_PCI "virtio-input-host-pci"
333 #define VIRTIO_INPUT_HOST_PCI(obj) \
334         OBJECT_CHECK(VirtIOInputHostPCI, (obj), TYPE_VIRTIO_INPUT_HOST_PCI)
335 
336 struct VirtIOInputHostPCI {
337     VirtIOPCIProxy parent_obj;
338     VirtIOInputHost vdev;
339 };
340 
341 #endif
342 
343 /*
344  * virtio-gpu-pci: This extends VirtioPCIProxy.
345  */
346 #define TYPE_VIRTIO_GPU_PCI "virtio-gpu-pci"
347 #define VIRTIO_GPU_PCI(obj) \
348         OBJECT_CHECK(VirtIOGPUPCI, (obj), TYPE_VIRTIO_GPU_PCI)
349 
350 struct VirtIOGPUPCI {
351     VirtIOPCIProxy parent_obj;
352     VirtIOGPU vdev;
353 };
354 
355 #ifdef CONFIG_VHOST_VSOCK
356 /*
357  * vhost-vsock-pci: This extends VirtioPCIProxy.
358  */
359 #define TYPE_VHOST_VSOCK_PCI "vhost-vsock-pci"
360 #define VHOST_VSOCK_PCI(obj) \
361         OBJECT_CHECK(VHostVSockPCI, (obj), TYPE_VHOST_VSOCK_PCI)
362 
363 struct VHostVSockPCI {
364     VirtIOPCIProxy parent_obj;
365     VHostVSock vdev;
366 };
367 #endif
368 
369 /*
370  * virtio-crypto-pci: This extends VirtioPCIProxy.
371  */
372 #define TYPE_VIRTIO_CRYPTO_PCI "virtio-crypto-pci"
373 #define VIRTIO_CRYPTO_PCI(obj) \
374         OBJECT_CHECK(VirtIOCryptoPCI, (obj), TYPE_VIRTIO_CRYPTO_PCI)
375 
376 struct VirtIOCryptoPCI {
377     VirtIOPCIProxy parent_obj;
378     VirtIOCrypto vdev;
379 };
380 
381 /* Virtio ABI version, if we increment this, we break the guest driver. */
382 #define VIRTIO_PCI_ABI_VERSION          0
383 
384 #endif
385