qemu/include/hw/pci/pcie_sriov.h
<<
>>
Prefs
   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
  18struct PCIESriovPF {
  19    uint16_t num_vfs;   /* Number of virtual functions created */
  20    uint8_t vf_bar_type[PCI_NUM_REGIONS];   /* Store type for each VF bar */
  21    const char *vfname; /* Reference to the device type used for the VFs */
  22    PCIDevice **vf;     /* Pointer to an array of num_vfs VF devices */
  23};
  24
  25struct PCIESriovVF {
  26    PCIDevice *pf;      /* Pointer back to owner physical function */
  27    uint16_t vf_number; /* Logical VF number of this function */
  28};
  29
  30void pcie_sriov_pf_init(PCIDevice *dev, uint16_t offset,
  31                        const char *vfname, uint16_t vf_dev_id,
  32                        uint16_t init_vfs, uint16_t total_vfs,
  33                        uint16_t vf_offset, uint16_t vf_stride);
  34void pcie_sriov_pf_exit(PCIDevice *dev);
  35
  36/* Set up a VF bar in the SR/IOV bar area */
  37void 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 */
  41void pcie_sriov_vf_register_bar(PCIDevice *dev, int region_num,
  42                                MemoryRegion *memory);
  43
  44/*
  45 * Default (minimal) page size support values
  46 * as required by the SR/IOV standard:
  47 * 0x553 << 12 = 0x553000 = 4K + 8K + 64K + 256K + 1M + 4M
  48 */
  49#define SRIOV_SUP_PGSIZE_MINREQ 0x553
  50
  51/*
  52 * Optionally add supported page sizes to the mask of supported page sizes
  53 * Page size values are interpreted as opt_sup_pgsize << 12.
  54 */
  55void pcie_sriov_pf_add_sup_pgsize(PCIDevice *dev, uint16_t opt_sup_pgsize);
  56
  57/* SR/IOV capability config write handler */
  58void pcie_sriov_config_write(PCIDevice *dev, uint32_t address,
  59                             uint32_t val, int len);
  60
  61/* Reset SR/IOV VF Enable bit to unregister all VFs */
  62void pcie_sriov_pf_disable_vfs(PCIDevice *dev);
  63
  64/* Get logical VF number of a VF - only valid for VFs */
  65uint16_t pcie_sriov_vf_number(PCIDevice *dev);
  66
  67/*
  68 * Get the physical function that owns this VF.
  69 * Returns NULL if dev is not a virtual function
  70 */
  71PCIDevice *pcie_sriov_get_pf(PCIDevice *dev);
  72
  73/*
  74 * Get the n-th VF of this physical function - only valid for PF.
  75 * Returns NULL if index is invalid
  76 */
  77PCIDevice *pcie_sriov_get_vf_at_index(PCIDevice *dev, int n);
  78
  79/* Returns the current number of virtual functions. */
  80uint16_t pcie_sriov_num_vfs(PCIDevice *dev);
  81
  82#endif /* QEMU_PCIE_SRIOV_H */
  83