/SimpleDeckyTDP

(Formerly Simple) TDP plugin for alternative AMD PC handhelds

Primary LanguageTypeScriptOtherNOASSERTION

SimpleDeckyTDP

This is a (formerly simple) Linux TDP Decky Plugin that wraps ryzenadj. Intended for devices compatible with ryzenadj.

plugin image

Features

  • per game TDP Profiles (and optional separate AC Power Profiles)
    • custom TDP limits
  • Power Governor and Energy Performance Preference controls
  • GPU Controls
  • SMT control
  • CPU Boost control*
    • note, requires a AMD scaling driver that supports CPU boost, currently amd-pstate-epp doesn't support CPU Boost
  • set TDP on AC Power events and suspend-resume events
  • TDP Polling - useful for devices that change TDP in the background
  • Desktop App - see Desktop App Section for more details
  • Legion Go TDP via WMI calls (allows for TDP control with secure boot)
  • ROG Ally TDP via WMI calls (allows for TDP control with secure boot)
  • etc

Deviations from Upstream

  • Adds an explicit GPU power saving mode as implemented in JELOS.

Compatibility

Tested on SteamFork, other distributions are not tested.

Currently NOT compatible with Intel or Nvidia, this plugin is currently AMD APUs only

Install

Prerequisites

Decky Loader must already be installed. If using ryzenadj for TDP control (Included w/ SteamFork), secure boot must be disabled.

Quick Install / Update

Run the following in terminal, then reboot. Note that this works both for installing or updating the plugin

curl -L https://github.com/SteamFork/SimpleDeckyTDP/raw/main/install.sh | sh

Manual Install

Download the latest release from the releases page

Unzip the tar.gz file, and move the SimpleDeckyTDP folder to your $HOME/homebrew/plugins directory

then run:

sudo systemctl restart plugin_loader.service

then reboot your machine.

Manual build

Dependencies:

  • Node.js v16.14+ and pnpm installed
  • fully functional ryzenadj
git clone https://github.com/SteamFork/SimpleDeckyTDP.git

cd SimpleDeckyTDP

# if pnpm not already installed
npm install -g pnpm

pnpm install
pnpm update decky-frontend-lib --latest
pnpm run build

Afterwards, you can place the entire SimpleDeckyTDP folder in the ~/homebrew/plugins directly, then restart your plugin service

sudo systemctl restart plugin_loader.service

sudo systemctl reboot

Uninstall Instructions

In Desktop mode, run the following in terminal:

sudo rm -rf $HOME/homebrew/plugins/SimpleDeckyTDP
sudo systemctl restart plugin_loader.service

Advanced configuration

Desktop App

SimpleDeckyTDP-Desktop App - Experimental Electron frontend for the SimpleDeckyTDP Plugin's backend

  • Note: the Desktop app does not have full feature parity with the Decky Plugin. Certain features cannot be implemented yet, such as:
    • per-game profiles
    • set TDP on resume
    • TDP polling
    • etc

The Desktop App also should not be used simultaneously with the SimpleDeckyTDP decky plugin, you should only use one or the other at any given time.

This is because 2-way communication between the plugin and Desktop app is currently not possible.

Custom TDP method

If you'd prefer to use something other than ryzenadj for to set TDP, you can opt to override ryzenadj with an alternative.

In the $HOME/homebrew/settings/SimpleDeckyTDP/settings.json, add an overrideRyzenadj value. Whatever value you set will be used as a command, with the tdp provided as a single additional arg

e.g.

# settings.json
{
    "overrideRyzenadj": "/path/to/script.sh",
    ...
}

# called later at app runtime, 15 = tdp value
/path/to/script.sh 15

You can see how it's used in the code here

Custom Device settings

See device settings README

Are there CPU boost controls?

CPU Boost controls require a scaling-driver that supports CPU boost. Many distros, by default, use amd-pstate-epp as the scaling driver. This scaling driver does NOT support CPU boost controls.

NOTE: CPU Boost controls are only recommended for the ROG Ally. For other PC handhelds, it shouldn't make much of a difference. Turning off CPU Boost is particularly useful on the ROG Ally because it has a reported excess power consumption issue.

If you need CPU boost controls, you should investigate changing your default scaling driver to amd-pstate = passive or acpi-cpufreq.

rpm-ostree kargs --append-if-missing=amd_pstate=passive

If you wish to reverse the changes, run the following:

rpm-ostree kargs --delete-if-present=amd_pstate=passive

Troubleshooting

The "Fix Steam Hardware Controls" option is missing

This is not a bug, Valve updated the Steam client and removed the TDP Slider on non-deck handhelds. Thus, the "Fix Steam Hardware Controls" option is no longer possible.

TDP Control is not working

First try updating the plugin to the latest version.

# update script
curl -L https://github.com/SteamFork/SimpleDeckyTDP/raw/main/install.sh | sh

If this doesn't fix your issue, next try deleting your $HOME/homebrew/settings/SimpleDeckyTDP/settings.json file, and rebooting.

If neither works, please create a github issue.

Buggy behavior after upgrading the plugin to a new version

If you see buggy behavior after upgrading to a new version of the plugin, it might be due to some bad values in an older settings file.

Try deleting the $HOME/homebrew/settings/SimpleDeckyTDP/settings.json file.

Note that this will delete any of your saved TDP profiles, so you could optionally copy it somewhere else to keep it as a backup instead.

My eGPU is being affected by TDP settings

The Steam GPU slider reportedly affects eGPUs, if you are using an eGPU you should disable the Fix Steam Hardware Controls toggle.

You will also have to manually disable the GPU control toggle and TDP toggle in the Steam QAM, since it can still affect GPU clocks even if SimpleDeckyTDP is no longer managing the Steam Sliders.

ROG Ally Troubleshooting

The ROG ally has some known issues related to CPU Boost and SMT.

  • Suspend often gets borked if you disable SMT
    • recommendation is to leave SMT on at all times.
  • CPU boost is reportedly misconfigured on the Ally and causes excessive power usage, disabling CPU boost is recommended

Attribution

Thanks to the following for making this plugin possible: