linux/tools/testing/selftests/cpufreq/main.sh
Shreeya Patel 0b631ed3ce kselftest: cpufreq: Add RTC wakeup alarm
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>
2024-07-31 11:42:36 -06:00

219 lines
4.1 KiB
Bash
Executable File

#!/bin/bash
# SPDX-License-Identifier: GPL-2.0
source cpu.sh
source cpufreq.sh
source governor.sh
source module.sh
source special-tests.sh
DIR="$(dirname $(readlink -f "$0"))"
source "${DIR}"/../kselftest/ktap_helpers.sh
FUNC=basic # do basic tests by default
OUTFILE=cpufreq_selftest
SYSFS=
CPUROOT=
CPUFREQROOT=
helpme()
{
printf "Usage: $0 [-h] [-todg args]
[-h <help>]
[-o <output-file-for-dump>]
[-t <basic: Basic cpufreq testing
suspend: suspend/resume,
hibernate: hibernate/resume,
suspend_rtc: suspend/resume back using the RTC wakeup alarm,
hibernate_rtc: hibernate/resume back using the RTC wakeup alarm,
modtest: test driver or governor modules. Only to be used with -d or -g options,
sptest1: Simple governor switch to produce lockdep.
sptest2: Concurrent governor switch to produce lockdep.
sptest3: Governor races, shuffle between governors quickly.
sptest4: CPU hotplugs with updates to cpufreq files.>]
[-d <driver's module name: only with \"-t modtest>\"]
[-g <governor's module name: only with \"-t modtest>\"]
\n"
exit "${KSFT_FAIL}"
}
prerequisite()
{
msg="skip all tests:"
if [ $UID != 0 ]; then
ktap_skip_all "$msg must be run as root"
exit "${KSFT_SKIP}"
fi
taskset -p 01 $$
SYSFS=`mount -t sysfs | head -1 | awk '{ print $3 }'`
if [ ! -d "$SYSFS" ]; then
ktap_skip_all "$msg sysfs is not mounted"
exit "${KSFT_SKIP}"
fi
CPUROOT=$SYSFS/devices/system/cpu
CPUFREQROOT="$CPUROOT/cpufreq"
if ! ls $CPUROOT/cpu* > /dev/null 2>&1; then
ktap_skip_all "$msg cpus not available in sysfs"
exit "${KSFT_SKIP}"
fi
if ! ls $CPUROOT/cpufreq > /dev/null 2>&1; then
ktap_skip_all "$msg cpufreq directory not available in sysfs"
exit "${KSFT_SKIP}"
fi
}
parse_arguments()
{
while getopts ht:o:d:g: arg
do
case $arg in
h) # --help
helpme
;;
t) # --func_type (Function to perform: basic, suspend, hibernate,
# suspend_rtc, hibernate_rtc, modtest, sptest1/2/3/4 (default: basic))
FUNC=$OPTARG
;;
o) # --output-file (Output file to store dumps)
OUTFILE=$OPTARG
;;
d) # --driver-mod-name (Name of the driver module)
DRIVER_MOD=$OPTARG
;;
g) # --governor-mod-name (Name of the governor module)
GOVERNOR_MOD=$OPTARG
;;
\?)
helpme
;;
esac
done
}
do_test()
{
# Check if CPUs are managed by cpufreq or not
count=$(count_cpufreq_managed_cpus)
if [ $count = 0 -a $FUNC != "modtest" ]; then
ktap_exit_fail_msg "No cpu is managed by cpufreq core, exiting"
fi
case "$FUNC" in
"basic")
cpufreq_basic_tests
;;
"suspend")
do_suspend "suspend" 1
;;
"hibernate")
do_suspend "hibernate" 1
;;
"suspend_rtc")
do_suspend "suspend" 1 rtc
;;
"hibernate_rtc")
do_suspend "hibernate" 1 rtc
;;
"modtest")
# Do we have modules in place?
if [ -z $DRIVER_MOD ] && [ -z $GOVERNOR_MOD ]; then
ktap_exit_fail_msg "No driver or governor module passed with -d or -g"
fi
if [ $DRIVER_MOD ]; then
if [ $GOVERNOR_MOD ]; then
module_test $DRIVER_MOD $GOVERNOR_MOD
else
module_driver_test $DRIVER_MOD
fi
else
if [ $count = 0 ]; then
ktap_exit_fail_msg "No cpu is managed by cpufreq core, exiting"
fi
module_governor_test $GOVERNOR_MOD
fi
;;
"sptest1")
simple_lockdep
;;
"sptest2")
concurrent_lockdep
;;
"sptest3")
governor_race
;;
"sptest4")
hotplug_with_updates
;;
*)
ktap_print_msg "Invalid [-f] function type"
helpme
;;
esac
}
# clear dumps
# $1: file name
clear_dumps()
{
echo "" > $1.txt
echo "" > $1.dmesg_cpufreq.txt
echo "" > $1.dmesg_full.txt
}
# $1: output file name
dmesg_dumps()
{
dmesg | grep cpufreq >> $1.dmesg_cpufreq.txt
# We may need the full logs as well
dmesg >> $1.dmesg_full.txt
}
ktap_print_header
# Parse arguments
parse_arguments $@
ktap_set_plan 1
# Make sure all requirements are met
prerequisite
# Run requested functions
clear_dumps $OUTFILE
do_test | tee -a $OUTFILE.txt
if [ "${PIPESTATUS[0]}" -ne 0 ]; then
exit ${PIPESTATUS[0]};
fi
dmesg_dumps $OUTFILE
ktap_test_pass "Completed successfully"
ktap_print_totals
exit "${KSFT_PASS}"