150 lines
4.0 KiB
Nix
150 lines
4.0 KiB
Nix
{ pkgs, lib, ... }:
|
|
let
|
|
batt-gpu = pkgs.writeShellScript "batt-igpu" ''
|
|
${pkgs.intel-gpu-tools}/bin/intel_gpu_frequency -e
|
|
echo "800" > /sys/class/drm/card1/gt_boost_freq_mhz
|
|
'';
|
|
ac-gpu = pkgs.writeShellScript "ac-igpu" ''
|
|
${pkgs.intel-gpu-tools}/bin/intel_gpu_frequency -d
|
|
echo "2350" > /sys/class/drm/card1/gt_boost_freq_mhz
|
|
'';
|
|
in
|
|
{
|
|
services.tlp = {
|
|
enable = true;
|
|
settings = {
|
|
# Wireless power saving
|
|
WIFI_PWR_ON_BAT = "1";
|
|
|
|
# USB autosuspend
|
|
USB_AUTOSUSPEND = "1";
|
|
|
|
# SATA drive power management
|
|
SATA_LINKPWR_ON_BAT = "min_power";
|
|
|
|
# PCI Express Active-State Power Management (ASPM)
|
|
PCIE_ASPM_ON_BAT = "powersupersave";
|
|
|
|
RUNTIME_PM_ON_AC = "on";
|
|
RUNTIME_PM_ON_BAT = "auto";
|
|
|
|
# Disable Bluetooth on battery
|
|
# DEVICES_TO_DISABLE_ON_BAT = "bluetooth";
|
|
|
|
# Restore brightness on battery
|
|
RESTORE_BRIGHTNESS_ON_BAT = "1";
|
|
PCIE_ASPM_ON_AC = "balanced";
|
|
DEVICES_TO_DISABLE_ON_BAT_NOT_IN_USE = "bluetooth";
|
|
INTEL_GPU_MAX_FREQ_ON_AC = 0;
|
|
INTEL_GPU_MAX_FREQ_ON_BAT = 800;
|
|
INTEL_GPU_BOOST_FREQ_ON_AC = 0;
|
|
INTEL_GPU_BOOST_FREQ_ON_BAT = 800;
|
|
|
|
CPU_MAX_PERF_ON_BAT = 50;
|
|
|
|
PLATFORM_PROFILE_ON_AC = "balanced";
|
|
PLATFORM_PROFILE_ON_BAT = "quiet";
|
|
START_CHARGE_THRESH_BAT0 = 40; # 40 and below it starts to charge
|
|
STOP_CHARGE_THRESH_BAT0 = 80; # 80 and above it stops charging
|
|
};
|
|
};
|
|
services.thermald.enable = true;
|
|
services.upower = {
|
|
enable = true;
|
|
};
|
|
services.auto-cpufreq.enable = true;
|
|
|
|
systemd.targets = {
|
|
"ac" = {
|
|
description = "On AC power";
|
|
unitConfig = {
|
|
StopWhenUnneeded = "yes";
|
|
};
|
|
};
|
|
"battery" = {
|
|
description = "On battery power";
|
|
unitConfig = {
|
|
StopWhenUnneeded = "yes";
|
|
};
|
|
};
|
|
};
|
|
|
|
services.udev.extraRules = ''
|
|
SUBSYSTEM=="power_supply",ENV{POWER_SUPPLY_ONLINE}=="0", RUN+="/run/current-system/systemd/bin/systemctl start battery.target"
|
|
SUBSYSTEM=="power_supply", ENV{POWER_SUPPLY_ONLINE}=="1", RUN+="/run/current-system/systemd/bin/systemctl start ac.target"
|
|
'';
|
|
|
|
services.auto-cpufreq.settings = {
|
|
battery = {
|
|
governor = "powersave";
|
|
turbo = "never";
|
|
};
|
|
charger = {
|
|
governor = "performance";
|
|
turbo = "auto";
|
|
};
|
|
};
|
|
boot.kernelParams = [
|
|
# "mem_sleep_default=deep"
|
|
# "i915.fastboot=1"
|
|
"pcie_aspm=force"
|
|
"ahci.mobile_lpm_policy=1"
|
|
];
|
|
services.logind.settings.Login = {
|
|
HandleLidSwitch = "suspend";
|
|
HandleLidSwitchExternalPower = "suspend";
|
|
HandleLidSwitchDocked = "ignore";
|
|
};
|
|
systemd.sleep.extraConfig = ''
|
|
HibernateDelaySec=30min
|
|
SuspendEstimationSec=120
|
|
'';
|
|
|
|
systemd.services.gpu-limit-on-batt = {
|
|
enable = true;
|
|
description = "Using rfkill; disable all rf devices before sleeping.";
|
|
before = [ "battery.target" ];
|
|
|
|
serviceConfig = {
|
|
Type = "oneshot";
|
|
ExecStart = "${batt-gpu}";
|
|
RemainAfterExit = true;
|
|
};
|
|
wantedBy = [ "battery.target" ];
|
|
partOf = [ "battery.target" ];
|
|
};
|
|
systemd.services.gpu-limit-on-ac = {
|
|
enable = true;
|
|
description = "Using rfkill; disable all rf devices before sleeping.";
|
|
before = [ "ac.target" ];
|
|
|
|
serviceConfig = {
|
|
Type = "oneshot";
|
|
ExecStart = "${ac-gpu}";
|
|
RemainAfterExit = true;
|
|
};
|
|
wantedBy = [ "ac.target" ];
|
|
partOf = [ "ac.target" ];
|
|
};
|
|
systemd.services.rfkill-sleep-wake = {
|
|
enable = true;
|
|
description = "Using rfkill; disable all rf devices before sleeping.";
|
|
before = [ "sleep.target" ];
|
|
|
|
serviceConfig = {
|
|
Type = "oneshot";
|
|
ExecStop = "${pkgs.utillinux}/bin/rfkill unblock all";
|
|
ExecStart = "${pkgs.utillinux}/bin/rfkill block all";
|
|
RemainAfterExit = true;
|
|
};
|
|
wantedBy = [ "sleep.target" ];
|
|
partOf = [ "sleep.target" ];
|
|
|
|
};
|
|
# one of "ignore", "poweroff", "reboot", "halt", "kexec", "suspend", "hibernate", "hybrid-sleep", "suspend-then-hibernate", "lock"
|
|
powerManagement = {
|
|
enable = true;
|
|
# powertop.enable = true;
|
|
};
|
|
}
|