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