| #!/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= | |
| 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 2 | |
| 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 >> $OUTFILE.txt | |
| dmesg_dumps $OUTFILE |