Personal-NixOS-Configuration/modules/nixos/cspark-single-gpu-passthru/module.nix

113 lines
3.7 KiB
Nix

{ lib, config, pkgs, modulesPath, ... }:
let
cfg = config.cspark-single-gpu-passthru;
in
{
options.cspark-single-gpu-passthru = {
enable
= lib.mkEnableOption "Enable Single GPU Passthrough Setup";
vmName = lib.mkOption {
default = "win11";
description = ''
Name of the virtual machine
'';
};
gpuPCI = lib.mkOption {
default = "0000:08:00.0";
description = ''
PCI ID of GPU VGA
'';
};
gpuAudioPCI = lib.mkOption {
default = "0000:08:00.1";
description = ''
PCI ID of GPU Audio
'';
};
};
config = lib.mkIf cfg.enable {
# Virtualisation, Virt Manager and Waydroid
virtualisation.libvirtd = {
enable = true;
qemu = {
package = pkgs.qemu_kvm;
runAsRoot = true;
swtpm.enable = true;
ovmf = {
enable = true;
packages = [(pkgs.OVMF.override {
secureBoot = true;
tpmSupport = true;
}).fd];
};
};
};
programs.virt-manager.enable = true;
systemd.services.libvirtd = {
# Add binaries to path so that hooks can use it
path = let
env = pkgs.buildEnv {
name = "qemu-hook-env";
paths = with pkgs; [
bash
libvirt
kmod
systemd
ripgrep
sd
procps
gawk
];
};
in
[ env ];
preStart = let
qemuscript_source = builtins.readFile ./resources/libvirt/hooks/qemu;
startscript_source = builtins.readFile ./resources/libvirt/hooks/qemu.d/vm/prepare/begin/start.sh;
revertscript_source = builtins.readFile ./resources/libvirt/hooks/qemu.d/vm/release/end/revert.sh;
qemuscript = pkgs.writeShellScript "cspark-single-gpu-passthru-qemu" qemuscript_source;
startscript = pkgs.writeShellScript "cspark-single-gpu-passthru-start.sh" startscript_source;
revertscript = pkgs.writeShellScript "cspark-single-gpu-passthru-revert.sh" revertscript_source;
gpuvbios = ./resources/libvirt/vgabios/gpuvbios.rom;
in
''
mkdir -p /var/lib/libvirt/hooks
mkdir -p /var/lib/libvirt/hooks/qemu.d/${cfg.vmName}/prepare/begin
mkdir -p /var/lib/libvirt/hooks/qemu.d/${cfg.vmName}/release/end
mkdir -p /var/lib/libvirt/vgabios
ln -sf ${qemuscript} /var/lib/libvirt/hooks/qemu
ln -sf ${startscript} /var/lib/libvirt/hooks/qemu.d/${cfg.vmName}/prepare/begin/start.sh
ln -sf ${revertscript} /var/lib/libvirt/hooks/qemu.d/${cfg.vmName}/release/end/revert.sh
ln -sf ${gpuvbios} /var/lib/libvirt/vgabios/gpuvbios.rom
# chmod +x /var/lib/libvirt/hooks/qemu
# chmod +x /var/lib/libvirt/hooks/qemu.d/${cfg.vmName}/prepare/begin/start.sh
# chmod +x /var/lib/libvirt/hooks/qemu.d/${cfg.vmName}/release/end/revert.sh
'';
};
# Vendor Reset Patches for Single GPU Passthrough - https://github.com/gnif/vendor-reset
#boot.extraModulePackages = with config.boot.kernelPackages; [ vendor-reset ];
# Ensures GPU is configured to use vendor reset module
#systemd.services.vendor-reset-config = {
# description = "Ensures GPU is configured to use vendor reset module";
# wantedBy = [ "multi-user.target" ];
# path = [ pkgs.coreutils ];
# enable = true;
# serviceConfig = {
# User = "root";
# Group = "root";
# };
# script = ''echo device_specific > "/sys/bus/pci/devices/${cfg.gpuPCI}/reset_method"'';
#};
hardware.graphics.enable = true;
virtualisation.spiceUSBRedirection.enable = true;
};
}