2009-11-15 12:48:42 +00:00
|
|
|
{ config, pkgs, ... }:
|
|
|
|
|
|
|
|
with pkgs.lib;
|
|
|
|
|
|
|
|
let
|
|
|
|
|
|
|
|
cfg = config.powerManagement;
|
|
|
|
|
|
|
|
in
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
###### interface
|
|
|
|
|
|
|
|
options = {
|
2011-09-14 18:20:50 +00:00
|
|
|
|
2009-11-15 12:48:42 +00:00
|
|
|
powerManagement = {
|
|
|
|
|
|
|
|
enable = mkOption {
|
|
|
|
default = false;
|
|
|
|
description =
|
|
|
|
''
|
|
|
|
Whether to enable power management. This includes support
|
|
|
|
for suspend-to-RAM and powersave features on laptops.
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
|
|
|
resumeCommands = mkOption {
|
|
|
|
default = "";
|
|
|
|
description = "Commands executed after the system resumes from suspend-to-RAM.";
|
|
|
|
};
|
2011-09-14 18:20:50 +00:00
|
|
|
|
2009-11-15 12:56:40 +00:00
|
|
|
powerUpCommands = mkOption {
|
|
|
|
default = "";
|
|
|
|
example = "${pkgs.hdparm}/sbin/hdparm -B 255 /dev/sda";
|
|
|
|
description =
|
|
|
|
''
|
|
|
|
Commands executed when the machine powers up. That is,
|
|
|
|
they're executed both when the system first boots and when
|
|
|
|
it resumes from suspend or hibernation.
|
|
|
|
'';
|
|
|
|
};
|
2010-12-02 20:23:45 +00:00
|
|
|
|
|
|
|
powerDownCommands = mkOption {
|
|
|
|
default = "";
|
|
|
|
example = "${pkgs.hdparm}/sbin/hdparm -B 255 /dev/sda";
|
|
|
|
description =
|
|
|
|
''
|
|
|
|
Commands executed when the machine powers down. That is,
|
|
|
|
they're executed both when the system shuts down and when
|
|
|
|
it goes to suspend or hibernation.
|
|
|
|
'';
|
|
|
|
};
|
2011-09-14 18:20:50 +00:00
|
|
|
|
2009-11-15 12:48:42 +00:00
|
|
|
};
|
2011-09-14 18:20:50 +00:00
|
|
|
|
2009-11-15 12:48:42 +00:00
|
|
|
};
|
2011-09-14 18:20:50 +00:00
|
|
|
|
2009-11-15 12:48:42 +00:00
|
|
|
|
|
|
|
###### implementation
|
|
|
|
|
|
|
|
config = mkIf cfg.enable {
|
|
|
|
|
|
|
|
# Enable the ACPI daemon. Not sure whether this is essential.
|
|
|
|
services.acpid.enable = true;
|
|
|
|
|
2011-09-14 18:20:50 +00:00
|
|
|
boot.kernelModules =
|
|
|
|
[ "acpi_cpufreq" "cpufreq_performance" "cpufreq_powersave" "cpufreq_ondemand"
|
2012-03-17 17:26:17 +00:00
|
|
|
"cpufreq_conservative"
|
2010-08-10 01:00:09 +00:00
|
|
|
];
|
2011-09-14 18:20:50 +00:00
|
|
|
|
2012-01-13 13:26:52 +00:00
|
|
|
powerManagement.cpuFreqGovernor = mkDefault "ondemand";
|
|
|
|
powerManagement.scsiLinkPolicy = mkDefault "min_power";
|
2012-10-04 21:57:10 +00:00
|
|
|
|
|
|
|
# Service executed before suspending/hibernating.
|
|
|
|
boot.systemd.services."pre-sleep" =
|
|
|
|
{ description = "Pre-Sleep Actions";
|
|
|
|
wantedBy = [ "sleep.target" ];
|
|
|
|
before = [ "sleep.target" ];
|
|
|
|
script =
|
|
|
|
''
|
|
|
|
${cfg.powerDownCommands}
|
|
|
|
'';
|
|
|
|
serviceConfig.Type = "oneshot";
|
|
|
|
};
|
|
|
|
|
|
|
|
# Service executed before suspending/hibernating. There doesn't
|
|
|
|
# seem to be a good way to hook in a service to be executed after
|
|
|
|
# both suspend *and* hibernate, so have a separate one for each.
|
|
|
|
boot.systemd.services."post-suspend" =
|
|
|
|
{ description = "Post-Suspend Actions";
|
|
|
|
wantedBy = [ "suspend.target" ];
|
|
|
|
after = [ "systemd-suspend.service" ];
|
|
|
|
script =
|
|
|
|
''
|
|
|
|
${cfg.resumeCommands}
|
|
|
|
${cfg.powerUpCommands}
|
|
|
|
'';
|
|
|
|
serviceConfig.Type = "oneshot";
|
|
|
|
};
|
|
|
|
|
|
|
|
boot.systemd.services."post-hibernate" =
|
|
|
|
{ description = "Post-Hibernate Actions";
|
|
|
|
wantedBy = [ "hibernate.target" ];
|
|
|
|
after = [ "systemd-hibernate.service" ];
|
|
|
|
script =
|
|
|
|
''
|
|
|
|
${cfg.resumeCommands}
|
|
|
|
${cfg.powerUpCommands}
|
|
|
|
'';
|
|
|
|
serviceConfig.Type = "oneshot";
|
|
|
|
};
|
|
|
|
|
2009-11-15 12:48:42 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
}
|