Unverified Commit b72dc8eb authored by Nick Cao's avatar Nick Cao Committed by GitHub
Browse files

Merge pull request #313440 from Kiskae/nvidia/555.42.02

linuxPackages.nvidiaPackages.beta: 550.40.07 -> 555.42.02
parents 1c91e55a fbdcdde0
Loading
Loading
Loading
Loading
+437 −434
Original line number Diff line number Diff line
@@ -3,12 +3,10 @@
  lib,
  pkgs,
  ...
}: let
}:
let
  nvidiaEnabled = (lib.elem "nvidia" config.services.xserver.videoDrivers);
  nvidia_x11 =
    if nvidiaEnabled || cfg.datacenter.enable
    then cfg.package
    else null;
  nvidia_x11 = if nvidiaEnabled || cfg.datacenter.enable then cfg.package else null;

  cfg = config.hardware.nvidia;

@@ -20,7 +18,8 @@
  busIDType = lib.types.strMatching "([[:print:]]+[\:\@][0-9]{1,3}\:[0-9]{1,2}\:[0-9])?";
  ibtSupport = cfg.open || (nvidia_x11.ibtSupport or false);
  settingsFormat = pkgs.formats.keyValue { };
in {
in
{
  options = {
    hardware.nvidia = {
      datacenter.enable = lib.mkEnableOption ''
@@ -211,7 +210,9 @@ in {
        (lib.mkEnableOption ''
          nvidia-settings, NVIDIA's GUI configuration tool
        '')
        // {default = true;};
        // {
          default = true;
        };

      nvidiaPersistenced = lib.mkEnableOption ''
        nvidia-persistenced a update for NVIDIA GPU headless mode, i.e.
@@ -226,7 +227,8 @@ in {
      '';

      package = lib.mkOption {
        default = config.boot.kernelPackages.nvidiaPackages."${if cfg.datacenter.enable then "dc" else "stable"}";
        default =
          config.boot.kernelPackages.nvidiaPackages."${if cfg.datacenter.enable then "dc" else "stable"}";
        defaultText = lib.literalExpression ''
          config.boot.kernelPackages.nvidiaPackages."\$\{if cfg.datacenter.enable then "dc" else "stable"}"
        '';
@@ -242,17 +244,13 @@ in {
    };
  };

  config = let
    igpuDriver =
      if pCfg.intelBusId != ""
      then "modesetting"
      else "amdgpu";
    igpuBusId =
      if pCfg.intelBusId != ""
      then pCfg.intelBusId
      else pCfg.amdgpuBusId;
  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 [
    lib.mkIf (nvidia_x11 != null) (
      lib.mkMerge [
        # Common
        ({
          assertions = [
@@ -262,7 +260,10 @@ in {
            }
          ];
          boot = {
          blacklistedKernelModules = ["nouveau" "nvidiafb"];
            blacklistedKernelModules = [
              "nouveau"
              "nvidiafb"
            ];

            # Don't add `nvidia-uvm` to `kernelModules`, because we want
            # `nvidia-uvm` be loaded only after `udev` rules for `nvidia` kernel
@@ -274,11 +275,8 @@ in {
              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 =
        ''
          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'"
@@ -287,16 +285,10 @@ in {
            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
          ];
            extraPackages = [ nvidia_x11.out ];
            extraPackages32 = [ nvidia_x11.lib32 ];
          };
        environment.systemPackages = [
          nvidia_x11.bin
        ];
          environment.systemPackages = [ nvidia_x11.bin ];
        })
        # X11
        (lib.mkIf nvidiaEnabled {
@@ -312,7 +304,8 @@ in {
            }

            {
          assertion = primeEnabled -> pCfg.nvidiaBusId != "" && (pCfg.intelBusId != "" || pCfg.amdgpuBusId != "");
              assertion =
                primeEnabled -> pCfg.nvidiaBusId != "" && (pCfg.intelBusId != "" || pCfg.amdgpuBusId != "");
              message = "When NVIDIA PRIME is enabled, the GPU bus IDs must be configured.";
            }

@@ -322,7 +315,8 @@ in {
            }

            {
          assertion = (reverseSyncCfg.enable && pCfg.amdgpuBusId != "") -> lib.versionAtLeast nvidia_x11.version "470.0";
              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.";
            }

@@ -359,7 +353,8 @@ in {
            {
              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
@@ -398,9 +393,8 @@ in {
              deviceSection =
                ''
                  Option "SidebandSocketPath" "/run/nvidia-xdriver/"
              '' +
              lib.optionalString primeEnabled
                ''
                + lib.optionalString primeEnabled ''
                  BusID "${pCfg.nvidiaBusId}"
                ''
                + lib.optionalString pCfg.allowExternalGpu ''
@@ -431,17 +425,16 @@ in {
              Option "AllowNVIDIAGPUScreens"
            '';

        services.xserver.displayManager.setupCommands = let
          services.xserver.displayManager.setupCommands =
            let
              gpuProviderName =
            if igpuDriver == "amdgpu"
            then
                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;
                else
                  igpuDriver;
              providerCmdParams =
            if syncCfg.enable
            then "\"${gpuProviderName}\" NVIDIA-0"
            else "NVIDIA-G0 \"${gpuProviderName}\"";
                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.
@@ -450,35 +443,35 @@ in {
            '';

          environment.etc = {
          "nvidia/nvidia-application-profiles-rc" = lib.mkIf nvidia_x11.useProfiles {source = "${nvidia_x11.bin}/share/nvidia/nvidia-application-profiles-rc";};
            "nvidia/nvidia-application-profiles-rc" = lib.mkIf nvidia_x11.useProfiles {
              source = "${nvidia_x11.bin}/share/nvidia/nvidia-application-profiles-rc";
            };

            # '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/";
          };

          hardware.opengl = {
          extraPackages = [
            pkgs.nvidia-vaapi-driver
          ];
          extraPackages32 = [
            pkgs.pkgsi686Linux.nvidia-vaapi-driver
          ];
            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" ''
            ++ 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
          systemd.services =
            let
              nvidiaService = state: {
                description = "NVIDIA system ${state} actions";
                path = [ pkgs.kbd ];
@@ -494,12 +487,16 @@ in {
              (lib.mkIf cfg.powerManagement.enable {
                nvidia-suspend = nvidiaService "suspend";
                nvidia-hibernate = nvidiaService "hibernate";
              nvidia-resume =
                (nvidiaService "resume")
                // {
                nvidia-resume = (nvidiaService "resume") // {
                  before = [ ];
                  after = ["systemd-suspend.service" "systemd-hibernate.service"];
                  requiredBy = ["systemd-suspend.service" "systemd-hibernate.service"];
                  after = [
                    "systemd-suspend.service"
                    "systemd-hibernate.service"
                  ];
                  requiredBy = [
                    "systemd-suspend.service"
                    "systemd-hibernate.service"
                  ];
                };
              })
              (lib.mkIf cfg.nvidiaPersistenced {
@@ -534,26 +531,33 @@ in {

          services.dbus.packages = lib.optional cfg.dynamicBoost.enable nvidia_x11.bin;

        hardware.firmware = lib.optional cfg.open nvidia_x11.firmware;
          hardware.firmware =
            let
              isOpen = cfg.open;
              isNewUnfree = lib.versionAtLeast nvidia_x11.version "555";
            in
            lib.optional (isOpen || isNewUnfree) nvidia_x11.firmware;

        systemd.tmpfiles.rules = [
          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)
            ]
            ++ 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];
            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"];
            kernelModules = lib.optionals config.services.xserver.enable [
              "nvidia"
              "nvidia_modeset"
              "nvidia_drm"
            ];

            # If requested enable modesetting via kernel parameter.
            kernelParams =
@@ -567,8 +571,7 @@ in {
              options nvidia "NVreg_DynamicPowerManagement=0x02"
            '';
          };
        services.udev.extraRules =
          lib.optionalString cfg.powerManagement.finegrained (
          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"
@@ -592,9 +595,7 @@ in {
        })
        # Data Center
        (lib.mkIf (cfg.datacenter.enable) {
        boot.extraModulePackages = [
          nvidia_x11.bin
        ];
          boot.extraModulePackages = [ nvidia_x11.bin ];

          systemd = {
            tmpfiles.rules =
@@ -612,7 +613,8 @@ in {
                  serviceConfig = {
                    Type = "forking";
                    TimeoutStartSec = 240;
                  ExecStart = let
                    ExecStart =
                      let
                        nv-fab-conf = settingsFormat.generate "fabricmanager.conf" cfg.datacenter.settings;
                      in
                      "${lib.getExe nvidia_x11.fabricmanager} -c ${nv-fab-conf}";
@@ -640,5 +642,6 @@ in {
            lib.optional cfg.datacenter.enable nvidia_x11.fabricmanager
            ++ lib.optional cfg.nvidiaPersistenced nvidia_x11.persistenced;
        })
  ]);
      ]
    );
}
+6 −8
Original line number Diff line number Diff line
@@ -51,14 +51,12 @@ rec {
  });

  beta = selectHighestVersion latest (generic {
    version = "550.40.07";
    sha256_64bit = "sha256-KYk2xye37v7ZW7h+uNJM/u8fNf7KyGTZjiaU03dJpK0=";
    sha256_aarch64 = "sha256-AV7KgRXYaQGBFl7zuRcfnTGr8rS5n13nGUIe3mJTXb4=";
    openSha256 = "sha256-mRUTEWVsbjq+psVe+kAT6MjyZuLkG2yRDxCMvDJRL1I=";
    settingsSha256 = "sha256-c30AQa4g4a1EHmaEu1yc05oqY01y+IusbBuq+P6rMCs=";
    persistencedSha256 = "sha256-11tLSY8uUIl4X/roNnxf5yS2PQvHvoNjnd2CB67e870=";

    patches = [ rcu_patch ];
    version = "555.42.02";
    sha256_64bit = "sha256-k7cI3ZDlKp4mT46jMkLaIrc2YUx1lh1wj/J4SVSHWyk=";
    sha256_aarch64 = "sha256-ekx0s0LRxxTBoqOzpcBhEKIj/JnuRCSSHjtwng9qAc0=";
    openSha256 = "sha256-3/eI1VsBzuZ3Y6RZmt3Q5HrzI2saPTqUNs6zPh5zy6w=";
    settingsSha256 = "sha256-rtDxQjClJ+gyrCLvdZlT56YyHQ4sbaL+d5tL4L4VfkA=";
    persistencedSha256 = "sha256-3ae31/egyMKpqtGEqgtikWcwMwfcqMv2K4MVFa70Bqs=";
  });

  # Vulkan developer beta driver