Statistics
| Branch: | Revision:

root / hw / virtio-pci.c @ bbef882c

History | View | Annotate | Download (35.3 kB)

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
 * Contributions after 2012-01-13 are licensed under the terms of the
15
 * GNU GPL, version 2 or (at your option) any later version.
16
 */
17

    
18
#include <inttypes.h>
19

    
20
#include "virtio.h"
21
#include "virtio-blk.h"
22
#include "virtio-net.h"
23
#include "virtio-serial.h"
24
#include "virtio-scsi.h"
25
#include "pci/pci.h"
26
#include "qemu/error-report.h"
27
#include "pci/msi.h"
28
#include "pci/msix.h"
29
#include "loader.h"
30
#include "sysemu/kvm.h"
31
#include "sysemu/blockdev.h"
32
#include "virtio-pci.h"
33
#include "qemu/range.h"
34

    
35
/* from Linux's linux/virtio_pci.h */
36

    
37
/* A 32-bit r/o bitmask of the features supported by the host */
38
#define VIRTIO_PCI_HOST_FEATURES        0
39

    
40
/* A 32-bit r/w bitmask of features activated by the guest */
41
#define VIRTIO_PCI_GUEST_FEATURES       4
42

    
43
/* A 32-bit r/w PFN for the currently selected queue */
44
#define VIRTIO_PCI_QUEUE_PFN            8
45

    
46
/* A 16-bit r/o queue size for the currently selected queue */
47
#define VIRTIO_PCI_QUEUE_NUM            12
48

    
49
/* A 16-bit r/w queue selector */
50
#define VIRTIO_PCI_QUEUE_SEL            14
51

    
52
/* A 16-bit r/w queue notifier */
53
#define VIRTIO_PCI_QUEUE_NOTIFY         16
54

    
55
/* An 8-bit device status register.  */
56
#define VIRTIO_PCI_STATUS               18
57

    
58
/* An 8-bit r/o interrupt status register.  Reading the value will return the
59
 * current contents of the ISR and will also clear it.  This is effectively
60
 * a read-and-acknowledge. */
61
#define VIRTIO_PCI_ISR                  19
62

    
63
/* MSI-X registers: only enabled if MSI-X is enabled. */
64
/* A 16-bit vector for configuration changes. */
65
#define VIRTIO_MSI_CONFIG_VECTOR        20
66
/* A 16-bit vector for selected queue notifications. */
67
#define VIRTIO_MSI_QUEUE_VECTOR         22
68

    
69
/* Config space size */
70
#define VIRTIO_PCI_CONFIG_NOMSI         20
71
#define VIRTIO_PCI_CONFIG_MSI           24
72
#define VIRTIO_PCI_REGION_SIZE(dev)     (msix_present(dev) ? \
73
                                         VIRTIO_PCI_CONFIG_MSI : \
74
                                         VIRTIO_PCI_CONFIG_NOMSI)
75

    
76
/* The remaining space is defined by each driver as the per-driver
77
 * configuration space */
78
#define VIRTIO_PCI_CONFIG(dev)          (msix_enabled(dev) ? \
79
                                         VIRTIO_PCI_CONFIG_MSI : \
80
                                         VIRTIO_PCI_CONFIG_NOMSI)
81

    
82
/* How many bits to shift physical queue address written to QUEUE_PFN.
83
 * 12 is historical, and due to x86 page size. */
84
#define VIRTIO_PCI_QUEUE_ADDR_SHIFT    12
85

    
86
/* Flags track per-device state like workarounds for quirks in older guests. */
87
#define VIRTIO_PCI_FLAG_BUS_MASTER_BUG  (1 << 0)
88

    
89
/* QEMU doesn't strictly need write barriers since everything runs in
90
 * lock-step.  We'll leave the calls to wmb() in though to make it obvious for
91
 * KVM or if kqemu gets SMP support.
92
 */
93
#define wmb() do { } while (0)
94

    
95
/* HACK for virtio to determine if it's running a big endian guest */
96
bool virtio_is_big_endian(void);
97

    
98
/* virtio device */
99
/* DeviceState to VirtIOPCIProxy. For use off data-path. TODO: use QOM. */
100
static inline VirtIOPCIProxy *to_virtio_pci_proxy(DeviceState *d)
101
{
102
    return container_of(d, VirtIOPCIProxy, pci_dev.qdev);
103
}
104

    
105
/* DeviceState to VirtIOPCIProxy. Note: used on datapath,
106
 * be careful and test performance if you change this.
107
 */
108
static inline VirtIOPCIProxy *to_virtio_pci_proxy_fast(DeviceState *d)
109
{
110
    return container_of(d, VirtIOPCIProxy, pci_dev.qdev);
111
}
112

    
113
static void virtio_pci_notify(DeviceState *d, uint16_t vector)
114
{
115
    VirtIOPCIProxy *proxy = to_virtio_pci_proxy_fast(d);
116
    if (msix_enabled(&proxy->pci_dev))
117
        msix_notify(&proxy->pci_dev, vector);
118
    else
119
        qemu_set_irq(proxy->pci_dev.irq[0], proxy->vdev->isr & 1);
120
}
121

    
122
static void virtio_pci_save_config(DeviceState *d, QEMUFile *f)
123
{
124
    VirtIOPCIProxy *proxy = to_virtio_pci_proxy(d);
125
    pci_device_save(&proxy->pci_dev, f);
126
    msix_save(&proxy->pci_dev, f);
127
    if (msix_present(&proxy->pci_dev))
128
        qemu_put_be16(f, proxy->vdev->config_vector);
129
}
130

    
131
static void virtio_pci_save_queue(DeviceState *d, int n, QEMUFile *f)
132
{
133
    VirtIOPCIProxy *proxy = to_virtio_pci_proxy(d);
134
    if (msix_present(&proxy->pci_dev))
135
        qemu_put_be16(f, virtio_queue_vector(proxy->vdev, n));
136
}
137

    
138
static int virtio_pci_load_config(DeviceState *d, QEMUFile *f)
139
{
140
    VirtIOPCIProxy *proxy = to_virtio_pci_proxy(d);
141
    int ret;
142
    ret = pci_device_load(&proxy->pci_dev, f);
143
    if (ret) {
144
        return ret;
145
    }
146
    msix_unuse_all_vectors(&proxy->pci_dev);
147
    msix_load(&proxy->pci_dev, f);
148
    if (msix_present(&proxy->pci_dev)) {
149
        qemu_get_be16s(f, &proxy->vdev->config_vector);
150
    } else {
151
        proxy->vdev->config_vector = VIRTIO_NO_VECTOR;
152
    }
153
    if (proxy->vdev->config_vector != VIRTIO_NO_VECTOR) {
154
        return msix_vector_use(&proxy->pci_dev, proxy->vdev->config_vector);
155
    }
156
    return 0;
157
}
158

    
159
static int virtio_pci_load_queue(DeviceState *d, int n, QEMUFile *f)
160
{
161
    VirtIOPCIProxy *proxy = to_virtio_pci_proxy(d);
162
    uint16_t vector;
163
    if (msix_present(&proxy->pci_dev)) {
164
        qemu_get_be16s(f, &vector);
165
    } else {
166
        vector = VIRTIO_NO_VECTOR;
167
    }
168
    virtio_queue_set_vector(proxy->vdev, n, vector);
169
    if (vector != VIRTIO_NO_VECTOR) {
170
        return msix_vector_use(&proxy->pci_dev, vector);
171
    }
172
    return 0;
173
}
174

    
175
static int virtio_pci_set_host_notifier_internal(VirtIOPCIProxy *proxy,
176
                                                 int n, bool assign, bool set_handler)
177
{
178
    VirtQueue *vq = virtio_get_queue(proxy->vdev, n);
179
    EventNotifier *notifier = virtio_queue_get_host_notifier(vq);
180
    int r = 0;
181

    
182
    if (assign) {
183
        r = event_notifier_init(notifier, 1);
184
        if (r < 0) {
185
            error_report("%s: unable to init event notifier: %d",
186
                         __func__, r);
187
            return r;
188
        }
189
        virtio_queue_set_host_notifier_fd_handler(vq, true, set_handler);
190
        memory_region_add_eventfd(&proxy->bar, VIRTIO_PCI_QUEUE_NOTIFY, 2,
191
                                  true, n, notifier);
192
    } else {
193
        memory_region_del_eventfd(&proxy->bar, VIRTIO_PCI_QUEUE_NOTIFY, 2,
194
                                  true, n, notifier);
195
        virtio_queue_set_host_notifier_fd_handler(vq, false, false);
196
        event_notifier_cleanup(notifier);
197
    }
198
    return r;
199
}
200

    
201
static void virtio_pci_start_ioeventfd(VirtIOPCIProxy *proxy)
202
{
203
    int n, r;
204

    
205
    if (!(proxy->flags & VIRTIO_PCI_FLAG_USE_IOEVENTFD) ||
206
        proxy->ioeventfd_disabled ||
207
        proxy->ioeventfd_started) {
208
        return;
209
    }
210

    
211
    for (n = 0; n < VIRTIO_PCI_QUEUE_MAX; n++) {
212
        if (!virtio_queue_get_num(proxy->vdev, n)) {
213
            continue;
214
        }
215

    
216
        r = virtio_pci_set_host_notifier_internal(proxy, n, true, true);
217
        if (r < 0) {
218
            goto assign_error;
219
        }
220
    }
221
    proxy->ioeventfd_started = true;
222
    return;
223

    
224
assign_error:
225
    while (--n >= 0) {
226
        if (!virtio_queue_get_num(proxy->vdev, n)) {
227
            continue;
228
        }
229

    
230
        r = virtio_pci_set_host_notifier_internal(proxy, n, false, false);
231
        assert(r >= 0);
232
    }
233
    proxy->ioeventfd_started = false;
234
    error_report("%s: failed. Fallback to a userspace (slower).", __func__);
235
}
236

    
237
static void virtio_pci_stop_ioeventfd(VirtIOPCIProxy *proxy)
238
{
239
    int r;
240
    int n;
241

    
242
    if (!proxy->ioeventfd_started) {
243
        return;
244
    }
245

    
246
    for (n = 0; n < VIRTIO_PCI_QUEUE_MAX; n++) {
247
        if (!virtio_queue_get_num(proxy->vdev, n)) {
248
            continue;
249
        }
250

    
251
        r = virtio_pci_set_host_notifier_internal(proxy, n, false, false);
252
        assert(r >= 0);
253
    }
254
    proxy->ioeventfd_started = false;
255
}
256

    
257
void virtio_pci_reset(DeviceState *d)
258
{
259
    VirtIOPCIProxy *proxy = to_virtio_pci_proxy(d);
260
    virtio_pci_stop_ioeventfd(proxy);
261
    virtio_reset(proxy->vdev);
262
    msix_unuse_all_vectors(&proxy->pci_dev);
263
    proxy->flags &= ~VIRTIO_PCI_FLAG_BUS_MASTER_BUG;
264
}
265

    
266
static void virtio_ioport_write(void *opaque, uint32_t addr, uint32_t val)
267
{
268
    VirtIOPCIProxy *proxy = opaque;
269
    VirtIODevice *vdev = proxy->vdev;
270
    hwaddr pa;
271

    
272
    switch (addr) {
273
    case VIRTIO_PCI_GUEST_FEATURES:
274
        /* Guest does not negotiate properly?  We have to assume nothing. */
275
        if (val & (1 << VIRTIO_F_BAD_FEATURE)) {
276
            val = vdev->bad_features ? vdev->bad_features(vdev) : 0;
277
        }
278
        virtio_set_features(vdev, val);
279
        break;
280
    case VIRTIO_PCI_QUEUE_PFN:
281
        pa = (hwaddr)val << VIRTIO_PCI_QUEUE_ADDR_SHIFT;
282
        if (pa == 0) {
283
            virtio_pci_stop_ioeventfd(proxy);
284
            virtio_reset(proxy->vdev);
285
            msix_unuse_all_vectors(&proxy->pci_dev);
286
        }
287
        else
288
            virtio_queue_set_addr(vdev, vdev->queue_sel, pa);
289
        break;
290
    case VIRTIO_PCI_QUEUE_SEL:
291
        if (val < VIRTIO_PCI_QUEUE_MAX)
292
            vdev->queue_sel = val;
293
        break;
294
    case VIRTIO_PCI_QUEUE_NOTIFY:
295
        if (val < VIRTIO_PCI_QUEUE_MAX) {
296
            virtio_queue_notify(vdev, val);
297
        }
298
        break;
299
    case VIRTIO_PCI_STATUS:
300
        if (!(val & VIRTIO_CONFIG_S_DRIVER_OK)) {
301
            virtio_pci_stop_ioeventfd(proxy);
302
        }
303

    
304
        virtio_set_status(vdev, val & 0xFF);
305

    
306
        if (val & VIRTIO_CONFIG_S_DRIVER_OK) {
307
            virtio_pci_start_ioeventfd(proxy);
308
        }
309

    
310
        if (vdev->status == 0) {
311
            virtio_reset(proxy->vdev);
312
            msix_unuse_all_vectors(&proxy->pci_dev);
313
        }
314

    
315
        /* Linux before 2.6.34 sets the device as OK without enabling
316
           the PCI device bus master bit. In this case we need to disable
317
           some safety checks. */
318
        if ((val & VIRTIO_CONFIG_S_DRIVER_OK) &&
319
            !(proxy->pci_dev.config[PCI_COMMAND] & PCI_COMMAND_MASTER)) {
320
            proxy->flags |= VIRTIO_PCI_FLAG_BUS_MASTER_BUG;
321
        }
322
        break;
323
    case VIRTIO_MSI_CONFIG_VECTOR:
324
        msix_vector_unuse(&proxy->pci_dev, vdev->config_vector);
325
        /* Make it possible for guest to discover an error took place. */
326
        if (msix_vector_use(&proxy->pci_dev, val) < 0)
327
            val = VIRTIO_NO_VECTOR;
328
        vdev->config_vector = val;
329
        break;
330
    case VIRTIO_MSI_QUEUE_VECTOR:
331
        msix_vector_unuse(&proxy->pci_dev,
332
                          virtio_queue_vector(vdev, vdev->queue_sel));
333
        /* Make it possible for guest to discover an error took place. */
334
        if (msix_vector_use(&proxy->pci_dev, val) < 0)
335
            val = VIRTIO_NO_VECTOR;
336
        virtio_queue_set_vector(vdev, vdev->queue_sel, val);
337
        break;
338
    default:
339
        error_report("%s: unexpected address 0x%x value 0x%x",
340
                     __func__, addr, val);
341
        break;
342
    }
343
}
344

    
345
static uint32_t virtio_ioport_read(VirtIOPCIProxy *proxy, uint32_t addr)
346
{
347
    VirtIODevice *vdev = proxy->vdev;
348
    uint32_t ret = 0xFFFFFFFF;
349

    
350
    switch (addr) {
351
    case VIRTIO_PCI_HOST_FEATURES:
352
        ret = proxy->host_features;
353
        break;
354
    case VIRTIO_PCI_GUEST_FEATURES:
355
        ret = vdev->guest_features;
356
        break;
357
    case VIRTIO_PCI_QUEUE_PFN:
358
        ret = virtio_queue_get_addr(vdev, vdev->queue_sel)
359
              >> VIRTIO_PCI_QUEUE_ADDR_SHIFT;
360
        break;
361
    case VIRTIO_PCI_QUEUE_NUM:
362
        ret = virtio_queue_get_num(vdev, vdev->queue_sel);
363
        break;
364
    case VIRTIO_PCI_QUEUE_SEL:
365
        ret = vdev->queue_sel;
366
        break;
367
    case VIRTIO_PCI_STATUS:
368
        ret = vdev->status;
369
        break;
370
    case VIRTIO_PCI_ISR:
371
        /* reading from the ISR also clears it. */
372
        ret = vdev->isr;
373
        vdev->isr = 0;
374
        qemu_set_irq(proxy->pci_dev.irq[0], 0);
375
        break;
376
    case VIRTIO_MSI_CONFIG_VECTOR:
377
        ret = vdev->config_vector;
378
        break;
379
    case VIRTIO_MSI_QUEUE_VECTOR:
380
        ret = virtio_queue_vector(vdev, vdev->queue_sel);
381
        break;
382
    default:
383
        break;
384
    }
385

    
386
    return ret;
387
}
388

    
389
static uint64_t virtio_pci_config_read(void *opaque, hwaddr addr,
390
                                       unsigned size)
391
{
392
    VirtIOPCIProxy *proxy = opaque;
393
    uint32_t config = VIRTIO_PCI_CONFIG(&proxy->pci_dev);
394
    uint64_t val = 0;
395
    if (addr < config) {
396
        return virtio_ioport_read(proxy, addr);
397
    }
398
    addr -= config;
399

    
400
    switch (size) {
401
    case 1:
402
        val = virtio_config_readb(proxy->vdev, addr);
403
        break;
404
    case 2:
405
        val = virtio_config_readw(proxy->vdev, addr);
406
        if (virtio_is_big_endian()) {
407
            val = bswap16(val);
408
        }
409
        break;
410
    case 4:
411
        val = virtio_config_readl(proxy->vdev, addr);
412
        if (virtio_is_big_endian()) {
413
            val = bswap32(val);
414
        }
415
        break;
416
    }
417
    return val;
418
}
419

    
420
static void virtio_pci_config_write(void *opaque, hwaddr addr,
421
                                    uint64_t val, unsigned size)
422
{
423
    VirtIOPCIProxy *proxy = opaque;
424
    uint32_t config = VIRTIO_PCI_CONFIG(&proxy->pci_dev);
425
    if (addr < config) {
426
        virtio_ioport_write(proxy, addr, val);
427
        return;
428
    }
429
    addr -= config;
430
    /*
431
     * Virtio-PCI is odd. Ioports are LE but config space is target native
432
     * endian.
433
     */
434
    switch (size) {
435
    case 1:
436
        virtio_config_writeb(proxy->vdev, addr, val);
437
        break;
438
    case 2:
439
        if (virtio_is_big_endian()) {
440
            val = bswap16(val);
441
        }
442
        virtio_config_writew(proxy->vdev, addr, val);
443
        break;
444
    case 4:
445
        if (virtio_is_big_endian()) {
446
            val = bswap32(val);
447
        }
448
        virtio_config_writel(proxy->vdev, addr, val);
449
        break;
450
    }
451
}
452

    
453
static const MemoryRegionOps virtio_pci_config_ops = {
454
    .read = virtio_pci_config_read,
455
    .write = virtio_pci_config_write,
456
    .impl = {
457
        .min_access_size = 1,
458
        .max_access_size = 4,
459
    },
460
    .endianness = DEVICE_LITTLE_ENDIAN,
461
};
462

    
463
static void virtio_write_config(PCIDevice *pci_dev, uint32_t address,
464
                                uint32_t val, int len)
465
{
466
    VirtIOPCIProxy *proxy = DO_UPCAST(VirtIOPCIProxy, pci_dev, pci_dev);
467

    
468
    pci_default_write_config(pci_dev, address, val, len);
469

    
470
    if (range_covers_byte(address, len, PCI_COMMAND) &&
471
        !(pci_dev->config[PCI_COMMAND] & PCI_COMMAND_MASTER) &&
472
        !(proxy->flags & VIRTIO_PCI_FLAG_BUS_MASTER_BUG)) {
473
        virtio_pci_stop_ioeventfd(proxy);
474
        virtio_set_status(proxy->vdev,
475
                          proxy->vdev->status & ~VIRTIO_CONFIG_S_DRIVER_OK);
476
    }
477
}
478

    
479
static unsigned virtio_pci_get_features(DeviceState *d)
480
{
481
    VirtIOPCIProxy *proxy = to_virtio_pci_proxy(d);
482
    return proxy->host_features;
483
}
484

    
485
static int kvm_virtio_pci_vq_vector_use(VirtIOPCIProxy *proxy,
486
                                        unsigned int queue_no,
487
                                        unsigned int vector,
488
                                        MSIMessage msg)
489
{
490
    VirtQueue *vq = virtio_get_queue(proxy->vdev, queue_no);
491
    EventNotifier *n = virtio_queue_get_guest_notifier(vq);
492
    VirtIOIRQFD *irqfd = &proxy->vector_irqfd[vector];
493
    int ret;
494

    
495
    if (irqfd->users == 0) {
496
        ret = kvm_irqchip_add_msi_route(kvm_state, msg);
497
        if (ret < 0) {
498
            return ret;
499
        }
500
        irqfd->virq = ret;
501
    }
502
    irqfd->users++;
503

    
504
    ret = kvm_irqchip_add_irqfd_notifier(kvm_state, n, irqfd->virq);
505
    if (ret < 0) {
506
        if (--irqfd->users == 0) {
507
            kvm_irqchip_release_virq(kvm_state, irqfd->virq);
508
        }
509
        return ret;
510
    }
511

    
512
    virtio_queue_set_guest_notifier_fd_handler(vq, true, true);
513
    return 0;
514
}
515

    
516
static void kvm_virtio_pci_vq_vector_release(VirtIOPCIProxy *proxy,
517
                                             unsigned int queue_no,
518
                                             unsigned int vector)
519
{
520
    VirtQueue *vq = virtio_get_queue(proxy->vdev, queue_no);
521
    EventNotifier *n = virtio_queue_get_guest_notifier(vq);
522
    VirtIOIRQFD *irqfd = &proxy->vector_irqfd[vector];
523
    int ret;
524

    
525
    ret = kvm_irqchip_remove_irqfd_notifier(kvm_state, n, irqfd->virq);
526
    assert(ret == 0);
527

    
528
    if (--irqfd->users == 0) {
529
        kvm_irqchip_release_virq(kvm_state, irqfd->virq);
530
    }
531

    
532
    virtio_queue_set_guest_notifier_fd_handler(vq, true, false);
533
}
534

    
535
static int kvm_virtio_pci_vector_use(PCIDevice *dev, unsigned vector,
536
                                     MSIMessage msg)
537
{
538
    VirtIOPCIProxy *proxy = container_of(dev, VirtIOPCIProxy, pci_dev);
539
    VirtIODevice *vdev = proxy->vdev;
540
    int ret, queue_no;
541

    
542
    for (queue_no = 0; queue_no < VIRTIO_PCI_QUEUE_MAX; queue_no++) {
543
        if (!virtio_queue_get_num(vdev, queue_no)) {
544
            break;
545
        }
546
        if (virtio_queue_vector(vdev, queue_no) != vector) {
547
            continue;
548
        }
549
        ret = kvm_virtio_pci_vq_vector_use(proxy, queue_no, vector, msg);
550
        if (ret < 0) {
551
            goto undo;
552
        }
553
    }
554
    return 0;
555

    
556
undo:
557
    while (--queue_no >= 0) {
558
        if (virtio_queue_vector(vdev, queue_no) != vector) {
559
            continue;
560
        }
561
        kvm_virtio_pci_vq_vector_release(proxy, queue_no, vector);
562
    }
563
    return ret;
564
}
565

    
566
static void kvm_virtio_pci_vector_release(PCIDevice *dev, unsigned vector)
567
{
568
    VirtIOPCIProxy *proxy = container_of(dev, VirtIOPCIProxy, pci_dev);
569
    VirtIODevice *vdev = proxy->vdev;
570
    int queue_no;
571

    
572
    for (queue_no = 0; queue_no < VIRTIO_PCI_QUEUE_MAX; queue_no++) {
573
        if (!virtio_queue_get_num(vdev, queue_no)) {
574
            break;
575
        }
576
        if (virtio_queue_vector(vdev, queue_no) != vector) {
577
            continue;
578
        }
579
        kvm_virtio_pci_vq_vector_release(proxy, queue_no, vector);
580
    }
581
}
582

    
583
static int virtio_pci_set_guest_notifier(DeviceState *d, int n, bool assign)
584
{
585
    VirtIOPCIProxy *proxy = to_virtio_pci_proxy(d);
586
    VirtQueue *vq = virtio_get_queue(proxy->vdev, n);
587
    EventNotifier *notifier = virtio_queue_get_guest_notifier(vq);
588

    
589
    if (assign) {
590
        int r = event_notifier_init(notifier, 0);
591
        if (r < 0) {
592
            return r;
593
        }
594
        virtio_queue_set_guest_notifier_fd_handler(vq, true, false);
595
    } else {
596
        virtio_queue_set_guest_notifier_fd_handler(vq, false, false);
597
        event_notifier_cleanup(notifier);
598
    }
599

    
600
    return 0;
601
}
602

    
603
static bool virtio_pci_query_guest_notifiers(DeviceState *d)
604
{
605
    VirtIOPCIProxy *proxy = to_virtio_pci_proxy(d);
606
    return msix_enabled(&proxy->pci_dev);
607
}
608

    
609
static int virtio_pci_set_guest_notifiers(DeviceState *d, bool assign)
610
{
611
    VirtIOPCIProxy *proxy = to_virtio_pci_proxy(d);
612
    VirtIODevice *vdev = proxy->vdev;
613
    int r, n;
614

    
615
    /* Must unset vector notifier while guest notifier is still assigned */
616
    if (kvm_msi_via_irqfd_enabled() && !assign) {
617
        msix_unset_vector_notifiers(&proxy->pci_dev);
618
        g_free(proxy->vector_irqfd);
619
        proxy->vector_irqfd = NULL;
620
    }
621

    
622
    for (n = 0; n < VIRTIO_PCI_QUEUE_MAX; n++) {
623
        if (!virtio_queue_get_num(vdev, n)) {
624
            break;
625
        }
626

    
627
        r = virtio_pci_set_guest_notifier(d, n, assign);
628
        if (r < 0) {
629
            goto assign_error;
630
        }
631
    }
632

    
633
    /* Must set vector notifier after guest notifier has been assigned */
634
    if (kvm_msi_via_irqfd_enabled() && assign) {
635
        proxy->vector_irqfd =
636
            g_malloc0(sizeof(*proxy->vector_irqfd) *
637
                      msix_nr_vectors_allocated(&proxy->pci_dev));
638
        r = msix_set_vector_notifiers(&proxy->pci_dev,
639
                                      kvm_virtio_pci_vector_use,
640
                                      kvm_virtio_pci_vector_release,
641
                                      NULL);
642
        if (r < 0) {
643
            goto assign_error;
644
        }
645
    }
646

    
647
    return 0;
648

    
649
assign_error:
650
    /* We get here on assignment failure. Recover by undoing for VQs 0 .. n. */
651
    assert(assign);
652
    while (--n >= 0) {
653
        virtio_pci_set_guest_notifier(d, n, !assign);
654
    }
655
    return r;
656
}
657

    
658
static int virtio_pci_set_host_notifier(DeviceState *d, int n, bool assign)
659
{
660
    VirtIOPCIProxy *proxy = to_virtio_pci_proxy(d);
661

    
662
    /* Stop using ioeventfd for virtqueue kick if the device starts using host
663
     * notifiers.  This makes it easy to avoid stepping on each others' toes.
664
     */
665
    proxy->ioeventfd_disabled = assign;
666
    if (assign) {
667
        virtio_pci_stop_ioeventfd(proxy);
668
    }
669
    /* We don't need to start here: it's not needed because backend
670
     * currently only stops on status change away from ok,
671
     * reset, vmstop and such. If we do add code to start here,
672
     * need to check vmstate, device state etc. */
673
    return virtio_pci_set_host_notifier_internal(proxy, n, assign, false);
674
}
675

    
676
static void virtio_pci_vmstate_change(DeviceState *d, bool running)
677
{
678
    VirtIOPCIProxy *proxy = to_virtio_pci_proxy(d);
679

    
680
    if (running) {
681
        /* Try to find out if the guest has bus master disabled, but is
682
           in ready state. Then we have a buggy guest OS. */
683
        if ((proxy->vdev->status & VIRTIO_CONFIG_S_DRIVER_OK) &&
684
            !(proxy->pci_dev.config[PCI_COMMAND] & PCI_COMMAND_MASTER)) {
685
            proxy->flags |= VIRTIO_PCI_FLAG_BUS_MASTER_BUG;
686
        }
687
        virtio_pci_start_ioeventfd(proxy);
688
    } else {
689
        virtio_pci_stop_ioeventfd(proxy);
690
    }
691
}
692

    
693
static const VirtIOBindings virtio_pci_bindings = {
694
    .notify = virtio_pci_notify,
695
    .save_config = virtio_pci_save_config,
696
    .load_config = virtio_pci_load_config,
697
    .save_queue = virtio_pci_save_queue,
698
    .load_queue = virtio_pci_load_queue,
699
    .get_features = virtio_pci_get_features,
700
    .query_guest_notifiers = virtio_pci_query_guest_notifiers,
701
    .set_host_notifier = virtio_pci_set_host_notifier,
702
    .set_guest_notifiers = virtio_pci_set_guest_notifiers,
703
    .vmstate_change = virtio_pci_vmstate_change,
704
};
705

    
706
void virtio_init_pci(VirtIOPCIProxy *proxy, VirtIODevice *vdev)
707
{
708
    uint8_t *config;
709
    uint32_t size;
710

    
711
    proxy->vdev = vdev;
712

    
713
    config = proxy->pci_dev.config;
714

    
715
    if (proxy->class_code) {
716
        pci_config_set_class(config, proxy->class_code);
717
    }
718
    pci_set_word(config + PCI_SUBSYSTEM_VENDOR_ID,
719
                 pci_get_word(config + PCI_VENDOR_ID));
720
    pci_set_word(config + PCI_SUBSYSTEM_ID, vdev->device_id);
721
    config[PCI_INTERRUPT_PIN] = 1;
722

    
723
    if (vdev->nvectors &&
724
        msix_init_exclusive_bar(&proxy->pci_dev, vdev->nvectors, 1)) {
725
        vdev->nvectors = 0;
726
    }
727

    
728
    proxy->pci_dev.config_write = virtio_write_config;
729

    
730
    size = VIRTIO_PCI_REGION_SIZE(&proxy->pci_dev) + vdev->config_len;
731
    if (size & (size-1))
732
        size = 1 << qemu_fls(size);
733

    
734
    memory_region_init_io(&proxy->bar, &virtio_pci_config_ops, proxy,
735
                          "virtio-pci", size);
736
    pci_register_bar(&proxy->pci_dev, 0, PCI_BASE_ADDRESS_SPACE_IO,
737
                     &proxy->bar);
738

    
739
    if (!kvm_has_many_ioeventfds()) {
740
        proxy->flags &= ~VIRTIO_PCI_FLAG_USE_IOEVENTFD;
741
    }
742

    
743
    virtio_bind_device(vdev, &virtio_pci_bindings, DEVICE(proxy));
744
    proxy->host_features |= 0x1 << VIRTIO_F_NOTIFY_ON_EMPTY;
745
    proxy->host_features |= 0x1 << VIRTIO_F_BAD_FEATURE;
746
    proxy->host_features = vdev->get_features(vdev, proxy->host_features);
747
}
748

    
749
static int virtio_blk_init_pci(PCIDevice *pci_dev)
750
{
751
    VirtIOPCIProxy *proxy = DO_UPCAST(VirtIOPCIProxy, pci_dev, pci_dev);
752
    VirtIODevice *vdev;
753

    
754
    if (proxy->class_code != PCI_CLASS_STORAGE_SCSI &&
755
        proxy->class_code != PCI_CLASS_STORAGE_OTHER)
756
        proxy->class_code = PCI_CLASS_STORAGE_SCSI;
757

    
758
    vdev = virtio_blk_init(&pci_dev->qdev, &proxy->blk);
759
    if (!vdev) {
760
        return -1;
761
    }
762
    vdev->nvectors = proxy->nvectors;
763
    virtio_init_pci(proxy, vdev);
764
    /* make the actual value visible */
765
    proxy->nvectors = vdev->nvectors;
766
    return 0;
767
}
768

    
769
static void virtio_exit_pci(PCIDevice *pci_dev)
770
{
771
    VirtIOPCIProxy *proxy = DO_UPCAST(VirtIOPCIProxy, pci_dev, pci_dev);
772

    
773
    memory_region_destroy(&proxy->bar);
774
    msix_uninit_exclusive_bar(pci_dev);
775
}
776

    
777
static void virtio_blk_exit_pci(PCIDevice *pci_dev)
778
{
779
    VirtIOPCIProxy *proxy = DO_UPCAST(VirtIOPCIProxy, pci_dev, pci_dev);
780

    
781
    virtio_pci_stop_ioeventfd(proxy);
782
    virtio_blk_exit(proxy->vdev);
783
    virtio_exit_pci(pci_dev);
784
}
785

    
786
static int virtio_serial_init_pci(PCIDevice *pci_dev)
787
{
788
    VirtIOPCIProxy *proxy = DO_UPCAST(VirtIOPCIProxy, pci_dev, pci_dev);
789
    VirtIODevice *vdev;
790

    
791
    if (proxy->class_code != PCI_CLASS_COMMUNICATION_OTHER &&
792
        proxy->class_code != PCI_CLASS_DISPLAY_OTHER && /* qemu 0.10 */
793
        proxy->class_code != PCI_CLASS_OTHERS)          /* qemu-kvm  */
794
        proxy->class_code = PCI_CLASS_COMMUNICATION_OTHER;
795

    
796
    vdev = virtio_serial_init(&pci_dev->qdev, &proxy->serial);
797
    if (!vdev) {
798
        return -1;
799
    }
800
    vdev->nvectors = proxy->nvectors == DEV_NVECTORS_UNSPECIFIED
801
                                        ? proxy->serial.max_virtserial_ports + 1
802
                                        : proxy->nvectors;
803
    virtio_init_pci(proxy, vdev);
804
    proxy->nvectors = vdev->nvectors;
805
    return 0;
806
}
807

    
808
static void virtio_serial_exit_pci(PCIDevice *pci_dev)
809
{
810
    VirtIOPCIProxy *proxy = DO_UPCAST(VirtIOPCIProxy, pci_dev, pci_dev);
811

    
812
    virtio_pci_stop_ioeventfd(proxy);
813
    virtio_serial_exit(proxy->vdev);
814
    virtio_exit_pci(pci_dev);
815
}
816

    
817
static int virtio_net_init_pci(PCIDevice *pci_dev)
818
{
819
    VirtIOPCIProxy *proxy = DO_UPCAST(VirtIOPCIProxy, pci_dev, pci_dev);
820
    VirtIODevice *vdev;
821

    
822
    vdev = virtio_net_init(&pci_dev->qdev, &proxy->nic, &proxy->net);
823

    
824
    vdev->nvectors = proxy->nvectors;
825
    virtio_init_pci(proxy, vdev);
826

    
827
    /* make the actual value visible */
828
    proxy->nvectors = vdev->nvectors;
829
    return 0;
830
}
831

    
832
static void virtio_net_exit_pci(PCIDevice *pci_dev)
833
{
834
    VirtIOPCIProxy *proxy = DO_UPCAST(VirtIOPCIProxy, pci_dev, pci_dev);
835

    
836
    virtio_pci_stop_ioeventfd(proxy);
837
    virtio_net_exit(proxy->vdev);
838
    virtio_exit_pci(pci_dev);
839
}
840

    
841
static int virtio_balloon_init_pci(PCIDevice *pci_dev)
842
{
843
    VirtIOPCIProxy *proxy = DO_UPCAST(VirtIOPCIProxy, pci_dev, pci_dev);
844
    VirtIODevice *vdev;
845

    
846
    if (proxy->class_code != PCI_CLASS_OTHERS &&
847
        proxy->class_code != PCI_CLASS_MEMORY_RAM) { /* qemu < 1.1 */
848
        proxy->class_code = PCI_CLASS_OTHERS;
849
    }
850

    
851
    vdev = virtio_balloon_init(&pci_dev->qdev);
852
    if (!vdev) {
853
        return -1;
854
    }
855
    virtio_init_pci(proxy, vdev);
856
    return 0;
857
}
858

    
859
static void virtio_balloon_exit_pci(PCIDevice *pci_dev)
860
{
861
    VirtIOPCIProxy *proxy = DO_UPCAST(VirtIOPCIProxy, pci_dev, pci_dev);
862

    
863
    virtio_pci_stop_ioeventfd(proxy);
864
    virtio_balloon_exit(proxy->vdev);
865
    virtio_exit_pci(pci_dev);
866
}
867

    
868
static int virtio_rng_init_pci(PCIDevice *pci_dev)
869
{
870
    VirtIOPCIProxy *proxy = DO_UPCAST(VirtIOPCIProxy, pci_dev, pci_dev);
871
    VirtIODevice *vdev;
872

    
873
    if (proxy->rng.rng == NULL) {
874
        proxy->rng.default_backend = RNG_RANDOM(object_new(TYPE_RNG_RANDOM));
875

    
876
        object_property_add_child(OBJECT(pci_dev),
877
                                  "default-backend",
878
                                  OBJECT(proxy->rng.default_backend),
879
                                  NULL);
880

    
881
        object_property_set_link(OBJECT(pci_dev),
882
                                 OBJECT(proxy->rng.default_backend),
883
                                 "rng", NULL);
884
    }
885

    
886
    vdev = virtio_rng_init(&pci_dev->qdev, &proxy->rng);
887
    if (!vdev) {
888
        return -1;
889
    }
890
    virtio_init_pci(proxy, vdev);
891
    return 0;
892
}
893

    
894
static void virtio_rng_exit_pci(PCIDevice *pci_dev)
895
{
896
    VirtIOPCIProxy *proxy = DO_UPCAST(VirtIOPCIProxy, pci_dev, pci_dev);
897

    
898
    virtio_pci_stop_ioeventfd(proxy);
899
    virtio_rng_exit(proxy->vdev);
900
    virtio_exit_pci(pci_dev);
901
}
902

    
903
static Property virtio_blk_properties[] = {
904
    DEFINE_PROP_HEX32("class", VirtIOPCIProxy, class_code, 0),
905
    DEFINE_BLOCK_PROPERTIES(VirtIOPCIProxy, blk.conf),
906
    DEFINE_BLOCK_CHS_PROPERTIES(VirtIOPCIProxy, blk.conf),
907
    DEFINE_PROP_STRING("serial", VirtIOPCIProxy, blk.serial),
908
#ifdef __linux__
909
    DEFINE_PROP_BIT("scsi", VirtIOPCIProxy, blk.scsi, 0, true),
910
#endif
911
    DEFINE_PROP_BIT("ioeventfd", VirtIOPCIProxy, flags, VIRTIO_PCI_FLAG_USE_IOEVENTFD_BIT, true),
912
    DEFINE_PROP_UINT32("vectors", VirtIOPCIProxy, nvectors, 2),
913
    DEFINE_VIRTIO_BLK_FEATURES(VirtIOPCIProxy, host_features),
914
    DEFINE_PROP_END_OF_LIST(),
915
};
916

    
917
static void virtio_blk_class_init(ObjectClass *klass, void *data)
918
{
919
    DeviceClass *dc = DEVICE_CLASS(klass);
920
    PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
921

    
922
    k->init = virtio_blk_init_pci;
923
    k->exit = virtio_blk_exit_pci;
924
    k->vendor_id = PCI_VENDOR_ID_REDHAT_QUMRANET;
925
    k->device_id = PCI_DEVICE_ID_VIRTIO_BLOCK;
926
    k->revision = VIRTIO_PCI_ABI_VERSION;
927
    k->class_id = PCI_CLASS_STORAGE_SCSI;
928
    dc->reset = virtio_pci_reset;
929
    dc->props = virtio_blk_properties;
930
}
931

    
932
static TypeInfo virtio_blk_info = {
933
    .name          = "virtio-blk-pci",
934
    .parent        = TYPE_PCI_DEVICE,
935
    .instance_size = sizeof(VirtIOPCIProxy),
936
    .class_init    = virtio_blk_class_init,
937
};
938

    
939
static Property virtio_net_properties[] = {
940
    DEFINE_PROP_BIT("ioeventfd", VirtIOPCIProxy, flags, VIRTIO_PCI_FLAG_USE_IOEVENTFD_BIT, false),
941
    DEFINE_PROP_UINT32("vectors", VirtIOPCIProxy, nvectors, 3),
942
    DEFINE_VIRTIO_NET_FEATURES(VirtIOPCIProxy, host_features),
943
    DEFINE_NIC_PROPERTIES(VirtIOPCIProxy, nic),
944
    DEFINE_PROP_UINT32("x-txtimer", VirtIOPCIProxy, net.txtimer, TX_TIMER_INTERVAL),
945
    DEFINE_PROP_INT32("x-txburst", VirtIOPCIProxy, net.txburst, TX_BURST),
946
    DEFINE_PROP_STRING("tx", VirtIOPCIProxy, net.tx),
947
    DEFINE_PROP_END_OF_LIST(),
948
};
949

    
950
static void virtio_net_class_init(ObjectClass *klass, void *data)
951
{
952
    DeviceClass *dc = DEVICE_CLASS(klass);
953
    PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
954

    
955
    k->init = virtio_net_init_pci;
956
    k->exit = virtio_net_exit_pci;
957
    k->romfile = "pxe-virtio.rom";
958
    k->vendor_id = PCI_VENDOR_ID_REDHAT_QUMRANET;
959
    k->device_id = PCI_DEVICE_ID_VIRTIO_NET;
960
    k->revision = VIRTIO_PCI_ABI_VERSION;
961
    k->class_id = PCI_CLASS_NETWORK_ETHERNET;
962
    dc->reset = virtio_pci_reset;
963
    dc->props = virtio_net_properties;
964
}
965

    
966
static TypeInfo virtio_net_info = {
967
    .name          = "virtio-net-pci",
968
    .parent        = TYPE_PCI_DEVICE,
969
    .instance_size = sizeof(VirtIOPCIProxy),
970
    .class_init    = virtio_net_class_init,
971
};
972

    
973
static Property virtio_serial_properties[] = {
974
    DEFINE_PROP_BIT("ioeventfd", VirtIOPCIProxy, flags, VIRTIO_PCI_FLAG_USE_IOEVENTFD_BIT, true),
975
    DEFINE_PROP_UINT32("vectors", VirtIOPCIProxy, nvectors, DEV_NVECTORS_UNSPECIFIED),
976
    DEFINE_PROP_HEX32("class", VirtIOPCIProxy, class_code, 0),
977
    DEFINE_VIRTIO_COMMON_FEATURES(VirtIOPCIProxy, host_features),
978
    DEFINE_PROP_UINT32("max_ports", VirtIOPCIProxy, serial.max_virtserial_ports, 31),
979
    DEFINE_PROP_END_OF_LIST(),
980
};
981

    
982
static void virtio_serial_class_init(ObjectClass *klass, void *data)
983
{
984
    DeviceClass *dc = DEVICE_CLASS(klass);
985
    PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
986

    
987
    k->init = virtio_serial_init_pci;
988
    k->exit = virtio_serial_exit_pci;
989
    k->vendor_id = PCI_VENDOR_ID_REDHAT_QUMRANET;
990
    k->device_id = PCI_DEVICE_ID_VIRTIO_CONSOLE;
991
    k->revision = VIRTIO_PCI_ABI_VERSION;
992
    k->class_id = PCI_CLASS_COMMUNICATION_OTHER;
993
    dc->reset = virtio_pci_reset;
994
    dc->props = virtio_serial_properties;
995
}
996

    
997
static TypeInfo virtio_serial_info = {
998
    .name          = "virtio-serial-pci",
999
    .parent        = TYPE_PCI_DEVICE,
1000
    .instance_size = sizeof(VirtIOPCIProxy),
1001
    .class_init    = virtio_serial_class_init,
1002
};
1003

    
1004
static Property virtio_balloon_properties[] = {
1005
    DEFINE_VIRTIO_COMMON_FEATURES(VirtIOPCIProxy, host_features),
1006
    DEFINE_PROP_HEX32("class", VirtIOPCIProxy, class_code, 0),
1007
    DEFINE_PROP_END_OF_LIST(),
1008
};
1009

    
1010
static void virtio_balloon_class_init(ObjectClass *klass, void *data)
1011
{
1012
    DeviceClass *dc = DEVICE_CLASS(klass);
1013
    PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
1014

    
1015
    k->init = virtio_balloon_init_pci;
1016
    k->exit = virtio_balloon_exit_pci;
1017
    k->vendor_id = PCI_VENDOR_ID_REDHAT_QUMRANET;
1018
    k->device_id = PCI_DEVICE_ID_VIRTIO_BALLOON;
1019
    k->revision = VIRTIO_PCI_ABI_VERSION;
1020
    k->class_id = PCI_CLASS_OTHERS;
1021
    dc->reset = virtio_pci_reset;
1022
    dc->props = virtio_balloon_properties;
1023
}
1024

    
1025
static TypeInfo virtio_balloon_info = {
1026
    .name          = "virtio-balloon-pci",
1027
    .parent        = TYPE_PCI_DEVICE,
1028
    .instance_size = sizeof(VirtIOPCIProxy),
1029
    .class_init    = virtio_balloon_class_init,
1030
};
1031

    
1032
static void virtio_rng_initfn(Object *obj)
1033
{
1034
    PCIDevice *pci_dev = PCI_DEVICE(obj);
1035
    VirtIOPCIProxy *proxy = DO_UPCAST(VirtIOPCIProxy, pci_dev, pci_dev);
1036

    
1037
    object_property_add_link(obj, "rng", TYPE_RNG_BACKEND,
1038
                             (Object **)&proxy->rng.rng, NULL);
1039
}
1040

    
1041
static Property virtio_rng_properties[] = {
1042
    DEFINE_VIRTIO_COMMON_FEATURES(VirtIOPCIProxy, host_features),
1043
    /* Set a default rate limit of 2^47 bytes per minute or roughly 2TB/s.  If
1044
       you have an entropy source capable of generating more entropy than this
1045
       and you can pass it through via virtio-rng, then hats off to you.  Until
1046
       then, this is unlimited for all practical purposes.
1047
    */
1048
    DEFINE_PROP_UINT64("max-bytes", VirtIOPCIProxy, rng.max_bytes, INT64_MAX),
1049
    DEFINE_PROP_UINT32("period", VirtIOPCIProxy, rng.period_ms, 1 << 16),
1050
    DEFINE_PROP_END_OF_LIST(),
1051
};
1052

    
1053
static void virtio_rng_class_init(ObjectClass *klass, void *data)
1054
{
1055
    DeviceClass *dc = DEVICE_CLASS(klass);
1056
    PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
1057

    
1058
    k->init = virtio_rng_init_pci;
1059
    k->exit = virtio_rng_exit_pci;
1060
    k->vendor_id = PCI_VENDOR_ID_REDHAT_QUMRANET;
1061
    k->device_id = PCI_DEVICE_ID_VIRTIO_RNG;
1062
    k->revision = VIRTIO_PCI_ABI_VERSION;
1063
    k->class_id = PCI_CLASS_OTHERS;
1064
    dc->reset = virtio_pci_reset;
1065
    dc->props = virtio_rng_properties;
1066
}
1067

    
1068
static TypeInfo virtio_rng_info = {
1069
    .name          = "virtio-rng-pci",
1070
    .parent        = TYPE_PCI_DEVICE,
1071
    .instance_size = sizeof(VirtIOPCIProxy),
1072
    .instance_init = virtio_rng_initfn,
1073
    .class_init    = virtio_rng_class_init,
1074
};
1075

    
1076
static int virtio_scsi_init_pci(PCIDevice *pci_dev)
1077
{
1078
    VirtIOPCIProxy *proxy = DO_UPCAST(VirtIOPCIProxy, pci_dev, pci_dev);
1079
    VirtIODevice *vdev;
1080

    
1081
    vdev = virtio_scsi_init(&pci_dev->qdev, &proxy->scsi);
1082
    if (!vdev) {
1083
        return -EINVAL;
1084
    }
1085

    
1086
    vdev->nvectors = proxy->nvectors == DEV_NVECTORS_UNSPECIFIED
1087
                                        ? proxy->scsi.num_queues + 3
1088
                                        : proxy->nvectors;
1089
    virtio_init_pci(proxy, vdev);
1090

    
1091
    /* make the actual value visible */
1092
    proxy->nvectors = vdev->nvectors;
1093
    return 0;
1094
}
1095

    
1096
static void virtio_scsi_exit_pci(PCIDevice *pci_dev)
1097
{
1098
    VirtIOPCIProxy *proxy = DO_UPCAST(VirtIOPCIProxy, pci_dev, pci_dev);
1099

    
1100
    virtio_scsi_exit(proxy->vdev);
1101
    virtio_exit_pci(pci_dev);
1102
}
1103

    
1104
static Property virtio_scsi_properties[] = {
1105
    DEFINE_PROP_BIT("ioeventfd", VirtIOPCIProxy, flags, VIRTIO_PCI_FLAG_USE_IOEVENTFD_BIT, true),
1106
    DEFINE_PROP_UINT32("vectors", VirtIOPCIProxy, nvectors, DEV_NVECTORS_UNSPECIFIED),
1107
    DEFINE_VIRTIO_SCSI_PROPERTIES(VirtIOPCIProxy, host_features, scsi),
1108
    DEFINE_PROP_END_OF_LIST(),
1109
};
1110

    
1111
static void virtio_scsi_class_init(ObjectClass *klass, void *data)
1112
{
1113
    DeviceClass *dc = DEVICE_CLASS(klass);
1114
    PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
1115

    
1116
    k->init = virtio_scsi_init_pci;
1117
    k->exit = virtio_scsi_exit_pci;
1118
    k->vendor_id = PCI_VENDOR_ID_REDHAT_QUMRANET;
1119
    k->device_id = PCI_DEVICE_ID_VIRTIO_SCSI;
1120
    k->revision = 0x00;
1121
    k->class_id = PCI_CLASS_STORAGE_SCSI;
1122
    dc->reset = virtio_pci_reset;
1123
    dc->props = virtio_scsi_properties;
1124
}
1125

    
1126
static TypeInfo virtio_scsi_info = {
1127
    .name          = "virtio-scsi-pci",
1128
    .parent        = TYPE_PCI_DEVICE,
1129
    .instance_size = sizeof(VirtIOPCIProxy),
1130
    .class_init    = virtio_scsi_class_init,
1131
};
1132

    
1133
static void virtio_pci_register_types(void)
1134
{
1135
    type_register_static(&virtio_blk_info);
1136
    type_register_static(&virtio_net_info);
1137
    type_register_static(&virtio_serial_info);
1138
    type_register_static(&virtio_balloon_info);
1139
    type_register_static(&virtio_scsi_info);
1140
    type_register_static(&virtio_rng_info);
1141
}
1142

    
1143
type_init(virtio_pci_register_types)