Skip to main content

Guide to PCIe Passthrough (GPU and Sound)

Enable BIOS features

To use PCIe Passthrough, you will need a compatible motherboard and CPU with support for iommu. Look up your motherboard manual on how to enable these features, but they are commonly named VT-d or AMD Vi.

Get Some Information

To pass through a card, you'll need to know some value pertaining to the card itself: The Device IDs, and BDF IDs. The following command will give a list of relevant devices to use in the next steps.

lspci -nn | grep "VGA\|Audio"

Example

An example output might look like this:

26:00.0 VGA compatible controller [0300]: Advanced Micro Devices, Inc. [AMD/ATI] Curacao XT / Trinidad XT [Radeon R7 370 / R9 270X/370X] [1002:6810]
26:00.1 Audio device [0403]: Advanced Micro Devices, Inc. [AMD/ATI] Oland/Hainan/Cape Verde/Pitcairn HDMI Audio [Radeon HD 7000 Series] [1002:aab0]

The first value (26:00.0) is the BDF ID, and the last (1002:6810) is the Device ID. Cards with a built-in audio controller have to be passed together, so note the IDs for both subdevices.

Load the vfio-pci module

The vfio-pci module is not included in the kernel on all systems, you may need for load it as part of initramfs. Look up your distro's documentation on how to do this.

Add Kernel Flags

The iommu kernel module is not enabled by default, but you can enable it on boot by passing the following flags to the kernel. Replace the Device IDs with your corresponding card.

AMD

iommu=pt amd_iommu=on vfio-pci.ids=1002:66af,1002:ab20

Intel

iommu=pt intel_iommu=on vfio-pci.ids=1002:66af,1002:ab20

To do this permanently, you can add it to your bootloader. If you're using GRUB, for example, edit /etc/default/grub and add the previous lines to the GRUB_CMDLINE_LINUX_DEFAULT section, then run sudo update-grub (or sudo grub-mkconfig on some systems) and reboot.

Attach card to QEMU

You will need to attach the cards using the BDF IDs for the audio and video controller. The following example shows the config for a card with two devices. The romfile parameter is optional.

Note: You may need to run basic.sh as sudo for the card to work.

    -vga none \
-device pcie-root-port,bus=pcie.0,multifunction=on,port=1,chassis=1,id=port.1 \
-device vfio-pci,host=26:00.0,bus=port.1,multifunction=on,romfile=/path/to/card.rom \
-device vfio-pci,host=26:00.1,bus=port.1 \