]> Git Repo - qemu.git/blob - tests/libqos/virtio-pci.h
libqos: add VIRTIO PCI 1.0 support
[qemu.git] / tests / libqos / virtio-pci.h
1 /*
2  * libqos virtio PCI definitions
3  *
4  * Copyright (c) 2014 Marc MarĂ­
5  *
6  * This work is licensed under the terms of the GNU GPL, version 2 or later.
7  * See the COPYING file in the top-level directory.
8  */
9
10 #ifndef LIBQOS_VIRTIO_PCI_H
11 #define LIBQOS_VIRTIO_PCI_H
12
13 #include "libqos/virtio.h"
14 #include "libqos/pci.h"
15 #include "libqos/qgraph.h"
16
17 typedef struct QVirtioPCIMSIXOps QVirtioPCIMSIXOps;
18
19 typedef struct QVirtioPCIDevice {
20     QOSGraphObject obj;
21     QVirtioDevice vdev;
22     QPCIDevice *pdev;
23     QPCIBar bar;
24     const QVirtioPCIMSIXOps *msix_ops;
25     uint16_t config_msix_entry;
26     uint64_t config_msix_addr;
27     uint32_t config_msix_data;
28
29     int bar_idx;
30
31     /* VIRTIO 1.0 */
32     uint32_t common_cfg_offset;
33     uint32_t notify_cfg_offset;
34     uint32_t notify_off_multiplier;
35     uint32_t isr_cfg_offset;
36     uint32_t device_cfg_offset;
37 } QVirtioPCIDevice;
38
39 struct QVirtioPCIMSIXOps {
40     /* Set the Configuration Vector for MSI-X */
41     void (*set_config_vector)(QVirtioPCIDevice *d, uint16_t entry);
42
43     /* Set the Queue Vector for MSI-X */
44     void (*set_queue_vector)(QVirtioPCIDevice *d, uint16_t vq_idx,
45                              uint16_t entry);
46 };
47
48 typedef struct QVirtQueuePCI {
49     QVirtQueue vq;
50     uint16_t msix_entry;
51     uint64_t msix_addr;
52     uint32_t msix_data;
53
54     /* VIRTIO 1.0 */
55     uint64_t notify_offset;
56 } QVirtQueuePCI;
57
58 void virtio_pci_init(QVirtioPCIDevice *dev, QPCIBus *bus, QPCIAddress * addr);
59 QVirtioPCIDevice *virtio_pci_new(QPCIBus *bus, QPCIAddress * addr);
60
61 /* virtio-pci object functions available for subclasses that
62  * override the original start_hw and destroy
63  * function. All virtio-xxx-pci subclass that override must
64  * take care of calling these two functions in the respective
65  * places
66  */
67 void qvirtio_pci_destructor(QOSGraphObject *obj);
68 void qvirtio_pci_start_hw(QOSGraphObject *obj);
69
70
71 void qvirtio_pci_device_enable(QVirtioPCIDevice *d);
72 void qvirtio_pci_device_disable(QVirtioPCIDevice *d);
73
74 void qvirtio_pci_set_msix_configuration_vector(QVirtioPCIDevice *d,
75                                         QGuestAllocator *alloc, uint16_t entry);
76 void qvirtqueue_pci_msix_setup(QVirtioPCIDevice *d, QVirtQueuePCI *vqpci,
77                                         QGuestAllocator *alloc, uint16_t entry);
78
79 /* Used by Legacy and Modern virtio-pci code */
80 QVirtQueue *qvirtio_pci_virtqueue_setup_common(QVirtioDevice *d,
81                                                QGuestAllocator *alloc,
82                                                uint16_t index);
83 void qvirtio_pci_virtqueue_cleanup_common(QVirtQueue *vq,
84                                           QGuestAllocator *alloc);
85
86 #endif
This page took 0.028565 seconds and 4 git commands to generate.