1 #!/bin/bash 2 # SPDX-License-Identifier: GPL-2.0 3 4 # protect against multiple inclusion 5 if [ $FILE_MAIN ]; then 6 return 0 7 else 8 FILE_MAIN=DONE 9 fi 10 11 SCRIPTDIR=`dirname "$0"` 12 TRACER=$SCRIPTDIR/../../../power/x86/amd_pstat 13 14 source $SCRIPTDIR/basic.sh 15 source $SCRIPTDIR/tbench.sh 16 source $SCRIPTDIR/gitsource.sh 17 18 # amd-pstate-ut only run on x86/x86_64 AMD sys 19 ARCH=$(uname -m 2>/dev/null | sed -e 's/i.86/x 20 VENDOR=$(cat /proc/cpuinfo | grep -m 1 'vendor 21 22 msg="Skip all tests:" 23 FUNC=all 24 OUTFILE=selftest 25 OUTFILE_TBENCH="$OUTFILE.tbench" 26 OUTFILE_GIT="$OUTFILE.gitsource" 27 28 PERF=/usr/bin/perf 29 SYSFS= 30 CPUROOT= 31 CPUFREQROOT= 32 MAKE_CPUS= 33 34 TIME_LIMIT=100 35 PROCESS_NUM=128 36 LOOP_TIMES=3 37 TRACER_INTERVAL=10 38 CURRENT_TEST=amd-pstate 39 COMPARATIVE_TEST= 40 41 # Kselftest framework requirement - SKIP code 42 ksft_skip=4 43 all_scaling_names=("acpi-cpufreq" "amd-pstate" 44 45 # Get current cpufreq scaling driver name 46 scaling_name() 47 { 48 if [ "$COMPARATIVE_TEST" = "" ]; then 49 echo "$CURRENT_TEST" 50 else 51 echo "$COMPARATIVE_TEST" 52 fi 53 } 54 55 # Counts CPUs with cpufreq directories 56 count_cpus() 57 { 58 count=0; 59 60 for cpu in `ls $CPUROOT | grep "cpu[0- 61 if [ -d $CPUROOT/$cpu/cpufreq 62 let count=count+1; 63 fi 64 done 65 66 echo $count; 67 } 68 69 # $1: policy 70 find_current_governor() 71 { 72 cat $CPUFREQROOT/$1/scaling_governor 73 } 74 75 backup_governor() 76 { 77 policies=$(ls $CPUFREQROOT| grep "poli 78 for policy in $policies; do 79 cur_gov=$(find_current_governo 80 echo "$policy $cur_gov" >> $OU 81 done 82 83 printf "Governor $cur_gov backup done. 84 } 85 86 restore_governor() 87 { 88 i=0; 89 90 policies=$(awk '{print $1}' $OUTFILE.b 91 for policy in $policies; do 92 let i++; 93 governor=$(sed -n ''$i'p' $OUT 94 95 # switch governor 96 echo $governor > $CPUFREQROOT/ 97 done 98 99 printf "Governor restored to $governor 100 } 101 102 # $1: governor 103 switch_governor() 104 { 105 policies=$(ls $CPUFREQROOT| grep "poli 106 for policy in $policies; do 107 filepath=$CPUFREQROOT/$policy/ 108 109 # Exit if cpu isn't managed by 110 if [ ! -f $filepath ]; then 111 return; 112 fi 113 114 echo $1 > $CPUFREQROOT/$policy 115 done 116 117 printf "Switched governor to $1.\n" 118 } 119 120 # All amd-pstate tests 121 amd_pstate_all() 122 { 123 printf "\n============================ 124 printf "***** Running AMD P-state Sani 125 printf "============================== 126 127 count=$(count_cpus) 128 if [ $count = 0 ]; then 129 printf "No cpu is managed by c 130 exit; 131 else 132 printf "AMD P-state manages: $ 133 fi 134 135 # unit test for amd-pstate kernel driv 136 amd_pstate_basic 137 138 # tbench 139 amd_pstate_tbench 140 141 # gitsource 142 amd_pstate_gitsource 143 } 144 145 help() 146 { 147 printf "Usage: $0 [OPTION...] 148 [-h <help>] 149 [-o <output-file-for-dump>] 150 [-c <all: All testing, 151 basic: Basic testing, 152 tbench: Tbench testing, 153 gitsource: Gitsource testing.>] 154 [-t <tbench time limit>] 155 [-p <tbench process number>] 156 [-l <loop times for tbench>] 157 [-i <amd tracer interval>] 158 [-b <perf binary>] 159 [-m <comparative test: acpi-cpufreq>] 160 \n" 161 exit 2 162 } 163 164 parse_arguments() 165 { 166 while getopts ho:c:t:p:l:i:b:m: arg 167 do 168 case $arg in 169 h) # --help 170 help 171 ;; 172 173 c) # --func_type (Func 174 FUNC=$OPTARG 175 ;; 176 177 o) # --output-file (Ou 178 OUTFILE=$OPTAR 179 ;; 180 181 t) # --tbench-time-lim 182 TIME_LIMIT=$OP 183 ;; 184 185 p) # --tbench-process- 186 PROCESS_NUM=$O 187 ;; 188 189 l) # --tbench/gitsourc 190 LOOP_TIMES=$OP 191 ;; 192 193 i) # --amd-tracer-inte 194 TRACER_INTERVA 195 ;; 196 197 b) # --perf-binary 198 PERF=`realpath 199 ;; 200 201 m) # --comparative-tes 202 COMPARATIVE_TE 203 ;; 204 205 *) 206 help 207 ;; 208 esac 209 done 210 } 211 212 command_perf() 213 { 214 if ! $PERF -v; then 215 echo $msg please install perf 216 exit $ksft_skip 217 fi 218 } 219 220 command_tbench() 221 { 222 if ! command -v tbench > /dev/null; th 223 if apt policy dbench > /dev/nu 224 echo $msg apt install 225 exit $ksft_skip 226 elif yum list available | grep 227 echo $msg yum install 228 exit $ksft_skip 229 fi 230 fi 231 232 if ! command -v tbench > /dev/null; th 233 echo $msg please install tbenc 234 exit $ksft_skip 235 fi 236 } 237 238 prerequisite() 239 { 240 if ! echo "$ARCH" | grep -q x86; then 241 echo "$0 # Skipped: Test can o 242 exit $ksft_skip 243 fi 244 245 if ! echo "$VENDOR" | grep -iq amd; th 246 echo "$0 # Skipped: Test can o 247 echo "$0 # Current cpu vendor 248 exit $ksft_skip 249 fi 250 251 scaling_driver=$(cat /sys/devices/syst 252 if [ "$COMPARATIVE_TEST" = "" ]; then 253 if [ "$scaling_driver" != "$CU 254 echo "$0 # Skipped: Te 255 echo "$0 # Please set 256 echo "$0 # Current cpu 257 exit $ksft_skip 258 fi 259 else 260 case "$FUNC" in 261 "tbench" | "gitsource" 262 if [ "$scaling 263 echo " 264 echo " 265 exit $ 266 fi 267 ;; 268 269 *) 270 echo "$0 # Ski 271 echo "$0 # Cur 272 exit $ksft_ski 273 ;; 274 esac 275 fi 276 277 if [ ! -w /dev ]; then 278 echo $msg please run this as r 279 exit $ksft_skip 280 fi 281 282 case "$FUNC" in 283 "all") 284 command_perf 285 command_tbench 286 ;; 287 288 "tbench") 289 command_perf 290 command_tbench 291 ;; 292 293 "gitsource") 294 command_perf 295 ;; 296 esac 297 298 SYSFS=`mount -t sysfs | head -1 | awk 299 300 if [ ! -d "$SYSFS" ]; then 301 echo $msg sysfs is not mounted 302 exit 2 303 fi 304 305 CPUROOT=$SYSFS/devices/system/cpu 306 CPUFREQROOT="$CPUROOT/cpufreq" 307 308 if ! ls $CPUROOT/cpu* > /dev/null 2>&1 309 echo $msg cpus not available i 310 exit 2 311 fi 312 313 if ! ls $CPUROOT/cpufreq > /dev/null 2 314 echo $msg cpufreq directory no 315 exit 2 316 fi 317 } 318 319 do_test() 320 { 321 # Check if CPUs are managed by cpufreq 322 count=$(count_cpus) 323 MAKE_CPUS=$((count*2)) 324 325 if [ $count = 0 ]; then 326 echo "No cpu is managed by cpu 327 exit 2; 328 fi 329 330 case "$FUNC" in 331 "all") 332 amd_pstate_all 333 ;; 334 335 "basic") 336 amd_pstate_basic 337 ;; 338 339 "tbench") 340 amd_pstate_tbench 341 ;; 342 343 "gitsource") 344 amd_pstate_gitsource 345 ;; 346 347 *) 348 echo "Invalid [-f] fun 349 help 350 ;; 351 esac 352 } 353 354 # clear dumps 355 pre_clear_dumps() 356 { 357 case "$FUNC" in 358 "all") 359 rm -rf $OUTFILE.log 360 rm -rf $OUTFILE.backup 361 rm -rf *.png 362 ;; 363 364 "tbench") 365 rm -rf $OUTFILE.log 366 rm -rf $OUTFILE.backup 367 rm -rf tbench_*.png 368 ;; 369 370 "gitsource") 371 rm -rf $OUTFILE.log 372 rm -rf $OUTFILE.backup 373 rm -rf gitsource_*.png 374 ;; 375 376 *) 377 ;; 378 esac 379 } 380 381 post_clear_dumps() 382 { 383 rm -rf $OUTFILE.log 384 rm -rf $OUTFILE.backup_governor.log 385 } 386 387 # Parse arguments 388 parse_arguments $@ 389 390 # Make sure all requirements are met 391 prerequisite 392 393 # Run requested functions 394 pre_clear_dumps 395 do_test | tee -a $OUTFILE.log 396 post_clear_dumps
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.