1{
2 config,
3 lib,
4 options,
5 pkgs,
6 ...
7}:
8
9let
10 inherit (lib)
11 literalExpression
12 mkOption
13 mkEnableOption
14 types
15 mkIf
16 mkMerge
17 optional
18 versionOlder
19 ;
20 cfg = config.hardware.system76;
21 opt = options.hardware.system76;
22
23 kpkgs = config.boot.kernelPackages;
24 modules = [
25 "system76"
26 "system76-io"
27 ]
28 ++ (optional (versionOlder kpkgs.kernel.version "5.5") "system76-acpi");
29 modulePackages = map (m: kpkgs.${m}) modules;
30 moduleConfig = mkIf cfg.kernel-modules.enable {
31 boot.extraModulePackages = modulePackages;
32
33 boot.kernelModules = modules;
34
35 services.udev.packages = modulePackages;
36 };
37
38 firmware-pkg = pkgs.system76-firmware;
39 firmwareConfig = mkIf cfg.firmware-daemon.enable {
40 # Make system76-firmware-cli usable by root from the command line.
41 environment.systemPackages = [ firmware-pkg ];
42
43 services.dbus.packages = [ firmware-pkg ];
44
45 systemd.services.system76-firmware-daemon = {
46 description = "The System76 Firmware Daemon";
47
48 serviceConfig = {
49 ExecStart = "${firmware-pkg}/bin/system76-firmware-daemon";
50
51 Restart = "on-failure";
52 };
53
54 wantedBy = [ "multi-user.target" ];
55 };
56 };
57
58 power-pkg = pkgs.system76-power;
59 powerConfig = mkIf cfg.power-daemon.enable {
60 # Make system76-power usable by root from the command line.
61 environment.systemPackages = [ power-pkg ];
62
63 services.dbus.packages = [ power-pkg ];
64
65 systemd.services.system76-power = {
66 description = "System76 Power Daemon";
67 serviceConfig = {
68 ExecStart = "${power-pkg}/bin/system76-power daemon";
69 Restart = "on-failure";
70 Type = "dbus";
71 BusName = "com.system76.PowerDaemon";
72 };
73 wantedBy = [ "multi-user.target" ];
74 };
75 };
76in
77{
78 options = {
79 hardware.system76 = {
80 enableAll = mkEnableOption "all recommended configuration for system76 systems";
81
82 firmware-daemon.enable = mkOption {
83 default = cfg.enableAll;
84 defaultText = literalExpression "config.${opt.enableAll}";
85 example = true;
86 description = "Whether to enable the system76 firmware daemon";
87 type = types.bool;
88 };
89
90 kernel-modules.enable = mkOption {
91 default = cfg.enableAll;
92 defaultText = literalExpression "config.${opt.enableAll}";
93 example = true;
94 description = "Whether to make the system76 out-of-tree kernel modules available";
95 type = types.bool;
96 };
97
98 power-daemon.enable = mkOption {
99 default = cfg.enableAll;
100 defaultText = literalExpression "config.${opt.enableAll}";
101 example = true;
102 description = "Whether to enable the system76 power daemon";
103 type = types.bool;
104 };
105 };
106 };
107
108 config = mkMerge [
109 moduleConfig
110 firmwareConfig
111 powerConfig
112 ];
113}