Loading...
Note: File does not exist in v4.17.
1#!/bin/bash
2# SPDX-License-Identifier: GPL-2.0
3# This validates the user-initiated fw upload mechanism of the firmware
4# loader. It verifies that one or more firmware devices can be created
5# for a device driver. It also verifies the data transfer, the
6# cancellation support, and the error flows.
7set -e
8
9TEST_REQS_FW_UPLOAD="yes"
10TEST_DIR=$(dirname $0)
11
12progress_states="preparing transferring programming"
13errors="hw-error
14 timeout
15 device-busy
16 invalid-file-size
17 read-write-error
18 flash-wearout"
19error_abort="user-abort"
20fwname1=fw1
21fwname2=fw2
22fwname3=fw3
23
24source $TEST_DIR/fw_lib.sh
25
26check_mods
27check_setup
28verify_reqs
29
30trap "upload_finish" EXIT
31
32upload_finish() {
33 local fwdevs="$fwname1 $fwname2 $fwname3"
34
35 for name in $fwdevs; do
36 if [ -e "$DIR/$name" ]; then
37 echo -n "$name" > "$DIR"/upload_unregister
38 fi
39 done
40}
41
42upload_fw() {
43 local name="$1"
44 local file="$2"
45
46 echo 1 > "$DIR"/"$name"/loading
47 cat "$file" > "$DIR"/"$name"/data
48 echo 0 > "$DIR"/"$name"/loading
49}
50
51verify_fw() {
52 local name="$1"
53 local file="$2"
54
55 echo -n "$name" > "$DIR"/config_upload_name
56 if ! cmp "$file" "$DIR"/upload_read > /dev/null 2>&1; then
57 echo "$0: firmware compare for $name did not match" >&2
58 exit 1
59 fi
60
61 echo "$0: firmware upload for $name works" >&2
62 return 0
63}
64
65inject_error() {
66 local name="$1"
67 local status="$2"
68 local error="$3"
69
70 echo 1 > "$DIR"/"$name"/loading
71 echo -n "inject":"$status":"$error" > "$DIR"/"$name"/data
72 echo 0 > "$DIR"/"$name"/loading
73}
74
75await_status() {
76 local name="$1"
77 local expected="$2"
78 local status
79 local i
80
81 let i=0
82 while [ $i -lt 50 ]; do
83 status=$(cat "$DIR"/"$name"/status)
84 if [ "$status" = "$expected" ]; then
85 return 0;
86 fi
87 sleep 1e-03
88 let i=$i+1
89 done
90
91 echo "$0: Invalid status: Expected $expected, Actual $status" >&2
92 return 1;
93}
94
95await_idle() {
96 local name="$1"
97
98 await_status "$name" "idle"
99 return $?
100}
101
102expect_error() {
103 local name="$1"
104 local expected="$2"
105 local error=$(cat "$DIR"/"$name"/error)
106
107 if [ "$error" != "$expected" ]; then
108 echo "Invalid error: Expected $expected, Actual $error" >&2
109 return 1
110 fi
111
112 return 0
113}
114
115random_firmware() {
116 local bs="$1"
117 local count="$2"
118 local file=$(mktemp -p /tmp uploadfwXXX.bin)
119
120 dd if=/dev/urandom of="$file" bs="$bs" count="$count" > /dev/null 2>&1
121 echo "$file"
122}
123
124test_upload_cancel() {
125 local name="$1"
126 local status
127
128 for status in $progress_states; do
129 inject_error $name $status $error_abort
130 if ! await_status $name $status; then
131 exit 1
132 fi
133
134 echo 1 > "$DIR"/"$name"/cancel
135
136 if ! await_idle $name; then
137 exit 1
138 fi
139
140 if ! expect_error $name "$status":"$error_abort"; then
141 exit 1
142 fi
143 done
144
145 echo "$0: firmware upload cancellation works"
146 return 0
147}
148
149test_error_handling() {
150 local name=$1
151 local status
152 local error
153
154 for status in $progress_states; do
155 for error in $errors; do
156 inject_error $name $status $error
157
158 if ! await_idle $name; then
159 exit 1
160 fi
161
162 if ! expect_error $name "$status":"$error"; then
163 exit 1
164 fi
165
166 done
167 done
168 echo "$0: firmware upload error handling works"
169}
170
171test_fw_too_big() {
172 local name=$1
173 local fw_too_big=`random_firmware 512 5`
174 local expected="preparing:invalid-file-size"
175
176 upload_fw $name $fw_too_big
177 rm -f $fw_too_big
178
179 if ! await_idle $name; then
180 exit 1
181 fi
182
183 if ! expect_error $name $expected; then
184 exit 1
185 fi
186
187 echo "$0: oversized firmware error handling works"
188}
189
190echo -n "$fwname1" > "$DIR"/upload_register
191echo -n "$fwname2" > "$DIR"/upload_register
192echo -n "$fwname3" > "$DIR"/upload_register
193
194test_upload_cancel $fwname1
195test_error_handling $fwname1
196test_fw_too_big $fwname1
197
198fw_file1=`random_firmware 512 4`
199fw_file2=`random_firmware 512 3`
200fw_file3=`random_firmware 512 2`
201
202upload_fw $fwname1 $fw_file1
203upload_fw $fwname2 $fw_file2
204upload_fw $fwname3 $fw_file3
205
206verify_fw ${fwname1} ${fw_file1}
207verify_fw ${fwname2} ${fw_file2}
208verify_fw ${fwname3} ${fw_file3}
209
210echo -n "$fwname1" > "$DIR"/upload_unregister
211echo -n "$fwname2" > "$DIR"/upload_unregister
212echo -n "$fwname3" > "$DIR"/upload_unregister
213
214exit 0