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