Hi Max, On Mon, Jun 13, 2016 at 10:15 AM, Max Krummenacher <max.oss...@gmail.com> wrote: > 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.krummenac...@toradex.com> > > > --- > > Changes in v3: > - findings from Benoît: > - aligned offset and endoffset to nand blocks > - checked nand area tested against nand size > - print actual used values after aligning > - clarifications to doc/README.nand > > Changes in v2: > - findings from Benoît: > - change interface to be offset/size > - change the output to include both 'size tested' and 'nand block size' > - updated doc/README.nand accordingly > - I did not implement the suggestion to move the code into the > nand_torture() function. Likely one uses the extended functionality > only during HW bringup interactively. If one would want to test > multiple blocks from code one would also want to know the testresult > of each individual block rather than only having a return parameter > indicating a 'all good' or 'at least one block failed'. > > cmd/nand.c | 40 ++++++++++++++++++++++++++++++++++------ > doc/README.nand | 6 +++++- > 2 files changed, 39 insertions(+), 7 deletions(-) > > diff --git a/cmd/nand.c b/cmd/nand.c > index 583a18f..6d239a3 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,36 @@ 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 +802,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 96ffc48..4ecf9de 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) > -- > 2.5.5 >
Reviewed-by: Benoît Thébaudeau <benoit.thebaudeau....@gmail.com> Best regards, Benoît _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot