1*4882a593Smuzhiyun#!/bin/bash 2*4882a593Smuzhiyun# SPDX-License-Identifier: GPL-2.0 3*4882a593Smuzhiyun# 4*4882a593Smuzhiyun# Modules specific tests cases 5*4882a593Smuzhiyun 6*4882a593Smuzhiyun# protect against multiple inclusion 7*4882a593Smuzhiyunif [ $FILE_MODULE ]; then 8*4882a593Smuzhiyun return 0 9*4882a593Smuzhiyunelse 10*4882a593Smuzhiyun FILE_MODULE=DONE 11*4882a593Smuzhiyunfi 12*4882a593Smuzhiyun 13*4882a593Smuzhiyunsource cpu.sh 14*4882a593Smuzhiyunsource cpufreq.sh 15*4882a593Smuzhiyunsource governor.sh 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun# Check basic insmod/rmmod 18*4882a593Smuzhiyun# $1: module 19*4882a593Smuzhiyuntest_basic_insmod_rmmod() 20*4882a593Smuzhiyun{ 21*4882a593Smuzhiyun printf "** Test: Running ${FUNCNAME[0]} **\n\n" 22*4882a593Smuzhiyun 23*4882a593Smuzhiyun printf "Inserting $1 module\n" 24*4882a593Smuzhiyun # insert module 25*4882a593Smuzhiyun insmod $1 26*4882a593Smuzhiyun if [ $? != 0 ]; then 27*4882a593Smuzhiyun printf "Insmod $1 failed\n" 28*4882a593Smuzhiyun exit; 29*4882a593Smuzhiyun fi 30*4882a593Smuzhiyun 31*4882a593Smuzhiyun printf "Removing $1 module\n" 32*4882a593Smuzhiyun # remove module 33*4882a593Smuzhiyun rmmod $1 34*4882a593Smuzhiyun if [ $? != 0 ]; then 35*4882a593Smuzhiyun printf "rmmod $1 failed\n" 36*4882a593Smuzhiyun exit; 37*4882a593Smuzhiyun fi 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun printf "\n" 40*4882a593Smuzhiyun} 41*4882a593Smuzhiyun 42*4882a593Smuzhiyun# Insert cpufreq driver module and perform basic tests 43*4882a593Smuzhiyun# $1: cpufreq-driver module to insert 44*4882a593Smuzhiyun# $2: If we want to play with CPUs (1) or not (0) 45*4882a593Smuzhiyunmodule_driver_test_single() 46*4882a593Smuzhiyun{ 47*4882a593Smuzhiyun printf "** Test: Running ${FUNCNAME[0]} for driver $1 and cpus_hotplug=$2 **\n\n" 48*4882a593Smuzhiyun 49*4882a593Smuzhiyun if [ $2 -eq 1 ]; then 50*4882a593Smuzhiyun # offline all non-boot CPUs 51*4882a593Smuzhiyun for_each_non_boot_cpu offline_cpu 52*4882a593Smuzhiyun printf "\n" 53*4882a593Smuzhiyun fi 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun # insert module 56*4882a593Smuzhiyun printf "Inserting $1 module\n\n" 57*4882a593Smuzhiyun insmod $1 58*4882a593Smuzhiyun if [ $? != 0 ]; then 59*4882a593Smuzhiyun printf "Insmod $1 failed\n" 60*4882a593Smuzhiyun return; 61*4882a593Smuzhiyun fi 62*4882a593Smuzhiyun 63*4882a593Smuzhiyun if [ $2 -eq 1 ]; then 64*4882a593Smuzhiyun # online all non-boot CPUs 65*4882a593Smuzhiyun for_each_non_boot_cpu online_cpu 66*4882a593Smuzhiyun printf "\n" 67*4882a593Smuzhiyun fi 68*4882a593Smuzhiyun 69*4882a593Smuzhiyun # run basic tests 70*4882a593Smuzhiyun cpufreq_basic_tests 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun # remove module 73*4882a593Smuzhiyun printf "Removing $1 module\n\n" 74*4882a593Smuzhiyun rmmod $1 75*4882a593Smuzhiyun if [ $? != 0 ]; then 76*4882a593Smuzhiyun printf "rmmod $1 failed\n" 77*4882a593Smuzhiyun return; 78*4882a593Smuzhiyun fi 79*4882a593Smuzhiyun 80*4882a593Smuzhiyun # There shouldn't be any cpufreq directories now. 81*4882a593Smuzhiyun for_each_cpu cpu_should_not_have_cpufreq_directory 82*4882a593Smuzhiyun printf "\n" 83*4882a593Smuzhiyun} 84*4882a593Smuzhiyun 85*4882a593Smuzhiyun# $1: cpufreq-driver module to insert 86*4882a593Smuzhiyunmodule_driver_test() 87*4882a593Smuzhiyun{ 88*4882a593Smuzhiyun printf "** Test: Running ${FUNCNAME[0]} **\n\n" 89*4882a593Smuzhiyun 90*4882a593Smuzhiyun # check if module is present or not 91*4882a593Smuzhiyun ls $1 > /dev/null 92*4882a593Smuzhiyun if [ $? != 0 ]; then 93*4882a593Smuzhiyun printf "$1: not present in `pwd` folder\n" 94*4882a593Smuzhiyun return; 95*4882a593Smuzhiyun fi 96*4882a593Smuzhiyun 97*4882a593Smuzhiyun # test basic module tests 98*4882a593Smuzhiyun test_basic_insmod_rmmod $1 99*4882a593Smuzhiyun 100*4882a593Smuzhiyun # Do simple module test 101*4882a593Smuzhiyun module_driver_test_single $1 0 102*4882a593Smuzhiyun 103*4882a593Smuzhiyun # Remove CPUs before inserting module and then bring them back 104*4882a593Smuzhiyun module_driver_test_single $1 1 105*4882a593Smuzhiyun printf "\n" 106*4882a593Smuzhiyun} 107*4882a593Smuzhiyun 108*4882a593Smuzhiyun# find governor name based on governor module name 109*4882a593Smuzhiyun# $1: governor module name 110*4882a593Smuzhiyunfind_gov_name() 111*4882a593Smuzhiyun{ 112*4882a593Smuzhiyun if [ $1 = "cpufreq_ondemand.ko" ]; then 113*4882a593Smuzhiyun printf "ondemand" 114*4882a593Smuzhiyun elif [ $1 = "cpufreq_conservative.ko" ]; then 115*4882a593Smuzhiyun printf "conservative" 116*4882a593Smuzhiyun elif [ $1 = "cpufreq_userspace.ko" ]; then 117*4882a593Smuzhiyun printf "userspace" 118*4882a593Smuzhiyun elif [ $1 = "cpufreq_performance.ko" ]; then 119*4882a593Smuzhiyun printf "performance" 120*4882a593Smuzhiyun elif [ $1 = "cpufreq_powersave.ko" ]; then 121*4882a593Smuzhiyun printf "powersave" 122*4882a593Smuzhiyun elif [ $1 = "cpufreq_schedutil.ko" ]; then 123*4882a593Smuzhiyun printf "schedutil" 124*4882a593Smuzhiyun fi 125*4882a593Smuzhiyun} 126*4882a593Smuzhiyun 127*4882a593Smuzhiyun# $1: governor string, $2: governor module, $3: policy 128*4882a593Smuzhiyun# example: module_governor_test_single "ondemand" "cpufreq_ondemand.ko" 2 129*4882a593Smuzhiyunmodule_governor_test_single() 130*4882a593Smuzhiyun{ 131*4882a593Smuzhiyun printf "** Test: Running ${FUNCNAME[0]} for $3 **\n\n" 132*4882a593Smuzhiyun 133*4882a593Smuzhiyun backup_governor $3 134*4882a593Smuzhiyun 135*4882a593Smuzhiyun # switch to new governor 136*4882a593Smuzhiyun printf "Switch from $CUR_GOV to $1\n" 137*4882a593Smuzhiyun switch_show_governor $3 $1 138*4882a593Smuzhiyun 139*4882a593Smuzhiyun # try removing module, it should fail as governor is used 140*4882a593Smuzhiyun printf "Removing $2 module\n\n" 141*4882a593Smuzhiyun rmmod $2 142*4882a593Smuzhiyun if [ $? = 0 ]; then 143*4882a593Smuzhiyun printf "WARN: rmmod $2 succeeded even if governor is used\n" 144*4882a593Smuzhiyun insmod $2 145*4882a593Smuzhiyun else 146*4882a593Smuzhiyun printf "Pass: unable to remove $2 while it is being used\n\n" 147*4882a593Smuzhiyun fi 148*4882a593Smuzhiyun 149*4882a593Smuzhiyun # switch back to old governor 150*4882a593Smuzhiyun printf "Switchback to $CUR_GOV from $1\n" 151*4882a593Smuzhiyun restore_governor $3 152*4882a593Smuzhiyun printf "\n" 153*4882a593Smuzhiyun} 154*4882a593Smuzhiyun 155*4882a593Smuzhiyun# Insert cpufreq governor module and perform basic tests 156*4882a593Smuzhiyun# $1: cpufreq-governor module to insert 157*4882a593Smuzhiyunmodule_governor_test() 158*4882a593Smuzhiyun{ 159*4882a593Smuzhiyun printf "** Test: Running ${FUNCNAME[0]} **\n\n" 160*4882a593Smuzhiyun 161*4882a593Smuzhiyun # check if module is present or not 162*4882a593Smuzhiyun ls $1 > /dev/null 163*4882a593Smuzhiyun if [ $? != 0 ]; then 164*4882a593Smuzhiyun printf "$1: not present in `pwd` folder\n" 165*4882a593Smuzhiyun return; 166*4882a593Smuzhiyun fi 167*4882a593Smuzhiyun 168*4882a593Smuzhiyun # test basic module tests 169*4882a593Smuzhiyun test_basic_insmod_rmmod $1 170*4882a593Smuzhiyun 171*4882a593Smuzhiyun # insert module 172*4882a593Smuzhiyun printf "Inserting $1 module\n\n" 173*4882a593Smuzhiyun insmod $1 174*4882a593Smuzhiyun if [ $? != 0 ]; then 175*4882a593Smuzhiyun printf "Insmod $1 failed\n" 176*4882a593Smuzhiyun return; 177*4882a593Smuzhiyun fi 178*4882a593Smuzhiyun 179*4882a593Smuzhiyun # switch to new governor for each cpu 180*4882a593Smuzhiyun for_each_policy module_governor_test_single $(find_gov_name $1) $1 181*4882a593Smuzhiyun 182*4882a593Smuzhiyun # remove module 183*4882a593Smuzhiyun printf "Removing $1 module\n\n" 184*4882a593Smuzhiyun rmmod $1 185*4882a593Smuzhiyun if [ $? != 0 ]; then 186*4882a593Smuzhiyun printf "rmmod $1 failed\n" 187*4882a593Smuzhiyun return; 188*4882a593Smuzhiyun fi 189*4882a593Smuzhiyun printf "\n" 190*4882a593Smuzhiyun} 191*4882a593Smuzhiyun 192*4882a593Smuzhiyun# test modules: driver and governor 193*4882a593Smuzhiyun# $1: driver module, $2: governor module 194*4882a593Smuzhiyunmodule_test() 195*4882a593Smuzhiyun{ 196*4882a593Smuzhiyun printf "** Test: Running ${FUNCNAME[0]} **\n\n" 197*4882a593Smuzhiyun 198*4882a593Smuzhiyun # check if modules are present or not 199*4882a593Smuzhiyun ls $1 $2 > /dev/null 200*4882a593Smuzhiyun if [ $? != 0 ]; then 201*4882a593Smuzhiyun printf "$1 or $2: is not present in `pwd` folder\n" 202*4882a593Smuzhiyun return; 203*4882a593Smuzhiyun fi 204*4882a593Smuzhiyun 205*4882a593Smuzhiyun # TEST1: Insert gov after driver 206*4882a593Smuzhiyun # insert driver module 207*4882a593Smuzhiyun printf "Inserting $1 module\n\n" 208*4882a593Smuzhiyun insmod $1 209*4882a593Smuzhiyun if [ $? != 0 ]; then 210*4882a593Smuzhiyun printf "Insmod $1 failed\n" 211*4882a593Smuzhiyun return; 212*4882a593Smuzhiyun fi 213*4882a593Smuzhiyun 214*4882a593Smuzhiyun # run governor tests 215*4882a593Smuzhiyun module_governor_test $2 216*4882a593Smuzhiyun 217*4882a593Smuzhiyun # remove driver module 218*4882a593Smuzhiyun printf "Removing $1 module\n\n" 219*4882a593Smuzhiyun rmmod $1 220*4882a593Smuzhiyun if [ $? != 0 ]; then 221*4882a593Smuzhiyun printf "rmmod $1 failed\n" 222*4882a593Smuzhiyun return; 223*4882a593Smuzhiyun fi 224*4882a593Smuzhiyun 225*4882a593Smuzhiyun # TEST2: Insert driver after governor 226*4882a593Smuzhiyun # insert governor module 227*4882a593Smuzhiyun printf "Inserting $2 module\n\n" 228*4882a593Smuzhiyun insmod $2 229*4882a593Smuzhiyun if [ $? != 0 ]; then 230*4882a593Smuzhiyun printf "Insmod $2 failed\n" 231*4882a593Smuzhiyun return; 232*4882a593Smuzhiyun fi 233*4882a593Smuzhiyun 234*4882a593Smuzhiyun # run governor tests 235*4882a593Smuzhiyun module_driver_test $1 236*4882a593Smuzhiyun 237*4882a593Smuzhiyun # remove driver module 238*4882a593Smuzhiyun printf "Removing $2 module\n\n" 239*4882a593Smuzhiyun rmmod $2 240*4882a593Smuzhiyun if [ $? != 0 ]; then 241*4882a593Smuzhiyun printf "rmmod $2 failed\n" 242*4882a593Smuzhiyun return; 243*4882a593Smuzhiyun fi 244*4882a593Smuzhiyun} 245