18c2ecf20Sopenharmony_ci#!/bin/bash
28c2ecf20Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0
38c2ecf20Sopenharmony_ci# This validates that the kernel will load firmware out of its list of
48c2ecf20Sopenharmony_ci# firmware locations on disk. Since the user helper does similar work,
58c2ecf20Sopenharmony_ci# we reset the custom load directory to a location the user helper doesn't
68c2ecf20Sopenharmony_ci# know so we can be sure we're not accidentally testing the user helper.
78c2ecf20Sopenharmony_ciset -e
88c2ecf20Sopenharmony_ci
98c2ecf20Sopenharmony_ciTEST_REQS_FW_SYSFS_FALLBACK="no"
108c2ecf20Sopenharmony_ciTEST_REQS_FW_SET_CUSTOM_PATH="yes"
118c2ecf20Sopenharmony_ciTEST_DIR=$(dirname $0)
128c2ecf20Sopenharmony_cisource $TEST_DIR/fw_lib.sh
138c2ecf20Sopenharmony_ci
148c2ecf20Sopenharmony_cicheck_mods
158c2ecf20Sopenharmony_cicheck_setup
168c2ecf20Sopenharmony_civerify_reqs
178c2ecf20Sopenharmony_cisetup_tmp_file
188c2ecf20Sopenharmony_ci
198c2ecf20Sopenharmony_citrap "test_finish" EXIT
208c2ecf20Sopenharmony_ci
218c2ecf20Sopenharmony_ciif [ "$HAS_FW_LOADER_USER_HELPER" = "yes" ]; then
228c2ecf20Sopenharmony_ci	# Turn down the timeout so failures don't take so long.
238c2ecf20Sopenharmony_ci	echo 1 >/sys/class/firmware/timeout
248c2ecf20Sopenharmony_cifi
258c2ecf20Sopenharmony_ci
268c2ecf20Sopenharmony_ciif printf '\000' >"$DIR"/trigger_request 2> /dev/null; then
278c2ecf20Sopenharmony_ci	echo "$0: empty filename should not succeed" >&2
288c2ecf20Sopenharmony_ci	exit 1
298c2ecf20Sopenharmony_cifi
308c2ecf20Sopenharmony_ci
318c2ecf20Sopenharmony_ciif [ ! -e "$DIR"/trigger_async_request ]; then
328c2ecf20Sopenharmony_ci	echo "$0: empty filename: async trigger not present, ignoring test" >&2
338c2ecf20Sopenharmony_ci	exit $ksft_skip
348c2ecf20Sopenharmony_cielse
358c2ecf20Sopenharmony_ci	if printf '\000' >"$DIR"/trigger_async_request 2> /dev/null; then
368c2ecf20Sopenharmony_ci		echo "$0: empty filename should not succeed (async)" >&2
378c2ecf20Sopenharmony_ci		exit 1
388c2ecf20Sopenharmony_ci	fi
398c2ecf20Sopenharmony_cifi
408c2ecf20Sopenharmony_ci
418c2ecf20Sopenharmony_ci# Request a firmware that doesn't exist, it should fail.
428c2ecf20Sopenharmony_ciif echo -n "nope-$NAME" >"$DIR"/trigger_request 2> /dev/null; then
438c2ecf20Sopenharmony_ci	echo "$0: firmware shouldn't have loaded" >&2
448c2ecf20Sopenharmony_ci	exit 1
458c2ecf20Sopenharmony_cifi
468c2ecf20Sopenharmony_ciif diff -q "$FW" /dev/test_firmware >/dev/null ; then
478c2ecf20Sopenharmony_ci	echo "$0: firmware was not expected to match" >&2
488c2ecf20Sopenharmony_ci	exit 1
498c2ecf20Sopenharmony_cielse
508c2ecf20Sopenharmony_ci	if [ "$HAS_FW_LOADER_USER_HELPER" = "yes" ]; then
518c2ecf20Sopenharmony_ci		echo "$0: timeout works"
528c2ecf20Sopenharmony_ci	fi
538c2ecf20Sopenharmony_cifi
548c2ecf20Sopenharmony_ci
558c2ecf20Sopenharmony_ci# This should succeed via kernel load or will fail after 1 second after
568c2ecf20Sopenharmony_ci# being handed over to the user helper, which won't find the fw either.
578c2ecf20Sopenharmony_ciif ! echo -n "$NAME" >"$DIR"/trigger_request ; then
588c2ecf20Sopenharmony_ci	echo "$0: could not trigger request" >&2
598c2ecf20Sopenharmony_ci	exit 1
608c2ecf20Sopenharmony_cifi
618c2ecf20Sopenharmony_ci
628c2ecf20Sopenharmony_ci# Verify the contents are what we expect.
638c2ecf20Sopenharmony_ciif ! diff -q "$FW" /dev/test_firmware >/dev/null ; then
648c2ecf20Sopenharmony_ci	echo "$0: firmware was not loaded" >&2
658c2ecf20Sopenharmony_ci	exit 1
668c2ecf20Sopenharmony_cielse
678c2ecf20Sopenharmony_ci	echo "$0: filesystem loading works"
688c2ecf20Sopenharmony_cifi
698c2ecf20Sopenharmony_ci
708c2ecf20Sopenharmony_ci# Try the asynchronous version too
718c2ecf20Sopenharmony_ciif [ ! -e "$DIR"/trigger_async_request ]; then
728c2ecf20Sopenharmony_ci	echo "$0: firmware loading: async trigger not present, ignoring test" >&2
738c2ecf20Sopenharmony_ci	exit $ksft_skip
748c2ecf20Sopenharmony_cielse
758c2ecf20Sopenharmony_ci	if ! echo -n "$NAME" >"$DIR"/trigger_async_request ; then
768c2ecf20Sopenharmony_ci		echo "$0: could not trigger async request" >&2
778c2ecf20Sopenharmony_ci		exit 1
788c2ecf20Sopenharmony_ci	fi
798c2ecf20Sopenharmony_ci
808c2ecf20Sopenharmony_ci	# Verify the contents are what we expect.
818c2ecf20Sopenharmony_ci	if ! diff -q "$FW" /dev/test_firmware >/dev/null ; then
828c2ecf20Sopenharmony_ci		echo "$0: firmware was not loaded (async)" >&2
838c2ecf20Sopenharmony_ci		exit 1
848c2ecf20Sopenharmony_ci	else
858c2ecf20Sopenharmony_ci		echo "$0: async filesystem loading works"
868c2ecf20Sopenharmony_ci	fi
878c2ecf20Sopenharmony_cifi
888c2ecf20Sopenharmony_ci
898c2ecf20Sopenharmony_ci# Try platform (EFI embedded fw) loading too
908c2ecf20Sopenharmony_ciif [ ! -e "$DIR"/trigger_request_platform ]; then
918c2ecf20Sopenharmony_ci	echo "$0: firmware loading: platform trigger not present, ignoring test" >&2
928c2ecf20Sopenharmony_cielse
938c2ecf20Sopenharmony_ci	if printf '\000' >"$DIR"/trigger_request_platform 2> /dev/null; then
948c2ecf20Sopenharmony_ci		echo "$0: empty filename should not succeed (platform)" >&2
958c2ecf20Sopenharmony_ci		exit 1
968c2ecf20Sopenharmony_ci	fi
978c2ecf20Sopenharmony_ci
988c2ecf20Sopenharmony_ci	# Note we echo a non-existing name, since files on the file-system
998c2ecf20Sopenharmony_ci	# are preferred over firmware embedded inside the platform's firmware
1008c2ecf20Sopenharmony_ci	# The test adds a fake entry with the requested name to the platform's
1018c2ecf20Sopenharmony_ci	# fw list, so the name does not matter as long as it does not exist
1028c2ecf20Sopenharmony_ci	if ! echo -n "nope-$NAME" >"$DIR"/trigger_request_platform ; then
1038c2ecf20Sopenharmony_ci		echo "$0: could not trigger request platform" >&2
1048c2ecf20Sopenharmony_ci		exit 1
1058c2ecf20Sopenharmony_ci	fi
1068c2ecf20Sopenharmony_ci
1078c2ecf20Sopenharmony_ci	# The test verifies itself that the loaded firmware contents matches
1088c2ecf20Sopenharmony_ci	# the contents for the fake platform fw entry it added.
1098c2ecf20Sopenharmony_ci	echo "$0: platform loading works"
1108c2ecf20Sopenharmony_cifi
1118c2ecf20Sopenharmony_ci
1128c2ecf20Sopenharmony_ci### Batched requests tests
1138c2ecf20Sopenharmony_citest_config_present()
1148c2ecf20Sopenharmony_ci{
1158c2ecf20Sopenharmony_ci	if [ ! -f $DIR/reset ]; then
1168c2ecf20Sopenharmony_ci		echo "Configuration triggers not present, ignoring test"
1178c2ecf20Sopenharmony_ci		exit $ksft_skip
1188c2ecf20Sopenharmony_ci	fi
1198c2ecf20Sopenharmony_ci}
1208c2ecf20Sopenharmony_ci
1218c2ecf20Sopenharmony_ci# Defaults :
1228c2ecf20Sopenharmony_ci#
1238c2ecf20Sopenharmony_ci# send_uevent: 1
1248c2ecf20Sopenharmony_ci# sync_direct: 0
1258c2ecf20Sopenharmony_ci# name: test-firmware.bin
1268c2ecf20Sopenharmony_ci# num_requests: 4
1278c2ecf20Sopenharmony_ciconfig_reset()
1288c2ecf20Sopenharmony_ci{
1298c2ecf20Sopenharmony_ci	echo 1 >  $DIR/reset
1308c2ecf20Sopenharmony_ci}
1318c2ecf20Sopenharmony_ci
1328c2ecf20Sopenharmony_cirelease_all_firmware()
1338c2ecf20Sopenharmony_ci{
1348c2ecf20Sopenharmony_ci	echo 1 >  $DIR/release_all_firmware
1358c2ecf20Sopenharmony_ci}
1368c2ecf20Sopenharmony_ci
1378c2ecf20Sopenharmony_ciconfig_set_name()
1388c2ecf20Sopenharmony_ci{
1398c2ecf20Sopenharmony_ci	echo -n $1 >  $DIR/config_name
1408c2ecf20Sopenharmony_ci}
1418c2ecf20Sopenharmony_ci
1428c2ecf20Sopenharmony_ciconfig_set_into_buf()
1438c2ecf20Sopenharmony_ci{
1448c2ecf20Sopenharmony_ci	echo 1 >  $DIR/config_into_buf
1458c2ecf20Sopenharmony_ci}
1468c2ecf20Sopenharmony_ci
1478c2ecf20Sopenharmony_ciconfig_unset_into_buf()
1488c2ecf20Sopenharmony_ci{
1498c2ecf20Sopenharmony_ci	echo 0 >  $DIR/config_into_buf
1508c2ecf20Sopenharmony_ci}
1518c2ecf20Sopenharmony_ci
1528c2ecf20Sopenharmony_ciconfig_set_buf_size()
1538c2ecf20Sopenharmony_ci{
1548c2ecf20Sopenharmony_ci	echo $1 >  $DIR/config_buf_size
1558c2ecf20Sopenharmony_ci}
1568c2ecf20Sopenharmony_ci
1578c2ecf20Sopenharmony_ciconfig_set_file_offset()
1588c2ecf20Sopenharmony_ci{
1598c2ecf20Sopenharmony_ci	echo $1 >  $DIR/config_file_offset
1608c2ecf20Sopenharmony_ci}
1618c2ecf20Sopenharmony_ci
1628c2ecf20Sopenharmony_ciconfig_set_partial()
1638c2ecf20Sopenharmony_ci{
1648c2ecf20Sopenharmony_ci	echo 1 >  $DIR/config_partial
1658c2ecf20Sopenharmony_ci}
1668c2ecf20Sopenharmony_ci
1678c2ecf20Sopenharmony_ciconfig_unset_partial()
1688c2ecf20Sopenharmony_ci{
1698c2ecf20Sopenharmony_ci	echo 0 >  $DIR/config_partial
1708c2ecf20Sopenharmony_ci}
1718c2ecf20Sopenharmony_ci
1728c2ecf20Sopenharmony_ciconfig_set_sync_direct()
1738c2ecf20Sopenharmony_ci{
1748c2ecf20Sopenharmony_ci	echo 1 >  $DIR/config_sync_direct
1758c2ecf20Sopenharmony_ci}
1768c2ecf20Sopenharmony_ci
1778c2ecf20Sopenharmony_ciconfig_unset_sync_direct()
1788c2ecf20Sopenharmony_ci{
1798c2ecf20Sopenharmony_ci	echo 0 >  $DIR/config_sync_direct
1808c2ecf20Sopenharmony_ci}
1818c2ecf20Sopenharmony_ci
1828c2ecf20Sopenharmony_ciconfig_set_uevent()
1838c2ecf20Sopenharmony_ci{
1848c2ecf20Sopenharmony_ci	echo 1 >  $DIR/config_send_uevent
1858c2ecf20Sopenharmony_ci}
1868c2ecf20Sopenharmony_ci
1878c2ecf20Sopenharmony_ciconfig_unset_uevent()
1888c2ecf20Sopenharmony_ci{
1898c2ecf20Sopenharmony_ci	echo 0 >  $DIR/config_send_uevent
1908c2ecf20Sopenharmony_ci}
1918c2ecf20Sopenharmony_ci
1928c2ecf20Sopenharmony_ciconfig_trigger_sync()
1938c2ecf20Sopenharmony_ci{
1948c2ecf20Sopenharmony_ci	echo -n 1 > $DIR/trigger_batched_requests 2>/dev/null
1958c2ecf20Sopenharmony_ci}
1968c2ecf20Sopenharmony_ci
1978c2ecf20Sopenharmony_ciconfig_trigger_async()
1988c2ecf20Sopenharmony_ci{
1998c2ecf20Sopenharmony_ci	echo -n 1 > $DIR/trigger_batched_requests_async 2> /dev/null
2008c2ecf20Sopenharmony_ci}
2018c2ecf20Sopenharmony_ci
2028c2ecf20Sopenharmony_ciconfig_set_read_fw_idx()
2038c2ecf20Sopenharmony_ci{
2048c2ecf20Sopenharmony_ci	echo -n $1 > $DIR/config_read_fw_idx 2> /dev/null
2058c2ecf20Sopenharmony_ci}
2068c2ecf20Sopenharmony_ci
2078c2ecf20Sopenharmony_ciread_firmwares()
2088c2ecf20Sopenharmony_ci{
2098c2ecf20Sopenharmony_ci	if [ "$(cat $DIR/config_into_buf)" == "1" ]; then
2108c2ecf20Sopenharmony_ci		fwfile="$FW_INTO_BUF"
2118c2ecf20Sopenharmony_ci	else
2128c2ecf20Sopenharmony_ci		fwfile="$FW"
2138c2ecf20Sopenharmony_ci	fi
2148c2ecf20Sopenharmony_ci	if [ "$1" = "xzonly" ]; then
2158c2ecf20Sopenharmony_ci		fwfile="${fwfile}-orig"
2168c2ecf20Sopenharmony_ci	fi
2178c2ecf20Sopenharmony_ci	for i in $(seq 0 3); do
2188c2ecf20Sopenharmony_ci		config_set_read_fw_idx $i
2198c2ecf20Sopenharmony_ci		# Verify the contents are what we expect.
2208c2ecf20Sopenharmony_ci		# -Z required for now -- check for yourself, md5sum
2218c2ecf20Sopenharmony_ci		# on $FW and DIR/read_firmware will yield the same. Even
2228c2ecf20Sopenharmony_ci		# cmp agrees, so something is off.
2238c2ecf20Sopenharmony_ci		if ! diff -q -Z "$fwfile" $DIR/read_firmware 2>/dev/null ; then
2248c2ecf20Sopenharmony_ci			echo "request #$i: firmware was not loaded" >&2
2258c2ecf20Sopenharmony_ci			exit 1
2268c2ecf20Sopenharmony_ci		fi
2278c2ecf20Sopenharmony_ci	done
2288c2ecf20Sopenharmony_ci}
2298c2ecf20Sopenharmony_ci
2308c2ecf20Sopenharmony_ciread_partial_firmwares()
2318c2ecf20Sopenharmony_ci{
2328c2ecf20Sopenharmony_ci	if [ "$(cat $DIR/config_into_buf)" == "1" ]; then
2338c2ecf20Sopenharmony_ci		fwfile="${FW_INTO_BUF}"
2348c2ecf20Sopenharmony_ci	else
2358c2ecf20Sopenharmony_ci		fwfile="${FW}"
2368c2ecf20Sopenharmony_ci	fi
2378c2ecf20Sopenharmony_ci
2388c2ecf20Sopenharmony_ci	if [ "$1" = "xzonly" ]; then
2398c2ecf20Sopenharmony_ci		fwfile="${fwfile}-orig"
2408c2ecf20Sopenharmony_ci	fi
2418c2ecf20Sopenharmony_ci
2428c2ecf20Sopenharmony_ci	# Strip fwfile down to match partial offset and length
2438c2ecf20Sopenharmony_ci	partial_data="$(cat $fwfile)"
2448c2ecf20Sopenharmony_ci	partial_data="${partial_data:$2:$3}"
2458c2ecf20Sopenharmony_ci
2468c2ecf20Sopenharmony_ci	for i in $(seq 0 3); do
2478c2ecf20Sopenharmony_ci		config_set_read_fw_idx $i
2488c2ecf20Sopenharmony_ci
2498c2ecf20Sopenharmony_ci		read_firmware="$(cat $DIR/read_firmware)"
2508c2ecf20Sopenharmony_ci
2518c2ecf20Sopenharmony_ci		# Verify the contents are what we expect.
2528c2ecf20Sopenharmony_ci		if [ $read_firmware != $partial_data ]; then
2538c2ecf20Sopenharmony_ci			echo "request #$i: partial firmware was not loaded" >&2
2548c2ecf20Sopenharmony_ci			exit 1
2558c2ecf20Sopenharmony_ci		fi
2568c2ecf20Sopenharmony_ci	done
2578c2ecf20Sopenharmony_ci}
2588c2ecf20Sopenharmony_ci
2598c2ecf20Sopenharmony_ciread_firmwares_expect_nofile()
2608c2ecf20Sopenharmony_ci{
2618c2ecf20Sopenharmony_ci	for i in $(seq 0 3); do
2628c2ecf20Sopenharmony_ci		config_set_read_fw_idx $i
2638c2ecf20Sopenharmony_ci		# Ensures contents differ
2648c2ecf20Sopenharmony_ci		if diff -q -Z "$FW" $DIR/read_firmware 2>/dev/null ; then
2658c2ecf20Sopenharmony_ci			echo "request $i: file was not expected to match" >&2
2668c2ecf20Sopenharmony_ci			exit 1
2678c2ecf20Sopenharmony_ci		fi
2688c2ecf20Sopenharmony_ci	done
2698c2ecf20Sopenharmony_ci}
2708c2ecf20Sopenharmony_ci
2718c2ecf20Sopenharmony_citest_batched_request_firmware_nofile()
2728c2ecf20Sopenharmony_ci{
2738c2ecf20Sopenharmony_ci	echo -n "Batched request_firmware() nofile try #$1: "
2748c2ecf20Sopenharmony_ci	config_reset
2758c2ecf20Sopenharmony_ci	config_set_name nope-test-firmware.bin
2768c2ecf20Sopenharmony_ci	config_trigger_sync
2778c2ecf20Sopenharmony_ci	read_firmwares_expect_nofile
2788c2ecf20Sopenharmony_ci	release_all_firmware
2798c2ecf20Sopenharmony_ci	echo "OK"
2808c2ecf20Sopenharmony_ci}
2818c2ecf20Sopenharmony_ci
2828c2ecf20Sopenharmony_citest_batched_request_firmware_into_buf_nofile()
2838c2ecf20Sopenharmony_ci{
2848c2ecf20Sopenharmony_ci	echo -n "Batched request_firmware_into_buf() nofile try #$1: "
2858c2ecf20Sopenharmony_ci	config_reset
2868c2ecf20Sopenharmony_ci	config_set_name nope-test-firmware.bin
2878c2ecf20Sopenharmony_ci	config_set_into_buf
2888c2ecf20Sopenharmony_ci	config_trigger_sync
2898c2ecf20Sopenharmony_ci	read_firmwares_expect_nofile
2908c2ecf20Sopenharmony_ci	release_all_firmware
2918c2ecf20Sopenharmony_ci	echo "OK"
2928c2ecf20Sopenharmony_ci}
2938c2ecf20Sopenharmony_ci
2948c2ecf20Sopenharmony_citest_request_partial_firmware_into_buf_nofile()
2958c2ecf20Sopenharmony_ci{
2968c2ecf20Sopenharmony_ci	echo -n "Test request_partial_firmware_into_buf() off=$1 size=$2 nofile: "
2978c2ecf20Sopenharmony_ci	config_reset
2988c2ecf20Sopenharmony_ci	config_set_name nope-test-firmware.bin
2998c2ecf20Sopenharmony_ci	config_set_into_buf
3008c2ecf20Sopenharmony_ci	config_set_partial
3018c2ecf20Sopenharmony_ci	config_set_buf_size $2
3028c2ecf20Sopenharmony_ci	config_set_file_offset $1
3038c2ecf20Sopenharmony_ci	config_trigger_sync
3048c2ecf20Sopenharmony_ci	read_firmwares_expect_nofile
3058c2ecf20Sopenharmony_ci	release_all_firmware
3068c2ecf20Sopenharmony_ci	echo "OK"
3078c2ecf20Sopenharmony_ci}
3088c2ecf20Sopenharmony_ci
3098c2ecf20Sopenharmony_citest_batched_request_firmware_direct_nofile()
3108c2ecf20Sopenharmony_ci{
3118c2ecf20Sopenharmony_ci	echo -n "Batched request_firmware_direct() nofile try #$1: "
3128c2ecf20Sopenharmony_ci	config_reset
3138c2ecf20Sopenharmony_ci	config_set_name nope-test-firmware.bin
3148c2ecf20Sopenharmony_ci	config_set_sync_direct
3158c2ecf20Sopenharmony_ci	config_trigger_sync
3168c2ecf20Sopenharmony_ci	release_all_firmware
3178c2ecf20Sopenharmony_ci	echo "OK"
3188c2ecf20Sopenharmony_ci}
3198c2ecf20Sopenharmony_ci
3208c2ecf20Sopenharmony_citest_request_firmware_nowait_uevent_nofile()
3218c2ecf20Sopenharmony_ci{
3228c2ecf20Sopenharmony_ci	echo -n "Batched request_firmware_nowait(uevent=true) nofile try #$1: "
3238c2ecf20Sopenharmony_ci	config_reset
3248c2ecf20Sopenharmony_ci	config_set_name nope-test-firmware.bin
3258c2ecf20Sopenharmony_ci	config_trigger_async
3268c2ecf20Sopenharmony_ci	release_all_firmware
3278c2ecf20Sopenharmony_ci	echo "OK"
3288c2ecf20Sopenharmony_ci}
3298c2ecf20Sopenharmony_ci
3308c2ecf20Sopenharmony_citest_wait_and_cancel_custom_load()
3318c2ecf20Sopenharmony_ci{
3328c2ecf20Sopenharmony_ci	if [ "$HAS_FW_LOADER_USER_HELPER" != "yes" ]; then
3338c2ecf20Sopenharmony_ci		return
3348c2ecf20Sopenharmony_ci	fi
3358c2ecf20Sopenharmony_ci	local timeout=10
3368c2ecf20Sopenharmony_ci	name=$1
3378c2ecf20Sopenharmony_ci	while [ ! -e "$DIR"/"$name"/loading ]; do
3388c2ecf20Sopenharmony_ci		sleep 0.1
3398c2ecf20Sopenharmony_ci		timeout=$(( $timeout - 1 ))
3408c2ecf20Sopenharmony_ci		if [ "$timeout" -eq 0 ]; then
3418c2ecf20Sopenharmony_ci			echo "firmware interface never appeared:" >&2
3428c2ecf20Sopenharmony_ci			echo "$DIR/$name/loading" >&2
3438c2ecf20Sopenharmony_ci			exit 1
3448c2ecf20Sopenharmony_ci		fi
3458c2ecf20Sopenharmony_ci	done
3468c2ecf20Sopenharmony_ci	echo -1 >"$DIR"/"$name"/loading
3478c2ecf20Sopenharmony_ci}
3488c2ecf20Sopenharmony_ci
3498c2ecf20Sopenharmony_citest_request_firmware_nowait_custom_nofile()
3508c2ecf20Sopenharmony_ci{
3518c2ecf20Sopenharmony_ci	echo -n "Batched request_firmware_nowait(uevent=false) nofile try #$1: "
3528c2ecf20Sopenharmony_ci	config_reset
3538c2ecf20Sopenharmony_ci	config_unset_uevent
3548c2ecf20Sopenharmony_ci	RANDOM_FILE_PATH=$(setup_random_file_fake)
3558c2ecf20Sopenharmony_ci	RANDOM_FILE="$(basename $RANDOM_FILE_PATH)"
3568c2ecf20Sopenharmony_ci	config_set_name $RANDOM_FILE
3578c2ecf20Sopenharmony_ci	config_trigger_async &
3588c2ecf20Sopenharmony_ci	test_wait_and_cancel_custom_load $RANDOM_FILE
3598c2ecf20Sopenharmony_ci	wait
3608c2ecf20Sopenharmony_ci	release_all_firmware
3618c2ecf20Sopenharmony_ci	echo "OK"
3628c2ecf20Sopenharmony_ci}
3638c2ecf20Sopenharmony_ci
3648c2ecf20Sopenharmony_citest_batched_request_firmware()
3658c2ecf20Sopenharmony_ci{
3668c2ecf20Sopenharmony_ci	echo -n "Batched request_firmware() $2 try #$1: "
3678c2ecf20Sopenharmony_ci	config_reset
3688c2ecf20Sopenharmony_ci	config_trigger_sync
3698c2ecf20Sopenharmony_ci	read_firmwares $2
3708c2ecf20Sopenharmony_ci	release_all_firmware
3718c2ecf20Sopenharmony_ci	echo "OK"
3728c2ecf20Sopenharmony_ci}
3738c2ecf20Sopenharmony_ci
3748c2ecf20Sopenharmony_citest_batched_request_firmware_into_buf()
3758c2ecf20Sopenharmony_ci{
3768c2ecf20Sopenharmony_ci	echo -n "Batched request_firmware_into_buf() $2 try #$1: "
3778c2ecf20Sopenharmony_ci	config_reset
3788c2ecf20Sopenharmony_ci	config_set_name $TEST_FIRMWARE_INTO_BUF_FILENAME
3798c2ecf20Sopenharmony_ci	config_set_into_buf
3808c2ecf20Sopenharmony_ci	config_trigger_sync
3818c2ecf20Sopenharmony_ci	read_firmwares $2
3828c2ecf20Sopenharmony_ci	release_all_firmware
3838c2ecf20Sopenharmony_ci	echo "OK"
3848c2ecf20Sopenharmony_ci}
3858c2ecf20Sopenharmony_ci
3868c2ecf20Sopenharmony_citest_batched_request_firmware_direct()
3878c2ecf20Sopenharmony_ci{
3888c2ecf20Sopenharmony_ci	echo -n "Batched request_firmware_direct() $2 try #$1: "
3898c2ecf20Sopenharmony_ci	config_reset
3908c2ecf20Sopenharmony_ci	config_set_sync_direct
3918c2ecf20Sopenharmony_ci	config_trigger_sync
3928c2ecf20Sopenharmony_ci	release_all_firmware
3938c2ecf20Sopenharmony_ci	echo "OK"
3948c2ecf20Sopenharmony_ci}
3958c2ecf20Sopenharmony_ci
3968c2ecf20Sopenharmony_citest_request_firmware_nowait_uevent()
3978c2ecf20Sopenharmony_ci{
3988c2ecf20Sopenharmony_ci	echo -n "Batched request_firmware_nowait(uevent=true) $2 try #$1: "
3998c2ecf20Sopenharmony_ci	config_reset
4008c2ecf20Sopenharmony_ci	config_trigger_async
4018c2ecf20Sopenharmony_ci	release_all_firmware
4028c2ecf20Sopenharmony_ci	echo "OK"
4038c2ecf20Sopenharmony_ci}
4048c2ecf20Sopenharmony_ci
4058c2ecf20Sopenharmony_citest_request_firmware_nowait_custom()
4068c2ecf20Sopenharmony_ci{
4078c2ecf20Sopenharmony_ci	echo -n "Batched request_firmware_nowait(uevent=false) $2 try #$1: "
4088c2ecf20Sopenharmony_ci	config_reset
4098c2ecf20Sopenharmony_ci	config_unset_uevent
4108c2ecf20Sopenharmony_ci	RANDOM_FILE_PATH=$(setup_random_file)
4118c2ecf20Sopenharmony_ci	RANDOM_FILE="$(basename $RANDOM_FILE_PATH)"
4128c2ecf20Sopenharmony_ci	if [ "$2" = "both" ]; then
4138c2ecf20Sopenharmony_ci		xz -9 -C crc32 -k $RANDOM_FILE_PATH
4148c2ecf20Sopenharmony_ci	elif [ "$2" = "xzonly" ]; then
4158c2ecf20Sopenharmony_ci		xz -9 -C crc32 $RANDOM_FILE_PATH
4168c2ecf20Sopenharmony_ci	fi
4178c2ecf20Sopenharmony_ci	config_set_name $RANDOM_FILE
4188c2ecf20Sopenharmony_ci	config_trigger_async
4198c2ecf20Sopenharmony_ci	release_all_firmware
4208c2ecf20Sopenharmony_ci	echo "OK"
4218c2ecf20Sopenharmony_ci}
4228c2ecf20Sopenharmony_ci
4238c2ecf20Sopenharmony_citest_request_partial_firmware_into_buf()
4248c2ecf20Sopenharmony_ci{
4258c2ecf20Sopenharmony_ci	echo -n "Test request_partial_firmware_into_buf() off=$1 size=$2: "
4268c2ecf20Sopenharmony_ci	config_reset
4278c2ecf20Sopenharmony_ci	config_set_name $TEST_FIRMWARE_INTO_BUF_FILENAME
4288c2ecf20Sopenharmony_ci	config_set_into_buf
4298c2ecf20Sopenharmony_ci	config_set_partial
4308c2ecf20Sopenharmony_ci	config_set_buf_size $2
4318c2ecf20Sopenharmony_ci	config_set_file_offset $1
4328c2ecf20Sopenharmony_ci	config_trigger_sync
4338c2ecf20Sopenharmony_ci	read_partial_firmwares normal $1 $2
4348c2ecf20Sopenharmony_ci	release_all_firmware
4358c2ecf20Sopenharmony_ci	echo "OK"
4368c2ecf20Sopenharmony_ci}
4378c2ecf20Sopenharmony_ci
4388c2ecf20Sopenharmony_ci# Only continue if batched request triggers are present on the
4398c2ecf20Sopenharmony_ci# test-firmware driver
4408c2ecf20Sopenharmony_citest_config_present
4418c2ecf20Sopenharmony_ci
4428c2ecf20Sopenharmony_ci# test with the file present
4438c2ecf20Sopenharmony_ciecho
4448c2ecf20Sopenharmony_ciecho "Testing with the file present..."
4458c2ecf20Sopenharmony_cifor i in $(seq 1 5); do
4468c2ecf20Sopenharmony_ci	test_batched_request_firmware $i normal
4478c2ecf20Sopenharmony_cidone
4488c2ecf20Sopenharmony_ci
4498c2ecf20Sopenharmony_cifor i in $(seq 1 5); do
4508c2ecf20Sopenharmony_ci	test_batched_request_firmware_into_buf $i normal
4518c2ecf20Sopenharmony_cidone
4528c2ecf20Sopenharmony_ci
4538c2ecf20Sopenharmony_cifor i in $(seq 1 5); do
4548c2ecf20Sopenharmony_ci	test_batched_request_firmware_direct $i normal
4558c2ecf20Sopenharmony_cidone
4568c2ecf20Sopenharmony_ci
4578c2ecf20Sopenharmony_cifor i in $(seq 1 5); do
4588c2ecf20Sopenharmony_ci	test_request_firmware_nowait_uevent $i normal
4598c2ecf20Sopenharmony_cidone
4608c2ecf20Sopenharmony_ci
4618c2ecf20Sopenharmony_cifor i in $(seq 1 5); do
4628c2ecf20Sopenharmony_ci	test_request_firmware_nowait_custom $i normal
4638c2ecf20Sopenharmony_cidone
4648c2ecf20Sopenharmony_ci
4658c2ecf20Sopenharmony_ci# Partial loads cannot use fallback, so do not repeat tests.
4668c2ecf20Sopenharmony_citest_request_partial_firmware_into_buf 0 10
4678c2ecf20Sopenharmony_citest_request_partial_firmware_into_buf 0 5
4688c2ecf20Sopenharmony_citest_request_partial_firmware_into_buf 1 6
4698c2ecf20Sopenharmony_citest_request_partial_firmware_into_buf 2 10
4708c2ecf20Sopenharmony_ci
4718c2ecf20Sopenharmony_ci# Test for file not found, errors are expected, the failure would be
4728c2ecf20Sopenharmony_ci# a hung task, which would require a hard reset.
4738c2ecf20Sopenharmony_ciecho
4748c2ecf20Sopenharmony_ciecho "Testing with the file missing..."
4758c2ecf20Sopenharmony_cifor i in $(seq 1 5); do
4768c2ecf20Sopenharmony_ci	test_batched_request_firmware_nofile $i
4778c2ecf20Sopenharmony_cidone
4788c2ecf20Sopenharmony_ci
4798c2ecf20Sopenharmony_cifor i in $(seq 1 5); do
4808c2ecf20Sopenharmony_ci	test_batched_request_firmware_into_buf_nofile $i
4818c2ecf20Sopenharmony_cidone
4828c2ecf20Sopenharmony_ci
4838c2ecf20Sopenharmony_cifor i in $(seq 1 5); do
4848c2ecf20Sopenharmony_ci	test_batched_request_firmware_direct_nofile $i
4858c2ecf20Sopenharmony_cidone
4868c2ecf20Sopenharmony_ci
4878c2ecf20Sopenharmony_cifor i in $(seq 1 5); do
4888c2ecf20Sopenharmony_ci	test_request_firmware_nowait_uevent_nofile $i
4898c2ecf20Sopenharmony_cidone
4908c2ecf20Sopenharmony_ci
4918c2ecf20Sopenharmony_cifor i in $(seq 1 5); do
4928c2ecf20Sopenharmony_ci	test_request_firmware_nowait_custom_nofile $i
4938c2ecf20Sopenharmony_cidone
4948c2ecf20Sopenharmony_ci
4958c2ecf20Sopenharmony_ci# Partial loads cannot use fallback, so do not repeat tests.
4968c2ecf20Sopenharmony_citest_request_partial_firmware_into_buf_nofile 0 10
4978c2ecf20Sopenharmony_citest_request_partial_firmware_into_buf_nofile 0 5
4988c2ecf20Sopenharmony_citest_request_partial_firmware_into_buf_nofile 1 6
4998c2ecf20Sopenharmony_citest_request_partial_firmware_into_buf_nofile 2 10
5008c2ecf20Sopenharmony_ci
5018c2ecf20Sopenharmony_citest "$HAS_FW_LOADER_COMPRESS" != "yes" && exit 0
5028c2ecf20Sopenharmony_ci
5038c2ecf20Sopenharmony_ci# test with both files present
5048c2ecf20Sopenharmony_cixz -9 -C crc32 -k $FW
5058c2ecf20Sopenharmony_ciconfig_set_name $NAME
5068c2ecf20Sopenharmony_ciecho
5078c2ecf20Sopenharmony_ciecho "Testing with both plain and xz files present..."
5088c2ecf20Sopenharmony_cifor i in $(seq 1 5); do
5098c2ecf20Sopenharmony_ci	test_batched_request_firmware $i both
5108c2ecf20Sopenharmony_cidone
5118c2ecf20Sopenharmony_ci
5128c2ecf20Sopenharmony_cifor i in $(seq 1 5); do
5138c2ecf20Sopenharmony_ci	test_batched_request_firmware_into_buf $i both
5148c2ecf20Sopenharmony_cidone
5158c2ecf20Sopenharmony_ci
5168c2ecf20Sopenharmony_cifor i in $(seq 1 5); do
5178c2ecf20Sopenharmony_ci	test_batched_request_firmware_direct $i both
5188c2ecf20Sopenharmony_cidone
5198c2ecf20Sopenharmony_ci
5208c2ecf20Sopenharmony_cifor i in $(seq 1 5); do
5218c2ecf20Sopenharmony_ci	test_request_firmware_nowait_uevent $i both
5228c2ecf20Sopenharmony_cidone
5238c2ecf20Sopenharmony_ci
5248c2ecf20Sopenharmony_cifor i in $(seq 1 5); do
5258c2ecf20Sopenharmony_ci	test_request_firmware_nowait_custom $i both
5268c2ecf20Sopenharmony_cidone
5278c2ecf20Sopenharmony_ci
5288c2ecf20Sopenharmony_ci# test with only xz file present
5298c2ecf20Sopenharmony_cimv "$FW" "${FW}-orig"
5308c2ecf20Sopenharmony_ciecho
5318c2ecf20Sopenharmony_ciecho "Testing with only xz file present..."
5328c2ecf20Sopenharmony_cifor i in $(seq 1 5); do
5338c2ecf20Sopenharmony_ci	test_batched_request_firmware $i xzonly
5348c2ecf20Sopenharmony_cidone
5358c2ecf20Sopenharmony_ci
5368c2ecf20Sopenharmony_cifor i in $(seq 1 5); do
5378c2ecf20Sopenharmony_ci	test_batched_request_firmware_into_buf $i xzonly
5388c2ecf20Sopenharmony_cidone
5398c2ecf20Sopenharmony_ci
5408c2ecf20Sopenharmony_cifor i in $(seq 1 5); do
5418c2ecf20Sopenharmony_ci	test_batched_request_firmware_direct $i xzonly
5428c2ecf20Sopenharmony_cidone
5438c2ecf20Sopenharmony_ci
5448c2ecf20Sopenharmony_cifor i in $(seq 1 5); do
5458c2ecf20Sopenharmony_ci	test_request_firmware_nowait_uevent $i xzonly
5468c2ecf20Sopenharmony_cidone
5478c2ecf20Sopenharmony_ci
5488c2ecf20Sopenharmony_cifor i in $(seq 1 5); do
5498c2ecf20Sopenharmony_ci	test_request_firmware_nowait_custom $i xzonly
5508c2ecf20Sopenharmony_cidone
5518c2ecf20Sopenharmony_ci
5528c2ecf20Sopenharmony_ciexit 0
553