mirror of
https://github.com/raspberrypi/linux.git
synced 2025-12-22 17:52:09 +00:00
Add RTC wakeup alarm for devices to resume after specific time interval. This improvement in the test will help in enabling this test in the CI systems and will eliminate the need of manual intervention for resuming back the devices after suspend/hibernation. Signed-off-by: Shreeya Patel <shreeya.patel@collabora.com> Acked-by: Viresh Kumar <viresh.kumar@linaro.org> Signed-off-by: Shuah Khan <skhan@linuxfoundation.org>
257 lines
4.8 KiB
Bash
Executable File
257 lines
4.8 KiB
Bash
Executable File
#!/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
|
|
ktap_exit_fail_msg "No cpu is managed by cpufreq core, exiting\n"
|
|
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"
|
|
|
|
if [ "$3" = "rtc" ]; then
|
|
if ! command -v rtcwake &> /dev/null; then
|
|
printf "rtcwake could not be found, please install it.\n"
|
|
return 1
|
|
fi
|
|
|
|
rtcwake -m $filename -s 15
|
|
|
|
if [ $? -ne 0 ]; then
|
|
printf "Failed to suspend using RTC wake alarm\n"
|
|
return 1
|
|
fi
|
|
fi
|
|
|
|
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
|
|
}
|