xref: /qemu/tests/qtest/libqos/virtio-pci.h (revision d08f68b8e858fc761e88ae66349b6eab1235e3fe)
1311e666aSMarc Marí /*
2311e666aSMarc Marí  * libqos virtio PCI definitions
3311e666aSMarc Marí  *
4311e666aSMarc Marí  * Copyright (c) 2014 Marc Marí
5311e666aSMarc Marí  *
6311e666aSMarc Marí  * This work is licensed under the terms of the GNU GPL, version 2 or later.
7311e666aSMarc Marí  * See the COPYING file in the top-level directory.
8311e666aSMarc Marí  */
9311e666aSMarc Marí 
10311e666aSMarc Marí #ifndef LIBQOS_VIRTIO_PCI_H
11311e666aSMarc Marí #define LIBQOS_VIRTIO_PCI_H
12311e666aSMarc Marí 
13311e666aSMarc Marí #include "libqos/virtio.h"
14311e666aSMarc Marí #include "libqos/pci.h"
151ce66eceSEmanuele Giuseppe Esposito #include "libqos/qgraph.h"
16311e666aSMarc Marí 
17957d8d1dSStefan Hajnoczi typedef struct QVirtioPCIMSIXOps QVirtioPCIMSIXOps;
18957d8d1dSStefan Hajnoczi 
19311e666aSMarc Marí typedef struct QVirtioPCIDevice {
201ce66eceSEmanuele Giuseppe Esposito     QOSGraphObject obj;
21311e666aSMarc Marí     QVirtioDevice vdev;
22311e666aSMarc Marí     QPCIDevice *pdev;
23b4ba67d9SDavid Gibson     QPCIBar bar;
24957d8d1dSStefan Hajnoczi     const QVirtioPCIMSIXOps *msix_ops;
2558368113SMarc Marí     uint16_t config_msix_entry;
2658368113SMarc Marí     uint64_t config_msix_addr;
2758368113SMarc Marí     uint32_t config_msix_data;
28f17429e5SStefan Hajnoczi 
29f17429e5SStefan Hajnoczi     int bar_idx;
30*d08f68b8SStefan Hajnoczi 
31*d08f68b8SStefan Hajnoczi     /* VIRTIO 1.0 */
32*d08f68b8SStefan Hajnoczi     uint32_t common_cfg_offset;
33*d08f68b8SStefan Hajnoczi     uint32_t notify_cfg_offset;
34*d08f68b8SStefan Hajnoczi     uint32_t notify_off_multiplier;
35*d08f68b8SStefan Hajnoczi     uint32_t isr_cfg_offset;
36*d08f68b8SStefan Hajnoczi     uint32_t device_cfg_offset;
37311e666aSMarc Marí } QVirtioPCIDevice;
38311e666aSMarc Marí 
39957d8d1dSStefan Hajnoczi struct QVirtioPCIMSIXOps {
40957d8d1dSStefan Hajnoczi     /* Set the Configuration Vector for MSI-X */
41957d8d1dSStefan Hajnoczi     void (*set_config_vector)(QVirtioPCIDevice *d, uint16_t entry);
42957d8d1dSStefan Hajnoczi 
43957d8d1dSStefan Hajnoczi     /* Set the Queue Vector for MSI-X */
44957d8d1dSStefan Hajnoczi     void (*set_queue_vector)(QVirtioPCIDevice *d, uint16_t vq_idx,
45957d8d1dSStefan Hajnoczi                              uint16_t entry);
46957d8d1dSStefan Hajnoczi };
47957d8d1dSStefan Hajnoczi 
4858368113SMarc Marí typedef struct QVirtQueuePCI {
4958368113SMarc Marí     QVirtQueue vq;
5058368113SMarc Marí     uint16_t msix_entry;
5158368113SMarc Marí     uint64_t msix_addr;
5258368113SMarc Marí     uint32_t msix_data;
53*d08f68b8SStefan Hajnoczi 
54*d08f68b8SStefan Hajnoczi     /* VIRTIO 1.0 */
55*d08f68b8SStefan Hajnoczi     uint64_t notify_offset;
5658368113SMarc Marí } QVirtQueuePCI;
5758368113SMarc Marí 
581ce66eceSEmanuele Giuseppe Esposito void virtio_pci_init(QVirtioPCIDevice *dev, QPCIBus *bus, QPCIAddress * addr);
591ce66eceSEmanuele Giuseppe Esposito QVirtioPCIDevice *virtio_pci_new(QPCIBus *bus, QPCIAddress * addr);
600c0eb302SMarc-André Lureau 
611ce66eceSEmanuele Giuseppe Esposito /* virtio-pci object functions available for subclasses that
621ce66eceSEmanuele Giuseppe Esposito  * override the original start_hw and destroy
631ce66eceSEmanuele Giuseppe Esposito  * function. All virtio-xxx-pci subclass that override must
641ce66eceSEmanuele Giuseppe Esposito  * take care of calling these two functions in the respective
651ce66eceSEmanuele Giuseppe Esposito  * places
661ce66eceSEmanuele Giuseppe Esposito  */
671ce66eceSEmanuele Giuseppe Esposito void qvirtio_pci_destructor(QOSGraphObject *obj);
681ce66eceSEmanuele Giuseppe Esposito void qvirtio_pci_start_hw(QOSGraphObject *obj);
691ce66eceSEmanuele Giuseppe Esposito 
701ce66eceSEmanuele Giuseppe Esposito 
7146e0cf76SMarc Marí void qvirtio_pci_device_enable(QVirtioPCIDevice *d);
7246e0cf76SMarc Marí void qvirtio_pci_device_disable(QVirtioPCIDevice *d);
7358368113SMarc Marí 
7458368113SMarc Marí void qvirtio_pci_set_msix_configuration_vector(QVirtioPCIDevice *d,
7558368113SMarc Marí                                         QGuestAllocator *alloc, uint16_t entry);
7658368113SMarc Marí void qvirtqueue_pci_msix_setup(QVirtioPCIDevice *d, QVirtQueuePCI *vqpci,
7758368113SMarc Marí                                         QGuestAllocator *alloc, uint16_t entry);
78e56536bcSStefan Hajnoczi 
79e56536bcSStefan Hajnoczi /* Used by Legacy and Modern virtio-pci code */
80e56536bcSStefan Hajnoczi QVirtQueue *qvirtio_pci_virtqueue_setup_common(QVirtioDevice *d,
81e56536bcSStefan Hajnoczi                                                QGuestAllocator *alloc,
82e56536bcSStefan Hajnoczi                                                uint16_t index);
83e56536bcSStefan Hajnoczi void qvirtio_pci_virtqueue_cleanup_common(QVirtQueue *vq,
84e56536bcSStefan Hajnoczi                                           QGuestAllocator *alloc);
85e56536bcSStefan Hajnoczi 
86311e666aSMarc Marí #endif
87