xref: /OK3568_Linux_fs/kernel/tools/testing/selftests/firmware/fw_filesystem.sh (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun#!/bin/bash
2*4882a593Smuzhiyun# SPDX-License-Identifier: GPL-2.0
3*4882a593Smuzhiyun# This validates that the kernel will load firmware out of its list of
4*4882a593Smuzhiyun# firmware locations on disk. Since the user helper does similar work,
5*4882a593Smuzhiyun# we reset the custom load directory to a location the user helper doesn't
6*4882a593Smuzhiyun# know so we can be sure we're not accidentally testing the user helper.
7*4882a593Smuzhiyunset -e
8*4882a593Smuzhiyun
9*4882a593SmuzhiyunTEST_REQS_FW_SYSFS_FALLBACK="no"
10*4882a593SmuzhiyunTEST_REQS_FW_SET_CUSTOM_PATH="yes"
11*4882a593SmuzhiyunTEST_DIR=$(dirname $0)
12*4882a593Smuzhiyunsource $TEST_DIR/fw_lib.sh
13*4882a593Smuzhiyun
14*4882a593Smuzhiyuncheck_mods
15*4882a593Smuzhiyuncheck_setup
16*4882a593Smuzhiyunverify_reqs
17*4882a593Smuzhiyunsetup_tmp_file
18*4882a593Smuzhiyun
19*4882a593Smuzhiyuntrap "test_finish" EXIT
20*4882a593Smuzhiyun
21*4882a593Smuzhiyunif [ "$HAS_FW_LOADER_USER_HELPER" = "yes" ]; then
22*4882a593Smuzhiyun	# Turn down the timeout so failures don't take so long.
23*4882a593Smuzhiyun	echo 1 >/sys/class/firmware/timeout
24*4882a593Smuzhiyunfi
25*4882a593Smuzhiyun
26*4882a593Smuzhiyunif printf '\000' >"$DIR"/trigger_request 2> /dev/null; then
27*4882a593Smuzhiyun	echo "$0: empty filename should not succeed" >&2
28*4882a593Smuzhiyun	exit 1
29*4882a593Smuzhiyunfi
30*4882a593Smuzhiyun
31*4882a593Smuzhiyunif [ ! -e "$DIR"/trigger_async_request ]; then
32*4882a593Smuzhiyun	echo "$0: empty filename: async trigger not present, ignoring test" >&2
33*4882a593Smuzhiyun	exit $ksft_skip
34*4882a593Smuzhiyunelse
35*4882a593Smuzhiyun	if printf '\000' >"$DIR"/trigger_async_request 2> /dev/null; then
36*4882a593Smuzhiyun		echo "$0: empty filename should not succeed (async)" >&2
37*4882a593Smuzhiyun		exit 1
38*4882a593Smuzhiyun	fi
39*4882a593Smuzhiyunfi
40*4882a593Smuzhiyun
41*4882a593Smuzhiyun# Request a firmware that doesn't exist, it should fail.
42*4882a593Smuzhiyunif echo -n "nope-$NAME" >"$DIR"/trigger_request 2> /dev/null; then
43*4882a593Smuzhiyun	echo "$0: firmware shouldn't have loaded" >&2
44*4882a593Smuzhiyun	exit 1
45*4882a593Smuzhiyunfi
46*4882a593Smuzhiyunif diff -q "$FW" /dev/test_firmware >/dev/null ; then
47*4882a593Smuzhiyun	echo "$0: firmware was not expected to match" >&2
48*4882a593Smuzhiyun	exit 1
49*4882a593Smuzhiyunelse
50*4882a593Smuzhiyun	if [ "$HAS_FW_LOADER_USER_HELPER" = "yes" ]; then
51*4882a593Smuzhiyun		echo "$0: timeout works"
52*4882a593Smuzhiyun	fi
53*4882a593Smuzhiyunfi
54*4882a593Smuzhiyun
55*4882a593Smuzhiyun# This should succeed via kernel load or will fail after 1 second after
56*4882a593Smuzhiyun# being handed over to the user helper, which won't find the fw either.
57*4882a593Smuzhiyunif ! echo -n "$NAME" >"$DIR"/trigger_request ; then
58*4882a593Smuzhiyun	echo "$0: could not trigger request" >&2
59*4882a593Smuzhiyun	exit 1
60*4882a593Smuzhiyunfi
61*4882a593Smuzhiyun
62*4882a593Smuzhiyun# Verify the contents are what we expect.
63*4882a593Smuzhiyunif ! diff -q "$FW" /dev/test_firmware >/dev/null ; then
64*4882a593Smuzhiyun	echo "$0: firmware was not loaded" >&2
65*4882a593Smuzhiyun	exit 1
66*4882a593Smuzhiyunelse
67*4882a593Smuzhiyun	echo "$0: filesystem loading works"
68*4882a593Smuzhiyunfi
69*4882a593Smuzhiyun
70*4882a593Smuzhiyun# Try the asynchronous version too
71*4882a593Smuzhiyunif [ ! -e "$DIR"/trigger_async_request ]; then
72*4882a593Smuzhiyun	echo "$0: firmware loading: async trigger not present, ignoring test" >&2
73*4882a593Smuzhiyun	exit $ksft_skip
74*4882a593Smuzhiyunelse
75*4882a593Smuzhiyun	if ! echo -n "$NAME" >"$DIR"/trigger_async_request ; then
76*4882a593Smuzhiyun		echo "$0: could not trigger async request" >&2
77*4882a593Smuzhiyun		exit 1
78*4882a593Smuzhiyun	fi
79*4882a593Smuzhiyun
80*4882a593Smuzhiyun	# Verify the contents are what we expect.
81*4882a593Smuzhiyun	if ! diff -q "$FW" /dev/test_firmware >/dev/null ; then
82*4882a593Smuzhiyun		echo "$0: firmware was not loaded (async)" >&2
83*4882a593Smuzhiyun		exit 1
84*4882a593Smuzhiyun	else
85*4882a593Smuzhiyun		echo "$0: async filesystem loading works"
86*4882a593Smuzhiyun	fi
87*4882a593Smuzhiyunfi
88*4882a593Smuzhiyun
89*4882a593Smuzhiyun# Try platform (EFI embedded fw) loading too
90*4882a593Smuzhiyunif [ ! -e "$DIR"/trigger_request_platform ]; then
91*4882a593Smuzhiyun	echo "$0: firmware loading: platform trigger not present, ignoring test" >&2
92*4882a593Smuzhiyunelse
93*4882a593Smuzhiyun	if printf '\000' >"$DIR"/trigger_request_platform 2> /dev/null; then
94*4882a593Smuzhiyun		echo "$0: empty filename should not succeed (platform)" >&2
95*4882a593Smuzhiyun		exit 1
96*4882a593Smuzhiyun	fi
97*4882a593Smuzhiyun
98*4882a593Smuzhiyun	# Note we echo a non-existing name, since files on the file-system
99*4882a593Smuzhiyun	# are preferred over firmware embedded inside the platform's firmware
100*4882a593Smuzhiyun	# The test adds a fake entry with the requested name to the platform's
101*4882a593Smuzhiyun	# fw list, so the name does not matter as long as it does not exist
102*4882a593Smuzhiyun	if ! echo -n "nope-$NAME" >"$DIR"/trigger_request_platform ; then
103*4882a593Smuzhiyun		echo "$0: could not trigger request platform" >&2
104*4882a593Smuzhiyun		exit 1
105*4882a593Smuzhiyun	fi
106*4882a593Smuzhiyun
107*4882a593Smuzhiyun	# The test verifies itself that the loaded firmware contents matches
108*4882a593Smuzhiyun	# the contents for the fake platform fw entry it added.
109*4882a593Smuzhiyun	echo "$0: platform loading works"
110*4882a593Smuzhiyunfi
111*4882a593Smuzhiyun
112*4882a593Smuzhiyun### Batched requests tests
113*4882a593Smuzhiyuntest_config_present()
114*4882a593Smuzhiyun{
115*4882a593Smuzhiyun	if [ ! -f $DIR/reset ]; then
116*4882a593Smuzhiyun		echo "Configuration triggers not present, ignoring test"
117*4882a593Smuzhiyun		exit $ksft_skip
118*4882a593Smuzhiyun	fi
119*4882a593Smuzhiyun}
120*4882a593Smuzhiyun
121*4882a593Smuzhiyun# Defaults :
122*4882a593Smuzhiyun#
123*4882a593Smuzhiyun# send_uevent: 1
124*4882a593Smuzhiyun# sync_direct: 0
125*4882a593Smuzhiyun# name: test-firmware.bin
126*4882a593Smuzhiyun# num_requests: 4
127*4882a593Smuzhiyunconfig_reset()
128*4882a593Smuzhiyun{
129*4882a593Smuzhiyun	echo 1 >  $DIR/reset
130*4882a593Smuzhiyun}
131*4882a593Smuzhiyun
132*4882a593Smuzhiyunrelease_all_firmware()
133*4882a593Smuzhiyun{
134*4882a593Smuzhiyun	echo 1 >  $DIR/release_all_firmware
135*4882a593Smuzhiyun}
136*4882a593Smuzhiyun
137*4882a593Smuzhiyunconfig_set_name()
138*4882a593Smuzhiyun{
139*4882a593Smuzhiyun	echo -n $1 >  $DIR/config_name
140*4882a593Smuzhiyun}
141*4882a593Smuzhiyun
142*4882a593Smuzhiyunconfig_set_into_buf()
143*4882a593Smuzhiyun{
144*4882a593Smuzhiyun	echo 1 >  $DIR/config_into_buf
145*4882a593Smuzhiyun}
146*4882a593Smuzhiyun
147*4882a593Smuzhiyunconfig_unset_into_buf()
148*4882a593Smuzhiyun{
149*4882a593Smuzhiyun	echo 0 >  $DIR/config_into_buf
150*4882a593Smuzhiyun}
151*4882a593Smuzhiyun
152*4882a593Smuzhiyunconfig_set_buf_size()
153*4882a593Smuzhiyun{
154*4882a593Smuzhiyun	echo $1 >  $DIR/config_buf_size
155*4882a593Smuzhiyun}
156*4882a593Smuzhiyun
157*4882a593Smuzhiyunconfig_set_file_offset()
158*4882a593Smuzhiyun{
159*4882a593Smuzhiyun	echo $1 >  $DIR/config_file_offset
160*4882a593Smuzhiyun}
161*4882a593Smuzhiyun
162*4882a593Smuzhiyunconfig_set_partial()
163*4882a593Smuzhiyun{
164*4882a593Smuzhiyun	echo 1 >  $DIR/config_partial
165*4882a593Smuzhiyun}
166*4882a593Smuzhiyun
167*4882a593Smuzhiyunconfig_unset_partial()
168*4882a593Smuzhiyun{
169*4882a593Smuzhiyun	echo 0 >  $DIR/config_partial
170*4882a593Smuzhiyun}
171*4882a593Smuzhiyun
172*4882a593Smuzhiyunconfig_set_sync_direct()
173*4882a593Smuzhiyun{
174*4882a593Smuzhiyun	echo 1 >  $DIR/config_sync_direct
175*4882a593Smuzhiyun}
176*4882a593Smuzhiyun
177*4882a593Smuzhiyunconfig_unset_sync_direct()
178*4882a593Smuzhiyun{
179*4882a593Smuzhiyun	echo 0 >  $DIR/config_sync_direct
180*4882a593Smuzhiyun}
181*4882a593Smuzhiyun
182*4882a593Smuzhiyunconfig_set_uevent()
183*4882a593Smuzhiyun{
184*4882a593Smuzhiyun	echo 1 >  $DIR/config_send_uevent
185*4882a593Smuzhiyun}
186*4882a593Smuzhiyun
187*4882a593Smuzhiyunconfig_unset_uevent()
188*4882a593Smuzhiyun{
189*4882a593Smuzhiyun	echo 0 >  $DIR/config_send_uevent
190*4882a593Smuzhiyun}
191*4882a593Smuzhiyun
192*4882a593Smuzhiyunconfig_trigger_sync()
193*4882a593Smuzhiyun{
194*4882a593Smuzhiyun	echo -n 1 > $DIR/trigger_batched_requests 2>/dev/null
195*4882a593Smuzhiyun}
196*4882a593Smuzhiyun
197*4882a593Smuzhiyunconfig_trigger_async()
198*4882a593Smuzhiyun{
199*4882a593Smuzhiyun	echo -n 1 > $DIR/trigger_batched_requests_async 2> /dev/null
200*4882a593Smuzhiyun}
201*4882a593Smuzhiyun
202*4882a593Smuzhiyunconfig_set_read_fw_idx()
203*4882a593Smuzhiyun{
204*4882a593Smuzhiyun	echo -n $1 > $DIR/config_read_fw_idx 2> /dev/null
205*4882a593Smuzhiyun}
206*4882a593Smuzhiyun
207*4882a593Smuzhiyunread_firmwares()
208*4882a593Smuzhiyun{
209*4882a593Smuzhiyun	if [ "$(cat $DIR/config_into_buf)" == "1" ]; then
210*4882a593Smuzhiyun		fwfile="$FW_INTO_BUF"
211*4882a593Smuzhiyun	else
212*4882a593Smuzhiyun		fwfile="$FW"
213*4882a593Smuzhiyun	fi
214*4882a593Smuzhiyun	if [ "$1" = "xzonly" ]; then
215*4882a593Smuzhiyun		fwfile="${fwfile}-orig"
216*4882a593Smuzhiyun	fi
217*4882a593Smuzhiyun	for i in $(seq 0 3); do
218*4882a593Smuzhiyun		config_set_read_fw_idx $i
219*4882a593Smuzhiyun		# Verify the contents are what we expect.
220*4882a593Smuzhiyun		# -Z required for now -- check for yourself, md5sum
221*4882a593Smuzhiyun		# on $FW and DIR/read_firmware will yield the same. Even
222*4882a593Smuzhiyun		# cmp agrees, so something is off.
223*4882a593Smuzhiyun		if ! diff -q -Z "$fwfile" $DIR/read_firmware 2>/dev/null ; then
224*4882a593Smuzhiyun			echo "request #$i: firmware was not loaded" >&2
225*4882a593Smuzhiyun			exit 1
226*4882a593Smuzhiyun		fi
227*4882a593Smuzhiyun	done
228*4882a593Smuzhiyun}
229*4882a593Smuzhiyun
230*4882a593Smuzhiyunread_partial_firmwares()
231*4882a593Smuzhiyun{
232*4882a593Smuzhiyun	if [ "$(cat $DIR/config_into_buf)" == "1" ]; then
233*4882a593Smuzhiyun		fwfile="${FW_INTO_BUF}"
234*4882a593Smuzhiyun	else
235*4882a593Smuzhiyun		fwfile="${FW}"
236*4882a593Smuzhiyun	fi
237*4882a593Smuzhiyun
238*4882a593Smuzhiyun	if [ "$1" = "xzonly" ]; then
239*4882a593Smuzhiyun		fwfile="${fwfile}-orig"
240*4882a593Smuzhiyun	fi
241*4882a593Smuzhiyun
242*4882a593Smuzhiyun	# Strip fwfile down to match partial offset and length
243*4882a593Smuzhiyun	partial_data="$(cat $fwfile)"
244*4882a593Smuzhiyun	partial_data="${partial_data:$2:$3}"
245*4882a593Smuzhiyun
246*4882a593Smuzhiyun	for i in $(seq 0 3); do
247*4882a593Smuzhiyun		config_set_read_fw_idx $i
248*4882a593Smuzhiyun
249*4882a593Smuzhiyun		read_firmware="$(cat $DIR/read_firmware)"
250*4882a593Smuzhiyun
251*4882a593Smuzhiyun		# Verify the contents are what we expect.
252*4882a593Smuzhiyun		if [ $read_firmware != $partial_data ]; then
253*4882a593Smuzhiyun			echo "request #$i: partial firmware was not loaded" >&2
254*4882a593Smuzhiyun			exit 1
255*4882a593Smuzhiyun		fi
256*4882a593Smuzhiyun	done
257*4882a593Smuzhiyun}
258*4882a593Smuzhiyun
259*4882a593Smuzhiyunread_firmwares_expect_nofile()
260*4882a593Smuzhiyun{
261*4882a593Smuzhiyun	for i in $(seq 0 3); do
262*4882a593Smuzhiyun		config_set_read_fw_idx $i
263*4882a593Smuzhiyun		# Ensures contents differ
264*4882a593Smuzhiyun		if diff -q -Z "$FW" $DIR/read_firmware 2>/dev/null ; then
265*4882a593Smuzhiyun			echo "request $i: file was not expected to match" >&2
266*4882a593Smuzhiyun			exit 1
267*4882a593Smuzhiyun		fi
268*4882a593Smuzhiyun	done
269*4882a593Smuzhiyun}
270*4882a593Smuzhiyun
271*4882a593Smuzhiyuntest_batched_request_firmware_nofile()
272*4882a593Smuzhiyun{
273*4882a593Smuzhiyun	echo -n "Batched request_firmware() nofile try #$1: "
274*4882a593Smuzhiyun	config_reset
275*4882a593Smuzhiyun	config_set_name nope-test-firmware.bin
276*4882a593Smuzhiyun	config_trigger_sync
277*4882a593Smuzhiyun	read_firmwares_expect_nofile
278*4882a593Smuzhiyun	release_all_firmware
279*4882a593Smuzhiyun	echo "OK"
280*4882a593Smuzhiyun}
281*4882a593Smuzhiyun
282*4882a593Smuzhiyuntest_batched_request_firmware_into_buf_nofile()
283*4882a593Smuzhiyun{
284*4882a593Smuzhiyun	echo -n "Batched request_firmware_into_buf() nofile try #$1: "
285*4882a593Smuzhiyun	config_reset
286*4882a593Smuzhiyun	config_set_name nope-test-firmware.bin
287*4882a593Smuzhiyun	config_set_into_buf
288*4882a593Smuzhiyun	config_trigger_sync
289*4882a593Smuzhiyun	read_firmwares_expect_nofile
290*4882a593Smuzhiyun	release_all_firmware
291*4882a593Smuzhiyun	echo "OK"
292*4882a593Smuzhiyun}
293*4882a593Smuzhiyun
294*4882a593Smuzhiyuntest_request_partial_firmware_into_buf_nofile()
295*4882a593Smuzhiyun{
296*4882a593Smuzhiyun	echo -n "Test request_partial_firmware_into_buf() off=$1 size=$2 nofile: "
297*4882a593Smuzhiyun	config_reset
298*4882a593Smuzhiyun	config_set_name nope-test-firmware.bin
299*4882a593Smuzhiyun	config_set_into_buf
300*4882a593Smuzhiyun	config_set_partial
301*4882a593Smuzhiyun	config_set_buf_size $2
302*4882a593Smuzhiyun	config_set_file_offset $1
303*4882a593Smuzhiyun	config_trigger_sync
304*4882a593Smuzhiyun	read_firmwares_expect_nofile
305*4882a593Smuzhiyun	release_all_firmware
306*4882a593Smuzhiyun	echo "OK"
307*4882a593Smuzhiyun}
308*4882a593Smuzhiyun
309*4882a593Smuzhiyuntest_batched_request_firmware_direct_nofile()
310*4882a593Smuzhiyun{
311*4882a593Smuzhiyun	echo -n "Batched request_firmware_direct() nofile try #$1: "
312*4882a593Smuzhiyun	config_reset
313*4882a593Smuzhiyun	config_set_name nope-test-firmware.bin
314*4882a593Smuzhiyun	config_set_sync_direct
315*4882a593Smuzhiyun	config_trigger_sync
316*4882a593Smuzhiyun	release_all_firmware
317*4882a593Smuzhiyun	echo "OK"
318*4882a593Smuzhiyun}
319*4882a593Smuzhiyun
320*4882a593Smuzhiyuntest_request_firmware_nowait_uevent_nofile()
321*4882a593Smuzhiyun{
322*4882a593Smuzhiyun	echo -n "Batched request_firmware_nowait(uevent=true) nofile try #$1: "
323*4882a593Smuzhiyun	config_reset
324*4882a593Smuzhiyun	config_set_name nope-test-firmware.bin
325*4882a593Smuzhiyun	config_trigger_async
326*4882a593Smuzhiyun	release_all_firmware
327*4882a593Smuzhiyun	echo "OK"
328*4882a593Smuzhiyun}
329*4882a593Smuzhiyun
330*4882a593Smuzhiyuntest_wait_and_cancel_custom_load()
331*4882a593Smuzhiyun{
332*4882a593Smuzhiyun	if [ "$HAS_FW_LOADER_USER_HELPER" != "yes" ]; then
333*4882a593Smuzhiyun		return
334*4882a593Smuzhiyun	fi
335*4882a593Smuzhiyun	local timeout=10
336*4882a593Smuzhiyun	name=$1
337*4882a593Smuzhiyun	while [ ! -e "$DIR"/"$name"/loading ]; do
338*4882a593Smuzhiyun		sleep 0.1
339*4882a593Smuzhiyun		timeout=$(( $timeout - 1 ))
340*4882a593Smuzhiyun		if [ "$timeout" -eq 0 ]; then
341*4882a593Smuzhiyun			echo "firmware interface never appeared:" >&2
342*4882a593Smuzhiyun			echo "$DIR/$name/loading" >&2
343*4882a593Smuzhiyun			exit 1
344*4882a593Smuzhiyun		fi
345*4882a593Smuzhiyun	done
346*4882a593Smuzhiyun	echo -1 >"$DIR"/"$name"/loading
347*4882a593Smuzhiyun}
348*4882a593Smuzhiyun
349*4882a593Smuzhiyuntest_request_firmware_nowait_custom_nofile()
350*4882a593Smuzhiyun{
351*4882a593Smuzhiyun	echo -n "Batched request_firmware_nowait(uevent=false) nofile try #$1: "
352*4882a593Smuzhiyun	config_reset
353*4882a593Smuzhiyun	config_unset_uevent
354*4882a593Smuzhiyun	RANDOM_FILE_PATH=$(setup_random_file_fake)
355*4882a593Smuzhiyun	RANDOM_FILE="$(basename $RANDOM_FILE_PATH)"
356*4882a593Smuzhiyun	config_set_name $RANDOM_FILE
357*4882a593Smuzhiyun	config_trigger_async &
358*4882a593Smuzhiyun	test_wait_and_cancel_custom_load $RANDOM_FILE
359*4882a593Smuzhiyun	wait
360*4882a593Smuzhiyun	release_all_firmware
361*4882a593Smuzhiyun	echo "OK"
362*4882a593Smuzhiyun}
363*4882a593Smuzhiyun
364*4882a593Smuzhiyuntest_batched_request_firmware()
365*4882a593Smuzhiyun{
366*4882a593Smuzhiyun	echo -n "Batched request_firmware() $2 try #$1: "
367*4882a593Smuzhiyun	config_reset
368*4882a593Smuzhiyun	config_trigger_sync
369*4882a593Smuzhiyun	read_firmwares $2
370*4882a593Smuzhiyun	release_all_firmware
371*4882a593Smuzhiyun	echo "OK"
372*4882a593Smuzhiyun}
373*4882a593Smuzhiyun
374*4882a593Smuzhiyuntest_batched_request_firmware_into_buf()
375*4882a593Smuzhiyun{
376*4882a593Smuzhiyun	echo -n "Batched request_firmware_into_buf() $2 try #$1: "
377*4882a593Smuzhiyun	config_reset
378*4882a593Smuzhiyun	config_set_name $TEST_FIRMWARE_INTO_BUF_FILENAME
379*4882a593Smuzhiyun	config_set_into_buf
380*4882a593Smuzhiyun	config_trigger_sync
381*4882a593Smuzhiyun	read_firmwares $2
382*4882a593Smuzhiyun	release_all_firmware
383*4882a593Smuzhiyun	echo "OK"
384*4882a593Smuzhiyun}
385*4882a593Smuzhiyun
386*4882a593Smuzhiyuntest_batched_request_firmware_direct()
387*4882a593Smuzhiyun{
388*4882a593Smuzhiyun	echo -n "Batched request_firmware_direct() $2 try #$1: "
389*4882a593Smuzhiyun	config_reset
390*4882a593Smuzhiyun	config_set_sync_direct
391*4882a593Smuzhiyun	config_trigger_sync
392*4882a593Smuzhiyun	release_all_firmware
393*4882a593Smuzhiyun	echo "OK"
394*4882a593Smuzhiyun}
395*4882a593Smuzhiyun
396*4882a593Smuzhiyuntest_request_firmware_nowait_uevent()
397*4882a593Smuzhiyun{
398*4882a593Smuzhiyun	echo -n "Batched request_firmware_nowait(uevent=true) $2 try #$1: "
399*4882a593Smuzhiyun	config_reset
400*4882a593Smuzhiyun	config_trigger_async
401*4882a593Smuzhiyun	release_all_firmware
402*4882a593Smuzhiyun	echo "OK"
403*4882a593Smuzhiyun}
404*4882a593Smuzhiyun
405*4882a593Smuzhiyuntest_request_firmware_nowait_custom()
406*4882a593Smuzhiyun{
407*4882a593Smuzhiyun	echo -n "Batched request_firmware_nowait(uevent=false) $2 try #$1: "
408*4882a593Smuzhiyun	config_reset
409*4882a593Smuzhiyun	config_unset_uevent
410*4882a593Smuzhiyun	RANDOM_FILE_PATH=$(setup_random_file)
411*4882a593Smuzhiyun	RANDOM_FILE="$(basename $RANDOM_FILE_PATH)"
412*4882a593Smuzhiyun	if [ "$2" = "both" ]; then
413*4882a593Smuzhiyun		xz -9 -C crc32 -k $RANDOM_FILE_PATH
414*4882a593Smuzhiyun	elif [ "$2" = "xzonly" ]; then
415*4882a593Smuzhiyun		xz -9 -C crc32 $RANDOM_FILE_PATH
416*4882a593Smuzhiyun	fi
417*4882a593Smuzhiyun	config_set_name $RANDOM_FILE
418*4882a593Smuzhiyun	config_trigger_async
419*4882a593Smuzhiyun	release_all_firmware
420*4882a593Smuzhiyun	echo "OK"
421*4882a593Smuzhiyun}
422*4882a593Smuzhiyun
423*4882a593Smuzhiyuntest_request_partial_firmware_into_buf()
424*4882a593Smuzhiyun{
425*4882a593Smuzhiyun	echo -n "Test request_partial_firmware_into_buf() off=$1 size=$2: "
426*4882a593Smuzhiyun	config_reset
427*4882a593Smuzhiyun	config_set_name $TEST_FIRMWARE_INTO_BUF_FILENAME
428*4882a593Smuzhiyun	config_set_into_buf
429*4882a593Smuzhiyun	config_set_partial
430*4882a593Smuzhiyun	config_set_buf_size $2
431*4882a593Smuzhiyun	config_set_file_offset $1
432*4882a593Smuzhiyun	config_trigger_sync
433*4882a593Smuzhiyun	read_partial_firmwares normal $1 $2
434*4882a593Smuzhiyun	release_all_firmware
435*4882a593Smuzhiyun	echo "OK"
436*4882a593Smuzhiyun}
437*4882a593Smuzhiyun
438*4882a593Smuzhiyun# Only continue if batched request triggers are present on the
439*4882a593Smuzhiyun# test-firmware driver
440*4882a593Smuzhiyuntest_config_present
441*4882a593Smuzhiyun
442*4882a593Smuzhiyun# test with the file present
443*4882a593Smuzhiyunecho
444*4882a593Smuzhiyunecho "Testing with the file present..."
445*4882a593Smuzhiyunfor i in $(seq 1 5); do
446*4882a593Smuzhiyun	test_batched_request_firmware $i normal
447*4882a593Smuzhiyundone
448*4882a593Smuzhiyun
449*4882a593Smuzhiyunfor i in $(seq 1 5); do
450*4882a593Smuzhiyun	test_batched_request_firmware_into_buf $i normal
451*4882a593Smuzhiyundone
452*4882a593Smuzhiyun
453*4882a593Smuzhiyunfor i in $(seq 1 5); do
454*4882a593Smuzhiyun	test_batched_request_firmware_direct $i normal
455*4882a593Smuzhiyundone
456*4882a593Smuzhiyun
457*4882a593Smuzhiyunfor i in $(seq 1 5); do
458*4882a593Smuzhiyun	test_request_firmware_nowait_uevent $i normal
459*4882a593Smuzhiyundone
460*4882a593Smuzhiyun
461*4882a593Smuzhiyunfor i in $(seq 1 5); do
462*4882a593Smuzhiyun	test_request_firmware_nowait_custom $i normal
463*4882a593Smuzhiyundone
464*4882a593Smuzhiyun
465*4882a593Smuzhiyun# Partial loads cannot use fallback, so do not repeat tests.
466*4882a593Smuzhiyuntest_request_partial_firmware_into_buf 0 10
467*4882a593Smuzhiyuntest_request_partial_firmware_into_buf 0 5
468*4882a593Smuzhiyuntest_request_partial_firmware_into_buf 1 6
469*4882a593Smuzhiyuntest_request_partial_firmware_into_buf 2 10
470*4882a593Smuzhiyun
471*4882a593Smuzhiyun# Test for file not found, errors are expected, the failure would be
472*4882a593Smuzhiyun# a hung task, which would require a hard reset.
473*4882a593Smuzhiyunecho
474*4882a593Smuzhiyunecho "Testing with the file missing..."
475*4882a593Smuzhiyunfor i in $(seq 1 5); do
476*4882a593Smuzhiyun	test_batched_request_firmware_nofile $i
477*4882a593Smuzhiyundone
478*4882a593Smuzhiyun
479*4882a593Smuzhiyunfor i in $(seq 1 5); do
480*4882a593Smuzhiyun	test_batched_request_firmware_into_buf_nofile $i
481*4882a593Smuzhiyundone
482*4882a593Smuzhiyun
483*4882a593Smuzhiyunfor i in $(seq 1 5); do
484*4882a593Smuzhiyun	test_batched_request_firmware_direct_nofile $i
485*4882a593Smuzhiyundone
486*4882a593Smuzhiyun
487*4882a593Smuzhiyunfor i in $(seq 1 5); do
488*4882a593Smuzhiyun	test_request_firmware_nowait_uevent_nofile $i
489*4882a593Smuzhiyundone
490*4882a593Smuzhiyun
491*4882a593Smuzhiyunfor i in $(seq 1 5); do
492*4882a593Smuzhiyun	test_request_firmware_nowait_custom_nofile $i
493*4882a593Smuzhiyundone
494*4882a593Smuzhiyun
495*4882a593Smuzhiyun# Partial loads cannot use fallback, so do not repeat tests.
496*4882a593Smuzhiyuntest_request_partial_firmware_into_buf_nofile 0 10
497*4882a593Smuzhiyuntest_request_partial_firmware_into_buf_nofile 0 5
498*4882a593Smuzhiyuntest_request_partial_firmware_into_buf_nofile 1 6
499*4882a593Smuzhiyuntest_request_partial_firmware_into_buf_nofile 2 10
500*4882a593Smuzhiyun
501*4882a593Smuzhiyuntest "$HAS_FW_LOADER_COMPRESS" != "yes" && exit 0
502*4882a593Smuzhiyun
503*4882a593Smuzhiyun# test with both files present
504*4882a593Smuzhiyunxz -9 -C crc32 -k $FW
505*4882a593Smuzhiyunconfig_set_name $NAME
506*4882a593Smuzhiyunecho
507*4882a593Smuzhiyunecho "Testing with both plain and xz files present..."
508*4882a593Smuzhiyunfor i in $(seq 1 5); do
509*4882a593Smuzhiyun	test_batched_request_firmware $i both
510*4882a593Smuzhiyundone
511*4882a593Smuzhiyun
512*4882a593Smuzhiyunfor i in $(seq 1 5); do
513*4882a593Smuzhiyun	test_batched_request_firmware_into_buf $i both
514*4882a593Smuzhiyundone
515*4882a593Smuzhiyun
516*4882a593Smuzhiyunfor i in $(seq 1 5); do
517*4882a593Smuzhiyun	test_batched_request_firmware_direct $i both
518*4882a593Smuzhiyundone
519*4882a593Smuzhiyun
520*4882a593Smuzhiyunfor i in $(seq 1 5); do
521*4882a593Smuzhiyun	test_request_firmware_nowait_uevent $i both
522*4882a593Smuzhiyundone
523*4882a593Smuzhiyun
524*4882a593Smuzhiyunfor i in $(seq 1 5); do
525*4882a593Smuzhiyun	test_request_firmware_nowait_custom $i both
526*4882a593Smuzhiyundone
527*4882a593Smuzhiyun
528*4882a593Smuzhiyun# test with only xz file present
529*4882a593Smuzhiyunmv "$FW" "${FW}-orig"
530*4882a593Smuzhiyunecho
531*4882a593Smuzhiyunecho "Testing with only xz file present..."
532*4882a593Smuzhiyunfor i in $(seq 1 5); do
533*4882a593Smuzhiyun	test_batched_request_firmware $i xzonly
534*4882a593Smuzhiyundone
535*4882a593Smuzhiyun
536*4882a593Smuzhiyunfor i in $(seq 1 5); do
537*4882a593Smuzhiyun	test_batched_request_firmware_into_buf $i xzonly
538*4882a593Smuzhiyundone
539*4882a593Smuzhiyun
540*4882a593Smuzhiyunfor i in $(seq 1 5); do
541*4882a593Smuzhiyun	test_batched_request_firmware_direct $i xzonly
542*4882a593Smuzhiyundone
543*4882a593Smuzhiyun
544*4882a593Smuzhiyunfor i in $(seq 1 5); do
545*4882a593Smuzhiyun	test_request_firmware_nowait_uevent $i xzonly
546*4882a593Smuzhiyundone
547*4882a593Smuzhiyun
548*4882a593Smuzhiyunfor i in $(seq 1 5); do
549*4882a593Smuzhiyun	test_request_firmware_nowait_custom $i xzonly
550*4882a593Smuzhiyundone
551*4882a593Smuzhiyun
552*4882a593Smuzhiyunexit 0
553