]> git.proxmox.com Git - pve-docs.git/blame - qm-pci-passthrough.adoc
remove 'amd_iommu=on' from the passthrough docs
[pve-docs.git] / qm-pci-passthrough.adoc
CommitLineData
6e4c46c4
DC
1[[qm_pci_passthrough]]
2PCI(e) Passthrough
3------------------
e582833b
DC
4ifdef::wiki[]
5:pve-toplevel:
6endif::wiki[]
6e4c46c4
DC
7
8PCI(e) passthrough is a mechanism to give a virtual machine control over
49f20f1b
TL
9a PCI device from the host. This can have some advantages over using
10virtualized hardware, for example lower latency, higher performance, or more
11features (e.g., offloading).
6e4c46c4 12
49f20f1b 13But, if you pass through a device to a virtual machine, you cannot use that
6e4c46c4
DC
14device anymore on the host or in any other VM.
15
16General Requirements
17~~~~~~~~~~~~~~~~~~~~
18
19Since passthrough is a feature which also needs hardware support, there are
49f20f1b
TL
20some requirements to check and preparations to be done to make it work.
21
6e4c46c4
DC
22
23Hardware
24^^^^^^^^
49f20f1b
TL
25Your hardware needs to support `IOMMU` (*I*/*O* **M**emory **M**anagement
26**U**nit) interrupt remapping, this includes the CPU and the mainboard.
6e4c46c4 27
49f20f1b
TL
28Generally, Intel systems with VT-d, and AMD systems with AMD-Vi support this.
29But it is not guaranteed that everything will work out of the box, due
30to bad hardware implementation and missing or low quality drivers.
6e4c46c4 31
49f20f1b 32Further, server grade hardware has often better support than consumer grade
6e4c46c4
DC
33hardware, but even then, many modern system can support this.
34
49f20f1b 35Please refer to your hardware vendor to check if they support this feature
a22d7c24 36under Linux for your specific setup.
49f20f1b 37
6e4c46c4
DC
38
39Configuration
40^^^^^^^^^^^^^
41
49f20f1b
TL
42Once you ensured that your hardware supports passthrough, you will need to do
43some configuration to enable PCI(e) passthrough.
6e4c46c4 44
6e4c46c4 45
39d84f28 46.IOMMU
6e4c46c4 47
1748211a 48The IOMMU has to be activated on the
69055103 49xref:sysboot_edit_kernel_cmdline[kernel commandline].
1748211a
SI
50
51The command line parameters are:
6e4c46c4 52
49f20f1b
TL
53* for Intel CPUs:
54+
55----
56 intel_iommu=on
57----
0c54d612 58* for AMD CPUs it should be enabled automatically.
6e4c46c4 59
39d84f28 60.Kernel Modules
6e4c46c4 61
49f20f1b
TL
62You have to make sure the following modules are loaded. This can be achieved by
63adding them to `'/etc/modules''
6e4c46c4 64
49f20f1b 65----
6e4c46c4
DC
66 vfio
67 vfio_iommu_type1
68 vfio_pci
69 vfio_virqfd
49f20f1b 70----
6e4c46c4 71
49f20f1b 72[[qm_pci_passthrough_update_initramfs]]
6e4c46c4 73After changing anything modules related, you need to refresh your
49f20f1b 74`initramfs`. On {pve} this can be done by executing:
6e4c46c4
DC
75
76----
49f20f1b 77# update-initramfs -u -k all
6e4c46c4
DC
78----
79
39d84f28 80.Finish Configuration
49f20f1b
TL
81
82Finally reboot to bring the changes into effect and check that it is indeed
83enabled.
6e4c46c4
DC
84
85----
5e235b99 86# dmesg | grep -e DMAR -e IOMMU -e AMD-Vi
6e4c46c4
DC
87----
88
49f20f1b
TL
89should display that `IOMMU`, `Directed I/O` or `Interrupt Remapping` is
90enabled, depending on hardware and kernel the exact message can vary.
6e4c46c4
DC
91
92It is also important that the device(s) you want to pass through
49f20f1b 93are in a *separate* `IOMMU` group. This can be checked with:
6e4c46c4
DC
94
95----
49f20f1b 96# find /sys/kernel/iommu_groups/ -type l
6e4c46c4
DC
97----
98
49f20f1b 99It is okay if the device is in an `IOMMU` group together with its functions
6e4c46c4
DC
100(e.g. a GPU with the HDMI Audio device) or with its root port or PCI(e) bridge.
101
102.PCI(e) slots
103[NOTE]
104====
49f20f1b
TL
105Some platforms handle their physical PCI(e) slots differently. So, sometimes
106it can help to put the card in a another PCI(e) slot, if you do not get the
107desired `IOMMU` group separation.
6e4c46c4
DC
108====
109
110.Unsafe interrupts
111[NOTE]
112====
113For some platforms, it may be necessary to allow unsafe interrupts.
49f20f1b
TL
114For this add the following line in a file ending with `.conf' file in
115*/etc/modprobe.d/*:
6e4c46c4 116
49f20f1b 117----
6e4c46c4 118 options vfio_iommu_type1 allow_unsafe_interrupts=1
49f20f1b 119----
6e4c46c4
DC
120
121Please be aware that this option can make your system unstable.
122====
123
082b32fb
TL
124GPU Passthrough Notes
125^^^^^^^^^^^^^^^^^^^^^
13cae0c1 126
082b32fb
TL
127It is not possible to display the frame buffer of the GPU via NoVNC or SPICE on
128the {pve} web interface.
13cae0c1 129
082b32fb
TL
130When passing through a whole GPU or a vGPU and graphic output is wanted, one
131has to either physically connect a monitor to the card, or configure a remote
132desktop software (for example, VNC or RDP) inside the guest.
13cae0c1 133
082b32fb
TL
134If you want to use the GPU as a hardware accelerator, for example, for
135programs using OpenCL or CUDA, this is not required.
13cae0c1 136
49f20f1b 137Host Device Passthrough
6e4c46c4
DC
138~~~~~~~~~~~~~~~~~~~~~~~
139
140The most used variant of PCI(e) passthrough is to pass through a whole
49f20f1b
TL
141PCI(e) card, for example a GPU or a network card.
142
6e4c46c4
DC
143
144Host Configuration
145^^^^^^^^^^^^^^^^^^
146
eebb3506 147In this case, the host must not use the card. There are two methods to achieve
49f20f1b 148this:
6e4c46c4 149
49f20f1b
TL
150* pass the device IDs to the options of the 'vfio-pci' modules by adding
151+
152----
6e4c46c4 153 options vfio-pci ids=1234:5678,4321:8765
6e4c46c4 154----
49f20f1b
TL
155+
156to a .conf file in */etc/modprobe.d/* where `1234:5678` and `4321:8765` are
157the vendor and device IDs obtained by:
158+
159----
eebb3506 160# lspci -nn
6e4c46c4
DC
161----
162
49f20f1b
TL
163* blacklist the driver completely on the host, ensuring that it is free to bind
164for passthrough, with
165+
166----
6e4c46c4 167 blacklist DRIVERNAME
49f20f1b
TL
168----
169+
170in a .conf file in */etc/modprobe.d/*.
6e4c46c4 171
49f20f1b
TL
172For both methods you need to
173xref:qm_pci_passthrough_update_initramfs[update the `initramfs`] again and
174reboot after that.
6e4c46c4 175
eebb3506
SR
176.Verify Configuration
177
178To check if your changes were successful, you can use
179
180----
181# lspci -nnk
182----
183
184and check your device entry. If it says
185
186----
187Kernel driver in use: vfio-pci
188----
189
190or the 'in use' line is missing entirely, the device is ready to be used for
191passthrough.
192
49f20f1b 193[[qm_pci_passthrough_vm_config]]
6e4c46c4
DC
194VM Configuration
195^^^^^^^^^^^^^^^^
49f20f1b
TL
196To pass through the device you need to set the *hostpciX* option in the VM
197configuration, for example by executing:
6e4c46c4
DC
198
199----
49f20f1b 200# qm set VMID -hostpci0 00:02.0
6e4c46c4
DC
201----
202
5ee3d3cd 203If your device has multiple functions (e.g., ``00:02.0`' and ``00:02.1`' ),
1fa89424
DC
204you can pass them through all together with the shortened syntax ``00:02`'.
205This is equivalent with checking the ``All Functions`' checkbox in the
206web-interface.
6e4c46c4
DC
207
208There are some options to which may be necessary, depending on the device
49f20f1b
TL
209and guest OS:
210
211* *x-vga=on|off* marks the PCI(e) device as the primary GPU of the VM.
212With this enabled the *vga* configuration option will be ignored.
6e4c46c4 213
6e4c46c4 214* *pcie=on|off* tells {pve} to use a PCIe or PCI port. Some guests/device
49f20f1b
TL
215combination require PCIe rather than PCI. PCIe is only available for 'q35'
216machine types.
217
6e4c46c4
DC
218* *rombar=on|off* makes the firmware ROM visible for the guest. Default is on.
219Some PCI(e) devices need this disabled.
49f20f1b 220
6e4c46c4 221* *romfile=<path>*, is an optional path to a ROM file for the device to use.
49f20f1b
TL
222This is a relative path under */usr/share/kvm/*.
223
39d84f28 224.Example
6e4c46c4
DC
225
226An example of PCIe passthrough with a GPU set to primary:
227
228----
49f20f1b 229# qm set VMID -hostpci0 02:00,pcie=on,x-vga=on
6e4c46c4
DC
230----
231
49f20f1b 232
6e4c46c4
DC
233Other considerations
234^^^^^^^^^^^^^^^^^^^^
235
236When passing through a GPU, the best compatibility is reached when using
49f20f1b
TL
237'q35' as machine type, 'OVMF' ('EFI' for VMs) instead of SeaBIOS and PCIe
238instead of PCI. Note that if you want to use 'OVMF' for GPU passthrough, the
239GPU needs to have an EFI capable ROM, otherwise use SeaBIOS instead.
6e4c46c4
DC
240
241SR-IOV
242~~~~~~
243
49f20f1b
TL
244Another variant for passing through PCI(e) devices, is to use the hardware
245virtualization features of your devices, if available.
246
247'SR-IOV' (**S**ingle-**R**oot **I**nput/**O**utput **V**irtualization) enables
248a single device to provide multiple 'VF' (**V**irtual **F**unctions) to the
249system. Each of those 'VF' can be used in a different VM, with full hardware
250features and also better performance and lower latency than software
251virtualized devices.
6e4c46c4 252
49f20f1b
TL
253Currently, the most common use case for this are NICs (**N**etwork
254**I**nterface **C**ard) with SR-IOV support, which can provide multiple VFs per
255physical port. This allows using features such as checksum offloading, etc. to
256be used inside a VM, reducing the (host) CPU overhead.
6e4c46c4 257
6e4c46c4
DC
258
259Host Configuration
260^^^^^^^^^^^^^^^^^^
261
49f20f1b 262Generally, there are two methods for enabling virtual functions on a device.
6e4c46c4 263
49f20f1b 264* sometimes there is an option for the driver module e.g. for some
6e4c46c4 265Intel drivers
49f20f1b
TL
266+
267----
6e4c46c4 268 max_vfs=4
49f20f1b
TL
269----
270+
271which could be put file with '.conf' ending under */etc/modprobe.d/*.
6e4c46c4 272(Do not forget to update your initramfs after that)
49f20f1b 273+
6e4c46c4
DC
274Please refer to your driver module documentation for the exact
275parameters and options.
276
49f20f1b
TL
277* The second, more generic, approach is using the `sysfs`.
278If a device and driver supports this you can change the number of VFs on
279the fly. For example, to setup 4 VFs on device 0000:01:00.0 execute:
280+
6e4c46c4 281----
49f20f1b 282# echo 4 > /sys/bus/pci/devices/0000:01:00.0/sriov_numvfs
6e4c46c4 283----
49f20f1b
TL
284+
285To make this change persistent you can use the `sysfsutils` Debian package.
39d84f28 286After installation configure it via */etc/sysfs.conf* or a `FILE.conf' in
49f20f1b 287*/etc/sysfs.d/*.
6e4c46c4
DC
288
289VM Configuration
290^^^^^^^^^^^^^^^^
291
49f20f1b
TL
292After creating VFs, you should see them as separate PCI(e) devices when
293outputting them with `lspci`. Get their ID and pass them through like a
294xref:qm_pci_passthrough_vm_config[normal PCI(e) device].
6e4c46c4
DC
295
296Other considerations
297^^^^^^^^^^^^^^^^^^^^
298
299For this feature, platform support is especially important. It may be necessary
49f20f1b
TL
300to enable this feature in the BIOS/EFI first, or to use a specific PCI(e) port
301for it to work. In doubt, consult the manual of the platform or contact its
302vendor.
050192c5 303
d25f097c
TL
304Mediated Devices (vGPU, GVT-g)
305~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
050192c5 306
a22d7c24 307Mediated devices are another method to reuse features and performance from
d25f097c 308physical hardware for virtualized hardware. These are found most common in
3a433e9b 309virtualized GPU setups such as Intel's GVT-g and NVIDIA's vGPUs used in their
d25f097c
TL
310GRID technology.
311
312With this, a physical Card is able to create virtual cards, similar to SR-IOV.
313The difference is that mediated devices do not appear as PCI(e) devices in the
314host, and are such only suited for using in virtual machines.
050192c5 315
050192c5
DC
316
317Host Configuration
318^^^^^^^^^^^^^^^^^^
319
d25f097c 320In general your card's driver must support that feature, otherwise it will
a22d7c24 321not work. So please refer to your vendor for compatible drivers and how to
050192c5
DC
322configure them.
323
3a433e9b 324Intel's drivers for GVT-g are integrated in the Kernel and should work
a22d7c24
SR
325with 5th, 6th and 7th generation Intel Core Processors, as well as E3 v4, E3
326v5 and E3 v6 Xeon Processors.
050192c5 327
1748211a
SI
328To enable it for Intel Graphics, you have to make sure to load the module
329'kvmgt' (for example via `/etc/modules`) and to enable it on the
69055103 330xref:sysboot_edit_kernel_cmdline[Kernel commandline] and add the following parameter:
050192c5
DC
331
332----
333 i915.enable_gvt=1
334----
335
336After that remember to
337xref:qm_pci_passthrough_update_initramfs[update the `initramfs`],
1748211a 338and reboot your host.
050192c5
DC
339
340VM Configuration
341^^^^^^^^^^^^^^^^
342
d25f097c
TL
343To use a mediated device, simply specify the `mdev` property on a `hostpciX`
344VM configuration option.
050192c5 345
d25f097c
TL
346You can get the supported devices via the 'sysfs'. For example, to list the
347supported types for the device '0000:00:02.0' you would simply execute:
050192c5
DC
348
349----
350# ls /sys/bus/pci/devices/0000:00:02.0/mdev_supported_types
351----
352
353Each entry is a directory which contains the following important files:
354
d25f097c
TL
355* 'available_instances' contains the amount of still available instances of
356this type, each 'mdev' use in a VM reduces this.
050192c5 357* 'description' contains a short description about the capabilities of the type
d25f097c
TL
358* 'create' is the endpoint to create such a device, {pve} does this
359automatically for you, if a 'hostpciX' option with `mdev` is configured.
050192c5 360
d25f097c 361Example configuration with an `Intel GVT-g vGPU` (`Intel Skylake 6700k`):
050192c5
DC
362
363----
364# qm set VMID -hostpci0 00:02.0,mdev=i915-GVTg_V5_4
365----
366
367With this set, {pve} automatically creates such a device on VM start, and
368cleans it up again when the VM stops.
e582833b
DC
369
370ifdef::wiki[]
371
372See Also
373~~~~~~~~
374
375* link:/wiki/Pci_passthrough[PCI Passthrough Examples]
376
377endif::wiki[]