237 lines · bash
1#!/bin/bash2# SPDX-License-Identifier: GPL-2.03 4# Library of helpers for test scripts.5set -e6 7DIR=/sys/devices/virtual/misc/test_firmware8 9PROC_CONFIG="/proc/config.gz"10TEST_DIR=$(dirname $0)11 12# We need to load a different file to test request_firmware_into_buf13# I believe the issue is firmware loaded cached vs. non-cached14# with same filename is bungled.15# To reproduce rename this to test-firmware.bin16TEST_FIRMWARE_INTO_BUF_FILENAME=test-firmware-into-buf.bin17 18# Kselftest framework requirement - SKIP code is 4.19ksft_skip=420 21print_reqs_exit()22{23 echo "You must have the following enabled in your kernel:" >&224 cat $TEST_DIR/config >&225 exit $ksft_skip26}27 28test_modprobe()29{30 if [ ! -d $DIR ]; then31 print_reqs_exit32 fi33}34 35check_mods()36{37 local uid=$(id -u)38 if [ $uid -ne 0 ]; then39 echo "skip all tests: must be run as root" >&240 exit $ksft_skip41 fi42 43 trap "test_modprobe" EXIT44 if [ ! -d $DIR ]; then45 modprobe test_firmware46 fi47 if [ ! -f $PROC_CONFIG ]; then48 if modprobe configs 2>/dev/null; then49 echo "Loaded configs module"50 if [ ! -f $PROC_CONFIG ]; then51 echo "You must have the following enabled in your kernel:" >&252 cat $TEST_DIR/config >&253 echo "Resorting to old heuristics" >&254 fi55 else56 echo "Failed to load configs module, using old heuristics" >&257 fi58 fi59}60 61check_setup()62{63 HAS_FW_LOADER_USER_HELPER="$(kconfig_has CONFIG_FW_LOADER_USER_HELPER=y)"64 HAS_FW_LOADER_USER_HELPER_FALLBACK="$(kconfig_has CONFIG_FW_LOADER_USER_HELPER_FALLBACK=y)"65 HAS_FW_LOADER_COMPRESS_XZ="$(kconfig_has CONFIG_FW_LOADER_COMPRESS_XZ=y)"66 HAS_FW_LOADER_COMPRESS_ZSTD="$(kconfig_has CONFIG_FW_LOADER_COMPRESS_ZSTD=y)"67 HAS_FW_UPLOAD="$(kconfig_has CONFIG_FW_UPLOAD=y)"68 PROC_FW_IGNORE_SYSFS_FALLBACK="0"69 PROC_FW_FORCE_SYSFS_FALLBACK="0"70 71 if [ -z $PROC_SYS_DIR ]; then72 PROC_SYS_DIR="/proc/sys/kernel"73 fi74 75 FW_PROC="${PROC_SYS_DIR}/firmware_config"76 FW_FORCE_SYSFS_FALLBACK="$FW_PROC/force_sysfs_fallback"77 FW_IGNORE_SYSFS_FALLBACK="$FW_PROC/ignore_sysfs_fallback"78 79 if [ -f $FW_FORCE_SYSFS_FALLBACK ]; then80 PROC_FW_FORCE_SYSFS_FALLBACK="$(cat $FW_FORCE_SYSFS_FALLBACK)"81 fi82 83 if [ -f $FW_IGNORE_SYSFS_FALLBACK ]; then84 PROC_FW_IGNORE_SYSFS_FALLBACK="$(cat $FW_IGNORE_SYSFS_FALLBACK)"85 fi86 87 if [ "$PROC_FW_FORCE_SYSFS_FALLBACK" = "1" ]; then88 HAS_FW_LOADER_USER_HELPER="yes"89 HAS_FW_LOADER_USER_HELPER_FALLBACK="yes"90 fi91 92 if [ "$PROC_FW_IGNORE_SYSFS_FALLBACK" = "1" ]; then93 HAS_FW_LOADER_USER_HELPER_FALLBACK="no"94 HAS_FW_LOADER_USER_HELPER="no"95 fi96 97 if [ "$HAS_FW_LOADER_USER_HELPER" = "yes" ]; then98 OLD_TIMEOUT="$(cat /sys/class/firmware/timeout)"99 fi100 101 OLD_FWPATH="$(cat /sys/module/firmware_class/parameters/path)"102 103 if [ "$HAS_FW_LOADER_COMPRESS_XZ" = "yes" ]; then104 if ! which xz 2> /dev/null > /dev/null; then105 HAS_FW_LOADER_COMPRESS_XZ=""106 fi107 fi108 if [ "$HAS_FW_LOADER_COMPRESS_ZSTD" = "yes" ]; then109 if ! which zstd 2> /dev/null > /dev/null; then110 HAS_FW_LOADER_COMPRESS_ZSTD=""111 fi112 fi113}114 115verify_reqs()116{117 if [ "$TEST_REQS_FW_SYSFS_FALLBACK" = "yes" ]; then118 if [ ! "$HAS_FW_LOADER_USER_HELPER" = "yes" ]; then119 echo "usermode helper disabled so ignoring test"120 exit 0121 fi122 fi123 if [ "$TEST_REQS_FW_UPLOAD" = "yes" ]; then124 if [ ! "$HAS_FW_UPLOAD" = "yes" ]; then125 echo "firmware upload disabled so ignoring test"126 exit 0127 fi128 fi129}130 131setup_tmp_file()132{133 FWPATH=$(mktemp -d)134 FW="$FWPATH/test-firmware.bin"135 echo "ABCD0123" >"$FW"136 FW_INTO_BUF="$FWPATH/$TEST_FIRMWARE_INTO_BUF_FILENAME"137 echo "EFGH4567" >"$FW_INTO_BUF"138 NAME=$(basename "$FW")139 if [ "$TEST_REQS_FW_SET_CUSTOM_PATH" = "yes" ]; then140 echo -n "$FWPATH" >/sys/module/firmware_class/parameters/path141 fi142}143 144__setup_random_file()145{146 RANDOM_FILE_PATH="$(mktemp -p $FWPATH)"147 # mktemp says dry-run -n is unsafe, so...148 if [[ "$1" = "fake" ]]; then149 rm -rf $RANDOM_FILE_PATH150 sync151 else152 echo "ABCD0123" >"$RANDOM_FILE_PATH"153 fi154 echo $RANDOM_FILE_PATH155}156 157setup_random_file()158{159 echo $(__setup_random_file)160}161 162setup_random_file_fake()163{164 echo $(__setup_random_file fake)165}166 167proc_set_force_sysfs_fallback()168{169 if [ -f $FW_FORCE_SYSFS_FALLBACK ]; then170 echo -n $1 > $FW_FORCE_SYSFS_FALLBACK171 check_setup172 fi173}174 175proc_set_ignore_sysfs_fallback()176{177 if [ -f $FW_IGNORE_SYSFS_FALLBACK ]; then178 echo -n $1 > $FW_IGNORE_SYSFS_FALLBACK179 check_setup180 fi181}182 183proc_restore_defaults()184{185 proc_set_force_sysfs_fallback 0186 proc_set_ignore_sysfs_fallback 0187}188 189test_finish()190{191 if [ "$HAS_FW_LOADER_USER_HELPER" = "yes" ]; then192 echo "$OLD_TIMEOUT" >/sys/class/firmware/timeout193 fi194 if [ "$TEST_REQS_FW_SET_CUSTOM_PATH" = "yes" ]; then195 if [ "$OLD_FWPATH" = "" ]; then196 # A zero-length write won't work; write a null byte197 printf '\000' >/sys/module/firmware_class/parameters/path198 else199 echo -n "$OLD_FWPATH" >/sys/module/firmware_class/parameters/path200 fi201 fi202 if [ -f $FW ]; then203 rm -f "$FW"204 fi205 if [ -f $FW_INTO_BUF ]; then206 rm -f "$FW_INTO_BUF"207 fi208 if [ -d $FWPATH ]; then209 rm -rf "$FWPATH"210 fi211 proc_restore_defaults212}213 214kconfig_has()215{216 if [ -f $PROC_CONFIG ]; then217 if zgrep -q $1 $PROC_CONFIG 2>/dev/null; then218 echo "yes"219 else220 echo "no"221 fi222 else223 # We currently don't have easy heuristics to infer this224 # so best we can do is just try to use the kernel assuming225 # you had enabled it. This matches the old behaviour.226 if [ "$1" = "CONFIG_FW_LOADER_USER_HELPER_FALLBACK=y" ]; then227 echo "yes"228 elif [ "$1" = "CONFIG_FW_LOADER_USER_HELPER=y" ]; then229 if [ -d /sys/class/firmware/ ]; then230 echo yes231 else232 echo no233 fi234 fi235 fi236}237