dotfiles

My PC Dotfiles & Website

gpu.nix (2586B)


## GPU Configuration ##
_: {
  flake.modules.nixos.gpu = {
    config,
    lib,
    pkgs,
    ...
  }: let
    inherit
      (lib)
      mkForce
      mkIf
      mkEnableOption
      mkMerge
      mkOption
      types
      ;
    cfg = config.hardware.gpu;
    mode = config.hardware.cpu.mode != "powersave";
    gamemode = config.programs.gamemode.enable;
  in {
    options.hardware.gpu = {
      enable = mkEnableOption "Discrete GPU Support";
      model = mkOption {
        description = "Discrete GPU Model";
        type = with types; nullOr (enum ["nvidia"]);
        default = null;
      };
    };

    config = mkMerge [
      (mkIf cfg.enable {
        assertions = [
          {
            assertion = cfg.model != null;
            message = "GPU model must be set when GPU is enabled";
          }
        ];
      })

      (mkIf (cfg.enable && cfg.model == "nvidia") (
        let
          hybrid = with config.hardware.nvidia.prime; (amdgpuBusId != "" || intelBusId != "");
        in {
          services.xserver.videoDrivers = mkForce ["nvidia"];
          environment = {
            systemPackages = [pkgs.btop-cuda];
            variables."__GLX_VENDOR_LIBRARY_NAME" = mkIf mode "nvidia";
            sessionVariables."GAMEMODERUNEXEC" = mkIf (hybrid && gamemode && !mode) "nvidia-offload";
          };

          boot = {
            blacklistedKernelModules = ["nouveau"];
            kernelModules = [
              "nvidia"
              "nvidia_drm"
              "nvidia_modeset"
              "nvidia_uvm"
            ];
            kernelParams = ["nvidia-drm.fbdev=1"];
            extraModprobeConfig = ''
              # PAT Support
              options nvidia NVreg_UsePageAttributeTable=1

              # DDC/CI Support
              options nvidia NVreg_RegistryDwords=RMUseSwI2c=0x01;RMI2cSpeed=100
            '';
          };

          # Wayland Support
          hardware.nvidia = {
            modesetting.enable = mkForce true;
            nvidiaSettings = mkForce true;
            dynamicBoost.enable = true;
            powerManagement.enable = true;
            prime = mkIf hybrid {
              sync.enable = mkForce mode;
              offload = {
                enable = mkForce (!mode);
                enableOffloadCmd = mkForce (!mode);
              };
            };
          };
        }
      ))

      (mkIf (!cfg.enable && cfg.model == "nvidia") {
        boot.blacklistedKernelModules = [
          "nvidia"
          "nvidia_drm"
          "nvidia_modeset"
          "nvidia_uvm"
        ];
      })
    ];
  };
}