From 175fd9e2d4bf12821c7a833c796a2bf516dc80f0 Mon Sep 17 00:00:00 2001 From: Doloro1978 Date: Thu, 15 Jan 2026 01:40:49 +0000 Subject: [PATCH] rework(tuned/laptop): auto profile swapping. --- hosts/doloro-laptop/laptop.nix | 136 +++++++++++++++++++++++++++++++++ 1 file changed, 136 insertions(+) diff --git a/hosts/doloro-laptop/laptop.nix b/hosts/doloro-laptop/laptop.nix index 5a3132e..ff2399f 100644 --- a/hosts/doloro-laptop/laptop.nix +++ b/hosts/doloro-laptop/laptop.nix @@ -1,6 +1,95 @@ { pkgs, lib, ... }: let + battery-limit-script = pkgs.writeShellScriptBin "set-battery-limit" '' + #!/bin/bash + echo 40 > /sys/class/power_supply/BAT0/charge_control_start_threshold + echo 80 > /sys/class/power_supply/BAT0/charge_control_end_threshold + ''; + gpu-limit-frequency = pkgs.writeShellScriptBin "set-gpu-limit" '' + #!/bin/bash + start() { + ${pkgs.intel-gpu-tools}/bin/intel_gpu_frequency -e + } + stop() { + ${pkgs.intel-gpu-tools}/bin/intel_gpu_frequency -d + } + ''; + 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/AC/online=0 + + # Profile for devices on AC power + [doloro-balanced] + virt= + system= + /sys/class/power_supply/AC/online=1 + + [atomic-host] + virt= + system=.*atomic.* + + [atomic-guest] + virt=.+ + system=.*atomic.* + + [throughput-performance] + virt= + system=.*(computenode|server).* + + [virtual-guest] + virt=.+ + + [balanced] + ''; in { # services.power-profiles-daemon.enable = true; @@ -59,6 +148,53 @@ in # }; services.tuned = { enable = true; + autoProfile = true; + extraProfiles = { + doloro-power-saving = { + description = "Custom power-saving profile inheriting from powersave"; + config = '' + include=powersave + + [plugins] + script=on + + [script] + script=${battery-limit-script}/bin/set-battery-limit,${gpu-limit-frequency}/bin/set-gpu-limit + mode=start + ''; + }; + doloro-balanced = { + description = "Custom balanced profile inheriting from balanced"; + config = '' + include=balanced + + [plugins] + script=on + + [script] + script=${battery-limit-script}/bin/set-battery-limit + mode=start + ''; + }; + }; + }; + environment.etc = { + tuned.recommend.conf = { + text = tuned-auto-profile-config; + }; + }; + systemd.services.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 = {