From d4ecfcdfcb15f352a7cfdd256c1f7c94e393ba11 Mon Sep 17 00:00:00 2001 From: Riyyi Date: Fri, 10 Sep 2021 10:52:07 +0200 Subject: [PATCH] Scripts: Add scaling governor to cpuctl --- .local/bin/cpuctl | 112 +++++++++++++++++++++++++++++++++------------- 1 file changed, 81 insertions(+), 31 deletions(-) diff --git a/.local/bin/cpuctl b/.local/bin/cpuctl index 93ab6ee..c8974a2 100755 --- a/.local/bin/cpuctl +++ b/.local/bin/cpuctl @@ -14,19 +14,26 @@ ${b}NAME${n} cpuctl - control the processor characteristics ${b}SYNOPSIS${n} - ${b}cpuctl${n} ${u}OPTION${n} [${u}ARG${n}] + ${b}cpuctl${n} ${u}OPERATION${n} [${u}OPTION${n}] [${u}ARG${n}] + +${b}OPERATIONS${n} + ${b}-E${n}, ${b}--energy${n} + Perform ${u}OPTION${n} on energy performance mode. + + ${b}-G${n}, ${b}--governor${n} + Perform ${u}OPTION${n} on scaling governor. -${b}OPTIONS${n} ${b}-h${n}, ${b}--help${n} Display usage message and exit. +${b}OPTIONS (APPLY TO -E or -G)${n} ${b}-l${n}, ${b}--list${n} - List the available energy performance modes. + List the available items. ${b}-g${n}, ${b}--get${n} - Get the energy performance mode. + Get the current item. - ${b}-s${n}[${u}MODE${n}], ${b}--set [${n}${u}MODE${n}] - Set the energy performance to ${U}MODE${N}, asks for the mode if left empty. + ${b}-s${n}[${u}ITEM${n}], ${b}--set [${n}${u}ITEM${n}] + Set the ${u}ITEM${n}, prompt for ${u}ITEM${n} if left empty. EOF } @@ -36,36 +43,54 @@ EOF # Main program # -------------------------------------- -listModes() +listItems() { - modes="/sys/devices/system/cpu/cpufreq/policy0/energy_performance_available_preferences" + if [ "$mode" = "energy" ]; then + modes="/sys/devices/system/cpu/cpufreq/policy0/energy_performance_available_preferences" + elif [ "$mode" = "governor" ]; then + modes="/sys/devices/system/cpu/cpufreq/policy0/scaling_available_governors" + fi + tr ' ' '\n' < "$modes" | sed '/^$/d' \ | awk -v line="$1" '{ if (line == "") print NR") "$0; else if (NR == line) print $0; }' } -getMode() +getItem() { - mode="/sys/devices/system/cpu/cpufreq/policy0/energy_performance_preference" + if [ "$mode" = "energy" ]; then + mode="/sys/devices/system/cpu/cpufreq/policy0/energy_performance_preference" + elif [ "$mode" = "governor" ]; then + mode="/sys/devices/system/cpu/cpufreq/policy0/scaling_governor" + fi + cat "$mode" } -setMode() +setItem() { - option="$1" - if [ -z "$option" ]; then - listModes + select="$1" + if [ -z "$select" ]; then + listItems printf "Enter the number to set: " - read -r option + read -r select + fi + item="$(listItems "$select")" + + if [ "$mode" = "energy" ]; then + message="energy performance mode" + type="/sys/devices/system/cpu/cpufreq/policy*/energy_performance_preference" + elif [ "$mode" = "governor" ]; then + message="scaling governor" + type="/sys/devices/system/cpu/cpufreq/policy*/scaling_governor" fi - mode="$(listModes "$option")" if ! sudo -v; then - echo "${b}${red}Error:${n} setting energy performance mode requires root privileges." >&2 + echo "${b}${red}Error:${n} setting $message requires root privileges." >&2 exit 1 fi - for i in /sys/devices/system/cpu/cpufreq/policy*/energy_performance_preference; do - echo "$mode" | sudo tee "$i" > /dev/null + for i in $type; do + echo "$item" | sudo tee "$i" > /dev/null done } @@ -73,7 +98,9 @@ setMode() # -------------------------------------- script="$(basename "$0")" -parsed="$(getopt --options "hlgs::" --longoptions "help,list,get,set::" -n "$script" -- "$@" 2>&1)" +parsed="$(getopt --options "hEGlgs::" \ + --longoptions "help,energy,governor,list,get,set::" \ + -n "$script" -- "$@" 2>&1)" result="$?" # Exit if invalid option is provided @@ -91,6 +118,22 @@ while true; do help exit ;; + -E | --energy) + if [ -n "$mode" ]; then + echo "${b}${red}Error:${n} only one operation may be used at a time." >&2 + exit 1 + fi + mode="energy" + shift + ;; + -G | --governor) + if [ -n "$mode" ]; then + echo "${b}${red}Error:${n} only one operation may be used at a time." >&2 + exit 1 + fi + mode="governor" + shift + ;; -l | --list) option="list" shift @@ -116,14 +159,21 @@ done # Execute # -------------------------------------- -case "$option" in - list) - listModes - ;; - get) - getMode - ;; - set) - setMode "$1" - ;; -esac +if [ -z "$mode" ]; then + echo "${b}${red}Error:${n} no operation specified (use -h for help)" >&2 + exit 1 +fi + +if [ "$mode" = "energy" ] || [ "$mode" = "governor" ]; then + case "$option" in + list | "") + listItems + ;; + get) + getItem + ;; + set) + setItem "$1" + ;; + esac +fi