116 lines
3.4 KiB
Bash
Executable File
116 lines
3.4 KiB
Bash
Executable File
#!/bin/bash
|
|
display_help() {
|
|
echo "$0 <xdma id> <io size> <io count> <h2c #> <c2h #>"
|
|
echo -e "xdma id:\txdma[N] "
|
|
echo -e "io size:\tdma transfer size in byte"
|
|
echo -e "io count:\tdma transfer count"
|
|
echo -e "h2c #:\tnumber of h2c channels"
|
|
echo -e "c2h #:\tnumber of c2h channels"
|
|
echo
|
|
|
|
exit 1
|
|
}
|
|
|
|
if [ $# -eq 0 ]; then
|
|
display_help
|
|
fi
|
|
|
|
xid=$1
|
|
transferSz=$2
|
|
transferCount=$3
|
|
h2cChannels=$4
|
|
c2hChannels=$5
|
|
|
|
tool_path=../tools
|
|
|
|
testError=0
|
|
# Run the PCIe DMA memory mapped write read test
|
|
echo "Info: Running PCIe DMA memory mapped write read test"
|
|
echo -e "\ttransfer size: $transferSz, count: $transferCount"
|
|
|
|
# Write to all enabled h2cChannels in parallel
|
|
if [ $h2cChannels -gt 0 ]; then
|
|
# Loop over four blocks of size $transferSz and write to them
|
|
for ((i=0; i<=3; i++)); do
|
|
addrOffset=$(($transferSz * $i))
|
|
curChannel=$(($i % $h2cChannels))
|
|
echo "Info: Writing to h2c channel $curChannel at address" \
|
|
"offset $addrOffset."
|
|
$tool_path/dma_to_device -d /dev/${xid}_h2c_${curChannel} \
|
|
-f data/datafile${i}_4K.bin -s $transferSz \
|
|
-a $addrOffset -c $transferCount &
|
|
# If all channels have active transactions we must wait for
|
|
# them to complete
|
|
if [ $(($curChannel+1)) -eq $h2cChannels ]; then
|
|
echo "Info: Wait for current transactions to complete."
|
|
wait
|
|
fi
|
|
done
|
|
fi
|
|
|
|
# Wait for the last transaction to complete.
|
|
wait
|
|
|
|
# Read from all enabled c2hChannels in parallel
|
|
if [ $c2hChannels -gt 0 ]; then
|
|
# Loop over four blocks of size $transferSz and read from them
|
|
for ((i=0; i<=3; i++)); do
|
|
addrOffset=$(($transferSz * $i))
|
|
curChannel=$(($i % $c2hChannels))
|
|
|
|
rm -f data/output_datafile${i}_4K.bin
|
|
echo "Info: Reading from c2h channel $curChannel at " \
|
|
"address offset $addrOffset."
|
|
$tool_path/dma_from_device -d /dev/${xid}_c2h_${curChannel} \
|
|
-f data/output_datafile${i}_4K.bin -s $transferSz \
|
|
-a $addrOffset -c $transferCount &
|
|
# If all channels have active transactions we must wait for
|
|
# them to complete
|
|
if [ $(($curChannel+1)) -eq $c2hChannels ]; then
|
|
echo "Info: Wait for current transactions to complete."
|
|
wait
|
|
fi
|
|
done
|
|
fi
|
|
|
|
# Wait for the last transaction to complete.
|
|
wait
|
|
|
|
# Verify that the written data matches the read data if possible.
|
|
if [ $h2cChannels -eq 0 ]; then
|
|
echo "Info: No data verification was performed because no h2c " \
|
|
"channels are enabled."
|
|
elif [ $c2hChannels -eq 0 ]; then
|
|
echo "Info: No data verification was performed because no c2h " \
|
|
"channels are enabled."
|
|
else
|
|
echo "Info: Checking data integrity."
|
|
for ((i=0; i<=3; i++)); do
|
|
cmp data/output_datafile${i}_4K.bin data/datafile${i}_4K.bin \
|
|
-n $transferSz
|
|
returnVal=$?
|
|
if [ ! $returnVal == 0 ]; then
|
|
echo "Error: The data written did not match the data" \
|
|
" that was read."
|
|
echo -e "\taddress range: " \
|
|
"$(($i*$transferSz)) - $((($i+1)*$transferSz))"
|
|
echo -e "\twrite data file: data/datafile${i}_4K.bin"
|
|
echo -e "\tread data file: data/output_datafile${i}_4K.bin"
|
|
testError=1
|
|
else
|
|
echo "Info: Data check passed for address range " \
|
|
"$(($i*$transferSz)) - $((($i+1)*$transferSz))"
|
|
fi
|
|
done
|
|
fi
|
|
|
|
# Exit with an error code if an error was found during testing
|
|
if [ $testError -eq 1 ]; then
|
|
echo "Error: Test completed with Errors."
|
|
exit 1
|
|
fi
|
|
|
|
# Report all tests passed and exit
|
|
echo "Info: All PCIe DMA memory mapped tests passed."
|
|
exit 0
|