diff --git a/internal/configs/config_modprobe.go b/internal/configs/config_modprobe.go index 775ce5d..76c0063 100644 --- a/internal/configs/config_modprobe.go +++ b/internal/configs/config_modprobe.go @@ -1,5 +1,47 @@ package configs -func Set_Modprobe() { +import ( + "fmt" + "strings" + "github.com/HikariKnight/quickpassthrough/pkg/fileio" +) + +func Set_Modprobe(gpu_IDs []string) { + // Get the config + config := GetConfig() + + // Read our current kernel arguments + kernel_args := fileio.ReadFile(config.Path.CMDLINE) + + var vfio_pci_options []string + vfio_pci_options = append(vfio_pci_options, strings.Join(gpu_IDs, ",")) + + if strings.Contains(kernel_args, "vfio_pci.disable_vga=1") { + vfio_pci_options = append(vfio_pci_options, "disable_vga=1") + } + + // Write the vfio.conf file to our modprobe config + fileio.AppendContent( + fmt.Sprint( + "## This is an autogenerated file that stubs your graphic card for use with vfio\n", + "## This file should be placed inside /etc/modprobe.d/\n", + "# Uncomment the line below to \"hardcode\" your graphic card to be bound to the vfio-pci driver.\n", + "# In most cases this should not be neccessary, it will also prevent you from turning off vfio in the bootloader.\n", + fmt.Sprintf( + "#options vfio_pci ids=%s\n", + strings.Join(vfio_pci_options, " "), + ), + "\n", + "# Make sure vfio_pci is loaded before these modules: nvidia, nouveau, amdgpu and radeon\n", + "softdep nvidia pre: vfio vfio_pci\n", + "softdep nouveau pre: vfio vfio_pci\n", + "softdep amdgpu pre: vfio vfio_pci\n", + "softdep radeon pre: vfio vfio_pci\n", + ), + fmt.Sprintf( + "%s/vfio.conf", + config.Path.MODPROBE, + ), + ) } diff --git a/internal/ui_main_functions.go b/internal/ui_main_functions.go index d505fd7..d51685e 100644 --- a/internal/ui_main_functions.go +++ b/internal/ui_main_functions.go @@ -33,6 +33,8 @@ func (m *model) processSelection() bool { case GPU_GROUP: // Generate the VBIOS dumper script once the user has selected a GPU generateVBIOSDumper(*m) + + // Change focus to the next view m.focused++ case USB: @@ -70,8 +72,11 @@ func (m *model) processSelection() bool { m.disableVFIOVideo() } + // Get the device ids for the selected gpu using ls-iommu + gpu_IDs := getIOMMU("-gr", "-i", m.gpu_group, "--id") + // Configure modprobe - configs.Set_Modprobe() + configs.Set_Modprobe(gpu_IDs) // Go to the next view m.focused++