mirror of
https://github.com/NixOS/nixpkgs.git
synced 2024-11-01 15:11:25 +00:00
8ed3a90cdf
`nixos-generate-config` detects the `cpuFreqGovernor` suited best for my
machine, e.g. `powerManagement.cpuFreqGovernor = lib.mkDefault "powersave";`.
However the `powerManagement` module sets a sensitive default for
`cpuFreqGovernor` using `mkDefault` to avoid breackage with older
setups. Since 140ac2f1
the `hardware-configuration.nix` sets the
gorvernor with `mkDefault` as well which causes evaluation errors if the
powermanagement module is enabled:
```
error: The unique option `powerManagement.cpuFreqGovernor' is defined multiple times, in `/home/ma27/Projects/nixos-config/hardware-configuration.nix' and `/nix/var/nix/profiles/per-user/root/channels/nixos/nixpkgs/nixos/modules/config/power-management.nix'.
```
Using `mkOptionDefault` rather than `mkDefault` in the powermanagement
module fixes this issue as it decreases the priority of the module and
prefers the value set in `hardware-configuration.nix`.
I have confirmed the change using the following VM declaration:
```
{
cpuFreq = { lib, ... }: {
powerManagement.cpuFreqGovernor = lib.mkDefault "powersave";
powerManagement.enable = true;
};
}
```
110 lines
2.6 KiB
Nix
110 lines
2.6 KiB
Nix
{ config, lib, pkgs, ... }:
|
|
|
|
with lib;
|
|
|
|
let
|
|
|
|
cfg = config.powerManagement;
|
|
|
|
in
|
|
|
|
{
|
|
|
|
###### interface
|
|
|
|
options = {
|
|
|
|
powerManagement = {
|
|
|
|
enable = mkOption {
|
|
type = types.bool;
|
|
default = true;
|
|
description =
|
|
''
|
|
Whether to enable power management. This includes support
|
|
for suspend-to-RAM and powersave features on laptops.
|
|
'';
|
|
};
|
|
|
|
resumeCommands = mkOption {
|
|
type = types.lines;
|
|
default = "";
|
|
description = "Commands executed after the system resumes from suspend-to-RAM.";
|
|
};
|
|
|
|
powerUpCommands = mkOption {
|
|
type = types.lines;
|
|
default = "";
|
|
example = literalExample ''
|
|
"''${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.
|
|
'';
|
|
};
|
|
|
|
powerDownCommands = mkOption {
|
|
type = types.lines;
|
|
default = "";
|
|
example = literalExample ''
|
|
"''${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.
|
|
'';
|
|
};
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
###### implementation
|
|
|
|
config = mkIf cfg.enable {
|
|
|
|
# Leftover for old setups, should be set by nixos-generate-config now
|
|
powerManagement.cpuFreqGovernor = mkOptionDefault "ondemand";
|
|
|
|
systemd.targets.post-resume = {
|
|
description = "Post-Resume Actions";
|
|
requires = [ "post-resume.service" ];
|
|
after = [ "post-resume.service" ];
|
|
wantedBy = [ "sleep.target" ];
|
|
unitConfig.StopWhenUnneeded = true;
|
|
};
|
|
|
|
# Service executed before suspending/hibernating.
|
|
systemd.services."pre-sleep" =
|
|
{ description = "Pre-Sleep Actions";
|
|
wantedBy = [ "sleep.target" ];
|
|
before = [ "sleep.target" ];
|
|
script =
|
|
''
|
|
${cfg.powerDownCommands}
|
|
'';
|
|
serviceConfig.Type = "oneshot";
|
|
};
|
|
|
|
systemd.services."post-resume" =
|
|
{ description = "Post-Resume Actions";
|
|
after = [ "suspend.target" "hibernate.target" "hybrid-sleep.target" ];
|
|
script =
|
|
''
|
|
${config.systemd.package}/bin/systemctl try-restart post-resume.target
|
|
${cfg.resumeCommands}
|
|
${cfg.powerUpCommands}
|
|
'';
|
|
serviceConfig.Type = "oneshot";
|
|
};
|
|
|
|
};
|
|
|
|
}
|