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