====== Ubuntu - GPU - GPU pass-through - Configuring the host ======
===== Verify the host environment supports GPU pass-through =====
TODO:
----
===== Enable IOMMU =====
**IOMMU** is usually disabled by default.
* It needs to be enable at boot time in the **/etc/default/grub** configuration file.
For AMD-based hosts:
GRUB_CMDLINE_LINUX="iommu=pt amd_iommu=on rd.driver.pre=vfio-pci"
For Intel-based hosts:
GRUB_CMDLINE_LINUX="intel_iommu=on iommu=pt rd.driver.pre=vfio-pci"
----
===== Re-generate the main GRUB 2 configuration file =====
The GRUB 2 configuration file is **/boot/grub2/grub.cfg**.
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
----
===== Reboot =====
----
===== Verify that IOMMU is enabled =====
sudo dmesg | grep -e DMAR -e IOMMU
returns:
[ 2.172228] pci 0000:00:00.2: AMD-Vi: IOMMU performance counters supported
[ 2.176588] pci 0000:00:00.2: AMD-Vi: Found IOMMU cap 0x40
[ 2.176924] perf/amd_iommu: Detected AMD IOMMU #0 (2 banks, 4 counters/bank).
[ 3.875165] AMD-Vi: AMD IOMMUv2 loaded and initialized
----
===== Blacklist the Nouveau driver =====
Prevent the host OS from loading the built-in nouveau driver.
Create the file **/etc/modprobe.d/60-blacklist-nouveau.conf**:
blacklist nouveau
----
===== Configure VFIO and isolate the GPU used for pass-through =====
Find the card vendor and model IDs.
lspci -k | grep VGA
returns:
0c:00.0 VGA compatible controller: Advanced Micro Devices, Inc. [AMD/ATI] Navi 31 [Radeon RX 7900 XT/7900 XTX] (rev c8)
**NOTE:** This shows the Bus number is 0c:00.0.
----
===== Get the device ID =====
Using the Bus number identified earlier.
lspci -nn | grep 0c:00.0
returns:
0c:00.0 VGA compatible controller [0300]: Advanced Micro Devices, Inc. [AMD/ATI] Navi 31 [Radeon RX 7900 XT/7900 XTX] [1002:744c] (rev c8)
**NOTE:** This shows the ID is 1002:744c.
----
===== Create a module VFIO file =====
Create the file **/etc/modprobe.d/vfio.conf**:
options vfio-pci ids=1002:744c
**NOTE:** Verify that the card does not need an extra **ids=** parameter.
* For some cards, the audio device must be specified too, so that ID must also be added to the list, otherwise the card will be unusable.
----
===== Load the VFIO driver =====
There are various ways you can load the VFIO driver:
==== Including the driver in the initrd file ====
Create the file **/etc/dracut.conf.d/gpu-passthrough.conf**:
add_drivers+=" vfio vfio_iommu_type1 vfio_pci vfio_virqfd"
**NOTE:** Mind the leading whitespace.
Re-generate the initrd file:
sudo dracut --force /boot/initrd $(uname -r)
----
==== Adding the driver to the list of auto-loaded modules ====
Create the file **/etc/modules-load.d/vfio-pci.conf**:
vfio
vfio_iommu_type1
vfio_pci
kvm
kvm_intel
----
==== Load the driver manually ====
To load the driver manually at runtime:
sudo modprobe vfio-pci
----
===== Disable MSR for Microsoft Windows guests =====
For Microsoft Windows guests, it is recommended to disable MSR (model-specific register) to avoid the guest crashing.
Create the file **/etc/modprobe.d/kvm.conf**:
options kvm ignore_msrs=1
----
===== Install UEFI firmware =====
For proper GPU Pass-Through functionality, the host needs to boot using UEFI firmware.
* Not using a legacy-style BIOS boot sequence.
Install the **qemu-ovmf** package if not already installed:
sudo apt install qemu-ovmf
----
===== Reboot the host machine =====
For most of the changes in the above steps to take effect, the host machine needs to be rebooted.
sudo shutdown -r now
----