1{ config, lib, ... }:
2
3with lib;
4
5let
6
7 cfg = config.powerManagement.scsiLinkPolicy;
8
9 kernel = config.boot.kernelPackages.kernel;
10
11 allowedValues = [
12 "min_power"
13 "max_performance"
14 "medium_power"
15 "med_power_with_dipm"
16 ];
17
18in
19
20{
21 ###### interface
22
23 options = {
24
25 powerManagement.scsiLinkPolicy = mkOption {
26 default = null;
27 type = types.nullOr (types.enum allowedValues);
28 description = ''
29 SCSI link power management policy. The kernel default is
30 "max_performance".
31 </para><para>
32 "med_power_with_dipm" is supported by kernel versions
33 4.15 and newer.
34 '';
35 };
36
37 };
38
39
40 ###### implementation
41
42 config = mkIf (cfg != null) {
43
44 assertions = singleton {
45 assertion = (cfg == "med_power_with_dipm") -> versionAtLeast kernel.version "4.15";
46 message = "med_power_with_dipm is not supported for kernels older than 4.15";
47 };
48
49 services.udev.extraRules = ''
50 SUBSYSTEM=="scsi_host", ACTION=="add", KERNEL=="host*", ATTR{link_power_management_policy}="${cfg}"
51 '';
52 };
53
54}