Back to home page

OSCL-LXR

 
 

    


0001 #!/bin/bash
0002 # SPDX-License-Identifier: GPL-2.0
0003 # This validates the user-initiated fw upload mechanism of the firmware
0004 # loader. It verifies that one or more firmware devices can be created
0005 # for a device driver. It also verifies the data transfer, the
0006 # cancellation support, and the error flows.
0007 set -e
0008 
0009 TEST_REQS_FW_UPLOAD="yes"
0010 TEST_DIR=$(dirname $0)
0011 
0012 progress_states="preparing transferring  programming"
0013 errors="hw-error
0014         timeout
0015         device-busy
0016         invalid-file-size
0017         read-write-error
0018         flash-wearout"
0019 error_abort="user-abort"
0020 fwname1=fw1
0021 fwname2=fw2
0022 fwname3=fw3
0023 
0024 source $TEST_DIR/fw_lib.sh
0025 
0026 check_mods
0027 check_setup
0028 verify_reqs
0029 
0030 trap "upload_finish" EXIT
0031 
0032 upload_finish() {
0033         local fwdevs="$fwname1 $fwname2 $fwname3"
0034 
0035         for name in $fwdevs; do
0036                 if [ -e "$DIR/$name" ]; then
0037                         echo -n "$name" > "$DIR"/upload_unregister
0038                 fi
0039         done
0040 }
0041 
0042 upload_fw() {
0043         local name="$1"
0044         local file="$2"
0045 
0046         echo 1 > "$DIR"/"$name"/loading
0047         cat "$file" > "$DIR"/"$name"/data
0048         echo 0 > "$DIR"/"$name"/loading
0049 }
0050 
0051 verify_fw() {
0052         local name="$1"
0053         local file="$2"
0054 
0055         echo -n "$name" > "$DIR"/config_upload_name
0056         if ! cmp "$file" "$DIR"/upload_read > /dev/null 2>&1; then
0057                 echo "$0: firmware compare for $name did not match" >&2
0058                 exit 1
0059         fi
0060 
0061         echo "$0: firmware upload for $name works" >&2
0062         return 0
0063 }
0064 
0065 inject_error() {
0066         local name="$1"
0067         local status="$2"
0068         local error="$3"
0069 
0070         echo 1 > "$DIR"/"$name"/loading
0071         echo -n "inject":"$status":"$error" > "$DIR"/"$name"/data
0072         echo 0 > "$DIR"/"$name"/loading
0073 }
0074 
0075 await_status() {
0076         local name="$1"
0077         local expected="$2"
0078         local status
0079         local i
0080 
0081         let i=0
0082         while [ $i -lt 50 ]; do
0083                 status=$(cat "$DIR"/"$name"/status)
0084                 if [ "$status" = "$expected" ]; then
0085                         return 0;
0086                 fi
0087                 sleep 1e-03
0088                 let i=$i+1
0089         done
0090 
0091         echo "$0: Invalid status: Expected $expected, Actual $status" >&2
0092         return 1;
0093 }
0094 
0095 await_idle() {
0096         local name="$1"
0097 
0098         await_status "$name" "idle"
0099         return $?
0100 }
0101 
0102 expect_error() {
0103         local name="$1"
0104         local expected="$2"
0105         local error=$(cat "$DIR"/"$name"/error)
0106 
0107         if [ "$error" != "$expected" ]; then
0108                 echo "Invalid error: Expected $expected, Actual $error" >&2
0109                 return 1
0110         fi
0111 
0112         return 0
0113 }
0114 
0115 random_firmware() {
0116         local bs="$1"
0117         local count="$2"
0118         local file=$(mktemp -p /tmp uploadfwXXX.bin)
0119 
0120         dd if=/dev/urandom of="$file" bs="$bs" count="$count" > /dev/null 2>&1
0121         echo "$file"
0122 }
0123 
0124 test_upload_cancel() {
0125         local name="$1"
0126         local status
0127 
0128         for status in $progress_states; do
0129                 inject_error $name $status $error_abort
0130                 if ! await_status $name $status; then
0131                         exit 1
0132                 fi
0133 
0134                 echo 1 > "$DIR"/"$name"/cancel
0135 
0136                 if ! await_idle $name; then
0137                         exit 1
0138                 fi
0139 
0140                 if ! expect_error $name "$status":"$error_abort"; then
0141                         exit 1
0142                 fi
0143         done
0144 
0145         echo "$0: firmware upload cancellation works"
0146         return 0
0147 }
0148 
0149 test_error_handling() {
0150         local name=$1
0151         local status
0152         local error
0153 
0154         for status in $progress_states; do
0155                 for error in $errors; do
0156                         inject_error $name $status $error
0157 
0158                         if ! await_idle $name; then
0159                                 exit 1
0160                         fi
0161 
0162                         if ! expect_error $name "$status":"$error"; then
0163                                 exit 1
0164                         fi
0165 
0166                 done
0167         done
0168         echo "$0: firmware upload error handling works"
0169 }
0170 
0171 test_fw_too_big() {
0172         local name=$1
0173         local fw_too_big=`random_firmware 512 5`
0174         local expected="preparing:invalid-file-size"
0175 
0176         upload_fw $name $fw_too_big
0177         rm -f $fw_too_big
0178 
0179         if ! await_idle $name; then
0180                 exit 1
0181         fi
0182 
0183         if ! expect_error $name $expected; then
0184                 exit 1
0185         fi
0186 
0187         echo "$0: oversized firmware error handling works"
0188 }
0189 
0190 echo -n "$fwname1" > "$DIR"/upload_register
0191 echo -n "$fwname2" > "$DIR"/upload_register
0192 echo -n "$fwname3" > "$DIR"/upload_register
0193 
0194 test_upload_cancel $fwname1
0195 test_error_handling $fwname1
0196 test_fw_too_big $fwname1
0197 
0198 fw_file1=`random_firmware 512 4`
0199 fw_file2=`random_firmware 512 3`
0200 fw_file3=`random_firmware 512 2`
0201 
0202 upload_fw $fwname1 $fw_file1
0203 upload_fw $fwname2 $fw_file2
0204 upload_fw $fwname3 $fw_file3
0205 
0206 verify_fw ${fwname1} ${fw_file1}
0207 verify_fw ${fwname2} ${fw_file2}
0208 verify_fw ${fwname3} ${fw_file3}
0209 
0210 echo -n "$fwname1" > "$DIR"/upload_unregister
0211 echo -n "$fwname2" > "$DIR"/upload_unregister
0212 echo -n "$fwname3" > "$DIR"/upload_unregister
0213 
0214 exit 0