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_idx; 147 uint32_t msix_bar_idx; 148 uint32_t modern_io_bar_idx; 149 uint32_t modern_mem_bar_idx; 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 VirtIOIRQFD *vector_irqfd; 162 int nvqs_with_notifiers; 163 VirtioBusState bus; 164 }; 165 166 static inline bool virtio_pci_modern(VirtIOPCIProxy *proxy) 167 { 168 return !proxy->disable_modern; 169 } 170 171 static inline bool virtio_pci_legacy(VirtIOPCIProxy *proxy) 172 { 173 return proxy->disable_legacy == ON_OFF_AUTO_OFF; 174 } 175 176 static inline void virtio_pci_force_virtio_1(VirtIOPCIProxy *proxy) 177 { 178 proxy->disable_modern = false; 179 proxy->disable_legacy = ON_OFF_AUTO_ON; 180 } 181 182 static inline void virtio_pci_disable_modern(VirtIOPCIProxy *proxy) 183 { 184 proxy->disable_modern = true; 185 } 186 187 /* 188 * virtio-scsi-pci: This extends VirtioPCIProxy. 189 */ 190 #define TYPE_VIRTIO_SCSI_PCI "virtio-scsi-pci" 191 #define VIRTIO_SCSI_PCI(obj) \ 192 OBJECT_CHECK(VirtIOSCSIPCI, (obj), TYPE_VIRTIO_SCSI_PCI) 193 194 struct VirtIOSCSIPCI { 195 VirtIOPCIProxy parent_obj; 196 VirtIOSCSI vdev; 197 }; 198 199 #ifdef CONFIG_VHOST_SCSI 200 /* 201 * vhost-scsi-pci: This extends VirtioPCIProxy. 202 */ 203 #define TYPE_VHOST_SCSI_PCI "vhost-scsi-pci" 204 #define VHOST_SCSI_PCI(obj) \ 205 OBJECT_CHECK(VHostSCSIPCI, (obj), TYPE_VHOST_SCSI_PCI) 206 207 struct VHostSCSIPCI { 208 VirtIOPCIProxy parent_obj; 209 VHostSCSI vdev; 210 }; 211 #endif 212 213 /* 214 * virtio-blk-pci: This extends VirtioPCIProxy. 215 */ 216 #define TYPE_VIRTIO_BLK_PCI "virtio-blk-pci" 217 #define VIRTIO_BLK_PCI(obj) \ 218 OBJECT_CHECK(VirtIOBlkPCI, (obj), TYPE_VIRTIO_BLK_PCI) 219 220 struct VirtIOBlkPCI { 221 VirtIOPCIProxy parent_obj; 222 VirtIOBlock vdev; 223 }; 224 225 /* 226 * virtio-balloon-pci: This extends VirtioPCIProxy. 227 */ 228 #define TYPE_VIRTIO_BALLOON_PCI "virtio-balloon-pci" 229 #define VIRTIO_BALLOON_PCI(obj) \ 230 OBJECT_CHECK(VirtIOBalloonPCI, (obj), TYPE_VIRTIO_BALLOON_PCI) 231 232 struct VirtIOBalloonPCI { 233 VirtIOPCIProxy parent_obj; 234 VirtIOBalloon vdev; 235 }; 236 237 /* 238 * virtio-serial-pci: This extends VirtioPCIProxy. 239 */ 240 #define TYPE_VIRTIO_SERIAL_PCI "virtio-serial-pci" 241 #define VIRTIO_SERIAL_PCI(obj) \ 242 OBJECT_CHECK(VirtIOSerialPCI, (obj), TYPE_VIRTIO_SERIAL_PCI) 243 244 struct VirtIOSerialPCI { 245 VirtIOPCIProxy parent_obj; 246 VirtIOSerial vdev; 247 }; 248 249 /* 250 * virtio-net-pci: This extends VirtioPCIProxy. 251 */ 252 #define TYPE_VIRTIO_NET_PCI "virtio-net-pci" 253 #define VIRTIO_NET_PCI(obj) \ 254 OBJECT_CHECK(VirtIONetPCI, (obj), TYPE_VIRTIO_NET_PCI) 255 256 struct VirtIONetPCI { 257 VirtIOPCIProxy parent_obj; 258 VirtIONet vdev; 259 }; 260 261 /* 262 * virtio-9p-pci: This extends VirtioPCIProxy. 263 */ 264 265 #ifdef CONFIG_VIRTFS 266 267 #define TYPE_VIRTIO_9P_PCI "virtio-9p-pci" 268 #define VIRTIO_9P_PCI(obj) \ 269 OBJECT_CHECK(V9fsPCIState, (obj), TYPE_VIRTIO_9P_PCI) 270 271 typedef struct V9fsPCIState { 272 VirtIOPCIProxy parent_obj; 273 V9fsVirtioState vdev; 274 } V9fsPCIState; 275 276 #endif 277 278 /* 279 * virtio-rng-pci: This extends VirtioPCIProxy. 280 */ 281 #define TYPE_VIRTIO_RNG_PCI "virtio-rng-pci" 282 #define VIRTIO_RNG_PCI(obj) \ 283 OBJECT_CHECK(VirtIORngPCI, (obj), TYPE_VIRTIO_RNG_PCI) 284 285 struct VirtIORngPCI { 286 VirtIOPCIProxy parent_obj; 287 VirtIORNG vdev; 288 }; 289 290 /* 291 * virtio-input-pci: This extends VirtioPCIProxy. 292 */ 293 #define TYPE_VIRTIO_INPUT_PCI "virtio-input-pci" 294 #define VIRTIO_INPUT_PCI(obj) \ 295 OBJECT_CHECK(VirtIOInputPCI, (obj), TYPE_VIRTIO_INPUT_PCI) 296 297 struct VirtIOInputPCI { 298 VirtIOPCIProxy parent_obj; 299 VirtIOInput vdev; 300 }; 301 302 #define TYPE_VIRTIO_INPUT_HID_PCI "virtio-input-hid-pci" 303 #define TYPE_VIRTIO_KEYBOARD_PCI "virtio-keyboard-pci" 304 #define TYPE_VIRTIO_MOUSE_PCI "virtio-mouse-pci" 305 #define TYPE_VIRTIO_TABLET_PCI "virtio-tablet-pci" 306 #define VIRTIO_INPUT_HID_PCI(obj) \ 307 OBJECT_CHECK(VirtIOInputHIDPCI, (obj), TYPE_VIRTIO_INPUT_HID_PCI) 308 309 struct VirtIOInputHIDPCI { 310 VirtIOPCIProxy parent_obj; 311 VirtIOInputHID vdev; 312 }; 313 314 #ifdef CONFIG_LINUX 315 316 #define TYPE_VIRTIO_INPUT_HOST_PCI "virtio-input-host-pci" 317 #define VIRTIO_INPUT_HOST_PCI(obj) \ 318 OBJECT_CHECK(VirtIOInputHostPCI, (obj), TYPE_VIRTIO_INPUT_HOST_PCI) 319 320 struct VirtIOInputHostPCI { 321 VirtIOPCIProxy parent_obj; 322 VirtIOInputHost vdev; 323 }; 324 325 #endif 326 327 /* 328 * virtio-gpu-pci: This extends VirtioPCIProxy. 329 */ 330 #define TYPE_VIRTIO_GPU_PCI "virtio-gpu-pci" 331 #define VIRTIO_GPU_PCI(obj) \ 332 OBJECT_CHECK(VirtIOGPUPCI, (obj), TYPE_VIRTIO_GPU_PCI) 333 334 struct VirtIOGPUPCI { 335 VirtIOPCIProxy parent_obj; 336 VirtIOGPU vdev; 337 }; 338 339 #ifdef CONFIG_VHOST_VSOCK 340 /* 341 * vhost-vsock-pci: This extends VirtioPCIProxy. 342 */ 343 #define TYPE_VHOST_VSOCK_PCI "vhost-vsock-pci" 344 #define VHOST_VSOCK_PCI(obj) \ 345 OBJECT_CHECK(VHostVSockPCI, (obj), TYPE_VHOST_VSOCK_PCI) 346 347 struct VHostVSockPCI { 348 VirtIOPCIProxy parent_obj; 349 VHostVSock vdev; 350 }; 351 #endif 352 353 /* Virtio ABI version, if we increment this, we break the guest driver. */ 354 #define VIRTIO_PCI_ABI_VERSION 0 355 356 #endif 357