rework(tuned/laptop): auto profile swapping.
This commit is contained in:
@@ -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 = {
|
||||
|
||||
Reference in New Issue
Block a user