Files
dotfiles/hosts/doloro-laptop/laptop.nix

277 lines
7.4 KiB
Nix

{ pkgs, lib, ... }:
let
battery-limit-script = ''
start_batt() {
echo 80 > /sys/class/power_supply/BAT0/charge_control_end_threshold
}
stop_batt() {
echo "meow"
}
'';
gpu-limit-frequency = ''
start_gpu() {
${pkgs.intel-gpu-tools}/bin/intel_gpu_frequency -e
}
stop_gpu() {
${pkgs.intel-gpu-tools}/bin/intel_gpu_frequency -d
}
'';
cpu-power-efficency = ''
start_cpu_effic() {
n=$(nproc)
i=0
while [ "$i" -lt $n ]; do
echo 178 | tee /sys/devices/system/cpu/cpu$i/cpufreq/energy_performance_preference
echo 8 | tee /sys/devices/system/cpu/cpu$i/power/energy_perf_bias
i=$(( i + 1 ))
done
return 0
}
stop_cpu_effic() {
n=$(nproc)
i=0
while [ "$i" -lt $n ]; do
echo "balance_performance" | tee /sys/devices/system/cpu/cpu$i/cpufreq/energy_performance_preference
echo 6 | tee /sys/devices/system/cpu/cpu$i/power/energy_perf_bias
i=$(( i + 1 ))
done
return 0
}
'';
one-with-all = ''
#!/bin/sh
${battery-limit-script}
${gpu-limit-frequency}
${cpu-power-efficency}
start() {
echo "meow"
echo "mreoww" > /home/doloro/meow.txt
start_gpu
start_batt
start_cpu_effic
}
stop() {
stop_gpu
stop_batt
stop_cpu_effic
}
if [ "$1" == "start" ]; then
start
fi
if [ "$1" == "stop" ]; then
stop
fi
'';
tuned-auto-profile-config = ''
# TuneD rules for recommend_profile.
#
# Syntax:
# [PROFILE1]
# KEYWORD11=RE11
# KEYWORD21=RE12
#
# [PROFILE2]
# KEYWORD21=RE21
# KEYWORD22=RE22
# KEYWORD can be:
# virt - for RE to match output of virt-what
# system - for RE to match content of /etc/system-release-cpe
# process - for RE to match running processes. It can have arbitrary
# suffix, all process* lines have to match for the PROFILE
# to match (i.e. the AND operator)
# /FILE - for RE to match content of the FILE, e.g.:
# '/etc/passwd=.+'. If file doesn't exist, its RE will not
# match.
# chassis_type - for RE to match the chassis type as reported by dmidecode
# syspurpose_role - for RE to match the system role as reported by syspurpose
# All REs for all KEYWORDs have to match for PROFILE to match (i.e. the AND operator).
# If 'virt' or 'system' is not specified, it matches for every string.
# If 'virt' or 'system' is empty, i.e. 'virt=', it matches only empty string (alias for '^$').
# If several profiles matched, the first match is taken.
#
# Limitation:
# Each profile can be specified only once, because there cannot be
# multiple sections in the configuration file with the same name
# (ConfigParser limitation).
# If there is a need to specify the profile multiple times, unique
# suffix like ',ANYSTRING' can be used. Everything after the last ','
# is stripped by the parser, e.g.:
#
# [balanced,1]
# /FILE1=RE1
#
# [balanced,2]
# /FILE2=RE2
#
# This will set 'balanced' profile in case there is FILE1 matching RE1 or
# FILE2 matching RE2 or both.
# Profile for devices on battery
[doloro-power-saver]
virt=
system=
/sys/class/power_supply/BAT0/status=Discharging
# Profile for devices on AC power
[doloro-balanced]
virt=
system=
/sys/class/power_supply/BAT0/status=Charging
[atomic-host]
virt=
system=.*atomic.*
[atomic-guest]
virt=.+
system=.*atomic.*
[throughput-performance]
virt=
system=.*(computenode|server).*
[virtual-guest]
virt=.+
[balanced]
'';
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 Power Management for PCI(e) buses/devices
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 wifi wwan";
INTEL_GPU_MAX_FREQ_ON_AC = 0;
INTEL_GPU_MAX_FREQ_ON_BAT = 800;
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 = "${pkgs.intel-gpu-tools}/bin/intel_gpu_frequency -e";
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 = "${pkgs.intel-gpu-tools}/bin/intel_gpu_frequency -d";
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;
};
}