nix/os-mods/ryzenapu/default.nix

91 lines
2.7 KiB
Nix
Raw Normal View History

2025-02-24 17:26:11 +01:00
{ config
, lib
, pkgs
, system
, inputs
, ...
}: {
# This automatically sets the ryzen apu TDP to 45 W on AC and 10W on battery
# addionally it enables and configures some general power management stuff like powertop
environment.systemPackages = with pkgs; [
ryzenadj
(writers.writeDashBin "set_tdp" ''
set -efux
watt=$1
value=$(( $watt * 1000 ))
${ryzenadj}/bin/ryzenadj --stapm-limit="$value" --fast-limit="$value" --slow-limit="$value" --tctl-temp=85
'')
];
systemd = {
services = {
desktop-power-maximum-tdp = {
description = "Change TDP to maximum TDP when on AC power";
wantedBy = [ "ac.target" ];
unitConfig = {
RefuseManualStart = true;
};
path = with pkgs; [
coreutils
ryzenadj
];
serviceConfig.Type = "oneshot";
preStart = "sleep 2";
script = ''
ryzenadj --stapm-limit=45000 --fast-limit=45000 --slow-limit=45000 --tctl-temp=85
'';
};
portable-power-saving-tdp = {
description = "Change TDP to power saving TDP when on battery power";
wantedBy = [ "battery.target" ];
unitConfig = { RefuseManualStart = true; };
path = with pkgs; [
coreutils
ryzenadj
];
serviceConfig.Type = "oneshot";
preStart = "sleep 2";
script = ''
ryzenadj --stapm-limit=10000 --fast-limit=10000 --slow-limit=10000 --tctl-temp=85
'';
};
# Do not manage HID devices to prevent annoying keyboard/mouse sleeps
powertop.postStart = ''
HIDDEVICES=$(ls /sys/bus/usb/drivers/usbhid | grep -oE '^[0-9]+-[0-9\.]+' | sort -u)
for i in $HIDDEVICES; do
echo -n "Enabling " | cat - /sys/bus/usb/devices/$i/product
echo 'on' > /sys/bus/usb/devices/$i/power/control
done
'';
};
targets = {
ac = {
conflicts = [ "battery.target" ];
description = "On AC power";
unitConfig = { DefaultDependencies = "false"; };
};
battery = {
conflicts = [ "ac.target" ];
description = "On battery power";
unitConfig = { DefaultDependencies = "false"; };
};
};
};
services = {
power-profiles-daemon.enable = true;
udev.extraRules = ''
SUBSYSTEM=="power_supply", ENV{POWER_SUPPLY_NAME}=="AC0", ENV{POWER_SUPPLY_ONLINE}=="1", RUN+="${pkgs.systemd}/bin/systemctl --no-block start ac.target"
SUBSYSTEM=="power_supply", ENV{POWER_SUPPLY_NAME}=="AC0", ENV{POWER_SUPPLY_ONLINE}=="0", RUN+="${pkgs.systemd}/bin/systemctl --no-block start battery.target"
'';
};
# energy saving stuff
powerManagement.powertop.enable = true;
}