Files
dotfiles/hosts/doloro-laptop/laptop.nix
2026-01-16 21:50:14 +00:00

239 lines
6.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.tuned = {
enable = true;
profiles = {
doloro-power-saver = {
main = {
include = "powersave, intel-best_power_efficiency_mode";
};
script = {
script = "\${i:PROFILE_DIR}/script.sh";
};
};
doloro-balanced = {
main = {
include = "balanced";
};
script = {
script = "${battery-limit-script}/bin/set-battery-limit";
};
};
};
};
environment.etc = {
"tuned/recommend.conf" = {
text = tuned-auto-profile-config;
};
"tuned/profiles/doloro-power-saver/script.sh" = {
text = "${one-with-all}";
mode = "0777";
};
};
systemd.services = {
# Tells tuned "hey, re-eval system state and change profiles accordingly"
send-sighup-to-tuned = {
serviceConfig = {
ExecStart = "${pkgs.killall}/bin/killall -1 .tuned-wrapped";
Restart = "always";
RestartSec = "30s";
};
wantedBy = [ "multi-user.target" ];
};
tuned-auto-profile = {
description = "Enable Auto Profile in TuneD";
after = [ "network.target" ]; # Ensure network is up (if needed for TuneD)
wantedBy = [ "multi-user.target" ]; # Start in the default target mode
# Command to run
serviceConfig = {
ExecStart = "${pkgs.tuned}/bin/tuned-adm auto_profile";
Restart = "on-failure";
RestartSec = 5; # Wait 5 seconds before retrying if it fails
Environment = "PATH=/sbin:/bin:/usr/sbin:/usr/bin"; # Ensure PATH is correct
};
};
};
services.thermald.enable = true;
services.upower = {
enable = true;
};
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.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;
};
}