1 /* 2 * pcie_sriov.h: 3 * 4 * Implementation of SR/IOV emulation support. 5 * 6 * Copyright (c) 2015 Knut Omang <knut.omang@oracle.com> 7 * 8 * This work is licensed under the terms of the GNU GPL, version 2 or later. 9 * See the COPYING file in the top-level directory. 10 * 11 */ 12 13 #ifndef QEMU_PCIE_SRIOV_H 14 #define QEMU_PCIE_SRIOV_H 15 16 struct PCIESriovPF { 17 uint16_t num_vfs; /* Number of virtual functions created */ 18 uint8_t vf_bar_type[PCI_NUM_REGIONS]; /* Store type for each VF bar */ 19 const char *vfname; /* Reference to the device type used for the VFs */ 20 PCIDevice **vf; /* Pointer to an array of num_vfs VF devices */ 21 }; 22 23 struct PCIESriovVF { 24 PCIDevice *pf; /* Pointer back to owner physical function */ 25 uint16_t vf_number; /* Logical VF number of this function */ 26 }; 27 28 void pcie_sriov_pf_init(PCIDevice *dev, uint16_t offset, 29 const char *vfname, uint16_t vf_dev_id, 30 uint16_t init_vfs, uint16_t total_vfs, 31 uint16_t vf_offset, uint16_t vf_stride); 32 void pcie_sriov_pf_exit(PCIDevice *dev); 33 34 /* Set up a VF bar in the SR/IOV bar area */ 35 void pcie_sriov_pf_init_vf_bar(PCIDevice *dev, int region_num, 36 uint8_t type, dma_addr_t size); 37 38 /* Instantiate a bar for a VF */ 39 void pcie_sriov_vf_register_bar(PCIDevice *dev, int region_num, 40 MemoryRegion *memory); 41 42 /* 43 * Default (minimal) page size support values 44 * as required by the SR/IOV standard: 45 * 0x553 << 12 = 0x553000 = 4K + 8K + 64K + 256K + 1M + 4M 46 */ 47 #define SRIOV_SUP_PGSIZE_MINREQ 0x553 48 49 /* 50 * Optionally add supported page sizes to the mask of supported page sizes 51 * Page size values are interpreted as opt_sup_pgsize << 12. 52 */ 53 void pcie_sriov_pf_add_sup_pgsize(PCIDevice *dev, uint16_t opt_sup_pgsize); 54 55 /* SR/IOV capability config write handler */ 56 void pcie_sriov_config_write(PCIDevice *dev, uint32_t address, 57 uint32_t val, int len); 58 59 /* Reset SR/IOV VF Enable bit to unregister all VFs */ 60 void pcie_sriov_pf_disable_vfs(PCIDevice *dev); 61 62 /* Get logical VF number of a VF - only valid for VFs */ 63 uint16_t pcie_sriov_vf_number(PCIDevice *dev); 64 65 /* 66 * Get the physical function that owns this VF. 67 * Returns NULL if dev is not a virtual function 68 */ 69 PCIDevice *pcie_sriov_get_pf(PCIDevice *dev); 70 71 /* 72 * Get the n-th VF of this physical function - only valid for PF. 73 * Returns NULL if index is invalid 74 */ 75 PCIDevice *pcie_sriov_get_vf_at_index(PCIDevice *dev, int n); 76 77 #endif /* QEMU_PCIE_SRIOV_H */ 78