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