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