xref: /openbmc/qemu/include/hw/pci/pcie_sriov.h (revision e818c01a)
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.
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  * Return: The size of added capability. 0 if the user did not create VFs.
52  *         -1 if failed.
53  */
54 int16_t pcie_sriov_pf_init_from_user_created_vfs(PCIDevice *dev,
55                                                  uint16_t offset,
56                                                  Error **errp);
57 
58 bool pcie_sriov_register_device(PCIDevice *dev, Error **errp);
59 void pcie_sriov_unregister_device(PCIDevice *dev);
60 
61 /*
62  * Default (minimal) page size support values
63  * as required by the SR/IOV standard:
64  * 0x553 << 12 = 0x553000 = 4K + 8K + 64K + 256K + 1M + 4M
65  */
66 #define SRIOV_SUP_PGSIZE_MINREQ 0x553
67 
68 /*
69  * Optionally add supported page sizes to the mask of supported page sizes
70  * Page size values are interpreted as opt_sup_pgsize << 12.
71  */
72 void pcie_sriov_pf_add_sup_pgsize(PCIDevice *dev, uint16_t opt_sup_pgsize);
73 
74 /* SR/IOV capability config write handler */
75 void pcie_sriov_config_write(PCIDevice *dev, uint32_t address,
76                              uint32_t val, int len);
77 
78 void pcie_sriov_pf_post_load(PCIDevice *dev);
79 
80 /* Reset SR/IOV */
81 void pcie_sriov_pf_reset(PCIDevice *dev);
82 
83 /* Get logical VF number of a VF - only valid for VFs */
84 uint16_t pcie_sriov_vf_number(PCIDevice *dev);
85 
86 /*
87  * Get the physical function that owns this VF.
88  * Returns NULL if dev is not a virtual function
89  */
90 PCIDevice *pcie_sriov_get_pf(PCIDevice *dev);
91 
92 /*
93  * Get the n-th VF of this physical function - only valid for PF.
94  * Returns NULL if index is invalid
95  */
96 PCIDevice *pcie_sriov_get_vf_at_index(PCIDevice *dev, int n);
97 
98 /* Returns the current number of virtual functions. */
99 uint16_t pcie_sriov_num_vfs(PCIDevice *dev);
100 
101 #endif /* QEMU_PCIE_SRIOV_H */
102