xref: /OK3568_Linux_fs/kernel/tools/testing/selftests/ntb/ntb_test.sh (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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