162306a36Sopenharmony_ci#!/bin/bash 262306a36Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0 362306a36Sopenharmony_ci 462306a36Sopenharmony_ci# protect against multiple inclusion 562306a36Sopenharmony_ciif [ $FILE_MAIN ]; then 662306a36Sopenharmony_ci return 0 762306a36Sopenharmony_cielse 862306a36Sopenharmony_ci FILE_MAIN=DONE 962306a36Sopenharmony_cifi 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_cisource basic.sh 1262306a36Sopenharmony_cisource tbench.sh 1362306a36Sopenharmony_cisource gitsource.sh 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci# amd-pstate-ut only run on x86/x86_64 AMD systems. 1662306a36Sopenharmony_ciARCH=$(uname -m 2>/dev/null | sed -e 's/i.86/x86/' -e 's/x86_64/x86/') 1762306a36Sopenharmony_ciVENDOR=$(cat /proc/cpuinfo | grep -m 1 'vendor_id' | awk '{print $NF}') 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_cimsg="Skip all tests:" 2062306a36Sopenharmony_ciFUNC=all 2162306a36Sopenharmony_ciOUTFILE=selftest 2262306a36Sopenharmony_ciOUTFILE_TBENCH="$OUTFILE.tbench" 2362306a36Sopenharmony_ciOUTFILE_GIT="$OUTFILE.gitsource" 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_ciSYSFS= 2662306a36Sopenharmony_ciCPUROOT= 2762306a36Sopenharmony_ciCPUFREQROOT= 2862306a36Sopenharmony_ciMAKE_CPUS= 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ciTIME_LIMIT=100 3162306a36Sopenharmony_ciPROCESS_NUM=128 3262306a36Sopenharmony_ciLOOP_TIMES=3 3362306a36Sopenharmony_ciTRACER_INTERVAL=10 3462306a36Sopenharmony_ciCURRENT_TEST=amd-pstate 3562306a36Sopenharmony_ciCOMPARATIVE_TEST= 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ci# Kselftest framework requirement - SKIP code is 4. 3862306a36Sopenharmony_ciksft_skip=4 3962306a36Sopenharmony_ciall_scaling_names=("acpi-cpufreq" "amd-pstate") 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ci# Get current cpufreq scaling driver name 4262306a36Sopenharmony_ciscaling_name() 4362306a36Sopenharmony_ci{ 4462306a36Sopenharmony_ci if [ "$COMPARATIVE_TEST" = "" ]; then 4562306a36Sopenharmony_ci echo "$CURRENT_TEST" 4662306a36Sopenharmony_ci else 4762306a36Sopenharmony_ci echo "$COMPARATIVE_TEST" 4862306a36Sopenharmony_ci fi 4962306a36Sopenharmony_ci} 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ci# Counts CPUs with cpufreq directories 5262306a36Sopenharmony_cicount_cpus() 5362306a36Sopenharmony_ci{ 5462306a36Sopenharmony_ci count=0; 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_ci for cpu in `ls $CPUROOT | grep "cpu[0-9].*"`; do 5762306a36Sopenharmony_ci if [ -d $CPUROOT/$cpu/cpufreq ]; then 5862306a36Sopenharmony_ci let count=count+1; 5962306a36Sopenharmony_ci fi 6062306a36Sopenharmony_ci done 6162306a36Sopenharmony_ci 6262306a36Sopenharmony_ci echo $count; 6362306a36Sopenharmony_ci} 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_ci# $1: policy 6662306a36Sopenharmony_cifind_current_governor() 6762306a36Sopenharmony_ci{ 6862306a36Sopenharmony_ci cat $CPUFREQROOT/$1/scaling_governor 6962306a36Sopenharmony_ci} 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_cibackup_governor() 7262306a36Sopenharmony_ci{ 7362306a36Sopenharmony_ci policies=$(ls $CPUFREQROOT| grep "policy[0-9].*") 7462306a36Sopenharmony_ci for policy in $policies; do 7562306a36Sopenharmony_ci cur_gov=$(find_current_governor $policy) 7662306a36Sopenharmony_ci echo "$policy $cur_gov" >> $OUTFILE.backup_governor.log 7762306a36Sopenharmony_ci done 7862306a36Sopenharmony_ci 7962306a36Sopenharmony_ci printf "Governor $cur_gov backup done.\n" 8062306a36Sopenharmony_ci} 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_cirestore_governor() 8362306a36Sopenharmony_ci{ 8462306a36Sopenharmony_ci i=0; 8562306a36Sopenharmony_ci 8662306a36Sopenharmony_ci policies=$(awk '{print $1}' $OUTFILE.backup_governor.log) 8762306a36Sopenharmony_ci for policy in $policies; do 8862306a36Sopenharmony_ci let i++; 8962306a36Sopenharmony_ci governor=$(sed -n ''$i'p' $OUTFILE.backup_governor.log | awk '{print $2}') 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_ci # switch governor 9262306a36Sopenharmony_ci echo $governor > $CPUFREQROOT/$policy/scaling_governor 9362306a36Sopenharmony_ci done 9462306a36Sopenharmony_ci 9562306a36Sopenharmony_ci printf "Governor restored to $governor.\n" 9662306a36Sopenharmony_ci} 9762306a36Sopenharmony_ci 9862306a36Sopenharmony_ci# $1: governor 9962306a36Sopenharmony_ciswitch_governor() 10062306a36Sopenharmony_ci{ 10162306a36Sopenharmony_ci policies=$(ls $CPUFREQROOT| grep "policy[0-9].*") 10262306a36Sopenharmony_ci for policy in $policies; do 10362306a36Sopenharmony_ci filepath=$CPUFREQROOT/$policy/scaling_available_governors 10462306a36Sopenharmony_ci 10562306a36Sopenharmony_ci # Exit if cpu isn't managed by cpufreq core 10662306a36Sopenharmony_ci if [ ! -f $filepath ]; then 10762306a36Sopenharmony_ci return; 10862306a36Sopenharmony_ci fi 10962306a36Sopenharmony_ci 11062306a36Sopenharmony_ci echo $1 > $CPUFREQROOT/$policy/scaling_governor 11162306a36Sopenharmony_ci done 11262306a36Sopenharmony_ci 11362306a36Sopenharmony_ci printf "Switched governor to $1.\n" 11462306a36Sopenharmony_ci} 11562306a36Sopenharmony_ci 11662306a36Sopenharmony_ci# All amd-pstate tests 11762306a36Sopenharmony_ciamd_pstate_all() 11862306a36Sopenharmony_ci{ 11962306a36Sopenharmony_ci printf "\n=============================================\n" 12062306a36Sopenharmony_ci printf "***** Running AMD P-state Sanity Tests *****\n" 12162306a36Sopenharmony_ci printf "=============================================\n\n" 12262306a36Sopenharmony_ci 12362306a36Sopenharmony_ci count=$(count_cpus) 12462306a36Sopenharmony_ci if [ $count = 0 ]; then 12562306a36Sopenharmony_ci printf "No cpu is managed by cpufreq core, exiting\n" 12662306a36Sopenharmony_ci exit; 12762306a36Sopenharmony_ci else 12862306a36Sopenharmony_ci printf "AMD P-state manages: $count CPUs\n" 12962306a36Sopenharmony_ci fi 13062306a36Sopenharmony_ci 13162306a36Sopenharmony_ci # unit test for amd-pstate kernel driver 13262306a36Sopenharmony_ci amd_pstate_basic 13362306a36Sopenharmony_ci 13462306a36Sopenharmony_ci # tbench 13562306a36Sopenharmony_ci amd_pstate_tbench 13662306a36Sopenharmony_ci 13762306a36Sopenharmony_ci # gitsource 13862306a36Sopenharmony_ci amd_pstate_gitsource 13962306a36Sopenharmony_ci} 14062306a36Sopenharmony_ci 14162306a36Sopenharmony_cihelp() 14262306a36Sopenharmony_ci{ 14362306a36Sopenharmony_ci printf "Usage: $0 [OPTION...] 14462306a36Sopenharmony_ci [-h <help>] 14562306a36Sopenharmony_ci [-o <output-file-for-dump>] 14662306a36Sopenharmony_ci [-c <all: All testing, 14762306a36Sopenharmony_ci basic: Basic testing, 14862306a36Sopenharmony_ci tbench: Tbench testing, 14962306a36Sopenharmony_ci gitsource: Gitsource testing.>] 15062306a36Sopenharmony_ci [-t <tbench time limit>] 15162306a36Sopenharmony_ci [-p <tbench process number>] 15262306a36Sopenharmony_ci [-l <loop times for tbench>] 15362306a36Sopenharmony_ci [-i <amd tracer interval>] 15462306a36Sopenharmony_ci [-m <comparative test: acpi-cpufreq>] 15562306a36Sopenharmony_ci \n" 15662306a36Sopenharmony_ci exit 2 15762306a36Sopenharmony_ci} 15862306a36Sopenharmony_ci 15962306a36Sopenharmony_ciparse_arguments() 16062306a36Sopenharmony_ci{ 16162306a36Sopenharmony_ci while getopts ho:c:t:p:l:i:m: arg 16262306a36Sopenharmony_ci do 16362306a36Sopenharmony_ci case $arg in 16462306a36Sopenharmony_ci h) # --help 16562306a36Sopenharmony_ci help 16662306a36Sopenharmony_ci ;; 16762306a36Sopenharmony_ci 16862306a36Sopenharmony_ci c) # --func_type (Function to perform: basic, tbench, gitsource (default: all)) 16962306a36Sopenharmony_ci FUNC=$OPTARG 17062306a36Sopenharmony_ci ;; 17162306a36Sopenharmony_ci 17262306a36Sopenharmony_ci o) # --output-file (Output file to store dumps) 17362306a36Sopenharmony_ci OUTFILE=$OPTARG 17462306a36Sopenharmony_ci ;; 17562306a36Sopenharmony_ci 17662306a36Sopenharmony_ci t) # --tbench-time-limit 17762306a36Sopenharmony_ci TIME_LIMIT=$OPTARG 17862306a36Sopenharmony_ci ;; 17962306a36Sopenharmony_ci 18062306a36Sopenharmony_ci p) # --tbench-process-number 18162306a36Sopenharmony_ci PROCESS_NUM=$OPTARG 18262306a36Sopenharmony_ci ;; 18362306a36Sopenharmony_ci 18462306a36Sopenharmony_ci l) # --tbench/gitsource-loop-times 18562306a36Sopenharmony_ci LOOP_TIMES=$OPTARG 18662306a36Sopenharmony_ci ;; 18762306a36Sopenharmony_ci 18862306a36Sopenharmony_ci i) # --amd-tracer-interval 18962306a36Sopenharmony_ci TRACER_INTERVAL=$OPTARG 19062306a36Sopenharmony_ci ;; 19162306a36Sopenharmony_ci 19262306a36Sopenharmony_ci m) # --comparative-test 19362306a36Sopenharmony_ci COMPARATIVE_TEST=$OPTARG 19462306a36Sopenharmony_ci ;; 19562306a36Sopenharmony_ci 19662306a36Sopenharmony_ci *) 19762306a36Sopenharmony_ci help 19862306a36Sopenharmony_ci ;; 19962306a36Sopenharmony_ci esac 20062306a36Sopenharmony_ci done 20162306a36Sopenharmony_ci} 20262306a36Sopenharmony_ci 20362306a36Sopenharmony_cicommand_perf() 20462306a36Sopenharmony_ci{ 20562306a36Sopenharmony_ci if ! command -v perf > /dev/null; then 20662306a36Sopenharmony_ci echo $msg please install perf. >&2 20762306a36Sopenharmony_ci exit $ksft_skip 20862306a36Sopenharmony_ci fi 20962306a36Sopenharmony_ci} 21062306a36Sopenharmony_ci 21162306a36Sopenharmony_cicommand_tbench() 21262306a36Sopenharmony_ci{ 21362306a36Sopenharmony_ci if ! command -v tbench > /dev/null; then 21462306a36Sopenharmony_ci if apt policy dbench > /dev/null 2>&1; then 21562306a36Sopenharmony_ci echo $msg apt install dbench >&2 21662306a36Sopenharmony_ci exit $ksft_skip 21762306a36Sopenharmony_ci elif yum list available | grep dbench > /dev/null 2>&1; then 21862306a36Sopenharmony_ci echo $msg yum install dbench >&2 21962306a36Sopenharmony_ci exit $ksft_skip 22062306a36Sopenharmony_ci fi 22162306a36Sopenharmony_ci fi 22262306a36Sopenharmony_ci 22362306a36Sopenharmony_ci if ! command -v tbench > /dev/null; then 22462306a36Sopenharmony_ci echo $msg please install tbench. >&2 22562306a36Sopenharmony_ci exit $ksft_skip 22662306a36Sopenharmony_ci fi 22762306a36Sopenharmony_ci} 22862306a36Sopenharmony_ci 22962306a36Sopenharmony_ciprerequisite() 23062306a36Sopenharmony_ci{ 23162306a36Sopenharmony_ci if ! echo "$ARCH" | grep -q x86; then 23262306a36Sopenharmony_ci echo "$0 # Skipped: Test can only run on x86 architectures." 23362306a36Sopenharmony_ci exit $ksft_skip 23462306a36Sopenharmony_ci fi 23562306a36Sopenharmony_ci 23662306a36Sopenharmony_ci if ! echo "$VENDOR" | grep -iq amd; then 23762306a36Sopenharmony_ci echo "$0 # Skipped: Test can only run on AMD CPU." 23862306a36Sopenharmony_ci echo "$0 # Current cpu vendor is $VENDOR." 23962306a36Sopenharmony_ci exit $ksft_skip 24062306a36Sopenharmony_ci fi 24162306a36Sopenharmony_ci 24262306a36Sopenharmony_ci scaling_driver=$(cat /sys/devices/system/cpu/cpufreq/policy0/scaling_driver) 24362306a36Sopenharmony_ci if [ "$COMPARATIVE_TEST" = "" ]; then 24462306a36Sopenharmony_ci if [ "$scaling_driver" != "$CURRENT_TEST" ]; then 24562306a36Sopenharmony_ci echo "$0 # Skipped: Test can only run on $CURRENT_TEST driver or run comparative test." 24662306a36Sopenharmony_ci echo "$0 # Please set X86_AMD_PSTATE enabled or run comparative test." 24762306a36Sopenharmony_ci echo "$0 # Current cpufreq scaling driver is $scaling_driver." 24862306a36Sopenharmony_ci exit $ksft_skip 24962306a36Sopenharmony_ci fi 25062306a36Sopenharmony_ci else 25162306a36Sopenharmony_ci case "$FUNC" in 25262306a36Sopenharmony_ci "tbench" | "gitsource") 25362306a36Sopenharmony_ci if [ "$scaling_driver" != "$COMPARATIVE_TEST" ]; then 25462306a36Sopenharmony_ci echo "$0 # Skipped: Comparison test can only run on $COMPARISON_TEST driver." 25562306a36Sopenharmony_ci echo "$0 # Current cpufreq scaling driver is $scaling_driver." 25662306a36Sopenharmony_ci exit $ksft_skip 25762306a36Sopenharmony_ci fi 25862306a36Sopenharmony_ci ;; 25962306a36Sopenharmony_ci 26062306a36Sopenharmony_ci *) 26162306a36Sopenharmony_ci echo "$0 # Skipped: Comparison test are only for tbench or gitsource." 26262306a36Sopenharmony_ci echo "$0 # Current comparative test is for $FUNC." 26362306a36Sopenharmony_ci exit $ksft_skip 26462306a36Sopenharmony_ci ;; 26562306a36Sopenharmony_ci esac 26662306a36Sopenharmony_ci fi 26762306a36Sopenharmony_ci 26862306a36Sopenharmony_ci if [ ! -w /dev ]; then 26962306a36Sopenharmony_ci echo $msg please run this as root >&2 27062306a36Sopenharmony_ci exit $ksft_skip 27162306a36Sopenharmony_ci fi 27262306a36Sopenharmony_ci 27362306a36Sopenharmony_ci case "$FUNC" in 27462306a36Sopenharmony_ci "all") 27562306a36Sopenharmony_ci command_perf 27662306a36Sopenharmony_ci command_tbench 27762306a36Sopenharmony_ci ;; 27862306a36Sopenharmony_ci 27962306a36Sopenharmony_ci "tbench") 28062306a36Sopenharmony_ci command_perf 28162306a36Sopenharmony_ci command_tbench 28262306a36Sopenharmony_ci ;; 28362306a36Sopenharmony_ci 28462306a36Sopenharmony_ci "gitsource") 28562306a36Sopenharmony_ci command_perf 28662306a36Sopenharmony_ci ;; 28762306a36Sopenharmony_ci esac 28862306a36Sopenharmony_ci 28962306a36Sopenharmony_ci SYSFS=`mount -t sysfs | head -1 | awk '{ print $3 }'` 29062306a36Sopenharmony_ci 29162306a36Sopenharmony_ci if [ ! -d "$SYSFS" ]; then 29262306a36Sopenharmony_ci echo $msg sysfs is not mounted >&2 29362306a36Sopenharmony_ci exit 2 29462306a36Sopenharmony_ci fi 29562306a36Sopenharmony_ci 29662306a36Sopenharmony_ci CPUROOT=$SYSFS/devices/system/cpu 29762306a36Sopenharmony_ci CPUFREQROOT="$CPUROOT/cpufreq" 29862306a36Sopenharmony_ci 29962306a36Sopenharmony_ci if ! ls $CPUROOT/cpu* > /dev/null 2>&1; then 30062306a36Sopenharmony_ci echo $msg cpus not available in sysfs >&2 30162306a36Sopenharmony_ci exit 2 30262306a36Sopenharmony_ci fi 30362306a36Sopenharmony_ci 30462306a36Sopenharmony_ci if ! ls $CPUROOT/cpufreq > /dev/null 2>&1; then 30562306a36Sopenharmony_ci echo $msg cpufreq directory not available in sysfs >&2 30662306a36Sopenharmony_ci exit 2 30762306a36Sopenharmony_ci fi 30862306a36Sopenharmony_ci} 30962306a36Sopenharmony_ci 31062306a36Sopenharmony_cido_test() 31162306a36Sopenharmony_ci{ 31262306a36Sopenharmony_ci # Check if CPUs are managed by cpufreq or not 31362306a36Sopenharmony_ci count=$(count_cpus) 31462306a36Sopenharmony_ci MAKE_CPUS=$((count*2)) 31562306a36Sopenharmony_ci 31662306a36Sopenharmony_ci if [ $count = 0 ]; then 31762306a36Sopenharmony_ci echo "No cpu is managed by cpufreq core, exiting" 31862306a36Sopenharmony_ci exit 2; 31962306a36Sopenharmony_ci fi 32062306a36Sopenharmony_ci 32162306a36Sopenharmony_ci case "$FUNC" in 32262306a36Sopenharmony_ci "all") 32362306a36Sopenharmony_ci amd_pstate_all 32462306a36Sopenharmony_ci ;; 32562306a36Sopenharmony_ci 32662306a36Sopenharmony_ci "basic") 32762306a36Sopenharmony_ci amd_pstate_basic 32862306a36Sopenharmony_ci ;; 32962306a36Sopenharmony_ci 33062306a36Sopenharmony_ci "tbench") 33162306a36Sopenharmony_ci amd_pstate_tbench 33262306a36Sopenharmony_ci ;; 33362306a36Sopenharmony_ci 33462306a36Sopenharmony_ci "gitsource") 33562306a36Sopenharmony_ci amd_pstate_gitsource 33662306a36Sopenharmony_ci ;; 33762306a36Sopenharmony_ci 33862306a36Sopenharmony_ci *) 33962306a36Sopenharmony_ci echo "Invalid [-f] function type" 34062306a36Sopenharmony_ci help 34162306a36Sopenharmony_ci ;; 34262306a36Sopenharmony_ci esac 34362306a36Sopenharmony_ci} 34462306a36Sopenharmony_ci 34562306a36Sopenharmony_ci# clear dumps 34662306a36Sopenharmony_cipre_clear_dumps() 34762306a36Sopenharmony_ci{ 34862306a36Sopenharmony_ci case "$FUNC" in 34962306a36Sopenharmony_ci "all") 35062306a36Sopenharmony_ci rm -rf $OUTFILE.log 35162306a36Sopenharmony_ci rm -rf $OUTFILE.backup_governor.log 35262306a36Sopenharmony_ci rm -rf *.png 35362306a36Sopenharmony_ci ;; 35462306a36Sopenharmony_ci 35562306a36Sopenharmony_ci "tbench") 35662306a36Sopenharmony_ci rm -rf $OUTFILE.log 35762306a36Sopenharmony_ci rm -rf $OUTFILE.backup_governor.log 35862306a36Sopenharmony_ci rm -rf tbench_*.png 35962306a36Sopenharmony_ci ;; 36062306a36Sopenharmony_ci 36162306a36Sopenharmony_ci "gitsource") 36262306a36Sopenharmony_ci rm -rf $OUTFILE.log 36362306a36Sopenharmony_ci rm -rf $OUTFILE.backup_governor.log 36462306a36Sopenharmony_ci rm -rf gitsource_*.png 36562306a36Sopenharmony_ci ;; 36662306a36Sopenharmony_ci 36762306a36Sopenharmony_ci *) 36862306a36Sopenharmony_ci ;; 36962306a36Sopenharmony_ci esac 37062306a36Sopenharmony_ci} 37162306a36Sopenharmony_ci 37262306a36Sopenharmony_cipost_clear_dumps() 37362306a36Sopenharmony_ci{ 37462306a36Sopenharmony_ci rm -rf $OUTFILE.log 37562306a36Sopenharmony_ci rm -rf $OUTFILE.backup_governor.log 37662306a36Sopenharmony_ci} 37762306a36Sopenharmony_ci 37862306a36Sopenharmony_ci# Parse arguments 37962306a36Sopenharmony_ciparse_arguments $@ 38062306a36Sopenharmony_ci 38162306a36Sopenharmony_ci# Make sure all requirements are met 38262306a36Sopenharmony_ciprerequisite 38362306a36Sopenharmony_ci 38462306a36Sopenharmony_ci# Run requested functions 38562306a36Sopenharmony_cipre_clear_dumps 38662306a36Sopenharmony_cido_test | tee -a $OUTFILE.log 38762306a36Sopenharmony_cipost_clear_dumps 388