#!/bin/bash # protect against multiple inclusion if [ $FILE_CPUFREQ ]; then return 0 else FILE_CPUFREQ=DONE fi source cpu.sh # GLOBALS CPU_PATH="/sys/devices/system/cpu" GLOBAL_CPUFREQ="/sys/devices/system/cpu/cpufreq" # GENERIC HELPERS # $1: cpu cpu_should_have_cpufreq_directory() { if [ ! -d /sys/devices/system/cpu/$1/cpufreq ]; then echo "Warning: No cpufreq directory present for $1" fi } cpu_should_not_have_cpufreq_directory() { if [ -d /sys/devices/system/cpu/$1/cpufreq ]; then echo "Warning: cpufreq directory present for $1" fi } # READ CPUFREQ FILES # $1: directory path __read_cpufreq_files() { local filepath=$1 # Exit if cpu isn't mananged by cpufreq core if [ ! -d $filepath ]; then return; fi local files=`ls $filepath` echo "Printing directory: $filepath" echo "" for file in $files; do if [ -f $filepath/$file ]; then echo "$file:" cat $filepath/$file else echo "" __read_cpufreq_files "$filepath/$file" fi done echo "" } # $1: directory path # $2: cpu read_cpufreq_files_for_cpu() { local filepath=$CPU_PATH/$2/$1 __read_cpufreq_files $filepath } read_all_cpufreq_files() { echo "** Test: Running ${FUNCNAME[0]} **" echo "" __read_cpufreq_files $GLOBAL_CPUFREQ echo "" for_each_cpu read_cpufreq_files_for_cpu "cpufreq" echo "------------------------------------------------" echo "" } # UPDATE CPUFREQ FILES # $1: directory path __update_cpufreq_files() { local filepath=$1 # Exit if cpu isn't mananged by cpufreq core if [ ! -d $filepath ]; then return; fi local files=`ls $filepath` echo "Updating directory: $filepath" echo "" for file in $files; do if [ -f $filepath/$file ]; then # file is writable ? local wfile=$(ls -l $filepath/$file | awk '$1 ~ /^.*w.*/ { print $NF; }') if [ ! -z $wfile ]; then # scaling_setspeed is a special file and so we # should just skip it if [ $file != "scaling_setspeed" ]; then local val=$(cat $filepath/$file) echo "Writing $val to: $file" echo $val > $filepath/$file fi fi else echo "" __update_cpufreq_files "$filepath/$file" fi done echo "" } # $1: directory path # $2: cpu update_cpufreq_files_for_cpu() { local filepath=$CPU_PATH/$2/$1 __update_cpufreq_files $filepath } # Update all writable files with their existing values update_all_cpufreq_files() { echo "** Test: Running ${FUNCNAME[0]} **" echo "" __update_cpufreq_files $GLOBAL_CPUFREQ echo "" for_each_cpu update_cpufreq_files_for_cpu "cpufreq" echo "------------------------------------------------" echo "" } # CHANGE CPU FREQUENCIES # $1: cpu # $2: frequency set_cpu_frequency() { echo $2 > $CPU_PATH/$1/cpufreq/scaling_setspeed } # $1: cpu test_all_cpu_frequencies() { local filepath="$CPU_PATH/$1/cpufreq" # Exit if cpu isn't mananged by cpufreq core if [ ! -d $filepath ]; then return; fi local found=$(switch_governor $1 "userspace") if [ $found = 1 ]; then echo "${FUNCNAME[0]}: userspace governor not available for: $1" return; else echo "Switching governor for $1 to userspace" fi local freqs=$(cat $filepath/scaling_available_frequencies) echo "Available frequencies for $1: $freqs" # Set all frequencies one-by-one for freq in $freqs; do set_cpu_frequency $1 $freq done } # $1: loop count shuffle_frequency_for_all_cpus() { echo "** Test: Running ${FUNCNAME[0]} for $1 loops **" echo "" for i in `seq 1 $1`; do for_each_cpu test_all_cpu_frequencies done echo "------------------------------------------------" echo "" } # clear dumps # $1: file name clear_dumps() { echo "" > $1.txt echo "" > $1.cpufreq.txt echo "" > $1.full.txt } # $1: output file name dmesg_dumps() { dmesg | grep cpufreq >> $1.cpufreq.txt # We may need the full logs as well dmesg --read-clear >> $1.full.txt } # Basic cpufreq tests cpufreq_basic_tests() { echo "*** RUNNING CPUFREQ SANITY TESTS ***" echo "====================================" echo "" count=$(count_cpufreq_managed_cpus) if [ $count = 0 ]; then echo "No cpu is managed by cpufreq core, exiting" exit; else echo "CPUFreq manages: $count CPUs" echo "" fi # Detect & print which CPUs aren't managed by cpufreq print_unmanaged_cpus # read/update all cpufreq files read_all_cpufreq_files update_all_cpufreq_files # hotplug cpus hotplug_1_by_1 5 hotplug_together 5 # Test all governors shuffle_governors_for_all_cpus 1 # Test all frequencies shuffle_frequency_for_all_cpus 2 } # Suspend/resume # $1: "suspend" or "hibernate", $2: loop count do_suspend() { echo "** Test: Running ${FUNCNAME[0]}: Trying $1 for $2 loops **" echo "" # Is the directory available if [ ! -d /sys/power/ -o ! -f /sys/power/state ]; then echo "/sys/power/state not available" return 1 fi if [ $1 = "suspend" ]; then filename="mem" elif [ $1 = "hibernate" ]; then filename="disk" fi if [ -n $filename ]; then present=$(cat /sys/power/state | grep $filename) if [ -z "$present" ]; then echo "Tried to $1 but $filename isn't present in /sys/power/state" return 1; else for i in `seq 1 $2`; do echo "Starting $1" echo $filename > /sys/power/state echo "Came out of $1" echo "Do basic tests after finishing $1 to verify cpufreq state" echo "" cpufreq_basic_tests done fi fi echo "------------------------------------------------" echo "" }