{ 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 = 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" ]; }; 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} ''; }; 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 ''; }; 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; # AC0 nixos-pulse # ACAD nixos-fw16 udev.extraRules = '' 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" 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; }