Code change:
}; }; <del> config = let igpuDriver = if pCfg.intelBusId != "" then "modesetting" else "amdgpu"; igpuBusId = if pCfg.intelBusId != "" then pCfg.intelBusId else pCfg.amdgpuBusId; in lib.mkIf (nvidia_x11 != null) (lib.mkMerge [ # Common ({ assertions = [ { assertion = !(nvidiaEnabled && cfg.datacenter.enable); message = "You cannot configure both X11 and Data Center drivers at the same time."; } ]; boot = { blacklistedKernelModules = ["nouveau" "nvidiafb"]; # Don't add `nvidia-uvm` to `kernelModules`, because we want # `nvidia-uvm` be loaded only after `udev` rules for `nvidia` kernel # module are applied. # # Instead, we use `softdep` to lazily load `nvidia-uvm` kernel module # after `nvidia` kernel module is loaded and `udev` rules are applied. extraModprobeConfig = '' softdep nvidia post: nvidia-uvm ''; }; systemd.tmpfiles.rules = lib.optional config.virtualisation.docker.enableNvidia "L+ /run/nvidia-docker/bin - - - - ${nvidia_x11.bin}/origBin"; services.udev.extraRules = '' # Create /dev/nvidia-uvm when the nvidia-uvm module is loaded. KERNEL=="nvidia", RUN+="${pkgs.runtimeShell} -c 'mknod -m 666 /dev/nvidiactl c 195 255'" KERNEL=="nvidia", RUN+="${pkgs.runtimeShell} -c 'for i in $$(cat /proc/driver/nvidia/gpus/*/information | grep Minor | cut -d   -f 4); do mknod -m 666 /dev/nvidia$${i} c 195 $${i}; done'" KERNEL=="nvidia_modeset", RUN+="${pkgs.runtimeShell} -c 'mknod -m 666 /dev/nvidia-modeset c 195 254'" KERNEL=="nvidia_uvm", RUN+="${pkgs.runtimeShell} -c 'mknod -m 666 /dev/nvidia-uvm c $$(grep nvidia-uvm /proc/devices | cut -d   -f 1) 0'" KERNEL=="nvidia_uvm", RUN+="${pkgs.runtimeShell} -c 'mknod -m 666 /dev/nvidia-uvm-tools c $$(grep nvidia-uvm /proc/devices | cut -d   -f 1) 1'" ''; hardware.opengl = { extraPackages = [ nvidia_x11.out ]; extraPackages32 = [ nvidia_x11.lib32 </del> <ins> config = let igpuDriver = if pCfg.intelBusId != "" then "modesetting" else "amdgpu"; igpuBusId = if pCfg.intelBusId != "" then pCfg.intelBusId else pCfg.amdgpuBusId; in lib.mkIf (nvidia_x11 != null) ( lib.mkMerge [ # Common ({ assertions = [ { assertion = !(nvidiaEnabled && cfg.datacenter.enable); message = "You cannot configure both X11 and Data Center drivers at the same time."; } </ins> ]; <del> }; environment.systemPackages = [ nvidia_x11.bin ]; }) # X11 (lib.mkIf nvidiaEnabled { assertions = [ { assertion = primeEnabled -> pCfg.intelBusId == "" || pCfg.amdgpuBusId == ""; message = "You cannot configure both an Intel iGPU and an AMD APU. Pick the one corresponding to your processor."; } { assertion = offloadCfg.enableOffloadCmd -> offloadCfg.enable || reverseSyncCfg.enable; message = "Offload command requires offloading or reverse prime sync to be enabled."; } { assertion = primeEnabled -> pCfg.nvidiaBusId != "" && (pCfg.intelBusId != "" || pCfg.amdgpuBusId != ""); message = "When NVIDIA PRIME is enabled, the GPU bus IDs must be configured."; } { assertion = offloadCfg.enable -> lib.versionAtLeast nvidia_x11.version "435.21"; message = "NVIDIA PRIME render offload is currently only supported on versions >= 435.21."; } { assertion = (reverseSyncCfg.enable && pCfg.amdgpuBusId != "") -> lib.versionAtLeast nvidia_x11.version "470.0"; message = "NVIDIA PRIME render offload for AMD APUs is currently only supported on versions >= 470 beta."; } { assertion = !(syncCfg.enable && offloadCfg.enable); message = "PRIME Sync and Offload cannot be both enabled"; } { assertion = !(syncCfg.enable && reverseSyncCfg.enable); message = "PRIME Sync and PRIME Reverse Sync cannot be both enabled"; } { assertion = !(syncCfg.enable && cfg.powerManagement.finegrained); message = "Sync precludes powering down the NVIDIA GPU."; } { assertion = cfg.powerManagement.finegrained -> offloadCfg.enable; message = "Fine-grained power management requires offload to be enabled."; } { assertion = cfg.powerManagement.enable -> lib.versionAtLeast nvidia_x11.version "430.09"; message = "Required files for driver based power management only exist on versions >= 430.09."; } { assertion = cfg.open -> (cfg.package ? open && cfg.package ? firmware); message = "This version of NVIDIA driver does not provide a corresponding opensource kernel driver"; } { assertion = cfg.dynamicBoost.enable -> lib.versionAtLeast nvidia_x11.version "510.39.01"; message = "NVIDIA's Dynamic Boost feature only exists on versions >= 510.39.01"; }]; # If Optimus/PRIME is enabled, we: # - Specify the configured NVIDIA GPU bus ID in the Device section for the #   "nvidia" driver. # - Add the AllowEmptyInitialConfiguration option to the Screen section for the #   "nvidia" driver, in order to allow the X server to start without any outputs. # - Add a separate Device section for the Intel GPU, using the "modesetting" #   driver and with the configured BusID. # - OR add a separate Device section for the AMD APU, using the "amdgpu" #   driver and with the configures BusID. # - Reference that Device section from the ServerLayout section as an inactive #   device. # - Configure the display manager to run specific `xrandr` commands which will #   configure/enable displays connected to the Intel iGPU / AMD APU. # reverse sync implies offloading hardware.nvidia.prime.offload.enable = lib.mkDefault reverseSyncCfg.enable; services.xserver.drivers = lib.optional primeEnabled { name = igpuDriver; display = offloadCfg.enable; modules = lib.optional (igpuDriver == "amdgpu") pkgs.xorg.xf86videoamdgpu; deviceSection = '' BusID "${igpuBusId}" '' + lib.optionalString (syncCfg.enable && igpuDriver != "amdgpu") '' Option "AccelMethod" "none" ''; } ++ lib.singleton { name = "nvidia"; modules = [nvidia_x11.bin]; display = !offloadCfg.enable; deviceSection = '' Option "SidebandSocketPath" "/run/nvidia-xdriver/" '' + lib.optionalString primeEnabled '' BusID "${pCfg.nvidiaBusId}" '' + lib.optionalString pCfg.allowExternalGpu '' Option "AllowExternalGpus" ''; screenSection = '' Option "RandRRotation" "on" '' + lib.optionalString syncCfg.enable '' Option "AllowEmptyInitialConfiguration" '' + lib.optionalString cfg.forceFullCompositionPipeline '' Option         "metamodes" "nvidia-auto-select +0+0 {ForceFullCompositionPipeline=On}" Option         "AllowIndirectGLXProtocol" "off" Option         "TripleBuffer" "on" ''; </del> <ins> boot = { blacklistedKernelModules = [ "nouveau" "nvidiafb" ]; # Don't add `nvidia-uvm` to `kernelModules`, because we want # `nvidia-uvm` be loaded only after `udev` rules for `nvidia` kernel # module are applied. # # Instead, we use `softdep` to lazily load `nvidia-uvm` kernel module # after `nvidia` kernel module is loaded and `udev` rules are applied. extraModprobeConfig = '' softdep nvidia post: nvidia-uvm ''; </ins> }; <del> services.xserver.serverLayoutSection = lib.optionalString syncCfg.enable '' Inactive "Device-${igpuDriver}[0]" '' + lib.optionalString reverseSyncCfg.enable '' Inactive "Device-nvidia[0]" '' + lib.optionalString offloadCfg.enable '' Option "AllowNVIDIAGPUScreens" </del> <ins> systemd.tmpfiles.rules = lib.optional config.virtualisation.docker.enableNvidia "L+ /run/nvidia-docker/bin - - - - ${nvidia_x11.bin}/origBin"; services.udev.extraRules = '' # Create /dev/nvidia-uvm when the nvidia-uvm module is loaded. KERNEL=="nvidia", RUN+="${pkgs.runtimeShell} -c 'mknod -m 666 /dev/nvidiactl c 195 255'" KERNEL=="nvidia", RUN+="${pkgs.runtimeShell} -c 'for i in $$(cat /proc/driver/nvidia/gpus/*/information | grep Minor | cut -d   -f 4); do mknod -m 666 /dev/nvidia$${i} c 195 $${i}; done'" KERNEL=="nvidia_modeset", RUN+="${pkgs.runtimeShell} -c 'mknod -m 666 /dev/nvidia-modeset c 195 254'" KERNEL=="nvidia_uvm", RUN+="${pkgs.runtimeShell} -c 'mknod -m 666 /dev/nvidia-uvm c $$(grep nvidia-uvm /proc/devices | cut -d   -f 1) 0'" KERNEL=="nvidia_uvm", RUN+="${pkgs.runtimeShell} -c 'mknod -m 666 /dev/nvidia-uvm-tools c $$(grep nvidia-uvm /proc/devices | cut -d   -f 1) 1'" </ins> ''; <ins> hardware.opengl = { extraPackages = [ nvidia_x11.out ]; extraPackages32 = [ nvidia_x11.lib32 ]; }; environment.systemPackages = [ nvidia_x11.bin ]; }) # X11 (lib.mkIf nvidiaEnabled { assertions = [ { assertion = primeEnabled -> pCfg.intelBusId == "" || pCfg.amdgpuBusId == ""; message = "You cannot configure both an Intel iGPU and an AMD APU. Pick the one corresponding to your processor."; } { assertion = offloadCfg.enableOffloadCmd -> offloadCfg.enable || reverseSyncCfg.enable; message = "Offload command requires offloading or reverse prime sync to be enabled."; } { assertion = primeEnabled -> pCfg.nvidiaBusId != "" && (pCfg.intelBusId != "" || pCfg.amdgpuBusId != ""); message = "When NVIDIA PRIME is enabled, the GPU bus IDs must be configured."; } { assertion = offloadCfg.enable -> lib.versionAtLeast nvidia_x11.version "435.21"; message = "NVIDIA PRIME render offload is currently only supported on versions >= 435.21."; } { assertion = (reverseSyncCfg.enable && pCfg.amdgpuBusId != "") -> lib.versionAtLeast nvidia_x11.version "470.0"; message = "NVIDIA PRIME render offload for AMD APUs is currently only supported on versions >= 470 beta."; } { assertion = !(syncCfg.enable && offloadCfg.enable); message = "PRIME Sync and Offload cannot be both enabled"; } { assertion = !(syncCfg.enable && reverseSyncCfg.enable); message = "PRIME Sync and PRIME Reverse Sync cannot be both enabled"; } { assertion = !(syncCfg.enable && cfg.powerManagement.finegrained); message = "Sync precludes powering down the NVIDIA GPU."; } { assertion = cfg.powerManagement.finegrained -> offloadCfg.enable; message = "Fine-grained power management requires offload to be enabled."; } { assertion = cfg.powerManagement.enable -> lib.versionAtLeast nvidia_x11.version "430.09"; message = "Required files for driver based power management only exist on versions >= 430.09."; } { assertion = cfg.open -> (cfg.package ? open && cfg.package ? firmware); message = "This version of NVIDIA driver does not provide a corresponding opensource kernel driver"; } { assertion = cfg.dynamicBoost.enable -> lib.versionAtLeast nvidia_x11.version "510.39.01"; message = "NVIDIA's Dynamic Boost feature only exists on versions >= 510.39.01"; } ]; </ins> <del> services.xserver.displayManager.setupCommands = let gpuProviderName = if igpuDriver == "amdgpu" then # find the name of the provider if amdgpu "`${lib.getExe pkgs.xorg.xrandr} --listproviders | ${lib.getExe pkgs.gnugrep} -i AMD | ${lib.getExe pkgs.gnused} -n 's/^.*name://p'`" else igpuDriver; providerCmdParams = if syncCfg.enable then ""${gpuProviderName}" NVIDIA-0" else "NVIDIA-G0 "${gpuProviderName}""; in lib.optionalString (syncCfg.enable || reverseSyncCfg.enable) '' # Added by nvidia configuration module for Optimus/PRIME. ${lib.getExe pkgs.xorg.xrandr} --setprovideroutputsource ${providerCmdParams} ${lib.getExe pkgs.xorg.xrandr} --auto ''; </del> <ins> # If Optimus/PRIME is enabled, we: # - Specify the configured NVIDIA GPU bus ID in the Device section for the #   "nvidia" driver. # - Add the AllowEmptyInitialConfiguration option to the Screen section for the #   "nvidia" driver, in order to allow the X server to start without any outputs. # - Add a separate Device section for the Intel GPU, using the "modesetting" #   driver and with the configured BusID. # - OR add a separate Device section for the AMD APU, using the "amdgpu" #   driver and with the configures BusID. # - Reference that Device section from the ServerLayout section as an inactive #   device. # - Configure the display manager to run specific `xrandr` commands which will #   configure/enable displays connected to the Intel iGPU / AMD APU. # reverse sync implies offloading hardware.nvidia.prime.offload.enable = lib.mkDefault reverseSyncCfg.enable; services.xserver.drivers = lib.optional primeEnabled { name = igpuDriver; display = offloadCfg.enable; modules = lib.optional (igpuDriver == "amdgpu") pkgs.xorg.xf86videoamdgpu; deviceSection = '' BusID "${igpuBusId}" '' + lib.optionalString (syncCfg.enable && igpuDriver != "amdgpu") '' Option "AccelMethod" "none" ''; } ++ lib.singleton { name = "nvidia"; modules = [ nvidia_x11.bin ]; display = !offloadCfg.enable; deviceSection = '' Option "SidebandSocketPath" "/run/nvidia-xdriver/" '' + lib.optionalString primeEnabled '' BusID "${pCfg.nvidiaBusId}" '' + lib.optionalString pCfg.allowExternalGpu '' Option "AllowExternalGpus" ''; screenSection = '' Option "RandRRotation" "on" '' + lib.optionalString syncCfg.enable '' Option "AllowEmptyInitialConfiguration" '' + lib.optionalString cfg.forceFullCompositionPipeline '' Option         "metamodes" "nvidia-auto-select +0+0 {ForceFullCompositionPipeline=On}" Option         "AllowIndirectGLXProtocol" "off" Option         "TripleBuffer" "on" ''; }; </ins> <del> environment.etc = { "nvidia/nvidia-application-profiles-rc" = lib.mkIf nvidia_x11.useProfiles {source = "${nvidia_x11.bin}/share/nvidia/nvidia-application-profiles-rc";}; </del> <ins> services.xserver.serverLayoutSection = lib.optionalString syncCfg.enable '' Inactive "Device-${igpuDriver}[0]" '' + lib.optionalString reverseSyncCfg.enable '' Inactive "Device-nvidia[0]" '' + lib.optionalString offloadCfg.enable '' Option "AllowNVIDIAGPUScreens" ''; services.xserver.displayManager.setupCommands = let gpuProviderName = if igpuDriver == "amdgpu" then # find the name of the provider if amdgpu "`${lib.getExe pkgs.xorg.xrandr} --listproviders | ${lib.getExe pkgs.gnugrep} -i AMD | ${lib.getExe pkgs.gnused} -n 's/^.*name://p'`" else igpuDriver; providerCmdParams = if syncCfg.enable then ""${gpuProviderName}" NVIDIA-0" else "NVIDIA-G0 "${gpuProviderName}""; in lib.optionalString (syncCfg.enable || reverseSyncCfg.enable) '' # Added by nvidia configuration module for Optimus/PRIME. ${lib.getExe pkgs.xorg.xrandr} --setprovideroutputsource ${providerCmdParams} ${lib.getExe pkgs.xorg.xrandr} --auto ''; environment.etc = { "nvidia/nvidia-application-profiles-rc" = lib.mkIf nvidia_x11.useProfiles { source = "${nvidia_x11.bin}/share/nvidia/nvidia-application-profiles-rc"; }; </ins> <del> # 'nvidia_x11' installs it's files to /run/opengl-driver/... "egl/egl_external_platform.d".source = "/run/opengl-driver/share/egl/egl_external_platform.d/"; }; </del> <ins> # 'nvidia_x11' installs it's files to /run/opengl-driver/... "egl/egl_external_platform.d".source = "/run/opengl-driver/share/egl/egl_external_platform.d/"; }; </ins> <del> hardware.opengl = { extraPackages = [ pkgs.nvidia-vaapi-driver ]; extraPackages32 = [ pkgs.pkgsi686Linux.nvidia-vaapi-driver ]; }; environment.systemPackages = lib.optional cfg.nvidiaSettings nvidia_x11.settings ++ lib.optional cfg.nvidiaPersistenced nvidia_x11.persistenced ++ lib.optional offloadCfg.enableOffloadCmd (pkgs.writeShellScriptBin "nvidia-offload" '' export __NV_PRIME_RENDER_OFFLOAD=1 export __NV_PRIME_RENDER_OFFLOAD_PROVIDER=NVIDIA-G0 export __GLX_VENDOR_LIBRARY_NAME=nvidia export __VK_LAYER_NV_optimus=NVIDIA_only exec "$@" ''); systemd.packages = lib.optional cfg.powerManagement.enable nvidia_x11.out; systemd.services = let nvidiaService = state: { description = "NVIDIA system ${state} actions"; path = [pkgs.kbd]; serviceConfig = { Type = "oneshot"; ExecStart = "${nvidia_x11.out}/bin/nvidia-sleep.sh '${state}'"; }; before = ["systemd-${state}.service"]; requiredBy = ["systemd-${state}.service"]; </del> <ins> hardware.opengl = { extraPackages = [ pkgs.nvidia-vaapi-driver ]; extraPackages32 = [ pkgs.pkgsi686Linux.nvidia-vaapi-driver ]; </ins> }; <del> in lib.mkMerge [ (lib.mkIf cfg.powerManagement.enable { nvidia-suspend = nvidiaService "suspend"; nvidia-hibernate = nvidiaService "hibernate"; nvidia-resume = (nvidiaService "resume") // { before = []; after = ["systemd-suspend.service" "systemd-hibernate.service"]; requiredBy = ["systemd-suspend.service" "systemd-hibernate.service"]; }; }) (lib.mkIf cfg.nvidiaPersistenced { "nvidia-persistenced" = { description = "NVIDIA Persistence Daemon"; wantedBy = ["multi-user.target"]; </del> <ins> environment.systemPackages = lib.optional cfg.nvidiaSettings nvidia_x11.settings ++ lib.optional cfg.nvidiaPersistenced nvidia_x11.persistenced ++ lib.optional offloadCfg.enableOffloadCmd ( pkgs.writeShellScriptBin "nvidia-offload" '' export __NV_PRIME_RENDER_OFFLOAD=1 export __NV_PRIME_RENDER_OFFLOAD_PROVIDER=NVIDIA-G0 export __GLX_VENDOR_LIBRARY_NAME=nvidia export __VK_LAYER_NV_optimus=NVIDIA_only exec "$@" '' ); systemd.packages = lib.optional cfg.powerManagement.enable nvidia_x11.out; systemd.services = let nvidiaService = state: { description = "NVIDIA system ${state} actions"; path = [ pkgs.kbd ]; </ins> serviceConfig = { <del> Type = "forking"; Restart = "always"; PIDFile = "/var/run/nvidia-persistenced/nvidia-persistenced.pid"; ExecStart = "${lib.getExe nvidia_x11.persistenced} --verbose"; ExecStopPost = "${pkgs.coreutils}/bin/rm -rf /var/run/nvidia-persistenced"; </del> <ins> Type = "oneshot"; ExecStart = "${nvidia_x11.out}/bin/nvidia-sleep.sh '${state}'"; </ins> }; <ins> before = [ "systemd-${state}.service" ]; requiredBy = [ "systemd-${state}.service" ]; </ins> }; <del> }) (lib.mkIf cfg.dynamicBoost.enable { "nvidia-powerd" = { description = "nvidia-powerd service"; path = [ pkgs.util-linux # nvidia-powerd wants lscpu ]; wantedBy = ["multi-user.target"]; serviceConfig = { Type = "dbus"; BusName = "nvidia.powerd.server"; ExecStart = "${nvidia_x11.bin}/bin/nvidia-powerd"; </del> <ins> in lib.mkMerge [ (lib.mkIf cfg.powerManagement.enable { nvidia-suspend = nvidiaService "suspend"; nvidia-hibernate = nvidiaService "hibernate"; nvidia-resume = (nvidiaService "resume") // { before = [ ]; after = [ "systemd-suspend.service" "systemd-hibernate.service" ]; requiredBy = [ "systemd-suspend.service" "systemd-hibernate.service" ]; </ins> }; <del> }; }) ]; services.acpid.enable = true; services.dbus.packages = lib.optional cfg.dynamicBoost.enable nvidia_x11.bin; hardware.firmware = lib.optional cfg.open nvidia_x11.firmware; systemd.tmpfiles.rules = [ # Remove the following log message: #    (WW) NVIDIA: Failed to bind sideband socket to #    (WW) NVIDIA:     '/var/run/nvidia-xdriver-b4f69129' Permission denied # # https://bbs.archlinux.org/viewtopic.php?pid=1909115#p1909115 "d /run/nvidia-xdriver 0770 root users" ] ++ lib.optional (nvidia_x11.persistenced != null && config.virtualisation.docker.enableNvidia) "L+ /run/nvidia-docker/extras/bin/nvidia-persistenced - - - - ${nvidia_x11.persistenced}/origBin/nvidia-persistenced"; boot = { extraModulePackages = if cfg.open then [nvidia_x11.open] else [nvidia_x11.bin]; # nvidia-uvm is required by CUDA applications. kernelModules = lib.optionals config.services.xserver.enable ["nvidia" "nvidia_modeset" "nvidia_drm"]; # If requested enable modesetting via kernel parameter. kernelParams = lib.optional (offloadCfg.enable || cfg.modesetting.enable) "nvidia-drm.modeset=1" ++ lib.optional cfg.powerManagement.enable "nvidia.NVreg_PreserveVideoMemoryAllocations=1" ++ lib.optional cfg.open "nvidia.NVreg_OpenRmEnableUnsupportedGpus=1" ++ lib.optional (config.boot.kernelPackages.kernel.kernelAtLeast "6.2" && !ibtSupport) "ibt=off"; # enable finegrained power management extraModprobeConfig = lib.optionalString cfg.powerManagement.finegrained '' options nvidia "NVreg_DynamicPowerManagement=0x02" ''; }; services.udev.extraRules = lib.optionalString cfg.powerManagement.finegrained ( lib.optionalString (lib.versionOlder config.boot.kernelPackages.kernel.version "5.5") '' # Remove NVIDIA USB xHCI Host Controller devices, if present ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x0c0330", ATTR{remove}="1" # Remove NVIDIA USB Type-C UCSI devices, if present ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x0c8000", ATTR{remove}="1" # Remove NVIDIA Audio devices, if present ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x040300", ATTR{remove}="1" '' + '' # Enable runtime PM for NVIDIA VGA/3D controller devices on driver bind ACTION=="bind", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x030000", TEST=="power/control", ATTR{power/control}="auto" ACTION=="bind", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x030200", TEST=="power/control", ATTR{power/control}="auto" # Disable runtime PM for NVIDIA VGA/3D controller devices on driver unbind ACTION=="unbind", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x030000", TEST=="power/control", ATTR{power/control}="on" ACTION=="unbind", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x030200", TEST=="power/control", ATTR{power/control}="on" '' ); }) # Data Center (lib.mkIf (cfg.datacenter.enable) { boot.extraModulePackages = [ nvidia_x11.bin ]; systemd = { tmpfiles.rules = lib.optional (nvidia_x11.persistenced != null && config.virtualisation.docker.enableNvidia) "L+ /run/nvidia-docker/extras/bin/nvidia-persistenced - - - - ${nvidia_x11.persistenced}/origBin/nvidia-persistenced"; services = lib.mkMerge [ ({ nvidia-fabricmanager = { enable = true; description = "Start NVIDIA NVLink Management"; wantedBy = [ "multi-user.target" ]; unitConfig.After = [ "network-online.target" ]; unitConfig.Requires = [ "network-online.target" ]; serviceConfig = { Type = "forking"; TimeoutStartSec = 240; ExecStart = let nv-fab-conf = settingsFormat.generate "fabricmanager.conf" cfg.datacenter.settings; in </del> <ins> }) (lib.mkIf cfg.nvidiaPersistenced { "nvidia-persistenced" = { description = "NVIDIA Persistence Daemon"; wantedBy = [ "multi-user.target" ]; serviceConfig = { Type = "forking"; Restart = "always"; PIDFile = "/var/run/nvidia-persistenced/nvidia-persistenced.pid"; ExecStart = "${lib.getExe nvidia_x11.persistenced} --verbose"; ExecStopPost = "${pkgs.coreutils}/bin/rm -rf /var/run/nvidia-persistenced"; }; }; }) (lib.mkIf cfg.dynamicBoost.enable { "nvidia-powerd" = { description = "nvidia-powerd service"; path = [ pkgs.util-linux # nvidia-powerd wants lscpu ]; wantedBy = [ "multi-user.target" ]; serviceConfig = { Type = "dbus"; BusName = "nvidia.powerd.server"; ExecStart = "${nvidia_x11.bin}/bin/nvidia-powerd"; }; }; }) ]; services.acpid.enable = true; services.dbus.packages = lib.optional cfg.dynamicBoost.enable nvidia_x11.bin; hardware.firmware = let isOpen = cfg.open; isNewUnfree = lib.versionAtLeast nvidia_x11.version "555"; in lib.optional (isOpen || isNewUnfree) nvidia_x11.firmware; systemd.tmpfiles.rules = [ # Remove the following log message: #    (WW) NVIDIA: Failed to bind sideband socket to #    (WW) NVIDIA:     '/var/run/nvidia-xdriver-b4f69129' Permission denied # # https://bbs.archlinux.org/viewtopic.php?pid=1909115#p1909115 "d /run/nvidia-xdriver 0770 root users" ] ++ lib.optional (nvidia_x11.persistenced != null && config.virtualisation.docker.enableNvidia) "L+ /run/nvidia-docker/extras/bin/nvidia-persistenced - - - - ${nvidia_x11.persistenced}/origBin/nvidia-persistenced"; boot = { extraModulePackages = if cfg.open then [ nvidia_x11.open ] else [ nvidia_x11.bin ]; # nvidia-uvm is required by CUDA applications. kernelModules = lib.optionals config.services.xserver.enable [ "nvidia" "nvidia_modeset" "nvidia_drm" ]; # If requested enable modesetting via kernel parameter. kernelParams = lib.optional (offloadCfg.enable || cfg.modesetting.enable) "nvidia-drm.modeset=1" ++ lib.optional cfg.powerManagement.enable "nvidia.NVreg_PreserveVideoMemoryAllocations=1" ++ lib.optional cfg.open "nvidia.NVreg_OpenRmEnableUnsupportedGpus=1" ++ lib.optional (config.boot.kernelPackages.kernel.kernelAtLeast "6.2" && !ibtSupport) "ibt=off"; # enable finegrained power management extraModprobeConfig = lib.optionalString cfg.powerManagement.finegrained '' options nvidia "NVreg_DynamicPowerManagement=0x02" ''; }; services.udev.extraRules = lib.optionalString cfg.powerManagement.finegrained ( lib.optionalString (lib.versionOlder config.boot.kernelPackages.kernel.version "5.5") '' # Remove NVIDIA USB xHCI Host Controller devices, if present ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x0c0330", ATTR{remove}="1" # Remove NVIDIA USB Type-C UCSI devices, if present ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x0c8000", ATTR{remove}="1" # Remove NVIDIA Audio devices, if present ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x040300", ATTR{remove}="1" '' + '' # Enable runtime PM for NVIDIA VGA/3D controller devices on driver bind ACTION=="bind", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x030000", TEST=="power/control", ATTR{power/control}="auto" ACTION=="bind", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x030200", TEST=="power/control", ATTR{power/control}="auto" # Disable runtime PM for NVIDIA VGA/3D controller devices on driver unbind ACTION=="unbind", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x030000", TEST=="power/control", ATTR{power/control}="on" ACTION=="unbind", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x030200", TEST=="power/control", ATTR{power/control}="on" '' ); }) # Data Center (lib.mkIf (cfg.datacenter.enable) { boot.extraModulePackages = [ nvidia_x11.bin ]; systemd = { tmpfiles.rules = lib.optional (nvidia_x11.persistenced != null && config.virtualisation.docker.enableNvidia) "L+ /run/nvidia-docker/extras/bin/nvidia-persistenced - - - - ${nvidia_x11.persistenced}/origBin/nvidia-persistenced"; services = lib.mkMerge [ ({ nvidia-fabricmanager = { enable = true; description = "Start NVIDIA NVLink Management"; wantedBy = [ "multi-user.target" ]; unitConfig.After = [ "network-online.target" ]; unitConfig.Requires = [ "network-online.target" ]; serviceConfig = { Type = "forking"; TimeoutStartSec = 240; ExecStart = let nv-fab-conf = settingsFormat.generate "fabricmanager.conf" cfg.datacenter.settings; in </ins> "${lib.getExe nvidia_x11.fabricmanager} -c ${nv-fab-conf}"; <del> LimitCORE="infinity"; </del> <ins> LimitCORE = "infinity"; }; </ins> }; <del> }; }) (lib.mkIf cfg.nvidiaPersistenced { "nvidia-persistenced" = { description = "NVIDIA Persistence Daemon"; wantedBy = ["multi-user.target"]; serviceConfig = { Type = "forking"; Restart = "always"; PIDFile = "/var/run/nvidia-persistenced/nvidia-persistenced.pid"; ExecStart = "${lib.getExe nvidia_x11.persistenced} --verbose"; ExecStopPost = "${pkgs.coreutils}/bin/rm -rf /var/run/nvidia-persistenced"; </del> <ins> }) (lib.mkIf cfg.nvidiaPersistenced { "nvidia-persistenced" = { description = "NVIDIA Persistence Daemon"; wantedBy = [ "multi-user.target" ]; serviceConfig = { Type = "forking"; Restart = "always"; PIDFile = "/var/run/nvidia-persistenced/nvidia-persistenced.pid"; ExecStart = "${lib.getExe nvidia_x11.persistenced} --verbose"; ExecStopPost = "${pkgs.coreutils}/bin/rm -rf /var/run/nvidia-persistenced"; }; </ins> }; <del> }; }) ]; }; </del> <ins> }) ]; }; </ins> <del> environment.systemPackages = lib.optional cfg.datacenter.enable nvidia_x11.fabricmanager ++ lib.optional cfg.nvidiaPersistenced nvidia_x11.persistenced; }) ]); </del> <ins> environment.systemPackages = lib.optional cfg.datacenter.enable nvidia_x11.fabricmanager ++ lib.optional cfg.nvidiaPersistenced nvidia_x11.persistenced; }) ] ); </ins> }

Related discussion:
text: Package name: Latest released version: 555.42.02 <!-- Search your package here: --- Current version on the unstable channel: 550.78 Current version on the stable/release channel: 545.29.02 <!-- Type the name of your package and try to find an open pull request for the package If you find an open pull request, you can review it! There's a high chance that you'll have the new version right away while helping the community! --- Notify maintainers <!-- If the result shows no maintainers, tag the person that last updated the package. -- Note for maintainers: Please tag this issue in your PR. Add a :+1: [reaction] to [issues you find important]. [reaction]: [issues you find important]: