Statistics
| Branch: | Revision:

root / hw / virtio-pci.c @ 9807cacc

History | View | Annotate | Download (36.1 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
/* virtio device */
96
/* DeviceState to VirtIOPCIProxy. For use off data-path. TODO: use QOM. */
97
static inline VirtIOPCIProxy *to_virtio_pci_proxy(DeviceState *d)
98
{
99
    return container_of(d, VirtIOPCIProxy, pci_dev.qdev);
100
}
101

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

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

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

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

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

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

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

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

    
198
static void virtio_pci_start_ioeventfd(VirtIOPCIProxy *proxy)
199
{
200
    int n, r;
201

    
202
    if (!(proxy->flags & VIRTIO_PCI_FLAG_USE_IOEVENTFD) ||
203
        proxy->ioeventfd_disabled ||
204
        proxy->ioeventfd_started) {
205
        return;
206
    }
207

    
208
    for (n = 0; n < VIRTIO_PCI_QUEUE_MAX; n++) {
209
        if (!virtio_queue_get_num(proxy->vdev, n)) {
210
            continue;
211
        }
212

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

    
221
assign_error:
222
    while (--n >= 0) {
223
        if (!virtio_queue_get_num(proxy->vdev, n)) {
224
            continue;
225
        }
226

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

    
234
static void virtio_pci_stop_ioeventfd(VirtIOPCIProxy *proxy)
235
{
236
    int r;
237
    int n;
238

    
239
    if (!proxy->ioeventfd_started) {
240
        return;
241
    }
242

    
243
    for (n = 0; n < VIRTIO_PCI_QUEUE_MAX; n++) {
244
        if (!virtio_queue_get_num(proxy->vdev, n)) {
245
            continue;
246
        }
247

    
248
        r = virtio_pci_set_host_notifier_internal(proxy, n, false, false);
249
        assert(r >= 0);
250
    }
251
    proxy->ioeventfd_started = false;
252
}
253

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

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

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

    
301
        virtio_set_status(vdev, val & 0xFF);
302

    
303
        if (val & VIRTIO_CONFIG_S_DRIVER_OK) {
304
            virtio_pci_start_ioeventfd(proxy);
305
        }
306

    
307
        if (vdev->status == 0) {
308
            virtio_reset(proxy->vdev);
309
            msix_unuse_all_vectors(&proxy->pci_dev);
310
        }
311

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

    
342
static uint32_t virtio_ioport_read(VirtIOPCIProxy *proxy, uint32_t addr)
343
{
344
    VirtIODevice *vdev = proxy->vdev;
345
    uint32_t ret = 0xFFFFFFFF;
346

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

    
383
    return ret;
384
}
385

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

    
397
    switch (size) {
398
    case 1:
399
        val = virtio_config_readb(proxy->vdev, addr);
400
        break;
401
    case 2:
402
        val = virtio_config_readw(proxy->vdev, addr);
403
        break;
404
    case 4:
405
        val = virtio_config_readl(proxy->vdev, addr);
406
        break;
407
    }
408
    return val;
409
}
410

    
411
static void virtio_pci_config_write(void *opaque, hwaddr addr,
412
                                    uint64_t val, unsigned size)
413
{
414
    VirtIOPCIProxy *proxy = opaque;
415
    uint32_t config = VIRTIO_PCI_CONFIG(&proxy->pci_dev);
416
    if (addr < config) {
417
        virtio_ioport_write(proxy, addr, val);
418
        return;
419
    }
420
    addr -= config;
421
    /*
422
     * Virtio-PCI is odd. Ioports are LE but config space is target native
423
     * endian.
424
     */
425
    switch (size) {
426
    case 1:
427
        virtio_config_writeb(proxy->vdev, addr, val);
428
        break;
429
    case 2:
430
        virtio_config_writew(proxy->vdev, addr, val);
431
        break;
432
    case 4:
433
        virtio_config_writel(proxy->vdev, addr, val);
434
        break;
435
    }
436
}
437

    
438
static const MemoryRegionOps virtio_pci_config_ops = {
439
    .read = virtio_pci_config_read,
440
    .write = virtio_pci_config_write,
441
    .impl = {
442
        .min_access_size = 1,
443
        .max_access_size = 4,
444
    },
445
    .endianness = DEVICE_NATIVE_ENDIAN,
446
};
447

    
448
static void virtio_write_config(PCIDevice *pci_dev, uint32_t address,
449
                                uint32_t val, int len)
450
{
451
    VirtIOPCIProxy *proxy = DO_UPCAST(VirtIOPCIProxy, pci_dev, pci_dev);
452

    
453
    pci_default_write_config(pci_dev, address, val, len);
454

    
455
    if (range_covers_byte(address, len, PCI_COMMAND) &&
456
        !(pci_dev->config[PCI_COMMAND] & PCI_COMMAND_MASTER) &&
457
        !(proxy->flags & VIRTIO_PCI_FLAG_BUS_MASTER_BUG)) {
458
        virtio_pci_stop_ioeventfd(proxy);
459
        virtio_set_status(proxy->vdev,
460
                          proxy->vdev->status & ~VIRTIO_CONFIG_S_DRIVER_OK);
461
    }
462
}
463

    
464
static unsigned virtio_pci_get_features(DeviceState *d)
465
{
466
    VirtIOPCIProxy *proxy = to_virtio_pci_proxy(d);
467
    return proxy->host_features;
468
}
469

    
470
static int kvm_virtio_pci_vq_vector_use(VirtIOPCIProxy *proxy,
471
                                        unsigned int queue_no,
472
                                        unsigned int vector,
473
                                        MSIMessage msg)
474
{
475
    VirtQueue *vq = virtio_get_queue(proxy->vdev, queue_no);
476
    EventNotifier *n = virtio_queue_get_guest_notifier(vq);
477
    VirtIOIRQFD *irqfd = &proxy->vector_irqfd[vector];
478
    int ret;
479

    
480
    if (irqfd->users == 0) {
481
        ret = kvm_irqchip_add_msi_route(kvm_state, msg);
482
        if (ret < 0) {
483
            return ret;
484
        }
485
        irqfd->virq = ret;
486
    }
487
    irqfd->users++;
488

    
489
    ret = kvm_irqchip_add_irqfd_notifier(kvm_state, n, irqfd->virq);
490
    if (ret < 0) {
491
        if (--irqfd->users == 0) {
492
            kvm_irqchip_release_virq(kvm_state, irqfd->virq);
493
        }
494
        return ret;
495
    }
496
    return 0;
497
}
498

    
499
static void kvm_virtio_pci_vq_vector_release(VirtIOPCIProxy *proxy,
500
                                             unsigned int queue_no,
501
                                             unsigned int vector)
502
{
503
    VirtQueue *vq = virtio_get_queue(proxy->vdev, queue_no);
504
    EventNotifier *n = virtio_queue_get_guest_notifier(vq);
505
    VirtIOIRQFD *irqfd = &proxy->vector_irqfd[vector];
506
    int ret;
507

    
508
    ret = kvm_irqchip_remove_irqfd_notifier(kvm_state, n, irqfd->virq);
509
    assert(ret == 0);
510

    
511
    if (--irqfd->users == 0) {
512
        kvm_irqchip_release_virq(kvm_state, irqfd->virq);
513
    }
514
}
515

    
516
static int kvm_virtio_pci_vector_use(PCIDevice *dev, unsigned vector,
517
                                     MSIMessage msg)
518
{
519
    VirtIOPCIProxy *proxy = container_of(dev, VirtIOPCIProxy, pci_dev);
520
    VirtIODevice *vdev = proxy->vdev;
521
    int ret, queue_no;
522

    
523
    for (queue_no = 0; queue_no < VIRTIO_PCI_QUEUE_MAX; queue_no++) {
524
        if (!virtio_queue_get_num(vdev, queue_no)) {
525
            break;
526
        }
527
        if (virtio_queue_vector(vdev, queue_no) != vector) {
528
            continue;
529
        }
530
        ret = kvm_virtio_pci_vq_vector_use(proxy, queue_no, vector, msg);
531
        if (ret < 0) {
532
            goto undo;
533
        }
534
    }
535
    return 0;
536

    
537
undo:
538
    while (--queue_no >= 0) {
539
        if (virtio_queue_vector(vdev, queue_no) != vector) {
540
            continue;
541
        }
542
        kvm_virtio_pci_vq_vector_release(proxy, queue_no, vector);
543
    }
544
    return ret;
545
}
546

    
547
static void kvm_virtio_pci_vector_release(PCIDevice *dev, unsigned vector)
548
{
549
    VirtIOPCIProxy *proxy = container_of(dev, VirtIOPCIProxy, pci_dev);
550
    VirtIODevice *vdev = proxy->vdev;
551
    int queue_no;
552

    
553
    for (queue_no = 0; queue_no < VIRTIO_PCI_QUEUE_MAX; queue_no++) {
554
        if (!virtio_queue_get_num(vdev, queue_no)) {
555
            break;
556
        }
557
        if (virtio_queue_vector(vdev, queue_no) != vector) {
558
            continue;
559
        }
560
        kvm_virtio_pci_vq_vector_release(proxy, queue_no, vector);
561
    }
562
}
563

    
564
static void kvm_virtio_pci_vector_poll(PCIDevice *dev,
565
                                       unsigned int vector_start,
566
                                       unsigned int vector_end)
567
{
568
    VirtIOPCIProxy *proxy = container_of(dev, VirtIOPCIProxy, pci_dev);
569
    VirtIODevice *vdev = proxy->vdev;
570
    int queue_no;
571
    unsigned int vector;
572
    EventNotifier *notifier;
573
    VirtQueue *vq;
574

    
575
    for (queue_no = 0; queue_no < VIRTIO_PCI_QUEUE_MAX; queue_no++) {
576
        if (!virtio_queue_get_num(vdev, queue_no)) {
577
            break;
578
        }
579
        vector = virtio_queue_vector(vdev, queue_no);
580
        if (vector < vector_start || vector >= vector_end ||
581
            !msix_is_masked(dev, vector)) {
582
            continue;
583
        }
584
        vq = virtio_get_queue(vdev, queue_no);
585
        notifier = virtio_queue_get_guest_notifier(vq);
586
        if (event_notifier_test_and_clear(notifier)) {
587
            msix_set_pending(dev, vector);
588
        }
589
    }
590
}
591

    
592
static int virtio_pci_set_guest_notifier(DeviceState *d, int n, bool assign,
593
                                         bool with_irqfd)
594
{
595
    VirtIOPCIProxy *proxy = to_virtio_pci_proxy(d);
596
    VirtQueue *vq = virtio_get_queue(proxy->vdev, n);
597
    EventNotifier *notifier = virtio_queue_get_guest_notifier(vq);
598

    
599
    if (assign) {
600
        int r = event_notifier_init(notifier, 0);
601
        if (r < 0) {
602
            return r;
603
        }
604
        virtio_queue_set_guest_notifier_fd_handler(vq, true, with_irqfd);
605
    } else {
606
        virtio_queue_set_guest_notifier_fd_handler(vq, false, with_irqfd);
607
        event_notifier_cleanup(notifier);
608
    }
609

    
610
    return 0;
611
}
612

    
613
static bool virtio_pci_query_guest_notifiers(DeviceState *d)
614
{
615
    VirtIOPCIProxy *proxy = to_virtio_pci_proxy(d);
616
    return msix_enabled(&proxy->pci_dev);
617
}
618

    
619
static int virtio_pci_set_guest_notifiers(DeviceState *d, bool assign)
620
{
621
    VirtIOPCIProxy *proxy = to_virtio_pci_proxy(d);
622
    VirtIODevice *vdev = proxy->vdev;
623
    int r, n;
624
    bool with_irqfd = msix_enabled(&proxy->pci_dev) &&
625
        kvm_msi_via_irqfd_enabled();
626

    
627
    /* Must unset vector notifier while guest notifier is still assigned */
628
    if (proxy->vector_irqfd && !assign) {
629
        msix_unset_vector_notifiers(&proxy->pci_dev);
630
        g_free(proxy->vector_irqfd);
631
        proxy->vector_irqfd = NULL;
632
    }
633

    
634
    for (n = 0; n < VIRTIO_PCI_QUEUE_MAX; n++) {
635
        if (!virtio_queue_get_num(vdev, n)) {
636
            break;
637
        }
638

    
639
        r = virtio_pci_set_guest_notifier(d, n, assign,
640
                                          kvm_msi_via_irqfd_enabled());
641
        if (r < 0) {
642
            goto assign_error;
643
        }
644
    }
645

    
646
    /* Must set vector notifier after guest notifier has been assigned */
647
    if (with_irqfd && assign) {
648
        proxy->vector_irqfd =
649
            g_malloc0(sizeof(*proxy->vector_irqfd) *
650
                      msix_nr_vectors_allocated(&proxy->pci_dev));
651
        r = msix_set_vector_notifiers(&proxy->pci_dev,
652
                                      kvm_virtio_pci_vector_use,
653
                                      kvm_virtio_pci_vector_release,
654
                                      kvm_virtio_pci_vector_poll);
655
        if (r < 0) {
656
            goto assign_error;
657
        }
658
    }
659

    
660
    return 0;
661

    
662
assign_error:
663
    /* We get here on assignment failure. Recover by undoing for VQs 0 .. n. */
664
    assert(assign);
665
    while (--n >= 0) {
666
        virtio_pci_set_guest_notifier(d, n, !assign, with_irqfd);
667
    }
668
    return r;
669
}
670

    
671
static int virtio_pci_set_host_notifier(DeviceState *d, int n, bool assign)
672
{
673
    VirtIOPCIProxy *proxy = to_virtio_pci_proxy(d);
674

    
675
    /* Stop using ioeventfd for virtqueue kick if the device starts using host
676
     * notifiers.  This makes it easy to avoid stepping on each others' toes.
677
     */
678
    proxy->ioeventfd_disabled = assign;
679
    if (assign) {
680
        virtio_pci_stop_ioeventfd(proxy);
681
    }
682
    /* We don't need to start here: it's not needed because backend
683
     * currently only stops on status change away from ok,
684
     * reset, vmstop and such. If we do add code to start here,
685
     * need to check vmstate, device state etc. */
686
    return virtio_pci_set_host_notifier_internal(proxy, n, assign, false);
687
}
688

    
689
static void virtio_pci_vmstate_change(DeviceState *d, bool running)
690
{
691
    VirtIOPCIProxy *proxy = to_virtio_pci_proxy(d);
692

    
693
    if (running) {
694
        /* Try to find out if the guest has bus master disabled, but is
695
           in ready state. Then we have a buggy guest OS. */
696
        if ((proxy->vdev->status & VIRTIO_CONFIG_S_DRIVER_OK) &&
697
            !(proxy->pci_dev.config[PCI_COMMAND] & PCI_COMMAND_MASTER)) {
698
            proxy->flags |= VIRTIO_PCI_FLAG_BUS_MASTER_BUG;
699
        }
700
        virtio_pci_start_ioeventfd(proxy);
701
    } else {
702
        virtio_pci_stop_ioeventfd(proxy);
703
    }
704
}
705

    
706
static const VirtIOBindings virtio_pci_bindings = {
707
    .notify = virtio_pci_notify,
708
    .save_config = virtio_pci_save_config,
709
    .load_config = virtio_pci_load_config,
710
    .save_queue = virtio_pci_save_queue,
711
    .load_queue = virtio_pci_load_queue,
712
    .get_features = virtio_pci_get_features,
713
    .query_guest_notifiers = virtio_pci_query_guest_notifiers,
714
    .set_host_notifier = virtio_pci_set_host_notifier,
715
    .set_guest_notifiers = virtio_pci_set_guest_notifiers,
716
    .vmstate_change = virtio_pci_vmstate_change,
717
};
718

    
719
void virtio_init_pci(VirtIOPCIProxy *proxy, VirtIODevice *vdev)
720
{
721
    uint8_t *config;
722
    uint32_t size;
723

    
724
    proxy->vdev = vdev;
725

    
726
    config = proxy->pci_dev.config;
727

    
728
    if (proxy->class_code) {
729
        pci_config_set_class(config, proxy->class_code);
730
    }
731
    pci_set_word(config + PCI_SUBSYSTEM_VENDOR_ID,
732
                 pci_get_word(config + PCI_VENDOR_ID));
733
    pci_set_word(config + PCI_SUBSYSTEM_ID, vdev->device_id);
734
    config[PCI_INTERRUPT_PIN] = 1;
735

    
736
    if (vdev->nvectors &&
737
        msix_init_exclusive_bar(&proxy->pci_dev, vdev->nvectors, 1)) {
738
        vdev->nvectors = 0;
739
    }
740

    
741
    proxy->pci_dev.config_write = virtio_write_config;
742

    
743
    size = VIRTIO_PCI_REGION_SIZE(&proxy->pci_dev) + vdev->config_len;
744
    if (size & (size-1))
745
        size = 1 << qemu_fls(size);
746

    
747
    memory_region_init_io(&proxy->bar, &virtio_pci_config_ops, proxy,
748
                          "virtio-pci", size);
749
    pci_register_bar(&proxy->pci_dev, 0, PCI_BASE_ADDRESS_SPACE_IO,
750
                     &proxy->bar);
751

    
752
    if (!kvm_has_many_ioeventfds()) {
753
        proxy->flags &= ~VIRTIO_PCI_FLAG_USE_IOEVENTFD;
754
    }
755

    
756
    virtio_bind_device(vdev, &virtio_pci_bindings, DEVICE(proxy));
757
    proxy->host_features |= 0x1 << VIRTIO_F_NOTIFY_ON_EMPTY;
758
    proxy->host_features |= 0x1 << VIRTIO_F_BAD_FEATURE;
759
    proxy->host_features = vdev->get_features(vdev, proxy->host_features);
760
}
761

    
762
static int virtio_blk_init_pci(PCIDevice *pci_dev)
763
{
764
    VirtIOPCIProxy *proxy = DO_UPCAST(VirtIOPCIProxy, pci_dev, pci_dev);
765
    VirtIODevice *vdev;
766

    
767
    if (proxy->class_code != PCI_CLASS_STORAGE_SCSI &&
768
        proxy->class_code != PCI_CLASS_STORAGE_OTHER)
769
        proxy->class_code = PCI_CLASS_STORAGE_SCSI;
770

    
771
    vdev = virtio_blk_init(&pci_dev->qdev, &proxy->blk);
772
    if (!vdev) {
773
        return -1;
774
    }
775
    vdev->nvectors = proxy->nvectors;
776
    virtio_init_pci(proxy, vdev);
777
    /* make the actual value visible */
778
    proxy->nvectors = vdev->nvectors;
779
    return 0;
780
}
781

    
782
static void virtio_exit_pci(PCIDevice *pci_dev)
783
{
784
    VirtIOPCIProxy *proxy = DO_UPCAST(VirtIOPCIProxy, pci_dev, pci_dev);
785

    
786
    memory_region_destroy(&proxy->bar);
787
    msix_uninit_exclusive_bar(pci_dev);
788
}
789

    
790
static void virtio_blk_exit_pci(PCIDevice *pci_dev)
791
{
792
    VirtIOPCIProxy *proxy = DO_UPCAST(VirtIOPCIProxy, pci_dev, pci_dev);
793

    
794
    virtio_pci_stop_ioeventfd(proxy);
795
    virtio_blk_exit(proxy->vdev);
796
    virtio_exit_pci(pci_dev);
797
}
798

    
799
static int virtio_serial_init_pci(PCIDevice *pci_dev)
800
{
801
    VirtIOPCIProxy *proxy = DO_UPCAST(VirtIOPCIProxy, pci_dev, pci_dev);
802
    VirtIODevice *vdev;
803

    
804
    if (proxy->class_code != PCI_CLASS_COMMUNICATION_OTHER &&
805
        proxy->class_code != PCI_CLASS_DISPLAY_OTHER && /* qemu 0.10 */
806
        proxy->class_code != PCI_CLASS_OTHERS)          /* qemu-kvm  */
807
        proxy->class_code = PCI_CLASS_COMMUNICATION_OTHER;
808

    
809
    vdev = virtio_serial_init(&pci_dev->qdev, &proxy->serial);
810
    if (!vdev) {
811
        return -1;
812
    }
813
    vdev->nvectors = proxy->nvectors == DEV_NVECTORS_UNSPECIFIED
814
                                        ? proxy->serial.max_virtserial_ports + 1
815
                                        : proxy->nvectors;
816
    virtio_init_pci(proxy, vdev);
817
    proxy->nvectors = vdev->nvectors;
818
    return 0;
819
}
820

    
821
static void virtio_serial_exit_pci(PCIDevice *pci_dev)
822
{
823
    VirtIOPCIProxy *proxy = DO_UPCAST(VirtIOPCIProxy, pci_dev, pci_dev);
824

    
825
    virtio_pci_stop_ioeventfd(proxy);
826
    virtio_serial_exit(proxy->vdev);
827
    virtio_exit_pci(pci_dev);
828
}
829

    
830
static int virtio_net_init_pci(PCIDevice *pci_dev)
831
{
832
    VirtIOPCIProxy *proxy = DO_UPCAST(VirtIOPCIProxy, pci_dev, pci_dev);
833
    VirtIODevice *vdev;
834

    
835
    vdev = virtio_net_init(&pci_dev->qdev, &proxy->nic, &proxy->net);
836

    
837
    vdev->nvectors = proxy->nvectors;
838
    virtio_init_pci(proxy, vdev);
839

    
840
    /* make the actual value visible */
841
    proxy->nvectors = vdev->nvectors;
842
    return 0;
843
}
844

    
845
static void virtio_net_exit_pci(PCIDevice *pci_dev)
846
{
847
    VirtIOPCIProxy *proxy = DO_UPCAST(VirtIOPCIProxy, pci_dev, pci_dev);
848

    
849
    virtio_pci_stop_ioeventfd(proxy);
850
    virtio_net_exit(proxy->vdev);
851
    virtio_exit_pci(pci_dev);
852
}
853

    
854
static int virtio_balloon_init_pci(PCIDevice *pci_dev)
855
{
856
    VirtIOPCIProxy *proxy = DO_UPCAST(VirtIOPCIProxy, pci_dev, pci_dev);
857
    VirtIODevice *vdev;
858

    
859
    if (proxy->class_code != PCI_CLASS_OTHERS &&
860
        proxy->class_code != PCI_CLASS_MEMORY_RAM) { /* qemu < 1.1 */
861
        proxy->class_code = PCI_CLASS_OTHERS;
862
    }
863

    
864
    vdev = virtio_balloon_init(&pci_dev->qdev);
865
    if (!vdev) {
866
        return -1;
867
    }
868
    virtio_init_pci(proxy, vdev);
869
    return 0;
870
}
871

    
872
static void virtio_balloon_exit_pci(PCIDevice *pci_dev)
873
{
874
    VirtIOPCIProxy *proxy = DO_UPCAST(VirtIOPCIProxy, pci_dev, pci_dev);
875

    
876
    virtio_pci_stop_ioeventfd(proxy);
877
    virtio_balloon_exit(proxy->vdev);
878
    virtio_exit_pci(pci_dev);
879
}
880

    
881
static int virtio_rng_init_pci(PCIDevice *pci_dev)
882
{
883
    VirtIOPCIProxy *proxy = DO_UPCAST(VirtIOPCIProxy, pci_dev, pci_dev);
884
    VirtIODevice *vdev;
885

    
886
    if (proxy->rng.rng == NULL) {
887
        proxy->rng.default_backend = RNG_RANDOM(object_new(TYPE_RNG_RANDOM));
888

    
889
        object_property_add_child(OBJECT(pci_dev),
890
                                  "default-backend",
891
                                  OBJECT(proxy->rng.default_backend),
892
                                  NULL);
893

    
894
        object_property_set_link(OBJECT(pci_dev),
895
                                 OBJECT(proxy->rng.default_backend),
896
                                 "rng", NULL);
897
    }
898

    
899
    vdev = virtio_rng_init(&pci_dev->qdev, &proxy->rng);
900
    if (!vdev) {
901
        return -1;
902
    }
903
    virtio_init_pci(proxy, vdev);
904
    return 0;
905
}
906

    
907
static void virtio_rng_exit_pci(PCIDevice *pci_dev)
908
{
909
    VirtIOPCIProxy *proxy = DO_UPCAST(VirtIOPCIProxy, pci_dev, pci_dev);
910

    
911
    virtio_pci_stop_ioeventfd(proxy);
912
    virtio_rng_exit(proxy->vdev);
913
    virtio_exit_pci(pci_dev);
914
}
915

    
916
static Property virtio_blk_properties[] = {
917
    DEFINE_PROP_HEX32("class", VirtIOPCIProxy, class_code, 0),
918
    DEFINE_BLOCK_PROPERTIES(VirtIOPCIProxy, blk.conf),
919
    DEFINE_BLOCK_CHS_PROPERTIES(VirtIOPCIProxy, blk.conf),
920
    DEFINE_PROP_STRING("serial", VirtIOPCIProxy, blk.serial),
921
#ifdef __linux__
922
    DEFINE_PROP_BIT("scsi", VirtIOPCIProxy, blk.scsi, 0, true),
923
#endif
924
    DEFINE_PROP_BIT("config-wce", VirtIOPCIProxy, blk.config_wce, 0, true),
925
    DEFINE_PROP_BIT("ioeventfd", VirtIOPCIProxy, flags, VIRTIO_PCI_FLAG_USE_IOEVENTFD_BIT, true),
926
#ifdef CONFIG_VIRTIO_BLK_DATA_PLANE
927
    DEFINE_PROP_BIT("x-data-plane", VirtIOPCIProxy, blk.data_plane, 0, false),
928
#endif
929
    DEFINE_PROP_UINT32("vectors", VirtIOPCIProxy, nvectors, 2),
930
    DEFINE_VIRTIO_BLK_FEATURES(VirtIOPCIProxy, host_features),
931
    DEFINE_PROP_END_OF_LIST(),
932
};
933

    
934
static void virtio_blk_class_init(ObjectClass *klass, void *data)
935
{
936
    DeviceClass *dc = DEVICE_CLASS(klass);
937
    PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
938

    
939
    k->init = virtio_blk_init_pci;
940
    k->exit = virtio_blk_exit_pci;
941
    k->vendor_id = PCI_VENDOR_ID_REDHAT_QUMRANET;
942
    k->device_id = PCI_DEVICE_ID_VIRTIO_BLOCK;
943
    k->revision = VIRTIO_PCI_ABI_VERSION;
944
    k->class_id = PCI_CLASS_STORAGE_SCSI;
945
    dc->reset = virtio_pci_reset;
946
    dc->props = virtio_blk_properties;
947
}
948

    
949
static TypeInfo virtio_blk_info = {
950
    .name          = "virtio-blk-pci",
951
    .parent        = TYPE_PCI_DEVICE,
952
    .instance_size = sizeof(VirtIOPCIProxy),
953
    .class_init    = virtio_blk_class_init,
954
};
955

    
956
static Property virtio_net_properties[] = {
957
    DEFINE_PROP_BIT("ioeventfd", VirtIOPCIProxy, flags, VIRTIO_PCI_FLAG_USE_IOEVENTFD_BIT, false),
958
    DEFINE_PROP_UINT32("vectors", VirtIOPCIProxy, nvectors, 3),
959
    DEFINE_VIRTIO_NET_FEATURES(VirtIOPCIProxy, host_features),
960
    DEFINE_NIC_PROPERTIES(VirtIOPCIProxy, nic),
961
    DEFINE_PROP_UINT32("x-txtimer", VirtIOPCIProxy, net.txtimer, TX_TIMER_INTERVAL),
962
    DEFINE_PROP_INT32("x-txburst", VirtIOPCIProxy, net.txburst, TX_BURST),
963
    DEFINE_PROP_STRING("tx", VirtIOPCIProxy, net.tx),
964
    DEFINE_PROP_END_OF_LIST(),
965
};
966

    
967
static void virtio_net_class_init(ObjectClass *klass, void *data)
968
{
969
    DeviceClass *dc = DEVICE_CLASS(klass);
970
    PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
971

    
972
    k->init = virtio_net_init_pci;
973
    k->exit = virtio_net_exit_pci;
974
    k->romfile = "pxe-virtio.rom";
975
    k->vendor_id = PCI_VENDOR_ID_REDHAT_QUMRANET;
976
    k->device_id = PCI_DEVICE_ID_VIRTIO_NET;
977
    k->revision = VIRTIO_PCI_ABI_VERSION;
978
    k->class_id = PCI_CLASS_NETWORK_ETHERNET;
979
    dc->reset = virtio_pci_reset;
980
    dc->props = virtio_net_properties;
981
}
982

    
983
static TypeInfo virtio_net_info = {
984
    .name          = "virtio-net-pci",
985
    .parent        = TYPE_PCI_DEVICE,
986
    .instance_size = sizeof(VirtIOPCIProxy),
987
    .class_init    = virtio_net_class_init,
988
};
989

    
990
static Property virtio_serial_properties[] = {
991
    DEFINE_PROP_BIT("ioeventfd", VirtIOPCIProxy, flags, VIRTIO_PCI_FLAG_USE_IOEVENTFD_BIT, true),
992
    DEFINE_PROP_UINT32("vectors", VirtIOPCIProxy, nvectors, DEV_NVECTORS_UNSPECIFIED),
993
    DEFINE_PROP_HEX32("class", VirtIOPCIProxy, class_code, 0),
994
    DEFINE_VIRTIO_COMMON_FEATURES(VirtIOPCIProxy, host_features),
995
    DEFINE_PROP_UINT32("max_ports", VirtIOPCIProxy, serial.max_virtserial_ports, 31),
996
    DEFINE_PROP_END_OF_LIST(),
997
};
998

    
999
static void virtio_serial_class_init(ObjectClass *klass, void *data)
1000
{
1001
    DeviceClass *dc = DEVICE_CLASS(klass);
1002
    PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
1003

    
1004
    k->init = virtio_serial_init_pci;
1005
    k->exit = virtio_serial_exit_pci;
1006
    k->vendor_id = PCI_VENDOR_ID_REDHAT_QUMRANET;
1007
    k->device_id = PCI_DEVICE_ID_VIRTIO_CONSOLE;
1008
    k->revision = VIRTIO_PCI_ABI_VERSION;
1009
    k->class_id = PCI_CLASS_COMMUNICATION_OTHER;
1010
    dc->reset = virtio_pci_reset;
1011
    dc->props = virtio_serial_properties;
1012
}
1013

    
1014
static TypeInfo virtio_serial_info = {
1015
    .name          = "virtio-serial-pci",
1016
    .parent        = TYPE_PCI_DEVICE,
1017
    .instance_size = sizeof(VirtIOPCIProxy),
1018
    .class_init    = virtio_serial_class_init,
1019
};
1020

    
1021
static Property virtio_balloon_properties[] = {
1022
    DEFINE_VIRTIO_COMMON_FEATURES(VirtIOPCIProxy, host_features),
1023
    DEFINE_PROP_HEX32("class", VirtIOPCIProxy, class_code, 0),
1024
    DEFINE_PROP_END_OF_LIST(),
1025
};
1026

    
1027
static void virtio_balloon_class_init(ObjectClass *klass, void *data)
1028
{
1029
    DeviceClass *dc = DEVICE_CLASS(klass);
1030
    PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
1031

    
1032
    k->init = virtio_balloon_init_pci;
1033
    k->exit = virtio_balloon_exit_pci;
1034
    k->vendor_id = PCI_VENDOR_ID_REDHAT_QUMRANET;
1035
    k->device_id = PCI_DEVICE_ID_VIRTIO_BALLOON;
1036
    k->revision = VIRTIO_PCI_ABI_VERSION;
1037
    k->class_id = PCI_CLASS_OTHERS;
1038
    dc->reset = virtio_pci_reset;
1039
    dc->props = virtio_balloon_properties;
1040
}
1041

    
1042
static TypeInfo virtio_balloon_info = {
1043
    .name          = "virtio-balloon-pci",
1044
    .parent        = TYPE_PCI_DEVICE,
1045
    .instance_size = sizeof(VirtIOPCIProxy),
1046
    .class_init    = virtio_balloon_class_init,
1047
};
1048

    
1049
static void virtio_rng_initfn(Object *obj)
1050
{
1051
    PCIDevice *pci_dev = PCI_DEVICE(obj);
1052
    VirtIOPCIProxy *proxy = DO_UPCAST(VirtIOPCIProxy, pci_dev, pci_dev);
1053

    
1054
    object_property_add_link(obj, "rng", TYPE_RNG_BACKEND,
1055
                             (Object **)&proxy->rng.rng, NULL);
1056
}
1057

    
1058
static Property virtio_rng_properties[] = {
1059
    DEFINE_VIRTIO_COMMON_FEATURES(VirtIOPCIProxy, host_features),
1060
    /* Set a default rate limit of 2^47 bytes per minute or roughly 2TB/s.  If
1061
       you have an entropy source capable of generating more entropy than this
1062
       and you can pass it through via virtio-rng, then hats off to you.  Until
1063
       then, this is unlimited for all practical purposes.
1064
    */
1065
    DEFINE_PROP_UINT64("max-bytes", VirtIOPCIProxy, rng.max_bytes, INT64_MAX),
1066
    DEFINE_PROP_UINT32("period", VirtIOPCIProxy, rng.period_ms, 1 << 16),
1067
    DEFINE_PROP_END_OF_LIST(),
1068
};
1069

    
1070
static void virtio_rng_class_init(ObjectClass *klass, void *data)
1071
{
1072
    DeviceClass *dc = DEVICE_CLASS(klass);
1073
    PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
1074

    
1075
    k->init = virtio_rng_init_pci;
1076
    k->exit = virtio_rng_exit_pci;
1077
    k->vendor_id = PCI_VENDOR_ID_REDHAT_QUMRANET;
1078
    k->device_id = PCI_DEVICE_ID_VIRTIO_RNG;
1079
    k->revision = VIRTIO_PCI_ABI_VERSION;
1080
    k->class_id = PCI_CLASS_OTHERS;
1081
    dc->reset = virtio_pci_reset;
1082
    dc->props = virtio_rng_properties;
1083
}
1084

    
1085
static TypeInfo virtio_rng_info = {
1086
    .name          = "virtio-rng-pci",
1087
    .parent        = TYPE_PCI_DEVICE,
1088
    .instance_size = sizeof(VirtIOPCIProxy),
1089
    .instance_init = virtio_rng_initfn,
1090
    .class_init    = virtio_rng_class_init,
1091
};
1092

    
1093
static int virtio_scsi_init_pci(PCIDevice *pci_dev)
1094
{
1095
    VirtIOPCIProxy *proxy = DO_UPCAST(VirtIOPCIProxy, pci_dev, pci_dev);
1096
    VirtIODevice *vdev;
1097

    
1098
    vdev = virtio_scsi_init(&pci_dev->qdev, &proxy->scsi);
1099
    if (!vdev) {
1100
        return -EINVAL;
1101
    }
1102

    
1103
    vdev->nvectors = proxy->nvectors == DEV_NVECTORS_UNSPECIFIED
1104
                                        ? proxy->scsi.num_queues + 3
1105
                                        : proxy->nvectors;
1106
    virtio_init_pci(proxy, vdev);
1107

    
1108
    /* make the actual value visible */
1109
    proxy->nvectors = vdev->nvectors;
1110
    return 0;
1111
}
1112

    
1113
static void virtio_scsi_exit_pci(PCIDevice *pci_dev)
1114
{
1115
    VirtIOPCIProxy *proxy = DO_UPCAST(VirtIOPCIProxy, pci_dev, pci_dev);
1116

    
1117
    virtio_scsi_exit(proxy->vdev);
1118
    virtio_exit_pci(pci_dev);
1119
}
1120

    
1121
static Property virtio_scsi_properties[] = {
1122
    DEFINE_PROP_BIT("ioeventfd", VirtIOPCIProxy, flags, VIRTIO_PCI_FLAG_USE_IOEVENTFD_BIT, true),
1123
    DEFINE_PROP_UINT32("vectors", VirtIOPCIProxy, nvectors, DEV_NVECTORS_UNSPECIFIED),
1124
    DEFINE_VIRTIO_SCSI_PROPERTIES(VirtIOPCIProxy, host_features, scsi),
1125
    DEFINE_PROP_END_OF_LIST(),
1126
};
1127

    
1128
static void virtio_scsi_class_init(ObjectClass *klass, void *data)
1129
{
1130
    DeviceClass *dc = DEVICE_CLASS(klass);
1131
    PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
1132

    
1133
    k->init = virtio_scsi_init_pci;
1134
    k->exit = virtio_scsi_exit_pci;
1135
    k->vendor_id = PCI_VENDOR_ID_REDHAT_QUMRANET;
1136
    k->device_id = PCI_DEVICE_ID_VIRTIO_SCSI;
1137
    k->revision = 0x00;
1138
    k->class_id = PCI_CLASS_STORAGE_SCSI;
1139
    dc->reset = virtio_pci_reset;
1140
    dc->props = virtio_scsi_properties;
1141
}
1142

    
1143
static TypeInfo virtio_scsi_info = {
1144
    .name          = "virtio-scsi-pci",
1145
    .parent        = TYPE_PCI_DEVICE,
1146
    .instance_size = sizeof(VirtIOPCIProxy),
1147
    .class_init    = virtio_scsi_class_init,
1148
};
1149

    
1150
static void virtio_pci_register_types(void)
1151
{
1152
    type_register_static(&virtio_blk_info);
1153
    type_register_static(&virtio_net_info);
1154
    type_register_static(&virtio_serial_info);
1155
    type_register_static(&virtio_balloon_info);
1156
    type_register_static(&virtio_scsi_info);
1157
    type_register_static(&virtio_rng_info);
1158
}
1159

    
1160
type_init(virtio_pci_register_types)