main
1{
2 den.aspects.hardware.gpu.nvidia = {
3 nixos = {
4 lib,
5 config,
6 ...
7 }: let
8 allGPU = config.hardware.facter.report.hardware.graphics_card or [];
9
10 findByDriver = driver: lib.findFirst (d: d.driver or "" == driver) null allGPU;
11
12 nvidiaGPU = findByDriver "nvidia";
13 intelGPU = findByDriver "i915";
14 amdGPU = findByDriver "amdgpu";
15
16 formatBusId = dev: "PCI:${toString dev.slot.bus}:${toString dev.slot.number}:${toString dev.detail.function}";
17
18 hasIntelGPU = intelGPU != null;
19 hasAmdGPU = amdGPU != null;
20
21 enableOffload = hasIntelGPU || hasAmdGPU;
22 in {
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 = lib.mkIf enableOffload ({
35 offload = {
36 enable = true;
37 enableOffloadCmd = true;
38 };
39 nvidiaBusId = formatBusId nvidiaGPU;
40 }
41 // lib.optionalAttrs hasIntelGPU {
42 intelBusId = formatBusId intelGPU;
43 }
44 // lib.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}