Re: [U-Boot] [PATCH v2 2/2] nand: extend nand torture
Hi Max, On Thu, Jun 9, 2016 at 3:19 PM, Max Krummenacher wrote: > Hi Benoît, > > 2016-06-09 1:41 GMT+02:00 Benoît Thébaudeau : >> On Tue, Jun 7, 2016 at 1:46 PM, Max Krummenacher >> wrote: >>> diff --git a/cmd/nand.c b/cmd/nand.c >>> index 583a18f..8ade5e2 100644 >>> --- a/cmd/nand.c >>> +++ b/cmd/nand.c [...] >> +if (argc > 3 && !str2off(argv[3], &size)) { > > Here I prefer having that in 2 if() as the stuff tested is only loosely > related. Usually, we keep things as compact as possible, which also limits the number of indentation levels, but that's fine if you prefer otherwise. I don't think it's a strong rule. > I guess keeping it like this would also require parantheses around (argc > 3). No: `>` has higher precedence than `&&`. > Will revert to two if's in v3 > >> +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", > > patman.py/checkpatch.py warn here to keep quoted strings on one line > even when the line length exceeds 80 characters. > Will remove the line break / string concatenation for v3. Normally, this rule is for grep-ability. Here, it's more complicated with the '%' in-between, but it's still makes sense with a regular expression, so OK. >> +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 > > Apart from above comments I merged your proposal. > >>> >>> @@ -775,7 +792,8 @@ static char nand_help_text[] = > ... >>> diff --git a/doc/README.nand b/doc/README.nand >>> index 96ffc48..5136f31 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 >> >> "Optionally," >> >>> + one call. If size is not a multiple of the NAND's erasesize then the >>> block >> >> "erase size, then" >> >>> + which contains offset + size will be tested in full. If used with size >>> this >> >> "that", not "which". >> "size, this" >> > > Agreed. Will add that to v3. Thanks. Best regards, Benoît ___ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot
Re: [U-Boot] [PATCH v2 2/2] nand: extend nand torture
Hi Benoît, 2016-06-09 1:41 GMT+02:00 Benoît Thébaudeau : > Hi Max, > > On Tue, Jun 7, 2016 at 1:46 PM, Max Krummenacher wrote: >> diff --git a/cmd/nand.c b/cmd/nand.c >> index 583a18f..8ade5e2 100644 >> --- a/cmd/nand.c >> +++ b/cmd/nand.c ... >> + return failed == 0 ? 0 : 1; > > The given offset could also start anywhere, so it's better to > auto-align it like the size. > > If the arguments extend beyond the end of the flash, then > nand_torture() will return an error at each iteration, so it's better > to break the loop or not to start it in this case. > > It's better to print the range actually tortured than the arguments > from the user. Agreed. > > So what about the following? > > @@ -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 && !str2off(argv[3], &size)) { Here I prefer having that in 2 if() as the stuff tested is only loosely related. I guess keeping it like this would also require parantheses around (argc > 3). Will revert to two if's in v3 > +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", patman.py/checkpatch.py warn here to keep quoted strings on one line even when the line length exceeds 80 characters. Will remove the line break / string concatenation for v3. > +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 Apart from above comments I merged your proposal. >> >> @@ -775,7 +792,8 @@ static char nand_help_text[] = ... >> diff --git a/doc/README.nand b/doc/README.nand >> index 96ffc48..5136f31 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 > > "Optionally," > >> + one call. If size is not a multiple of the NAND's erasesize then the block > > "erase size, then" > >> + which contains offset + size will be tested in full. If used with size >> this > > "that", not "which". > "size, this" > Agreed. Will add that to v3. Regards Max ___ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot
Re: [U-Boot] [PATCH v2 2/2] nand: extend nand torture
Hi Max, On Tue, Jun 7, 2016 at 1:46 PM, Max Krummenacher 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 100 > > NAND torture: device 0 offset 0x100 size 0x2 (nand block size 0x2) > passed 1, failed 0 > > ==> nand torture 100 4 > > NAND torture: device 0 offset 0x100 size 0x4 (nand block size 0x2) > passed 2, failed 0 > > Signed-off-by: Max Krummenacher > > --- > > 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 | 34 ++ > doc/README.nand | 6 +- > 2 files changed, 31 insertions(+), 9 deletions(-) > > diff --git a/cmd/nand.c b/cmd/nand.c > index 583a18f..8ade5e2 100644 > --- a/cmd/nand.c > +++ b/cmd/nand.c > @@ -647,6 +647,8 @@ 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 failed = 0, passed = 0; > if (argc < 3) > goto usage; > > @@ -654,13 +656,28 @@ static int do_nand(cmd_tbl_t *cmdtp, int flag, int > argc, char * const argv[]) > puts("Offset is not a valid number\n"); > 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"); > - > - return ret == 0 ? 0 : 1; > + size = mtd->erasesize; > + if (argc > 3) > + if (!str2off(argv[3], &size)) { > + puts("Size is not a valid number\n"); > + return 1; > + } > + printf("\nNAND torture: device %d offset 0x%llx size 0x%llx > (nand block size 0x%x)\n", > + dev, off, size, mtd->erasesize); > + > + endoff = off + size; > + while (off < endoff) { > + ret = nand_torture(mtd, off); > + if (ret) { > + failed++; > + printf(" off 0x%llx %s\n", off, "Failed"); > + } else { > + passed++; > + } > + off += mtd->erasesize; > + } > + printf("passed %u, failed %u\n", passed, failed); > + return failed == 0 ? 0 : 1; The given offset could also start anywhere, so it's better to auto-align it like the size. If the arguments extend beyond the end of the flash, then nand_torture() will return an error at each iteration, so it's better to break the loop or not to start it in this case. It's better to print the range actually tortured than the arguments from the user. So what about the following? @@ -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 && !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"
[U-Boot] [PATCH v2 2/2] 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 100 NAND torture: device 0 offset 0x100 size 0x2 (nand block size 0x2) passed 1, failed 0 ==> nand torture 100 4 NAND torture: device 0 offset 0x100 size 0x4 (nand block size 0x2) passed 2, failed 0 Signed-off-by: Max Krummenacher --- 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 | 34 ++ doc/README.nand | 6 +- 2 files changed, 31 insertions(+), 9 deletions(-) diff --git a/cmd/nand.c b/cmd/nand.c index 583a18f..8ade5e2 100644 --- a/cmd/nand.c +++ b/cmd/nand.c @@ -647,6 +647,8 @@ 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 failed = 0, passed = 0; if (argc < 3) goto usage; @@ -654,13 +656,28 @@ static int do_nand(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) puts("Offset is not a valid number\n"); 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"); - - return ret == 0 ? 0 : 1; + size = mtd->erasesize; + if (argc > 3) + if (!str2off(argv[3], &size)) { + puts("Size is not a valid number\n"); + return 1; + } + printf("\nNAND torture: device %d offset 0x%llx size 0x%llx (nand block size 0x%x)\n", + dev, off, size, mtd->erasesize); + + endoff = off + size; + while (off < endoff) { + ret = nand_torture(mtd, off); + if (ret) { + failed++; + printf(" off 0x%llx %s\n", off, "Failed"); + } else { + passed++; + } + off += mtd->erasesize; + } + printf("passed %u, failed %u\n", passed, failed); + return failed == 0 ? 0 : 1; } #endif @@ -775,7 +792,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..5136f31 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 erasesize then the block + which 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 ___ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot