#!/bin/sh # $Id: cpufreq,v 1.7 2018/02/01 02:10:23 friedman Exp $ # Display current frequency values, or set new thresholds initialize() { sys=/sys/devices/system/cpu # These are the min/max values which the core is capable of. read cpuinfo_min_freq < $sys/cpu0/cpufreq/cpuinfo_min_freq read cpuinfo_max_freq < $sys/cpu0/cpufreq/cpuinfo_max_freq read scaling_min_freq < $sys/cpu0/cpufreq/scaling_min_freq read scaling_max_freq < $sys/cpu0/cpufreq/scaling_max_freq read scaling_available_frequencies < $sys/cpu0/cpufreq/scaling_available_frequencies read scaling_available_governors < $sys/cpu0/cpufreq/scaling_available_governors read scaling_governor < $sys/cpu0/cpufreq/scaling_governor read scaling_driver < $sys/cpu0/cpufreq/scaling_driver } display_cur_freq() { local kind=${1-scaling} local i=0 local f=0 local sum=0 while :; do local cpufreq=$sys/cpu$i/cpufreq test -d $cpufreq || break test -r $cpufreq/${kind}_cur_freq || return 1 read f < $cpufreq/${kind}_cur_freq echo "${kind}_cur_freq[$i]=$f" sum=$((sum + f)) i=$((i + 1)) done test $i -eq 0 && return 1 eval ${kind}_avg_freq=$((sum / i)) return 0 } display_cpuinfo_avg_freq() { case $cpuinfo_avg_freq in '' ) display_cur_freq cpuinfo > /dev/null ;; esac case $cpuinfo_avg_freq in '' ) return ;; esac echo cpuinfo_avg_freq=$cpuinfo_avg_freq } display_scaling_avg_freq() { case $scaling_avg_freq in '' ) display_cur_freq scaling > /dev/null ;; esac case $scaling_avg_freq in '' ) return ;; esac echo scaling_avg_freq=$scaling_avg_freq } display_all() { echo cpuinfo_min_freq=$cpuinfo_min_freq echo cpuinfo_max_freq=$cpuinfo_max_freq display_cur_freq cpuinfo display_cpuinfo_avg_freq echo echo scaling_min_freq=$scaling_min_freq echo scaling_max_freq=$scaling_max_freq display_cur_freq scaling display_scaling_avg_freq case $scaling_available_frequencies in '' ) : ;; * ) echo echo scaling_available=$scaling_available_frequencies ;; esac echo echo governor_avail=$scaling_available_governors echo governor_curre=$scaling_governor echo scaling_driver=$scaling_driver } check_avail() { case " $scaling_available_frequencies " in *" $1 "* ) return 0 ;; esac echo Available frequencies: $scaling_available_frequencies 1>&2 exit 1 } set_freq() { param=$1 new=$2 case $new in $cpuinfo_min_freq ) : ;; $cpuinfo_max_freq ) : ;; * ) check_avail $new ;; esac for cpu in $sys/cpu*/cpufreq ; do echo $new > $cpu/$param || return $? done echo $param=$new } min() { case $1 in '' ) echo $scaling_min_freq ;; min ) set_freq scaling_min_freq $cpuinfo_min_freq ;; max ) set_freq scaling_min_freq $cpuinfo_max_freq ;; * ) set_freq scaling_min_freq $1 ;; esac } max() { case $1 in '' ) echo $scaling_max_freq ;; min ) set_freq scaling_max_freq $cpuinfo_min_freq ;; max ) set_freq scaling_max_freq $cpuinfo_max_freq ;; * ) set_freq scaling_max_freq $1 ;; esac } usage() { usage="Usage: ${0##*/} {options} Options are: -h, --help This help. -a, --all Display all cpu frequency parameters --min {freq} Display current min frequency, or set it. --max {freq} Display current max frequency, or set it. --avail Display available frequencies. The optional frequency parameter to \`--min' and \`--max' can be the literals \"min\" or \"max\" to indicate the minimum or maximum possible frequency, respectively." echo "$usage" exit 0 } main() { initialize 2> /dev/null case $1 in --* ) x=${1#--} ; shift ; set x "$x" "$@" ; shift ;; -* ) x=${1#-} ; shift ; set x "$x" "$@" ; shift ;; esac case $1:$2 in h:* | h*:* ) usage ;; a:* | all:* ) display_all ;; avail*:* ) echo $scaling_available_frequencies ;; : ) display_cpuinfo_avg_freq display_scaling_avg_freq : ;; min:* ) min $2 ;; max:* ) max $2 ;; [0-9]*: ) max $1 ;; esac } main "$@" # eof