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
|
|
|
|
'')
|
|
|
|
];
|
2025-03-10 14:09:41 +01:00
|
|
|
systemd =
|
|
|
|
let
|
|
|
|
tcl = "85";
|
|
|
|
coall = "1048561"; # 1048561 = 0x100000 - 15(mV) $ math "0x100000-15" # slight undervolt
|
|
|
|
defaults = "--tctl-temp=${tcl} --set-coall=${coall}";
|
|
|
|
in
|
|
|
|
{
|
|
|
|
services = {
|
|
|
|
ryzenadj = {
|
|
|
|
enable = false;
|
|
|
|
description = "RyzenAdj Autoset";
|
|
|
|
serviceConfig = {
|
|
|
|
Type = "oneshot";
|
|
|
|
User = "root";
|
|
|
|
ExecStart = "${pkgs.ryzenadj}/bin/ryzenadj ${defaults}";
|
|
|
|
};
|
|
|
|
wantedBy = [ "multi-user.target" ];
|
2025-03-09 00:01:36 +01:00
|
|
|
};
|
|
|
|
|
2025-03-10 14:09:41 +01:00
|
|
|
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=50000 --slow-limit=54000 --fast-limit=55000 ${defaults}
|
|
|
|
'';
|
2025-02-24 17:26:11 +01:00
|
|
|
};
|
|
|
|
|
2025-03-10 14:09:41 +01:00
|
|
|
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 --slow-limit=15000 --fast-limit=30000 ${defaults}
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
|
|
|
# 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
|
2025-02-24 17:26:11 +01:00
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
2025-03-10 14:09:41 +01:00
|
|
|
targets = {
|
|
|
|
ac = {
|
|
|
|
conflicts = [ "battery.target" ];
|
|
|
|
description = "On AC power";
|
|
|
|
unitConfig = { DefaultDependencies = "false"; };
|
|
|
|
};
|
2025-02-24 17:26:11 +01:00
|
|
|
|
2025-03-10 14:09:41 +01:00
|
|
|
battery = {
|
|
|
|
conflicts = [ "ac.target" ];
|
|
|
|
description = "On battery power";
|
|
|
|
unitConfig = { DefaultDependencies = "false"; };
|
|
|
|
};
|
2025-02-24 17:26:11 +01:00
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
services = {
|
|
|
|
power-profiles-daemon.enable = true;
|
2025-03-09 00:27:01 +01:00
|
|
|
# AC0 nixos-pulse
|
|
|
|
# ACAD nixos-fw16
|
2025-02-24 17:26:11 +01:00
|
|
|
udev.extraRules = ''
|
2025-03-09 00:27:01 +01:00
|
|
|
SUBSYSTEM=="power_supply", ENV{POWER_SUPPLY_NAME}=="ACAD", ENV{POWER_SUPPLY_ONLINE}=="1", RUN+="${pkgs.systemd}/bin/systemctl --no-block start ac.target"
|
|
|
|
SUBSYSTEM=="power_supply", ENV{POWER_SUPPLY_NAME}=="ACAD", ENV{POWER_SUPPLY_ONLINE}=="0", RUN+="${pkgs.systemd}/bin/systemctl --no-block start battery.target"
|
2025-02-24 17:26:11 +01:00
|
|
|
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;
|
|
|
|
}
|