Use the nfit_test firmware-update+activation emulation to validate the operation of the kernel sysfs attributes, libndctl, ndctl update-firmware, and ndctl activate-firmware.
Signed-off-by: Dan Williams <[email protected]> --- test/firmware-update.sh | 50 ++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 45 insertions(+), 5 deletions(-) diff --git a/test/firmware-update.sh b/test/firmware-update.sh index ed7d7e53772c..098dd92b4eb3 100755 --- a/test/firmware-update.sh +++ b/test/firmware-update.sh @@ -22,23 +22,63 @@ reset() detect() { - dev=$($NDCTL list -b $NFIT_TEST_BUS0 -D | jq .[0].dev | tr -d '"') - [ -n "$dev" ] || err "$LINENO" + $NDCTL wait-scrub $NFIT_TEST_BUS0 + fwa=$($NDCTL list -b $NFIT_TEST_BUS0 -F | jq -r '.[0].firmware.activate_method') + [ $fwa = "suspend" ] || err "$LINENO" + count=$($NDCTL list -b $NFIT_TEST_BUS0 -D | jq length) + [ $((count)) -eq 4 ] || err "$LINENO" } do_tests() { + # create a dummy image file, try to update all 4 dimms on + # nfit_test.0, validate that all get staged, validate that all + # but one get armed relative to an overflow error. truncate -s 196608 $image - $NDCTL update-firmware -f $image $dev + json=$($NDCTL update-firmware -b $NFIT_TEST_BUS0 -f $image all) + count=$(jq 'map(select(.firmware.activate_state == "armed")) | length' <<< $json) + [ $((count)) -eq 3 ] || err "$LINENO" + count=$(jq 'map(select(.firmware.activate_state == "idle")) | length' <<< $json) + [ $((count)) -eq 1 ] || err "$LINENO" + + # validate that the overflow dimm can be force armed + dev=$(jq -r '.[] | select(.firmware.activate_state == "idle").dev' <<< $json) + json=$($NDCTL update-firmware -b $NFIT_TEST_BUS0 $dev -A --force) + state=$(jq -r '.[0].firmware.activate_state' <<< $json) + [ $state = "armed" ] || err "$LINENO" + + # validate that the bus indicates overflow + fwa=$($NDCTL list -b $NFIT_TEST_BUS0 -F | jq -r '.[0].firmware.activate_state') + [ $fwa = "overflow" ] || err "$LINENO" + + # validate that all devices can be disarmed, and the bus goes idle + json=$($NDCTL update-firmware -b $NFIT_TEST_BUS0 -D all) + count=$(jq 'map(select(.firmware.activate_state == "idle")) | length' <<< $json) + [ $((count)) -eq 4 ] || err "$LINENO" + fwa=$($NDCTL list -b $NFIT_TEST_BUS0 -F | jq -r '.[0].firmware.activate_state') + [ $fwa = "idle" ] || err "$LINENO" + + # re-arm all DIMMs + json=$($NDCTL update-firmware -b $NFIT_TEST_BUS0 -A --force all) + count=$(jq 'map(select(.firmware.activate_state == "armed")) | length' <<< $json) + [ $((count)) -eq 4 ] || err "$LINENO" + + # check that unforced activation fails + [ $NDCTL activate-firmware -b $NFIT_TEST_BUS0 ] && err "$LINENO" + + # force activation + json=$($NDCTL activate-firmware $NFIT_TEST_BUS0 --force) + idle_count=$(jq '.[].dimms | map(select(.firmware.activate_state == "idle")) | length' <<< $json) + busy_count=$(jq '.[].dimms | map(select(.firmware.activate_state == "busy")) | length' <<< $json) + [ $((idle_count)) -eq 4 -o $((busy_count)) -eq 4 ] || err "$LINENO" } check_min_kver "4.16" || do_skip "may lack firmware update test handling" modprobe nfit_test -rc=1 reset -rc=2 detect +rc=1 do_tests rm -f $image _cleanup _______________________________________________ Linux-nvdimm mailing list -- [email protected] To unsubscribe send an email to [email protected]
