[U-Boot] [PATCH v3 2/2] nand: extend nand torture

Benoît Thébaudeau benoit.thebaudeau.dev at gmail.com
Mon Jun 13 22:19:55 CEST 2016


Hi Max,

On Mon, Jun 13, 2016 at 10:15 AM, Max Krummenacher <max.oss.09 at 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.krummenacher at 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.dev at gmail.com>

Best regards,
Benoît


More information about the U-Boot mailing list