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#ifdef CONFIG_VIRTFS
29#include "hw/9pfs/virtio-9p.h"
30#endif
31#ifdef CONFIG_VHOST_SCSI
32#include "hw/virtio/vhost-scsi.h"
33#endif
34
35typedef struct VirtIOPCIProxy VirtIOPCIProxy;
36typedef struct VirtIOBlkPCI VirtIOBlkPCI;
37typedef struct VirtIOSCSIPCI VirtIOSCSIPCI;
38typedef struct VirtIOBalloonPCI VirtIOBalloonPCI;
39typedef struct VirtIOSerialPCI VirtIOSerialPCI;
40typedef struct VirtIONetPCI VirtIONetPCI;
41typedef struct VHostSCSIPCI VHostSCSIPCI;
42typedef struct VirtIORngPCI VirtIORngPCI;
43typedef struct VirtIOInputPCI VirtIOInputPCI;
44typedef struct VirtIOInputHIDPCI VirtIOInputHIDPCI;
45typedef struct VirtIOInputHostPCI VirtIOInputHostPCI;
46typedef struct VirtIOGPUPCI VirtIOGPUPCI;
47
48
49
50typedef struct VirtioBusState VirtioPCIBusState;
51typedef struct VirtioBusClass VirtioPCIBusClass;
52
53#define TYPE_VIRTIO_PCI_BUS "virtio-pci-bus"
54#define VIRTIO_PCI_BUS(obj) \
55 OBJECT_CHECK(VirtioPCIBusState, (obj), TYPE_VIRTIO_PCI_BUS)
56#define VIRTIO_PCI_BUS_GET_CLASS(obj) \
57 OBJECT_GET_CLASS(VirtioPCIBusClass, obj, TYPE_VIRTIO_PCI_BUS)
58#define VIRTIO_PCI_BUS_CLASS(klass) \
59 OBJECT_CLASS_CHECK(VirtioPCIBusClass, klass, TYPE_VIRTIO_PCI_BUS)
60
61enum {
62 VIRTIO_PCI_FLAG_BUS_MASTER_BUG_MIGRATION_BIT,
63 VIRTIO_PCI_FLAG_USE_IOEVENTFD_BIT,
64 VIRTIO_PCI_FLAG_MIGRATE_EXTRA_BIT,
65 VIRTIO_PCI_FLAG_MODERN_PIO_NOTIFY_BIT,
66 VIRTIO_PCI_FLAG_DISABLE_PCIE_BIT,
67};
68
69
70#define VIRTIO_PCI_FLAG_BUS_MASTER_BUG_MIGRATION \
71 (1 << VIRTIO_PCI_FLAG_BUS_MASTER_BUG_MIGRATION_BIT)
72
73
74
75#define VIRTIO_PCI_FLAG_USE_IOEVENTFD (1 << VIRTIO_PCI_FLAG_USE_IOEVENTFD_BIT)
76
77
78#define VIRTIO_PCI_FLAG_DISABLE_PCIE (1 << VIRTIO_PCI_FLAG_DISABLE_PCIE_BIT)
79
80
81#define VIRTIO_PCI_FLAG_MIGRATE_EXTRA (1 << VIRTIO_PCI_FLAG_MIGRATE_EXTRA_BIT)
82
83
84#define VIRTIO_PCI_FLAG_MODERN_PIO_NOTIFY \
85 (1 << VIRTIO_PCI_FLAG_MODERN_PIO_NOTIFY_BIT)
86
87typedef struct {
88 MSIMessage msg;
89 int virq;
90 unsigned int users;
91} VirtIOIRQFD;
92
93
94
95
96#define TYPE_VIRTIO_PCI "virtio-pci"
97#define VIRTIO_PCI_GET_CLASS(obj) \
98 OBJECT_GET_CLASS(VirtioPCIClass, obj, TYPE_VIRTIO_PCI)
99#define VIRTIO_PCI_CLASS(klass) \
100 OBJECT_CLASS_CHECK(VirtioPCIClass, klass, TYPE_VIRTIO_PCI)
101#define VIRTIO_PCI(obj) \
102 OBJECT_CHECK(VirtIOPCIProxy, (obj), TYPE_VIRTIO_PCI)
103
104typedef struct VirtioPCIClass {
105 PCIDeviceClass parent_class;
106 DeviceRealize parent_dc_realize;
107 void (*realize)(VirtIOPCIProxy *vpci_dev, Error **errp);
108} VirtioPCIClass;
109
110typedef struct VirtIOPCIRegion {
111 MemoryRegion mr;
112 uint32_t offset;
113 uint32_t size;
114 uint32_t type;
115} VirtIOPCIRegion;
116
117typedef struct VirtIOPCIQueue {
118 uint16_t num;
119 bool enabled;
120 uint32_t desc[2];
121 uint32_t avail[2];
122 uint32_t used[2];
123} VirtIOPCIQueue;
124
125struct VirtIOPCIProxy {
126 PCIDevice pci_dev;
127 MemoryRegion bar;
128 VirtIOPCIRegion common;
129 VirtIOPCIRegion isr;
130 VirtIOPCIRegion device;
131 VirtIOPCIRegion notify;
132 VirtIOPCIRegion notify_pio;
133 MemoryRegion modern_bar;
134 MemoryRegion io_bar;
135 MemoryRegion modern_cfg;
136 AddressSpace modern_as;
137 uint32_t legacy_io_bar;
138 uint32_t msix_bar;
139 uint32_t modern_io_bar;
140 uint32_t modern_mem_bar;
141 int config_cap;
142 uint32_t flags;
143 bool disable_modern;
144 OnOffAuto disable_legacy;
145 uint32_t class_code;
146 uint32_t nvectors;
147 uint32_t dfselect;
148 uint32_t gfselect;
149 uint32_t guest_features[2];
150 VirtIOPCIQueue vqs[VIRTIO_QUEUE_MAX];
151
152 bool ioeventfd_disabled;
153 bool ioeventfd_started;
154 VirtIOIRQFD *vector_irqfd;
155 int nvqs_with_notifiers;
156 VirtioBusState bus;
157};
158
159static inline bool virtio_pci_modern(VirtIOPCIProxy *proxy)
160{
161 return !proxy->disable_modern;
162}
163
164static inline bool virtio_pci_legacy(VirtIOPCIProxy *proxy)
165{
166 return proxy->disable_legacy == ON_OFF_AUTO_OFF;
167}
168
169static inline void virtio_pci_force_virtio_1(VirtIOPCIProxy *proxy)
170{
171 proxy->disable_modern = false;
172 proxy->disable_legacy = ON_OFF_AUTO_ON;
173}
174
175
176
177
178#define TYPE_VIRTIO_SCSI_PCI "virtio-scsi-pci"
179#define VIRTIO_SCSI_PCI(obj) \
180 OBJECT_CHECK(VirtIOSCSIPCI, (obj), TYPE_VIRTIO_SCSI_PCI)
181
182struct VirtIOSCSIPCI {
183 VirtIOPCIProxy parent_obj;
184 VirtIOSCSI vdev;
185};
186
187#ifdef CONFIG_VHOST_SCSI
188
189
190
191#define TYPE_VHOST_SCSI_PCI "vhost-scsi-pci"
192#define VHOST_SCSI_PCI(obj) \
193 OBJECT_CHECK(VHostSCSIPCI, (obj), TYPE_VHOST_SCSI_PCI)
194
195struct VHostSCSIPCI {
196 VirtIOPCIProxy parent_obj;
197 VHostSCSI vdev;
198};
199#endif
200
201
202
203
204#define TYPE_VIRTIO_BLK_PCI "virtio-blk-pci"
205#define VIRTIO_BLK_PCI(obj) \
206 OBJECT_CHECK(VirtIOBlkPCI, (obj), TYPE_VIRTIO_BLK_PCI)
207
208struct VirtIOBlkPCI {
209 VirtIOPCIProxy parent_obj;
210 VirtIOBlock vdev;
211};
212
213
214
215
216#define TYPE_VIRTIO_BALLOON_PCI "virtio-balloon-pci"
217#define VIRTIO_BALLOON_PCI(obj) \
218 OBJECT_CHECK(VirtIOBalloonPCI, (obj), TYPE_VIRTIO_BALLOON_PCI)
219
220struct VirtIOBalloonPCI {
221 VirtIOPCIProxy parent_obj;
222 VirtIOBalloon vdev;
223};
224
225
226
227
228#define TYPE_VIRTIO_SERIAL_PCI "virtio-serial-pci"
229#define VIRTIO_SERIAL_PCI(obj) \
230 OBJECT_CHECK(VirtIOSerialPCI, (obj), TYPE_VIRTIO_SERIAL_PCI)
231
232struct VirtIOSerialPCI {
233 VirtIOPCIProxy parent_obj;
234 VirtIOSerial vdev;
235};
236
237
238
239
240#define TYPE_VIRTIO_NET_PCI "virtio-net-pci"
241#define VIRTIO_NET_PCI(obj) \
242 OBJECT_CHECK(VirtIONetPCI, (obj), TYPE_VIRTIO_NET_PCI)
243
244struct VirtIONetPCI {
245 VirtIOPCIProxy parent_obj;
246 VirtIONet vdev;
247};
248
249
250
251
252
253#ifdef CONFIG_VIRTFS
254
255#define TYPE_VIRTIO_9P_PCI "virtio-9p-pci"
256#define VIRTIO_9P_PCI(obj) \
257 OBJECT_CHECK(V9fsPCIState, (obj), TYPE_VIRTIO_9P_PCI)
258
259typedef struct V9fsPCIState {
260 VirtIOPCIProxy parent_obj;
261 V9fsVirtioState vdev;
262} V9fsPCIState;
263
264#endif
265
266
267
268
269#define TYPE_VIRTIO_RNG_PCI "virtio-rng-pci"
270#define VIRTIO_RNG_PCI(obj) \
271 OBJECT_CHECK(VirtIORngPCI, (obj), TYPE_VIRTIO_RNG_PCI)
272
273struct VirtIORngPCI {
274 VirtIOPCIProxy parent_obj;
275 VirtIORNG vdev;
276};
277
278
279
280
281#define TYPE_VIRTIO_INPUT_PCI "virtio-input-pci"
282#define VIRTIO_INPUT_PCI(obj) \
283 OBJECT_CHECK(VirtIOInputPCI, (obj), TYPE_VIRTIO_INPUT_PCI)
284
285struct VirtIOInputPCI {
286 VirtIOPCIProxy parent_obj;
287 VirtIOInput vdev;
288};
289
290#define TYPE_VIRTIO_INPUT_HID_PCI "virtio-input-hid-pci"
291#define TYPE_VIRTIO_KEYBOARD_PCI "virtio-keyboard-pci"
292#define TYPE_VIRTIO_MOUSE_PCI "virtio-mouse-pci"
293#define TYPE_VIRTIO_TABLET_PCI "virtio-tablet-pci"
294#define VIRTIO_INPUT_HID_PCI(obj) \
295 OBJECT_CHECK(VirtIOInputHIDPCI, (obj), TYPE_VIRTIO_INPUT_HID_PCI)
296
297struct VirtIOInputHIDPCI {
298 VirtIOPCIProxy parent_obj;
299 VirtIOInputHID vdev;
300};
301
302#ifdef CONFIG_LINUX
303
304#define TYPE_VIRTIO_INPUT_HOST_PCI "virtio-input-host-pci"
305#define VIRTIO_INPUT_HOST_PCI(obj) \
306 OBJECT_CHECK(VirtIOInputHostPCI, (obj), TYPE_VIRTIO_INPUT_HOST_PCI)
307
308struct VirtIOInputHostPCI {
309 VirtIOPCIProxy parent_obj;
310 VirtIOInputHost vdev;
311};
312
313#endif
314
315
316
317
318#define TYPE_VIRTIO_GPU_PCI "virtio-gpu-pci"
319#define VIRTIO_GPU_PCI(obj) \
320 OBJECT_CHECK(VirtIOGPUPCI, (obj), TYPE_VIRTIO_GPU_PCI)
321
322struct VirtIOGPUPCI {
323 VirtIOPCIProxy parent_obj;
324 VirtIOGPU vdev;
325};
326
327
328#define VIRTIO_PCI_ABI_VERSION 0
329
330#endif
331