502 lines
11 KiB
Bash
Executable File
502 lines
11 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
VERSION='20'
|
|
cpucount=`cat /proc/cpuinfo|grep processor|wc -l`
|
|
FLROOT=/sys/devices/system/cpu
|
|
DRIVER=auto
|
|
VERBOSE=0
|
|
|
|
## parse special options
|
|
for i in "$@"
|
|
do
|
|
case $i in
|
|
-v|--verbose)
|
|
VERBOSE=1
|
|
shift
|
|
;;
|
|
--set=*)
|
|
VALUE="${i#*=}"
|
|
shift
|
|
;;
|
|
-c=*|--core=*)
|
|
CORE="${i#*=}"
|
|
shift
|
|
;;
|
|
--available)
|
|
AVAILABLE=1
|
|
shift
|
|
;;
|
|
-*)
|
|
OPTION=$i
|
|
shift
|
|
;;
|
|
*) # unknown
|
|
;;
|
|
esac
|
|
done
|
|
|
|
function help () {
|
|
echo "Package version: "$VERSION
|
|
echo "Usage:"
|
|
echo " cpufreqctl [OPTION[=VALUE]...]"
|
|
echo ""
|
|
echo " --help Show help options"
|
|
echo " --version Package version"
|
|
echo " --verbose, -v Verbose output"
|
|
echo ""
|
|
echo " --set=VALUE Set VALUE for selected option"
|
|
echo " --core=NUMBER Apply selected option just for the core NUMBER (0 ~ N - 1)"
|
|
echo " --available Get available values instand of default: current"
|
|
echo ""
|
|
echo " --driver Current processor driver"
|
|
echo " --governor Scaling governor's options"
|
|
echo " --epp Governor's energy_performance_preference options"
|
|
echo " --frequency Frequency options"
|
|
echo " --on Turn on --core=NUMBER"
|
|
echo " --off Turn off --core=NUMBER"
|
|
echo " --frequency-min Minimal frequency options"
|
|
echo " --frequency-max Maximum frequency options"
|
|
echo " --boost Current cpu boost value"
|
|
echo ""
|
|
echo "intel_pstate options"
|
|
echo " --no-turbo Current no_turbo value"
|
|
echo " --min-perf Current min_perf_pct options"
|
|
echo " --max-perf Current max_perf_pct options"
|
|
echo ""
|
|
echo "Package options"
|
|
echo " --install Install extra components for all users"
|
|
echo " --uninstall Uninstall extra components for all users"
|
|
echo " --update-fonts Update font cache"
|
|
echo " --reset Reset to defaults for current user"
|
|
echo ""
|
|
echo "Events options"
|
|
echo " --throttle Get thermal throttle counter"
|
|
echo " --throttle-event Get kernel thermal throttle events counter"
|
|
echo " --irqbalance Get irqbalance presence"
|
|
}
|
|
|
|
function info () {
|
|
echo "CPU driver: "`driver`
|
|
echo "Governors: "`cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors`
|
|
echo "Frequencies: "`cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies`
|
|
echo ""
|
|
echo "Usage:"
|
|
echo "## list scaling governors:"
|
|
echo "cpufreqctl --governor"
|
|
echo ""
|
|
echo "## Set all active cpu cores to the 'performance' scaling governor:"
|
|
echo "cpufreqctl --governor --set=performance"
|
|
echo ""
|
|
echo "## Set 'performance' scaling governor for the selected core:"
|
|
echo "cpufreqctl --governor --set=performance --core=0"
|
|
echo ""
|
|
echo "Use --help argument to see available options"
|
|
}
|
|
|
|
verbose () {
|
|
if [ $VERBOSE = 1 ]
|
|
then
|
|
echo $1
|
|
fi
|
|
}
|
|
|
|
function driver () {
|
|
cat $FLROOT/cpu0/cpufreq/scaling_driver
|
|
}
|
|
|
|
function set_driver () {
|
|
DRIVER=`driver`
|
|
case $DRIVER in
|
|
intel*|*pstate*) DRIVER=pstate;;
|
|
*)DRIVER=acpi;;
|
|
esac
|
|
}
|
|
|
|
function get_governor () {
|
|
if [ -z $CORE ]
|
|
then
|
|
i=0
|
|
ag=''
|
|
while [ $i -ne $cpucount ]
|
|
do
|
|
if [ $i = 0 ]
|
|
then
|
|
ag=`cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor`
|
|
else
|
|
ag=$ag' '`cat /sys/devices/system/cpu/cpu$i/cpufreq/scaling_governor`
|
|
fi
|
|
i=`expr $i + 1`
|
|
done
|
|
echo $ag
|
|
else
|
|
cat /sys/devices/system/cpu/cpu$CORE/cpufreq/scaling_governor
|
|
fi
|
|
}
|
|
|
|
function set_governor () {
|
|
if [ -z $CORE ]
|
|
then
|
|
i=0
|
|
while [ $i -ne $cpucount ]
|
|
do
|
|
FLNM="$FLROOT/cpu"$i"/cpufreq/scaling_governor"
|
|
echo $VALUE > $FLNM
|
|
i=`expr $i + 1`
|
|
done
|
|
else
|
|
echo $VALUE > /sys/devices/system/cpu/cpu$CORE/cpufreq/scaling_governor
|
|
fi
|
|
}
|
|
|
|
function get_frequency () {
|
|
if [ -z $CORE ]
|
|
then
|
|
i=0
|
|
V=0
|
|
M=$(cat "/sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq")
|
|
while [ $i -ne $cpucount ]
|
|
do
|
|
V=$(cat "/sys/devices/system/cpu/cpu"$i"/cpufreq/scaling_cur_freq")
|
|
if [[ $V > $M ]]
|
|
then
|
|
M=$V
|
|
fi
|
|
i=`expr $i + 1`
|
|
done
|
|
echo "$M"
|
|
else
|
|
cat /sys/devices/system/cpu/cpu$CORE/cpufreq/scaling_cur_freq
|
|
fi
|
|
}
|
|
|
|
function set_frequency () {
|
|
set_driver
|
|
if [ $DRIVER = 'pstate']
|
|
then
|
|
echo "Unavaible function for intel_pstate"
|
|
return
|
|
fi
|
|
if [ -z $CORE ]
|
|
then
|
|
i=0
|
|
while [ $i -ne $cpucount ]
|
|
do
|
|
FLNM="$FLROOT/cpu"$i"/cpufreq/scaling_setspeed"
|
|
echo $VALUE > $FLNM
|
|
i=`expr $i + 1`
|
|
done
|
|
else
|
|
echo $VALUE > /sys/devices/system/cpu/cpu$CORE/cpufreq/scaling_setspeed
|
|
fi
|
|
}
|
|
|
|
function get_frequency_min () {
|
|
if [ -z $CORE ]
|
|
then
|
|
CORE=0
|
|
fi
|
|
cat /sys/devices/system/cpu/cpu$CORE/cpufreq/scaling_min_freq
|
|
}
|
|
|
|
function set_frequency_min () {
|
|
if [ -z $CORE ]
|
|
then
|
|
i=0
|
|
while [ $i -ne $cpucount ]
|
|
do
|
|
FLNM="$FLROOT/cpu"$i"/cpufreq/scaling_min_freq"
|
|
echo $VALUE > $FLNM
|
|
i=`expr $i + 1`
|
|
done
|
|
else
|
|
echo $VALUE > /sys/devices/system/cpu/cpu$CORE/cpufreq/scaling_min_freq
|
|
fi
|
|
}
|
|
|
|
function get_frequency_max () {
|
|
if [ -z $CORE ]
|
|
then
|
|
CORE=0
|
|
fi
|
|
cat /sys/devices/system/cpu/cpu$CORE/cpufreq/scaling_max_freq
|
|
}
|
|
|
|
function set_frequency_max () {
|
|
if [ -z $CORE ]
|
|
then
|
|
i=0
|
|
while [ $i -ne $cpucount ]
|
|
do
|
|
FLNM="$FLROOT/cpu"$i"/cpufreq/scaling_max_freq"
|
|
echo $VALUE > $FLNM
|
|
i=`expr $i + 1`
|
|
done
|
|
else
|
|
echo $VALUE > /sys/devices/system/cpu/cpu$CORE/cpufreq/scaling_max_freq
|
|
fi
|
|
}
|
|
|
|
function get_energy_performance_preference () {
|
|
if [ -z $CORE ]
|
|
then
|
|
i=0
|
|
ag=''
|
|
while [ $i -ne $cpucount ]
|
|
do
|
|
if [ $i = 0 ]
|
|
then
|
|
ag=`cat /sys/devices/system/cpu/cpu0/cpufreq/energy_performance_preference`
|
|
else
|
|
ag=$ag' '`cat /sys/devices/system/cpu/cpu$i/cpufreq/energy_performance_preference`
|
|
fi
|
|
i=`expr $i + 1`
|
|
done
|
|
echo $ag
|
|
else
|
|
cat /sys/devices/system/cpu/cpu$CORE/cpufreq/energy_performance_preference
|
|
fi
|
|
}
|
|
|
|
function set_energy_performance_preference () {
|
|
if [ -z $CORE ]
|
|
then
|
|
i=0
|
|
while [ $i -ne $cpucount ]
|
|
do
|
|
FLNM="$FLROOT/cpu"$i"/cpufreq/energy_performance_preference"
|
|
echo $VALUE > $FLNM
|
|
i=`expr $i + 1`
|
|
done
|
|
else
|
|
echo $VALUE > /sys/devices/system/cpu/cpu$CORE/cpufreq/energy_performance_preference
|
|
fi
|
|
}
|
|
|
|
if [ -z $OPTION ] # No options
|
|
then
|
|
info
|
|
exit
|
|
fi
|
|
if [ $OPTION = "--help" ]
|
|
then
|
|
help
|
|
exit
|
|
fi
|
|
if [ $OPTION = "--version" ]
|
|
then
|
|
echo $VERSION
|
|
exit
|
|
fi
|
|
if [ $OPTION = "--driver" ]
|
|
then
|
|
driver
|
|
exit
|
|
fi
|
|
if [ $OPTION = "--governor" ]
|
|
then
|
|
if [ ! -z $AVAILABLE ]
|
|
then
|
|
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors
|
|
exit
|
|
fi
|
|
if [ -z $VALUE ]
|
|
then
|
|
verbose "Getting CPU"$CORE" governors"
|
|
get_governor
|
|
else
|
|
verbose "Setting CPU"$CORE" governors to "$VALUE
|
|
set_governor
|
|
fi
|
|
exit
|
|
fi
|
|
if [ $OPTION = "--epp" ]
|
|
then
|
|
if [ ! -z $AVAILABLE ]
|
|
then
|
|
cat /sys/devices/system/cpu/cpu0/cpufreq/energy_performance_available_preferences
|
|
exit
|
|
fi
|
|
if [ -z $VALUE ]
|
|
then
|
|
verbose "Getting CPU"$CORE" EPPs"
|
|
get_energy_performance_preference
|
|
else
|
|
verbose "Setting CPU"$CORE" EPPs to "$VALUE
|
|
set_energy_performance_preference
|
|
fi
|
|
exit
|
|
fi
|
|
if [ $OPTION = "--frequency" ]
|
|
then
|
|
if [ ! -z $AVAILABLE ]
|
|
then
|
|
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies
|
|
exit
|
|
fi
|
|
if [ -z $VALUE ]
|
|
then
|
|
verbose "Getting CPU"$CORE" frequency"
|
|
get_frequency
|
|
else
|
|
verbose "Setting CPU"$CORE" frequency to "$VALUE
|
|
set_frequency
|
|
fi
|
|
exit
|
|
fi
|
|
if [ $OPTION = "--no-turbo" ]
|
|
then
|
|
if [ -z $VALUE ]
|
|
then
|
|
verbose "Getting no_turbo value"
|
|
cat /sys/devices/system/cpu/intel_pstate/no_turbo
|
|
else
|
|
verbose "Setting no_turbo value "$VALUE
|
|
echo $VALUE > /sys/devices/system/cpu/intel_pstate/no_turbo
|
|
fi
|
|
exit
|
|
fi
|
|
if [ $OPTION = "--boost" ]
|
|
then
|
|
if [ -z $VALUE ]
|
|
then
|
|
verbose "Getting boost value"
|
|
cat /sys/devices/system/cpu/cpufreq/boost
|
|
else
|
|
verbose "Setting boost value "$VALUE
|
|
echo $VALUE > /sys/devices/system/cpu/cpufreq/boost
|
|
fi
|
|
exit
|
|
fi
|
|
if [ $OPTION = "--frequency-min" ]
|
|
then
|
|
if [ -z $VALUE ]
|
|
then
|
|
verbose "Getting CPU"$CORE" minimal frequency"
|
|
get_frequency_min
|
|
else
|
|
verbose "Setting CPU"$CORE" minimal frequency to "$VALUE
|
|
set_frequency_min
|
|
fi
|
|
exit
|
|
fi
|
|
if [ $OPTION = "--frequency-max" ]
|
|
then
|
|
if [ -z $VALUE ]
|
|
then
|
|
verbose "Getting CPU"$CORE" maximal frequency"
|
|
get_frequency_max
|
|
else
|
|
verbose "Setting CPU"$CORE" maximal frequency to "$VALUE
|
|
set_frequency_max
|
|
fi
|
|
exit
|
|
fi
|
|
if [ $OPTION = "--min-perf" ]
|
|
then
|
|
if [ -z $VALUE ]
|
|
then
|
|
verbose "Getting min_perf_pct value"
|
|
cat /sys/devices/system/cpu/intel_pstate/min_perf_pct
|
|
else
|
|
verbose "Setting min_perf_pct value "$VALUE
|
|
echo $VALUE > /sys/devices/system/cpu/intel_pstate/min_perf_pct
|
|
fi
|
|
exit
|
|
fi
|
|
if [ $OPTION = "--max-perf" ]
|
|
then
|
|
if [ -z $VALUE ]
|
|
then
|
|
verbose "Getting max_perf_pct value"
|
|
cat /sys/devices/system/cpu/intel_pstate/max_perf_pct
|
|
else
|
|
verbose "Setting max_perf_pct value "$VALUE
|
|
echo $VALUE > /sys/devices/system/cpu/intel_pstate/max_perf_pct
|
|
fi
|
|
exit
|
|
fi
|
|
if [ $OPTION = "--on" ]
|
|
then
|
|
if [ -z $CORE ]
|
|
then
|
|
verbose "Should be specify --core=NUMBER"
|
|
else
|
|
verbose "Power on CPU Core"$CORE
|
|
echo "1" > $FLROOT/cpu"$CORE"/online
|
|
fi
|
|
exit
|
|
fi
|
|
if [ $OPTION = "--off" ]
|
|
then
|
|
if [ -z $CORE ]
|
|
then
|
|
verbose "Should be specify --core=NUMBER"
|
|
else
|
|
verbose "Power off CPU Core"$CORE
|
|
echo "0" > $FLROOT/cpu"$CORE"/online
|
|
fi
|
|
exit
|
|
fi
|
|
|
|
if [ $OPTION = "--throttle" ]
|
|
then
|
|
i=1
|
|
V=0
|
|
M=$(cat "/sys/devices/system/cpu/cpu0/thermal_throttle/core_throttle_count")
|
|
while [ $i -ne $cpucount ]
|
|
do
|
|
V=$(cat "/sys/devices/system/cpu/cpu"$i"/thermal_throttle/core_throttle_count")
|
|
M=`expr $M + $V`
|
|
i=`expr $i + 1`
|
|
done
|
|
echo "$M"
|
|
exit
|
|
fi
|
|
if [ $OPTION = "--throttle-events" ]
|
|
then
|
|
M=$(journalctl --dmesg --boot --since=yesterday | grep "cpu clock throttled" | wc -l)
|
|
echo "$M"
|
|
exit
|
|
fi
|
|
if [ $OPTION = "--irqbalance" ]
|
|
then
|
|
M=$(ps -A |grep irqbalance)
|
|
echo "$M"
|
|
exit
|
|
fi
|
|
|
|
if [ $OPTION = "--install" ]
|
|
then
|
|
echo 'installing helpers...'
|
|
cp $0 /usr/bin/
|
|
echo 'installing policy...'
|
|
cp $(dirname "$(readlink -f "$0")")/konkor.cpufreq.policy /usr/share/polkit-1/actions/
|
|
echo 'installing fonts...'
|
|
mkdir -p /usr/share/fonts/truetype/cpufreq
|
|
cp $(dirname "$(readlink -f "$0")")/fonts/cpufreq.ttf /usr/share/fonts/truetype/cpufreq/
|
|
echo "done"
|
|
exit
|
|
fi
|
|
if [ $OPTION = "--update-fonts" ]
|
|
then
|
|
fc-cache -f
|
|
exit
|
|
fi
|
|
if [ $OPTION = "--uninstall" ]
|
|
then
|
|
echo 'uninstalling cpufreqctl helper...'
|
|
rm /usr/bin/cpufreqctl
|
|
echo 'uninstalling policy...'
|
|
rm /usr/share/polkit-1/actions/konkor.cpufreq.policy
|
|
echo 'uninstalling fonts...'
|
|
rm -rf /usr/share/fonts/truetype/cpufreq
|
|
echo "done"
|
|
exit
|
|
fi
|
|
if [ $OPTION = "--reset" ]
|
|
then
|
|
echo 'reset to default values...'
|
|
dconf reset -f "/org/gnome/shell/extensions/cpufreq/"
|
|
exit
|
|
fi
|