quickpassthrough/internal/pages/03_vbios_extract.go
HikariKnight 4d0086df41 feat: Generate dummy rom for amd RX7000 series cards
By recommendation from gnif on discord.

Co-authored-by: Geoffrey McRae <geoff@hostfission.com>
2024-06-15 02:53:38 +02:00

74 lines
2.4 KiB
Go

package pages
import (
"fmt"
"os"
"path/filepath"
"strings"
"github.com/HikariKnight/quickpassthrough/internal/configs"
lsiommu "github.com/HikariKnight/quickpassthrough/internal/lsiommu"
"github.com/HikariKnight/quickpassthrough/pkg/command"
"github.com/HikariKnight/quickpassthrough/pkg/menu"
"github.com/gookit/color"
)
func genVBIOS_dumper(config *configs.Config) {
// Clear the scren
command.Clear()
// Get the program directory
exe, _ := os.Executable()
scriptdir := filepath.Dir(exe)
// If we are using go run use the working directory instead
if strings.Contains(scriptdir, "/tmp/go-build") {
scriptdir, _ = os.Getwd()
}
// Get the vbios path and generate the vbios dumping script
vbios_path := lsiommu.GetIOMMU("-g", "-i", config.Gpu_Group, "--rom")[0]
configs.GenerateVBIOSDumper(vbios_path)
// Make the qemu config folder
os.Mkdir(fmt.Sprintf("%s/%s", scriptdir, config.Path.QEMU), os.ModePerm)
// Generate a dummy rom (1MB rom of zeroes) for use with AMD RX 7000 series cards by recommendation from Gnif
// Source: https://forum.level1techs.com/t/the-state-of-amd-rx-7000-series-vfio-passthrough-april-2024/210242
command.Run("dd", "if=/dev/zero", fmt.Sprintf("of=%s/%s/dummy.rom", scriptdir, config.Path.QEMU), "bs=1M", "count=1")
// Write a title
title := color.New(color.BgHiBlue, color.White, color.Bold)
title.Println("VBIOS roms for Passthrough")
// Tell users about the VBIOS dumper script and dummy rom for RX 7000 series cards
fmt.Print(
"If you have an RX 7000 series (and possibly newer AMD cards) GPUs, please use the dummy.rom file\n",
fmt.Sprintf("%s/%s/dummy.rom\n", scriptdir, config.Path.QEMU),
"Or disable ROM BAR for the card in qemu/libvirt\n",
"\n",
"For some other GPUs, you will need to instead dump the VBIOS (and possibly patch it) and pass the\n",
"rom to the VM along with the card in order to get a functional passthrough.\n",
"In many cases you can find your vbios at https://www.techpowerup.com/vgabios/\n",
"\n",
"You can also attempt to dump your own vbios from TTY using the script in\n",
fmt.Sprintf("%s/utils/dump_vbios.sh\n", scriptdir),
"\n",
)
// Get the OK press
choice := menu.OkBack("Make sure you run the script with the display-manager stopped using ssh or tty!")
// Parse choice
switch choice {
case "next":
disableVideo(config)
case "back":
SelectGPU(config)
case "":
fmt.Println("")
os.Exit(0)
}
}