summary refs log tree commit diff
diff options
context:
space:
mode:
author(cdep)illabout <cdep.illabout@gmail.com>2018-12-29 22:09:47 +0900
committer(cdep)illabout <cdep.illabout@gmail.com>2019-01-01 19:18:12 +0900
commitb0f10d2d531ebac8130c8f111570311ac758da8e (patch)
tree8f3d2d9d826d761f389ffd7219e43dfb68eba5a5
parentc31c0558ddad7161a4025117694197264cda9750 (diff)
downloadnixpkgs-b0f10d2d531ebac8130c8f111570311ac758da8e.tar
nixpkgs-b0f10d2d531ebac8130c8f111570311ac758da8e.tar.gz
nixpkgs-b0f10d2d531ebac8130c8f111570311ac758da8e.tar.bz2
nixpkgs-b0f10d2d531ebac8130c8f111570311ac758da8e.tar.lz
nixpkgs-b0f10d2d531ebac8130c8f111570311ac758da8e.tar.xz
nixpkgs-b0f10d2d531ebac8130c8f111570311ac758da8e.tar.zst
nixpkgs-b0f10d2d531ebac8130c8f111570311ac758da8e.zip
cpufreq: add option for setting the cpu max and min frequencies
This adds a NixOS option for setting the CPU max and min frequencies
with `cpufreq`.  The two options that have been added are:

- `powerManagement.cpufreq.max`
- `powerManagement.cpufreq.min`

It also adds an alias to the `powerManagement.cpuFreqGovernor` option as
`powerManagement.cpufreq.governor`.  This updates the installer to use
the new option name.  It also updates the manual with a note about
the new name.
-rw-r--r--nixos/doc/manual/release-notes/rl-1903.xml10
-rw-r--r--nixos/modules/installer/tools/nixos-generate-config.pl2
-rw-r--r--nixos/modules/rename.nix3
-rw-r--r--nixos/modules/services/hardware/tlp.nix4
-rw-r--r--nixos/modules/tasks/cpu-freq.nix71
5 files changed, 69 insertions, 21 deletions
diff --git a/nixos/doc/manual/release-notes/rl-1903.xml b/nixos/doc/manual/release-notes/rl-1903.xml
index 89d9f48aedd..65761c12c6a 100644
--- a/nixos/doc/manual/release-notes/rl-1903.xml
+++ b/nixos/doc/manual/release-notes/rl-1903.xml
@@ -408,6 +408,16 @@
        from nixpkgs due to the lack of maintainers.
      </para>
    </listitem>
+   <listitem>
+    <para>
+       The <option>powerManagement.cpuFreqGovernor</option> option has been
+       aliased to <option>powerManagement.cpufreq.governor</option>.  On laptops,
+       <option>powerManagement.cpuFreqGovernor</option> is sometimes set in
+       <literal>/etc/nixos/hardware-configuration.nix</literal>, so you can
+       rename it to the new name, or run
+       <literal>nixos-generate-config</literal> again.
+    </para>
+   </listitem>
   </itemizedlist>
  </section>
 </section>
diff --git a/nixos/modules/installer/tools/nixos-generate-config.pl b/nixos/modules/installer/tools/nixos-generate-config.pl
index 52a129b39bc..fa01dc7bbaf 100644
--- a/nixos/modules/installer/tools/nixos-generate-config.pl
+++ b/nixos/modules/installer/tools/nixos-generate-config.pl
@@ -104,7 +104,7 @@ if (-e "/sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors") {
 
     foreach $e (@desired_governors) {
         if (index($governors, $e) != -1) {
-            last if (push @attrs, "powerManagement.cpuFreqGovernor = lib.mkDefault \"$e\";");
+            last if (push @attrs, "powerManagement.cpufreq.governor = lib.mkDefault \"$e\";");
         }
     }
 }
diff --git a/nixos/modules/rename.nix b/nixos/modules/rename.nix
index dc0a175d5bb..0ed0f4ac209 100644
--- a/nixos/modules/rename.nix
+++ b/nixos/modules/rename.nix
@@ -286,6 +286,9 @@ with lib;
     (mkRenamedOptionModule [ "hardware" "ckb" "enable" ] [ "hardware" "ckb-next" "enable" ])
     (mkRenamedOptionModule [ "hardware" "ckb" "package" ] [ "hardware" "ckb-next" "package" ])
 
+    # cpufeq
+    (mkAliasOptionModule [ "powerManagement" "cpuFreqGovernor" ] [ "powerManagement" "cpufreq" "governor" ])
+
   ] ++ (flip map [ "blackboxExporter" "collectdExporter" "fritzboxExporter"
                    "jsonExporter" "minioExporter" "nginxExporter" "nodeExporter"
                    "snmpExporter" "unifiExporter" "varnishExporter" ]
diff --git a/nixos/modules/services/hardware/tlp.nix b/nixos/modules/services/hardware/tlp.nix
index 68425822a88..bbc5b5b80a0 100644
--- a/nixos/modules/services/hardware/tlp.nix
+++ b/nixos/modules/services/hardware/tlp.nix
@@ -55,7 +55,9 @@ in
   config = mkIf cfg.enable {
 
     powerManagement.scsiLinkPolicy = null;
-    powerManagement.cpuFreqGovernor = null;
+    powerManagement.cpufreq.governor = null;
+    powerManagement.cpufreq.max = null;
+    powerManagement.cpufreq.min = null;
 
     systemd.sockets."systemd-rfkill".enable = false;
 
diff --git a/nixos/modules/tasks/cpu-freq.nix b/nixos/modules/tasks/cpu-freq.nix
index 5f8b5df52ac..684c43a1e90 100644
--- a/nixos/modules/tasks/cpu-freq.nix
+++ b/nixos/modules/tasks/cpu-freq.nix
@@ -4,22 +4,43 @@ with lib;
 
 let
   cpupower = config.boot.kernelPackages.cpupower;
-  cfg = config.powerManagement;
+  cfg = config.powerManagement.cpufreq;
 in
 
 {
   ###### interface
 
-  options = {
+  options.powerManagement.cpufreq = {
 
-    powerManagement.cpuFreqGovernor = mkOption {
+    governor = mkOption {
       type = types.nullOr types.str;
       default = null;
       example = "ondemand";
       description = ''
         Configure the governor used to regulate the frequence of the
         available CPUs. By default, the kernel configures the
-        performance governor.
+        performance governor, although this may be overwriten in your
+        hardware-configuration.nix file.
+
+        Often used values: "ondemand", "powersave", "performance"
+      '';
+    };
+
+    max = mkOption {
+      type = types.nullOr types.ints.unsigned;
+      default = null;
+      example = 2200000;
+      description = ''
+        The maximum frequency the CPU will use.  Defaults to the maximum possible.
+      '';
+    };
+
+    min = mkOption {
+      type = types.nullOr types.ints.unsigned;
+      default = null;
+      example = 800000;
+      description = ''
+        The minimum frequency the CPU will use.
       '';
     };
 
@@ -28,25 +49,37 @@ in
 
   ###### implementation
 
-  config = mkIf (!config.boot.isContainer && config.powerManagement.cpuFreqGovernor != null) {
+  config =
+    let
+      governorEnable = cfg.governor != null;
+      maxEnable = cfg.max != null;
+      minEnable = cfg.min != null;
+      enable =
+        !config.boot.isContainer &&
+        (governorEnable || maxEnable || minEnable);
+    in
+    mkIf enable {
 
-    boot.kernelModules = [ "cpufreq_${cfg.cpuFreqGovernor}" ];
+      boot.kernelModules = optional governorEnable "cpufreq_${cfg.governor}";
 
-    environment.systemPackages = [ cpupower ];
+      environment.systemPackages = [ cpupower ];
 
-    systemd.services.cpufreq = {
-      description = "CPU Frequency Governor Setup";
-      after = [ "systemd-modules-load.service" ];
-      wantedBy = [ "multi-user.target" ];
-      path = [ cpupower pkgs.kmod ];
-      unitConfig.ConditionVirtualization = false;
-      serviceConfig = {
-        Type = "oneshot";
-        RemainAfterExit = "yes";
-        ExecStart = "${cpupower}/bin/cpupower frequency-set -g ${cfg.cpuFreqGovernor}";
-        SuccessExitStatus = "0 237";
+      systemd.services.cpufreq = {
+        description = "CPU Frequency Setup";
+        after = [ "systemd-modules-load.service" ];
+        wantedBy = [ "multi-user.target" ];
+        path = [ cpupower pkgs.kmod ];
+        unitConfig.ConditionVirtualization = false;
+        serviceConfig = {
+          Type = "oneshot";
+          RemainAfterExit = "yes";
+          ExecStart = "${cpupower}/bin/cpupower frequency-set " +
+            optionalString governorEnable "--governor ${cfg.governor} " +
+            optionalString maxEnable "--max ${toString cfg.max} " +
+            optionalString minEnable "--min ${toString cfg.min} ";
+          SuccessExitStatus = "0 237";
+        };
       };
-    };
 
   };
 }