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