{ pov, config, lib, ... }: let inherit (lib) types; cfg = lib.getAttrFromPath pov config; cfgRoot = lib.getAttrFromPath (lib.remove [ "hardware" "video" ] pov) config; in { options = { enable = { type = types.bool; default = false; description = '' Enable NVIDIA hardware support ''; }; open = { type = types.bool; default = false; }; powerManagement = { type = types.enum [ "on" "off" "finegrained" ]; default = "on"; description = '' on/off: Whether to enable experimental power management through systemd. For more information, see the NVIDIA docs, on Chapter 21. Configuring Power Management Support. finegrained: Whether to enable experimental power management of PRIME offload. For more information, see the NVIDIA docs, on Chapter 22. PCI-Express Runtime D3 (RTD3) Power Management. ''; }; integrated = { enable = { type = types.bool; default = false; description = '' Enable support for integrated hardware ''; }; integratedBus = { type = types.str; default = if config.hardware.cpu.vendor == "intel" then "PCI:0:2:0" else null; description = '' Bus ID of the integrated GPU. You can find it using lspci, either under 3D or VGA ''; }; dedicatedBus = { type = types.str; default = "PCI:1:0:0"; description = '' Bus ID of the NVIDIA GPU. You can find it using lspci, either under 3D or VGA ''; }; }; }; config = lib.mkIf (cfg.enable && cfg.nvidia.enable) ( lib.mkMerge [ { assertions = [ { assertion = !cfg.nvidia.open -> cfgRoot.modules.unfree.enable; message = '' The programs.nvidia module uses unfree software if open is set to false. To use it you need to - set modules.unfree.enable to true OR - set.modules.video.nvidia.open to true ''; } ]; boot = { initrd.availableKernelModules = [ "nvidia" "nvidia_modeset" "nvidia_drm" "nvidia_uvm" ]; kernelParams = [ "nvidia.NVreg_UsePageAttributeTable=1" ]; }; environment.sessionVariables = { _JAVA_AWT_WM_NONREPARENTING = "1"; GBM_BACKEND = "nvidia-drm"; NIXOS_OZONE_WL = "1"; SDL_VIDEODRIVER = "wayland"; # Can break some native games WLR_NO_HARDWARE_CURSORS = "1"; }; services.xserver.videoDrivers = [ "fbdev" "modesetting" "nvidia" ]; hardware = { # NVIDIA nvidia = { inherit (cfg.nvidia) open; nvidiaSettings = false; # Kernel modesetting modesetting.enable = true; package = config.boot.kernelPackages.nvidiaPackages.latest; # PowerManagement powerManagement.enable = cfg.powerManagement == "on" || cfg.powerManagement == "finegrained"; powerManagement.finegrained = cfg.nvidia.powerManagement == "finegrained"; # Integrated GPU prime = if cfg.nvidia.integrated.enable then { offload.enable = true; "${config.hardware.cpu.vendor}BusId" = cfg.nvidia.integrated.integratedBus; nvidiaBusId = cfg.nvidia.integrated.dedicatedBus; } else { }; }; }; } (lib.mkIf (!cfg.nvidia.open) { modules.unfree.list = [ "nvidia-x11" ]; }) ] ); }