397 lines · bash
1#!/bin/bash2# SPDX-License-Identifier: GPL-2.03 4# protect against multiple inclusion5if [ $FILE_MAIN ]; then6 return 07else8 FILE_MAIN=DONE9fi10 11SCRIPTDIR=`dirname "$0"`12TRACER=$SCRIPTDIR/../../../power/x86/amd_pstate_tracer/amd_pstate_trace.py13 14source $SCRIPTDIR/basic.sh15source $SCRIPTDIR/tbench.sh16source $SCRIPTDIR/gitsource.sh17 18# amd-pstate-ut only run on x86/x86_64 AMD systems.19ARCH=$(uname -m 2>/dev/null | sed -e 's/i.86/x86/' -e 's/x86_64/x86/')20VENDOR=$(cat /proc/cpuinfo | grep -m 1 'vendor_id' | awk '{print $NF}')21 22msg="Skip all tests:"23FUNC=all24OUTFILE=selftest25OUTFILE_TBENCH="$OUTFILE.tbench"26OUTFILE_GIT="$OUTFILE.gitsource"27 28PERF=/usr/bin/perf29SYSFS=30CPUROOT=31CPUFREQROOT=32MAKE_CPUS=33 34TIME_LIMIT=10035PROCESS_NUM=12836LOOP_TIMES=337TRACER_INTERVAL=1038CURRENT_TEST=amd-pstate39COMPARATIVE_TEST=40 41# Kselftest framework requirement - SKIP code is 4.42ksft_skip=443all_scaling_names=("acpi-cpufreq" "amd-pstate")44 45# Get current cpufreq scaling driver name46scaling_name()47{48 if [ "$COMPARATIVE_TEST" = "" ]; then49 echo "$CURRENT_TEST"50 else51 echo "$COMPARATIVE_TEST"52 fi53}54 55# Counts CPUs with cpufreq directories56count_cpus()57{58 count=0;59 60 for cpu in `ls $CPUROOT | grep "cpu[0-9].*"`; do61 if [ -d $CPUROOT/$cpu/cpufreq ]; then62 let count=count+1;63 fi64 done65 66 echo $count;67}68 69# $1: policy70find_current_governor()71{72 cat $CPUFREQROOT/$1/scaling_governor73}74 75backup_governor()76{77 policies=$(ls $CPUFREQROOT| grep "policy[0-9].*")78 for policy in $policies; do79 cur_gov=$(find_current_governor $policy)80 echo "$policy $cur_gov" >> $OUTFILE.backup_governor.log81 done82 83 printf "Governor $cur_gov backup done.\n"84}85 86restore_governor()87{88 i=0;89 90 policies=$(awk '{print $1}' $OUTFILE.backup_governor.log)91 for policy in $policies; do92 let i++;93 governor=$(sed -n ''$i'p' $OUTFILE.backup_governor.log | awk '{print $2}')94 95 # switch governor96 echo $governor > $CPUFREQROOT/$policy/scaling_governor97 done98 99 printf "Governor restored to $governor.\n"100}101 102# $1: governor103switch_governor()104{105 policies=$(ls $CPUFREQROOT| grep "policy[0-9].*")106 for policy in $policies; do107 filepath=$CPUFREQROOT/$policy/scaling_available_governors108 109 # Exit if cpu isn't managed by cpufreq core110 if [ ! -f $filepath ]; then111 return;112 fi113 114 echo $1 > $CPUFREQROOT/$policy/scaling_governor115 done116 117 printf "Switched governor to $1.\n"118}119 120# All amd-pstate tests121amd_pstate_all()122{123 printf "\n=============================================\n"124 printf "***** Running AMD P-state Sanity Tests *****\n"125 printf "=============================================\n\n"126 127 count=$(count_cpus)128 if [ $count = 0 ]; then129 printf "No cpu is managed by cpufreq core, exiting\n"130 exit;131 else132 printf "AMD P-state manages: $count CPUs\n"133 fi134 135 # unit test for amd-pstate kernel driver136 amd_pstate_basic137 138 # tbench139 amd_pstate_tbench140 141 # gitsource142 amd_pstate_gitsource143}144 145help()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 2162}163 164parse_arguments()165{166 while getopts ho:c:t:p:l:i:b:m: arg167 do168 case $arg in169 h) # --help170 help171 ;;172 173 c) # --func_type (Function to perform: basic, tbench, gitsource (default: all))174 FUNC=$OPTARG175 ;;176 177 o) # --output-file (Output file to store dumps)178 OUTFILE=$OPTARG179 ;;180 181 t) # --tbench-time-limit182 TIME_LIMIT=$OPTARG183 ;;184 185 p) # --tbench-process-number186 PROCESS_NUM=$OPTARG187 ;;188 189 l) # --tbench/gitsource-loop-times190 LOOP_TIMES=$OPTARG191 ;;192 193 i) # --amd-tracer-interval194 TRACER_INTERVAL=$OPTARG195 ;;196 197 b) # --perf-binary198 PERF=`realpath $OPTARG`199 ;;200 201 m) # --comparative-test202 COMPARATIVE_TEST=$OPTARG203 ;;204 205 *)206 help207 ;;208 esac209 done210}211 212command_perf()213{214 if ! $PERF -v; then215 echo $msg please install perf or provide perf binary path as argument >&2216 exit $ksft_skip217 fi218}219 220command_tbench()221{222 if ! command -v tbench > /dev/null; then223 if apt policy dbench > /dev/null 2>&1; then224 echo $msg apt install dbench >&2225 exit $ksft_skip226 elif yum list available | grep dbench > /dev/null 2>&1; then227 echo $msg yum install dbench >&2228 exit $ksft_skip229 fi230 fi231 232 if ! command -v tbench > /dev/null; then233 echo $msg please install tbench. >&2234 exit $ksft_skip235 fi236}237 238prerequisite()239{240 if ! echo "$ARCH" | grep -q x86; then241 echo "$0 # Skipped: Test can only run on x86 architectures."242 exit $ksft_skip243 fi244 245 if ! echo "$VENDOR" | grep -iq amd; then246 echo "$0 # Skipped: Test can only run on AMD CPU."247 echo "$0 # Current cpu vendor is $VENDOR."248 exit $ksft_skip249 fi250 251 scaling_driver=$(cat /sys/devices/system/cpu/cpufreq/policy0/scaling_driver)252 if [ "$COMPARATIVE_TEST" = "" ]; then253 if [ "$scaling_driver" != "$CURRENT_TEST" ]; then254 echo "$0 # Skipped: Test can only run on $CURRENT_TEST driver or run comparative test."255 echo "$0 # Please set X86_AMD_PSTATE enabled or run comparative test."256 echo "$0 # Current cpufreq scaling driver is $scaling_driver."257 exit $ksft_skip258 fi259 else260 case "$FUNC" in261 "tbench" | "gitsource")262 if [ "$scaling_driver" != "$COMPARATIVE_TEST" ]; then263 echo "$0 # Skipped: Comparison test can only run on $COMPARISON_TEST driver."264 echo "$0 # Current cpufreq scaling driver is $scaling_driver."265 exit $ksft_skip266 fi267 ;;268 269 *)270 echo "$0 # Skipped: Comparison test are only for tbench or gitsource."271 echo "$0 # Current comparative test is for $FUNC."272 exit $ksft_skip273 ;;274 esac275 fi276 277 if [ ! -w /dev ]; then278 echo $msg please run this as root >&2279 exit $ksft_skip280 fi281 282 case "$FUNC" in283 "all")284 command_perf285 command_tbench286 ;;287 288 "tbench")289 command_perf290 command_tbench291 ;;292 293 "gitsource")294 command_perf295 ;;296 esac297 298 SYSFS=`mount -t sysfs | head -1 | awk '{ print $3 }'`299 300 if [ ! -d "$SYSFS" ]; then301 echo $msg sysfs is not mounted >&2302 exit 2303 fi304 305 CPUROOT=$SYSFS/devices/system/cpu306 CPUFREQROOT="$CPUROOT/cpufreq"307 308 if ! ls $CPUROOT/cpu* > /dev/null 2>&1; then309 echo $msg cpus not available in sysfs >&2310 exit 2311 fi312 313 if ! ls $CPUROOT/cpufreq > /dev/null 2>&1; then314 echo $msg cpufreq directory not available in sysfs >&2315 exit 2316 fi317}318 319do_test()320{321 # Check if CPUs are managed by cpufreq or not322 count=$(count_cpus)323 MAKE_CPUS=$((count*2))324 325 if [ $count = 0 ]; then326 echo "No cpu is managed by cpufreq core, exiting"327 exit 2;328 fi329 330 case "$FUNC" in331 "all")332 amd_pstate_all333 ;;334 335 "basic")336 amd_pstate_basic337 ;;338 339 "tbench")340 amd_pstate_tbench341 ;;342 343 "gitsource")344 amd_pstate_gitsource345 ;;346 347 *)348 echo "Invalid [-f] function type"349 help350 ;;351 esac352}353 354# clear dumps355pre_clear_dumps()356{357 case "$FUNC" in358 "all")359 rm -rf $OUTFILE.log360 rm -rf $OUTFILE.backup_governor.log361 rm -rf *.png362 ;;363 364 "tbench")365 rm -rf $OUTFILE.log366 rm -rf $OUTFILE.backup_governor.log367 rm -rf tbench_*.png368 ;;369 370 "gitsource")371 rm -rf $OUTFILE.log372 rm -rf $OUTFILE.backup_governor.log373 rm -rf gitsource_*.png374 ;;375 376 *)377 ;;378 esac379}380 381post_clear_dumps()382{383 rm -rf $OUTFILE.log384 rm -rf $OUTFILE.backup_governor.log385}386 387# Parse arguments388parse_arguments $@389 390# Make sure all requirements are met391prerequisite392 393# Run requested functions394pre_clear_dumps395do_test | tee -a $OUTFILE.log396post_clear_dumps397