^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) #!/bin/bash
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) # SPDX-License-Identifier: GPL-2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) source cpu.sh
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) source cpufreq.sh
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) source governor.sh
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) source module.sh
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) source special-tests.sh
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) FUNC=basic # do basic tests by default
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) OUTFILE=cpufreq_selftest
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) SYSFS=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) CPUROOT=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) CPUFREQROOT=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) # Kselftest framework requirement - SKIP code is 4.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) ksft_skip=4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) helpme()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) printf "Usage: $0 [-h] [-todg args]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) [-h <help>]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) [-o <output-file-for-dump>]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) [-t <basic: Basic cpufreq testing
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) suspend: suspend/resume,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) hibernate: hibernate/resume,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) modtest: test driver or governor modules. Only to be used with -d or -g options,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) sptest1: Simple governor switch to produce lockdep.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) sptest2: Concurrent governor switch to produce lockdep.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) sptest3: Governor races, shuffle between governors quickly.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) sptest4: CPU hotplugs with updates to cpufreq files.>]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) [-d <driver's module name: only with \"-t modtest>\"]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) [-g <governor's module name: only with \"-t modtest>\"]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) \n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) exit 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) prerequisite()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) msg="skip all tests:"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) if [ $UID != 0 ]; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) echo $msg must be run as root >&2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) exit $ksft_skip
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) taskset -p 01 $$
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) SYSFS=`mount -t sysfs | head -1 | awk '{ print $3 }'`
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) if [ ! -d "$SYSFS" ]; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) echo $msg sysfs is not mounted >&2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) exit 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) CPUROOT=$SYSFS/devices/system/cpu
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) CPUFREQROOT="$CPUROOT/cpufreq"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) if ! ls $CPUROOT/cpu* > /dev/null 2>&1; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) echo $msg cpus not available in sysfs >&2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) exit 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) if ! ls $CPUROOT/cpufreq > /dev/null 2>&1; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) echo $msg cpufreq directory not available in sysfs >&2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) exit 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) parse_arguments()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) while getopts ht:o:d:g: arg
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) do
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) case $arg in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) h) # --help
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) helpme
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) ;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) t) # --func_type (Function to perform: basic, suspend, hibernate, modtest, sptest1/2/3/4 (default: basic))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) FUNC=$OPTARG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) ;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) o) # --output-file (Output file to store dumps)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) OUTFILE=$OPTARG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) ;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) d) # --driver-mod-name (Name of the driver module)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) DRIVER_MOD=$OPTARG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) ;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) g) # --governor-mod-name (Name of the governor module)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) GOVERNOR_MOD=$OPTARG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) ;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) \?)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) helpme
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) ;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) esac
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) done
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) do_test()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) # Check if CPUs are managed by cpufreq or not
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) count=$(count_cpufreq_managed_cpus)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) if [ $count = 0 -a $FUNC != "modtest" ]; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) echo "No cpu is managed by cpufreq core, exiting"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) exit 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) case "$FUNC" in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) "basic")
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) cpufreq_basic_tests
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) ;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) "suspend")
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) do_suspend "suspend" 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) ;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) "hibernate")
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) do_suspend "hibernate" 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) ;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) "modtest")
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) # Do we have modules in place?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) if [ -z $DRIVER_MOD ] && [ -z $GOVERNOR_MOD ]; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) echo "No driver or governor module passed with -d or -g"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) exit 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) if [ $DRIVER_MOD ]; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) if [ $GOVERNOR_MOD ]; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) module_test $DRIVER_MOD $GOVERNOR_MOD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) module_driver_test $DRIVER_MOD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) if [ $count = 0 ]; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) echo "No cpu is managed by cpufreq core, exiting"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) exit 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) module_governor_test $GOVERNOR_MOD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) ;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) "sptest1")
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) simple_lockdep
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) ;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) "sptest2")
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) concurrent_lockdep
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) ;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) "sptest3")
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) governor_race
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) ;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) "sptest4")
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) hotplug_with_updates
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) ;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) *)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) echo "Invalid [-f] function type"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) helpme
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) ;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) esac
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) # clear dumps
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) # $1: file name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) clear_dumps()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) echo "" > $1.txt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) echo "" > $1.dmesg_cpufreq.txt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) echo "" > $1.dmesg_full.txt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) # $1: output file name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) dmesg_dumps()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) dmesg | grep cpufreq >> $1.dmesg_cpufreq.txt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) # We may need the full logs as well
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) dmesg >> $1.dmesg_full.txt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) # Parse arguments
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) parse_arguments $@
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) # Make sure all requirements are met
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) prerequisite
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) # Run requested functions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) clear_dumps $OUTFILE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) do_test >> $OUTFILE.txt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) dmesg_dumps $OUTFILE