nixpkgs/nixos/modules/services/hardware/thinkfan.nix
2017-12-24 12:54:43 +00:00

106 lines
2.9 KiB
Nix

{ config, lib, pkgs, ... }:
with lib;
let
cfg = config.services.thinkfan;
configFile = pkgs.writeText "thinkfan.conf" ''
# ATTENTION: There is only very basic sanity checking on the configuration.
# That means you can set your temperature limits as insane as you like. You
# can do anything stupid, e.g. turn off your fan when your CPU reaches 70°C.
#
# That's why this program is called THINKfan: You gotta think for yourself.
#
######################################################################
#
# IBM/Lenovo Thinkpads (thinkpad_acpi, /proc/acpi/ibm)
# ====================================================
#
# IMPORTANT:
#
# To keep your HD from overheating, you have to specify a correction value for
# the sensor that has the HD's temperature. You need to do this because
# thinkfan uses only the highest temperature it can find in the system, and
# that'll most likely never be your HD, as most HDs are already out of spec
# when they reach 55 °C.
# Correction values are applied from left to right in the same order as the
# temperatures are read from the file.
#
# For example:
# sensor /proc/acpi/ibm/thermal (0, 0, 10)
# will add a fixed value of 10 °C the 3rd value read from that file. Check out
# http://www.thinkwiki.org/wiki/Thermal_Sensors to find out how much you may
# want to add to certain temperatures.
# Syntax:
# (LEVEL, LOW, HIGH)
# LEVEL is the fan level to use (0-7 with thinkpad_acpi)
# LOW is the temperature at which to step down to the previous level
# HIGH is the temperature at which to step up to the next level
# All numbers are integers.
#
sensor ${cfg.sensor} (0, 10, 15, 2, 10, 5, 0, 3, 0, 3)
${cfg.levels}
'';
in {
options = {
services.thinkfan = {
enable = mkOption {
default = false;
description = ''
Whether to enable thinkfan, fan controller for IBM/Lenovo ThinkPads.
'';
};
sensor = mkOption {
default = "/proc/acpi/ibm/thermal";
description =''
Sensor used by thinkfan
'';
};
levels = mkOption {
default = ''
(0, 0, 55)
(1, 48, 60)
(2, 50, 61)
(3, 52, 63)
(6, 56, 65)
(7, 60, 85)
(127, 80, 32767)
'';
description =''
Sensor used by thinkfan
'';
};
};
};
config = mkIf cfg.enable {
environment.systemPackages = [ pkgs.thinkfan ];
systemd.services.thinkfan = {
description = "Thinkfan";
after = [ "basic.target" ];
wantedBy = [ "multi-user.target" ];
path = [ pkgs.thinkfan ];
serviceConfig.ExecStart = "${pkgs.thinkfan}/bin/thinkfan -n -c ${configFile}";
};
boot.extraModprobeConfig = "options thinkpad_acpi experimental=1 fan_control=1";
};
}