summary refs log tree commit diff
path: root/nixos/modules/services/hardware/thinkfan.nix
blob: 16c31aab2d50224488f8069f3bdd9ceecc67f5db (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
{ 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)
    
    (0,     0,      55)
    (1,     48,     60)
    (2,     50,     61)
    (3,     52,     63)
    (6,     56,     65)
    (7,     60,     85)
    (127,   80,     32767)
  '';

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
        '';
      };

    };

  };

  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";

  };

}