123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198 |
- #!/bin/bash
- # SPDX-License-Identifier: GPL-2.0
- source cpu.sh
- source cpufreq.sh
- source governor.sh
- source module.sh
- source special-tests.sh
- FUNC=basic # do basic tests by default
- OUTFILE=cpufreq_selftest
- SYSFS=
- CPUROOT=
- CPUFREQROOT=
- # Kselftest framework requirement - SKIP code is 4.
- ksft_skip=4
- 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,
- 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 2
- }
- prerequisite()
- {
- msg="skip all tests:"
- if [ $UID != 0 ]; then
- echo $msg must be run as root >&2
- exit $ksft_skip
- fi
- taskset -p 01 $$
- SYSFS=`mount -t sysfs | head -1 | awk '{ print $3 }'`
- if [ ! -d "$SYSFS" ]; then
- echo $msg sysfs is not mounted >&2
- exit 2
- fi
- CPUROOT=$SYSFS/devices/system/cpu
- CPUFREQROOT="$CPUROOT/cpufreq"
- if ! ls $CPUROOT/cpu* > /dev/null 2>&1; then
- echo $msg cpus not available in sysfs >&2
- exit 2
- fi
- if ! ls $CPUROOT/cpufreq > /dev/null 2>&1; then
- echo $msg cpufreq directory not available in sysfs >&2
- exit 2
- 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, 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
- echo "No cpu is managed by cpufreq core, exiting"
- exit 2;
- fi
- case "$FUNC" in
- "basic")
- cpufreq_basic_tests
- ;;
- "suspend")
- do_suspend "suspend" 1
- ;;
- "hibernate")
- do_suspend "hibernate" 1
- ;;
- "modtest")
- # Do we have modules in place?
- if [ -z $DRIVER_MOD ] && [ -z $GOVERNOR_MOD ]; then
- echo "No driver or governor module passed with -d or -g"
- exit 2;
- 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
- echo "No cpu is managed by cpufreq core, exiting"
- exit 2;
- fi
- module_governor_test $GOVERNOR_MOD
- fi
- ;;
- "sptest1")
- simple_lockdep
- ;;
- "sptest2")
- concurrent_lockdep
- ;;
- "sptest3")
- governor_race
- ;;
- "sptest4")
- hotplug_with_updates
- ;;
- *)
- echo "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
- }
- # Parse arguments
- parse_arguments $@
- # Make sure all requirements are met
- prerequisite
- # Run requested functions
- clear_dumps $OUTFILE
- do_test | tee -a $OUTFILE.txt
- dmesg_dumps $OUTFILE
|