File: pcie_sriov.h

package info (click to toggle)
qemu 1%3A7.2%2Bdfsg-7%2Bdeb12u13
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, bookworm-proposed-updates
  • size: 288,192 kB
  • sloc: ansic: 2,701,923; pascal: 112,708; python: 62,697; sh: 50,281; asm: 48,732; makefile: 17,260; cpp: 9,441; perl: 8,084; xml: 2,911; objc: 1,870; php: 1,299; tcl: 1,188; yacc: 604; lex: 363; sql: 71; awk: 35; sed: 11; javascript: 7
file content (80 lines) | stat: -rw-r--r-- 2,651 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
/*
 * pcie_sriov.h:
 *
 * Implementation of SR/IOV emulation support.
 *
 * Copyright (c) 2015 Knut Omang <knut.omang@oracle.com>
 *
 * This work is licensed under the terms of the GNU GPL, version 2 or later.
 * See the COPYING file in the top-level directory.
 *
 */

#ifndef QEMU_PCIE_SRIOV_H
#define QEMU_PCIE_SRIOV_H

struct PCIESriovPF {
    uint16_t num_vfs;   /* Number of virtual functions created */
    uint8_t vf_bar_type[PCI_NUM_REGIONS];   /* Store type for each VF bar */
    const char *vfname; /* Reference to the device type used for the VFs */
    PCIDevice **vf;     /* Pointer to an array of num_vfs VF devices */
};

struct PCIESriovVF {
    PCIDevice *pf;      /* Pointer back to owner physical function */
    uint16_t vf_number; /* Logical VF number of this function */
};

void pcie_sriov_pf_init(PCIDevice *dev, uint16_t offset,
                        const char *vfname, uint16_t vf_dev_id,
                        uint16_t init_vfs, uint16_t total_vfs,
                        uint16_t vf_offset, uint16_t vf_stride);
void pcie_sriov_pf_exit(PCIDevice *dev);

/* Set up a VF bar in the SR/IOV bar area */
void pcie_sriov_pf_init_vf_bar(PCIDevice *dev, int region_num,
                               uint8_t type, dma_addr_t size);

/* Instantiate a bar for a VF */
void pcie_sriov_vf_register_bar(PCIDevice *dev, int region_num,
                                MemoryRegion *memory);

/*
 * Default (minimal) page size support values
 * as required by the SR/IOV standard:
 * 0x553 << 12 = 0x553000 = 4K + 8K + 64K + 256K + 1M + 4M
 */
#define SRIOV_SUP_PGSIZE_MINREQ 0x553

/*
 * Optionally add supported page sizes to the mask of supported page sizes
 * Page size values are interpreted as opt_sup_pgsize << 12.
 */
void pcie_sriov_pf_add_sup_pgsize(PCIDevice *dev, uint16_t opt_sup_pgsize);

/* SR/IOV capability config write handler */
void pcie_sriov_config_write(PCIDevice *dev, uint32_t address,
                             uint32_t val, int len);

/* Reset SR/IOV VF Enable bit to unregister all VFs */
void pcie_sriov_pf_disable_vfs(PCIDevice *dev);

/* Get logical VF number of a VF - only valid for VFs */
uint16_t pcie_sriov_vf_number(PCIDevice *dev);

/*
 * Get the physical function that owns this VF.
 * Returns NULL if dev is not a virtual function
 */
PCIDevice *pcie_sriov_get_pf(PCIDevice *dev);

/*
 * Get the n-th VF of this physical function - only valid for PF.
 * Returns NULL if index is invalid
 */
PCIDevice *pcie_sriov_get_vf_at_index(PCIDevice *dev, int n);

/* Returns the current number of virtual functions. */
uint16_t pcie_sriov_num_vfs(PCIDevice *dev);

#endif /* QEMU_PCIE_SRIOV_H */