162306a36Sopenharmony_ci#!/bin/bash
262306a36Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0
362306a36Sopenharmony_ci# This validates that the kernel will load firmware out of its list of
462306a36Sopenharmony_ci# firmware locations on disk. Since the user helper does similar work,
562306a36Sopenharmony_ci# we reset the custom load directory to a location the user helper doesn't
662306a36Sopenharmony_ci# know so we can be sure we're not accidentally testing the user helper.
762306a36Sopenharmony_ciset -e
862306a36Sopenharmony_ci
962306a36Sopenharmony_ciTEST_REQS_FW_SYSFS_FALLBACK="no"
1062306a36Sopenharmony_ciTEST_REQS_FW_SET_CUSTOM_PATH="yes"
1162306a36Sopenharmony_ciTEST_DIR=$(dirname $0)
1262306a36Sopenharmony_cisource $TEST_DIR/fw_lib.sh
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ciRUN_XZ="xz -C crc32 --lzma2=dict=2MiB"
1562306a36Sopenharmony_ciRUN_ZSTD="zstd -q"
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_cicheck_mods
1862306a36Sopenharmony_cicheck_setup
1962306a36Sopenharmony_civerify_reqs
2062306a36Sopenharmony_cisetup_tmp_file
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_citrap "test_finish" EXIT
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ciif [ "$HAS_FW_LOADER_USER_HELPER" = "yes" ]; then
2562306a36Sopenharmony_ci	# Turn down the timeout so failures don't take so long.
2662306a36Sopenharmony_ci	echo 1 >/sys/class/firmware/timeout
2762306a36Sopenharmony_cifi
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ciif printf '\000' >"$DIR"/trigger_request 2> /dev/null; then
3062306a36Sopenharmony_ci	echo "$0: empty filename should not succeed" >&2
3162306a36Sopenharmony_ci	exit 1
3262306a36Sopenharmony_cifi
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ciif [ ! -e "$DIR"/trigger_async_request ]; then
3562306a36Sopenharmony_ci	echo "$0: empty filename: async trigger not present, ignoring test" >&2
3662306a36Sopenharmony_ci	exit $ksft_skip
3762306a36Sopenharmony_cielse
3862306a36Sopenharmony_ci	if printf '\000' >"$DIR"/trigger_async_request 2> /dev/null; then
3962306a36Sopenharmony_ci		echo "$0: empty filename should not succeed (async)" >&2
4062306a36Sopenharmony_ci		exit 1
4162306a36Sopenharmony_ci	fi
4262306a36Sopenharmony_cifi
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_ci# Request a firmware that doesn't exist, it should fail.
4562306a36Sopenharmony_ciif echo -n "nope-$NAME" >"$DIR"/trigger_request 2> /dev/null; then
4662306a36Sopenharmony_ci	echo "$0: firmware shouldn't have loaded" >&2
4762306a36Sopenharmony_ci	exit 1
4862306a36Sopenharmony_cifi
4962306a36Sopenharmony_ciif diff -q "$FW" /dev/test_firmware >/dev/null ; then
5062306a36Sopenharmony_ci	echo "$0: firmware was not expected to match" >&2
5162306a36Sopenharmony_ci	exit 1
5262306a36Sopenharmony_cielse
5362306a36Sopenharmony_ci	if [ "$HAS_FW_LOADER_USER_HELPER" = "yes" ]; then
5462306a36Sopenharmony_ci		echo "$0: timeout works"
5562306a36Sopenharmony_ci	fi
5662306a36Sopenharmony_cifi
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_ci# This should succeed via kernel load or will fail after 1 second after
5962306a36Sopenharmony_ci# being handed over to the user helper, which won't find the fw either.
6062306a36Sopenharmony_ciif ! echo -n "$NAME" >"$DIR"/trigger_request ; then
6162306a36Sopenharmony_ci	echo "$0: could not trigger request" >&2
6262306a36Sopenharmony_ci	exit 1
6362306a36Sopenharmony_cifi
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_ci# Verify the contents are what we expect.
6662306a36Sopenharmony_ciif ! diff -q "$FW" /dev/test_firmware >/dev/null ; then
6762306a36Sopenharmony_ci	echo "$0: firmware was not loaded" >&2
6862306a36Sopenharmony_ci	exit 1
6962306a36Sopenharmony_cielse
7062306a36Sopenharmony_ci	echo "$0: filesystem loading works"
7162306a36Sopenharmony_cifi
7262306a36Sopenharmony_ci
7362306a36Sopenharmony_ci# Try the asynchronous version too
7462306a36Sopenharmony_ciif [ ! -e "$DIR"/trigger_async_request ]; then
7562306a36Sopenharmony_ci	echo "$0: firmware loading: async trigger not present, ignoring test" >&2
7662306a36Sopenharmony_ci	exit $ksft_skip
7762306a36Sopenharmony_cielse
7862306a36Sopenharmony_ci	if ! echo -n "$NAME" >"$DIR"/trigger_async_request ; then
7962306a36Sopenharmony_ci		echo "$0: could not trigger async request" >&2
8062306a36Sopenharmony_ci		exit 1
8162306a36Sopenharmony_ci	fi
8262306a36Sopenharmony_ci
8362306a36Sopenharmony_ci	# Verify the contents are what we expect.
8462306a36Sopenharmony_ci	if ! diff -q "$FW" /dev/test_firmware >/dev/null ; then
8562306a36Sopenharmony_ci		echo "$0: firmware was not loaded (async)" >&2
8662306a36Sopenharmony_ci		exit 1
8762306a36Sopenharmony_ci	else
8862306a36Sopenharmony_ci		echo "$0: async filesystem loading works"
8962306a36Sopenharmony_ci	fi
9062306a36Sopenharmony_cifi
9162306a36Sopenharmony_ci
9262306a36Sopenharmony_ci# Try platform (EFI embedded fw) loading too
9362306a36Sopenharmony_ciif [ ! -e "$DIR"/trigger_request_platform ]; then
9462306a36Sopenharmony_ci	echo "$0: firmware loading: platform trigger not present, ignoring test" >&2
9562306a36Sopenharmony_cielse
9662306a36Sopenharmony_ci	if printf '\000' >"$DIR"/trigger_request_platform 2> /dev/null; then
9762306a36Sopenharmony_ci		echo "$0: empty filename should not succeed (platform)" >&2
9862306a36Sopenharmony_ci		exit 1
9962306a36Sopenharmony_ci	fi
10062306a36Sopenharmony_ci
10162306a36Sopenharmony_ci	# Note we echo a non-existing name, since files on the file-system
10262306a36Sopenharmony_ci	# are preferred over firmware embedded inside the platform's firmware
10362306a36Sopenharmony_ci	# The test adds a fake entry with the requested name to the platform's
10462306a36Sopenharmony_ci	# fw list, so the name does not matter as long as it does not exist
10562306a36Sopenharmony_ci	if ! echo -n "nope-$NAME" >"$DIR"/trigger_request_platform ; then
10662306a36Sopenharmony_ci		echo "$0: could not trigger request platform" >&2
10762306a36Sopenharmony_ci		exit 1
10862306a36Sopenharmony_ci	fi
10962306a36Sopenharmony_ci
11062306a36Sopenharmony_ci	# The test verifies itself that the loaded firmware contents matches
11162306a36Sopenharmony_ci	# the contents for the fake platform fw entry it added.
11262306a36Sopenharmony_ci	echo "$0: platform loading works"
11362306a36Sopenharmony_cifi
11462306a36Sopenharmony_ci
11562306a36Sopenharmony_ci### Batched requests tests
11662306a36Sopenharmony_citest_config_present()
11762306a36Sopenharmony_ci{
11862306a36Sopenharmony_ci	if [ ! -f $DIR/reset ]; then
11962306a36Sopenharmony_ci		echo "Configuration triggers not present, ignoring test"
12062306a36Sopenharmony_ci		exit $ksft_skip
12162306a36Sopenharmony_ci	fi
12262306a36Sopenharmony_ci}
12362306a36Sopenharmony_ci
12462306a36Sopenharmony_ci# Defaults :
12562306a36Sopenharmony_ci#
12662306a36Sopenharmony_ci# send_uevent: 1
12762306a36Sopenharmony_ci# sync_direct: 0
12862306a36Sopenharmony_ci# name: test-firmware.bin
12962306a36Sopenharmony_ci# num_requests: 4
13062306a36Sopenharmony_ciconfig_reset()
13162306a36Sopenharmony_ci{
13262306a36Sopenharmony_ci	echo 1 >  $DIR/reset
13362306a36Sopenharmony_ci}
13462306a36Sopenharmony_ci
13562306a36Sopenharmony_cirelease_all_firmware()
13662306a36Sopenharmony_ci{
13762306a36Sopenharmony_ci	echo 1 >  $DIR/release_all_firmware
13862306a36Sopenharmony_ci}
13962306a36Sopenharmony_ci
14062306a36Sopenharmony_ciconfig_set_name()
14162306a36Sopenharmony_ci{
14262306a36Sopenharmony_ci	echo -n $1 >  $DIR/config_name
14362306a36Sopenharmony_ci}
14462306a36Sopenharmony_ci
14562306a36Sopenharmony_ciconfig_set_into_buf()
14662306a36Sopenharmony_ci{
14762306a36Sopenharmony_ci	echo 1 >  $DIR/config_into_buf
14862306a36Sopenharmony_ci}
14962306a36Sopenharmony_ci
15062306a36Sopenharmony_ciconfig_unset_into_buf()
15162306a36Sopenharmony_ci{
15262306a36Sopenharmony_ci	echo 0 >  $DIR/config_into_buf
15362306a36Sopenharmony_ci}
15462306a36Sopenharmony_ci
15562306a36Sopenharmony_ciconfig_set_buf_size()
15662306a36Sopenharmony_ci{
15762306a36Sopenharmony_ci	echo $1 >  $DIR/config_buf_size
15862306a36Sopenharmony_ci}
15962306a36Sopenharmony_ci
16062306a36Sopenharmony_ciconfig_set_file_offset()
16162306a36Sopenharmony_ci{
16262306a36Sopenharmony_ci	echo $1 >  $DIR/config_file_offset
16362306a36Sopenharmony_ci}
16462306a36Sopenharmony_ci
16562306a36Sopenharmony_ciconfig_set_partial()
16662306a36Sopenharmony_ci{
16762306a36Sopenharmony_ci	echo 1 >  $DIR/config_partial
16862306a36Sopenharmony_ci}
16962306a36Sopenharmony_ci
17062306a36Sopenharmony_ciconfig_unset_partial()
17162306a36Sopenharmony_ci{
17262306a36Sopenharmony_ci	echo 0 >  $DIR/config_partial
17362306a36Sopenharmony_ci}
17462306a36Sopenharmony_ci
17562306a36Sopenharmony_ciconfig_set_sync_direct()
17662306a36Sopenharmony_ci{
17762306a36Sopenharmony_ci	echo 1 >  $DIR/config_sync_direct
17862306a36Sopenharmony_ci}
17962306a36Sopenharmony_ci
18062306a36Sopenharmony_ciconfig_unset_sync_direct()
18162306a36Sopenharmony_ci{
18262306a36Sopenharmony_ci	echo 0 >  $DIR/config_sync_direct
18362306a36Sopenharmony_ci}
18462306a36Sopenharmony_ci
18562306a36Sopenharmony_ciconfig_set_uevent()
18662306a36Sopenharmony_ci{
18762306a36Sopenharmony_ci	echo 1 >  $DIR/config_send_uevent
18862306a36Sopenharmony_ci}
18962306a36Sopenharmony_ci
19062306a36Sopenharmony_ciconfig_unset_uevent()
19162306a36Sopenharmony_ci{
19262306a36Sopenharmony_ci	echo 0 >  $DIR/config_send_uevent
19362306a36Sopenharmony_ci}
19462306a36Sopenharmony_ci
19562306a36Sopenharmony_ciconfig_trigger_sync()
19662306a36Sopenharmony_ci{
19762306a36Sopenharmony_ci	echo -n 1 > $DIR/trigger_batched_requests 2>/dev/null
19862306a36Sopenharmony_ci}
19962306a36Sopenharmony_ci
20062306a36Sopenharmony_ciconfig_trigger_async()
20162306a36Sopenharmony_ci{
20262306a36Sopenharmony_ci	echo -n 1 > $DIR/trigger_batched_requests_async 2> /dev/null
20362306a36Sopenharmony_ci}
20462306a36Sopenharmony_ci
20562306a36Sopenharmony_ciconfig_set_read_fw_idx()
20662306a36Sopenharmony_ci{
20762306a36Sopenharmony_ci	echo -n $1 > $DIR/config_read_fw_idx 2> /dev/null
20862306a36Sopenharmony_ci}
20962306a36Sopenharmony_ci
21062306a36Sopenharmony_ciread_firmwares()
21162306a36Sopenharmony_ci{
21262306a36Sopenharmony_ci	if [ "$(cat $DIR/config_into_buf)" == "1" ]; then
21362306a36Sopenharmony_ci		fwfile="$FW_INTO_BUF"
21462306a36Sopenharmony_ci	else
21562306a36Sopenharmony_ci		fwfile="$FW"
21662306a36Sopenharmony_ci	fi
21762306a36Sopenharmony_ci	if [ "$1" = "componly" ]; then
21862306a36Sopenharmony_ci		fwfile="${fwfile}-orig"
21962306a36Sopenharmony_ci	fi
22062306a36Sopenharmony_ci	for i in $(seq 0 3); do
22162306a36Sopenharmony_ci		config_set_read_fw_idx $i
22262306a36Sopenharmony_ci		# Verify the contents are what we expect.
22362306a36Sopenharmony_ci		# -Z required for now -- check for yourself, md5sum
22462306a36Sopenharmony_ci		# on $FW and DIR/read_firmware will yield the same. Even
22562306a36Sopenharmony_ci		# cmp agrees, so something is off.
22662306a36Sopenharmony_ci		if ! diff -q -Z "$fwfile" $DIR/read_firmware 2>/dev/null ; then
22762306a36Sopenharmony_ci			echo "request #$i: firmware was not loaded" >&2
22862306a36Sopenharmony_ci			exit 1
22962306a36Sopenharmony_ci		fi
23062306a36Sopenharmony_ci	done
23162306a36Sopenharmony_ci}
23262306a36Sopenharmony_ci
23362306a36Sopenharmony_ciread_partial_firmwares()
23462306a36Sopenharmony_ci{
23562306a36Sopenharmony_ci	if [ "$(cat $DIR/config_into_buf)" == "1" ]; then
23662306a36Sopenharmony_ci		fwfile="${FW_INTO_BUF}"
23762306a36Sopenharmony_ci	else
23862306a36Sopenharmony_ci		fwfile="${FW}"
23962306a36Sopenharmony_ci	fi
24062306a36Sopenharmony_ci
24162306a36Sopenharmony_ci	if [ "$1" = "componly" ]; then
24262306a36Sopenharmony_ci		fwfile="${fwfile}-orig"
24362306a36Sopenharmony_ci	fi
24462306a36Sopenharmony_ci
24562306a36Sopenharmony_ci	# Strip fwfile down to match partial offset and length
24662306a36Sopenharmony_ci	partial_data="$(cat $fwfile)"
24762306a36Sopenharmony_ci	partial_data="${partial_data:$2:$3}"
24862306a36Sopenharmony_ci
24962306a36Sopenharmony_ci	for i in $(seq 0 3); do
25062306a36Sopenharmony_ci		config_set_read_fw_idx $i
25162306a36Sopenharmony_ci
25262306a36Sopenharmony_ci		read_firmware="$(cat $DIR/read_firmware)"
25362306a36Sopenharmony_ci
25462306a36Sopenharmony_ci		# Verify the contents are what we expect.
25562306a36Sopenharmony_ci		if [ $read_firmware != $partial_data ]; then
25662306a36Sopenharmony_ci			echo "request #$i: partial firmware was not loaded" >&2
25762306a36Sopenharmony_ci			exit 1
25862306a36Sopenharmony_ci		fi
25962306a36Sopenharmony_ci	done
26062306a36Sopenharmony_ci}
26162306a36Sopenharmony_ci
26262306a36Sopenharmony_ciread_firmwares_expect_nofile()
26362306a36Sopenharmony_ci{
26462306a36Sopenharmony_ci	for i in $(seq 0 3); do
26562306a36Sopenharmony_ci		config_set_read_fw_idx $i
26662306a36Sopenharmony_ci		# Ensures contents differ
26762306a36Sopenharmony_ci		if diff -q -Z "$FW" $DIR/read_firmware 2>/dev/null ; then
26862306a36Sopenharmony_ci			echo "request $i: file was not expected to match" >&2
26962306a36Sopenharmony_ci			exit 1
27062306a36Sopenharmony_ci		fi
27162306a36Sopenharmony_ci	done
27262306a36Sopenharmony_ci}
27362306a36Sopenharmony_ci
27462306a36Sopenharmony_citest_batched_request_firmware_nofile()
27562306a36Sopenharmony_ci{
27662306a36Sopenharmony_ci	echo -n "Batched request_firmware() nofile try #$1: "
27762306a36Sopenharmony_ci	config_reset
27862306a36Sopenharmony_ci	config_set_name nope-test-firmware.bin
27962306a36Sopenharmony_ci	config_trigger_sync
28062306a36Sopenharmony_ci	read_firmwares_expect_nofile
28162306a36Sopenharmony_ci	release_all_firmware
28262306a36Sopenharmony_ci	echo "OK"
28362306a36Sopenharmony_ci}
28462306a36Sopenharmony_ci
28562306a36Sopenharmony_citest_batched_request_firmware_into_buf_nofile()
28662306a36Sopenharmony_ci{
28762306a36Sopenharmony_ci	echo -n "Batched request_firmware_into_buf() nofile try #$1: "
28862306a36Sopenharmony_ci	config_reset
28962306a36Sopenharmony_ci	config_set_name nope-test-firmware.bin
29062306a36Sopenharmony_ci	config_set_into_buf
29162306a36Sopenharmony_ci	config_trigger_sync
29262306a36Sopenharmony_ci	read_firmwares_expect_nofile
29362306a36Sopenharmony_ci	release_all_firmware
29462306a36Sopenharmony_ci	echo "OK"
29562306a36Sopenharmony_ci}
29662306a36Sopenharmony_ci
29762306a36Sopenharmony_citest_request_partial_firmware_into_buf_nofile()
29862306a36Sopenharmony_ci{
29962306a36Sopenharmony_ci	echo -n "Test request_partial_firmware_into_buf() off=$1 size=$2 nofile: "
30062306a36Sopenharmony_ci	config_reset
30162306a36Sopenharmony_ci	config_set_name nope-test-firmware.bin
30262306a36Sopenharmony_ci	config_set_into_buf
30362306a36Sopenharmony_ci	config_set_partial
30462306a36Sopenharmony_ci	config_set_buf_size $2
30562306a36Sopenharmony_ci	config_set_file_offset $1
30662306a36Sopenharmony_ci	config_trigger_sync
30762306a36Sopenharmony_ci	read_firmwares_expect_nofile
30862306a36Sopenharmony_ci	release_all_firmware
30962306a36Sopenharmony_ci	echo "OK"
31062306a36Sopenharmony_ci}
31162306a36Sopenharmony_ci
31262306a36Sopenharmony_citest_batched_request_firmware_direct_nofile()
31362306a36Sopenharmony_ci{
31462306a36Sopenharmony_ci	echo -n "Batched request_firmware_direct() nofile try #$1: "
31562306a36Sopenharmony_ci	config_reset
31662306a36Sopenharmony_ci	config_set_name nope-test-firmware.bin
31762306a36Sopenharmony_ci	config_set_sync_direct
31862306a36Sopenharmony_ci	config_trigger_sync
31962306a36Sopenharmony_ci	release_all_firmware
32062306a36Sopenharmony_ci	echo "OK"
32162306a36Sopenharmony_ci}
32262306a36Sopenharmony_ci
32362306a36Sopenharmony_citest_request_firmware_nowait_uevent_nofile()
32462306a36Sopenharmony_ci{
32562306a36Sopenharmony_ci	echo -n "Batched request_firmware_nowait(uevent=true) nofile try #$1: "
32662306a36Sopenharmony_ci	config_reset
32762306a36Sopenharmony_ci	config_set_name nope-test-firmware.bin
32862306a36Sopenharmony_ci	config_trigger_async
32962306a36Sopenharmony_ci	release_all_firmware
33062306a36Sopenharmony_ci	echo "OK"
33162306a36Sopenharmony_ci}
33262306a36Sopenharmony_ci
33362306a36Sopenharmony_citest_wait_and_cancel_custom_load()
33462306a36Sopenharmony_ci{
33562306a36Sopenharmony_ci	if [ "$HAS_FW_LOADER_USER_HELPER" != "yes" ]; then
33662306a36Sopenharmony_ci		return
33762306a36Sopenharmony_ci	fi
33862306a36Sopenharmony_ci	local timeout=10
33962306a36Sopenharmony_ci	name=$1
34062306a36Sopenharmony_ci	while [ ! -e "$DIR"/"$name"/loading ]; do
34162306a36Sopenharmony_ci		sleep 0.1
34262306a36Sopenharmony_ci		timeout=$(( $timeout - 1 ))
34362306a36Sopenharmony_ci		if [ "$timeout" -eq 0 ]; then
34462306a36Sopenharmony_ci			echo "firmware interface never appeared:" >&2
34562306a36Sopenharmony_ci			echo "$DIR/$name/loading" >&2
34662306a36Sopenharmony_ci			exit 1
34762306a36Sopenharmony_ci		fi
34862306a36Sopenharmony_ci	done
34962306a36Sopenharmony_ci	echo -1 >"$DIR"/"$name"/loading
35062306a36Sopenharmony_ci}
35162306a36Sopenharmony_ci
35262306a36Sopenharmony_citest_request_firmware_nowait_custom_nofile()
35362306a36Sopenharmony_ci{
35462306a36Sopenharmony_ci	echo -n "Batched request_firmware_nowait(uevent=false) nofile try #$1: "
35562306a36Sopenharmony_ci	config_reset
35662306a36Sopenharmony_ci	config_unset_uevent
35762306a36Sopenharmony_ci	RANDOM_FILE_PATH=$(setup_random_file_fake)
35862306a36Sopenharmony_ci	RANDOM_FILE="$(basename $RANDOM_FILE_PATH)"
35962306a36Sopenharmony_ci	config_set_name $RANDOM_FILE
36062306a36Sopenharmony_ci	config_trigger_async &
36162306a36Sopenharmony_ci	test_wait_and_cancel_custom_load $RANDOM_FILE
36262306a36Sopenharmony_ci	wait
36362306a36Sopenharmony_ci	release_all_firmware
36462306a36Sopenharmony_ci	echo "OK"
36562306a36Sopenharmony_ci}
36662306a36Sopenharmony_ci
36762306a36Sopenharmony_citest_batched_request_firmware()
36862306a36Sopenharmony_ci{
36962306a36Sopenharmony_ci	echo -n "Batched request_firmware() $2 try #$1: "
37062306a36Sopenharmony_ci	config_reset
37162306a36Sopenharmony_ci	config_trigger_sync
37262306a36Sopenharmony_ci	read_firmwares $2
37362306a36Sopenharmony_ci	release_all_firmware
37462306a36Sopenharmony_ci	echo "OK"
37562306a36Sopenharmony_ci}
37662306a36Sopenharmony_ci
37762306a36Sopenharmony_citest_batched_request_firmware_into_buf()
37862306a36Sopenharmony_ci{
37962306a36Sopenharmony_ci	echo -n "Batched request_firmware_into_buf() $2 try #$1: "
38062306a36Sopenharmony_ci	config_reset
38162306a36Sopenharmony_ci	config_set_name $TEST_FIRMWARE_INTO_BUF_FILENAME
38262306a36Sopenharmony_ci	config_set_into_buf
38362306a36Sopenharmony_ci	config_trigger_sync
38462306a36Sopenharmony_ci	read_firmwares $2
38562306a36Sopenharmony_ci	release_all_firmware
38662306a36Sopenharmony_ci	echo "OK"
38762306a36Sopenharmony_ci}
38862306a36Sopenharmony_ci
38962306a36Sopenharmony_citest_batched_request_firmware_direct()
39062306a36Sopenharmony_ci{
39162306a36Sopenharmony_ci	echo -n "Batched request_firmware_direct() $2 try #$1: "
39262306a36Sopenharmony_ci	config_reset
39362306a36Sopenharmony_ci	config_set_sync_direct
39462306a36Sopenharmony_ci	config_trigger_sync
39562306a36Sopenharmony_ci	release_all_firmware
39662306a36Sopenharmony_ci	echo "OK"
39762306a36Sopenharmony_ci}
39862306a36Sopenharmony_ci
39962306a36Sopenharmony_citest_request_firmware_nowait_uevent()
40062306a36Sopenharmony_ci{
40162306a36Sopenharmony_ci	echo -n "Batched request_firmware_nowait(uevent=true) $2 try #$1: "
40262306a36Sopenharmony_ci	config_reset
40362306a36Sopenharmony_ci	config_trigger_async
40462306a36Sopenharmony_ci	release_all_firmware
40562306a36Sopenharmony_ci	echo "OK"
40662306a36Sopenharmony_ci}
40762306a36Sopenharmony_ci
40862306a36Sopenharmony_citest_request_firmware_nowait_custom()
40962306a36Sopenharmony_ci{
41062306a36Sopenharmony_ci	echo -n "Batched request_firmware_nowait(uevent=false) $2 try #$1: "
41162306a36Sopenharmony_ci	config_reset
41262306a36Sopenharmony_ci	config_unset_uevent
41362306a36Sopenharmony_ci	RANDOM_FILE_PATH=$(setup_random_file)
41462306a36Sopenharmony_ci	RANDOM_FILE="$(basename $RANDOM_FILE_PATH)"
41562306a36Sopenharmony_ci	if [ -n "$2" -a "$2" != "normal" ]; then
41662306a36Sopenharmony_ci		compress_"$2"_"$COMPRESS_FORMAT" $RANDOM_FILE_PATH
41762306a36Sopenharmony_ci	fi
41862306a36Sopenharmony_ci	config_set_name $RANDOM_FILE
41962306a36Sopenharmony_ci	config_trigger_async
42062306a36Sopenharmony_ci	release_all_firmware
42162306a36Sopenharmony_ci	echo "OK"
42262306a36Sopenharmony_ci}
42362306a36Sopenharmony_ci
42462306a36Sopenharmony_citest_request_partial_firmware_into_buf()
42562306a36Sopenharmony_ci{
42662306a36Sopenharmony_ci	echo -n "Test request_partial_firmware_into_buf() off=$1 size=$2: "
42762306a36Sopenharmony_ci	config_reset
42862306a36Sopenharmony_ci	config_set_name $TEST_FIRMWARE_INTO_BUF_FILENAME
42962306a36Sopenharmony_ci	config_set_into_buf
43062306a36Sopenharmony_ci	config_set_partial
43162306a36Sopenharmony_ci	config_set_buf_size $2
43262306a36Sopenharmony_ci	config_set_file_offset $1
43362306a36Sopenharmony_ci	config_trigger_sync
43462306a36Sopenharmony_ci	read_partial_firmwares normal $1 $2
43562306a36Sopenharmony_ci	release_all_firmware
43662306a36Sopenharmony_ci	echo "OK"
43762306a36Sopenharmony_ci}
43862306a36Sopenharmony_ci
43962306a36Sopenharmony_cido_tests ()
44062306a36Sopenharmony_ci{
44162306a36Sopenharmony_ci	mode="$1"
44262306a36Sopenharmony_ci	suffix="$2"
44362306a36Sopenharmony_ci
44462306a36Sopenharmony_ci	for i in $(seq 1 5); do
44562306a36Sopenharmony_ci		test_batched_request_firmware$suffix $i $mode
44662306a36Sopenharmony_ci	done
44762306a36Sopenharmony_ci
44862306a36Sopenharmony_ci	for i in $(seq 1 5); do
44962306a36Sopenharmony_ci		test_batched_request_firmware_into_buf$suffix $i $mode
45062306a36Sopenharmony_ci	done
45162306a36Sopenharmony_ci
45262306a36Sopenharmony_ci	for i in $(seq 1 5); do
45362306a36Sopenharmony_ci		test_batched_request_firmware_direct$suffix $i $mode
45462306a36Sopenharmony_ci	done
45562306a36Sopenharmony_ci
45662306a36Sopenharmony_ci	for i in $(seq 1 5); do
45762306a36Sopenharmony_ci		test_request_firmware_nowait_uevent$suffix $i $mode
45862306a36Sopenharmony_ci	done
45962306a36Sopenharmony_ci
46062306a36Sopenharmony_ci	for i in $(seq 1 5); do
46162306a36Sopenharmony_ci		test_request_firmware_nowait_custom$suffix $i $mode
46262306a36Sopenharmony_ci	done
46362306a36Sopenharmony_ci}
46462306a36Sopenharmony_ci
46562306a36Sopenharmony_ci# Only continue if batched request triggers are present on the
46662306a36Sopenharmony_ci# test-firmware driver
46762306a36Sopenharmony_citest_config_present
46862306a36Sopenharmony_ci
46962306a36Sopenharmony_ci# test with the file present
47062306a36Sopenharmony_ciecho
47162306a36Sopenharmony_ciecho "Testing with the file present..."
47262306a36Sopenharmony_cido_tests normal
47362306a36Sopenharmony_ci
47462306a36Sopenharmony_ci# Partial loads cannot use fallback, so do not repeat tests.
47562306a36Sopenharmony_citest_request_partial_firmware_into_buf 0 10
47662306a36Sopenharmony_citest_request_partial_firmware_into_buf 0 5
47762306a36Sopenharmony_citest_request_partial_firmware_into_buf 1 6
47862306a36Sopenharmony_citest_request_partial_firmware_into_buf 2 10
47962306a36Sopenharmony_ci
48062306a36Sopenharmony_ci# Test for file not found, errors are expected, the failure would be
48162306a36Sopenharmony_ci# a hung task, which would require a hard reset.
48262306a36Sopenharmony_ciecho
48362306a36Sopenharmony_ciecho "Testing with the file missing..."
48462306a36Sopenharmony_cido_tests nofile _nofile
48562306a36Sopenharmony_ci
48662306a36Sopenharmony_ci# Partial loads cannot use fallback, so do not repeat tests.
48762306a36Sopenharmony_citest_request_partial_firmware_into_buf_nofile 0 10
48862306a36Sopenharmony_citest_request_partial_firmware_into_buf_nofile 0 5
48962306a36Sopenharmony_citest_request_partial_firmware_into_buf_nofile 1 6
49062306a36Sopenharmony_citest_request_partial_firmware_into_buf_nofile 2 10
49162306a36Sopenharmony_ci
49262306a36Sopenharmony_citest_request_firmware_compressed ()
49362306a36Sopenharmony_ci{
49462306a36Sopenharmony_ci	export COMPRESS_FORMAT="$1"
49562306a36Sopenharmony_ci
49662306a36Sopenharmony_ci	# test with both files present
49762306a36Sopenharmony_ci	compress_both_"$COMPRESS_FORMAT" $FW
49862306a36Sopenharmony_ci	compress_both_"$COMPRESS_FORMAT" $FW_INTO_BUF
49962306a36Sopenharmony_ci
50062306a36Sopenharmony_ci	config_set_name $NAME
50162306a36Sopenharmony_ci	echo
50262306a36Sopenharmony_ci	echo "Testing with both plain and $COMPRESS_FORMAT files present..."
50362306a36Sopenharmony_ci	do_tests both
50462306a36Sopenharmony_ci
50562306a36Sopenharmony_ci	# test with only compressed file present
50662306a36Sopenharmony_ci	mv "$FW" "${FW}-orig"
50762306a36Sopenharmony_ci	mv "$FW_INTO_BUF" "${FW_INTO_BUF}-orig"
50862306a36Sopenharmony_ci
50962306a36Sopenharmony_ci	config_set_name $NAME
51062306a36Sopenharmony_ci	echo
51162306a36Sopenharmony_ci	echo "Testing with only $COMPRESS_FORMAT file present..."
51262306a36Sopenharmony_ci	do_tests componly
51362306a36Sopenharmony_ci
51462306a36Sopenharmony_ci	mv "${FW}-orig" "$FW"
51562306a36Sopenharmony_ci	mv "${FW_INTO_BUF}-orig" "$FW_INTO_BUF"
51662306a36Sopenharmony_ci}
51762306a36Sopenharmony_ci
51862306a36Sopenharmony_cicompress_both_XZ ()
51962306a36Sopenharmony_ci{
52062306a36Sopenharmony_ci	$RUN_XZ -k "$@"
52162306a36Sopenharmony_ci}
52262306a36Sopenharmony_ci
52362306a36Sopenharmony_cicompress_componly_XZ ()
52462306a36Sopenharmony_ci{
52562306a36Sopenharmony_ci	$RUN_XZ "$@"
52662306a36Sopenharmony_ci}
52762306a36Sopenharmony_ci
52862306a36Sopenharmony_cicompress_both_ZSTD ()
52962306a36Sopenharmony_ci{
53062306a36Sopenharmony_ci	$RUN_ZSTD -k "$@"
53162306a36Sopenharmony_ci}
53262306a36Sopenharmony_ci
53362306a36Sopenharmony_cicompress_componly_ZSTD ()
53462306a36Sopenharmony_ci{
53562306a36Sopenharmony_ci	$RUN_ZSTD --rm "$@"
53662306a36Sopenharmony_ci}
53762306a36Sopenharmony_ci
53862306a36Sopenharmony_ciif test "$HAS_FW_LOADER_COMPRESS_XZ" = "yes"; then
53962306a36Sopenharmony_ci	test_request_firmware_compressed XZ
54062306a36Sopenharmony_cifi
54162306a36Sopenharmony_ci
54262306a36Sopenharmony_ciif test "$HAS_FW_LOADER_COMPRESS_ZSTD" = "yes"; then
54362306a36Sopenharmony_ci	test_request_firmware_compressed ZSTD
54462306a36Sopenharmony_cifi
54562306a36Sopenharmony_ci
54662306a36Sopenharmony_ciexit 0
547