Equivalent Commands - NGnius/PowerTools GitHub Wiki
In case you still want some of the functionality, without the nice GUI, here's some equivalent commands.
These should all be run as superuser, i.e. run sudo su
and then run these commands in that.
Enable & Disable CPU threads
Enable: echo 1 > /sys/devices/system/cpu/cpu{cpu_number}/online
where {cpu_number}
is a number from 1 to 7 (inclusive).
Disable: echo 0 > /sys/devices/system/cpu/cpu{cpu_number}/online
where {cpu_number}
is a number from 1 to 7 (inclusive).
NOTE: You cannot enable or disable cpu0, hence why there are only 7 in the range for 8 cpu threads.
Enable & Disable CPU SMT
Enable: echo on > /sys/devices/system/cpu/smt/control
.
Disable: echo off > /sys/devices/system/cpu/smt/control
.
Enable & Disable CPU boost
Enable: echo 1 > /sys/devices/system/cpu/cpufreq/boost
enables boost across all threads.
Disable: echo 0 > /sys/devices/system/cpu/cpufreq/boost
disables boost across all threads.
Set CPU frequency
Refer to https://github.com/NGnius/PowerTools/issues/21
Old method
Use cpupower
(usage: cpupower --help
).
This is not how PowerTools does it, but it's a multi-step process which can involve changing the CPU governor.
All that can be done automatically by cpupower frequency-set --freq {frequency}
where {frequency}
is 1.7G
, 2.4G
or 2.8G
.
Set GPU Power
Set Slow Powerplay Table (PPT):echo {microwatts} > /sys/class/hwmon/hwmon4/power1_cap
where {microwatts}
is a wattage in millionths of a Watt. This doesn't seem to do a lot.
Set Fast Powerplay Table (PPT): echo {microwatts} > /sys/class/hwmon/hwmon4/power2_cap
where {microwatts}
is a wattage in millionths of a Watt.
Get the entry limits for those two commands with cat /sys/class/hwmon/hwmon4/power{number}_cap_max
where {number}
is 1
(slowPPT) or 2
(fastPPT).
Set GPU frequency
Refer to https://github.com/NGnius/PowerTools/issues/21
Set Fan speed
NOTE: PowerTools no longer supports this, since Fantastic does it much better.
Enable automatic control: echo 0 > /sys/class/hwmon/hwmon5/recalculate
enables automatic fan control.
Disable automatic control: echo 1 > /sys/class/hwmon/hwmon5/recalculate
disables automatic (temperature-based) fan control and starts using the set fan target instead.
Set the fan speed: echo {rpm} > /sys/class/hwmon/hwmon5/fan1_target
where {rpm}
is the RPM.
Read the actual fan RPM: cat /sys/class/hwmon/hwmon5/fan1_input
gives the fan speed.
NOTE: There's a bug in the fan controller; if you enable automatic fan control it will forget any previously-set target despite it appearing to be set correctly (i.e. cat /sys/class/hwmon/hwmon5/fan1_target
will display the correct value).
When you disable automatic fan control, you will need to set the fan RPM again.
Get battery stats
Get the battery charge right now: cat /sys/class/hwmon/hwmon2/device/charge_now
gives charge in uAh (uAh * 7.7/1000000 = charge in Wh).
Get the maximum battery capacity: cat /sys/class/hwmon/hwmon2/device/charge_full
gives charge in uAh.
Get the design battery capacity: cat /sys/class/hwmon/hwmon2/device/charge_full_design
gives charge in uAh.
Get battery current: cat /sys/class/hwmon/hwmon5/curr1_input
gives the charger current in mA.
NOTE: 7.7 is the voltage of the battery -- it's not just a magic number.
Set battery charge rate
Set the charge rate: echo {rate} > /sys/class/hwmon/hwmon5/maximum_battery_charge_rate
where {rate}
is the charge rate in mA, between 250 and 2500 mA.
That file is write only, so changes cannot be directly observed.
Set battery charge mode
There exists a binary which may or may not be executable (depending on which SteamOS version) which can be used to set this and other things. More details in the issue.
Refer to util.rs for how the firmware interface works.
Steam Deck kernel patches
This is how I figured out how the fan stuff works. I've only scratched the surface of what this code allows, I'm sure it has more useful information. https://lkml.org/lkml/2022/2/5/391
Game launch detection
//@ts-ignore
let lifetimeHook = SteamClient.GameSessions.RegisterForAppLifetimeNotifications((update) => {
if (update.bRunning) {
console.log("AppID " + update.unAppID.toString() + " is now running");
} else {
console.log("AppID " + update.unAppID.toString() + " is no longer running");
// game exit code here
// NOTE: custom games always have 0 as AppID, so AppID is bad to use as ID
}
});
//@ts-ignore
let startHook = SteamClient.Apps.RegisterForGameActionStart((actionType, id) => {
//@ts-ignore
let gameInfo: any = appStore.GetAppOverviewByGameID(id);
// game start code here
// NOTE: GameID (variable: id) is always unique, even for custom games, so it's better to use than AppID
});