1
2
3
4
5
6
7
8
9
10
11
12
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#include "hw/virtio/vhost-user-scsi.h"
30#if defined(CONFIG_VHOST_USER) && defined(CONFIG_LINUX)
31#include "hw/virtio/vhost-user-blk.h"
32#endif
33
34#ifdef CONFIG_VIRTFS
35#include "hw/9pfs/virtio-9p.h"
36#endif
37#ifdef CONFIG_VHOST_SCSI
38#include "hw/virtio/vhost-scsi.h"
39#endif
40#ifdef CONFIG_VHOST_VSOCK
41#include "hw/virtio/vhost-vsock.h"
42#endif
43
44typedef struct VirtIOPCIProxy VirtIOPCIProxy;
45typedef struct VirtIOBlkPCI VirtIOBlkPCI;
46typedef struct VirtIOSCSIPCI VirtIOSCSIPCI;
47typedef struct VirtIOBalloonPCI VirtIOBalloonPCI;
48typedef struct VirtIOSerialPCI VirtIOSerialPCI;
49typedef struct VirtIONetPCI VirtIONetPCI;
50typedef struct VHostSCSIPCI VHostSCSIPCI;
51typedef struct VHostUserSCSIPCI VHostUserSCSIPCI;
52typedef struct VHostUserBlkPCI VHostUserBlkPCI;
53typedef struct VirtIORngPCI VirtIORngPCI;
54typedef struct VirtIOInputPCI VirtIOInputPCI;
55typedef struct VirtIOInputHIDPCI VirtIOInputHIDPCI;
56typedef struct VirtIOInputHostPCI VirtIOInputHostPCI;
57typedef struct VirtIOGPUPCI VirtIOGPUPCI;
58typedef struct VHostVSockPCI VHostVSockPCI;
59typedef struct VirtIOCryptoPCI VirtIOCryptoPCI;
60
61
62
63typedef struct VirtioBusState VirtioPCIBusState;
64typedef struct VirtioBusClass VirtioPCIBusClass;
65
66#define TYPE_VIRTIO_PCI_BUS "virtio-pci-bus"
67#define VIRTIO_PCI_BUS(obj) \
68 OBJECT_CHECK(VirtioPCIBusState, (obj), TYPE_VIRTIO_PCI_BUS)
69#define VIRTIO_PCI_BUS_GET_CLASS(obj) \
70 OBJECT_GET_CLASS(VirtioPCIBusClass, obj, TYPE_VIRTIO_PCI_BUS)
71#define VIRTIO_PCI_BUS_CLASS(klass) \
72 OBJECT_CLASS_CHECK(VirtioPCIBusClass, klass, TYPE_VIRTIO_PCI_BUS)
73
74enum {
75 VIRTIO_PCI_FLAG_BUS_MASTER_BUG_MIGRATION_BIT,
76 VIRTIO_PCI_FLAG_USE_IOEVENTFD_BIT,
77 VIRTIO_PCI_FLAG_MIGRATE_EXTRA_BIT,
78 VIRTIO_PCI_FLAG_MODERN_PIO_NOTIFY_BIT,
79 VIRTIO_PCI_FLAG_DISABLE_PCIE_BIT,
80 VIRTIO_PCI_FLAG_PAGE_PER_VQ_BIT,
81 VIRTIO_PCI_FLAG_ATS_BIT,
82 VIRTIO_PCI_FLAG_INIT_DEVERR_BIT,
83 VIRTIO_PCI_FLAG_INIT_LNKCTL_BIT,
84 VIRTIO_PCI_FLAG_INIT_PM_BIT,
85};
86
87
88#define VIRTIO_PCI_FLAG_BUS_MASTER_BUG_MIGRATION \
89 (1 << VIRTIO_PCI_FLAG_BUS_MASTER_BUG_MIGRATION_BIT)
90
91
92
93#define VIRTIO_PCI_FLAG_USE_IOEVENTFD (1 << VIRTIO_PCI_FLAG_USE_IOEVENTFD_BIT)
94
95
96#define VIRTIO_PCI_FLAG_DISABLE_PCIE (1 << VIRTIO_PCI_FLAG_DISABLE_PCIE_BIT)
97
98
99#define VIRTIO_PCI_FLAG_MIGRATE_EXTRA (1 << VIRTIO_PCI_FLAG_MIGRATE_EXTRA_BIT)
100
101
102#define VIRTIO_PCI_FLAG_MODERN_PIO_NOTIFY \
103 (1 << VIRTIO_PCI_FLAG_MODERN_PIO_NOTIFY_BIT)
104
105
106#define VIRTIO_PCI_FLAG_PAGE_PER_VQ \
107 (1 << VIRTIO_PCI_FLAG_PAGE_PER_VQ_BIT)
108
109
110#define VIRTIO_PCI_FLAG_ATS (1 << VIRTIO_PCI_FLAG_ATS_BIT)
111
112
113#define VIRTIO_PCI_FLAG_INIT_DEVERR (1 << VIRTIO_PCI_FLAG_INIT_DEVERR_BIT)
114
115
116#define VIRTIO_PCI_FLAG_INIT_LNKCTL (1 << VIRTIO_PCI_FLAG_INIT_LNKCTL_BIT)
117
118
119#define VIRTIO_PCI_FLAG_INIT_PM (1 << VIRTIO_PCI_FLAG_INIT_PM_BIT)
120
121typedef struct {
122 MSIMessage msg;
123 int virq;
124 unsigned int users;
125} VirtIOIRQFD;
126
127
128
129
130#define TYPE_VIRTIO_PCI "virtio-pci"
131#define VIRTIO_PCI_GET_CLASS(obj) \
132 OBJECT_GET_CLASS(VirtioPCIClass, obj, TYPE_VIRTIO_PCI)
133#define VIRTIO_PCI_CLASS(klass) \
134 OBJECT_CLASS_CHECK(VirtioPCIClass, klass, TYPE_VIRTIO_PCI)
135#define VIRTIO_PCI(obj) \
136 OBJECT_CHECK(VirtIOPCIProxy, (obj), TYPE_VIRTIO_PCI)
137
138typedef struct VirtioPCIClass {
139 PCIDeviceClass parent_class;
140 DeviceRealize parent_dc_realize;
141 void (*realize)(VirtIOPCIProxy *vpci_dev, Error **errp);
142} VirtioPCIClass;
143
144typedef struct VirtIOPCIRegion {
145 MemoryRegion mr;
146 uint32_t offset;
147 uint32_t size;
148 uint32_t type;
149} VirtIOPCIRegion;
150
151typedef struct VirtIOPCIQueue {
152 uint16_t num;
153 bool enabled;
154 uint32_t desc[2];
155 uint32_t avail[2];
156 uint32_t used[2];
157} VirtIOPCIQueue;
158
159struct VirtIOPCIProxy {
160 PCIDevice pci_dev;
161 MemoryRegion bar;
162 union {
163 struct {
164 VirtIOPCIRegion common;
165 VirtIOPCIRegion isr;
166 VirtIOPCIRegion device;
167 VirtIOPCIRegion notify;
168 VirtIOPCIRegion notify_pio;
169 };
170 VirtIOPCIRegion regs[5];
171 };
172 MemoryRegion modern_bar;
173 MemoryRegion io_bar;
174 uint32_t legacy_io_bar_idx;
175 uint32_t msix_bar_idx;
176 uint32_t modern_io_bar_idx;
177 uint32_t modern_mem_bar_idx;
178 int config_cap;
179 uint32_t flags;
180 bool disable_modern;
181 bool ignore_backend_features;
182 OnOffAuto disable_legacy;
183 uint32_t class_code;
184 uint32_t nvectors;
185 uint32_t dfselect;
186 uint32_t gfselect;
187 uint32_t guest_features[2];
188 VirtIOPCIQueue vqs[VIRTIO_QUEUE_MAX];
189
190 VirtIOIRQFD *vector_irqfd;
191 int nvqs_with_notifiers;
192 VirtioBusState bus;
193};
194
195static inline bool virtio_pci_modern(VirtIOPCIProxy *proxy)
196{
197 return !proxy->disable_modern;
198}
199
200static inline bool virtio_pci_legacy(VirtIOPCIProxy *proxy)
201{
202 return proxy->disable_legacy == ON_OFF_AUTO_OFF;
203}
204
205static inline void virtio_pci_force_virtio_1(VirtIOPCIProxy *proxy)
206{
207 proxy->disable_modern = false;
208 proxy->disable_legacy = ON_OFF_AUTO_ON;
209}
210
211static inline void virtio_pci_disable_modern(VirtIOPCIProxy *proxy)
212{
213 proxy->disable_modern = true;
214}
215
216
217
218
219#define TYPE_VIRTIO_SCSI_PCI "virtio-scsi-pci"
220#define VIRTIO_SCSI_PCI(obj) \
221 OBJECT_CHECK(VirtIOSCSIPCI, (obj), TYPE_VIRTIO_SCSI_PCI)
222
223struct VirtIOSCSIPCI {
224 VirtIOPCIProxy parent_obj;
225 VirtIOSCSI vdev;
226};
227
228#ifdef CONFIG_VHOST_SCSI
229
230
231
232#define TYPE_VHOST_SCSI_PCI "vhost-scsi-pci"
233#define VHOST_SCSI_PCI(obj) \
234 OBJECT_CHECK(VHostSCSIPCI, (obj), TYPE_VHOST_SCSI_PCI)
235
236struct VHostSCSIPCI {
237 VirtIOPCIProxy parent_obj;
238 VHostSCSI vdev;
239};
240#endif
241
242#define TYPE_VHOST_USER_SCSI_PCI "vhost-user-scsi-pci"
243#define VHOST_USER_SCSI_PCI(obj) \
244 OBJECT_CHECK(VHostUserSCSIPCI, (obj), TYPE_VHOST_USER_SCSI_PCI)
245
246struct VHostUserSCSIPCI {
247 VirtIOPCIProxy parent_obj;
248 VHostUserSCSI vdev;
249};
250
251#if defined(CONFIG_VHOST_USER) && defined(CONFIG_LINUX)
252
253
254
255#define TYPE_VHOST_USER_BLK_PCI "vhost-user-blk-pci"
256#define VHOST_USER_BLK_PCI(obj) \
257 OBJECT_CHECK(VHostUserBlkPCI, (obj), TYPE_VHOST_USER_BLK_PCI)
258
259struct VHostUserBlkPCI {
260 VirtIOPCIProxy parent_obj;
261 VHostUserBlk vdev;
262};
263#endif
264
265
266
267
268#define TYPE_VIRTIO_BLK_PCI "virtio-blk-pci"
269#define VIRTIO_BLK_PCI(obj) \
270 OBJECT_CHECK(VirtIOBlkPCI, (obj), TYPE_VIRTIO_BLK_PCI)
271
272struct VirtIOBlkPCI {
273 VirtIOPCIProxy parent_obj;
274 VirtIOBlock vdev;
275};
276
277
278
279
280#define TYPE_VIRTIO_BALLOON_PCI "virtio-balloon-pci"
281#define VIRTIO_BALLOON_PCI(obj) \
282 OBJECT_CHECK(VirtIOBalloonPCI, (obj), TYPE_VIRTIO_BALLOON_PCI)
283
284struct VirtIOBalloonPCI {
285 VirtIOPCIProxy parent_obj;
286 VirtIOBalloon vdev;
287};
288
289
290
291
292#define TYPE_VIRTIO_SERIAL_PCI "virtio-serial-pci"
293#define VIRTIO_SERIAL_PCI(obj) \
294 OBJECT_CHECK(VirtIOSerialPCI, (obj), TYPE_VIRTIO_SERIAL_PCI)
295
296struct VirtIOSerialPCI {
297 VirtIOPCIProxy parent_obj;
298 VirtIOSerial vdev;
299};
300
301
302
303
304#define TYPE_VIRTIO_NET_PCI "virtio-net-pci"
305#define VIRTIO_NET_PCI(obj) \
306 OBJECT_CHECK(VirtIONetPCI, (obj), TYPE_VIRTIO_NET_PCI)
307
308struct VirtIONetPCI {
309 VirtIOPCIProxy parent_obj;
310 VirtIONet vdev;
311};
312
313
314
315
316
317#ifdef CONFIG_VIRTFS
318
319#define TYPE_VIRTIO_9P_PCI "virtio-9p-pci"
320#define VIRTIO_9P_PCI(obj) \
321 OBJECT_CHECK(V9fsPCIState, (obj), TYPE_VIRTIO_9P_PCI)
322
323typedef struct V9fsPCIState {
324 VirtIOPCIProxy parent_obj;
325 V9fsVirtioState vdev;
326} V9fsPCIState;
327
328#endif
329
330
331
332
333#define TYPE_VIRTIO_RNG_PCI "virtio-rng-pci"
334#define VIRTIO_RNG_PCI(obj) \
335 OBJECT_CHECK(VirtIORngPCI, (obj), TYPE_VIRTIO_RNG_PCI)
336
337struct VirtIORngPCI {
338 VirtIOPCIProxy parent_obj;
339 VirtIORNG vdev;
340};
341
342
343
344
345#define TYPE_VIRTIO_INPUT_PCI "virtio-input-pci"
346#define VIRTIO_INPUT_PCI(obj) \
347 OBJECT_CHECK(VirtIOInputPCI, (obj), TYPE_VIRTIO_INPUT_PCI)
348
349struct VirtIOInputPCI {
350 VirtIOPCIProxy parent_obj;
351 VirtIOInput vdev;
352};
353
354#define TYPE_VIRTIO_INPUT_HID_PCI "virtio-input-hid-pci"
355#define TYPE_VIRTIO_KEYBOARD_PCI "virtio-keyboard-pci"
356#define TYPE_VIRTIO_MOUSE_PCI "virtio-mouse-pci"
357#define TYPE_VIRTIO_TABLET_PCI "virtio-tablet-pci"
358#define VIRTIO_INPUT_HID_PCI(obj) \
359 OBJECT_CHECK(VirtIOInputHIDPCI, (obj), TYPE_VIRTIO_INPUT_HID_PCI)
360
361struct VirtIOInputHIDPCI {
362 VirtIOPCIProxy parent_obj;
363 VirtIOInputHID vdev;
364};
365
366#ifdef CONFIG_LINUX
367
368#define TYPE_VIRTIO_INPUT_HOST_PCI "virtio-input-host-pci"
369#define VIRTIO_INPUT_HOST_PCI(obj) \
370 OBJECT_CHECK(VirtIOInputHostPCI, (obj), TYPE_VIRTIO_INPUT_HOST_PCI)
371
372struct VirtIOInputHostPCI {
373 VirtIOPCIProxy parent_obj;
374 VirtIOInputHost vdev;
375};
376
377#endif
378
379
380
381
382#define TYPE_VIRTIO_GPU_PCI "virtio-gpu-pci"
383#define VIRTIO_GPU_PCI(obj) \
384 OBJECT_CHECK(VirtIOGPUPCI, (obj), TYPE_VIRTIO_GPU_PCI)
385
386struct VirtIOGPUPCI {
387 VirtIOPCIProxy parent_obj;
388 VirtIOGPU vdev;
389};
390
391#ifdef CONFIG_VHOST_VSOCK
392
393
394
395#define TYPE_VHOST_VSOCK_PCI "vhost-vsock-pci"
396#define VHOST_VSOCK_PCI(obj) \
397 OBJECT_CHECK(VHostVSockPCI, (obj), TYPE_VHOST_VSOCK_PCI)
398
399struct VHostVSockPCI {
400 VirtIOPCIProxy parent_obj;
401 VHostVSock vdev;
402};
403#endif
404
405
406
407
408#define TYPE_VIRTIO_CRYPTO_PCI "virtio-crypto-pci"
409#define VIRTIO_CRYPTO_PCI(obj) \
410 OBJECT_CHECK(VirtIOCryptoPCI, (obj), TYPE_VIRTIO_CRYPTO_PCI)
411
412struct VirtIOCryptoPCI {
413 VirtIOPCIProxy parent_obj;
414 VirtIOCrypto vdev;
415};
416
417
418#define VIRTIO_PCI_ABI_VERSION 0
419
420#endif
421