main
1{lib, ...}: {
2 den.aspects.core.hardware.graphic.nvidia = {
3 nixos = {config, ...}: let
4 inherit (lib) mkIf findFirst optionalAttrs;
5
6 allGPU = config.hardware.facter.report.hardware.graphics_card or [];
7
8 findByDriver = driver: findFirst (d: d.driver or "" == driver) null allGPU;
9
10 nvidiaGPU = findByDriver "nvidia";
11 intelGPU = findByDriver "i915";
12 amdGPU = findByDriver "amdgpu";
13
14 formatBusId = dev: "PCI:${toString dev.slot.bus}:${toString dev.slot.number}:${toString dev.detail.function}";
15
16 hasNvidiaGPU = nvidiaGPU != null;
17 hasIntelGPU = intelGPU != null;
18 hasAmdGPU = amdGPU != null;
19
20 enableOffload = hasIntelGPU || hasAmdGPU;
21 in
22 mkIf hasNvidiaGPU {
23 hardware.nvidia = {
24 branch = "stable";
25 open = true;
26 nvidiaSettings = true;
27 powerManagement = {
28 enable = true;
29 finegrained = hasIntelGPU || hasAmdGPU;
30 };
31 dynamicBoost.enable = hasIntelGPU || hasAmdGPU;
32 # Prime only take effects on X11
33 # See https://discourse.nixos.org/t/can-we-solve-the-nvidia-situation/73198
34 prime = mkIf enableOffload ({
35 offload = {
36 enable = true;
37 enableOffloadCmd = true;
38 };
39 nvidiaBusId = formatBusId nvidiaGPU;
40 }
41 // optionalAttrs hasIntelGPU {
42 intelBusId = formatBusId intelGPU;
43 }
44 // optionalAttrs hasAmdGPU {
45 amdgpuBusId = formatBusId amdGPU;
46 });
47 };
48
49 services.xserver.videoDrivers = ["nvidia"];
50 boot.initrd.kernelModules = ["nvidia"];
51
52 nixpkgs.config.cudaSupport = lib.mkDefault true;
53 };
54 };
55}