virtio-pci.h 10.7 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
/*
 * Virtio PCI Bindings
 *
 * Copyright IBM, Corp. 2007
 * Copyright (c) 2009 CodeSourcery
 *
 * Authors:
 *  Anthony Liguori   <aliguori@us.ibm.com>
 *  Paul Brook        <paul@codesourcery.com>
 *
 * This work is licensed under the terms of the GNU GPL, version 2.  See
 * the COPYING file in the top-level directory.
 */

#ifndef QEMU_VIRTIO_PCI_H
#define QEMU_VIRTIO_PCI_H

18
#include "hw/pci/msi.h"
P
Paolo Bonzini 已提交
19 20 21 22 23
#include "hw/virtio/virtio-blk.h"
#include "hw/virtio/virtio-net.h"
#include "hw/virtio/virtio-serial.h"
#include "hw/virtio/virtio-scsi.h"
#include "hw/virtio/virtio-bus.h"
24
#include "hw/virtio/virtio-gpu.h"
25
#include "hw/virtio/virtio-crypto.h"
26
#include "hw/virtio/vhost-user-scsi.h"
27 28 29
#if defined(CONFIG_VHOST_USER) && defined(CONFIG_LINUX)
#include "hw/virtio/vhost-user-blk.h"
#endif
30

31 32 33
#ifdef CONFIG_VIRTFS
#include "hw/9pfs/virtio-9p.h"
#endif
34 35 36
#ifdef CONFIG_VHOST_SCSI
#include "hw/virtio/vhost-scsi.h"
#endif
37

38
typedef struct VirtIOPCIProxy VirtIOPCIProxy;
39
typedef struct VirtIOBlkPCI VirtIOBlkPCI;
40
typedef struct VirtIOSCSIPCI VirtIOSCSIPCI;
41
typedef struct VirtIOSerialPCI VirtIOSerialPCI;
42
typedef struct VirtIONetPCI VirtIONetPCI;
43
typedef struct VHostSCSIPCI VHostSCSIPCI;
44
typedef struct VHostUserSCSIPCI VHostUserSCSIPCI;
45
typedef struct VHostUserBlkPCI VHostUserBlkPCI;
46
typedef struct VirtIOGPUPCI VirtIOGPUPCI;
47
typedef struct VirtIOCryptoPCI VirtIOCryptoPCI;
48

49 50 51 52 53 54 55 56 57 58 59 60
/* virtio-pci-bus */

typedef struct VirtioBusState VirtioPCIBusState;
typedef struct VirtioBusClass VirtioPCIBusClass;

#define TYPE_VIRTIO_PCI_BUS "virtio-pci-bus"
#define VIRTIO_PCI_BUS(obj) \
        OBJECT_CHECK(VirtioPCIBusState, (obj), TYPE_VIRTIO_PCI_BUS)
#define VIRTIO_PCI_BUS_GET_CLASS(obj) \
        OBJECT_GET_CLASS(VirtioPCIBusClass, obj, TYPE_VIRTIO_PCI_BUS)
#define VIRTIO_PCI_BUS_CLASS(klass) \
        OBJECT_CLASS_CHECK(VirtioPCIBusClass, klass, TYPE_VIRTIO_PCI_BUS)
61

62 63 64 65 66 67
enum {
    VIRTIO_PCI_FLAG_BUS_MASTER_BUG_MIGRATION_BIT,
    VIRTIO_PCI_FLAG_USE_IOEVENTFD_BIT,
    VIRTIO_PCI_FLAG_MIGRATE_EXTRA_BIT,
    VIRTIO_PCI_FLAG_MODERN_PIO_NOTIFY_BIT,
    VIRTIO_PCI_FLAG_DISABLE_PCIE_BIT,
68
    VIRTIO_PCI_FLAG_PAGE_PER_VQ_BIT,
69
    VIRTIO_PCI_FLAG_ATS_BIT,
70
    VIRTIO_PCI_FLAG_INIT_DEVERR_BIT,
71
    VIRTIO_PCI_FLAG_INIT_LNKCTL_BIT,
72
    VIRTIO_PCI_FLAG_INIT_PM_BIT,
73 74
};

75 76 77 78
/* Need to activate work-arounds for buggy guests at vmstate load. */
#define VIRTIO_PCI_FLAG_BUS_MASTER_BUG_MIGRATION \
    (1 << VIRTIO_PCI_FLAG_BUS_MASTER_BUG_MIGRATION_BIT)

A
Aneesh Kumar K.V 已提交
79 80 81 82
/* Performance improves when virtqueue kick processing is decoupled from the
 * vcpu thread using ioeventfd for some devices. */
#define VIRTIO_PCI_FLAG_USE_IOEVENTFD   (1 << VIRTIO_PCI_FLAG_USE_IOEVENTFD_BIT)

83
/* virtio version flags */
84
#define VIRTIO_PCI_FLAG_DISABLE_PCIE (1 << VIRTIO_PCI_FLAG_DISABLE_PCIE_BIT)
85

86 87 88
/* migrate extra state */
#define VIRTIO_PCI_FLAG_MIGRATE_EXTRA (1 << VIRTIO_PCI_FLAG_MIGRATE_EXTRA_BIT)

89 90 91 92
/* have pio notification for modern device ? */
#define VIRTIO_PCI_FLAG_MODERN_PIO_NOTIFY \
    (1 << VIRTIO_PCI_FLAG_MODERN_PIO_NOTIFY_BIT)

93 94 95 96
/* page per vq flag to be used by split drivers within guests */
#define VIRTIO_PCI_FLAG_PAGE_PER_VQ \
    (1 << VIRTIO_PCI_FLAG_PAGE_PER_VQ_BIT)

97 98 99
/* address space translation service */
#define VIRTIO_PCI_FLAG_ATS (1 << VIRTIO_PCI_FLAG_ATS_BIT)

100 101 102
/* Init error enabling flags */
#define VIRTIO_PCI_FLAG_INIT_DEVERR (1 << VIRTIO_PCI_FLAG_INIT_DEVERR_BIT)

103 104 105
/* Init Link Control register */
#define VIRTIO_PCI_FLAG_INIT_LNKCTL (1 << VIRTIO_PCI_FLAG_INIT_LNKCTL_BIT)

106 107 108
/* Init Power Management */
#define VIRTIO_PCI_FLAG_INIT_PM (1 << VIRTIO_PCI_FLAG_INIT_PM_BIT)

109
typedef struct {
110
    MSIMessage msg;
111 112 113 114
    int virq;
    unsigned int users;
} VirtIOIRQFD;

115 116 117 118 119 120 121 122 123 124 125 126 127
/*
 * virtio-pci: This is the PCIDevice which has a virtio-pci-bus.
 */
#define TYPE_VIRTIO_PCI "virtio-pci"
#define VIRTIO_PCI_GET_CLASS(obj) \
        OBJECT_GET_CLASS(VirtioPCIClass, obj, TYPE_VIRTIO_PCI)
#define VIRTIO_PCI_CLASS(klass) \
        OBJECT_CLASS_CHECK(VirtioPCIClass, klass, TYPE_VIRTIO_PCI)
#define VIRTIO_PCI(obj) \
        OBJECT_CHECK(VirtIOPCIProxy, (obj), TYPE_VIRTIO_PCI)

typedef struct VirtioPCIClass {
    PCIDeviceClass parent_class;
128
    DeviceRealize parent_dc_realize;
129
    void (*realize)(VirtIOPCIProxy *vpci_dev, Error **errp);
130 131
} VirtioPCIClass;

132 133
typedef struct VirtIOPCIRegion {
    MemoryRegion mr;
134
    uint32_t offset;
135
    uint32_t size;
136
    uint32_t type;
137 138
} VirtIOPCIRegion;

139 140 141 142 143 144 145 146
typedef struct VirtIOPCIQueue {
  uint16_t num;
  bool enabled;
  uint32_t desc[2];
  uint32_t avail[2];
  uint32_t used[2];
} VirtIOPCIQueue;

147
struct VirtIOPCIProxy {
148
    PCIDevice pci_dev;
A
Avi Kivity 已提交
149
    MemoryRegion bar;
150 151 152 153 154 155 156 157 158 159
    union {
        struct {
            VirtIOPCIRegion common;
            VirtIOPCIRegion isr;
            VirtIOPCIRegion device;
            VirtIOPCIRegion notify;
            VirtIOPCIRegion notify_pio;
        };
        VirtIOPCIRegion regs[5];
    };
160
    MemoryRegion modern_bar;
161
    MemoryRegion io_bar;
162 163 164 165
    uint32_t legacy_io_bar_idx;
    uint32_t msix_bar_idx;
    uint32_t modern_io_bar_idx;
    uint32_t modern_mem_bar_idx;
166
    int config_cap;
167
    uint32_t flags;
168
    bool disable_modern;
169
    bool ignore_backend_features;
170
    OnOffAuto disable_legacy;
171 172
    uint32_t class_code;
    uint32_t nvectors;
173 174 175
    uint32_t dfselect;
    uint32_t gfselect;
    uint32_t guest_features[2];
176
    VirtIOPCIQueue vqs[VIRTIO_QUEUE_MAX];
177

178
    VirtIOIRQFD *vector_irqfd;
179
    int nvqs_with_notifiers;
180 181
    VirtioBusState bus;
};
182

183 184 185 186 187 188 189 190 191 192 193 194 195 196 197
static inline bool virtio_pci_modern(VirtIOPCIProxy *proxy)
{
    return !proxy->disable_modern;
}

static inline bool virtio_pci_legacy(VirtIOPCIProxy *proxy)
{
    return proxy->disable_legacy == ON_OFF_AUTO_OFF;
}

static inline void virtio_pci_force_virtio_1(VirtIOPCIProxy *proxy)
{
    proxy->disable_modern = false;
    proxy->disable_legacy = ON_OFF_AUTO_ON;
}
198

199 200 201 202 203
static inline void virtio_pci_disable_modern(VirtIOPCIProxy *proxy)
{
    proxy->disable_modern = true;
}

204 205 206
/*
 * virtio-scsi-pci: This extends VirtioPCIProxy.
 */
207
#define TYPE_VIRTIO_SCSI_PCI "virtio-scsi-pci-base"
208 209 210 211 212 213 214 215
#define VIRTIO_SCSI_PCI(obj) \
        OBJECT_CHECK(VirtIOSCSIPCI, (obj), TYPE_VIRTIO_SCSI_PCI)

struct VirtIOSCSIPCI {
    VirtIOPCIProxy parent_obj;
    VirtIOSCSI vdev;
};

216 217 218 219
#ifdef CONFIG_VHOST_SCSI
/*
 * vhost-scsi-pci: This extends VirtioPCIProxy.
 */
220
#define TYPE_VHOST_SCSI_PCI "vhost-scsi-pci-base"
221 222 223 224 225 226 227 228 229
#define VHOST_SCSI_PCI(obj) \
        OBJECT_CHECK(VHostSCSIPCI, (obj), TYPE_VHOST_SCSI_PCI)

struct VHostSCSIPCI {
    VirtIOPCIProxy parent_obj;
    VHostSCSI vdev;
};
#endif

230
#define TYPE_VHOST_USER_SCSI_PCI "vhost-user-scsi-pci-base"
231 232 233 234 235 236 237 238
#define VHOST_USER_SCSI_PCI(obj) \
        OBJECT_CHECK(VHostUserSCSIPCI, (obj), TYPE_VHOST_USER_SCSI_PCI)

struct VHostUserSCSIPCI {
    VirtIOPCIProxy parent_obj;
    VHostUserSCSI vdev;
};

239 240 241 242
#if defined(CONFIG_VHOST_USER) && defined(CONFIG_LINUX)
/*
 * vhost-user-blk-pci: This extends VirtioPCIProxy.
 */
243
#define TYPE_VHOST_USER_BLK_PCI "vhost-user-blk-pci-base"
244 245 246 247 248 249 250 251 252
#define VHOST_USER_BLK_PCI(obj) \
        OBJECT_CHECK(VHostUserBlkPCI, (obj), TYPE_VHOST_USER_BLK_PCI)

struct VHostUserBlkPCI {
    VirtIOPCIProxy parent_obj;
    VHostUserBlk vdev;
};
#endif

253 254 255
/*
 * virtio-blk-pci: This extends VirtioPCIProxy.
 */
256
#define TYPE_VIRTIO_BLK_PCI "virtio-blk-pci-base"
257 258 259 260 261 262 263 264
#define VIRTIO_BLK_PCI(obj) \
        OBJECT_CHECK(VirtIOBlkPCI, (obj), TYPE_VIRTIO_BLK_PCI)

struct VirtIOBlkPCI {
    VirtIOPCIProxy parent_obj;
    VirtIOBlock vdev;
};

265 266 267
/*
 * virtio-serial-pci: This extends VirtioPCIProxy.
 */
268
#define TYPE_VIRTIO_SERIAL_PCI "virtio-serial-pci-base"
269 270 271 272 273 274 275 276
#define VIRTIO_SERIAL_PCI(obj) \
        OBJECT_CHECK(VirtIOSerialPCI, (obj), TYPE_VIRTIO_SERIAL_PCI)

struct VirtIOSerialPCI {
    VirtIOPCIProxy parent_obj;
    VirtIOSerial vdev;
};

277 278 279
/*
 * virtio-net-pci: This extends VirtioPCIProxy.
 */
280
#define TYPE_VIRTIO_NET_PCI "virtio-net-pci-base"
281 282 283 284 285 286 287 288
#define VIRTIO_NET_PCI(obj) \
        OBJECT_CHECK(VirtIONetPCI, (obj), TYPE_VIRTIO_NET_PCI)

struct VirtIONetPCI {
    VirtIOPCIProxy parent_obj;
    VirtIONet vdev;
};

289 290 291 292 293 294
/*
 * virtio-9p-pci: This extends VirtioPCIProxy.
 */

#ifdef CONFIG_VIRTFS

295
#define TYPE_VIRTIO_9P_PCI "virtio-9p-pci-base"
296 297 298 299 300
#define VIRTIO_9P_PCI(obj) \
        OBJECT_CHECK(V9fsPCIState, (obj), TYPE_VIRTIO_9P_PCI)

typedef struct V9fsPCIState {
    VirtIOPCIProxy parent_obj;
W
Wei Liu 已提交
301
    V9fsVirtioState vdev;
302 303 304 305
} V9fsPCIState;

#endif

306 307 308 309
/*
 * virtio-input-pci: This extends VirtioPCIProxy.
 */
#define TYPE_VIRTIO_INPUT_PCI "virtio-input-pci"
310

311 312 313 314 315 316 317 318 319 320 321 322
/*
 * virtio-gpu-pci: This extends VirtioPCIProxy.
 */
#define TYPE_VIRTIO_GPU_PCI "virtio-gpu-pci"
#define VIRTIO_GPU_PCI(obj) \
        OBJECT_CHECK(VirtIOGPUPCI, (obj), TYPE_VIRTIO_GPU_PCI)

struct VirtIOGPUPCI {
    VirtIOPCIProxy parent_obj;
    VirtIOGPU vdev;
};

323 324 325 326 327 328 329 330 331 332 333 334
/*
 * virtio-crypto-pci: This extends VirtioPCIProxy.
 */
#define TYPE_VIRTIO_CRYPTO_PCI "virtio-crypto-pci"
#define VIRTIO_CRYPTO_PCI(obj) \
        OBJECT_CHECK(VirtIOCryptoPCI, (obj), TYPE_VIRTIO_CRYPTO_PCI)

struct VirtIOCryptoPCI {
    VirtIOPCIProxy parent_obj;
    VirtIOCrypto vdev;
};

335 336 337
/* Virtio ABI version, if we increment this, we break the guest driver. */
#define VIRTIO_PCI_ABI_VERSION          0

338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391
/* Input for virtio_pci_types_register() */
typedef struct VirtioPCIDeviceTypeInfo {
    /*
     * Common base class for the subclasses below.
     *
     * Required only if transitional_name or non_transitional_name is set.
     *
     * We need a separate base type instead of making all types
     * inherit from generic_name for two reasons:
     * 1) generic_name implements INTERFACE_PCIE_DEVICE, but
     *    transitional_name does not.
     * 2) generic_name has the "disable-legacy" and "disable-modern"
     *    properties, transitional_name and non_transitional name don't.
     */
    const char *base_name;
    /*
     * Generic device type.  Optional.
     *
     * Supports both transitional and non-transitional modes,
     * using the disable-legacy and disable-modern properties.
     * If disable-legacy=auto, (non-)transitional mode is selected
     * depending on the bus where the device is plugged.
     *
     * Implements both INTERFACE_PCIE_DEVICE and INTERFACE_CONVENTIONAL_PCI_DEVICE,
     * but PCI Express is supported only in non-transitional mode.
     *
     * The only type implemented by QEMU 3.1 and older.
     */
    const char *generic_name;
    /*
     * The transitional device type.  Optional.
     *
     * Implements both INTERFACE_PCIE_DEVICE and INTERFACE_CONVENTIONAL_PCI_DEVICE.
     */
    const char *transitional_name;
    /*
     * The non-transitional device type.  Optional.
     *
     * Implements INTERFACE_CONVENTIONAL_PCI_DEVICE only.
     */
    const char *non_transitional_name;

    /* Parent type.  If NULL, TYPE_VIRTIO_PCI is used */
    const char *parent;

    /* Same as TypeInfo fields: */
    size_t instance_size;
    void (*instance_init)(Object *obj);
    void (*class_init)(ObjectClass *klass, void *data);
} VirtioPCIDeviceTypeInfo;

/* Register virtio-pci type(s).  @t must be static. */
void virtio_pci_types_register(const VirtioPCIDeviceTypeInfo *t);

392
#endif