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