{ config, lib, pkgs, modulesPath, ... }: let inherit (lib) mkEnableOption mkIf; inherit (lib.my-namespace) disabled enabled; cfg = config.my-namespace.hardware.graphics-nvidia-specializations; in { options.my-namespace.hardware.graphics-nvidia-specializations = { enable = mkEnableOption "Enable nvidia"; }; options.nvidia-sync.enable = lib.mkEnableOption "Enable NVIDIA prime sync mode"; options.nvidia-offload.enable = lib.mkEnableOption "Enable NVIDIA prime sync mode"; config = { specialisation."NVIDIA-SYNC".configuration = { system.nixos.tags = [ "with-nvidia-sync" ]; nvidia-sync.enable = true; }; specialisation."NVIDIA-OFFLOAD".configuration = { system.nixos.tags = [ "with-nvidia-offload" ]; nvidia-offload.enable = true; }; services.xserver.videoDrivers = [ "nvidia" "amdgpu" ]; hardware.graphics = { extraPackages = with pkgs; [ nvidia-vaapi-driver ]; }; boot.kernelParams = [ "nvidia.NVreg_PreserveVideoMemoryAllocations=1" "nvidia-drm.fbdev=0" "nvidia-drm.modeset=0" "amdgpu.modeset=1" ]; boot.initrd.kernelModules = [ # "amdgpu" "nvidia" "nvidia-drm" "nvidia_drm" "nvidia-uvm" "nvidia_uvm" # "nvidia-modeset" # "i2c-nvidia_gpu" ]; hardware.nvidia = { modesetting.enable = true; # Nvidia power management. Experimental, and can cause sleep/suspend to fail. powerManagement.enable = false; # Fine-grained power management. Turns off GPU when not in use. # Experimental and only works on modern Nvidia GPUs (Turing or newer). powerManagement.finegrained = false; # Use the NVidia open source kernel module (not to be confused with the # independent third-party "nouveau" open source driver). # Support is limited to the Turing and later architectures. Full list of # supported GPUs is at: # https://github.com/NVIDIA/open-gpu-kernel-modules#compatible-gpus # Only available from driver 515.43.04+ # Currently alpha-quality/buggy, so false is currently the recommended setting. open = false; # Enable the Nvidia settings menu, # accessible via `nvidia-settings`. nvidiaSettings = true; # Optionally, you may need to select the appropriate driver version for your specific GPU. # package = config.boot.kernelPackages.nvidiaPackages.beta; package = config.boot.kernelPackages.nvidiaPackages.production; prime = { amdgpuBusId = "PCI:50:0:0"; nvidiaBusId = "PCI:1:0:0"; } // lib.optionalAttrs config.nvidia-sync.enable { sync.enable = false; } // lib.optionalAttrs (config.nvidia-offload.enable) { offload = { enable = true; enableOffloadCmd = true; }; }; }; services.xserver.config = lib.mkAfter '' Section "ServerLayout" Identifier "layout" Screen 0 "amdgpu" Inactive "nvidia" Option "AllowNVIDIAGPUScreens" Option "AllowEmptyInitialConfiguration" "True" EndSection Section "Device" Identifier "nvidia" Driver "nvidia" BusID "PCI:01:0:0" Option "AllowEmptyInitialConfiguration" "True" EndSection Section "Screen" Identifier "nvidia" Device "nvidia" Option "AllowEmptyInitialConfiguration" "True" EndSection Section "Device" Identifier "amdgpu" Driver "amdgpu" BusID "PCI:50:0:0" #Option "AllowNVIDIAGPUScreens" #Option "AllowEmptyInitialConfiguration" "True" EndSection Section "Screen" Identifier "amdgpu" Device "amdgpu" #Option "AllowEmptyInitialConfiguration" "True" EndSection ''; # services.xserver.config = lib.mkForce '' # Section "ServerLayout" # Identifier "layout" # Screen 0 "amdgpu" # Inactive "nvidia" # Option "AllowNVIDIAGPUScreens" # EndSection # Section "Device" # Identifier "nvidia" # Driver "nvidia" # BusID "PCI:01:0:0" # EndSection # Section "Screen" # Identifier "nvidia" # Device "nvidia" # EndSection # Section "Device" # Identifier "amdgpu" # Driver "amdgpu" # BusID "PCI:50:0:0" # EndSection # Section "Screen" # Identifier "amdgpu" # Device "amdgpu" # EndSection # ''; }; }