1
2
3
4
5
6
7
8
9
10
11
12#ifndef HW_VFIO_VFIO_PCI_H
13#define HW_VFIO_VFIO_PCI_H
14
15#include "qemu-common.h"
16#include "exec/memory.h"
17#include "hw/pci/pci.h"
18#include "hw/vfio/vfio-common.h"
19#include "qemu/event_notifier.h"
20#include "qemu/queue.h"
21#include "qemu/timer.h"
22
23#define PCI_ANY_ID (~0)
24
25struct VFIOPCIDevice;
26
27typedef struct VFIOQuirk {
28 QLIST_ENTRY(VFIOQuirk) next;
29 void *data;
30 int nr_mem;
31 MemoryRegion *mem;
32} VFIOQuirk;
33
34typedef struct VFIOBAR {
35 VFIORegion region;
36 MemoryRegion *mr;
37 size_t size;
38 uint8_t type;
39 bool ioport;
40 bool mem64;
41 QLIST_HEAD(, VFIOQuirk) quirks;
42} VFIOBAR;
43
44typedef struct VFIOVGARegion {
45 MemoryRegion mem;
46 off_t offset;
47 int nr;
48 QLIST_HEAD(, VFIOQuirk) quirks;
49} VFIOVGARegion;
50
51typedef struct VFIOVGA {
52 off_t fd_offset;
53 int fd;
54 VFIOVGARegion region[QEMU_PCI_VGA_NUM_REGIONS];
55} VFIOVGA;
56
57typedef struct VFIOINTx {
58 bool pending;
59 bool kvm_accel;
60 uint8_t pin;
61 EventNotifier interrupt;
62 EventNotifier unmask;
63 PCIINTxRoute route;
64 uint32_t mmap_timeout;
65 QEMUTimer *mmap_timer;
66} VFIOINTx;
67
68typedef struct VFIOMSIVector {
69
70
71
72
73
74
75
76
77
78 EventNotifier interrupt;
79 EventNotifier kvm_interrupt;
80 struct VFIOPCIDevice *vdev;
81 int virq;
82 bool use;
83} VFIOMSIVector;
84
85enum {
86 VFIO_INT_NONE = 0,
87 VFIO_INT_INTx = 1,
88 VFIO_INT_MSI = 2,
89 VFIO_INT_MSIX = 3,
90};
91
92
93typedef struct VFIOMSIXInfo {
94 uint8_t table_bar;
95 uint8_t pba_bar;
96 uint16_t entries;
97 uint32_t table_offset;
98 uint32_t pba_offset;
99 unsigned long *pending;
100} VFIOMSIXInfo;
101
102typedef struct VFIOPCIDevice {
103 PCIDevice pdev;
104 VFIODevice vbasedev;
105 VFIOINTx intx;
106 unsigned int config_size;
107 uint8_t *emulated_config_bits;
108 off_t config_offset;
109 unsigned int rom_size;
110 off_t rom_offset;
111 void *rom;
112 int msi_cap_size;
113 VFIOMSIVector *msi_vectors;
114 VFIOMSIXInfo *msix;
115 int nr_vectors;
116 int interrupt;
117 VFIOBAR bars[PCI_NUM_REGIONS - 1];
118 VFIOVGA *vga;
119 void *igd_opregion;
120 PCIHostDeviceAddress host;
121 EventNotifier err_notifier;
122 EventNotifier req_notifier;
123 int (*resetfn)(struct VFIOPCIDevice *);
124 uint32_t vendor_id;
125 uint32_t device_id;
126 uint32_t sub_vendor_id;
127 uint32_t sub_device_id;
128 uint32_t features;
129#define VFIO_FEATURE_ENABLE_VGA_BIT 0
130#define VFIO_FEATURE_ENABLE_VGA (1 << VFIO_FEATURE_ENABLE_VGA_BIT)
131#define VFIO_FEATURE_ENABLE_REQ_BIT 1
132#define VFIO_FEATURE_ENABLE_REQ (1 << VFIO_FEATURE_ENABLE_REQ_BIT)
133#define VFIO_FEATURE_ENABLE_IGD_OPREGION_BIT 2
134#define VFIO_FEATURE_ENABLE_IGD_OPREGION \
135 (1 << VFIO_FEATURE_ENABLE_IGD_OPREGION_BIT)
136 OnOffAuto display;
137 int32_t bootindex;
138 uint32_t igd_gms;
139 OffAutoPCIBAR msix_relo;
140 uint8_t pm_cap;
141 uint8_t nv_gpudirect_clique;
142 bool pci_aer;
143 bool req_enabled;
144 bool has_flr;
145 bool has_pm_reset;
146 bool rom_read_failed;
147 bool no_kvm_intx;
148 bool no_kvm_msi;
149 bool no_kvm_msix;
150 bool no_geforce_quirks;
151 VFIODisplay *dpy;
152} VFIOPCIDevice;
153
154uint32_t vfio_pci_read_config(PCIDevice *pdev, uint32_t addr, int len);
155void vfio_pci_write_config(PCIDevice *pdev,
156 uint32_t addr, uint32_t val, int len);
157
158uint64_t vfio_vga_read(void *opaque, hwaddr addr, unsigned size);
159void vfio_vga_write(void *opaque, hwaddr addr, uint64_t data, unsigned size);
160
161bool vfio_blacklist_opt_rom(VFIOPCIDevice *vdev);
162void vfio_vga_quirk_setup(VFIOPCIDevice *vdev);
163void vfio_vga_quirk_exit(VFIOPCIDevice *vdev);
164void vfio_vga_quirk_finalize(VFIOPCIDevice *vdev);
165void vfio_bar_quirk_setup(VFIOPCIDevice *vdev, int nr);
166void vfio_bar_quirk_exit(VFIOPCIDevice *vdev, int nr);
167void vfio_bar_quirk_finalize(VFIOPCIDevice *vdev, int nr);
168void vfio_setup_resetfn_quirk(VFIOPCIDevice *vdev);
169int vfio_add_virt_caps(VFIOPCIDevice *vdev, Error **errp);
170
171extern const PropertyInfo qdev_prop_nv_gpudirect_clique;
172
173int vfio_populate_vga(VFIOPCIDevice *vdev, Error **errp);
174
175int vfio_pci_igd_opregion_init(VFIOPCIDevice *vdev,
176 struct vfio_region_info *info,
177 Error **errp);
178
179int vfio_display_probe(VFIOPCIDevice *vdev, Error **errp);
180void vfio_display_finalize(VFIOPCIDevice *vdev);
181
182#endif
183