summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMax Krummenacher <max.oss.09@gmail.com>2016-06-13 10:15:48 +0200
committerScott Wood <oss@buserror.net>2016-06-19 19:25:12 -0500
commit1866be7d28ce807397e4aedd93f70564ac8bebc0 (patch)
treea6e789605349e79ce2fe6bb3423d043566ee2ca6
parente1c29086d58f619423f0648748d0678af28f9871 (diff)
downloadblackbird-obmc-uboot-1866be7d28ce807397e4aedd93f70564ac8bebc0.tar.gz
blackbird-obmc-uboot-1866be7d28ce807397e4aedd93f70564ac8bebc0.zip
nand: extend nand torture
nand torture currently works on exactly one nand block which is specified by giving the byteoffset to the beginning of the block. Extend this by allowing for a second parameter specifying the byte size to be tested. e.g. ==> nand torture 1000000 NAND torture: device 0 offset 0x1000000 size 0x20000 (block size 0x20000) Passed: 1, failed: 0 ==> nand torture 1000000 40000 NAND torture: device 0 offset 0x1000000 size 0x40000 (block size 0x20000) Passed: 2, failed: 0 Signed-off-by: Max Krummenacher <max.krummenacher@toradex.com> Reviewed-by: Benoît Thébaudeau <benoit.thebaudeau.dev@gmail.com> [scottwood: fix usage to show size as optional, and add misssing braces] Signed-off-by: Scott Wood <oss@buserror.net>
-rw-r--r--cmd/nand.c41
-rw-r--r--doc/README.nand6
2 files changed, 40 insertions, 7 deletions
diff --git a/cmd/nand.c b/cmd/nand.c
index 583a18f341..ffdeea41a5 100644
--- a/cmd/nand.c
+++ b/cmd/nand.c
@@ -647,6 +647,9 @@ static int do_nand(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
#ifdef CONFIG_CMD_NAND_TORTURE
if (strcmp(cmd, "torture") == 0) {
+ loff_t endoff;
+ unsigned int failed = 0, passed = 0;
+
if (argc < 3)
goto usage;
@@ -655,12 +658,37 @@ static int do_nand(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
return 1;
}
- printf("\nNAND torture: device %d offset 0x%llx size 0x%x\n",
- dev, off, mtd->erasesize);
- ret = nand_torture(mtd, off);
- printf(" %s\n", ret ? "Failed" : "Passed");
+ size = mtd->erasesize;
+ if (argc > 3) {
+ if (!str2off(argv[3], &size)) {
+ puts("Size is not a valid number\n");
+ return 1;
+ }
+ }
- return ret == 0 ? 0 : 1;
+ endoff = off + size;
+ if (endoff > mtd->size) {
+ puts("Arguments beyond end of NAND\n");
+ return 1;
+ }
+
+ off = round_down(off, mtd->erasesize);
+ endoff = round_up(endoff, mtd->erasesize);
+ size = endoff - off;
+ printf("\nNAND torture: device %d offset 0x%llx size 0x%llx (block size 0x%x)\n",
+ dev, off, size, mtd->erasesize);
+ while (off < endoff) {
+ ret = nand_torture(mtd, off);
+ if (ret) {
+ failed++;
+ printf(" block at 0x%llx failed\n", off);
+ } else {
+ passed++;
+ }
+ off += mtd->erasesize;
+ }
+ printf(" Passed: %u, failed: %u\n", passed, failed);
+ return failed != 0;
}
#endif
@@ -775,7 +803,8 @@ static char nand_help_text[] =
"nand bad - show bad blocks\n"
"nand dump[.oob] off - dump page\n"
#ifdef CONFIG_CMD_NAND_TORTURE
- "nand torture off - torture block at offset\n"
+ "nand torture off - torture one block at offset\n"
+ "nand torture off [size] - torture blocks from off to off+size\n"
#endif
"nand scrub [-y] off size | scrub.part partition | scrub.chip\n"
" really clean NAND erasing bad blocks (UNSAFE)\n"
diff --git a/doc/README.nand b/doc/README.nand
index 96ffc48940..4ecf9dee65 100644
--- a/doc/README.nand
+++ b/doc/README.nand
@@ -307,7 +307,7 @@ Miscellaneous and testing commands:
DANGEROUS!!! Factory set bad blocks will be lost. Use only
to remove artificial bad blocks created with the "markbad" command.
- "torture offset"
+ "torture offset [size]"
Torture block to determine if it is still reliable.
Enabled by the CONFIG_CMD_NAND_TORTURE configuration option.
This command returns 0 if the block is still reliable, else 1.
@@ -324,6 +324,10 @@ Miscellaneous and testing commands:
automate actions following a nand->write() error. This would e.g. be required
in order to program or update safely firmware to NAND, especially for the UBI
part of such firmware.
+ Optionally, a second parameter size can be given to test multiple blocks with
+ one call. If size is not a multiple of the NAND's erase size, then the block
+ that contains offset + size will be tested in full. If used with size, this
+ command returns 0 if all tested blocks have been found reliable, else 1.
NAND locking command (for chips with active LOCKPRE pin)
OpenPOWER on IntegriCloud