xref: /qemu/tests/qtest/libqos/virtio-pci.h (revision 957d8d1d06fa15e1db50166d17a4fe9094f7fec3)
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í 
17*957d8d1dSStefan Hajnoczi typedef struct QVirtioPCIMSIXOps QVirtioPCIMSIXOps;
18*957d8d1dSStefan Hajnoczi 
19311e666aSMarc Marí typedef struct QVirtioPCIDevice {
201ce66eceSEmanuele Giuseppe Esposito     QOSGraphObject obj;
21311e666aSMarc Marí     QVirtioDevice vdev;
22311e666aSMarc Marí     QPCIDevice *pdev;
23b4ba67d9SDavid Gibson     QPCIBar bar;
24*957d8d1dSStefan 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;
28311e666aSMarc Marí } QVirtioPCIDevice;
29311e666aSMarc Marí 
30*957d8d1dSStefan Hajnoczi struct QVirtioPCIMSIXOps {
31*957d8d1dSStefan Hajnoczi     /* Set the Configuration Vector for MSI-X */
32*957d8d1dSStefan Hajnoczi     void (*set_config_vector)(QVirtioPCIDevice *d, uint16_t entry);
33*957d8d1dSStefan Hajnoczi 
34*957d8d1dSStefan Hajnoczi     /* Set the Queue Vector for MSI-X */
35*957d8d1dSStefan Hajnoczi     void (*set_queue_vector)(QVirtioPCIDevice *d, uint16_t vq_idx,
36*957d8d1dSStefan Hajnoczi                              uint16_t entry);
37*957d8d1dSStefan Hajnoczi };
38*957d8d1dSStefan Hajnoczi 
3958368113SMarc Marí typedef struct QVirtQueuePCI {
4058368113SMarc Marí     QVirtQueue vq;
4158368113SMarc Marí     uint16_t msix_entry;
4258368113SMarc Marí     uint64_t msix_addr;
4358368113SMarc Marí     uint32_t msix_data;
4458368113SMarc Marí } QVirtQueuePCI;
4558368113SMarc Marí 
4646e0cf76SMarc Marí extern const QVirtioBus qvirtio_pci;
4746e0cf76SMarc Marí 
481ce66eceSEmanuele Giuseppe Esposito void virtio_pci_init(QVirtioPCIDevice *dev, QPCIBus *bus, QPCIAddress * addr);
491ce66eceSEmanuele Giuseppe Esposito QVirtioPCIDevice *virtio_pci_new(QPCIBus *bus, QPCIAddress * addr);
500c0eb302SMarc-André Lureau 
511ce66eceSEmanuele Giuseppe Esposito /* virtio-pci object functions available for subclasses that
521ce66eceSEmanuele Giuseppe Esposito  * override the original start_hw and destroy
531ce66eceSEmanuele Giuseppe Esposito  * function. All virtio-xxx-pci subclass that override must
541ce66eceSEmanuele Giuseppe Esposito  * take care of calling these two functions in the respective
551ce66eceSEmanuele Giuseppe Esposito  * places
561ce66eceSEmanuele Giuseppe Esposito  */
571ce66eceSEmanuele Giuseppe Esposito void qvirtio_pci_destructor(QOSGraphObject *obj);
581ce66eceSEmanuele Giuseppe Esposito void qvirtio_pci_start_hw(QOSGraphObject *obj);
591ce66eceSEmanuele Giuseppe Esposito 
601ce66eceSEmanuele Giuseppe Esposito 
6146e0cf76SMarc Marí void qvirtio_pci_device_enable(QVirtioPCIDevice *d);
6246e0cf76SMarc Marí void qvirtio_pci_device_disable(QVirtioPCIDevice *d);
6358368113SMarc Marí 
6458368113SMarc Marí void qvirtio_pci_set_msix_configuration_vector(QVirtioPCIDevice *d,
6558368113SMarc Marí                                         QGuestAllocator *alloc, uint16_t entry);
6658368113SMarc Marí void qvirtqueue_pci_msix_setup(QVirtioPCIDevice *d, QVirtQueuePCI *vqpci,
6758368113SMarc Marí                                         QGuestAllocator *alloc, uint16_t entry);
68311e666aSMarc Marí #endif
69