243 lines
4.5 KiB
Bash
243 lines
4.5 KiB
Bash
|
#!/bin/bash
|
||
|
# SPDX-License-Identifier: GPL-2.0
|
||
|
|
||
|
# protect against multiple inclusion
|
||
|
if [ $FILE_CPUFREQ ]; then
|
||
|
return 0
|
||
|
else
|
||
|
FILE_CPUFREQ=DONE
|
||
|
fi
|
||
|
|
||
|
source cpu.sh
|
||
|
|
||
|
|
||
|
# $1: cpu
|
||
|
cpu_should_have_cpufreq_directory()
|
||
|
{
|
||
|
if [ ! -d $CPUROOT/$1/cpufreq ]; then
|
||
|
printf "Warning: No cpufreq directory present for $1\n"
|
||
|
fi
|
||
|
}
|
||
|
|
||
|
cpu_should_not_have_cpufreq_directory()
|
||
|
{
|
||
|
if [ -d $CPUROOT/$1/cpufreq ]; then
|
||
|
printf "Warning: cpufreq directory present for $1\n"
|
||
|
fi
|
||
|
}
|
||
|
|
||
|
for_each_policy()
|
||
|
{
|
||
|
policies=$(ls $CPUFREQROOT| grep "policy[0-9].*")
|
||
|
for policy in $policies; do
|
||
|
$@ $policy
|
||
|
done
|
||
|
}
|
||
|
|
||
|
for_each_policy_concurrent()
|
||
|
{
|
||
|
policies=$(ls $CPUFREQROOT| grep "policy[0-9].*")
|
||
|
for policy in $policies; do
|
||
|
$@ $policy &
|
||
|
done
|
||
|
}
|
||
|
|
||
|
# $1: Path
|
||
|
read_cpufreq_files_in_dir()
|
||
|
{
|
||
|
local files=`ls $1`
|
||
|
|
||
|
printf "Printing directory: $1\n\n"
|
||
|
|
||
|
for file in $files; do
|
||
|
if [ -f $1/$file ]; then
|
||
|
printf "$file:"
|
||
|
cat $1/$file
|
||
|
else
|
||
|
printf "\n"
|
||
|
read_cpufreq_files_in_dir "$1/$file"
|
||
|
fi
|
||
|
done
|
||
|
printf "\n"
|
||
|
}
|
||
|
|
||
|
|
||
|
read_all_cpufreq_files()
|
||
|
{
|
||
|
printf "** Test: Running ${FUNCNAME[0]} **\n\n"
|
||
|
|
||
|
read_cpufreq_files_in_dir $CPUFREQROOT
|
||
|
|
||
|
printf "%s\n\n" "------------------------------------------------"
|
||
|
}
|
||
|
|
||
|
|
||
|
# UPDATE CPUFREQ FILES
|
||
|
|
||
|
# $1: directory path
|
||
|
update_cpufreq_files_in_dir()
|
||
|
{
|
||
|
local files=`ls $1`
|
||
|
|
||
|
printf "Updating directory: $1\n\n"
|
||
|
|
||
|
for file in $files; do
|
||
|
if [ -f $1/$file ]; then
|
||
|
# file is writable ?
|
||
|
local wfile=$(ls -l $1/$file | awk '$1 ~ /^.*w.*/ { print $NF; }')
|
||
|
|
||
|
if [ ! -z $wfile ]; then
|
||
|
# scaling_setspeed is a special file and we
|
||
|
# should skip updating it
|
||
|
if [ $file != "scaling_setspeed" ]; then
|
||
|
local val=$(cat $1/$file)
|
||
|
printf "Writing $val to: $file\n"
|
||
|
echo $val > $1/$file
|
||
|
fi
|
||
|
fi
|
||
|
else
|
||
|
printf "\n"
|
||
|
update_cpufreq_files_in_dir "$1/$file"
|
||
|
fi
|
||
|
done
|
||
|
|
||
|
printf "\n"
|
||
|
}
|
||
|
|
||
|
# Update all writable files with their existing values
|
||
|
update_all_cpufreq_files()
|
||
|
{
|
||
|
printf "** Test: Running ${FUNCNAME[0]} **\n\n"
|
||
|
|
||
|
update_cpufreq_files_in_dir $CPUFREQROOT
|
||
|
|
||
|
printf "%s\n\n" "------------------------------------------------"
|
||
|
}
|
||
|
|
||
|
|
||
|
# CHANGE CPU FREQUENCIES
|
||
|
|
||
|
# $1: policy
|
||
|
find_current_freq()
|
||
|
{
|
||
|
cat $CPUFREQROOT/$1/scaling_cur_freq
|
||
|
}
|
||
|
|
||
|
# $1: policy
|
||
|
# $2: frequency
|
||
|
set_cpu_frequency()
|
||
|
{
|
||
|
printf "Change frequency for $1 to $2\n"
|
||
|
echo $2 > $CPUFREQROOT/$1/scaling_setspeed
|
||
|
}
|
||
|
|
||
|
# $1: policy
|
||
|
test_all_frequencies()
|
||
|
{
|
||
|
local filepath="$CPUFREQROOT/$1"
|
||
|
|
||
|
backup_governor $1
|
||
|
|
||
|
local found=$(switch_governor $1 "userspace")
|
||
|
if [ $found = 1 ]; then
|
||
|
printf "${FUNCNAME[0]}: userspace governor not available for: $1\n"
|
||
|
return;
|
||
|
fi
|
||
|
|
||
|
printf "Switched governor for $1 to userspace\n\n"
|
||
|
|
||
|
local freqs=$(cat $filepath/scaling_available_frequencies)
|
||
|
printf "Available frequencies for $1: $freqs\n\n"
|
||
|
|
||
|
# Set all frequencies one-by-one
|
||
|
for freq in $freqs; do
|
||
|
set_cpu_frequency $1 $freq
|
||
|
done
|
||
|
|
||
|
printf "\n"
|
||
|
|
||
|
restore_governor $1
|
||
|
}
|
||
|
|
||
|
# $1: loop count
|
||
|
shuffle_frequency_for_all_cpus()
|
||
|
{
|
||
|
printf "** Test: Running ${FUNCNAME[0]} for $1 loops **\n\n"
|
||
|
|
||
|
for i in `seq 1 $1`; do
|
||
|
for_each_policy test_all_frequencies
|
||
|
done
|
||
|
printf "\n%s\n\n" "------------------------------------------------"
|
||
|
}
|
||
|
|
||
|
# Basic cpufreq tests
|
||
|
cpufreq_basic_tests()
|
||
|
{
|
||
|
printf "*** RUNNING CPUFREQ SANITY TESTS ***\n"
|
||
|
printf "====================================\n\n"
|
||
|
|
||
|
count=$(count_cpufreq_managed_cpus)
|
||
|
if [ $count = 0 ]; then
|
||
|
printf "No cpu is managed by cpufreq core, exiting\n"
|
||
|
exit;
|
||
|
else
|
||
|
printf "CPUFreq manages: $count CPUs\n\n"
|
||
|
fi
|
||
|
|
||
|
# Detect & print which CPUs are not managed by cpufreq
|
||
|
print_unmanaged_cpus
|
||
|
|
||
|
# read/update all cpufreq files
|
||
|
read_all_cpufreq_files
|
||
|
update_all_cpufreq_files
|
||
|
|
||
|
# hotplug cpus
|
||
|
reboot_cpus 5
|
||
|
|
||
|
# Test all frequencies
|
||
|
shuffle_frequency_for_all_cpus 2
|
||
|
|
||
|
# Test all governors
|
||
|
shuffle_governors_for_all_cpus 1
|
||
|
}
|
||
|
|
||
|
# Suspend/resume
|
||
|
# $1: "suspend" or "hibernate", $2: loop count
|
||
|
do_suspend()
|
||
|
{
|
||
|
printf "** Test: Running ${FUNCNAME[0]}: Trying $1 for $2 loops **\n\n"
|
||
|
|
||
|
# Is the directory available
|
||
|
if [ ! -d $SYSFS/power/ -o ! -f $SYSFS/power/state ]; then
|
||
|
printf "$SYSFS/power/state not available\n"
|
||
|
return 1
|
||
|
fi
|
||
|
|
||
|
if [ $1 = "suspend" ]; then
|
||
|
filename="mem"
|
||
|
elif [ $1 = "hibernate" ]; then
|
||
|
filename="disk"
|
||
|
else
|
||
|
printf "$1 is not a valid option\n"
|
||
|
return 1
|
||
|
fi
|
||
|
|
||
|
if [ -n $filename ]; then
|
||
|
present=$(cat $SYSFS/power/state | grep $filename)
|
||
|
|
||
|
if [ -z "$present" ]; then
|
||
|
printf "Tried to $1 but $filename isn't present in $SYSFS/power/state\n"
|
||
|
return 1;
|
||
|
fi
|
||
|
|
||
|
for i in `seq 1 $2`; do
|
||
|
printf "Starting $1\n"
|
||
|
echo $filename > $SYSFS/power/state
|
||
|
printf "Came out of $1\n"
|
||
|
|
||
|
printf "Do basic tests after finishing $1 to verify cpufreq state\n\n"
|
||
|
cpufreq_basic_tests
|
||
|
done
|
||
|
fi
|
||
|
}
|