Path: blob/master/tools/testing/selftests/firmware/fw_lib.sh
26285 views
#!/bin/bash1# SPDX-License-Identifier: GPL-2.023# Library of helpers for test scripts.4set -e56DIR=/sys/devices/virtual/misc/test_firmware78PROC_CONFIG="/proc/config.gz"9TEST_DIR=$(dirname $0)1011# We need to load a different file to test request_firmware_into_buf12# I believe the issue is firmware loaded cached vs. non-cached13# with same filename is bungled.14# To reproduce rename this to test-firmware.bin15TEST_FIRMWARE_INTO_BUF_FILENAME=test-firmware-into-buf.bin1617# Kselftest framework requirement - SKIP code is 4.18ksft_skip=41920print_reqs_exit()21{22echo "You must have the following enabled in your kernel:" >&223cat $TEST_DIR/config >&224exit $ksft_skip25}2627test_modprobe()28{29if [ ! -d $DIR ]; then30print_reqs_exit31fi32}3334check_mods()35{36local uid=$(id -u)37if [ $uid -ne 0 ]; then38echo "skip all tests: must be run as root" >&239exit $ksft_skip40fi4142trap "test_modprobe" EXIT43if [ ! -d $DIR ]; then44modprobe test_firmware45fi46if [ ! -f $PROC_CONFIG ]; then47if modprobe configs 2>/dev/null; then48echo "Loaded configs module"49if [ ! -f $PROC_CONFIG ]; then50echo "You must have the following enabled in your kernel:" >&251cat $TEST_DIR/config >&252echo "Resorting to old heuristics" >&253fi54else55echo "Failed to load configs module, using old heuristics" >&256fi57fi58}5960check_setup()61{62HAS_FW_LOADER_USER_HELPER="$(kconfig_has CONFIG_FW_LOADER_USER_HELPER=y)"63HAS_FW_LOADER_USER_HELPER_FALLBACK="$(kconfig_has CONFIG_FW_LOADER_USER_HELPER_FALLBACK=y)"64HAS_FW_LOADER_COMPRESS_XZ="$(kconfig_has CONFIG_FW_LOADER_COMPRESS_XZ=y)"65HAS_FW_LOADER_COMPRESS_ZSTD="$(kconfig_has CONFIG_FW_LOADER_COMPRESS_ZSTD=y)"66HAS_FW_UPLOAD="$(kconfig_has CONFIG_FW_UPLOAD=y)"67PROC_FW_IGNORE_SYSFS_FALLBACK="0"68PROC_FW_FORCE_SYSFS_FALLBACK="0"6970if [ -z $PROC_SYS_DIR ]; then71PROC_SYS_DIR="/proc/sys/kernel"72fi7374FW_PROC="${PROC_SYS_DIR}/firmware_config"75FW_FORCE_SYSFS_FALLBACK="$FW_PROC/force_sysfs_fallback"76FW_IGNORE_SYSFS_FALLBACK="$FW_PROC/ignore_sysfs_fallback"7778if [ -f $FW_FORCE_SYSFS_FALLBACK ]; then79PROC_FW_FORCE_SYSFS_FALLBACK="$(cat $FW_FORCE_SYSFS_FALLBACK)"80fi8182if [ -f $FW_IGNORE_SYSFS_FALLBACK ]; then83PROC_FW_IGNORE_SYSFS_FALLBACK="$(cat $FW_IGNORE_SYSFS_FALLBACK)"84fi8586if [ "$PROC_FW_FORCE_SYSFS_FALLBACK" = "1" ]; then87HAS_FW_LOADER_USER_HELPER="yes"88HAS_FW_LOADER_USER_HELPER_FALLBACK="yes"89fi9091if [ "$PROC_FW_IGNORE_SYSFS_FALLBACK" = "1" ]; then92HAS_FW_LOADER_USER_HELPER_FALLBACK="no"93HAS_FW_LOADER_USER_HELPER="no"94fi9596if [ "$HAS_FW_LOADER_USER_HELPER" = "yes" ]; then97OLD_TIMEOUT="$(cat /sys/class/firmware/timeout)"98fi99100OLD_FWPATH="$(cat /sys/module/firmware_class/parameters/path)"101102if [ "$HAS_FW_LOADER_COMPRESS_XZ" = "yes" ]; then103if ! which xz 2> /dev/null > /dev/null; then104HAS_FW_LOADER_COMPRESS_XZ=""105fi106fi107if [ "$HAS_FW_LOADER_COMPRESS_ZSTD" = "yes" ]; then108if ! which zstd 2> /dev/null > /dev/null; then109HAS_FW_LOADER_COMPRESS_ZSTD=""110fi111fi112}113114verify_reqs()115{116if [ "$TEST_REQS_FW_SYSFS_FALLBACK" = "yes" ]; then117if [ ! "$HAS_FW_LOADER_USER_HELPER" = "yes" ]; then118echo "usermode helper disabled so ignoring test"119exit 0120fi121fi122if [ "$TEST_REQS_FW_UPLOAD" = "yes" ]; then123if [ ! "$HAS_FW_UPLOAD" = "yes" ]; then124echo "firmware upload disabled so ignoring test"125exit 0126fi127fi128}129130setup_tmp_file()131{132FWPATH=$(mktemp -d)133FW="$FWPATH/test-firmware.bin"134echo "ABCD0123" >"$FW"135FW_INTO_BUF="$FWPATH/$TEST_FIRMWARE_INTO_BUF_FILENAME"136echo "EFGH4567" >"$FW_INTO_BUF"137NAME=$(basename "$FW")138if [ "$TEST_REQS_FW_SET_CUSTOM_PATH" = "yes" ]; then139echo -n "$FWPATH" >/sys/module/firmware_class/parameters/path140fi141}142143__setup_random_file()144{145RANDOM_FILE_PATH="$(mktemp -p $FWPATH)"146# mktemp says dry-run -n is unsafe, so...147if [[ "$1" = "fake" ]]; then148rm -rf $RANDOM_FILE_PATH149sync150else151echo "ABCD0123" >"$RANDOM_FILE_PATH"152fi153echo $RANDOM_FILE_PATH154}155156setup_random_file()157{158echo $(__setup_random_file)159}160161setup_random_file_fake()162{163echo $(__setup_random_file fake)164}165166proc_set_force_sysfs_fallback()167{168if [ -f $FW_FORCE_SYSFS_FALLBACK ]; then169echo -n $1 > $FW_FORCE_SYSFS_FALLBACK170check_setup171fi172}173174proc_set_ignore_sysfs_fallback()175{176if [ -f $FW_IGNORE_SYSFS_FALLBACK ]; then177echo -n $1 > $FW_IGNORE_SYSFS_FALLBACK178check_setup179fi180}181182proc_restore_defaults()183{184proc_set_force_sysfs_fallback 0185proc_set_ignore_sysfs_fallback 0186}187188test_finish()189{190if [ "$HAS_FW_LOADER_USER_HELPER" = "yes" ]; then191echo "$OLD_TIMEOUT" >/sys/class/firmware/timeout192fi193if [ "$TEST_REQS_FW_SET_CUSTOM_PATH" = "yes" ]; then194if [ "$OLD_FWPATH" = "" ]; then195# A zero-length write won't work; write a null byte196printf '\000' >/sys/module/firmware_class/parameters/path197else198echo -n "$OLD_FWPATH" >/sys/module/firmware_class/parameters/path199fi200fi201if [ -f $FW ]; then202rm -f "$FW"203fi204if [ -f $FW_INTO_BUF ]; then205rm -f "$FW_INTO_BUF"206fi207if [ -d $FWPATH ]; then208rm -rf "$FWPATH"209fi210proc_restore_defaults211}212213kconfig_has()214{215if [ -f $PROC_CONFIG ]; then216if zgrep -q $1 $PROC_CONFIG 2>/dev/null; then217echo "yes"218else219echo "no"220fi221else222# We currently don't have easy heuristics to infer this223# so best we can do is just try to use the kernel assuming224# you had enabled it. This matches the old behaviour.225if [ "$1" = "CONFIG_FW_LOADER_USER_HELPER_FALLBACK=y" ]; then226echo "yes"227elif [ "$1" = "CONFIG_FW_LOADER_USER_HELPER=y" ]; then228if [ -d /sys/class/firmware/ ]; then229echo yes230else231echo no232fi233fi234fi235}236237238