xref: /openbmc/qemu/tests/qtest/libqos/virtio-pci.h (revision 2e1cacfb)
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 "virtio.h"
14 #include "pci.h"
15 #include "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
87