homemade_speedstep/README.md

85 lines
3.6 KiB
Markdown

# Homemade Speedstep
homemade_speedstep is a program I made while learning the C programming language to replace an old python script I've been using to keep my old laptop from shutting down due to thermal overload.
If you're familiar with Intel's speedstep technology, this program attempts to imitate its behaviour, although in a much more crude way.
It is meant for GNU/Linux systems where thermal throttling is not working for whatever reason, leading to shutdowns from reaching critical temperatures.
## License
This Free Software is licensed under the **GNU Public License version 3**.
Read the **LICENSE** file distributed alongside this source code for more information.
## Requirements
The program requires running as root, as it needs permission to read and write from the `/sys` directory.
It also requires support for the cpufreq 'userspace' governor built into the kernel.
The 'userspace' governor must be the currently running one.
## Building
Run `make` to compile the program, the binary will be placed in the `bin` directory.
You can run it from there or you can run `make install` to place it in the `/usr/bin` folder.
Run `make install-openrc` to install the program as an openrc service.
Run `make debug` to compile the program with debug symbols (only useful if you wish to debug it).
Run `make clean` to remove the compiled binary (note: only from `bin`, to remove from `/usr/bin` run `rm /usr/bin/homemade_speedstep`).
## How it works
The program checks the available frequencies that the CPU can run at and it will try to keep it at the maximum that your system can run at before reaching your upper temperature threshold.
If the temperature stays within the upper and lower bound, it will keep the current frequency.
Upon reaching the upper threshold, it will step down the frequency by one step as defined by the available frequencies, down to the minimum frequency it can run at.
Once the temperature goes back down and it reaches the minimum threshold, the program will step up the frequency until it reaches the maximum again.
## Usage
You must provide the temperature at which you wish to step down the maximum frequency as first argument, and the temperature at which you wish to step up the maximum frequency as second argument; like so:
`homemade_speedstep <max temp> <min temp>`
**Important**: max temp and min temp must be passed as 5 digit integers, like so: 82ºC = 82000
---
**Recomendation**: add a service to your init script that runs this program at startup in the background so you don't need to keep a terminal emulator open running it.
Using OpenRC this would be done by adding the following in a `/etc/init.d/homemade_speedstep` file:
```
#!/sbin/openrc-run
name="homemade_speedstep"
description="crude imitation of intel's speedstep"
command=/usr/bin/homemade_speedstep
command_args="${HSMAXTEMP} ${HSMINTEMP}"
command_background=true
pidfile="/run/${RC_SVCNAME}.pid"
checkconfig() {
if [ ${HSMAXTEMP} -lt 100000 ] && [ ${HSMINTEMP} -lt ${HSMAXTEMP} ] ; then
return 0
fi
}
start_pre() {
# Prevent of double check
if [ "${RC_CMD}" != "restart" ] ; then
checkconfig || return $?
fi
}
stop_pre() {
if [ "${RC_CMD}" = "restart" ] ; then
checkconfig || return $?
fi
}
```
and the following in a `/etc/conf.d/homemade_speedstep` file:
```
# /etc/conf.d/homemade_speedstep: config gile for /etc/init.d/homemade_speedstep
# Change these to your liking
# Upper temperature threshold
HSMAXTEMP=82000
# Lower temperature threshold
HSMINTEMP=70000
```
and finally running `rc-update add homemade_speedstep default`