Path: blob/master/tools/testing/selftests/cpufreq/cpufreq.sh
26302 views
#!/bin/bash1# SPDX-License-Identifier: GPL-2.023# protect against multiple inclusion4if [ $FILE_CPUFREQ ]; then5return 06else7FILE_CPUFREQ=DONE8fi910source cpu.sh111213# $1: cpu14cpu_should_have_cpufreq_directory()15{16if [ ! -d $CPUROOT/$1/cpufreq ]; then17printf "Warning: No cpufreq directory present for $1\n"18fi19}2021cpu_should_not_have_cpufreq_directory()22{23if [ -d $CPUROOT/$1/cpufreq ]; then24printf "Warning: cpufreq directory present for $1\n"25fi26}2728for_each_policy()29{30policies=$(ls $CPUFREQROOT| grep "policy[0-9].*")31for policy in $policies; do32$@ $policy33done34}3536for_each_policy_concurrent()37{38policies=$(ls $CPUFREQROOT| grep "policy[0-9].*")39for policy in $policies; do40$@ $policy &41done42}4344# $1: Path45read_cpufreq_files_in_dir()46{47local files=`ls $1`4849printf "Printing directory: $1\n\n"5051for file in $files; do52if [ -f $1/$file ]; then53printf "$file:"54#file is readable ?55local rfile=$(ls -l $1/$file | awk '$1 ~ /^.*r.*/ { print $NF; }')5657if [ ! -z $rfile ]; then58cat $1/$file59else60printf "$file is not readable\n"61fi62else63printf "\n"64read_cpufreq_files_in_dir "$1/$file"65fi66done67printf "\n"68}697071read_all_cpufreq_files()72{73printf "** Test: Running ${FUNCNAME[0]} **\n\n"7475read_cpufreq_files_in_dir $CPUFREQROOT7677printf "%s\n\n" "------------------------------------------------"78}798081# UPDATE CPUFREQ FILES8283# $1: directory path84update_cpufreq_files_in_dir()85{86local files=`ls $1`8788printf "Updating directory: $1\n\n"8990for file in $files; do91if [ -f $1/$file ]; then92# file is readable and writable ?93local rwfile=$(ls -l $1/$file | awk '$1 ~ /^.*rw.*/ { print $NF; }')9495if [ ! -z $rwfile ]; then96# scaling_setspeed is a special file and we97# should skip updating it98if [ $file != "scaling_setspeed" ]; then99local val=$(cat $1/$file)100printf "Writing $val to: $file\n"101echo $val > $1/$file102fi103fi104else105printf "\n"106update_cpufreq_files_in_dir "$1/$file"107fi108done109110printf "\n"111}112113# Update all writable files with their existing values114update_all_cpufreq_files()115{116printf "** Test: Running ${FUNCNAME[0]} **\n\n"117118update_cpufreq_files_in_dir $CPUFREQROOT119120printf "%s\n\n" "------------------------------------------------"121}122123124# CHANGE CPU FREQUENCIES125126# $1: policy127find_current_freq()128{129cat $CPUFREQROOT/$1/scaling_cur_freq130}131132# $1: policy133# $2: frequency134set_cpu_frequency()135{136printf "Change frequency for $1 to $2\n"137echo $2 > $CPUFREQROOT/$1/scaling_setspeed138}139140# $1: policy141test_all_frequencies()142{143local filepath="$CPUFREQROOT/$1"144145backup_governor $1146147local found=$(switch_governor $1 "userspace")148if [ $found = 1 ]; then149printf "${FUNCNAME[0]}: userspace governor not available for: $1\n"150return;151fi152153printf "Switched governor for $1 to userspace\n\n"154155local freqs=$(cat $filepath/scaling_available_frequencies)156printf "Available frequencies for $1: $freqs\n\n"157158# Set all frequencies one-by-one159for freq in $freqs; do160set_cpu_frequency $1 $freq161done162163printf "\n"164165restore_governor $1166}167168# $1: loop count169shuffle_frequency_for_all_cpus()170{171printf "** Test: Running ${FUNCNAME[0]} for $1 loops **\n\n"172173for i in `seq 1 $1`; do174for_each_policy test_all_frequencies175done176printf "\n%s\n\n" "------------------------------------------------"177}178179# Basic cpufreq tests180cpufreq_basic_tests()181{182printf "*** RUNNING CPUFREQ SANITY TESTS ***\n"183printf "====================================\n\n"184185count=$(count_cpufreq_managed_cpus)186if [ $count = 0 ]; then187ktap_exit_fail_msg "No cpu is managed by cpufreq core, exiting\n"188else189printf "CPUFreq manages: $count CPUs\n\n"190fi191192# Detect & print which CPUs are not managed by cpufreq193print_unmanaged_cpus194195# read/update all cpufreq files196read_all_cpufreq_files197update_all_cpufreq_files198199# hotplug cpus200reboot_cpus 5201202# Test all frequencies203shuffle_frequency_for_all_cpus 2204205# Test all governors206shuffle_governors_for_all_cpus 1207}208209# Suspend/resume210# $1: "suspend" or "hibernate", $2: loop count211do_suspend()212{213printf "** Test: Running ${FUNCNAME[0]}: Trying $1 for $2 loops **\n\n"214215# Is the directory available216if [ ! -d $SYSFS/power/ -o ! -f $SYSFS/power/state ]; then217printf "$SYSFS/power/state not available\n"218return 1219fi220221if [ $1 = "suspend" ]; then222filename="mem"223elif [ $1 = "hibernate" ]; then224filename="disk"225else226printf "$1 is not a valid option\n"227return 1228fi229230if [ -n $filename ]; then231present=$(cat $SYSFS/power/state | grep $filename)232233if [ -z "$present" ]; then234printf "Tried to $1 but $filename isn't present in $SYSFS/power/state\n"235return 1;236fi237238for i in `seq 1 $2`; do239printf "Starting $1\n"240241if [ "$3" = "rtc" ]; then242if ! command -v rtcwake &> /dev/null; then243printf "rtcwake could not be found, please install it.\n"244return 1245fi246247rtcwake -m $filename -s 15248249if [ $? -ne 0 ]; then250printf "Failed to suspend using RTC wake alarm\n"251return 1252fi253else254echo $filename > $SYSFS/power/state255fi256257printf "Came out of $1\n"258259printf "Do basic tests after finishing $1 to verify cpufreq state\n\n"260cpufreq_basic_tests261done262fi263}264265266