Path: blob/master/tools/testing/selftests/amd-pstate/run.sh
26285 views
#!/bin/bash1# SPDX-License-Identifier: GPL-2.023# protect against multiple inclusion4if [ $FILE_MAIN ]; then5return 06else7FILE_MAIN=DONE8fi910SCRIPTDIR=`dirname "$0"`11TRACER=$SCRIPTDIR/../../../power/x86/amd_pstate_tracer/amd_pstate_trace.py1213source $SCRIPTDIR/basic.sh14source $SCRIPTDIR/tbench.sh15source $SCRIPTDIR/gitsource.sh1617# amd-pstate-ut only run on x86/x86_64 AMD systems.18ARCH=$(uname -m 2>/dev/null | sed -e 's/i.86/x86/' -e 's/x86_64/x86/')19VENDOR=$(cat /proc/cpuinfo | grep -m 1 'vendor_id' | awk '{print $NF}')2021msg="Skip all tests:"22FUNC=all23OUTFILE=selftest24OUTFILE_TBENCH="$OUTFILE.tbench"25OUTFILE_GIT="$OUTFILE.gitsource"2627PERF=/usr/bin/perf28SYSFS=29CPUROOT=30CPUFREQROOT=31MAKE_CPUS=3233TIME_LIMIT=10034PROCESS_NUM=12835LOOP_TIMES=336TRACER_INTERVAL=1037CURRENT_TEST=amd-pstate38COMPARATIVE_TEST=3940# Kselftest framework requirement - SKIP code is 4.41ksft_skip=442all_scaling_names=("acpi-cpufreq" "amd-pstate")4344# Get current cpufreq scaling driver name45scaling_name()46{47if [ "$COMPARATIVE_TEST" = "" ]; then48echo "$CURRENT_TEST"49else50echo "$COMPARATIVE_TEST"51fi52}5354# Counts CPUs with cpufreq directories55count_cpus()56{57count=0;5859for cpu in `ls $CPUROOT | grep "cpu[0-9].*"`; do60if [ -d $CPUROOT/$cpu/cpufreq ]; then61let count=count+1;62fi63done6465echo $count;66}6768# $1: policy69find_current_governor()70{71cat $CPUFREQROOT/$1/scaling_governor72}7374backup_governor()75{76policies=$(ls $CPUFREQROOT| grep "policy[0-9].*")77for policy in $policies; do78cur_gov=$(find_current_governor $policy)79echo "$policy $cur_gov" >> $OUTFILE.backup_governor.log80done8182printf "Governor $cur_gov backup done.\n"83}8485restore_governor()86{87i=0;8889policies=$(awk '{print $1}' $OUTFILE.backup_governor.log)90for policy in $policies; do91let i++;92governor=$(sed -n ''$i'p' $OUTFILE.backup_governor.log | awk '{print $2}')9394# switch governor95echo $governor > $CPUFREQROOT/$policy/scaling_governor96done9798printf "Governor restored to $governor.\n"99}100101# $1: governor102switch_governor()103{104policies=$(ls $CPUFREQROOT| grep "policy[0-9].*")105for policy in $policies; do106filepath=$CPUFREQROOT/$policy/scaling_available_governors107108# Exit if cpu isn't managed by cpufreq core109if [ ! -f $filepath ]; then110return;111fi112113echo $1 > $CPUFREQROOT/$policy/scaling_governor114done115116printf "Switched governor to $1.\n"117}118119# All amd-pstate tests120amd_pstate_all()121{122printf "\n=============================================\n"123printf "***** Running AMD P-state Sanity Tests *****\n"124printf "=============================================\n\n"125126count=$(count_cpus)127if [ $count = 0 ]; then128printf "No cpu is managed by cpufreq core, exiting\n"129exit;130else131printf "AMD P-state manages: $count CPUs\n"132fi133134# unit test for amd-pstate kernel driver135amd_pstate_basic136137# tbench138amd_pstate_tbench139140# gitsource141amd_pstate_gitsource142}143144help()145{146printf "Usage: $0 [OPTION...]147[-h <help>]148[-o <output-file-for-dump>]149[-c <all: All testing,150basic: Basic testing,151tbench: Tbench testing,152gitsource: Gitsource testing.>]153[-t <tbench time limit>]154[-p <tbench process number>]155[-l <loop times for tbench>]156[-i <amd tracer interval>]157[-b <perf binary>]158[-m <comparative test: acpi-cpufreq>]159\n"160exit 2161}162163parse_arguments()164{165while getopts ho:c:t:p:l:i:b:m: arg166do167case $arg in168h) # --help169help170;;171172c) # --func_type (Function to perform: basic, tbench, gitsource (default: all))173FUNC=$OPTARG174;;175176o) # --output-file (Output file to store dumps)177OUTFILE=$OPTARG178;;179180t) # --tbench-time-limit181TIME_LIMIT=$OPTARG182;;183184p) # --tbench-process-number185PROCESS_NUM=$OPTARG186;;187188l) # --tbench/gitsource-loop-times189LOOP_TIMES=$OPTARG190;;191192i) # --amd-tracer-interval193TRACER_INTERVAL=$OPTARG194;;195196b) # --perf-binary197PERF=`realpath $OPTARG`198;;199200m) # --comparative-test201COMPARATIVE_TEST=$OPTARG202;;203204*)205help206;;207esac208done209}210211command_perf()212{213if ! $PERF -v; then214echo $msg please install perf or provide perf binary path as argument >&2215exit $ksft_skip216fi217}218219command_tbench()220{221if ! command -v tbench > /dev/null; then222if apt policy dbench > /dev/null 2>&1; then223echo $msg apt install dbench >&2224exit $ksft_skip225elif yum list available | grep dbench > /dev/null 2>&1; then226echo $msg yum install dbench >&2227exit $ksft_skip228fi229fi230231if ! command -v tbench > /dev/null; then232echo $msg please install tbench. >&2233exit $ksft_skip234fi235}236237prerequisite()238{239if ! echo "$ARCH" | grep -q x86; then240echo "$0 # Skipped: Test can only run on x86 architectures."241exit $ksft_skip242fi243244if ! echo "$VENDOR" | grep -iq amd; then245echo "$0 # Skipped: Test can only run on AMD CPU."246echo "$0 # Current cpu vendor is $VENDOR."247exit $ksft_skip248fi249250scaling_driver=$(cat /sys/devices/system/cpu/cpufreq/policy0/scaling_driver)251if [ "$COMPARATIVE_TEST" = "" ]; then252if [ "$scaling_driver" != "$CURRENT_TEST" ]; then253echo "$0 # Skipped: Test can only run on $CURRENT_TEST driver or run comparative test."254echo "$0 # Please set X86_AMD_PSTATE enabled or run comparative test."255echo "$0 # Current cpufreq scaling driver is $scaling_driver."256exit $ksft_skip257fi258else259case "$FUNC" in260"tbench" | "gitsource")261if [ "$scaling_driver" != "$COMPARATIVE_TEST" ]; then262echo "$0 # Skipped: Comparison test can only run on $COMPARISON_TEST driver."263echo "$0 # Current cpufreq scaling driver is $scaling_driver."264exit $ksft_skip265fi266;;267268*)269echo "$0 # Skipped: Comparison test are only for tbench or gitsource."270echo "$0 # Current comparative test is for $FUNC."271exit $ksft_skip272;;273esac274fi275276if [ ! -w /dev ]; then277echo $msg please run this as root >&2278exit $ksft_skip279fi280281case "$FUNC" in282"all")283command_perf284command_tbench285;;286287"tbench")288command_perf289command_tbench290;;291292"gitsource")293command_perf294;;295esac296297SYSFS=`mount -t sysfs | head -1 | awk '{ print $3 }'`298299if [ ! -d "$SYSFS" ]; then300echo $msg sysfs is not mounted >&2301exit 2302fi303304CPUROOT=$SYSFS/devices/system/cpu305CPUFREQROOT="$CPUROOT/cpufreq"306307if ! ls $CPUROOT/cpu* > /dev/null 2>&1; then308echo $msg cpus not available in sysfs >&2309exit 2310fi311312if ! ls $CPUROOT/cpufreq > /dev/null 2>&1; then313echo $msg cpufreq directory not available in sysfs >&2314exit 2315fi316}317318do_test()319{320# Check if CPUs are managed by cpufreq or not321count=$(count_cpus)322MAKE_CPUS=$((count*2))323324if [ $count = 0 ]; then325echo "No cpu is managed by cpufreq core, exiting"326exit 2;327fi328329case "$FUNC" in330"all")331amd_pstate_all332;;333334"basic")335amd_pstate_basic336;;337338"tbench")339amd_pstate_tbench340;;341342"gitsource")343amd_pstate_gitsource344;;345346*)347echo "Invalid [-f] function type"348help349;;350esac351}352353# clear dumps354pre_clear_dumps()355{356case "$FUNC" in357"all")358rm -rf $OUTFILE.log359rm -rf $OUTFILE.backup_governor.log360rm -rf *.png361;;362363"tbench")364rm -rf $OUTFILE.log365rm -rf $OUTFILE.backup_governor.log366rm -rf tbench_*.png367;;368369"gitsource")370rm -rf $OUTFILE.log371rm -rf $OUTFILE.backup_governor.log372rm -rf gitsource_*.png373;;374375*)376;;377esac378}379380post_clear_dumps()381{382rm -rf $OUTFILE.log383rm -rf $OUTFILE.backup_governor.log384}385386# Parse arguments387parse_arguments $@388389# Make sure all requirements are met390prerequisite391392# Run requested functions393pre_clear_dumps394do_test | tee -a $OUTFILE.log395post_clear_dumps396397398