qemu

FORK: QEMU emulator
git clone https://git.neptards.moe/neptards/qemu.git
Log | Files | Refs | Submodules | LICENSE

pcie_sriov.h (2550B)


      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 */