mirror of
https://github.com/aviallon/nixos-lib.git
synced 2026-04-05 17:27:50 +00:00
190 lines
7.3 KiB
Nix
190 lines
7.3 KiB
Nix
{ config, pkgs, lib, options, nixpkgs-unstable, ... }:
|
|
with lib;
|
|
let
|
|
cfg = config.aviallon.hardware.nvidia;
|
|
generalCfg = config.aviallon.general;
|
|
hardwareCfg = config.hardware;
|
|
toValue = x: if x then "1" else "0";
|
|
xwaylandEGLStream = pkgs.writeShellScriptBin "xwayland" ''
|
|
exec ${options.programs.xwayland.package.default}/bin/xwayland -eglstream "$@"
|
|
'';
|
|
|
|
nvidiaUnstable = config.boot.kernelPackages.callPackage (nixpkgs-unstable + /pkgs/os-specific/linux/nvidia-x11/default.nix) {};
|
|
cudaUnstable = pkgs: cudaVersion: pkgs.callPackages (nixpkgs-unstable + /pkgs/top-level/cuda-packages.nix) { inherit cudaVersion; };
|
|
in {
|
|
options = {
|
|
aviallon.hardware.nvidia.proprietary = {
|
|
gsync = mkEnableOption "Screen is GSYNC monitor";
|
|
vsync = mkOption {
|
|
description = "Wether to enable or disable vsync";
|
|
default = true;
|
|
example = false;
|
|
type = types.bool;
|
|
};
|
|
coolbits = mkOption {
|
|
description = "Coolbits value. Used for enabling hidden (dangerous) features";
|
|
default = if generalCfg.unsafeOptimizations then 28 else 5;
|
|
example = 28;
|
|
type = types.int;
|
|
};
|
|
EGLStream = mkOption {
|
|
description = "Wether to make some packages use EGLStream instead of GBM when using Wayland";
|
|
example = true;
|
|
default = false;
|
|
defaultText = literalExpression ''
|
|
versionOlder config.hardware.nvidia.package.version "490.29.05"; # https://www.nvidia.com/download/driverResults.aspx/181159/en-us/
|
|
'';
|
|
type = types.bool;
|
|
};
|
|
saveAllVram = mkEnableOption "back up all VRAM in /var/tmp before going to sleep. May reduce artifacts after resuming";
|
|
version = mkOption {
|
|
description = "What Nvidia version variant to use";
|
|
type = types.enum [ "production" "stable" "beta" "unstable_beta" ];
|
|
default = if generalCfg.unsafeOptimizations then "beta" else "stable";
|
|
example = "unstable_beta";
|
|
};
|
|
registryDwords = mkOption {
|
|
description = "Registry DWORDS to set for Nvidia driver";
|
|
|
|
# Very useful resource.
|
|
# https://forums.developer.nvidia.com/t/power-mizer-difference-between-powermizerdefault-and-powermizerlevel/46884/3
|
|
example = [ "PerfLevelSrc=0x2222" ];
|
|
default = [ "PowerMizerEnable=0x1" "OverrideMaxPerf=0x1" "PowerMizerDefault=0x3" "PowerMizerDefaultAC=0x3" ];
|
|
type = with types; listOf str;
|
|
};
|
|
};
|
|
};
|
|
|
|
config = mkIf (cfg.enable && cfg.variant == "proprietary") {
|
|
|
|
assertions = [];
|
|
|
|
boot.initrd.kernelModules = [
|
|
"nvidia"
|
|
"nvidia_drm"
|
|
"nvidia_modeset"
|
|
# "nvidia_uvm" # Don't load it early as it causes power-management issues
|
|
];
|
|
|
|
services.xserver.videoDrivers = [
|
|
"nvidia"
|
|
];
|
|
|
|
services.xserver.screenSection = ''
|
|
Option "Coolbits" "${toString cfg.proprietary.coolbits}"
|
|
Option "InbandStereoSignaling" "true"
|
|
'';
|
|
|
|
services.xserver.exportConfiguration = true;
|
|
|
|
services.xserver.displayManager.sddm.wayland.enable = mkIf (!config.aviallon.hardware.intel.enable) (mkDefault false); # Frequent issues with Nvidia GPUs
|
|
|
|
# Fix hybrid sleep with Nvidia GPU
|
|
systemd.services.nvidia-suspend = {
|
|
requiredBy = [ "systemd-hybrid-sleep.service" ];
|
|
before = [ "systemd-hybrid-sleep.service" ];
|
|
};
|
|
hardware.nvidia = {
|
|
powerManagement = mkIf (config.hardware.nvidia.prime.offload.enable || cfg.proprietary.saveAllVram) {
|
|
enable = true;
|
|
finegrained = mkIf config.hardware.nvidia.prime.offload.enable true;
|
|
};
|
|
modesetting.enable = true;
|
|
nvidiaSettings = true;
|
|
package =
|
|
if cfg.proprietary.version == "unstable_beta" then
|
|
nvidiaUnstable.beta # Use bleeding edge version
|
|
else
|
|
config.boot.kernelPackages.nvidiaPackages.${cfg.proprietary.version}
|
|
;
|
|
};
|
|
|
|
aviallon.hardware.nvidia.proprietary.EGLStream = mkDefault (
|
|
versionOlder hardwareCfg.nvidia.package.version "490.29.05" # https://www.nvidia.com/download/driverResults.aspx/181159/en-us/
|
|
);
|
|
|
|
aviallon.programs.nvtop.backend = [ "nvidia" ];
|
|
|
|
boot.extraModprobeConfig = ''
|
|
options nvidia NVreg_RegistryDwords="${concatStringsSep ";" cfg.proprietary.registryDwords}"
|
|
'';
|
|
aviallon.boot.cmdline = {}
|
|
// {
|
|
"nvidia-drm.modeset" = 1;
|
|
"nvidia-drm.fbdev" = 1;
|
|
"nvidia.NVreg_UsePageAttributeTable" = 1;
|
|
"nvidia.NVreg_InitializeSystemMemoryAllocations" = 0;
|
|
}
|
|
// optionalAttrs cfg.proprietary.saveAllVram {
|
|
# "nvidia.NVreg_PreserveVideoMemoryAllocations" = 1; # Already setby hardware.nvidia.powerManagement.enable
|
|
"nvidia.NVreg_DynamicPowerManagement" = "0x02";
|
|
"nvidia.NVreg_EnableS0ixPowerManagement" = 1;
|
|
"nvidia.NVreg_TemporaryFilePath" = "/var/tmp";
|
|
}
|
|
;
|
|
|
|
programs.xwayland.package = mkIf cfg.proprietary.EGLStream xwaylandEGLStream;
|
|
aviallon.programs.allowUnfreeList = [
|
|
"nvidia-x11"
|
|
"nvidia-settings"
|
|
|
|
"cudatoolkit"
|
|
"cuda_cccl"
|
|
"libnpp"
|
|
"libcublas"
|
|
"libcufft"
|
|
"cuda_cudart"
|
|
"cuda_nvcc"
|
|
"cudnn-8.6.0.163"
|
|
"cudnn"
|
|
"cuda_nvml_dev"
|
|
];
|
|
|
|
# Causes massive rebuilds (tensorflow, openCV, etc.), will need to find a better cache beforehand
|
|
# For now, prefer using package overrides
|
|
# aviallon.programs.config.cudaSupport = mkDefault true;
|
|
|
|
hardware.graphics.extraPackages = with pkgs; [
|
|
nvidia-vaapi-driver
|
|
];
|
|
|
|
hardware.graphics.extraPackages32 = with pkgs.pkgsi686Linux; [
|
|
nvidia-vaapi-driver
|
|
];
|
|
|
|
# See documentation here: https://download.nvidia.com/XFree86/Linux-x86_64/510.60.02/README/openglenvvariables.html
|
|
environment.variables = {
|
|
"__GL_YIELD" = "USLEEP"; # use usleep(0) instead of sched_yield() -> better performance in most cases
|
|
"__GL_ALLOW_UNOFFICIAL_PROTOCOL" = "1"; # allow unofficial GLX protocol if also set in Xorg conf
|
|
"__GL_VRR_ALLOWED" = "1"; # Try to enable G-SYNC VRR if screen AND app is compatible
|
|
"__GL_SYNC_TO_VBLANK" = mkIf (!cfg.proprietary.vsync) (toValue cfg.proprietary.vsync);
|
|
|
|
# Causes Kwin to fail
|
|
# https://github.com/ValveSoftware/gamescope/issues/526#issuecomment-1733739097
|
|
# "__GL_THREADED_OPTIMIZATIONS" = toValue generalCfg.unsafeOptimizations;
|
|
"KWIN_DRM_USE_EGL_STREAMS" = toValue cfg.proprietary.EGLStream; # Make KWin use EGL Streams if needed, because otherwise performance will be horrible.
|
|
|
|
|
|
# Undocumented, fix for EGL not being found by Nvidia driver: https://github.com/NVIDIA/egl-wayland/issues/39#issuecomment-927288015
|
|
__EGL_EXTERNAL_PLATFORM_CONFIG_DIRS = "/run/opengl-driver/share/egl/egl_external_platform.d";
|
|
|
|
# Improves Wayland
|
|
"GBM_BACKEND" = "nvidia-drm";
|
|
|
|
# Use direct CUDA backend for Nvidia VAAPI Driver (egl backend is broken)
|
|
"NVD_BACKEND" = "direct";
|
|
};
|
|
|
|
nix.settings.substituters = [ "https://cuda-maintainers.cachix.org" ];
|
|
nix.settings.trusted-public-keys = [ "cuda-maintainers.cachix.org-1:0dq3bujKpuEPMCX6U4WylrUDZ9JyUG0VpVZa7CNfq5E=" ];
|
|
|
|
nixpkgs.overlays = []
|
|
++ optional (cfg.proprietary.version == "unstable_beta") (final: prev: {
|
|
cudaPackages_11 = final.unstable.cudaPackages_11;
|
|
cudaPackages_12 = final.unstable.cudaPackages_12;
|
|
cudaPackages = final.unstable.cudaPackages;
|
|
|
|
})
|
|
;
|
|
};
|
|
}
|