162306a36Sopenharmony_ci#!/bin/bash 262306a36Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0-or-later 362306a36Sopenharmony_ci# Copyright (c) 2016 Microsemi. All Rights Reserved. 462306a36Sopenharmony_ci# 562306a36Sopenharmony_ci# Author: Logan Gunthorpe <logang@deltatee.com> 662306a36Sopenharmony_ci 762306a36Sopenharmony_ciREMOTE_HOST= 862306a36Sopenharmony_ciLIST_DEVS=FALSE 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ciDEBUGFS=${DEBUGFS-/sys/kernel/debug} 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ciPERF_RUN_ORDER=32 1362306a36Sopenharmony_ciMAX_MW_SIZE=0 1462306a36Sopenharmony_ciRUN_DMA_TESTS= 1562306a36Sopenharmony_ciDONT_CLEANUP= 1662306a36Sopenharmony_ciMW_SIZE=65536 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_cifunction show_help() 1962306a36Sopenharmony_ci{ 2062306a36Sopenharmony_ci echo "Usage: $0 [OPTIONS] LOCAL_DEV REMOTE_DEV" 2162306a36Sopenharmony_ci echo "Run tests on a pair of NTB endpoints." 2262306a36Sopenharmony_ci echo 2362306a36Sopenharmony_ci echo "If the NTB device loops back to the same host then," 2462306a36Sopenharmony_ci echo "just specifying the two PCI ids on the command line is" 2562306a36Sopenharmony_ci echo "sufficient. Otherwise, if the NTB link spans two hosts" 2662306a36Sopenharmony_ci echo "use the -r option to specify the hostname for the remote" 2762306a36Sopenharmony_ci echo "device. SSH will then be used to test the remote side." 2862306a36Sopenharmony_ci echo "An SSH key between the root users of the host would then" 2962306a36Sopenharmony_ci echo "be highly recommended." 3062306a36Sopenharmony_ci echo 3162306a36Sopenharmony_ci echo "Options:" 3262306a36Sopenharmony_ci echo " -C don't cleanup ntb modules on exit" 3362306a36Sopenharmony_ci echo " -h show this help message" 3462306a36Sopenharmony_ci echo " -l list available local and remote PCI ids" 3562306a36Sopenharmony_ci echo " -r REMOTE_HOST specify the remote's hostname to connect" 3662306a36Sopenharmony_ci echo " to for the test (using ssh)" 3762306a36Sopenharmony_ci echo " -m MW_SIZE memory window size for ntb_tool" 3862306a36Sopenharmony_ci echo " (default: $MW_SIZE)" 3962306a36Sopenharmony_ci echo " -d run dma tests for ntb_perf" 4062306a36Sopenharmony_ci echo " -p ORDER total data order for ntb_perf" 4162306a36Sopenharmony_ci echo " (default: $PERF_RUN_ORDER)" 4262306a36Sopenharmony_ci echo " -w MAX_MW_SIZE maxmium memory window size for ntb_perf" 4362306a36Sopenharmony_ci echo 4462306a36Sopenharmony_ci} 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_cifunction parse_args() 4762306a36Sopenharmony_ci{ 4862306a36Sopenharmony_ci OPTIND=0 4962306a36Sopenharmony_ci while getopts "b:Cdhlm:r:p:w:" opt; do 5062306a36Sopenharmony_ci case "$opt" in 5162306a36Sopenharmony_ci C) DONT_CLEANUP=1 ;; 5262306a36Sopenharmony_ci d) RUN_DMA_TESTS=1 ;; 5362306a36Sopenharmony_ci h) show_help; exit 0 ;; 5462306a36Sopenharmony_ci l) LIST_DEVS=TRUE ;; 5562306a36Sopenharmony_ci m) MW_SIZE=${OPTARG} ;; 5662306a36Sopenharmony_ci r) REMOTE_HOST=${OPTARG} ;; 5762306a36Sopenharmony_ci p) PERF_RUN_ORDER=${OPTARG} ;; 5862306a36Sopenharmony_ci w) MAX_MW_SIZE=${OPTARG} ;; 5962306a36Sopenharmony_ci \?) 6062306a36Sopenharmony_ci echo "Invalid option: -$OPTARG" >&2 6162306a36Sopenharmony_ci exit 1 6262306a36Sopenharmony_ci ;; 6362306a36Sopenharmony_ci esac 6462306a36Sopenharmony_ci done 6562306a36Sopenharmony_ci} 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_ciparse_args "$@" 6862306a36Sopenharmony_cishift $((OPTIND-1)) 6962306a36Sopenharmony_ciLOCAL_DEV=$1 7062306a36Sopenharmony_cishift 7162306a36Sopenharmony_ciparse_args "$@" 7262306a36Sopenharmony_cishift $((OPTIND-1)) 7362306a36Sopenharmony_ciREMOTE_DEV=$1 7462306a36Sopenharmony_cishift 7562306a36Sopenharmony_ciparse_args "$@" 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_ciset -e 7862306a36Sopenharmony_ci 7962306a36Sopenharmony_cifunction _modprobe() 8062306a36Sopenharmony_ci{ 8162306a36Sopenharmony_ci modprobe "$@" || return 1 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_ci if [[ "$REMOTE_HOST" != "" ]]; then 8462306a36Sopenharmony_ci ssh "$REMOTE_HOST" modprobe "$@" || return 1 8562306a36Sopenharmony_ci fi 8662306a36Sopenharmony_ci} 8762306a36Sopenharmony_ci 8862306a36Sopenharmony_cifunction split_remote() 8962306a36Sopenharmony_ci{ 9062306a36Sopenharmony_ci VPATH=$1 9162306a36Sopenharmony_ci REMOTE= 9262306a36Sopenharmony_ci 9362306a36Sopenharmony_ci if [[ "$VPATH" == *":/"* ]]; then 9462306a36Sopenharmony_ci REMOTE=${VPATH%%:*} 9562306a36Sopenharmony_ci VPATH=${VPATH#*:} 9662306a36Sopenharmony_ci fi 9762306a36Sopenharmony_ci} 9862306a36Sopenharmony_ci 9962306a36Sopenharmony_cifunction read_file() 10062306a36Sopenharmony_ci{ 10162306a36Sopenharmony_ci split_remote $1 10262306a36Sopenharmony_ci if [[ "$REMOTE" != "" ]]; then 10362306a36Sopenharmony_ci ssh "$REMOTE" cat "$VPATH" 10462306a36Sopenharmony_ci else 10562306a36Sopenharmony_ci cat "$VPATH" 10662306a36Sopenharmony_ci fi 10762306a36Sopenharmony_ci} 10862306a36Sopenharmony_ci 10962306a36Sopenharmony_cifunction write_file() 11062306a36Sopenharmony_ci{ 11162306a36Sopenharmony_ci split_remote $2 11262306a36Sopenharmony_ci VALUE=$1 11362306a36Sopenharmony_ci 11462306a36Sopenharmony_ci if [[ "$REMOTE" != "" ]]; then 11562306a36Sopenharmony_ci ssh "$REMOTE" "echo \"$VALUE\" > \"$VPATH\"" 11662306a36Sopenharmony_ci else 11762306a36Sopenharmony_ci echo "$VALUE" > "$VPATH" 11862306a36Sopenharmony_ci fi 11962306a36Sopenharmony_ci} 12062306a36Sopenharmony_ci 12162306a36Sopenharmony_cifunction check_file() 12262306a36Sopenharmony_ci{ 12362306a36Sopenharmony_ci split_remote $1 12462306a36Sopenharmony_ci 12562306a36Sopenharmony_ci if [[ "$REMOTE" != "" ]]; then 12662306a36Sopenharmony_ci ssh "$REMOTE" "[[ -e ${VPATH} ]]" 12762306a36Sopenharmony_ci else 12862306a36Sopenharmony_ci [[ -e ${VPATH} ]] 12962306a36Sopenharmony_ci fi 13062306a36Sopenharmony_ci} 13162306a36Sopenharmony_ci 13262306a36Sopenharmony_cifunction subdirname() 13362306a36Sopenharmony_ci{ 13462306a36Sopenharmony_ci echo $(basename $(dirname $1)) 2> /dev/null 13562306a36Sopenharmony_ci} 13662306a36Sopenharmony_ci 13762306a36Sopenharmony_cifunction find_pidx() 13862306a36Sopenharmony_ci{ 13962306a36Sopenharmony_ci PORT=$1 14062306a36Sopenharmony_ci PPATH=$2 14162306a36Sopenharmony_ci 14262306a36Sopenharmony_ci for ((i = 0; i < 64; i++)); do 14362306a36Sopenharmony_ci PEER_DIR="$PPATH/peer$i" 14462306a36Sopenharmony_ci 14562306a36Sopenharmony_ci check_file ${PEER_DIR} || break 14662306a36Sopenharmony_ci 14762306a36Sopenharmony_ci PEER_PORT=$(read_file "${PEER_DIR}/port") 14862306a36Sopenharmony_ci if [[ ${PORT} -eq $PEER_PORT ]]; then 14962306a36Sopenharmony_ci echo $i 15062306a36Sopenharmony_ci return 0 15162306a36Sopenharmony_ci fi 15262306a36Sopenharmony_ci done 15362306a36Sopenharmony_ci 15462306a36Sopenharmony_ci return 1 15562306a36Sopenharmony_ci} 15662306a36Sopenharmony_ci 15762306a36Sopenharmony_cifunction port_test() 15862306a36Sopenharmony_ci{ 15962306a36Sopenharmony_ci LOC=$1 16062306a36Sopenharmony_ci REM=$2 16162306a36Sopenharmony_ci 16262306a36Sopenharmony_ci echo "Running port tests on: $(basename $LOC) / $(basename $REM)" 16362306a36Sopenharmony_ci 16462306a36Sopenharmony_ci LOCAL_PORT=$(read_file "$LOC/port") 16562306a36Sopenharmony_ci REMOTE_PORT=$(read_file "$REM/port") 16662306a36Sopenharmony_ci 16762306a36Sopenharmony_ci LOCAL_PIDX=$(find_pidx ${REMOTE_PORT} "$LOC") 16862306a36Sopenharmony_ci REMOTE_PIDX=$(find_pidx ${LOCAL_PORT} "$REM") 16962306a36Sopenharmony_ci 17062306a36Sopenharmony_ci echo "Local port ${LOCAL_PORT} with index ${REMOTE_PIDX} on remote host" 17162306a36Sopenharmony_ci echo "Peer port ${REMOTE_PORT} with index ${LOCAL_PIDX} on local host" 17262306a36Sopenharmony_ci 17362306a36Sopenharmony_ci echo " Passed" 17462306a36Sopenharmony_ci} 17562306a36Sopenharmony_ci 17662306a36Sopenharmony_cifunction link_test() 17762306a36Sopenharmony_ci{ 17862306a36Sopenharmony_ci LOC=$1 17962306a36Sopenharmony_ci REM=$2 18062306a36Sopenharmony_ci EXP=0 18162306a36Sopenharmony_ci 18262306a36Sopenharmony_ci echo "Running link tests on: $(subdirname $LOC) / $(subdirname $REM)" 18362306a36Sopenharmony_ci 18462306a36Sopenharmony_ci if ! write_file "N" "$LOC/../link" 2> /dev/null; then 18562306a36Sopenharmony_ci echo " Unsupported" 18662306a36Sopenharmony_ci return 18762306a36Sopenharmony_ci fi 18862306a36Sopenharmony_ci 18962306a36Sopenharmony_ci write_file "N" "$LOC/link_event" 19062306a36Sopenharmony_ci 19162306a36Sopenharmony_ci if [[ $(read_file "$REM/link") != "N" ]]; then 19262306a36Sopenharmony_ci echo "Expected link to be down in $REM/link" >&2 19362306a36Sopenharmony_ci exit -1 19462306a36Sopenharmony_ci fi 19562306a36Sopenharmony_ci 19662306a36Sopenharmony_ci write_file "Y" "$LOC/../link" 19762306a36Sopenharmony_ci 19862306a36Sopenharmony_ci echo " Passed" 19962306a36Sopenharmony_ci} 20062306a36Sopenharmony_ci 20162306a36Sopenharmony_cifunction doorbell_test() 20262306a36Sopenharmony_ci{ 20362306a36Sopenharmony_ci LOC=$1 20462306a36Sopenharmony_ci REM=$2 20562306a36Sopenharmony_ci EXP=0 20662306a36Sopenharmony_ci 20762306a36Sopenharmony_ci echo "Running db tests on: $(basename $LOC) / $(basename $REM)" 20862306a36Sopenharmony_ci 20962306a36Sopenharmony_ci DB_VALID_MASK=$(read_file "$LOC/db_valid_mask") 21062306a36Sopenharmony_ci 21162306a36Sopenharmony_ci write_file "c $DB_VALID_MASK" "$REM/db" 21262306a36Sopenharmony_ci 21362306a36Sopenharmony_ci for ((i = 0; i < 64; i++)); do 21462306a36Sopenharmony_ci DB=$(read_file "$REM/db") 21562306a36Sopenharmony_ci if [[ "$DB" -ne "$EXP" ]]; then 21662306a36Sopenharmony_ci echo "Doorbell doesn't match expected value $EXP " \ 21762306a36Sopenharmony_ci "in $REM/db" >&2 21862306a36Sopenharmony_ci exit -1 21962306a36Sopenharmony_ci fi 22062306a36Sopenharmony_ci 22162306a36Sopenharmony_ci let "MASK = (1 << $i) & $DB_VALID_MASK" || true 22262306a36Sopenharmony_ci let "EXP = $EXP | $MASK" || true 22362306a36Sopenharmony_ci 22462306a36Sopenharmony_ci write_file "s $MASK" "$LOC/peer_db" 22562306a36Sopenharmony_ci done 22662306a36Sopenharmony_ci 22762306a36Sopenharmony_ci write_file "c $DB_VALID_MASK" "$REM/db_mask" 22862306a36Sopenharmony_ci write_file $DB_VALID_MASK "$REM/db_event" 22962306a36Sopenharmony_ci write_file "s $DB_VALID_MASK" "$REM/db_mask" 23062306a36Sopenharmony_ci 23162306a36Sopenharmony_ci write_file "c $DB_VALID_MASK" "$REM/db" 23262306a36Sopenharmony_ci 23362306a36Sopenharmony_ci echo " Passed" 23462306a36Sopenharmony_ci} 23562306a36Sopenharmony_ci 23662306a36Sopenharmony_cifunction get_files_count() 23762306a36Sopenharmony_ci{ 23862306a36Sopenharmony_ci NAME=$1 23962306a36Sopenharmony_ci LOC=$2 24062306a36Sopenharmony_ci 24162306a36Sopenharmony_ci split_remote $LOC 24262306a36Sopenharmony_ci 24362306a36Sopenharmony_ci if [[ "$REMOTE" == "" ]]; then 24462306a36Sopenharmony_ci echo $(ls -1 "$VPATH"/${NAME}* 2>/dev/null | wc -l) 24562306a36Sopenharmony_ci else 24662306a36Sopenharmony_ci echo $(ssh "$REMOTE" "ls -1 \"$VPATH\"/${NAME}* | \ 24762306a36Sopenharmony_ci wc -l" 2> /dev/null) 24862306a36Sopenharmony_ci fi 24962306a36Sopenharmony_ci} 25062306a36Sopenharmony_ci 25162306a36Sopenharmony_cifunction scratchpad_test() 25262306a36Sopenharmony_ci{ 25362306a36Sopenharmony_ci LOC=$1 25462306a36Sopenharmony_ci REM=$2 25562306a36Sopenharmony_ci 25662306a36Sopenharmony_ci echo "Running spad tests on: $(subdirname $LOC) / $(subdirname $REM)" 25762306a36Sopenharmony_ci 25862306a36Sopenharmony_ci CNT=$(get_files_count "spad" "$LOC") 25962306a36Sopenharmony_ci 26062306a36Sopenharmony_ci if [[ $CNT -eq 0 ]]; then 26162306a36Sopenharmony_ci echo " Unsupported" 26262306a36Sopenharmony_ci return 26362306a36Sopenharmony_ci fi 26462306a36Sopenharmony_ci 26562306a36Sopenharmony_ci for ((i = 0; i < $CNT; i++)); do 26662306a36Sopenharmony_ci VAL=$RANDOM 26762306a36Sopenharmony_ci write_file "$VAL" "$LOC/spad$i" 26862306a36Sopenharmony_ci RVAL=$(read_file "$REM/../spad$i") 26962306a36Sopenharmony_ci 27062306a36Sopenharmony_ci if [[ "$VAL" -ne "$RVAL" ]]; then 27162306a36Sopenharmony_ci echo "Scratchpad $i value $RVAL doesn't match $VAL" >&2 27262306a36Sopenharmony_ci exit -1 27362306a36Sopenharmony_ci fi 27462306a36Sopenharmony_ci done 27562306a36Sopenharmony_ci 27662306a36Sopenharmony_ci echo " Passed" 27762306a36Sopenharmony_ci} 27862306a36Sopenharmony_ci 27962306a36Sopenharmony_cifunction message_test() 28062306a36Sopenharmony_ci{ 28162306a36Sopenharmony_ci LOC=$1 28262306a36Sopenharmony_ci REM=$2 28362306a36Sopenharmony_ci 28462306a36Sopenharmony_ci echo "Running msg tests on: $(subdirname $LOC) / $(subdirname $REM)" 28562306a36Sopenharmony_ci 28662306a36Sopenharmony_ci CNT=$(get_files_count "msg" "$LOC") 28762306a36Sopenharmony_ci 28862306a36Sopenharmony_ci if [[ $CNT -eq 0 ]]; then 28962306a36Sopenharmony_ci echo " Unsupported" 29062306a36Sopenharmony_ci return 29162306a36Sopenharmony_ci fi 29262306a36Sopenharmony_ci 29362306a36Sopenharmony_ci MSG_OUTBITS_MASK=$(read_file "$LOC/../msg_inbits") 29462306a36Sopenharmony_ci MSG_INBITS_MASK=$(read_file "$REM/../msg_inbits") 29562306a36Sopenharmony_ci 29662306a36Sopenharmony_ci write_file "c $MSG_OUTBITS_MASK" "$LOC/../msg_sts" 29762306a36Sopenharmony_ci write_file "c $MSG_INBITS_MASK" "$REM/../msg_sts" 29862306a36Sopenharmony_ci 29962306a36Sopenharmony_ci for ((i = 0; i < $CNT; i++)); do 30062306a36Sopenharmony_ci VAL=$RANDOM 30162306a36Sopenharmony_ci write_file "$VAL" "$LOC/msg$i" 30262306a36Sopenharmony_ci RVAL=$(read_file "$REM/../msg$i") 30362306a36Sopenharmony_ci 30462306a36Sopenharmony_ci if [[ "$VAL" -ne "${RVAL%%<-*}" ]]; then 30562306a36Sopenharmony_ci echo "Message $i value $RVAL doesn't match $VAL" >&2 30662306a36Sopenharmony_ci exit -1 30762306a36Sopenharmony_ci fi 30862306a36Sopenharmony_ci done 30962306a36Sopenharmony_ci 31062306a36Sopenharmony_ci echo " Passed" 31162306a36Sopenharmony_ci} 31262306a36Sopenharmony_ci 31362306a36Sopenharmony_cifunction get_number() 31462306a36Sopenharmony_ci{ 31562306a36Sopenharmony_ci KEY=$1 31662306a36Sopenharmony_ci 31762306a36Sopenharmony_ci sed -n "s/^\(${KEY}\)[ \t]*\(0x[0-9a-fA-F]*\)\(\[p\]\)\?$/\2/p" 31862306a36Sopenharmony_ci} 31962306a36Sopenharmony_ci 32062306a36Sopenharmony_cifunction mw_alloc() 32162306a36Sopenharmony_ci{ 32262306a36Sopenharmony_ci IDX=$1 32362306a36Sopenharmony_ci LOC=$2 32462306a36Sopenharmony_ci REM=$3 32562306a36Sopenharmony_ci 32662306a36Sopenharmony_ci write_file $MW_SIZE "$LOC/mw_trans$IDX" 32762306a36Sopenharmony_ci 32862306a36Sopenharmony_ci INB_MW=$(read_file "$LOC/mw_trans$IDX") 32962306a36Sopenharmony_ci MW_ALIGNED_SIZE=$(echo "$INB_MW" | get_number "Window Size") 33062306a36Sopenharmony_ci MW_DMA_ADDR=$(echo "$INB_MW" | get_number "DMA Address") 33162306a36Sopenharmony_ci 33262306a36Sopenharmony_ci write_file "$MW_DMA_ADDR:$(($MW_ALIGNED_SIZE))" "$REM/peer_mw_trans$IDX" 33362306a36Sopenharmony_ci 33462306a36Sopenharmony_ci if [[ $MW_SIZE -ne $MW_ALIGNED_SIZE ]]; then 33562306a36Sopenharmony_ci echo "MW $IDX size aligned to $MW_ALIGNED_SIZE" 33662306a36Sopenharmony_ci fi 33762306a36Sopenharmony_ci} 33862306a36Sopenharmony_ci 33962306a36Sopenharmony_cifunction write_mw() 34062306a36Sopenharmony_ci{ 34162306a36Sopenharmony_ci split_remote $2 34262306a36Sopenharmony_ci 34362306a36Sopenharmony_ci if [[ "$REMOTE" != "" ]]; then 34462306a36Sopenharmony_ci ssh "$REMOTE" \ 34562306a36Sopenharmony_ci dd if=/dev/urandom "of=$VPATH" 2> /dev/null || true 34662306a36Sopenharmony_ci else 34762306a36Sopenharmony_ci dd if=/dev/urandom "of=$VPATH" 2> /dev/null || true 34862306a36Sopenharmony_ci fi 34962306a36Sopenharmony_ci} 35062306a36Sopenharmony_ci 35162306a36Sopenharmony_cifunction mw_check() 35262306a36Sopenharmony_ci{ 35362306a36Sopenharmony_ci IDX=$1 35462306a36Sopenharmony_ci LOC=$2 35562306a36Sopenharmony_ci REM=$3 35662306a36Sopenharmony_ci 35762306a36Sopenharmony_ci write_mw "$LOC/mw$IDX" 35862306a36Sopenharmony_ci 35962306a36Sopenharmony_ci split_remote "$LOC/mw$IDX" 36062306a36Sopenharmony_ci if [[ "$REMOTE" == "" ]]; then 36162306a36Sopenharmony_ci A=$VPATH 36262306a36Sopenharmony_ci else 36362306a36Sopenharmony_ci A=/tmp/ntb_test.$$.A 36462306a36Sopenharmony_ci ssh "$REMOTE" cat "$VPATH" > "$A" 36562306a36Sopenharmony_ci fi 36662306a36Sopenharmony_ci 36762306a36Sopenharmony_ci split_remote "$REM/peer_mw$IDX" 36862306a36Sopenharmony_ci if [[ "$REMOTE" == "" ]]; then 36962306a36Sopenharmony_ci B=$VPATH 37062306a36Sopenharmony_ci else 37162306a36Sopenharmony_ci B=/tmp/ntb_test.$$.B 37262306a36Sopenharmony_ci ssh "$REMOTE" cat "$VPATH" > "$B" 37362306a36Sopenharmony_ci fi 37462306a36Sopenharmony_ci 37562306a36Sopenharmony_ci cmp -n $MW_ALIGNED_SIZE "$A" "$B" 37662306a36Sopenharmony_ci if [[ $? != 0 ]]; then 37762306a36Sopenharmony_ci echo "Memory window $MW did not match!" >&2 37862306a36Sopenharmony_ci fi 37962306a36Sopenharmony_ci 38062306a36Sopenharmony_ci if [[ "$A" == "/tmp/*" ]]; then 38162306a36Sopenharmony_ci rm "$A" 38262306a36Sopenharmony_ci fi 38362306a36Sopenharmony_ci 38462306a36Sopenharmony_ci if [[ "$B" == "/tmp/*" ]]; then 38562306a36Sopenharmony_ci rm "$B" 38662306a36Sopenharmony_ci fi 38762306a36Sopenharmony_ci} 38862306a36Sopenharmony_ci 38962306a36Sopenharmony_cifunction mw_free() 39062306a36Sopenharmony_ci{ 39162306a36Sopenharmony_ci IDX=$1 39262306a36Sopenharmony_ci LOC=$2 39362306a36Sopenharmony_ci REM=$3 39462306a36Sopenharmony_ci 39562306a36Sopenharmony_ci write_file "$MW_DMA_ADDR:0" "$REM/peer_mw_trans$IDX" 39662306a36Sopenharmony_ci 39762306a36Sopenharmony_ci write_file 0 "$LOC/mw_trans$IDX" 39862306a36Sopenharmony_ci} 39962306a36Sopenharmony_ci 40062306a36Sopenharmony_cifunction mw_test() 40162306a36Sopenharmony_ci{ 40262306a36Sopenharmony_ci LOC=$1 40362306a36Sopenharmony_ci REM=$2 40462306a36Sopenharmony_ci 40562306a36Sopenharmony_ci CNT=$(get_files_count "mw_trans" "$LOC") 40662306a36Sopenharmony_ci 40762306a36Sopenharmony_ci for ((i = 0; i < $CNT; i++)); do 40862306a36Sopenharmony_ci echo "Running mw$i tests on: $(subdirname $LOC) / " \ 40962306a36Sopenharmony_ci "$(subdirname $REM)" 41062306a36Sopenharmony_ci 41162306a36Sopenharmony_ci mw_alloc $i $LOC $REM 41262306a36Sopenharmony_ci 41362306a36Sopenharmony_ci mw_check $i $LOC $REM 41462306a36Sopenharmony_ci 41562306a36Sopenharmony_ci mw_free $i $LOC $REM 41662306a36Sopenharmony_ci 41762306a36Sopenharmony_ci echo " Passed" 41862306a36Sopenharmony_ci done 41962306a36Sopenharmony_ci 42062306a36Sopenharmony_ci} 42162306a36Sopenharmony_ci 42262306a36Sopenharmony_cifunction pingpong_test() 42362306a36Sopenharmony_ci{ 42462306a36Sopenharmony_ci LOC=$1 42562306a36Sopenharmony_ci REM=$2 42662306a36Sopenharmony_ci 42762306a36Sopenharmony_ci echo "Running ping pong tests on: $(basename $LOC) / $(basename $REM)" 42862306a36Sopenharmony_ci 42962306a36Sopenharmony_ci LOC_START=$(read_file "$LOC/count") 43062306a36Sopenharmony_ci REM_START=$(read_file "$REM/count") 43162306a36Sopenharmony_ci 43262306a36Sopenharmony_ci sleep 7 43362306a36Sopenharmony_ci 43462306a36Sopenharmony_ci LOC_END=$(read_file "$LOC/count") 43562306a36Sopenharmony_ci REM_END=$(read_file "$REM/count") 43662306a36Sopenharmony_ci 43762306a36Sopenharmony_ci if [[ $LOC_START == $LOC_END ]] || [[ $REM_START == $REM_END ]]; then 43862306a36Sopenharmony_ci echo "Ping pong counter not incrementing!" >&2 43962306a36Sopenharmony_ci exit 1 44062306a36Sopenharmony_ci fi 44162306a36Sopenharmony_ci 44262306a36Sopenharmony_ci echo " Passed" 44362306a36Sopenharmony_ci} 44462306a36Sopenharmony_ci 44562306a36Sopenharmony_cifunction msi_test() 44662306a36Sopenharmony_ci{ 44762306a36Sopenharmony_ci LOC=$1 44862306a36Sopenharmony_ci REM=$2 44962306a36Sopenharmony_ci 45062306a36Sopenharmony_ci write_file 1 $LOC/ready 45162306a36Sopenharmony_ci 45262306a36Sopenharmony_ci echo "Running MSI interrupt tests on: $(subdirname $LOC) / $(subdirname $REM)" 45362306a36Sopenharmony_ci 45462306a36Sopenharmony_ci CNT=$(read_file "$LOC/count") 45562306a36Sopenharmony_ci for ((i = 0; i < $CNT; i++)); do 45662306a36Sopenharmony_ci START=$(read_file $REM/../irq${i}_occurrences) 45762306a36Sopenharmony_ci write_file $i $LOC/trigger 45862306a36Sopenharmony_ci END=$(read_file $REM/../irq${i}_occurrences) 45962306a36Sopenharmony_ci 46062306a36Sopenharmony_ci if [[ $(($END - $START)) != 1 ]]; then 46162306a36Sopenharmony_ci echo "MSI did not trigger the interrupt on the remote side!" >&2 46262306a36Sopenharmony_ci exit 1 46362306a36Sopenharmony_ci fi 46462306a36Sopenharmony_ci done 46562306a36Sopenharmony_ci 46662306a36Sopenharmony_ci echo " Passed" 46762306a36Sopenharmony_ci} 46862306a36Sopenharmony_ci 46962306a36Sopenharmony_cifunction perf_test() 47062306a36Sopenharmony_ci{ 47162306a36Sopenharmony_ci USE_DMA=$1 47262306a36Sopenharmony_ci 47362306a36Sopenharmony_ci if [[ $USE_DMA == "1" ]]; then 47462306a36Sopenharmony_ci WITH="with" 47562306a36Sopenharmony_ci else 47662306a36Sopenharmony_ci WITH="without" 47762306a36Sopenharmony_ci fi 47862306a36Sopenharmony_ci 47962306a36Sopenharmony_ci _modprobe ntb_perf total_order=$PERF_RUN_ORDER \ 48062306a36Sopenharmony_ci max_mw_size=$MAX_MW_SIZE use_dma=$USE_DMA 48162306a36Sopenharmony_ci 48262306a36Sopenharmony_ci echo "Running local perf test $WITH DMA" 48362306a36Sopenharmony_ci write_file "$LOCAL_PIDX" "$LOCAL_PERF/run" 48462306a36Sopenharmony_ci echo -n " " 48562306a36Sopenharmony_ci read_file "$LOCAL_PERF/run" 48662306a36Sopenharmony_ci echo " Passed" 48762306a36Sopenharmony_ci 48862306a36Sopenharmony_ci echo "Running remote perf test $WITH DMA" 48962306a36Sopenharmony_ci write_file "$REMOTE_PIDX" "$REMOTE_PERF/run" 49062306a36Sopenharmony_ci echo -n " " 49162306a36Sopenharmony_ci read_file "$REMOTE_PERF/run" 49262306a36Sopenharmony_ci echo " Passed" 49362306a36Sopenharmony_ci 49462306a36Sopenharmony_ci _modprobe -r ntb_perf 49562306a36Sopenharmony_ci} 49662306a36Sopenharmony_ci 49762306a36Sopenharmony_cifunction ntb_tool_tests() 49862306a36Sopenharmony_ci{ 49962306a36Sopenharmony_ci LOCAL_TOOL="$DEBUGFS/ntb_tool/$LOCAL_DEV" 50062306a36Sopenharmony_ci REMOTE_TOOL="$REMOTE_HOST:$DEBUGFS/ntb_tool/$REMOTE_DEV" 50162306a36Sopenharmony_ci 50262306a36Sopenharmony_ci echo "Starting ntb_tool tests..." 50362306a36Sopenharmony_ci 50462306a36Sopenharmony_ci _modprobe ntb_tool 50562306a36Sopenharmony_ci 50662306a36Sopenharmony_ci port_test "$LOCAL_TOOL" "$REMOTE_TOOL" 50762306a36Sopenharmony_ci 50862306a36Sopenharmony_ci LOCAL_PEER_TOOL="$LOCAL_TOOL/peer$LOCAL_PIDX" 50962306a36Sopenharmony_ci REMOTE_PEER_TOOL="$REMOTE_TOOL/peer$REMOTE_PIDX" 51062306a36Sopenharmony_ci 51162306a36Sopenharmony_ci link_test "$LOCAL_PEER_TOOL" "$REMOTE_PEER_TOOL" 51262306a36Sopenharmony_ci link_test "$REMOTE_PEER_TOOL" "$LOCAL_PEER_TOOL" 51362306a36Sopenharmony_ci 51462306a36Sopenharmony_ci #Ensure the link is up on both sides before continuing 51562306a36Sopenharmony_ci write_file "Y" "$LOCAL_PEER_TOOL/link_event" 51662306a36Sopenharmony_ci write_file "Y" "$REMOTE_PEER_TOOL/link_event" 51762306a36Sopenharmony_ci 51862306a36Sopenharmony_ci doorbell_test "$LOCAL_TOOL" "$REMOTE_TOOL" 51962306a36Sopenharmony_ci doorbell_test "$REMOTE_TOOL" "$LOCAL_TOOL" 52062306a36Sopenharmony_ci 52162306a36Sopenharmony_ci scratchpad_test "$LOCAL_PEER_TOOL" "$REMOTE_PEER_TOOL" 52262306a36Sopenharmony_ci scratchpad_test "$REMOTE_PEER_TOOL" "$LOCAL_PEER_TOOL" 52362306a36Sopenharmony_ci 52462306a36Sopenharmony_ci message_test "$LOCAL_PEER_TOOL" "$REMOTE_PEER_TOOL" 52562306a36Sopenharmony_ci message_test "$REMOTE_PEER_TOOL" "$LOCAL_PEER_TOOL" 52662306a36Sopenharmony_ci 52762306a36Sopenharmony_ci mw_test "$LOCAL_PEER_TOOL" "$REMOTE_PEER_TOOL" 52862306a36Sopenharmony_ci mw_test "$REMOTE_PEER_TOOL" "$LOCAL_PEER_TOOL" 52962306a36Sopenharmony_ci 53062306a36Sopenharmony_ci _modprobe -r ntb_tool 53162306a36Sopenharmony_ci} 53262306a36Sopenharmony_ci 53362306a36Sopenharmony_cifunction ntb_pingpong_tests() 53462306a36Sopenharmony_ci{ 53562306a36Sopenharmony_ci LOCAL_PP="$DEBUGFS/ntb_pingpong/$LOCAL_DEV" 53662306a36Sopenharmony_ci REMOTE_PP="$REMOTE_HOST:$DEBUGFS/ntb_pingpong/$REMOTE_DEV" 53762306a36Sopenharmony_ci 53862306a36Sopenharmony_ci echo "Starting ntb_pingpong tests..." 53962306a36Sopenharmony_ci 54062306a36Sopenharmony_ci _modprobe ntb_pingpong 54162306a36Sopenharmony_ci 54262306a36Sopenharmony_ci pingpong_test $LOCAL_PP $REMOTE_PP 54362306a36Sopenharmony_ci 54462306a36Sopenharmony_ci _modprobe -r ntb_pingpong 54562306a36Sopenharmony_ci} 54662306a36Sopenharmony_ci 54762306a36Sopenharmony_cifunction ntb_msi_tests() 54862306a36Sopenharmony_ci{ 54962306a36Sopenharmony_ci LOCAL_MSI="$DEBUGFS/ntb_msi_test/$LOCAL_DEV" 55062306a36Sopenharmony_ci REMOTE_MSI="$REMOTE_HOST:$DEBUGFS/ntb_msi_test/$REMOTE_DEV" 55162306a36Sopenharmony_ci 55262306a36Sopenharmony_ci echo "Starting ntb_msi_test tests..." 55362306a36Sopenharmony_ci 55462306a36Sopenharmony_ci if ! _modprobe ntb_msi_test 2> /dev/null; then 55562306a36Sopenharmony_ci echo " Not doing MSI tests seeing the module is not available." 55662306a36Sopenharmony_ci return 55762306a36Sopenharmony_ci fi 55862306a36Sopenharmony_ci 55962306a36Sopenharmony_ci port_test $LOCAL_MSI $REMOTE_MSI 56062306a36Sopenharmony_ci 56162306a36Sopenharmony_ci LOCAL_PEER="$LOCAL_MSI/peer$LOCAL_PIDX" 56262306a36Sopenharmony_ci REMOTE_PEER="$REMOTE_MSI/peer$REMOTE_PIDX" 56362306a36Sopenharmony_ci 56462306a36Sopenharmony_ci msi_test $LOCAL_PEER $REMOTE_PEER 56562306a36Sopenharmony_ci msi_test $REMOTE_PEER $LOCAL_PEER 56662306a36Sopenharmony_ci 56762306a36Sopenharmony_ci _modprobe -r ntb_msi_test 56862306a36Sopenharmony_ci} 56962306a36Sopenharmony_ci 57062306a36Sopenharmony_cifunction ntb_perf_tests() 57162306a36Sopenharmony_ci{ 57262306a36Sopenharmony_ci LOCAL_PERF="$DEBUGFS/ntb_perf/$LOCAL_DEV" 57362306a36Sopenharmony_ci REMOTE_PERF="$REMOTE_HOST:$DEBUGFS/ntb_perf/$REMOTE_DEV" 57462306a36Sopenharmony_ci 57562306a36Sopenharmony_ci echo "Starting ntb_perf tests..." 57662306a36Sopenharmony_ci 57762306a36Sopenharmony_ci perf_test 0 57862306a36Sopenharmony_ci 57962306a36Sopenharmony_ci if [[ $RUN_DMA_TESTS ]]; then 58062306a36Sopenharmony_ci perf_test 1 58162306a36Sopenharmony_ci fi 58262306a36Sopenharmony_ci} 58362306a36Sopenharmony_ci 58462306a36Sopenharmony_cifunction cleanup() 58562306a36Sopenharmony_ci{ 58662306a36Sopenharmony_ci set +e 58762306a36Sopenharmony_ci _modprobe -r ntb_tool 2> /dev/null 58862306a36Sopenharmony_ci _modprobe -r ntb_perf 2> /dev/null 58962306a36Sopenharmony_ci _modprobe -r ntb_pingpong 2> /dev/null 59062306a36Sopenharmony_ci _modprobe -r ntb_transport 2> /dev/null 59162306a36Sopenharmony_ci _modprobe -r ntb_msi_test 2> /dev/null 59262306a36Sopenharmony_ci set -e 59362306a36Sopenharmony_ci} 59462306a36Sopenharmony_ci 59562306a36Sopenharmony_cicleanup 59662306a36Sopenharmony_ci 59762306a36Sopenharmony_ciif ! [[ $$DONT_CLEANUP ]]; then 59862306a36Sopenharmony_ci trap cleanup EXIT 59962306a36Sopenharmony_cifi 60062306a36Sopenharmony_ci 60162306a36Sopenharmony_ciif [ "$(id -u)" != "0" ]; then 60262306a36Sopenharmony_ci echo "This script must be run as root" 1>&2 60362306a36Sopenharmony_ci exit 1 60462306a36Sopenharmony_cifi 60562306a36Sopenharmony_ci 60662306a36Sopenharmony_ciif [[ "$LIST_DEVS" == TRUE ]]; then 60762306a36Sopenharmony_ci echo "Local Devices:" 60862306a36Sopenharmony_ci ls -1 /sys/bus/ntb/devices 60962306a36Sopenharmony_ci echo 61062306a36Sopenharmony_ci 61162306a36Sopenharmony_ci if [[ "$REMOTE_HOST" != "" ]]; then 61262306a36Sopenharmony_ci echo "Remote Devices:" 61362306a36Sopenharmony_ci ssh $REMOTE_HOST ls -1 /sys/bus/ntb/devices 61462306a36Sopenharmony_ci fi 61562306a36Sopenharmony_ci 61662306a36Sopenharmony_ci exit 0 61762306a36Sopenharmony_cifi 61862306a36Sopenharmony_ci 61962306a36Sopenharmony_ciif [[ "$LOCAL_DEV" == $"" ]] || [[ "$REMOTE_DEV" == $"" ]]; then 62062306a36Sopenharmony_ci show_help 62162306a36Sopenharmony_ci exit 1 62262306a36Sopenharmony_cifi 62362306a36Sopenharmony_ci 62462306a36Sopenharmony_cintb_tool_tests 62562306a36Sopenharmony_ciecho 62662306a36Sopenharmony_cintb_pingpong_tests 62762306a36Sopenharmony_ciecho 62862306a36Sopenharmony_cintb_msi_tests 62962306a36Sopenharmony_ciecho 63062306a36Sopenharmony_cintb_perf_tests 63162306a36Sopenharmony_ciecho 632