forked from Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
223 lines
4.9 KiB
223 lines
4.9 KiB
#!/bin/bash |
|
# SPDX-License-Identifier: GPL-2.0 |
|
|
|
# Library of helpers for test scripts. |
|
set -e |
|
|
|
DIR=/sys/devices/virtual/misc/test_firmware |
|
|
|
PROC_CONFIG="/proc/config.gz" |
|
TEST_DIR=$(dirname $0) |
|
|
|
# We need to load a different file to test request_firmware_into_buf |
|
# I believe the issue is firmware loaded cached vs. non-cached |
|
# with same filename is bungled. |
|
# To reproduce rename this to test-firmware.bin |
|
TEST_FIRMWARE_INTO_BUF_FILENAME=test-firmware-into-buf.bin |
|
|
|
# Kselftest framework requirement - SKIP code is 4. |
|
ksft_skip=4 |
|
|
|
print_reqs_exit() |
|
{ |
|
echo "You must have the following enabled in your kernel:" >&2 |
|
cat $TEST_DIR/config >&2 |
|
exit $ksft_skip |
|
} |
|
|
|
test_modprobe() |
|
{ |
|
if [ ! -d $DIR ]; then |
|
print_reqs_exit |
|
fi |
|
} |
|
|
|
check_mods() |
|
{ |
|
local uid=$(id -u) |
|
if [ $uid -ne 0 ]; then |
|
echo "skip all tests: must be run as root" >&2 |
|
exit $ksft_skip |
|
fi |
|
|
|
trap "test_modprobe" EXIT |
|
if [ ! -d $DIR ]; then |
|
modprobe test_firmware |
|
fi |
|
if [ ! -f $PROC_CONFIG ]; then |
|
if modprobe configs 2>/dev/null; then |
|
echo "Loaded configs module" |
|
if [ ! -f $PROC_CONFIG ]; then |
|
echo "You must have the following enabled in your kernel:" >&2 |
|
cat $TEST_DIR/config >&2 |
|
echo "Resorting to old heuristics" >&2 |
|
fi |
|
else |
|
echo "Failed to load configs module, using old heuristics" >&2 |
|
fi |
|
fi |
|
} |
|
|
|
check_setup() |
|
{ |
|
HAS_FW_LOADER_USER_HELPER="$(kconfig_has CONFIG_FW_LOADER_USER_HELPER=y)" |
|
HAS_FW_LOADER_USER_HELPER_FALLBACK="$(kconfig_has CONFIG_FW_LOADER_USER_HELPER_FALLBACK=y)" |
|
HAS_FW_LOADER_COMPRESS="$(kconfig_has CONFIG_FW_LOADER_COMPRESS=y)" |
|
PROC_FW_IGNORE_SYSFS_FALLBACK="0" |
|
PROC_FW_FORCE_SYSFS_FALLBACK="0" |
|
|
|
if [ -z $PROC_SYS_DIR ]; then |
|
PROC_SYS_DIR="/proc/sys/kernel" |
|
fi |
|
|
|
FW_PROC="${PROC_SYS_DIR}/firmware_config" |
|
FW_FORCE_SYSFS_FALLBACK="$FW_PROC/force_sysfs_fallback" |
|
FW_IGNORE_SYSFS_FALLBACK="$FW_PROC/ignore_sysfs_fallback" |
|
|
|
if [ -f $FW_FORCE_SYSFS_FALLBACK ]; then |
|
PROC_FW_FORCE_SYSFS_FALLBACK="$(cat $FW_FORCE_SYSFS_FALLBACK)" |
|
fi |
|
|
|
if [ -f $FW_IGNORE_SYSFS_FALLBACK ]; then |
|
PROC_FW_IGNORE_SYSFS_FALLBACK="$(cat $FW_IGNORE_SYSFS_FALLBACK)" |
|
fi |
|
|
|
if [ "$PROC_FW_FORCE_SYSFS_FALLBACK" = "1" ]; then |
|
HAS_FW_LOADER_USER_HELPER="yes" |
|
HAS_FW_LOADER_USER_HELPER_FALLBACK="yes" |
|
fi |
|
|
|
if [ "$PROC_FW_IGNORE_SYSFS_FALLBACK" = "1" ]; then |
|
HAS_FW_LOADER_USER_HELPER_FALLBACK="no" |
|
HAS_FW_LOADER_USER_HELPER="no" |
|
fi |
|
|
|
if [ "$HAS_FW_LOADER_USER_HELPER" = "yes" ]; then |
|
OLD_TIMEOUT="$(cat /sys/class/firmware/timeout)" |
|
fi |
|
|
|
OLD_FWPATH="$(cat /sys/module/firmware_class/parameters/path)" |
|
|
|
if [ "$HAS_FW_LOADER_COMPRESS" = "yes" ]; then |
|
if ! which xz 2> /dev/null > /dev/null; then |
|
HAS_FW_LOADER_COMPRESS="" |
|
fi |
|
fi |
|
} |
|
|
|
verify_reqs() |
|
{ |
|
if [ "$TEST_REQS_FW_SYSFS_FALLBACK" = "yes" ]; then |
|
if [ ! "$HAS_FW_LOADER_USER_HELPER" = "yes" ]; then |
|
echo "usermode helper disabled so ignoring test" |
|
exit 0 |
|
fi |
|
fi |
|
} |
|
|
|
setup_tmp_file() |
|
{ |
|
FWPATH=$(mktemp -d) |
|
FW="$FWPATH/test-firmware.bin" |
|
echo "ABCD0123" >"$FW" |
|
FW_INTO_BUF="$FWPATH/$TEST_FIRMWARE_INTO_BUF_FILENAME" |
|
echo "EFGH4567" >"$FW_INTO_BUF" |
|
NAME=$(basename "$FW") |
|
if [ "$TEST_REQS_FW_SET_CUSTOM_PATH" = "yes" ]; then |
|
echo -n "$FWPATH" >/sys/module/firmware_class/parameters/path |
|
fi |
|
} |
|
|
|
__setup_random_file() |
|
{ |
|
RANDOM_FILE_PATH="$(mktemp -p $FWPATH)" |
|
# mktemp says dry-run -n is unsafe, so... |
|
if [[ "$1" = "fake" ]]; then |
|
rm -rf $RANDOM_FILE_PATH |
|
sync |
|
else |
|
echo "ABCD0123" >"$RANDOM_FILE_PATH" |
|
fi |
|
echo $RANDOM_FILE_PATH |
|
} |
|
|
|
setup_random_file() |
|
{ |
|
echo $(__setup_random_file) |
|
} |
|
|
|
setup_random_file_fake() |
|
{ |
|
echo $(__setup_random_file fake) |
|
} |
|
|
|
proc_set_force_sysfs_fallback() |
|
{ |
|
if [ -f $FW_FORCE_SYSFS_FALLBACK ]; then |
|
echo -n $1 > $FW_FORCE_SYSFS_FALLBACK |
|
check_setup |
|
fi |
|
} |
|
|
|
proc_set_ignore_sysfs_fallback() |
|
{ |
|
if [ -f $FW_IGNORE_SYSFS_FALLBACK ]; then |
|
echo -n $1 > $FW_IGNORE_SYSFS_FALLBACK |
|
check_setup |
|
fi |
|
} |
|
|
|
proc_restore_defaults() |
|
{ |
|
proc_set_force_sysfs_fallback 0 |
|
proc_set_ignore_sysfs_fallback 0 |
|
} |
|
|
|
test_finish() |
|
{ |
|
if [ "$HAS_FW_LOADER_USER_HELPER" = "yes" ]; then |
|
echo "$OLD_TIMEOUT" >/sys/class/firmware/timeout |
|
fi |
|
if [ "$TEST_REQS_FW_SET_CUSTOM_PATH" = "yes" ]; then |
|
if [ "$OLD_FWPATH" = "" ]; then |
|
# A zero-length write won't work; write a null byte |
|
printf '\000' >/sys/module/firmware_class/parameters/path |
|
else |
|
echo -n "$OLD_FWPATH" >/sys/module/firmware_class/parameters/path |
|
fi |
|
fi |
|
if [ -f $FW ]; then |
|
rm -f "$FW" |
|
fi |
|
if [ -f $FW_INTO_BUF ]; then |
|
rm -f "$FW_INTO_BUF" |
|
fi |
|
if [ -d $FWPATH ]; then |
|
rm -rf "$FWPATH" |
|
fi |
|
proc_restore_defaults |
|
} |
|
|
|
kconfig_has() |
|
{ |
|
if [ -f $PROC_CONFIG ]; then |
|
if zgrep -q $1 $PROC_CONFIG 2>/dev/null; then |
|
echo "yes" |
|
else |
|
echo "no" |
|
fi |
|
else |
|
# We currently don't have easy heuristics to infer this |
|
# so best we can do is just try to use the kernel assuming |
|
# you had enabled it. This matches the old behaviour. |
|
if [ "$1" = "CONFIG_FW_LOADER_USER_HELPER_FALLBACK=y" ]; then |
|
echo "yes" |
|
elif [ "$1" = "CONFIG_FW_LOADER_USER_HELPER=y" ]; then |
|
if [ -d /sys/class/firmware/ ]; then |
|
echo yes |
|
else |
|
echo no |
|
fi |
|
fi |
|
fi |
|
}
|
|
|