xref: /qemu/tests/qtest/libqos/virtio-pci.h (revision e56536bc8b897efdf069c25e68202e521cdcbb49)
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 } QVirtioPCIDevice;
29 
30 struct QVirtioPCIMSIXOps {
31     /* Set the Configuration Vector for MSI-X */
32     void (*set_config_vector)(QVirtioPCIDevice *d, uint16_t entry);
33 
34     /* Set the Queue Vector for MSI-X */
35     void (*set_queue_vector)(QVirtioPCIDevice *d, uint16_t vq_idx,
36                              uint16_t entry);
37 };
38 
39 typedef struct QVirtQueuePCI {
40     QVirtQueue vq;
41     uint16_t msix_entry;
42     uint64_t msix_addr;
43     uint32_t msix_data;
44 } QVirtQueuePCI;
45 
46 extern const QVirtioBus qvirtio_pci;
47 
48 void virtio_pci_init(QVirtioPCIDevice *dev, QPCIBus *bus, QPCIAddress * addr);
49 QVirtioPCIDevice *virtio_pci_new(QPCIBus *bus, QPCIAddress * addr);
50 
51 /* virtio-pci object functions available for subclasses that
52  * override the original start_hw and destroy
53  * function. All virtio-xxx-pci subclass that override must
54  * take care of calling these two functions in the respective
55  * places
56  */
57 void qvirtio_pci_destructor(QOSGraphObject *obj);
58 void qvirtio_pci_start_hw(QOSGraphObject *obj);
59 
60 
61 void qvirtio_pci_device_enable(QVirtioPCIDevice *d);
62 void qvirtio_pci_device_disable(QVirtioPCIDevice *d);
63 
64 void qvirtio_pci_set_msix_configuration_vector(QVirtioPCIDevice *d,
65                                         QGuestAllocator *alloc, uint16_t entry);
66 void qvirtqueue_pci_msix_setup(QVirtioPCIDevice *d, QVirtQueuePCI *vqpci,
67                                         QGuestAllocator *alloc, uint16_t entry);
68 
69 /* Used by Legacy and Modern virtio-pci code */
70 QVirtQueue *qvirtio_pci_virtqueue_setup_common(QVirtioDevice *d,
71                                                QGuestAllocator *alloc,
72                                                uint16_t index);
73 void qvirtio_pci_virtqueue_cleanup_common(QVirtQueue *vq,
74                                           QGuestAllocator *alloc);
75 
76 #endif
77