@@ -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
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 <dan.j.williams@intel.com> --- test/firmware-update.sh | 50 ++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 45 insertions(+), 5 deletions(-)