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