diff --git a/lib/get_GPU_GROUP.sh b/lib/get_GPU_GROUP.sh index 341c444..7e0b6a6 100755 --- a/lib/get_GPU_GROUP.sh +++ b/lib/get_GPU_GROUP.sh @@ -2,6 +2,9 @@ function get_GROUP () { clear + # Get the config paths + source "$SCRIPTDIR/lib/paths.sh" + printf " For this card to be passthrough-able, it must contain only: * The GPU/Graphic card @@ -27,18 +30,18 @@ read -p "Enter the ids for all devices you want to passthrough: " GPU_DEVID if [[ $GPU_DEVID =~ : ]]; then - # Make the directory - mkdir "$SCRIPTDIR/config" - # Get the PCI ids - PCI_ID=$($SCRIPTDIR/utils/ls-iommu | grep -i "group $1" | cut -d " " -f 4 | perl -pe "s/\n/ /" | perl -pe "s/\s$//") - - echo "# This is an autogenerated file that stubs your graphic card for use with vfio" > "$SCRIPTDIR/config/vfio.conf" - echo "options vfio_pci ids=$GPU_DEVID" >> "$SCRIPTDIR/config/vfio.conf" - echo "GPU_PCI_ID=($PCI_ID)" > "$SCRIPTDIR/config/qemu-vfio_vars.conf" - echo "USB_CTL_ID=\"\"" >> "$SCRIPTDIR/config/qemu-vfio_vars.conf" + local PCI_ID=$($SCRIPTDIR/utils/ls-iommu | grep -i "group $1" | cut -d " " -f 4 | perl -pe "s/\n/ /" | perl -pe "s/\s$//") - exec "$SCRIPTDIR/lib/get_USB_CTL.sh" + # Write the currently unused vfio config for quickemu + printf "GPU_PCI_ID=($PCI_ID) +USB_CTL_ID=\"\"" > "$SCRIPTDIR/$QUICKEMU/qemu-vfio_vars.conf" + + # Get the PCI_ID + local ROM_PCI_ID=$($SCRIPTDIR/utils/ls-iommu | grep -i "vga" | grep -i "group $1" | cut -d " " -f 4) + "$SCRIPTDIR/lib/get_GPU_ROM.sh" "$ROM_PCI_ID" + + exec "$SCRIPTDIR/lib/set_MODULES.sh" $GPU_DEVID else exec "$SCRIPTDIR/lib/get_GPU.sh" fi @@ -46,8 +49,9 @@ fi } function main () { - SCRIPTDIR=$(dirname `which $0`) + SCRIPTDIR=$(dirname `which $0` | perl -pe "s/\/\.\.\/lib//") SCRIPTDIR="$SCRIPTDIR/.." + get_GROUP $1 } diff --git a/lib/get_USB_CTL_GROUP.sh b/lib/get_USB_CTL_GROUP.sh index bcfa643..d90ec6d 100755 --- a/lib/get_USB_CTL_GROUP.sh +++ b/lib/get_USB_CTL_GROUP.sh @@ -2,6 +2,9 @@ function get_USB_CTL_GROUP () { clear + # Get the config paths + source "$SCRIPTDIR/lib/paths.sh" + printf " For this USB controller device to be passthrough-able, it must be the ONLY device in this group! @@ -23,7 +26,7 @@ then # Get the PCI ids PCI_ID=$($SCRIPTDIR/utils/ls-iommu | grep -i "group $1" | cut -d " " -f 4) - exec perl -pi -e "s/USB_CTL_ID=\"\"/USB_CTL_ID=\"$PCI_ID\"/" "$SCRIPTDIR/config/qemu-vfio_vars.conf" + exec perl -pi -e "s/USB_CTL_ID=\"\"/USB_CTL_ID=\"$PCI_ID\"/" "$SCRIPTDIR/$QUICKEMU/qemu-vfio_vars.conf" else exec "$SCRIPTDIR/lib/get_USB_CTL.sh" fi @@ -31,8 +34,9 @@ fi } function main () { - SCRIPTDIR=$(dirname `which $0`) + SCRIPTDIR=$(dirname `which $0` | perl -pe "s/\/\.\.\/lib//") SCRIPTDIR="$SCRIPTDIR/.." + get_USB_CTL_GROUP $1 } diff --git a/lib/paths.sh b/lib/paths.sh new file mode 100644 index 0000000..4b85d2d --- /dev/null +++ b/lib/paths.sh @@ -0,0 +1,6 @@ +#!/bin/bash +MODPROBE="config/etc/modprobe.d" +INITRAMFS="config/etc/initramfs-tools" +MODULES="config/etc/modules" +DEFAULT="config/etc/default" +QUICKEMU="config/quickemu" \ No newline at end of file diff --git a/vfio-setup b/vfio-setup index dac8cc3..fd14192 100755 --- a/vfio-setup +++ b/vfio-setup @@ -4,6 +4,9 @@ SCRIPTDIR=$(dirname `which $0`) cd $SCRIPTDIR +# Get the config paths +source "$SCRIPTDIR/lib/paths.sh" + # Clear the screen clear @@ -22,6 +25,8 @@ clear printf "This script assumes a few things: * You have already enabled IOMMU, VT-d and/or AMD-v inside your UEFI/BIOS advanced settings. +* You have already added \"iommu=pt intel_iommu=on\" or \"iommu=pt amd_iommu=on\" to your + kernel boot arguments and booted your system with these kernel arguments active. * You are comfortable with navigating and changing settings in your UEFI/BIOS. * You know how edit your bootloader configuration. * Your Linux distribution is an EFI installation (important to get VFIO working). @@ -32,18 +37,57 @@ NOTE: If your computer no longer fully shut down after enabling IOMMU, then ther quirk with IOMMU on some boards. This is a list of prerequisites you will be needing before starting with VFIO: -* 2 GPUs (iGPU/APU included) +* 2 very different GPUs (iGPU/APU included), the easiest combination is to have 2 from different vendors (amd/intel/nvidia) + if both cards share the same device id (ex: both are identified as 1022:145c), then passthrough will most likely + not be possible unless you swap out one of the cards. * A \"ghost display\" dummy plug for your second graphic card (or having it hooked to a separate input on your monitor). * If you are planning to use the inegrated GPU on your CPU, make sure your monitor is connected to it before continuing. * Preferably a motherboard verified to work with IOMMU and with good IOMMU groups. https://reddit.com/r/vfio is a good resource for this info. (If you are unsure, you will find out while using this script) -Press ENTER to start creating your config. +Press ENTER to start creating your config from scratch. +NOTE: continuing will delete the contents of \"$SCRIPTDIR/config\" " read ENTER clear +if [ -d "$SCRIPTDIR/config" ]; +then + rm -r "$SCRIPTDIR/config" +fi + +# Make the directories +mkdir -p "$SCRIPTDIR/$MODPROBE" +mkdir -p "$SCRIPTDIR/$DEFAULT" +mkdir -p "$SCRIPTDIR/$INITRAMFS" +mkdir -p "$SCRIPTDIR/$QUICKEMU" + +# Copy system configs into our config folder so we can safely edit them + +if [ -f "/etc/modules" ]; +then + # This copies /etc/modules without the vfio module lines + grep -v "vfio" "/etc/modules" > "$SCRIPTDIR/$MODULES" +else + touch "$SCRIPTDIR/$MODULES" +fi + +if [ -f "/etc/default/grub" ]; +then + # Currently we do not modify bootloaders, will ask users to do it instead + #cp "/etc/default/grub" "$SCRIPTDIR/$DEFAULT/grub" +fi + +if [ -f "/etc/initramfs-tools/modules" ]; +then + # This copies /etc/initramfs-tools/modules without the vfio modules + grep -v "vfio" "/etc/initramfs-tools/modules" > "$SCRIPTDIR/$INITRAMFS" +else + touch "$SCRIPTDIR/$INITRAMFS" +fi + +# Run ls-iommu so we can verify that IOMMU properly working "$SCRIPTDIR/utils/ls-iommu" printf " @@ -63,4 +107,4 @@ case "${YESNO}" in ;; esac -"$SCRIPTDIR/lib/get_GPU.sh" \ No newline at end of file +exec "$SCRIPTDIR/lib/get_GPU.sh" \ No newline at end of file