This is a (formerly simple) Linux TDP Decky Plugin that wraps ryzenadj. Intended for devices compatible with ryzenadj.
- Features
- Compatibility
- Requirements
- Installation
- Manual Build
- Uninstall Instructions
- Advanced Configuration
- Troubleshooting
- Attribution
- 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
- See here for instructions on changing the scaling driver on BazziteOS
- note, requires a AMD scaling driver that supports CPU boost, currently amd-pstate-epp doesn't support CPU Boost
- (optional) Fix Steam Client TDP and GPU Sliders
- 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
Tested on ChimeraOS Stable (45), NobaraOS 39, and Bazzite Deck Edition.
Other distros not tested.
Currently NOT compatible with Intel or Nvidia, this plugin is currently AMD APUs only
Note that ryzenadj is NOT necessary if you plan on using a ryzenadj override.
ChimeraOS, Bazzite Deck Edition, and NobaraOS Deck edition, should already have ryzenadj pre-installed.
To check this, you can run which ryzenadj
in a terminal/console, which should print out a path to a ryzenadj binary.
e.g.
$ which ryzenadj
/usr/bin/ryzenadj
If you do not have ryzenadj installed, you will need to get a working copy installed onto your machine.
To test your ryzenadj to make sure that it's functional, run the following:
$ sudo ryzenadj -i
This should print out a table that looks something like the following:
CPU Family: Rembrandt
SMU BIOS Interface Version: 18
Version: v0.13.0
PM Table Version: 450005
| Name | Value | Parameter |
|---------------------|-----------|--------------------|
| STAPM LIMIT | 8.000 | stapm-limit |
| STAPM VALUE | 0.062 | |
If you see an error, you may need to set iomem=relaxed
as a boot parameter for your kernel, or disable secure boot.
Decky Loader must already be installed. If using ryzenadj for TDP control, secure boot must be disabled.
Run the following in terminal, then reboot. Note that this works both for installing or updating the plugin
IF ON BAZZITE OS, USE THE BAZZITE INSTALLER HERE
curl -L https://github.com/aarron-lee/SimpleDeckyTDP/raw/main/install.sh | sh
The Bazzite installer does extra steps so that Fix Steam Hardware Controls
functionality can work
First install Decky Loader with this command in terminal:
ujust setup-decky
Then install SimpleDeckyTDP with:
ujust setup-decky simpledeckytdp
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.
Dependencies:
- Node.js v16.14+ and pnpm installed
- fully functional ryzenadj
git clone https://github.com/aarron-lee/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
In Desktop mode, run the following in terminal:
sudo rm -rf $HOME/homebrew/plugins/SimpleDeckyTDP
sudo systemctl restart plugin_loader.service
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.
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
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
.
For to change the scaling driver for to enable CPU boost controls on BazziteOS, run the following in terminal + reboot:
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
First try updating the plugin to the latest version.
# update script
curl -L https://github.com/aarron-lee/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.
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.
If the Steam GPU Slider does not show up, this is an OS bug. SimpleDeckyTDP has no control over the GPU slider showing up, the plugin can only modify it.
If you are seeing this issue on BazziteOS, you need to install SimpleDeckyTDP with ujust setup-decky simpledeckytdp
for the GPU slider
If you encounter this issue, turn off Fix Steam Hardware Controls
and use the GPU slider in the SimpleDeckyTDP plugin.
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.
Steam TDP slider and GPU Slider not working consistently with the "Fix Steam Hardware Controls" enabled
There's a few possibilities:
- The Steam Client recently updated and broke the patch functionality of the plugin.
- Your OS/Distro has a polkit file that is interfering with setting TDP/GPU values. This is a known issue on NobaraOS
For possibility #1, you can disable the Fix Steam Hardware Controls
toggle, and instead use the TDP + GPU sliders in the plugin
For possibility #2, you can either enable polling to workaround the polkit file, or ask your distro maintainer to patch/update the polkit file.
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
Thanks to the following for making this plugin possible: