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