18c2ecf20Sopenharmony_ci#!/bin/bash
28c2ecf20Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0-or-later
38c2ecf20Sopenharmony_ci# Copyright (c) 2016 Microsemi. All Rights Reserved.
48c2ecf20Sopenharmony_ci#
58c2ecf20Sopenharmony_ci# Author: Logan Gunthorpe <logang@deltatee.com>
68c2ecf20Sopenharmony_ci
78c2ecf20Sopenharmony_ciREMOTE_HOST=
88c2ecf20Sopenharmony_ciLIST_DEVS=FALSE
98c2ecf20Sopenharmony_ci
108c2ecf20Sopenharmony_ciDEBUGFS=${DEBUGFS-/sys/kernel/debug}
118c2ecf20Sopenharmony_ci
128c2ecf20Sopenharmony_ciPERF_RUN_ORDER=32
138c2ecf20Sopenharmony_ciMAX_MW_SIZE=0
148c2ecf20Sopenharmony_ciRUN_DMA_TESTS=
158c2ecf20Sopenharmony_ciDONT_CLEANUP=
168c2ecf20Sopenharmony_ciMW_SIZE=65536
178c2ecf20Sopenharmony_ci
188c2ecf20Sopenharmony_cifunction show_help()
198c2ecf20Sopenharmony_ci{
208c2ecf20Sopenharmony_ci	echo "Usage: $0 [OPTIONS] LOCAL_DEV REMOTE_DEV"
218c2ecf20Sopenharmony_ci	echo "Run tests on a pair of NTB endpoints."
228c2ecf20Sopenharmony_ci	echo
238c2ecf20Sopenharmony_ci	echo "If the NTB device loops back to the same host then,"
248c2ecf20Sopenharmony_ci	echo "just specifying the two PCI ids on the command line is"
258c2ecf20Sopenharmony_ci	echo "sufficient. Otherwise, if the NTB link spans two hosts"
268c2ecf20Sopenharmony_ci	echo "use the -r option to specify the hostname for the remote"
278c2ecf20Sopenharmony_ci	echo "device. SSH will then be used to test the remote side."
288c2ecf20Sopenharmony_ci	echo "An SSH key between the root users of the host would then"
298c2ecf20Sopenharmony_ci	echo "be highly recommended."
308c2ecf20Sopenharmony_ci	echo
318c2ecf20Sopenharmony_ci	echo "Options:"
328c2ecf20Sopenharmony_ci	echo "  -C              don't cleanup ntb modules on exit"
338c2ecf20Sopenharmony_ci	echo "  -h              show this help message"
348c2ecf20Sopenharmony_ci	echo "  -l              list available local and remote PCI ids"
358c2ecf20Sopenharmony_ci	echo "  -r REMOTE_HOST  specify the remote's hostname to connect"
368c2ecf20Sopenharmony_ci	echo "                  to for the test (using ssh)"
378c2ecf20Sopenharmony_ci	echo "  -m MW_SIZE      memory window size for ntb_tool"
388c2ecf20Sopenharmony_ci	echo "                  (default: $MW_SIZE)"
398c2ecf20Sopenharmony_ci	echo "  -d              run dma tests for ntb_perf"
408c2ecf20Sopenharmony_ci	echo "  -p ORDER        total data order for ntb_perf"
418c2ecf20Sopenharmony_ci	echo "                  (default: $PERF_RUN_ORDER)"
428c2ecf20Sopenharmony_ci	echo "  -w MAX_MW_SIZE  maxmium memory window size for ntb_perf"
438c2ecf20Sopenharmony_ci	echo
448c2ecf20Sopenharmony_ci}
458c2ecf20Sopenharmony_ci
468c2ecf20Sopenharmony_cifunction parse_args()
478c2ecf20Sopenharmony_ci{
488c2ecf20Sopenharmony_ci	OPTIND=0
498c2ecf20Sopenharmony_ci	while getopts "b:Cdhlm:r:p:w:" opt; do
508c2ecf20Sopenharmony_ci		case "$opt" in
518c2ecf20Sopenharmony_ci		C)  DONT_CLEANUP=1 ;;
528c2ecf20Sopenharmony_ci		d)  RUN_DMA_TESTS=1 ;;
538c2ecf20Sopenharmony_ci		h)  show_help; exit 0 ;;
548c2ecf20Sopenharmony_ci		l)  LIST_DEVS=TRUE ;;
558c2ecf20Sopenharmony_ci		m)  MW_SIZE=${OPTARG} ;;
568c2ecf20Sopenharmony_ci		r)  REMOTE_HOST=${OPTARG} ;;
578c2ecf20Sopenharmony_ci		p)  PERF_RUN_ORDER=${OPTARG} ;;
588c2ecf20Sopenharmony_ci		w)  MAX_MW_SIZE=${OPTARG} ;;
598c2ecf20Sopenharmony_ci		\?)
608c2ecf20Sopenharmony_ci		    echo "Invalid option: -$OPTARG" >&2
618c2ecf20Sopenharmony_ci		    exit 1
628c2ecf20Sopenharmony_ci		    ;;
638c2ecf20Sopenharmony_ci		esac
648c2ecf20Sopenharmony_ci	done
658c2ecf20Sopenharmony_ci}
668c2ecf20Sopenharmony_ci
678c2ecf20Sopenharmony_ciparse_args "$@"
688c2ecf20Sopenharmony_cishift $((OPTIND-1))
698c2ecf20Sopenharmony_ciLOCAL_DEV=$1
708c2ecf20Sopenharmony_cishift
718c2ecf20Sopenharmony_ciparse_args "$@"
728c2ecf20Sopenharmony_cishift $((OPTIND-1))
738c2ecf20Sopenharmony_ciREMOTE_DEV=$1
748c2ecf20Sopenharmony_cishift
758c2ecf20Sopenharmony_ciparse_args "$@"
768c2ecf20Sopenharmony_ci
778c2ecf20Sopenharmony_ciset -e
788c2ecf20Sopenharmony_ci
798c2ecf20Sopenharmony_cifunction _modprobe()
808c2ecf20Sopenharmony_ci{
818c2ecf20Sopenharmony_ci	modprobe "$@" || return 1
828c2ecf20Sopenharmony_ci
838c2ecf20Sopenharmony_ci	if [[ "$REMOTE_HOST" != "" ]]; then
848c2ecf20Sopenharmony_ci		ssh "$REMOTE_HOST" modprobe "$@" || return 1
858c2ecf20Sopenharmony_ci	fi
868c2ecf20Sopenharmony_ci}
878c2ecf20Sopenharmony_ci
888c2ecf20Sopenharmony_cifunction split_remote()
898c2ecf20Sopenharmony_ci{
908c2ecf20Sopenharmony_ci	VPATH=$1
918c2ecf20Sopenharmony_ci	REMOTE=
928c2ecf20Sopenharmony_ci
938c2ecf20Sopenharmony_ci	if [[ "$VPATH" == *":/"* ]]; then
948c2ecf20Sopenharmony_ci		REMOTE=${VPATH%%:*}
958c2ecf20Sopenharmony_ci		VPATH=${VPATH#*:}
968c2ecf20Sopenharmony_ci	fi
978c2ecf20Sopenharmony_ci}
988c2ecf20Sopenharmony_ci
998c2ecf20Sopenharmony_cifunction read_file()
1008c2ecf20Sopenharmony_ci{
1018c2ecf20Sopenharmony_ci	split_remote $1
1028c2ecf20Sopenharmony_ci	if [[ "$REMOTE" != "" ]]; then
1038c2ecf20Sopenharmony_ci		ssh "$REMOTE" cat "$VPATH"
1048c2ecf20Sopenharmony_ci	else
1058c2ecf20Sopenharmony_ci		cat "$VPATH"
1068c2ecf20Sopenharmony_ci	fi
1078c2ecf20Sopenharmony_ci}
1088c2ecf20Sopenharmony_ci
1098c2ecf20Sopenharmony_cifunction write_file()
1108c2ecf20Sopenharmony_ci{
1118c2ecf20Sopenharmony_ci	split_remote $2
1128c2ecf20Sopenharmony_ci	VALUE=$1
1138c2ecf20Sopenharmony_ci
1148c2ecf20Sopenharmony_ci	if [[ "$REMOTE" != "" ]]; then
1158c2ecf20Sopenharmony_ci		ssh "$REMOTE" "echo \"$VALUE\" > \"$VPATH\""
1168c2ecf20Sopenharmony_ci	else
1178c2ecf20Sopenharmony_ci		echo "$VALUE" > "$VPATH"
1188c2ecf20Sopenharmony_ci	fi
1198c2ecf20Sopenharmony_ci}
1208c2ecf20Sopenharmony_ci
1218c2ecf20Sopenharmony_cifunction check_file()
1228c2ecf20Sopenharmony_ci{
1238c2ecf20Sopenharmony_ci	split_remote $1
1248c2ecf20Sopenharmony_ci
1258c2ecf20Sopenharmony_ci	if [[ "$REMOTE" != "" ]]; then
1268c2ecf20Sopenharmony_ci		ssh "$REMOTE" "[[ -e ${VPATH} ]]"
1278c2ecf20Sopenharmony_ci	else
1288c2ecf20Sopenharmony_ci		[[ -e ${VPATH} ]]
1298c2ecf20Sopenharmony_ci	fi
1308c2ecf20Sopenharmony_ci}
1318c2ecf20Sopenharmony_ci
1328c2ecf20Sopenharmony_cifunction subdirname()
1338c2ecf20Sopenharmony_ci{
1348c2ecf20Sopenharmony_ci	echo $(basename $(dirname $1)) 2> /dev/null
1358c2ecf20Sopenharmony_ci}
1368c2ecf20Sopenharmony_ci
1378c2ecf20Sopenharmony_cifunction find_pidx()
1388c2ecf20Sopenharmony_ci{
1398c2ecf20Sopenharmony_ci	PORT=$1
1408c2ecf20Sopenharmony_ci	PPATH=$2
1418c2ecf20Sopenharmony_ci
1428c2ecf20Sopenharmony_ci	for ((i = 0; i < 64; i++)); do
1438c2ecf20Sopenharmony_ci		PEER_DIR="$PPATH/peer$i"
1448c2ecf20Sopenharmony_ci
1458c2ecf20Sopenharmony_ci		check_file ${PEER_DIR} || break
1468c2ecf20Sopenharmony_ci
1478c2ecf20Sopenharmony_ci		PEER_PORT=$(read_file "${PEER_DIR}/port")
1488c2ecf20Sopenharmony_ci		if [[ ${PORT} -eq $PEER_PORT ]]; then
1498c2ecf20Sopenharmony_ci			echo $i
1508c2ecf20Sopenharmony_ci			return 0
1518c2ecf20Sopenharmony_ci		fi
1528c2ecf20Sopenharmony_ci	done
1538c2ecf20Sopenharmony_ci
1548c2ecf20Sopenharmony_ci	return 1
1558c2ecf20Sopenharmony_ci}
1568c2ecf20Sopenharmony_ci
1578c2ecf20Sopenharmony_cifunction port_test()
1588c2ecf20Sopenharmony_ci{
1598c2ecf20Sopenharmony_ci	LOC=$1
1608c2ecf20Sopenharmony_ci	REM=$2
1618c2ecf20Sopenharmony_ci
1628c2ecf20Sopenharmony_ci	echo "Running port tests on: $(basename $LOC) / $(basename $REM)"
1638c2ecf20Sopenharmony_ci
1648c2ecf20Sopenharmony_ci	LOCAL_PORT=$(read_file "$LOC/port")
1658c2ecf20Sopenharmony_ci	REMOTE_PORT=$(read_file "$REM/port")
1668c2ecf20Sopenharmony_ci
1678c2ecf20Sopenharmony_ci	LOCAL_PIDX=$(find_pidx ${REMOTE_PORT} "$LOC")
1688c2ecf20Sopenharmony_ci	REMOTE_PIDX=$(find_pidx ${LOCAL_PORT} "$REM")
1698c2ecf20Sopenharmony_ci
1708c2ecf20Sopenharmony_ci	echo "Local port ${LOCAL_PORT} with index ${REMOTE_PIDX} on remote host"
1718c2ecf20Sopenharmony_ci	echo "Peer port ${REMOTE_PORT} with index ${LOCAL_PIDX} on local host"
1728c2ecf20Sopenharmony_ci
1738c2ecf20Sopenharmony_ci	echo "  Passed"
1748c2ecf20Sopenharmony_ci}
1758c2ecf20Sopenharmony_ci
1768c2ecf20Sopenharmony_cifunction link_test()
1778c2ecf20Sopenharmony_ci{
1788c2ecf20Sopenharmony_ci	LOC=$1
1798c2ecf20Sopenharmony_ci	REM=$2
1808c2ecf20Sopenharmony_ci	EXP=0
1818c2ecf20Sopenharmony_ci
1828c2ecf20Sopenharmony_ci	echo "Running link tests on: $(subdirname $LOC) / $(subdirname $REM)"
1838c2ecf20Sopenharmony_ci
1848c2ecf20Sopenharmony_ci	if ! write_file "N" "$LOC/../link" 2> /dev/null; then
1858c2ecf20Sopenharmony_ci		echo "  Unsupported"
1868c2ecf20Sopenharmony_ci		return
1878c2ecf20Sopenharmony_ci	fi
1888c2ecf20Sopenharmony_ci
1898c2ecf20Sopenharmony_ci	write_file "N" "$LOC/link_event"
1908c2ecf20Sopenharmony_ci
1918c2ecf20Sopenharmony_ci	if [[ $(read_file "$REM/link") != "N" ]]; then
1928c2ecf20Sopenharmony_ci		echo "Expected link to be down in $REM/link" >&2
1938c2ecf20Sopenharmony_ci		exit -1
1948c2ecf20Sopenharmony_ci	fi
1958c2ecf20Sopenharmony_ci
1968c2ecf20Sopenharmony_ci	write_file "Y" "$LOC/../link"
1978c2ecf20Sopenharmony_ci
1988c2ecf20Sopenharmony_ci	echo "  Passed"
1998c2ecf20Sopenharmony_ci}
2008c2ecf20Sopenharmony_ci
2018c2ecf20Sopenharmony_cifunction doorbell_test()
2028c2ecf20Sopenharmony_ci{
2038c2ecf20Sopenharmony_ci	LOC=$1
2048c2ecf20Sopenharmony_ci	REM=$2
2058c2ecf20Sopenharmony_ci	EXP=0
2068c2ecf20Sopenharmony_ci
2078c2ecf20Sopenharmony_ci	echo "Running db tests on: $(basename $LOC) / $(basename $REM)"
2088c2ecf20Sopenharmony_ci
2098c2ecf20Sopenharmony_ci	DB_VALID_MASK=$(read_file "$LOC/db_valid_mask")
2108c2ecf20Sopenharmony_ci
2118c2ecf20Sopenharmony_ci	write_file "c $DB_VALID_MASK" "$REM/db"
2128c2ecf20Sopenharmony_ci
2138c2ecf20Sopenharmony_ci	for ((i = 0; i < 64; i++)); do
2148c2ecf20Sopenharmony_ci		DB=$(read_file "$REM/db")
2158c2ecf20Sopenharmony_ci		if [[ "$DB" -ne "$EXP" ]]; then
2168c2ecf20Sopenharmony_ci			echo "Doorbell doesn't match expected value $EXP " \
2178c2ecf20Sopenharmony_ci			     "in $REM/db" >&2
2188c2ecf20Sopenharmony_ci			exit -1
2198c2ecf20Sopenharmony_ci		fi
2208c2ecf20Sopenharmony_ci
2218c2ecf20Sopenharmony_ci		let "MASK = (1 << $i) & $DB_VALID_MASK" || true
2228c2ecf20Sopenharmony_ci		let "EXP = $EXP | $MASK" || true
2238c2ecf20Sopenharmony_ci
2248c2ecf20Sopenharmony_ci		write_file "s $MASK" "$LOC/peer_db"
2258c2ecf20Sopenharmony_ci	done
2268c2ecf20Sopenharmony_ci
2278c2ecf20Sopenharmony_ci	write_file "c $DB_VALID_MASK" "$REM/db_mask"
2288c2ecf20Sopenharmony_ci	write_file $DB_VALID_MASK "$REM/db_event"
2298c2ecf20Sopenharmony_ci	write_file "s $DB_VALID_MASK" "$REM/db_mask"
2308c2ecf20Sopenharmony_ci
2318c2ecf20Sopenharmony_ci	write_file "c $DB_VALID_MASK" "$REM/db"
2328c2ecf20Sopenharmony_ci
2338c2ecf20Sopenharmony_ci	echo "  Passed"
2348c2ecf20Sopenharmony_ci}
2358c2ecf20Sopenharmony_ci
2368c2ecf20Sopenharmony_cifunction get_files_count()
2378c2ecf20Sopenharmony_ci{
2388c2ecf20Sopenharmony_ci	NAME=$1
2398c2ecf20Sopenharmony_ci	LOC=$2
2408c2ecf20Sopenharmony_ci
2418c2ecf20Sopenharmony_ci	split_remote $LOC
2428c2ecf20Sopenharmony_ci
2438c2ecf20Sopenharmony_ci	if [[ "$REMOTE" == "" ]]; then
2448c2ecf20Sopenharmony_ci		echo $(ls -1 "$VPATH"/${NAME}* 2>/dev/null | wc -l)
2458c2ecf20Sopenharmony_ci	else
2468c2ecf20Sopenharmony_ci		echo $(ssh "$REMOTE" "ls -1 \"$VPATH\"/${NAME}* | \
2478c2ecf20Sopenharmony_ci		       wc -l" 2> /dev/null)
2488c2ecf20Sopenharmony_ci	fi
2498c2ecf20Sopenharmony_ci}
2508c2ecf20Sopenharmony_ci
2518c2ecf20Sopenharmony_cifunction scratchpad_test()
2528c2ecf20Sopenharmony_ci{
2538c2ecf20Sopenharmony_ci	LOC=$1
2548c2ecf20Sopenharmony_ci	REM=$2
2558c2ecf20Sopenharmony_ci
2568c2ecf20Sopenharmony_ci	echo "Running spad tests on: $(subdirname $LOC) / $(subdirname $REM)"
2578c2ecf20Sopenharmony_ci
2588c2ecf20Sopenharmony_ci	CNT=$(get_files_count "spad" "$LOC")
2598c2ecf20Sopenharmony_ci
2608c2ecf20Sopenharmony_ci	if [[ $CNT -eq 0 ]]; then
2618c2ecf20Sopenharmony_ci		echo "  Unsupported"
2628c2ecf20Sopenharmony_ci		return
2638c2ecf20Sopenharmony_ci	fi
2648c2ecf20Sopenharmony_ci
2658c2ecf20Sopenharmony_ci	for ((i = 0; i < $CNT; i++)); do
2668c2ecf20Sopenharmony_ci		VAL=$RANDOM
2678c2ecf20Sopenharmony_ci		write_file "$VAL" "$LOC/spad$i"
2688c2ecf20Sopenharmony_ci		RVAL=$(read_file "$REM/../spad$i")
2698c2ecf20Sopenharmony_ci
2708c2ecf20Sopenharmony_ci		if [[ "$VAL" -ne "$RVAL" ]]; then
2718c2ecf20Sopenharmony_ci			echo "Scratchpad $i value $RVAL doesn't match $VAL" >&2
2728c2ecf20Sopenharmony_ci			exit -1
2738c2ecf20Sopenharmony_ci		fi
2748c2ecf20Sopenharmony_ci	done
2758c2ecf20Sopenharmony_ci
2768c2ecf20Sopenharmony_ci	echo "  Passed"
2778c2ecf20Sopenharmony_ci}
2788c2ecf20Sopenharmony_ci
2798c2ecf20Sopenharmony_cifunction message_test()
2808c2ecf20Sopenharmony_ci{
2818c2ecf20Sopenharmony_ci	LOC=$1
2828c2ecf20Sopenharmony_ci	REM=$2
2838c2ecf20Sopenharmony_ci
2848c2ecf20Sopenharmony_ci	echo "Running msg tests on: $(subdirname $LOC) / $(subdirname $REM)"
2858c2ecf20Sopenharmony_ci
2868c2ecf20Sopenharmony_ci	CNT=$(get_files_count "msg" "$LOC")
2878c2ecf20Sopenharmony_ci
2888c2ecf20Sopenharmony_ci	if [[ $CNT -eq 0 ]]; then
2898c2ecf20Sopenharmony_ci		echo "  Unsupported"
2908c2ecf20Sopenharmony_ci		return
2918c2ecf20Sopenharmony_ci	fi
2928c2ecf20Sopenharmony_ci
2938c2ecf20Sopenharmony_ci	MSG_OUTBITS_MASK=$(read_file "$LOC/../msg_inbits")
2948c2ecf20Sopenharmony_ci	MSG_INBITS_MASK=$(read_file "$REM/../msg_inbits")
2958c2ecf20Sopenharmony_ci
2968c2ecf20Sopenharmony_ci	write_file "c $MSG_OUTBITS_MASK" "$LOC/../msg_sts"
2978c2ecf20Sopenharmony_ci	write_file "c $MSG_INBITS_MASK" "$REM/../msg_sts"
2988c2ecf20Sopenharmony_ci
2998c2ecf20Sopenharmony_ci	for ((i = 0; i < $CNT; i++)); do
3008c2ecf20Sopenharmony_ci		VAL=$RANDOM
3018c2ecf20Sopenharmony_ci		write_file "$VAL" "$LOC/msg$i"
3028c2ecf20Sopenharmony_ci		RVAL=$(read_file "$REM/../msg$i")
3038c2ecf20Sopenharmony_ci
3048c2ecf20Sopenharmony_ci		if [[ "$VAL" -ne "${RVAL%%<-*}" ]]; then
3058c2ecf20Sopenharmony_ci			echo "Message $i value $RVAL doesn't match $VAL" >&2
3068c2ecf20Sopenharmony_ci			exit -1
3078c2ecf20Sopenharmony_ci		fi
3088c2ecf20Sopenharmony_ci	done
3098c2ecf20Sopenharmony_ci
3108c2ecf20Sopenharmony_ci	echo "  Passed"
3118c2ecf20Sopenharmony_ci}
3128c2ecf20Sopenharmony_ci
3138c2ecf20Sopenharmony_cifunction get_number()
3148c2ecf20Sopenharmony_ci{
3158c2ecf20Sopenharmony_ci	KEY=$1
3168c2ecf20Sopenharmony_ci
3178c2ecf20Sopenharmony_ci	sed -n "s/^\(${KEY}\)[ \t]*\(0x[0-9a-fA-F]*\)\(\[p\]\)\?$/\2/p"
3188c2ecf20Sopenharmony_ci}
3198c2ecf20Sopenharmony_ci
3208c2ecf20Sopenharmony_cifunction mw_alloc()
3218c2ecf20Sopenharmony_ci{
3228c2ecf20Sopenharmony_ci	IDX=$1
3238c2ecf20Sopenharmony_ci	LOC=$2
3248c2ecf20Sopenharmony_ci	REM=$3
3258c2ecf20Sopenharmony_ci
3268c2ecf20Sopenharmony_ci	write_file $MW_SIZE "$LOC/mw_trans$IDX"
3278c2ecf20Sopenharmony_ci
3288c2ecf20Sopenharmony_ci	INB_MW=$(read_file "$LOC/mw_trans$IDX")
3298c2ecf20Sopenharmony_ci	MW_ALIGNED_SIZE=$(echo "$INB_MW" | get_number "Window Size")
3308c2ecf20Sopenharmony_ci	MW_DMA_ADDR=$(echo "$INB_MW" | get_number "DMA Address")
3318c2ecf20Sopenharmony_ci
3328c2ecf20Sopenharmony_ci	write_file "$MW_DMA_ADDR:$(($MW_ALIGNED_SIZE))" "$REM/peer_mw_trans$IDX"
3338c2ecf20Sopenharmony_ci
3348c2ecf20Sopenharmony_ci	if [[ $MW_SIZE -ne $MW_ALIGNED_SIZE ]]; then
3358c2ecf20Sopenharmony_ci		echo "MW $IDX size aligned to $MW_ALIGNED_SIZE"
3368c2ecf20Sopenharmony_ci	fi
3378c2ecf20Sopenharmony_ci}
3388c2ecf20Sopenharmony_ci
3398c2ecf20Sopenharmony_cifunction write_mw()
3408c2ecf20Sopenharmony_ci{
3418c2ecf20Sopenharmony_ci	split_remote $2
3428c2ecf20Sopenharmony_ci
3438c2ecf20Sopenharmony_ci	if [[ "$REMOTE" != "" ]]; then
3448c2ecf20Sopenharmony_ci		ssh "$REMOTE" \
3458c2ecf20Sopenharmony_ci			dd if=/dev/urandom "of=$VPATH" 2> /dev/null || true
3468c2ecf20Sopenharmony_ci	else
3478c2ecf20Sopenharmony_ci		dd if=/dev/urandom "of=$VPATH" 2> /dev/null || true
3488c2ecf20Sopenharmony_ci	fi
3498c2ecf20Sopenharmony_ci}
3508c2ecf20Sopenharmony_ci
3518c2ecf20Sopenharmony_cifunction mw_check()
3528c2ecf20Sopenharmony_ci{
3538c2ecf20Sopenharmony_ci	IDX=$1
3548c2ecf20Sopenharmony_ci	LOC=$2
3558c2ecf20Sopenharmony_ci	REM=$3
3568c2ecf20Sopenharmony_ci
3578c2ecf20Sopenharmony_ci	write_mw "$LOC/mw$IDX"
3588c2ecf20Sopenharmony_ci
3598c2ecf20Sopenharmony_ci	split_remote "$LOC/mw$IDX"
3608c2ecf20Sopenharmony_ci	if [[ "$REMOTE" == "" ]]; then
3618c2ecf20Sopenharmony_ci		A=$VPATH
3628c2ecf20Sopenharmony_ci	else
3638c2ecf20Sopenharmony_ci		A=/tmp/ntb_test.$$.A
3648c2ecf20Sopenharmony_ci		ssh "$REMOTE" cat "$VPATH" > "$A"
3658c2ecf20Sopenharmony_ci	fi
3668c2ecf20Sopenharmony_ci
3678c2ecf20Sopenharmony_ci	split_remote "$REM/peer_mw$IDX"
3688c2ecf20Sopenharmony_ci	if [[ "$REMOTE" == "" ]]; then
3698c2ecf20Sopenharmony_ci		B=$VPATH
3708c2ecf20Sopenharmony_ci	else
3718c2ecf20Sopenharmony_ci		B=/tmp/ntb_test.$$.B
3728c2ecf20Sopenharmony_ci		ssh "$REMOTE" cat "$VPATH" > "$B"
3738c2ecf20Sopenharmony_ci	fi
3748c2ecf20Sopenharmony_ci
3758c2ecf20Sopenharmony_ci	cmp -n $MW_ALIGNED_SIZE "$A" "$B"
3768c2ecf20Sopenharmony_ci	if [[ $? != 0 ]]; then
3778c2ecf20Sopenharmony_ci		echo "Memory window $MW did not match!" >&2
3788c2ecf20Sopenharmony_ci	fi
3798c2ecf20Sopenharmony_ci
3808c2ecf20Sopenharmony_ci	if [[ "$A" == "/tmp/*" ]]; then
3818c2ecf20Sopenharmony_ci		rm "$A"
3828c2ecf20Sopenharmony_ci	fi
3838c2ecf20Sopenharmony_ci
3848c2ecf20Sopenharmony_ci	if [[ "$B" == "/tmp/*" ]]; then
3858c2ecf20Sopenharmony_ci		rm "$B"
3868c2ecf20Sopenharmony_ci	fi
3878c2ecf20Sopenharmony_ci}
3888c2ecf20Sopenharmony_ci
3898c2ecf20Sopenharmony_cifunction mw_free()
3908c2ecf20Sopenharmony_ci{
3918c2ecf20Sopenharmony_ci	IDX=$1
3928c2ecf20Sopenharmony_ci	LOC=$2
3938c2ecf20Sopenharmony_ci	REM=$3
3948c2ecf20Sopenharmony_ci
3958c2ecf20Sopenharmony_ci	write_file "$MW_DMA_ADDR:0" "$REM/peer_mw_trans$IDX"
3968c2ecf20Sopenharmony_ci
3978c2ecf20Sopenharmony_ci	write_file 0 "$LOC/mw_trans$IDX"
3988c2ecf20Sopenharmony_ci}
3998c2ecf20Sopenharmony_ci
4008c2ecf20Sopenharmony_cifunction mw_test()
4018c2ecf20Sopenharmony_ci{
4028c2ecf20Sopenharmony_ci	LOC=$1
4038c2ecf20Sopenharmony_ci	REM=$2
4048c2ecf20Sopenharmony_ci
4058c2ecf20Sopenharmony_ci	CNT=$(get_files_count "mw_trans" "$LOC")
4068c2ecf20Sopenharmony_ci
4078c2ecf20Sopenharmony_ci	for ((i = 0; i < $CNT; i++)); do
4088c2ecf20Sopenharmony_ci		echo "Running mw$i tests on: $(subdirname $LOC) / " \
4098c2ecf20Sopenharmony_ci		     "$(subdirname $REM)"
4108c2ecf20Sopenharmony_ci
4118c2ecf20Sopenharmony_ci		mw_alloc $i $LOC $REM
4128c2ecf20Sopenharmony_ci
4138c2ecf20Sopenharmony_ci		mw_check $i $LOC $REM
4148c2ecf20Sopenharmony_ci
4158c2ecf20Sopenharmony_ci		mw_free $i $LOC  $REM
4168c2ecf20Sopenharmony_ci
4178c2ecf20Sopenharmony_ci		echo "  Passed"
4188c2ecf20Sopenharmony_ci	done
4198c2ecf20Sopenharmony_ci
4208c2ecf20Sopenharmony_ci}
4218c2ecf20Sopenharmony_ci
4228c2ecf20Sopenharmony_cifunction pingpong_test()
4238c2ecf20Sopenharmony_ci{
4248c2ecf20Sopenharmony_ci	LOC=$1
4258c2ecf20Sopenharmony_ci	REM=$2
4268c2ecf20Sopenharmony_ci
4278c2ecf20Sopenharmony_ci	echo "Running ping pong tests on: $(basename $LOC) / $(basename $REM)"
4288c2ecf20Sopenharmony_ci
4298c2ecf20Sopenharmony_ci	LOC_START=$(read_file "$LOC/count")
4308c2ecf20Sopenharmony_ci	REM_START=$(read_file "$REM/count")
4318c2ecf20Sopenharmony_ci
4328c2ecf20Sopenharmony_ci	sleep 7
4338c2ecf20Sopenharmony_ci
4348c2ecf20Sopenharmony_ci	LOC_END=$(read_file "$LOC/count")
4358c2ecf20Sopenharmony_ci	REM_END=$(read_file "$REM/count")
4368c2ecf20Sopenharmony_ci
4378c2ecf20Sopenharmony_ci	if [[ $LOC_START == $LOC_END ]] || [[ $REM_START == $REM_END ]]; then
4388c2ecf20Sopenharmony_ci		echo "Ping pong counter not incrementing!" >&2
4398c2ecf20Sopenharmony_ci		exit 1
4408c2ecf20Sopenharmony_ci	fi
4418c2ecf20Sopenharmony_ci
4428c2ecf20Sopenharmony_ci	echo "  Passed"
4438c2ecf20Sopenharmony_ci}
4448c2ecf20Sopenharmony_ci
4458c2ecf20Sopenharmony_cifunction msi_test()
4468c2ecf20Sopenharmony_ci{
4478c2ecf20Sopenharmony_ci	LOC=$1
4488c2ecf20Sopenharmony_ci	REM=$2
4498c2ecf20Sopenharmony_ci
4508c2ecf20Sopenharmony_ci	write_file 1 $LOC/ready
4518c2ecf20Sopenharmony_ci
4528c2ecf20Sopenharmony_ci	echo "Running MSI interrupt tests on: $(subdirname $LOC) / $(subdirname $REM)"
4538c2ecf20Sopenharmony_ci
4548c2ecf20Sopenharmony_ci	CNT=$(read_file "$LOC/count")
4558c2ecf20Sopenharmony_ci	for ((i = 0; i < $CNT; i++)); do
4568c2ecf20Sopenharmony_ci		START=$(read_file $REM/../irq${i}_occurrences)
4578c2ecf20Sopenharmony_ci		write_file $i $LOC/trigger
4588c2ecf20Sopenharmony_ci		END=$(read_file $REM/../irq${i}_occurrences)
4598c2ecf20Sopenharmony_ci
4608c2ecf20Sopenharmony_ci		if [[ $(($END - $START)) != 1 ]]; then
4618c2ecf20Sopenharmony_ci			echo "MSI did not trigger the interrupt on the remote side!" >&2
4628c2ecf20Sopenharmony_ci			exit 1
4638c2ecf20Sopenharmony_ci		fi
4648c2ecf20Sopenharmony_ci	done
4658c2ecf20Sopenharmony_ci
4668c2ecf20Sopenharmony_ci	echo "  Passed"
4678c2ecf20Sopenharmony_ci}
4688c2ecf20Sopenharmony_ci
4698c2ecf20Sopenharmony_cifunction perf_test()
4708c2ecf20Sopenharmony_ci{
4718c2ecf20Sopenharmony_ci	USE_DMA=$1
4728c2ecf20Sopenharmony_ci
4738c2ecf20Sopenharmony_ci	if [[ $USE_DMA == "1" ]]; then
4748c2ecf20Sopenharmony_ci		WITH="with"
4758c2ecf20Sopenharmony_ci	else
4768c2ecf20Sopenharmony_ci		WITH="without"
4778c2ecf20Sopenharmony_ci	fi
4788c2ecf20Sopenharmony_ci
4798c2ecf20Sopenharmony_ci	_modprobe ntb_perf total_order=$PERF_RUN_ORDER \
4808c2ecf20Sopenharmony_ci		max_mw_size=$MAX_MW_SIZE use_dma=$USE_DMA
4818c2ecf20Sopenharmony_ci
4828c2ecf20Sopenharmony_ci	echo "Running local perf test $WITH DMA"
4838c2ecf20Sopenharmony_ci	write_file "$LOCAL_PIDX" "$LOCAL_PERF/run"
4848c2ecf20Sopenharmony_ci	echo -n "  "
4858c2ecf20Sopenharmony_ci	read_file "$LOCAL_PERF/run"
4868c2ecf20Sopenharmony_ci	echo "  Passed"
4878c2ecf20Sopenharmony_ci
4888c2ecf20Sopenharmony_ci	echo "Running remote perf test $WITH DMA"
4898c2ecf20Sopenharmony_ci	write_file "$REMOTE_PIDX" "$REMOTE_PERF/run"
4908c2ecf20Sopenharmony_ci	echo -n "  "
4918c2ecf20Sopenharmony_ci	read_file "$REMOTE_PERF/run"
4928c2ecf20Sopenharmony_ci	echo "  Passed"
4938c2ecf20Sopenharmony_ci
4948c2ecf20Sopenharmony_ci	_modprobe -r ntb_perf
4958c2ecf20Sopenharmony_ci}
4968c2ecf20Sopenharmony_ci
4978c2ecf20Sopenharmony_cifunction ntb_tool_tests()
4988c2ecf20Sopenharmony_ci{
4998c2ecf20Sopenharmony_ci	LOCAL_TOOL="$DEBUGFS/ntb_tool/$LOCAL_DEV"
5008c2ecf20Sopenharmony_ci	REMOTE_TOOL="$REMOTE_HOST:$DEBUGFS/ntb_tool/$REMOTE_DEV"
5018c2ecf20Sopenharmony_ci
5028c2ecf20Sopenharmony_ci	echo "Starting ntb_tool tests..."
5038c2ecf20Sopenharmony_ci
5048c2ecf20Sopenharmony_ci	_modprobe ntb_tool
5058c2ecf20Sopenharmony_ci
5068c2ecf20Sopenharmony_ci	port_test "$LOCAL_TOOL" "$REMOTE_TOOL"
5078c2ecf20Sopenharmony_ci
5088c2ecf20Sopenharmony_ci	LOCAL_PEER_TOOL="$LOCAL_TOOL/peer$LOCAL_PIDX"
5098c2ecf20Sopenharmony_ci	REMOTE_PEER_TOOL="$REMOTE_TOOL/peer$REMOTE_PIDX"
5108c2ecf20Sopenharmony_ci
5118c2ecf20Sopenharmony_ci	link_test "$LOCAL_PEER_TOOL" "$REMOTE_PEER_TOOL"
5128c2ecf20Sopenharmony_ci	link_test "$REMOTE_PEER_TOOL" "$LOCAL_PEER_TOOL"
5138c2ecf20Sopenharmony_ci
5148c2ecf20Sopenharmony_ci	#Ensure the link is up on both sides before continuing
5158c2ecf20Sopenharmony_ci	write_file "Y" "$LOCAL_PEER_TOOL/link_event"
5168c2ecf20Sopenharmony_ci	write_file "Y" "$REMOTE_PEER_TOOL/link_event"
5178c2ecf20Sopenharmony_ci
5188c2ecf20Sopenharmony_ci	doorbell_test "$LOCAL_TOOL" "$REMOTE_TOOL"
5198c2ecf20Sopenharmony_ci	doorbell_test "$REMOTE_TOOL" "$LOCAL_TOOL"
5208c2ecf20Sopenharmony_ci
5218c2ecf20Sopenharmony_ci	scratchpad_test "$LOCAL_PEER_TOOL" "$REMOTE_PEER_TOOL"
5228c2ecf20Sopenharmony_ci	scratchpad_test "$REMOTE_PEER_TOOL" "$LOCAL_PEER_TOOL"
5238c2ecf20Sopenharmony_ci
5248c2ecf20Sopenharmony_ci	message_test "$LOCAL_PEER_TOOL" "$REMOTE_PEER_TOOL"
5258c2ecf20Sopenharmony_ci	message_test "$REMOTE_PEER_TOOL" "$LOCAL_PEER_TOOL"
5268c2ecf20Sopenharmony_ci
5278c2ecf20Sopenharmony_ci	mw_test "$LOCAL_PEER_TOOL" "$REMOTE_PEER_TOOL"
5288c2ecf20Sopenharmony_ci	mw_test "$REMOTE_PEER_TOOL" "$LOCAL_PEER_TOOL"
5298c2ecf20Sopenharmony_ci
5308c2ecf20Sopenharmony_ci	_modprobe -r ntb_tool
5318c2ecf20Sopenharmony_ci}
5328c2ecf20Sopenharmony_ci
5338c2ecf20Sopenharmony_cifunction ntb_pingpong_tests()
5348c2ecf20Sopenharmony_ci{
5358c2ecf20Sopenharmony_ci	LOCAL_PP="$DEBUGFS/ntb_pingpong/$LOCAL_DEV"
5368c2ecf20Sopenharmony_ci	REMOTE_PP="$REMOTE_HOST:$DEBUGFS/ntb_pingpong/$REMOTE_DEV"
5378c2ecf20Sopenharmony_ci
5388c2ecf20Sopenharmony_ci	echo "Starting ntb_pingpong tests..."
5398c2ecf20Sopenharmony_ci
5408c2ecf20Sopenharmony_ci	_modprobe ntb_pingpong
5418c2ecf20Sopenharmony_ci
5428c2ecf20Sopenharmony_ci	pingpong_test $LOCAL_PP $REMOTE_PP
5438c2ecf20Sopenharmony_ci
5448c2ecf20Sopenharmony_ci	_modprobe -r ntb_pingpong
5458c2ecf20Sopenharmony_ci}
5468c2ecf20Sopenharmony_ci
5478c2ecf20Sopenharmony_cifunction ntb_msi_tests()
5488c2ecf20Sopenharmony_ci{
5498c2ecf20Sopenharmony_ci	LOCAL_MSI="$DEBUGFS/ntb_msi_test/$LOCAL_DEV"
5508c2ecf20Sopenharmony_ci	REMOTE_MSI="$REMOTE_HOST:$DEBUGFS/ntb_msi_test/$REMOTE_DEV"
5518c2ecf20Sopenharmony_ci
5528c2ecf20Sopenharmony_ci	echo "Starting ntb_msi_test tests..."
5538c2ecf20Sopenharmony_ci
5548c2ecf20Sopenharmony_ci	if ! _modprobe ntb_msi_test 2> /dev/null; then
5558c2ecf20Sopenharmony_ci		echo "  Not doing MSI tests seeing the module is not available."
5568c2ecf20Sopenharmony_ci		return
5578c2ecf20Sopenharmony_ci	fi
5588c2ecf20Sopenharmony_ci
5598c2ecf20Sopenharmony_ci	port_test $LOCAL_MSI $REMOTE_MSI
5608c2ecf20Sopenharmony_ci
5618c2ecf20Sopenharmony_ci	LOCAL_PEER="$LOCAL_MSI/peer$LOCAL_PIDX"
5628c2ecf20Sopenharmony_ci	REMOTE_PEER="$REMOTE_MSI/peer$REMOTE_PIDX"
5638c2ecf20Sopenharmony_ci
5648c2ecf20Sopenharmony_ci	msi_test $LOCAL_PEER $REMOTE_PEER
5658c2ecf20Sopenharmony_ci	msi_test $REMOTE_PEER $LOCAL_PEER
5668c2ecf20Sopenharmony_ci
5678c2ecf20Sopenharmony_ci	_modprobe -r ntb_msi_test
5688c2ecf20Sopenharmony_ci}
5698c2ecf20Sopenharmony_ci
5708c2ecf20Sopenharmony_cifunction ntb_perf_tests()
5718c2ecf20Sopenharmony_ci{
5728c2ecf20Sopenharmony_ci	LOCAL_PERF="$DEBUGFS/ntb_perf/$LOCAL_DEV"
5738c2ecf20Sopenharmony_ci	REMOTE_PERF="$REMOTE_HOST:$DEBUGFS/ntb_perf/$REMOTE_DEV"
5748c2ecf20Sopenharmony_ci
5758c2ecf20Sopenharmony_ci	echo "Starting ntb_perf tests..."
5768c2ecf20Sopenharmony_ci
5778c2ecf20Sopenharmony_ci	perf_test 0
5788c2ecf20Sopenharmony_ci
5798c2ecf20Sopenharmony_ci	if [[ $RUN_DMA_TESTS ]]; then
5808c2ecf20Sopenharmony_ci		perf_test 1
5818c2ecf20Sopenharmony_ci	fi
5828c2ecf20Sopenharmony_ci}
5838c2ecf20Sopenharmony_ci
5848c2ecf20Sopenharmony_cifunction cleanup()
5858c2ecf20Sopenharmony_ci{
5868c2ecf20Sopenharmony_ci	set +e
5878c2ecf20Sopenharmony_ci	_modprobe -r ntb_tool 2> /dev/null
5888c2ecf20Sopenharmony_ci	_modprobe -r ntb_perf 2> /dev/null
5898c2ecf20Sopenharmony_ci	_modprobe -r ntb_pingpong 2> /dev/null
5908c2ecf20Sopenharmony_ci	_modprobe -r ntb_transport 2> /dev/null
5918c2ecf20Sopenharmony_ci	_modprobe -r ntb_msi_test 2> /dev/null
5928c2ecf20Sopenharmony_ci	set -e
5938c2ecf20Sopenharmony_ci}
5948c2ecf20Sopenharmony_ci
5958c2ecf20Sopenharmony_cicleanup
5968c2ecf20Sopenharmony_ci
5978c2ecf20Sopenharmony_ciif ! [[ $$DONT_CLEANUP ]]; then
5988c2ecf20Sopenharmony_ci	trap cleanup EXIT
5998c2ecf20Sopenharmony_cifi
6008c2ecf20Sopenharmony_ci
6018c2ecf20Sopenharmony_ciif [ "$(id -u)" != "0" ]; then
6028c2ecf20Sopenharmony_ci	echo "This script must be run as root" 1>&2
6038c2ecf20Sopenharmony_ci	exit 1
6048c2ecf20Sopenharmony_cifi
6058c2ecf20Sopenharmony_ci
6068c2ecf20Sopenharmony_ciif [[ "$LIST_DEVS" == TRUE ]]; then
6078c2ecf20Sopenharmony_ci	echo "Local Devices:"
6088c2ecf20Sopenharmony_ci	ls -1 /sys/bus/ntb/devices
6098c2ecf20Sopenharmony_ci	echo
6108c2ecf20Sopenharmony_ci
6118c2ecf20Sopenharmony_ci	if [[ "$REMOTE_HOST" != "" ]]; then
6128c2ecf20Sopenharmony_ci		echo "Remote Devices:"
6138c2ecf20Sopenharmony_ci		ssh $REMOTE_HOST ls -1 /sys/bus/ntb/devices
6148c2ecf20Sopenharmony_ci	fi
6158c2ecf20Sopenharmony_ci
6168c2ecf20Sopenharmony_ci	exit 0
6178c2ecf20Sopenharmony_cifi
6188c2ecf20Sopenharmony_ci
6198c2ecf20Sopenharmony_ciif [[ "$LOCAL_DEV" == $"" ]] || [[ "$REMOTE_DEV" == $"" ]]; then
6208c2ecf20Sopenharmony_ci	show_help
6218c2ecf20Sopenharmony_ci	exit 1
6228c2ecf20Sopenharmony_cifi
6238c2ecf20Sopenharmony_ci
6248c2ecf20Sopenharmony_cintb_tool_tests
6258c2ecf20Sopenharmony_ciecho
6268c2ecf20Sopenharmony_cintb_pingpong_tests
6278c2ecf20Sopenharmony_ciecho
6288c2ecf20Sopenharmony_cintb_msi_tests
6298c2ecf20Sopenharmony_ciecho
6308c2ecf20Sopenharmony_cintb_perf_tests
6318c2ecf20Sopenharmony_ciecho
632