nixos/nvidia: write module params to modprobe

This commit is contained in:
ccicnce113424
2026-03-15 21:40:27 +08:00
parent 78f6ee7ba2
commit c647c537e4
+51 -20
View File
@@ -332,6 +332,20 @@ in
videoAcceleration = lib.mkEnableOption "video acceleration (VA-API)" // {
default = true;
};
moduleParams = lib.mkOption {
type = lib.types.attrsOf (lib.types.attrsOf lib.types.raw);
default = { };
example = ''
{
nvidia = {
NVreg_UsePageAttributeTable = 1;
NVreg_RegistryDwords = "EnableBrightnessControl=1"
};
}
'';
description = "Additional parameters to pass to the NVIDIA kernel module.";
};
};
};
@@ -531,6 +545,17 @@ in
-> (useOpenModules && lib.versionAtLeast nvidia_x11.version "595");
message = "NVIDIA driver support for kernel suspend notifiers requires NVIDIA driver version 595 or newer, and the open source kernel modules.";
}
{
assertion =
removeAttrs cfg.moduleParams [
"nvidia"
"nvidia-drm"
"nvidia-modeset"
"nvidia-uvm"
] == { };
message = "You can only use `hardware.nvidia.moduleParams` to set parameters for the kernel modules of NVIDIA drivers.";
}
];
# If Optimus/PRIME is enabled, we:
@@ -722,6 +747,23 @@ in
lib.optional (nvidia_x11.persistenced != null && config.virtualisation.docker.enableNvidia)
"L+ /run/nvidia-docker/extras/bin/nvidia-persistenced - - - - ${nvidia_x11.persistenced}/origBin/nvidia-persistenced";
hardware.nvidia.moduleParams = lib.mkMerge (
lib.optional (offloadCfg.enable || cfg.modesetting.enable) { nvidia-drm.modeset = 1; }
++ lib.optional (
(offloadCfg.enable || cfg.modesetting.enable) && lib.versionAtLeast nvidia_x11.version "545"
) { nvidia-drm.fbdev = 1; }
++ lib.optional (cfg.powerManagement.enable && cfg.powerManagement.kernelSuspendNotifier) {
nvidia.NVreg_UseKernelSuspendNotifiers = 1;
}
++ lib.optional cfg.powerManagement.enable { nvidia.NVreg_PreserveVideoMemoryAllocations = 1; }
++ lib.optional (
useOpenModules
&& lib.versionAtLeast nvidia_x11.version "515.43.04"
&& lib.versionOlder nvidia_x11.version "545.23.06"
) { nvidia.NVreg_OpenRmEnableUnsupportedGpus = 1; }
++ lib.optional cfg.powerManagement.finegrained { nvidia.NVreg_DynamicPowerManagement = "0x02"; }
);
boot = {
extraModulePackages = if useOpenModules then [ nvidia_x11.open ] else [ nvidia_x11.mod ];
# nvidia-uvm is required by CUDA applications.
@@ -731,27 +773,16 @@ in
"nvidia_drm"
];
# If requested enable modesetting via kernel parameters.
kernelParams =
lib.optional (offloadCfg.enable || cfg.modesetting.enable) "nvidia-drm.modeset=1"
++ lib.optional (
(offloadCfg.enable || cfg.modesetting.enable) && lib.versionAtLeast nvidia_x11.version "545"
) "nvidia-drm.fbdev=1"
++ lib.optional (
cfg.powerManagement.enable && cfg.powerManagement.kernelSuspendNotifier
) "nvidia.NVreg_UseKernelSuspendNotifiers=1"
++ lib.optional cfg.powerManagement.enable "nvidia.NVreg_PreserveVideoMemoryAllocations=1"
++ lib.optional (
useOpenModules
&& lib.versionAtLeast nvidia_x11.version "515.43.04"
&& lib.versionOlder nvidia_x11.version "545.23.06"
) "nvidia.NVreg_OpenRmEnableUnsupportedGpus=1"
++ lib.optional (config.boot.kernelPackages.kernel.kernelAtLeast "6.2" && !ibtSupport) "ibt=off";
kernelParams = 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"
'';
extraModprobeConfig =
let
mergeParams = lib.concatMapAttrsStringSep " " (k: v: "${k}=${toString v}");
genModprobeLine = module: params: "options ${module} ${mergeParams params}";
in
lib.concatMapAttrsStringSep "\n" genModprobeLine cfg.moduleParams;
};
services.udev.extraRules = lib.optionalString cfg.powerManagement.finegrained (
lib.optionalString (lib.versionOlder config.boot.kernelPackages.kernel.version "5.5") ''