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