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 1229a1c00cSLuis R. Rodriguezprint_reqs_exit() 1329a1c00cSLuis R. Rodriguez{ 1429a1c00cSLuis R. Rodriguez echo "You must have the following enabled in your kernel:" >&2 1529a1c00cSLuis R. Rodriguez cat $TEST_DIR/config >&2 1629a1c00cSLuis R. Rodriguez exit 1 1729a1c00cSLuis R. Rodriguez} 1829a1c00cSLuis R. Rodriguez 1929a1c00cSLuis R. Rodrigueztest_modprobe() 2029a1c00cSLuis R. Rodriguez{ 2129a1c00cSLuis R. Rodriguez if [ ! -d $DIR ]; then 2229a1c00cSLuis R. Rodriguez print_reqs_exit 2329a1c00cSLuis R. Rodriguez fi 2429a1c00cSLuis R. Rodriguez} 2529a1c00cSLuis R. Rodriguez 2629a1c00cSLuis R. Rodriguezcheck_mods() 2729a1c00cSLuis R. Rodriguez{ 2829a1c00cSLuis R. Rodriguez trap "test_modprobe" EXIT 2929a1c00cSLuis R. Rodriguez if [ ! -d $DIR ]; then 3029a1c00cSLuis R. Rodriguez modprobe test_firmware 3129a1c00cSLuis R. Rodriguez fi 3229a1c00cSLuis R. Rodriguez if [ ! -f $PROC_CONFIG ]; then 3329a1c00cSLuis R. Rodriguez if modprobe configs 2>/dev/null; then 3429a1c00cSLuis R. Rodriguez echo "Loaded configs module" 3529a1c00cSLuis R. Rodriguez if [ ! -f $PROC_CONFIG ]; then 3629a1c00cSLuis R. Rodriguez echo "You must have the following enabled in your kernel:" >&2 3729a1c00cSLuis R. Rodriguez cat $TEST_DIR/config >&2 3829a1c00cSLuis R. Rodriguez echo "Resorting to old heuristics" >&2 3929a1c00cSLuis R. Rodriguez fi 4029a1c00cSLuis R. Rodriguez else 4129a1c00cSLuis R. Rodriguez echo "Failed to load configs module, using old heuristics" >&2 4229a1c00cSLuis R. Rodriguez fi 4329a1c00cSLuis R. Rodriguez fi 4429a1c00cSLuis R. Rodriguez} 45ef557787SLuis R. Rodriguez 46f5a61451SLuis R. Rodriguezcheck_setup() 47f5a61451SLuis R. Rodriguez{ 48f5a61451SLuis R. Rodriguez HAS_FW_LOADER_USER_HELPER="$(kconfig_has CONFIG_FW_LOADER_USER_HELPER=y)" 49f5a61451SLuis R. Rodriguez HAS_FW_LOADER_USER_HELPER_FALLBACK="$(kconfig_has CONFIG_FW_LOADER_USER_HELPER_FALLBACK=y)" 50b3cf21faSLuis R. Rodriguez PROC_FW_IGNORE_SYSFS_FALLBACK="0" 51b3cf21faSLuis R. Rodriguez PROC_FW_FORCE_SYSFS_FALLBACK="0" 52b3cf21faSLuis R. Rodriguez 53b3cf21faSLuis R. Rodriguez if [ -z $PROC_SYS_DIR ]; then 54b3cf21faSLuis R. Rodriguez PROC_SYS_DIR="/proc/sys/kernel" 55b3cf21faSLuis R. Rodriguez fi 56b3cf21faSLuis R. Rodriguez 57b3cf21faSLuis R. Rodriguez FW_PROC="${PROC_SYS_DIR}/firmware_config" 58b3cf21faSLuis R. Rodriguez FW_FORCE_SYSFS_FALLBACK="$FW_PROC/force_sysfs_fallback" 59b3cf21faSLuis R. Rodriguez FW_IGNORE_SYSFS_FALLBACK="$FW_PROC/ignore_sysfs_fallback" 60b3cf21faSLuis R. Rodriguez 61b3cf21faSLuis R. Rodriguez if [ -f $FW_FORCE_SYSFS_FALLBACK ]; then 62b3cf21faSLuis R. Rodriguez PROC_FW_FORCE_SYSFS_FALLBACK="$(cat $FW_FORCE_SYSFS_FALLBACK)" 63b3cf21faSLuis R. Rodriguez fi 64b3cf21faSLuis R. Rodriguez 65b3cf21faSLuis R. Rodriguez if [ -f $FW_IGNORE_SYSFS_FALLBACK ]; then 66b3cf21faSLuis R. Rodriguez PROC_FW_IGNORE_SYSFS_FALLBACK="$(cat $FW_IGNORE_SYSFS_FALLBACK)" 67b3cf21faSLuis R. Rodriguez fi 68b3cf21faSLuis R. Rodriguez 69b3cf21faSLuis R. Rodriguez if [ "$PROC_FW_FORCE_SYSFS_FALLBACK" = "1" ]; then 70b3cf21faSLuis R. Rodriguez HAS_FW_LOADER_USER_HELPER="yes" 71b3cf21faSLuis R. Rodriguez HAS_FW_LOADER_USER_HELPER_FALLBACK="yes" 72b3cf21faSLuis R. Rodriguez fi 73b3cf21faSLuis R. Rodriguez 74b3cf21faSLuis R. Rodriguez if [ "$PROC_FW_IGNORE_SYSFS_FALLBACK" = "1" ]; then 75b3cf21faSLuis R. Rodriguez HAS_FW_LOADER_USER_HELPER_FALLBACK="no" 76b3cf21faSLuis R. Rodriguez HAS_FW_LOADER_USER_HELPER="no" 77b3cf21faSLuis R. Rodriguez fi 78f5a61451SLuis R. Rodriguez 79f5a61451SLuis R. Rodriguez if [ "$HAS_FW_LOADER_USER_HELPER" = "yes" ]; then 80f5a61451SLuis R. Rodriguez OLD_TIMEOUT="$(cat /sys/class/firmware/timeout)" 81f5a61451SLuis R. Rodriguez fi 82f5a61451SLuis R. Rodriguez 83f5a61451SLuis R. Rodriguez OLD_FWPATH="$(cat /sys/module/firmware_class/parameters/path)" 84f5a61451SLuis R. Rodriguez} 85f5a61451SLuis R. Rodriguez 86f5a61451SLuis R. Rodriguezverify_reqs() 87f5a61451SLuis R. Rodriguez{ 88f5a61451SLuis R. Rodriguez if [ "$TEST_REQS_FW_SYSFS_FALLBACK" = "yes" ]; then 89f5a61451SLuis R. Rodriguez if [ ! "$HAS_FW_LOADER_USER_HELPER" = "yes" ]; then 90f5a61451SLuis R. Rodriguez echo "usermode helper disabled so ignoring test" 91f5a61451SLuis R. Rodriguez exit 0 92f5a61451SLuis R. Rodriguez fi 93f5a61451SLuis R. Rodriguez fi 94f5a61451SLuis R. Rodriguez} 95f5a61451SLuis R. Rodriguez 96f5a61451SLuis R. Rodriguezsetup_tmp_file() 97f5a61451SLuis R. Rodriguez{ 98f5a61451SLuis R. Rodriguez FWPATH=$(mktemp -d) 99f5a61451SLuis R. Rodriguez FW="$FWPATH/test-firmware.bin" 100f5a61451SLuis R. Rodriguez echo "ABCD0123" >"$FW" 101f5a61451SLuis R. Rodriguez NAME=$(basename "$FW") 102f5a61451SLuis R. Rodriguez if [ "$TEST_REQS_FW_SET_CUSTOM_PATH" = "yes" ]; then 103f5a61451SLuis R. Rodriguez echo -n "$FWPATH" >/sys/module/firmware_class/parameters/path 104f5a61451SLuis R. Rodriguez fi 105f5a61451SLuis R. Rodriguez} 106f5a61451SLuis R. Rodriguez 107b3cf21faSLuis R. Rodriguezproc_set_force_sysfs_fallback() 108b3cf21faSLuis R. Rodriguez{ 109b3cf21faSLuis R. Rodriguez if [ -f $FW_FORCE_SYSFS_FALLBACK ]; then 110b3cf21faSLuis R. Rodriguez echo -n $1 > $FW_FORCE_SYSFS_FALLBACK 111b3cf21faSLuis R. Rodriguez check_setup 112b3cf21faSLuis R. Rodriguez fi 113b3cf21faSLuis R. Rodriguez} 114b3cf21faSLuis R. Rodriguez 115b3cf21faSLuis R. Rodriguezproc_set_ignore_sysfs_fallback() 116b3cf21faSLuis R. Rodriguez{ 117b3cf21faSLuis R. Rodriguez if [ -f $FW_IGNORE_SYSFS_FALLBACK ]; then 118b3cf21faSLuis R. Rodriguez echo -n $1 > $FW_IGNORE_SYSFS_FALLBACK 119b3cf21faSLuis R. Rodriguez check_setup 120b3cf21faSLuis R. Rodriguez fi 121b3cf21faSLuis R. Rodriguez} 122b3cf21faSLuis R. Rodriguez 123b3cf21faSLuis R. Rodriguezproc_restore_defaults() 124b3cf21faSLuis R. Rodriguez{ 125b3cf21faSLuis R. Rodriguez proc_set_force_sysfs_fallback 0 126b3cf21faSLuis R. Rodriguez proc_set_ignore_sysfs_fallback 0 127b3cf21faSLuis R. Rodriguez} 128b3cf21faSLuis R. Rodriguez 129f5a61451SLuis R. Rodrigueztest_finish() 130f5a61451SLuis R. Rodriguez{ 131f5a61451SLuis R. Rodriguez if [ "$HAS_FW_LOADER_USER_HELPER" = "yes" ]; then 132f5a61451SLuis R. Rodriguez echo "$OLD_TIMEOUT" >/sys/class/firmware/timeout 133f5a61451SLuis R. Rodriguez fi 134f5a61451SLuis R. Rodriguez if [ "$OLD_FWPATH" = "" ]; then 135f5a61451SLuis R. Rodriguez OLD_FWPATH=" " 136f5a61451SLuis R. Rodriguez fi 137f5a61451SLuis R. Rodriguez if [ "$TEST_REQS_FW_SET_CUSTOM_PATH" = "yes" ]; then 138f5a61451SLuis R. Rodriguez echo -n "$OLD_FWPATH" >/sys/module/firmware_class/parameters/path 139f5a61451SLuis R. Rodriguez fi 140f5a61451SLuis R. Rodriguez if [ -f $FW ]; then 141f5a61451SLuis R. Rodriguez rm -f "$FW" 142f5a61451SLuis R. Rodriguez fi 143f5a61451SLuis R. Rodriguez if [ -d $FWPATH ]; then 144f5a61451SLuis R. Rodriguez rm -rf "$FWPATH" 145f5a61451SLuis R. Rodriguez fi 146b3cf21faSLuis R. Rodriguez proc_restore_defaults 147f5a61451SLuis R. Rodriguez} 148f5a61451SLuis R. Rodriguez 149ef557787SLuis R. Rodriguezkconfig_has() 150ef557787SLuis R. Rodriguez{ 151ef557787SLuis R. Rodriguez if [ -f $PROC_CONFIG ]; then 152ef557787SLuis R. Rodriguez if zgrep -q $1 $PROC_CONFIG 2>/dev/null; then 153ef557787SLuis R. Rodriguez echo "yes" 154ef557787SLuis R. Rodriguez else 155ef557787SLuis R. Rodriguez echo "no" 156ef557787SLuis R. Rodriguez fi 157ef557787SLuis R. Rodriguez else 158ef557787SLuis R. Rodriguez # We currently don't have easy heuristics to infer this 159ef557787SLuis R. Rodriguez # so best we can do is just try to use the kernel assuming 160ef557787SLuis R. Rodriguez # you had enabled it. This matches the old behaviour. 161ef557787SLuis R. Rodriguez if [ "$1" = "CONFIG_FW_LOADER_USER_HELPER_FALLBACK=y" ]; then 162ef557787SLuis R. Rodriguez echo "yes" 163ef557787SLuis R. Rodriguez elif [ "$1" = "CONFIG_FW_LOADER_USER_HELPER=y" ]; then 164ef557787SLuis R. Rodriguez if [ -d /sys/class/firmware/ ]; then 165ef557787SLuis R. Rodriguez echo yes 166ef557787SLuis R. Rodriguez else 167ef557787SLuis R. Rodriguez echo no 168ef557787SLuis R. Rodriguez fi 169ef557787SLuis R. Rodriguez fi 170ef557787SLuis R. Rodriguez fi 171ef557787SLuis R. Rodriguez} 172