1*4882a593Smuzhiyun#!/bin/bash 2*4882a593Smuzhiyun# SPDX-License-Identifier: GPL-2.0-or-later 3*4882a593Smuzhiyun# Copyright (c) 2016 Microsemi. All Rights Reserved. 4*4882a593Smuzhiyun# 5*4882a593Smuzhiyun# Author: Logan Gunthorpe <logang@deltatee.com> 6*4882a593Smuzhiyun 7*4882a593SmuzhiyunREMOTE_HOST= 8*4882a593SmuzhiyunLIST_DEVS=FALSE 9*4882a593Smuzhiyun 10*4882a593SmuzhiyunDEBUGFS=${DEBUGFS-/sys/kernel/debug} 11*4882a593Smuzhiyun 12*4882a593SmuzhiyunPERF_RUN_ORDER=32 13*4882a593SmuzhiyunMAX_MW_SIZE=0 14*4882a593SmuzhiyunRUN_DMA_TESTS= 15*4882a593SmuzhiyunDONT_CLEANUP= 16*4882a593SmuzhiyunMW_SIZE=65536 17*4882a593Smuzhiyun 18*4882a593Smuzhiyunfunction show_help() 19*4882a593Smuzhiyun{ 20*4882a593Smuzhiyun echo "Usage: $0 [OPTIONS] LOCAL_DEV REMOTE_DEV" 21*4882a593Smuzhiyun echo "Run tests on a pair of NTB endpoints." 22*4882a593Smuzhiyun echo 23*4882a593Smuzhiyun echo "If the NTB device loops back to the same host then," 24*4882a593Smuzhiyun echo "just specifying the two PCI ids on the command line is" 25*4882a593Smuzhiyun echo "sufficient. Otherwise, if the NTB link spans two hosts" 26*4882a593Smuzhiyun echo "use the -r option to specify the hostname for the remote" 27*4882a593Smuzhiyun echo "device. SSH will then be used to test the remote side." 28*4882a593Smuzhiyun echo "An SSH key between the root users of the host would then" 29*4882a593Smuzhiyun echo "be highly recommended." 30*4882a593Smuzhiyun echo 31*4882a593Smuzhiyun echo "Options:" 32*4882a593Smuzhiyun echo " -C don't cleanup ntb modules on exit" 33*4882a593Smuzhiyun echo " -h show this help message" 34*4882a593Smuzhiyun echo " -l list available local and remote PCI ids" 35*4882a593Smuzhiyun echo " -r REMOTE_HOST specify the remote's hostname to connect" 36*4882a593Smuzhiyun echo " to for the test (using ssh)" 37*4882a593Smuzhiyun echo " -m MW_SIZE memory window size for ntb_tool" 38*4882a593Smuzhiyun echo " (default: $MW_SIZE)" 39*4882a593Smuzhiyun echo " -d run dma tests for ntb_perf" 40*4882a593Smuzhiyun echo " -p ORDER total data order for ntb_perf" 41*4882a593Smuzhiyun echo " (default: $PERF_RUN_ORDER)" 42*4882a593Smuzhiyun echo " -w MAX_MW_SIZE maxmium memory window size for ntb_perf" 43*4882a593Smuzhiyun echo 44*4882a593Smuzhiyun} 45*4882a593Smuzhiyun 46*4882a593Smuzhiyunfunction parse_args() 47*4882a593Smuzhiyun{ 48*4882a593Smuzhiyun OPTIND=0 49*4882a593Smuzhiyun while getopts "b:Cdhlm:r:p:w:" opt; do 50*4882a593Smuzhiyun case "$opt" in 51*4882a593Smuzhiyun C) DONT_CLEANUP=1 ;; 52*4882a593Smuzhiyun d) RUN_DMA_TESTS=1 ;; 53*4882a593Smuzhiyun h) show_help; exit 0 ;; 54*4882a593Smuzhiyun l) LIST_DEVS=TRUE ;; 55*4882a593Smuzhiyun m) MW_SIZE=${OPTARG} ;; 56*4882a593Smuzhiyun r) REMOTE_HOST=${OPTARG} ;; 57*4882a593Smuzhiyun p) PERF_RUN_ORDER=${OPTARG} ;; 58*4882a593Smuzhiyun w) MAX_MW_SIZE=${OPTARG} ;; 59*4882a593Smuzhiyun \?) 60*4882a593Smuzhiyun echo "Invalid option: -$OPTARG" >&2 61*4882a593Smuzhiyun exit 1 62*4882a593Smuzhiyun ;; 63*4882a593Smuzhiyun esac 64*4882a593Smuzhiyun done 65*4882a593Smuzhiyun} 66*4882a593Smuzhiyun 67*4882a593Smuzhiyunparse_args "$@" 68*4882a593Smuzhiyunshift $((OPTIND-1)) 69*4882a593SmuzhiyunLOCAL_DEV=$1 70*4882a593Smuzhiyunshift 71*4882a593Smuzhiyunparse_args "$@" 72*4882a593Smuzhiyunshift $((OPTIND-1)) 73*4882a593SmuzhiyunREMOTE_DEV=$1 74*4882a593Smuzhiyunshift 75*4882a593Smuzhiyunparse_args "$@" 76*4882a593Smuzhiyun 77*4882a593Smuzhiyunset -e 78*4882a593Smuzhiyun 79*4882a593Smuzhiyunfunction _modprobe() 80*4882a593Smuzhiyun{ 81*4882a593Smuzhiyun modprobe "$@" || return 1 82*4882a593Smuzhiyun 83*4882a593Smuzhiyun if [[ "$REMOTE_HOST" != "" ]]; then 84*4882a593Smuzhiyun ssh "$REMOTE_HOST" modprobe "$@" || return 1 85*4882a593Smuzhiyun fi 86*4882a593Smuzhiyun} 87*4882a593Smuzhiyun 88*4882a593Smuzhiyunfunction split_remote() 89*4882a593Smuzhiyun{ 90*4882a593Smuzhiyun VPATH=$1 91*4882a593Smuzhiyun REMOTE= 92*4882a593Smuzhiyun 93*4882a593Smuzhiyun if [[ "$VPATH" == *":/"* ]]; then 94*4882a593Smuzhiyun REMOTE=${VPATH%%:*} 95*4882a593Smuzhiyun VPATH=${VPATH#*:} 96*4882a593Smuzhiyun fi 97*4882a593Smuzhiyun} 98*4882a593Smuzhiyun 99*4882a593Smuzhiyunfunction read_file() 100*4882a593Smuzhiyun{ 101*4882a593Smuzhiyun split_remote $1 102*4882a593Smuzhiyun if [[ "$REMOTE" != "" ]]; then 103*4882a593Smuzhiyun ssh "$REMOTE" cat "$VPATH" 104*4882a593Smuzhiyun else 105*4882a593Smuzhiyun cat "$VPATH" 106*4882a593Smuzhiyun fi 107*4882a593Smuzhiyun} 108*4882a593Smuzhiyun 109*4882a593Smuzhiyunfunction write_file() 110*4882a593Smuzhiyun{ 111*4882a593Smuzhiyun split_remote $2 112*4882a593Smuzhiyun VALUE=$1 113*4882a593Smuzhiyun 114*4882a593Smuzhiyun if [[ "$REMOTE" != "" ]]; then 115*4882a593Smuzhiyun ssh "$REMOTE" "echo \"$VALUE\" > \"$VPATH\"" 116*4882a593Smuzhiyun else 117*4882a593Smuzhiyun echo "$VALUE" > "$VPATH" 118*4882a593Smuzhiyun fi 119*4882a593Smuzhiyun} 120*4882a593Smuzhiyun 121*4882a593Smuzhiyunfunction check_file() 122*4882a593Smuzhiyun{ 123*4882a593Smuzhiyun split_remote $1 124*4882a593Smuzhiyun 125*4882a593Smuzhiyun if [[ "$REMOTE" != "" ]]; then 126*4882a593Smuzhiyun ssh "$REMOTE" "[[ -e ${VPATH} ]]" 127*4882a593Smuzhiyun else 128*4882a593Smuzhiyun [[ -e ${VPATH} ]] 129*4882a593Smuzhiyun fi 130*4882a593Smuzhiyun} 131*4882a593Smuzhiyun 132*4882a593Smuzhiyunfunction subdirname() 133*4882a593Smuzhiyun{ 134*4882a593Smuzhiyun echo $(basename $(dirname $1)) 2> /dev/null 135*4882a593Smuzhiyun} 136*4882a593Smuzhiyun 137*4882a593Smuzhiyunfunction find_pidx() 138*4882a593Smuzhiyun{ 139*4882a593Smuzhiyun PORT=$1 140*4882a593Smuzhiyun PPATH=$2 141*4882a593Smuzhiyun 142*4882a593Smuzhiyun for ((i = 0; i < 64; i++)); do 143*4882a593Smuzhiyun PEER_DIR="$PPATH/peer$i" 144*4882a593Smuzhiyun 145*4882a593Smuzhiyun check_file ${PEER_DIR} || break 146*4882a593Smuzhiyun 147*4882a593Smuzhiyun PEER_PORT=$(read_file "${PEER_DIR}/port") 148*4882a593Smuzhiyun if [[ ${PORT} -eq $PEER_PORT ]]; then 149*4882a593Smuzhiyun echo $i 150*4882a593Smuzhiyun return 0 151*4882a593Smuzhiyun fi 152*4882a593Smuzhiyun done 153*4882a593Smuzhiyun 154*4882a593Smuzhiyun return 1 155*4882a593Smuzhiyun} 156*4882a593Smuzhiyun 157*4882a593Smuzhiyunfunction port_test() 158*4882a593Smuzhiyun{ 159*4882a593Smuzhiyun LOC=$1 160*4882a593Smuzhiyun REM=$2 161*4882a593Smuzhiyun 162*4882a593Smuzhiyun echo "Running port tests on: $(basename $LOC) / $(basename $REM)" 163*4882a593Smuzhiyun 164*4882a593Smuzhiyun LOCAL_PORT=$(read_file "$LOC/port") 165*4882a593Smuzhiyun REMOTE_PORT=$(read_file "$REM/port") 166*4882a593Smuzhiyun 167*4882a593Smuzhiyun LOCAL_PIDX=$(find_pidx ${REMOTE_PORT} "$LOC") 168*4882a593Smuzhiyun REMOTE_PIDX=$(find_pidx ${LOCAL_PORT} "$REM") 169*4882a593Smuzhiyun 170*4882a593Smuzhiyun echo "Local port ${LOCAL_PORT} with index ${REMOTE_PIDX} on remote host" 171*4882a593Smuzhiyun echo "Peer port ${REMOTE_PORT} with index ${LOCAL_PIDX} on local host" 172*4882a593Smuzhiyun 173*4882a593Smuzhiyun echo " Passed" 174*4882a593Smuzhiyun} 175*4882a593Smuzhiyun 176*4882a593Smuzhiyunfunction link_test() 177*4882a593Smuzhiyun{ 178*4882a593Smuzhiyun LOC=$1 179*4882a593Smuzhiyun REM=$2 180*4882a593Smuzhiyun EXP=0 181*4882a593Smuzhiyun 182*4882a593Smuzhiyun echo "Running link tests on: $(subdirname $LOC) / $(subdirname $REM)" 183*4882a593Smuzhiyun 184*4882a593Smuzhiyun if ! write_file "N" "$LOC/../link" 2> /dev/null; then 185*4882a593Smuzhiyun echo " Unsupported" 186*4882a593Smuzhiyun return 187*4882a593Smuzhiyun fi 188*4882a593Smuzhiyun 189*4882a593Smuzhiyun write_file "N" "$LOC/link_event" 190*4882a593Smuzhiyun 191*4882a593Smuzhiyun if [[ $(read_file "$REM/link") != "N" ]]; then 192*4882a593Smuzhiyun echo "Expected link to be down in $REM/link" >&2 193*4882a593Smuzhiyun exit -1 194*4882a593Smuzhiyun fi 195*4882a593Smuzhiyun 196*4882a593Smuzhiyun write_file "Y" "$LOC/../link" 197*4882a593Smuzhiyun 198*4882a593Smuzhiyun echo " Passed" 199*4882a593Smuzhiyun} 200*4882a593Smuzhiyun 201*4882a593Smuzhiyunfunction doorbell_test() 202*4882a593Smuzhiyun{ 203*4882a593Smuzhiyun LOC=$1 204*4882a593Smuzhiyun REM=$2 205*4882a593Smuzhiyun EXP=0 206*4882a593Smuzhiyun 207*4882a593Smuzhiyun echo "Running db tests on: $(basename $LOC) / $(basename $REM)" 208*4882a593Smuzhiyun 209*4882a593Smuzhiyun DB_VALID_MASK=$(read_file "$LOC/db_valid_mask") 210*4882a593Smuzhiyun 211*4882a593Smuzhiyun write_file "c $DB_VALID_MASK" "$REM/db" 212*4882a593Smuzhiyun 213*4882a593Smuzhiyun for ((i = 0; i < 64; i++)); do 214*4882a593Smuzhiyun DB=$(read_file "$REM/db") 215*4882a593Smuzhiyun if [[ "$DB" -ne "$EXP" ]]; then 216*4882a593Smuzhiyun echo "Doorbell doesn't match expected value $EXP " \ 217*4882a593Smuzhiyun "in $REM/db" >&2 218*4882a593Smuzhiyun exit -1 219*4882a593Smuzhiyun fi 220*4882a593Smuzhiyun 221*4882a593Smuzhiyun let "MASK = (1 << $i) & $DB_VALID_MASK" || true 222*4882a593Smuzhiyun let "EXP = $EXP | $MASK" || true 223*4882a593Smuzhiyun 224*4882a593Smuzhiyun write_file "s $MASK" "$LOC/peer_db" 225*4882a593Smuzhiyun done 226*4882a593Smuzhiyun 227*4882a593Smuzhiyun write_file "c $DB_VALID_MASK" "$REM/db_mask" 228*4882a593Smuzhiyun write_file $DB_VALID_MASK "$REM/db_event" 229*4882a593Smuzhiyun write_file "s $DB_VALID_MASK" "$REM/db_mask" 230*4882a593Smuzhiyun 231*4882a593Smuzhiyun write_file "c $DB_VALID_MASK" "$REM/db" 232*4882a593Smuzhiyun 233*4882a593Smuzhiyun echo " Passed" 234*4882a593Smuzhiyun} 235*4882a593Smuzhiyun 236*4882a593Smuzhiyunfunction get_files_count() 237*4882a593Smuzhiyun{ 238*4882a593Smuzhiyun NAME=$1 239*4882a593Smuzhiyun LOC=$2 240*4882a593Smuzhiyun 241*4882a593Smuzhiyun split_remote $LOC 242*4882a593Smuzhiyun 243*4882a593Smuzhiyun if [[ "$REMOTE" == "" ]]; then 244*4882a593Smuzhiyun echo $(ls -1 "$VPATH"/${NAME}* 2>/dev/null | wc -l) 245*4882a593Smuzhiyun else 246*4882a593Smuzhiyun echo $(ssh "$REMOTE" "ls -1 \"$VPATH\"/${NAME}* | \ 247*4882a593Smuzhiyun wc -l" 2> /dev/null) 248*4882a593Smuzhiyun fi 249*4882a593Smuzhiyun} 250*4882a593Smuzhiyun 251*4882a593Smuzhiyunfunction scratchpad_test() 252*4882a593Smuzhiyun{ 253*4882a593Smuzhiyun LOC=$1 254*4882a593Smuzhiyun REM=$2 255*4882a593Smuzhiyun 256*4882a593Smuzhiyun echo "Running spad tests on: $(subdirname $LOC) / $(subdirname $REM)" 257*4882a593Smuzhiyun 258*4882a593Smuzhiyun CNT=$(get_files_count "spad" "$LOC") 259*4882a593Smuzhiyun 260*4882a593Smuzhiyun if [[ $CNT -eq 0 ]]; then 261*4882a593Smuzhiyun echo " Unsupported" 262*4882a593Smuzhiyun return 263*4882a593Smuzhiyun fi 264*4882a593Smuzhiyun 265*4882a593Smuzhiyun for ((i = 0; i < $CNT; i++)); do 266*4882a593Smuzhiyun VAL=$RANDOM 267*4882a593Smuzhiyun write_file "$VAL" "$LOC/spad$i" 268*4882a593Smuzhiyun RVAL=$(read_file "$REM/../spad$i") 269*4882a593Smuzhiyun 270*4882a593Smuzhiyun if [[ "$VAL" -ne "$RVAL" ]]; then 271*4882a593Smuzhiyun echo "Scratchpad $i value $RVAL doesn't match $VAL" >&2 272*4882a593Smuzhiyun exit -1 273*4882a593Smuzhiyun fi 274*4882a593Smuzhiyun done 275*4882a593Smuzhiyun 276*4882a593Smuzhiyun echo " Passed" 277*4882a593Smuzhiyun} 278*4882a593Smuzhiyun 279*4882a593Smuzhiyunfunction message_test() 280*4882a593Smuzhiyun{ 281*4882a593Smuzhiyun LOC=$1 282*4882a593Smuzhiyun REM=$2 283*4882a593Smuzhiyun 284*4882a593Smuzhiyun echo "Running msg tests on: $(subdirname $LOC) / $(subdirname $REM)" 285*4882a593Smuzhiyun 286*4882a593Smuzhiyun CNT=$(get_files_count "msg" "$LOC") 287*4882a593Smuzhiyun 288*4882a593Smuzhiyun if [[ $CNT -eq 0 ]]; then 289*4882a593Smuzhiyun echo " Unsupported" 290*4882a593Smuzhiyun return 291*4882a593Smuzhiyun fi 292*4882a593Smuzhiyun 293*4882a593Smuzhiyun MSG_OUTBITS_MASK=$(read_file "$LOC/../msg_inbits") 294*4882a593Smuzhiyun MSG_INBITS_MASK=$(read_file "$REM/../msg_inbits") 295*4882a593Smuzhiyun 296*4882a593Smuzhiyun write_file "c $MSG_OUTBITS_MASK" "$LOC/../msg_sts" 297*4882a593Smuzhiyun write_file "c $MSG_INBITS_MASK" "$REM/../msg_sts" 298*4882a593Smuzhiyun 299*4882a593Smuzhiyun for ((i = 0; i < $CNT; i++)); do 300*4882a593Smuzhiyun VAL=$RANDOM 301*4882a593Smuzhiyun write_file "$VAL" "$LOC/msg$i" 302*4882a593Smuzhiyun RVAL=$(read_file "$REM/../msg$i") 303*4882a593Smuzhiyun 304*4882a593Smuzhiyun if [[ "$VAL" -ne "${RVAL%%<-*}" ]]; then 305*4882a593Smuzhiyun echo "Message $i value $RVAL doesn't match $VAL" >&2 306*4882a593Smuzhiyun exit -1 307*4882a593Smuzhiyun fi 308*4882a593Smuzhiyun done 309*4882a593Smuzhiyun 310*4882a593Smuzhiyun echo " Passed" 311*4882a593Smuzhiyun} 312*4882a593Smuzhiyun 313*4882a593Smuzhiyunfunction get_number() 314*4882a593Smuzhiyun{ 315*4882a593Smuzhiyun KEY=$1 316*4882a593Smuzhiyun 317*4882a593Smuzhiyun sed -n "s/^\(${KEY}\)[ \t]*\(0x[0-9a-fA-F]*\)\(\[p\]\)\?$/\2/p" 318*4882a593Smuzhiyun} 319*4882a593Smuzhiyun 320*4882a593Smuzhiyunfunction mw_alloc() 321*4882a593Smuzhiyun{ 322*4882a593Smuzhiyun IDX=$1 323*4882a593Smuzhiyun LOC=$2 324*4882a593Smuzhiyun REM=$3 325*4882a593Smuzhiyun 326*4882a593Smuzhiyun write_file $MW_SIZE "$LOC/mw_trans$IDX" 327*4882a593Smuzhiyun 328*4882a593Smuzhiyun INB_MW=$(read_file "$LOC/mw_trans$IDX") 329*4882a593Smuzhiyun MW_ALIGNED_SIZE=$(echo "$INB_MW" | get_number "Window Size") 330*4882a593Smuzhiyun MW_DMA_ADDR=$(echo "$INB_MW" | get_number "DMA Address") 331*4882a593Smuzhiyun 332*4882a593Smuzhiyun write_file "$MW_DMA_ADDR:$(($MW_ALIGNED_SIZE))" "$REM/peer_mw_trans$IDX" 333*4882a593Smuzhiyun 334*4882a593Smuzhiyun if [[ $MW_SIZE -ne $MW_ALIGNED_SIZE ]]; then 335*4882a593Smuzhiyun echo "MW $IDX size aligned to $MW_ALIGNED_SIZE" 336*4882a593Smuzhiyun fi 337*4882a593Smuzhiyun} 338*4882a593Smuzhiyun 339*4882a593Smuzhiyunfunction write_mw() 340*4882a593Smuzhiyun{ 341*4882a593Smuzhiyun split_remote $2 342*4882a593Smuzhiyun 343*4882a593Smuzhiyun if [[ "$REMOTE" != "" ]]; then 344*4882a593Smuzhiyun ssh "$REMOTE" \ 345*4882a593Smuzhiyun dd if=/dev/urandom "of=$VPATH" 2> /dev/null || true 346*4882a593Smuzhiyun else 347*4882a593Smuzhiyun dd if=/dev/urandom "of=$VPATH" 2> /dev/null || true 348*4882a593Smuzhiyun fi 349*4882a593Smuzhiyun} 350*4882a593Smuzhiyun 351*4882a593Smuzhiyunfunction mw_check() 352*4882a593Smuzhiyun{ 353*4882a593Smuzhiyun IDX=$1 354*4882a593Smuzhiyun LOC=$2 355*4882a593Smuzhiyun REM=$3 356*4882a593Smuzhiyun 357*4882a593Smuzhiyun write_mw "$LOC/mw$IDX" 358*4882a593Smuzhiyun 359*4882a593Smuzhiyun split_remote "$LOC/mw$IDX" 360*4882a593Smuzhiyun if [[ "$REMOTE" == "" ]]; then 361*4882a593Smuzhiyun A=$VPATH 362*4882a593Smuzhiyun else 363*4882a593Smuzhiyun A=/tmp/ntb_test.$$.A 364*4882a593Smuzhiyun ssh "$REMOTE" cat "$VPATH" > "$A" 365*4882a593Smuzhiyun fi 366*4882a593Smuzhiyun 367*4882a593Smuzhiyun split_remote "$REM/peer_mw$IDX" 368*4882a593Smuzhiyun if [[ "$REMOTE" == "" ]]; then 369*4882a593Smuzhiyun B=$VPATH 370*4882a593Smuzhiyun else 371*4882a593Smuzhiyun B=/tmp/ntb_test.$$.B 372*4882a593Smuzhiyun ssh "$REMOTE" cat "$VPATH" > "$B" 373*4882a593Smuzhiyun fi 374*4882a593Smuzhiyun 375*4882a593Smuzhiyun cmp -n $MW_ALIGNED_SIZE "$A" "$B" 376*4882a593Smuzhiyun if [[ $? != 0 ]]; then 377*4882a593Smuzhiyun echo "Memory window $MW did not match!" >&2 378*4882a593Smuzhiyun fi 379*4882a593Smuzhiyun 380*4882a593Smuzhiyun if [[ "$A" == "/tmp/*" ]]; then 381*4882a593Smuzhiyun rm "$A" 382*4882a593Smuzhiyun fi 383*4882a593Smuzhiyun 384*4882a593Smuzhiyun if [[ "$B" == "/tmp/*" ]]; then 385*4882a593Smuzhiyun rm "$B" 386*4882a593Smuzhiyun fi 387*4882a593Smuzhiyun} 388*4882a593Smuzhiyun 389*4882a593Smuzhiyunfunction mw_free() 390*4882a593Smuzhiyun{ 391*4882a593Smuzhiyun IDX=$1 392*4882a593Smuzhiyun LOC=$2 393*4882a593Smuzhiyun REM=$3 394*4882a593Smuzhiyun 395*4882a593Smuzhiyun write_file "$MW_DMA_ADDR:0" "$REM/peer_mw_trans$IDX" 396*4882a593Smuzhiyun 397*4882a593Smuzhiyun write_file 0 "$LOC/mw_trans$IDX" 398*4882a593Smuzhiyun} 399*4882a593Smuzhiyun 400*4882a593Smuzhiyunfunction mw_test() 401*4882a593Smuzhiyun{ 402*4882a593Smuzhiyun LOC=$1 403*4882a593Smuzhiyun REM=$2 404*4882a593Smuzhiyun 405*4882a593Smuzhiyun CNT=$(get_files_count "mw_trans" "$LOC") 406*4882a593Smuzhiyun 407*4882a593Smuzhiyun for ((i = 0; i < $CNT; i++)); do 408*4882a593Smuzhiyun echo "Running mw$i tests on: $(subdirname $LOC) / " \ 409*4882a593Smuzhiyun "$(subdirname $REM)" 410*4882a593Smuzhiyun 411*4882a593Smuzhiyun mw_alloc $i $LOC $REM 412*4882a593Smuzhiyun 413*4882a593Smuzhiyun mw_check $i $LOC $REM 414*4882a593Smuzhiyun 415*4882a593Smuzhiyun mw_free $i $LOC $REM 416*4882a593Smuzhiyun 417*4882a593Smuzhiyun echo " Passed" 418*4882a593Smuzhiyun done 419*4882a593Smuzhiyun 420*4882a593Smuzhiyun} 421*4882a593Smuzhiyun 422*4882a593Smuzhiyunfunction pingpong_test() 423*4882a593Smuzhiyun{ 424*4882a593Smuzhiyun LOC=$1 425*4882a593Smuzhiyun REM=$2 426*4882a593Smuzhiyun 427*4882a593Smuzhiyun echo "Running ping pong tests on: $(basename $LOC) / $(basename $REM)" 428*4882a593Smuzhiyun 429*4882a593Smuzhiyun LOC_START=$(read_file "$LOC/count") 430*4882a593Smuzhiyun REM_START=$(read_file "$REM/count") 431*4882a593Smuzhiyun 432*4882a593Smuzhiyun sleep 7 433*4882a593Smuzhiyun 434*4882a593Smuzhiyun LOC_END=$(read_file "$LOC/count") 435*4882a593Smuzhiyun REM_END=$(read_file "$REM/count") 436*4882a593Smuzhiyun 437*4882a593Smuzhiyun if [[ $LOC_START == $LOC_END ]] || [[ $REM_START == $REM_END ]]; then 438*4882a593Smuzhiyun echo "Ping pong counter not incrementing!" >&2 439*4882a593Smuzhiyun exit 1 440*4882a593Smuzhiyun fi 441*4882a593Smuzhiyun 442*4882a593Smuzhiyun echo " Passed" 443*4882a593Smuzhiyun} 444*4882a593Smuzhiyun 445*4882a593Smuzhiyunfunction msi_test() 446*4882a593Smuzhiyun{ 447*4882a593Smuzhiyun LOC=$1 448*4882a593Smuzhiyun REM=$2 449*4882a593Smuzhiyun 450*4882a593Smuzhiyun write_file 1 $LOC/ready 451*4882a593Smuzhiyun 452*4882a593Smuzhiyun echo "Running MSI interrupt tests on: $(subdirname $LOC) / $(subdirname $REM)" 453*4882a593Smuzhiyun 454*4882a593Smuzhiyun CNT=$(read_file "$LOC/count") 455*4882a593Smuzhiyun for ((i = 0; i < $CNT; i++)); do 456*4882a593Smuzhiyun START=$(read_file $REM/../irq${i}_occurrences) 457*4882a593Smuzhiyun write_file $i $LOC/trigger 458*4882a593Smuzhiyun END=$(read_file $REM/../irq${i}_occurrences) 459*4882a593Smuzhiyun 460*4882a593Smuzhiyun if [[ $(($END - $START)) != 1 ]]; then 461*4882a593Smuzhiyun echo "MSI did not trigger the interrupt on the remote side!" >&2 462*4882a593Smuzhiyun exit 1 463*4882a593Smuzhiyun fi 464*4882a593Smuzhiyun done 465*4882a593Smuzhiyun 466*4882a593Smuzhiyun echo " Passed" 467*4882a593Smuzhiyun} 468*4882a593Smuzhiyun 469*4882a593Smuzhiyunfunction perf_test() 470*4882a593Smuzhiyun{ 471*4882a593Smuzhiyun USE_DMA=$1 472*4882a593Smuzhiyun 473*4882a593Smuzhiyun if [[ $USE_DMA == "1" ]]; then 474*4882a593Smuzhiyun WITH="with" 475*4882a593Smuzhiyun else 476*4882a593Smuzhiyun WITH="without" 477*4882a593Smuzhiyun fi 478*4882a593Smuzhiyun 479*4882a593Smuzhiyun _modprobe ntb_perf total_order=$PERF_RUN_ORDER \ 480*4882a593Smuzhiyun max_mw_size=$MAX_MW_SIZE use_dma=$USE_DMA 481*4882a593Smuzhiyun 482*4882a593Smuzhiyun echo "Running local perf test $WITH DMA" 483*4882a593Smuzhiyun write_file "$LOCAL_PIDX" "$LOCAL_PERF/run" 484*4882a593Smuzhiyun echo -n " " 485*4882a593Smuzhiyun read_file "$LOCAL_PERF/run" 486*4882a593Smuzhiyun echo " Passed" 487*4882a593Smuzhiyun 488*4882a593Smuzhiyun echo "Running remote perf test $WITH DMA" 489*4882a593Smuzhiyun write_file "$REMOTE_PIDX" "$REMOTE_PERF/run" 490*4882a593Smuzhiyun echo -n " " 491*4882a593Smuzhiyun read_file "$REMOTE_PERF/run" 492*4882a593Smuzhiyun echo " Passed" 493*4882a593Smuzhiyun 494*4882a593Smuzhiyun _modprobe -r ntb_perf 495*4882a593Smuzhiyun} 496*4882a593Smuzhiyun 497*4882a593Smuzhiyunfunction ntb_tool_tests() 498*4882a593Smuzhiyun{ 499*4882a593Smuzhiyun LOCAL_TOOL="$DEBUGFS/ntb_tool/$LOCAL_DEV" 500*4882a593Smuzhiyun REMOTE_TOOL="$REMOTE_HOST:$DEBUGFS/ntb_tool/$REMOTE_DEV" 501*4882a593Smuzhiyun 502*4882a593Smuzhiyun echo "Starting ntb_tool tests..." 503*4882a593Smuzhiyun 504*4882a593Smuzhiyun _modprobe ntb_tool 505*4882a593Smuzhiyun 506*4882a593Smuzhiyun port_test "$LOCAL_TOOL" "$REMOTE_TOOL" 507*4882a593Smuzhiyun 508*4882a593Smuzhiyun LOCAL_PEER_TOOL="$LOCAL_TOOL/peer$LOCAL_PIDX" 509*4882a593Smuzhiyun REMOTE_PEER_TOOL="$REMOTE_TOOL/peer$REMOTE_PIDX" 510*4882a593Smuzhiyun 511*4882a593Smuzhiyun link_test "$LOCAL_PEER_TOOL" "$REMOTE_PEER_TOOL" 512*4882a593Smuzhiyun link_test "$REMOTE_PEER_TOOL" "$LOCAL_PEER_TOOL" 513*4882a593Smuzhiyun 514*4882a593Smuzhiyun #Ensure the link is up on both sides before continuing 515*4882a593Smuzhiyun write_file "Y" "$LOCAL_PEER_TOOL/link_event" 516*4882a593Smuzhiyun write_file "Y" "$REMOTE_PEER_TOOL/link_event" 517*4882a593Smuzhiyun 518*4882a593Smuzhiyun doorbell_test "$LOCAL_TOOL" "$REMOTE_TOOL" 519*4882a593Smuzhiyun doorbell_test "$REMOTE_TOOL" "$LOCAL_TOOL" 520*4882a593Smuzhiyun 521*4882a593Smuzhiyun scratchpad_test "$LOCAL_PEER_TOOL" "$REMOTE_PEER_TOOL" 522*4882a593Smuzhiyun scratchpad_test "$REMOTE_PEER_TOOL" "$LOCAL_PEER_TOOL" 523*4882a593Smuzhiyun 524*4882a593Smuzhiyun message_test "$LOCAL_PEER_TOOL" "$REMOTE_PEER_TOOL" 525*4882a593Smuzhiyun message_test "$REMOTE_PEER_TOOL" "$LOCAL_PEER_TOOL" 526*4882a593Smuzhiyun 527*4882a593Smuzhiyun mw_test "$LOCAL_PEER_TOOL" "$REMOTE_PEER_TOOL" 528*4882a593Smuzhiyun mw_test "$REMOTE_PEER_TOOL" "$LOCAL_PEER_TOOL" 529*4882a593Smuzhiyun 530*4882a593Smuzhiyun _modprobe -r ntb_tool 531*4882a593Smuzhiyun} 532*4882a593Smuzhiyun 533*4882a593Smuzhiyunfunction ntb_pingpong_tests() 534*4882a593Smuzhiyun{ 535*4882a593Smuzhiyun LOCAL_PP="$DEBUGFS/ntb_pingpong/$LOCAL_DEV" 536*4882a593Smuzhiyun REMOTE_PP="$REMOTE_HOST:$DEBUGFS/ntb_pingpong/$REMOTE_DEV" 537*4882a593Smuzhiyun 538*4882a593Smuzhiyun echo "Starting ntb_pingpong tests..." 539*4882a593Smuzhiyun 540*4882a593Smuzhiyun _modprobe ntb_pingpong 541*4882a593Smuzhiyun 542*4882a593Smuzhiyun pingpong_test $LOCAL_PP $REMOTE_PP 543*4882a593Smuzhiyun 544*4882a593Smuzhiyun _modprobe -r ntb_pingpong 545*4882a593Smuzhiyun} 546*4882a593Smuzhiyun 547*4882a593Smuzhiyunfunction ntb_msi_tests() 548*4882a593Smuzhiyun{ 549*4882a593Smuzhiyun LOCAL_MSI="$DEBUGFS/ntb_msi_test/$LOCAL_DEV" 550*4882a593Smuzhiyun REMOTE_MSI="$REMOTE_HOST:$DEBUGFS/ntb_msi_test/$REMOTE_DEV" 551*4882a593Smuzhiyun 552*4882a593Smuzhiyun echo "Starting ntb_msi_test tests..." 553*4882a593Smuzhiyun 554*4882a593Smuzhiyun if ! _modprobe ntb_msi_test 2> /dev/null; then 555*4882a593Smuzhiyun echo " Not doing MSI tests seeing the module is not available." 556*4882a593Smuzhiyun return 557*4882a593Smuzhiyun fi 558*4882a593Smuzhiyun 559*4882a593Smuzhiyun port_test $LOCAL_MSI $REMOTE_MSI 560*4882a593Smuzhiyun 561*4882a593Smuzhiyun LOCAL_PEER="$LOCAL_MSI/peer$LOCAL_PIDX" 562*4882a593Smuzhiyun REMOTE_PEER="$REMOTE_MSI/peer$REMOTE_PIDX" 563*4882a593Smuzhiyun 564*4882a593Smuzhiyun msi_test $LOCAL_PEER $REMOTE_PEER 565*4882a593Smuzhiyun msi_test $REMOTE_PEER $LOCAL_PEER 566*4882a593Smuzhiyun 567*4882a593Smuzhiyun _modprobe -r ntb_msi_test 568*4882a593Smuzhiyun} 569*4882a593Smuzhiyun 570*4882a593Smuzhiyunfunction ntb_perf_tests() 571*4882a593Smuzhiyun{ 572*4882a593Smuzhiyun LOCAL_PERF="$DEBUGFS/ntb_perf/$LOCAL_DEV" 573*4882a593Smuzhiyun REMOTE_PERF="$REMOTE_HOST:$DEBUGFS/ntb_perf/$REMOTE_DEV" 574*4882a593Smuzhiyun 575*4882a593Smuzhiyun echo "Starting ntb_perf tests..." 576*4882a593Smuzhiyun 577*4882a593Smuzhiyun perf_test 0 578*4882a593Smuzhiyun 579*4882a593Smuzhiyun if [[ $RUN_DMA_TESTS ]]; then 580*4882a593Smuzhiyun perf_test 1 581*4882a593Smuzhiyun fi 582*4882a593Smuzhiyun} 583*4882a593Smuzhiyun 584*4882a593Smuzhiyunfunction cleanup() 585*4882a593Smuzhiyun{ 586*4882a593Smuzhiyun set +e 587*4882a593Smuzhiyun _modprobe -r ntb_tool 2> /dev/null 588*4882a593Smuzhiyun _modprobe -r ntb_perf 2> /dev/null 589*4882a593Smuzhiyun _modprobe -r ntb_pingpong 2> /dev/null 590*4882a593Smuzhiyun _modprobe -r ntb_transport 2> /dev/null 591*4882a593Smuzhiyun _modprobe -r ntb_msi_test 2> /dev/null 592*4882a593Smuzhiyun set -e 593*4882a593Smuzhiyun} 594*4882a593Smuzhiyun 595*4882a593Smuzhiyuncleanup 596*4882a593Smuzhiyun 597*4882a593Smuzhiyunif ! [[ $$DONT_CLEANUP ]]; then 598*4882a593Smuzhiyun trap cleanup EXIT 599*4882a593Smuzhiyunfi 600*4882a593Smuzhiyun 601*4882a593Smuzhiyunif [ "$(id -u)" != "0" ]; then 602*4882a593Smuzhiyun echo "This script must be run as root" 1>&2 603*4882a593Smuzhiyun exit 1 604*4882a593Smuzhiyunfi 605*4882a593Smuzhiyun 606*4882a593Smuzhiyunif [[ "$LIST_DEVS" == TRUE ]]; then 607*4882a593Smuzhiyun echo "Local Devices:" 608*4882a593Smuzhiyun ls -1 /sys/bus/ntb/devices 609*4882a593Smuzhiyun echo 610*4882a593Smuzhiyun 611*4882a593Smuzhiyun if [[ "$REMOTE_HOST" != "" ]]; then 612*4882a593Smuzhiyun echo "Remote Devices:" 613*4882a593Smuzhiyun ssh $REMOTE_HOST ls -1 /sys/bus/ntb/devices 614*4882a593Smuzhiyun fi 615*4882a593Smuzhiyun 616*4882a593Smuzhiyun exit 0 617*4882a593Smuzhiyunfi 618*4882a593Smuzhiyun 619*4882a593Smuzhiyunif [[ "$LOCAL_DEV" == $"" ]] || [[ "$REMOTE_DEV" == $"" ]]; then 620*4882a593Smuzhiyun show_help 621*4882a593Smuzhiyun exit 1 622*4882a593Smuzhiyunfi 623*4882a593Smuzhiyun 624*4882a593Smuzhiyunntb_tool_tests 625*4882a593Smuzhiyunecho 626*4882a593Smuzhiyunntb_pingpong_tests 627*4882a593Smuzhiyunecho 628*4882a593Smuzhiyunntb_msi_tests 629*4882a593Smuzhiyunecho 630*4882a593Smuzhiyunntb_perf_tests 631*4882a593Smuzhiyunecho 632