From d1a668ec1fe70ab566cf4dc18afebd3507e5b615 Mon Sep 17 00:00:00 2001 From: NGnius Date: Mon, 9 Oct 2023 16:30:11 +0100 Subject: [PATCH] Update 'Equivalent Commands' --- Equivalent-Commands.md | 224 +++++++++++++++++++++-------------------- 1 file changed, 115 insertions(+), 109 deletions(-) diff --git a/Equivalent-Commands.md b/Equivalent-Commands.md index 59d2472..451eb7e 100644 --- a/Equivalent-Commands.md +++ b/Equivalent-Commands.md @@ -1,110 +1,116 @@ -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](https://github.com/NGnius/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](https://github.com/NGnius/PowerTools/issues/50). - -Refer to [util.rs](https://github.com/NGnius/PowerTools/blob/main/backend/src/settings/steam_deck/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 - -```typescript -//@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 -}); +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. + +NOTE: sysfs entries are subject to change with kernel updates. For example, hwmon indices may be incorrect if they were written for an older kernel. NGnius does not always keep this up to date with the latest numbers. + +# 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://git.ngni.us/NG-SD-Plugins/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://git.ngni.us/NG-SD-Plugins/PowerTools/issues/21 + +# Set Fan speed + +NOTE: PowerTools no longer supports this, since [Fantastic](https://git.ngni.us/NG-SD-Plugins/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](https://git.ngni.us/NG-SD-Plugins/PowerTools/issues/50). Unfortunately recent SteamOS updates have removed that part of the binary's functionality. + +Refer to [util.rs](https://git.ngni.us/NG-SD-Plugins/PowerTools/blob/main/backend/src/settings/steam_deck/util.rs) for how the firmware interface works. + +# Set battery charge limit + +This also used to require the binary in [this issue](https://git.ngni.us/NG-SD-Plugins/PowerTools/issues/50). Luckily this is replaced by a sysfs interface in SteamOS 3.5: `/sys/class/hwmon/hwmon4/max_battery_charge_level`. The number is the percent charge; 100 is full, 0 is empty. + +# 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 + +```typescript +//@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 +}); ``` \ No newline at end of file