vfs: check userland buffers before reading them.
[haiku.git] / 3rdparty / kallisti5 / howto-iommu.md
blobd18d03f88c6180be7a52c55945b46ea0795119c4
1 Haiku PCI Driver Development Under QEMU on Linux
2 ====================================================
4 Developing Haiku drivers for PCI and PCI Express cards is now a lot easier
5 given advancements in IOMMU under Linux. You can effectively detach PCI cards
6 from their host operating system and attach them to guest VM's resulting in
7 true hardware emulation. In this guide we will be configuring a secondary
8 graphics card to be attached to a Haiku virtual machine.
10 **Warning**: Any device attached to a VM will be unavailable to the host operating
11 system. This means you **cannot** use your primary graphics card, network device,
12 etc within a VM and the host operating system at the same time. In this
13 example, we have two graphics cards installed in the Linux system.
15 IOMMU Setup
16 -----------------------
17 You will need to have IOMMU hardware support on your motherboard for this
18 to function. Most modern AMD A3 socket chips and Intel i3/i5/i7 devices
19 have IOMMU built in. If your board does indeed have IOMMU, you will likely
20 need to enable IOMMU within the bios of your motherboard before proceeding.
22 Linux Setup
23 -----------------------
24 Now that you have an IOMMU enabled system, you will need to tell Linux to
25 fully utilize IOMMU and reserve the PCI cards for IOMMU use.
27 Now, all we need to do is to reserve the PCI device. We want to make sure
28 no host drivers attempt to attach to the PCI device in question.
30 First we need to find the PCIID for the device in question. We can find
31 this through lcpci. Running lspci shows a bunch of devices. I've identified
32 this device as my target:
34 ```
35 $ lspci -nn | egrep "VGA|Audio"
36 28:00.0 VGA compatible controller [0300]: Advanced Micro Devices, Inc. [AMD/ATI] Ellesmere [Radeon RX 470/480/570/580] [1002:67df] (rev c7)
37 28:00.1 Audio device [0403]: Advanced Micro Devices, Inc. [AMD/ATI] Ellesmere [Radeon RX 580] [1002:aaf0]
39 29:00.0 VGA compatible controller [0300]: Advanced Micro Devices, Inc. [AMD/ATI] Redwood XT GL [FirePro V4800] [1002:68c8]
40 29:00.1 Audio device [0403]: Advanced Micro Devices, Inc. [AMD/ATI] Redwood HDMI Audio [Radeon HD 5000 Series] [1002:aa60]
42 2b:00.3 Audio device [0403]: Advanced Micro Devices, Inc. [AMD] Device [1022:1457]
43 ```
45 Now that we have our target PCI IDs (in this case, `1002:68c8,1002:aa60`), we can bind this device to
46 the vfio-pci driver.
48 **vfio-pci module**
50 If your distro ships vfio-pci as a module, you will need to add the vfio drivers to the initial ramdisk
51 to leverage them as early as possible in the boot process.
53 Below is an example on Fedora:
55 ```
56 echo 'add_drivers+="vfio vfio_iommu_type1 vfio_pci vfio_virqfd"' > /etc/dracut.conf.d/vfio.conf
57 dracut -f --kver `uname -r`
58 ```
60 **vfio reservation**
62 Now that the requirements are met, we can attach the target GPU to the vfio driver using the information
63 we have collected so far.
65 Below, i've leveraged the PCI ID's collected above, and provided them to the vfio-pci driver via the kernel
66 parameters at boot.
68 > Be sure to replace <CPU> with amd or intel depending on your system.
70 ```
71 rd.driver.pre=vfio-pci vfio-pci.ids=1002:68c8,1002:aa60 <CPU>_iommu=on
72 ```
74 > YMMV: These steps differ a lot between distros
76 On my EFI Fedora 26 system, I appended the line above to my /etc/sysconfig/grub config under GRUB_CMDLINE_LINUX.
77 Then, regenerated my grub.cfg via ```grub2-mkconfig -o /boot/efi/EFI/fedora/grub.cfg```
80 Attach GPU to VM
81 -----------------
83 Now we reboot and cross our fingers.
85 > If displays attached to the card are now black, then things are working as designed. If you see your
86 > desktop on the target GPU, the vfio driver didn't properly bind to your card and something was done
87 > incorrectly.
89 On my AMD Linux system, we can see that IOMMU is active and functional:
91 ```
92 kallisti5@eris ~ $ dmesg | egrep "IOMMU|AMD-Vi"
93 [    0.650138] AMD-Vi: IOMMU performance counters supported
94 [    0.652201] AMD-Vi: Found IOMMU at 0000:00:00.2 cap 0x40
95 [    0.652201] AMD-Vi: Extended features (0xf77ef22294ada):
96 [    0.652204] AMD-Vi: Interrupt remapping enabled
97 [    0.652204] AMD-Vi: virtual APIC enabled
98 [    0.652312] AMD-Vi: Lazy IO/TLB flushing enabled
99 [    0.653841] perf/amd_iommu: Detected AMD IOMMU #0 (2 banks, 4 counters/bank).
100 [    4.114847] AMD IOMMUv2 driver by Joerg Roedel <jroedel@suse.de>
104 And checking for vfio we can see it successfully took over my graphics card:
106 kallisti5@eris ~ $ dmesg | grep vfio
107 [    3.928695] vfio-pci 0000:29:00.0: vgaarb: changed VGA decodes: olddecodes=io+mem,decodes=io+mem:owns=none
108 [    3.940222] vfio_pci: add [1002:68c8[ffff:ffff]] class 0x000000/00000000
109 [    3.952302] vfio_pci: add [1002:aa60[ffff:ffff]] class 0x000000/00000000
110 [   35.629861] vfio-pci 0000:29:00.0: enabling device (0000 -> 0003)
113 On every boot, the device will be available for attachment to VM's
114 Now, we simply attach the device to a VM:
117 sudo qemu-system-x86_64 --enable-kvm -hda haiku-nightly-anyboot.image -m 2048 -device pci-assign,host=29:00.0
120 If you're doing this for a graphics card generally the qemu window will
121 lock up at the bootsplash and the video will appear on the second window.
122 Click the qemu window to control the Haiku machine.