xref: /qemu/tests/qtest/libqos/virtio-pci.h (revision f17429e545dae46fbe85eebd89fec4e720a1e241)
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;
28*f17429e5SStefan Hajnoczi 
29*f17429e5SStefan Hajnoczi     int bar_idx;
30311e666aSMarc Marí } QVirtioPCIDevice;
31311e666aSMarc Marí 
32957d8d1dSStefan Hajnoczi struct QVirtioPCIMSIXOps {
33957d8d1dSStefan Hajnoczi     /* Set the Configuration Vector for MSI-X */
34957d8d1dSStefan Hajnoczi     void (*set_config_vector)(QVirtioPCIDevice *d, uint16_t entry);
35957d8d1dSStefan Hajnoczi 
36957d8d1dSStefan Hajnoczi     /* Set the Queue Vector for MSI-X */
37957d8d1dSStefan Hajnoczi     void (*set_queue_vector)(QVirtioPCIDevice *d, uint16_t vq_idx,
38957d8d1dSStefan Hajnoczi                              uint16_t entry);
39957d8d1dSStefan Hajnoczi };
40957d8d1dSStefan Hajnoczi 
4158368113SMarc Marí typedef struct QVirtQueuePCI {
4258368113SMarc Marí     QVirtQueue vq;
4358368113SMarc Marí     uint16_t msix_entry;
4458368113SMarc Marí     uint64_t msix_addr;
4558368113SMarc Marí     uint32_t msix_data;
4658368113SMarc Marí } QVirtQueuePCI;
4758368113SMarc Marí 
4846e0cf76SMarc Marí extern const QVirtioBus qvirtio_pci;
4946e0cf76SMarc Marí 
501ce66eceSEmanuele Giuseppe Esposito void virtio_pci_init(QVirtioPCIDevice *dev, QPCIBus *bus, QPCIAddress * addr);
511ce66eceSEmanuele Giuseppe Esposito QVirtioPCIDevice *virtio_pci_new(QPCIBus *bus, QPCIAddress * addr);
520c0eb302SMarc-André Lureau 
531ce66eceSEmanuele Giuseppe Esposito /* virtio-pci object functions available for subclasses that
541ce66eceSEmanuele Giuseppe Esposito  * override the original start_hw and destroy
551ce66eceSEmanuele Giuseppe Esposito  * function. All virtio-xxx-pci subclass that override must
561ce66eceSEmanuele Giuseppe Esposito  * take care of calling these two functions in the respective
571ce66eceSEmanuele Giuseppe Esposito  * places
581ce66eceSEmanuele Giuseppe Esposito  */
591ce66eceSEmanuele Giuseppe Esposito void qvirtio_pci_destructor(QOSGraphObject *obj);
601ce66eceSEmanuele Giuseppe Esposito void qvirtio_pci_start_hw(QOSGraphObject *obj);
611ce66eceSEmanuele Giuseppe Esposito 
621ce66eceSEmanuele Giuseppe Esposito 
6346e0cf76SMarc Marí void qvirtio_pci_device_enable(QVirtioPCIDevice *d);
6446e0cf76SMarc Marí void qvirtio_pci_device_disable(QVirtioPCIDevice *d);
6558368113SMarc Marí 
6658368113SMarc Marí void qvirtio_pci_set_msix_configuration_vector(QVirtioPCIDevice *d,
6758368113SMarc Marí                                         QGuestAllocator *alloc, uint16_t entry);
6858368113SMarc Marí void qvirtqueue_pci_msix_setup(QVirtioPCIDevice *d, QVirtQueuePCI *vqpci,
6958368113SMarc Marí                                         QGuestAllocator *alloc, uint16_t entry);
70e56536bcSStefan Hajnoczi 
71e56536bcSStefan Hajnoczi /* Used by Legacy and Modern virtio-pci code */
72e56536bcSStefan Hajnoczi QVirtQueue *qvirtio_pci_virtqueue_setup_common(QVirtioDevice *d,
73e56536bcSStefan Hajnoczi                                                QGuestAllocator *alloc,
74e56536bcSStefan Hajnoczi                                                uint16_t index);
75e56536bcSStefan Hajnoczi void qvirtio_pci_virtqueue_cleanup_common(QVirtQueue *vq,
76e56536bcSStefan Hajnoczi                                           QGuestAllocator *alloc);
77e56536bcSStefan Hajnoczi 
78311e666aSMarc Marí #endif
79