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