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