#!/bin/sh -euf TESTBINDIR=@TESTBINDIR@ fatal() { echo "Error: $1" 1>&2 exit 1 } usage() { cat 1>&2 </dev/null 2>&1 ||: rmmod nandsim >/dev/null 2>&1 ||: rmmod mtdram >/dev/null 2>&1 ||: # Below is magic to exit with correct exit code if [ "$ret" != "0" ]; then trap false EXIT else trap true EXIT fi } trap 'cleanup_handler $?' EXIT trap 'cleanup_handler 1' HUP PIPE INT QUIT TERM # Find MTD device number by pattern in /proc/mtd # Usage: find_mtd_device find_mtd_device() { printf "%s" "$(grep "$1" /proc/mtd | sed -e "s/^mtd\([0-9]\+\):.*$/\1/")" } # Just print parameters of the 'run_test' funcion in a user-friendly form. print_params() { local module="$1"; shift local size="$1"; shift local peb_size="$1"; shift local page_size="$1"; shift local vid_offs="$1"; shift local fastmap="$1"; shift printf "%s" "$module: ${size}MiB, PEB size ${peb_size}KiB, " if [ "$module" = "nandsim" ]; then printf "%s" "page size ${page_size}KiB, VID offset $vid_offs, " fi printf "%s\n" "fastmap $fastmap" } # Load mtdram with specified size and PEB size # Usage: load_mtdram # 1. Flash size is specified in MiB # 2. PEB size is specified in KiB load_mtdram() { local size="$1"; shift local peb_size="$1"; shift size="$(($size * 1024))" modprobe mtdram total_size="$size" erase_size="$peb_size" || echo "Error: cannot load $size MiB mtdram" } print_separator() { echo "======================================================================" } # Run a test on nandsim or mtdram with certain geometry. # Usage: run_test \ # # 1. Simulator type (nandsim or mtdram) # 2. Flash size is specified in MiB # 3. PEB size is specified in KiB # 4. Page size is specified in bytes (mtdram ingores this) # 5. VID header offset (mtdram ingores this) # 6. Whether fast-map should be enabled (pass "enabled" or "disabled") run_test() { local module="$1"; local size="$2"; local peb_size="$3"; local page_size="$4"; local vid_offs="$5" local fastmap="$6"; local fm_supported fm_param mtdnum print_separator # Check if fastmap is supported by UBI if modinfo ubi | grep -q fm_auto; then fm_supported="yes" else fm_supported="no" fi if [ "$fastmap" = "enabled" ]; then fm_param= elif [ "$fm_supported" = "yes" ]; then fastmap="disabled" fm_param="fm_autoconvert" else echo "Fastmap is not supported, skip" return 0 fi if [ "$module" = "nandsim" ]; then print_params "$@" $TESTBINDIR/load_nandsim.sh "$size" "$peb_size" "$page_size" || echo "Cannot load nandsim, test skipped" mtdnum="$(find_mtd_device "$nandsim_patt")" elif [ "$module" = "mtdram" ]; then print_params "$@" load_mtdram "$size" "$peb_size" mtdnum="$(find_mtd_device "$mtdram_patt")" else fatal "$module is not supported" || echo "Cannot load nandsim, test skipped" fi modprobe ubi mtd="$mtdnum,$vid_offs" $fm_param $TESTBINDIR/runubitests.sh /dev/ubi0 ||: sudo rmmod ubi sudo rmmod "$module" } if [ "$#" -lt 1 ] || [ "$1" != "run" ]; then usage exit 1 fi # Make sure neither mtdram nor nandsim are used nandsim_patt="NAND simulator" mtdram_patt="mtdram test device" if [ -e /proc/mtd ]; then ! grep -q "$nandsim_patt" /proc/mtd || fatal "the nandsim driver is already used" ! grep -q "$mtdram_patt" /proc/mtd || fatal "the mtdram driver is already used" fi rmmod ubi >/dev/null 2>&1 ||: for module in "mtdram" "nandsim"; do for fm in "enabled" "disabled"; do for vid_factor in 1 0; do print_separator print_separator print_separator echo "Test on $module, fastmap $fm, VID header offset factor $vid_factor" print_separator print_separator pg_size="512" vid_offs="$(($pg_size * $vid_factor))" run_test "$module" "16" "16" "$pg_size" "$vid_offs" "$fm" run_test "$module" "32" "16" "$pg_size" "$vid_offs" "$fm" run_test "$module" "64" "16" "$pg_size" "$vid_offs" "$fm" run_test "$module" "128" "16" "$pg_size" "$vid_offs" "$fm" run_test "$module" "256" "16" "$pg_size" "$vid_offs" "$fm" pg_size="2048" vid_offs="$(($pg_size * $vid_factor))" run_test "$module" "64" "64" "$pg_size" "$vid_offs" "$fm" run_test "$module" "128" "64" "$pg_size" "$vid_offs" "$fm" run_test "$module" "256" "64" "$pg_size" "$vid_offs" "$fm" run_test "$module" "512" "64" "$pg_size" "$vid_offs" "$fm" run_test "$module" "1024" "64" "$pg_size" "$vid_offs" "$fm" run_test "$module" "64" "128" "$pg_size" "$vid_offs" "$fm" run_test "$module" "128" "128" "$pg_size" "$vid_offs" "$fm" run_test "$module" "256" "128" "$pg_size" "$vid_offs" "$fm" run_test "$module" "512" "128" "$pg_size" "$vid_offs" "$fm" run_test "$module" "1024" "128" "$pg_size" "$vid_offs" "$fm" run_test "$module" "64" "256" "$pg_size" "$vid_offs" "$fm" run_test "$module" "128" "256" "$pg_size" "$vid_offs" "$fm" run_test "$module" "256" "256" "$pg_size" "$vid_offs" "$fm" run_test "$module" "512" "256" "$pg_size" "$vid_offs" "$fm" run_test "$module" "1024" "256" "$pg_size" "$vid_offs" "$fm" run_test "$module" "64" "512" "$pg_size" "$vid_offs" "$fm" run_test "$module" "128" "512" "$pg_size" "$vid_offs" "$fm" run_test "$module" "256" "512" "$pg_size" "$vid_offs" "$fm" run_test "$module" "512" "512" "$pg_size" "$vid_offs" "$fm" run_test "$module" "1024" "512" "$pg_size" "$vid_offs" "$fm" done done done