129a1c00cSLuis R. Rodriguez#!/bin/bash 229a1c00cSLuis R. Rodriguez# SPDX-License-Identifier: GPL-2.0 329a1c00cSLuis R. Rodriguez 429a1c00cSLuis R. Rodriguez# Library of helpers for test scripts. 529a1c00cSLuis R. Rodriguezset -e 629a1c00cSLuis R. Rodriguez 729a1c00cSLuis R. RodriguezDIR=/sys/devices/virtual/misc/test_firmware 829a1c00cSLuis R. Rodriguez 929a1c00cSLuis R. RodriguezPROC_CONFIG="/proc/config.gz" 1029a1c00cSLuis R. RodriguezTEST_DIR=$(dirname $0) 1129a1c00cSLuis R. Rodriguez 1217980459SScott Branden# We need to load a different file to test request_firmware_into_buf 1317980459SScott Branden# I believe the issue is firmware loaded cached vs. non-cached 1417980459SScott Branden# with same filename is bungled. 1517980459SScott Branden# To reproduce rename this to test-firmware.bin 1617980459SScott BrandenTEST_FIRMWARE_INTO_BUF_FILENAME=test-firmware-into-buf.bin 1717980459SScott Branden 18a6a9be92SShuah Khan (Samsung OSG)# Kselftest framework requirement - SKIP code is 4. 19a6a9be92SShuah Khan (Samsung OSG)ksft_skip=4 20a6a9be92SShuah Khan (Samsung OSG) 2129a1c00cSLuis R. Rodriguezprint_reqs_exit() 2229a1c00cSLuis R. Rodriguez{ 2329a1c00cSLuis R. Rodriguez echo "You must have the following enabled in your kernel:" >&2 2429a1c00cSLuis R. Rodriguez cat $TEST_DIR/config >&2 25a6a9be92SShuah Khan (Samsung OSG) exit $ksft_skip 2629a1c00cSLuis R. Rodriguez} 2729a1c00cSLuis R. Rodriguez 2829a1c00cSLuis R. Rodrigueztest_modprobe() 2929a1c00cSLuis R. Rodriguez{ 3029a1c00cSLuis R. Rodriguez if [ ! -d $DIR ]; then 3129a1c00cSLuis R. Rodriguez print_reqs_exit 3229a1c00cSLuis R. Rodriguez fi 3329a1c00cSLuis R. Rodriguez} 3429a1c00cSLuis R. Rodriguez 3529a1c00cSLuis R. Rodriguezcheck_mods() 3629a1c00cSLuis R. Rodriguez{ 37c65e4153SShuah Khan local uid=$(id -u) 38c65e4153SShuah Khan if [ $uid -ne 0 ]; then 39c65e4153SShuah Khan echo "skip all tests: must be run as root" >&2 40c65e4153SShuah Khan exit $ksft_skip 41c65e4153SShuah Khan fi 42c65e4153SShuah Khan 4329a1c00cSLuis R. Rodriguez trap "test_modprobe" EXIT 4429a1c00cSLuis R. Rodriguez if [ ! -d $DIR ]; then 4529a1c00cSLuis R. Rodriguez modprobe test_firmware 4629a1c00cSLuis R. Rodriguez fi 4729a1c00cSLuis R. Rodriguez if [ ! -f $PROC_CONFIG ]; then 4829a1c00cSLuis R. Rodriguez if modprobe configs 2>/dev/null; then 4929a1c00cSLuis R. Rodriguez echo "Loaded configs module" 5029a1c00cSLuis R. Rodriguez if [ ! -f $PROC_CONFIG ]; then 5129a1c00cSLuis R. Rodriguez echo "You must have the following enabled in your kernel:" >&2 5229a1c00cSLuis R. Rodriguez cat $TEST_DIR/config >&2 5329a1c00cSLuis R. Rodriguez echo "Resorting to old heuristics" >&2 5429a1c00cSLuis R. Rodriguez fi 5529a1c00cSLuis R. Rodriguez else 5629a1c00cSLuis R. Rodriguez echo "Failed to load configs module, using old heuristics" >&2 5729a1c00cSLuis R. Rodriguez fi 5829a1c00cSLuis R. Rodriguez fi 5929a1c00cSLuis R. Rodriguez} 60ef557787SLuis R. Rodriguez 61f5a61451SLuis R. Rodriguezcheck_setup() 62f5a61451SLuis R. Rodriguez{ 63f5a61451SLuis R. Rodriguez HAS_FW_LOADER_USER_HELPER="$(kconfig_has CONFIG_FW_LOADER_USER_HELPER=y)" 64f5a61451SLuis R. Rodriguez HAS_FW_LOADER_USER_HELPER_FALLBACK="$(kconfig_has CONFIG_FW_LOADER_USER_HELPER_FALLBACK=y)" 65bc67cac1STakashi Iwai HAS_FW_LOADER_COMPRESS_XZ="$(kconfig_has CONFIG_FW_LOADER_COMPRESS_XZ=y)" 66bc67cac1STakashi Iwai HAS_FW_LOADER_COMPRESS_ZSTD="$(kconfig_has CONFIG_FW_LOADER_COMPRESS_ZSTD=y)" 67*a37dddddSRuss Weight HAS_FW_UPLOAD="$(kconfig_has CONFIG_FW_UPLOAD=y)" 68b3cf21faSLuis R. Rodriguez PROC_FW_IGNORE_SYSFS_FALLBACK="0" 69b3cf21faSLuis R. Rodriguez PROC_FW_FORCE_SYSFS_FALLBACK="0" 70b3cf21faSLuis R. Rodriguez 71b3cf21faSLuis R. Rodriguez if [ -z $PROC_SYS_DIR ]; then 72b3cf21faSLuis R. Rodriguez PROC_SYS_DIR="/proc/sys/kernel" 73b3cf21faSLuis R. Rodriguez fi 74b3cf21faSLuis R. Rodriguez 75b3cf21faSLuis R. Rodriguez FW_PROC="${PROC_SYS_DIR}/firmware_config" 76b3cf21faSLuis R. Rodriguez FW_FORCE_SYSFS_FALLBACK="$FW_PROC/force_sysfs_fallback" 77b3cf21faSLuis R. Rodriguez FW_IGNORE_SYSFS_FALLBACK="$FW_PROC/ignore_sysfs_fallback" 78b3cf21faSLuis R. Rodriguez 79b3cf21faSLuis R. Rodriguez if [ -f $FW_FORCE_SYSFS_FALLBACK ]; then 80b3cf21faSLuis R. Rodriguez PROC_FW_FORCE_SYSFS_FALLBACK="$(cat $FW_FORCE_SYSFS_FALLBACK)" 81b3cf21faSLuis R. Rodriguez fi 82b3cf21faSLuis R. Rodriguez 83b3cf21faSLuis R. Rodriguez if [ -f $FW_IGNORE_SYSFS_FALLBACK ]; then 84b3cf21faSLuis R. Rodriguez PROC_FW_IGNORE_SYSFS_FALLBACK="$(cat $FW_IGNORE_SYSFS_FALLBACK)" 85b3cf21faSLuis R. Rodriguez fi 86b3cf21faSLuis R. Rodriguez 87b3cf21faSLuis R. Rodriguez if [ "$PROC_FW_FORCE_SYSFS_FALLBACK" = "1" ]; then 88b3cf21faSLuis R. Rodriguez HAS_FW_LOADER_USER_HELPER="yes" 89b3cf21faSLuis R. Rodriguez HAS_FW_LOADER_USER_HELPER_FALLBACK="yes" 90b3cf21faSLuis R. Rodriguez fi 91b3cf21faSLuis R. Rodriguez 92b3cf21faSLuis R. Rodriguez if [ "$PROC_FW_IGNORE_SYSFS_FALLBACK" = "1" ]; then 93b3cf21faSLuis R. Rodriguez HAS_FW_LOADER_USER_HELPER_FALLBACK="no" 94b3cf21faSLuis R. Rodriguez HAS_FW_LOADER_USER_HELPER="no" 95b3cf21faSLuis R. Rodriguez fi 96f5a61451SLuis R. Rodriguez 97f5a61451SLuis R. Rodriguez if [ "$HAS_FW_LOADER_USER_HELPER" = "yes" ]; then 98f5a61451SLuis R. Rodriguez OLD_TIMEOUT="$(cat /sys/class/firmware/timeout)" 99f5a61451SLuis R. Rodriguez fi 100f5a61451SLuis R. Rodriguez 101f5a61451SLuis R. Rodriguez OLD_FWPATH="$(cat /sys/module/firmware_class/parameters/path)" 102108ae07cSTakashi Iwai 103bc67cac1STakashi Iwai if [ "$HAS_FW_LOADER_COMPRESS_XZ" = "yes" ]; then 104108ae07cSTakashi Iwai if ! which xz 2> /dev/null > /dev/null; then 105bc67cac1STakashi Iwai HAS_FW_LOADER_COMPRESS_XZ="" 106bc67cac1STakashi Iwai fi 107bc67cac1STakashi Iwai fi 108bc67cac1STakashi Iwai if [ "$HAS_FW_LOADER_COMPRESS_ZSTD" = "yes" ]; then 109bc67cac1STakashi Iwai if ! which zstd 2> /dev/null > /dev/null; then 110bc67cac1STakashi Iwai HAS_FW_LOADER_COMPRESS_ZSTD="" 111108ae07cSTakashi Iwai fi 112108ae07cSTakashi Iwai fi 113f5a61451SLuis R. Rodriguez} 114f5a61451SLuis R. Rodriguez 115f5a61451SLuis R. Rodriguezverify_reqs() 116f5a61451SLuis R. Rodriguez{ 117f5a61451SLuis R. Rodriguez if [ "$TEST_REQS_FW_SYSFS_FALLBACK" = "yes" ]; then 118f5a61451SLuis R. Rodriguez if [ ! "$HAS_FW_LOADER_USER_HELPER" = "yes" ]; then 119f5a61451SLuis R. Rodriguez echo "usermode helper disabled so ignoring test" 120344c0152SLuis Chamberlain exit 0 121f5a61451SLuis R. Rodriguez fi 122f5a61451SLuis R. Rodriguez fi 123*a37dddddSRuss Weight if [ "$TEST_REQS_FW_UPLOAD" = "yes" ]; then 124*a37dddddSRuss Weight if [ ! "$HAS_FW_UPLOAD" = "yes" ]; then 125*a37dddddSRuss Weight echo "firmware upload disabled so ignoring test" 126*a37dddddSRuss Weight exit 0 127*a37dddddSRuss Weight fi 128*a37dddddSRuss Weight fi 129f5a61451SLuis R. Rodriguez} 130f5a61451SLuis R. Rodriguez 131f5a61451SLuis R. Rodriguezsetup_tmp_file() 132f5a61451SLuis R. Rodriguez{ 133f5a61451SLuis R. Rodriguez FWPATH=$(mktemp -d) 134f5a61451SLuis R. Rodriguez FW="$FWPATH/test-firmware.bin" 135f5a61451SLuis R. Rodriguez echo "ABCD0123" >"$FW" 13617980459SScott Branden FW_INTO_BUF="$FWPATH/$TEST_FIRMWARE_INTO_BUF_FILENAME" 13717980459SScott Branden echo "EFGH4567" >"$FW_INTO_BUF" 138f5a61451SLuis R. Rodriguez NAME=$(basename "$FW") 139f5a61451SLuis R. Rodriguez if [ "$TEST_REQS_FW_SET_CUSTOM_PATH" = "yes" ]; then 140f5a61451SLuis R. Rodriguez echo -n "$FWPATH" >/sys/module/firmware_class/parameters/path 141f5a61451SLuis R. Rodriguez fi 142f5a61451SLuis R. Rodriguez} 143f5a61451SLuis R. Rodriguez 1449952db75SLuis R. Rodriguez__setup_random_file() 1459952db75SLuis R. Rodriguez{ 1469952db75SLuis R. Rodriguez RANDOM_FILE_PATH="$(mktemp -p $FWPATH)" 1479952db75SLuis R. Rodriguez # mktemp says dry-run -n is unsafe, so... 1489952db75SLuis R. Rodriguez if [[ "$1" = "fake" ]]; then 1499952db75SLuis R. Rodriguez rm -rf $RANDOM_FILE_PATH 1509952db75SLuis R. Rodriguez sync 1519952db75SLuis R. Rodriguez else 1529952db75SLuis R. Rodriguez echo "ABCD0123" >"$RANDOM_FILE_PATH" 1539952db75SLuis R. Rodriguez fi 1549952db75SLuis R. Rodriguez echo $RANDOM_FILE_PATH 1559952db75SLuis R. Rodriguez} 1569952db75SLuis R. Rodriguez 1579952db75SLuis R. Rodriguezsetup_random_file() 1589952db75SLuis R. Rodriguez{ 1599952db75SLuis R. Rodriguez echo $(__setup_random_file) 1609952db75SLuis R. Rodriguez} 1619952db75SLuis R. Rodriguez 1629952db75SLuis R. Rodriguezsetup_random_file_fake() 1639952db75SLuis R. Rodriguez{ 1649952db75SLuis R. Rodriguez echo $(__setup_random_file fake) 1659952db75SLuis R. Rodriguez} 1669952db75SLuis R. Rodriguez 167b3cf21faSLuis R. Rodriguezproc_set_force_sysfs_fallback() 168b3cf21faSLuis R. Rodriguez{ 169b3cf21faSLuis R. Rodriguez if [ -f $FW_FORCE_SYSFS_FALLBACK ]; then 170b3cf21faSLuis R. Rodriguez echo -n $1 > $FW_FORCE_SYSFS_FALLBACK 171b3cf21faSLuis R. Rodriguez check_setup 172b3cf21faSLuis R. Rodriguez fi 173b3cf21faSLuis R. Rodriguez} 174b3cf21faSLuis R. Rodriguez 175b3cf21faSLuis R. Rodriguezproc_set_ignore_sysfs_fallback() 176b3cf21faSLuis R. Rodriguez{ 177b3cf21faSLuis R. Rodriguez if [ -f $FW_IGNORE_SYSFS_FALLBACK ]; then 178b3cf21faSLuis R. Rodriguez echo -n $1 > $FW_IGNORE_SYSFS_FALLBACK 179b3cf21faSLuis R. Rodriguez check_setup 180b3cf21faSLuis R. Rodriguez fi 181b3cf21faSLuis R. Rodriguez} 182b3cf21faSLuis R. Rodriguez 183b3cf21faSLuis R. Rodriguezproc_restore_defaults() 184b3cf21faSLuis R. Rodriguez{ 185b3cf21faSLuis R. Rodriguez proc_set_force_sysfs_fallback 0 186b3cf21faSLuis R. Rodriguez proc_set_ignore_sysfs_fallback 0 187b3cf21faSLuis R. Rodriguez} 188b3cf21faSLuis R. Rodriguez 189f5a61451SLuis R. Rodrigueztest_finish() 190f5a61451SLuis R. Rodriguez{ 191f5a61451SLuis R. Rodriguez if [ "$HAS_FW_LOADER_USER_HELPER" = "yes" ]; then 192f5a61451SLuis R. Rodriguez echo "$OLD_TIMEOUT" >/sys/class/firmware/timeout 193f5a61451SLuis R. Rodriguez fi 194f5a61451SLuis R. Rodriguez if [ "$TEST_REQS_FW_SET_CUSTOM_PATH" = "yes" ]; then 195e5384092SBen Hutchings if [ "$OLD_FWPATH" = "" ]; then 196e5384092SBen Hutchings # A zero-length write won't work; write a null byte 197e5384092SBen Hutchings printf '\000' >/sys/module/firmware_class/parameters/path 198e5384092SBen Hutchings else 199f5a61451SLuis R. Rodriguez echo -n "$OLD_FWPATH" >/sys/module/firmware_class/parameters/path 200f5a61451SLuis R. Rodriguez fi 201e5384092SBen Hutchings fi 202f5a61451SLuis R. Rodriguez if [ -f $FW ]; then 203f5a61451SLuis R. Rodriguez rm -f "$FW" 204f5a61451SLuis R. Rodriguez fi 20517980459SScott Branden if [ -f $FW_INTO_BUF ]; then 20617980459SScott Branden rm -f "$FW_INTO_BUF" 20717980459SScott Branden fi 208f5a61451SLuis R. Rodriguez if [ -d $FWPATH ]; then 209f5a61451SLuis R. Rodriguez rm -rf "$FWPATH" 210f5a61451SLuis R. Rodriguez fi 211b3cf21faSLuis R. Rodriguez proc_restore_defaults 212f5a61451SLuis R. Rodriguez} 213f5a61451SLuis R. Rodriguez 214ef557787SLuis R. Rodriguezkconfig_has() 215ef557787SLuis R. Rodriguez{ 216ef557787SLuis R. Rodriguez if [ -f $PROC_CONFIG ]; then 217ef557787SLuis R. Rodriguez if zgrep -q $1 $PROC_CONFIG 2>/dev/null; then 218ef557787SLuis R. Rodriguez echo "yes" 219ef557787SLuis R. Rodriguez else 220ef557787SLuis R. Rodriguez echo "no" 221ef557787SLuis R. Rodriguez fi 222ef557787SLuis R. Rodriguez else 223ef557787SLuis R. Rodriguez # We currently don't have easy heuristics to infer this 224ef557787SLuis R. Rodriguez # so best we can do is just try to use the kernel assuming 225ef557787SLuis R. Rodriguez # you had enabled it. This matches the old behaviour. 226ef557787SLuis R. Rodriguez if [ "$1" = "CONFIG_FW_LOADER_USER_HELPER_FALLBACK=y" ]; then 227ef557787SLuis R. Rodriguez echo "yes" 228ef557787SLuis R. Rodriguez elif [ "$1" = "CONFIG_FW_LOADER_USER_HELPER=y" ]; then 229ef557787SLuis R. Rodriguez if [ -d /sys/class/firmware/ ]; then 230ef557787SLuis R. Rodriguez echo yes 231ef557787SLuis R. Rodriguez else 232ef557787SLuis R. Rodriguez echo no 233ef557787SLuis R. Rodriguez fi 234ef557787SLuis R. Rodriguez fi 235ef557787SLuis R. Rodriguez fi 236ef557787SLuis R. Rodriguez} 237