summary refs log tree commit diff
path: root/nixos/modules/tasks/scsi-link-power-management.nix
blob: a9d987780ee1c34c60c75c65fc82aa5a970a1eed (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
{ config, lib, ... }:

with lib;

let

  cfg = config.powerManagement.scsiLinkPolicy;

  kernel = config.boot.kernelPackages.kernel;

  allowedValues = [
    "min_power"
    "max_performance"
    "medium_power"
    "med_power_with_dipm"
  ];

in

{
  ###### interface

  options = {

    powerManagement.scsiLinkPolicy = mkOption {
      default = null;
      type = types.nullOr (types.enum allowedValues);
      description = ''
        SCSI link power management policy. The kernel default is
        "max_performance".
        </para><para>
        "med_power_with_dipm" is supported by kernel versions
        4.15 and newer.
      '';
    };

  };


  ###### implementation

  config = mkIf (cfg != null) {

    assertions = singleton {
      assertion = (cfg == "med_power_with_dipm") -> versionAtLeast kernel.version "4.15";
      message = "med_power_with_dipm is not supported for kernels older than 4.15";
    };

    services.udev.extraRules = ''
      SUBSYSTEM=="scsi_host", ACTION=="add", KERNEL=="host*", ATTR{link_power_management_policy}="${cfg}"
    '';
  };

}