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