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 #include "hw/pci/pci.h" 17 18 typedef struct PCIESriovPF { 19 uint8_t vf_bar_type[PCI_NUM_REGIONS]; /* Store type for each VF bar */ 20 PCIDevice **vf; /* Pointer to an array of num_vfs VF devices */ 21 bool vf_user_created; /* If VFs are created by user */ 22 } PCIESriovPF; 23 24 typedef struct PCIESriovVF { 25 PCIDevice *pf; /* Pointer back to owner physical function */ 26 uint16_t vf_number; /* Logical VF number of this function */ 27 } PCIESriovVF; 28 29 bool pcie_sriov_pf_init(PCIDevice *dev, uint16_t offset, 30 const char *vfname, uint16_t vf_dev_id, 31 uint16_t init_vfs, uint16_t total_vfs, 32 uint16_t vf_offset, uint16_t vf_stride, 33 Error **errp); 34 void pcie_sriov_pf_exit(PCIDevice *dev); 35 36 /* Set up a VF bar in the SR/IOV bar area */ 37 void pcie_sriov_pf_init_vf_bar(PCIDevice *dev, int region_num, 38 uint8_t type, dma_addr_t size); 39 40 /* Instantiate a bar for a VF */ 41 void pcie_sriov_vf_register_bar(PCIDevice *dev, int region_num, 42 MemoryRegion *memory); 43 44 /** 45 * pcie_sriov_pf_init_from_user_created_vfs() - Initialize PF with user-created 46 * VFs, adding ARI to PF 47 * @dev: A PCIe device being realized. 48 * @offset: The offset of the SR-IOV capability. 49 * @errp: pointer to Error*, to store an error if it happens. 50 * 51 * Initializes a PF with user-created VFs, adding the ARI extended capability to 52 * the PF. The VFs should call pcie_ari_init() to form an ARI device. 53 * 54 * Return: The size of added capabilities. 0 if the user did not create VFs. 55 * -1 if failed. 56 */ 57 int16_t pcie_sriov_pf_init_from_user_created_vfs(PCIDevice *dev, 58 uint16_t offset, 59 Error **errp); 60 61 bool pcie_sriov_register_device(PCIDevice *dev, Error **errp); 62 void pcie_sriov_unregister_device(PCIDevice *dev); 63 64 /* 65 * Default (minimal) page size support values 66 * as required by the SR/IOV standard: 67 * 0x553 << 12 = 0x553000 = 4K + 8K + 64K + 256K + 1M + 4M 68 */ 69 #define SRIOV_SUP_PGSIZE_MINREQ 0x553 70 71 /* 72 * Optionally add supported page sizes to the mask of supported page sizes 73 * Page size values are interpreted as opt_sup_pgsize << 12. 74 */ 75 void pcie_sriov_pf_add_sup_pgsize(PCIDevice *dev, uint16_t opt_sup_pgsize); 76 77 /* SR/IOV capability config write handler */ 78 void pcie_sriov_config_write(PCIDevice *dev, uint32_t address, 79 uint32_t val, int len); 80 81 void pcie_sriov_pf_post_load(PCIDevice *dev); 82 83 /* Reset SR/IOV */ 84 void pcie_sriov_pf_reset(PCIDevice *dev); 85 86 /* Get logical VF number of a VF - only valid for VFs */ 87 uint16_t pcie_sriov_vf_number(PCIDevice *dev); 88 89 /* 90 * Get the physical function that owns this VF. 91 * Returns NULL if dev is not a virtual function 92 */ 93 PCIDevice *pcie_sriov_get_pf(PCIDevice *dev); 94 95 /* 96 * Get the n-th VF of this physical function - only valid for PF. 97 * Returns NULL if index is invalid 98 */ 99 PCIDevice *pcie_sriov_get_vf_at_index(PCIDevice *dev, int n); 100 101 /* Returns the current number of virtual functions. */ 102 uint16_t pcie_sriov_num_vfs(PCIDevice *dev); 103 104 #endif /* QEMU_PCIE_SRIOV_H */ 105