nixos/modules/hardware/gpu.nix

102 lines
3.6 KiB
Nix
Raw Normal View History

2024-02-15 23:17:20 +08:00
inputs:
{
options.nixos.hardware.gpu = let inherit (inputs.lib) mkOption types; in
{
type = mkOption
{
type = types.nullOr (types.enum
[
# single gpu
"intel" "nvidia" "amd"
# hibrid gpu: use nvidia prime offload mode
"intel+nvidia" "amd+nvidia"
]);
default = null;
};
nvidia =
2024-03-07 12:54:16 +08:00
{
dynamicBoost = mkOption { type = types.bool; default = false; };
prime =
{
mode = mkOption { type = types.enum [ "offload" "sync" ]; default = "offload"; };
busId = mkOption { type = types.attrsOf types.nonEmptyStr; default = {}; };
};
driver = mkOption { type = types.enum [ "production" "beta" ]; default = "production"; };
2024-03-07 12:54:16 +08:00
};
2024-02-15 23:17:20 +08:00
};
config = let inherit (inputs.config.nixos.hardware) gpu; in inputs.lib.mkIf (gpu.type != null) (inputs.lib.mkMerge
[
2024-02-15 23:26:29 +08:00
# generic settings
2024-02-15 23:17:20 +08:00
(
let gpus = inputs.lib.strings.splitString "+" gpu.type; in
{
boot.initrd.availableKernelModules =
let modules =
{
intel = [ "i915" ];
2024-02-16 15:01:24 +08:00
nvidia = [ "nvidia" "nvidia_drm" "nvidia_modeset" ]; # nvidia-uvm should not be loaded
2024-07-05 18:57:16 +08:00
amd = [];
2024-02-15 23:17:20 +08:00
};
in builtins.concatLists (builtins.map (gpu: modules.${gpu}) gpus);
hardware =
{
2024-06-24 10:48:36 +08:00
graphics =
2024-02-15 23:17:20 +08:00
{
enable = true;
extraPackages =
2024-02-15 23:26:29 +08:00
let packages = with inputs.pkgs;
2024-02-15 23:17:20 +08:00
{
2024-02-15 23:26:29 +08:00
intel = [ intel-vaapi-driver libvdpau-va-gl intel-media-driver ];
2024-02-15 23:17:20 +08:00
nvidia = [ vaapiVdpau ];
2024-07-05 18:57:16 +08:00
amd = [];
2024-02-15 23:17:20 +08:00
};
in builtins.concatLists (builtins.map (gpu: packages.${gpu}) gpus);
};
nvidia = inputs.lib.mkIf (builtins.elem "nvidia" gpus)
{
modesetting.enable = true;
powerManagement.enable = true;
dynamicBoost.enable = inputs.lib.mkIf gpu.nvidia.dynamicBoost true;
2024-02-15 23:17:20 +08:00
nvidiaSettings = true;
forceFullCompositionPipeline = true;
package =
let actualDriver = { production = "legacy_535"; }.${gpu.nvidia.driver} or gpu.nvidia.driver;
in inputs.config.boot.kernelPackages.nvidiaPackages.${actualDriver};
2024-02-26 19:55:26 +08:00
prime.allowExternalGpu = true;
2024-02-15 23:17:20 +08:00
};
};
2024-07-05 18:57:16 +08:00
boot.blacklistedKernelModules = [ "nouveau" ];
2024-02-15 23:26:29 +08:00
environment.variables.VDPAU_DRIVER = inputs.lib.mkIf (builtins.elem "intel" gpus) "va_gl";
services.xserver.videoDrivers =
let driver = { intel = "modesetting"; amd = "amdgpu"; nvidia = "nvidia"; };
in builtins.map (gpu: driver.${gpu}) gpus;
2024-02-15 23:17:20 +08:00
}
)
# nvidia prime offload
(
inputs.lib.mkIf (inputs.lib.strings.hasSuffix "+nvidia" gpu.type) { hardware.nvidia =
{
2024-03-07 12:54:16 +08:00
prime =
{
offload = inputs.lib.mkIf (gpu.nvidia.prime.mode == "offload") { enable = true; enableOffloadCmd = true; };
sync = inputs.lib.mkIf (gpu.nvidia.prime.mode == "sync") { enable = true; };
2024-03-07 12:54:16 +08:00
}
// builtins.listToAttrs (builtins.map
(gpu: { name = "${if gpu.name == "amd" then "amdgpu" else gpu.name}BusId"; value = "PCI:${gpu.value}"; })
(inputs.localLib.attrsToList gpu.nvidia.prime.busId));
powerManagement.finegrained = inputs.lib.mkIf (gpu.nvidia.prime.mode == "offload") true;
2024-02-15 23:17:20 +08:00
};}
)
2024-07-05 18:57:16 +08:00
# amdgpu
(
inputs.lib.mkIf (inputs.lib.strings.hasPrefix "amd" gpu.type) { hardware.amdgpu =
{
opencl.enable = true;
legacySupport.enable = true;
initrd.enable = true;
amdvlk = { enable = true; support32Bit.enable = true; supportExperimental.enable = true; };
};}
)
2024-02-15 23:17:20 +08:00
]);
}