]> Git Repo - J-u-boot.git/blobdiff - cmd/nand.c
Merge tag 'mips-fixes-for-v2024.04' of https://source.denx.de/u-boot/custodians/u...
[J-u-boot.git] / cmd / nand.c
index e730484d0b799920158fd4ec4966a07100131388..fe834c4ac5c030e64c37736566904b3ec6f0e3a8 100644 (file)
@@ -34,6 +34,7 @@
 #include <env.h>
 #include <watchdog.h>
 #include <malloc.h>
+#include <mapmem.h>
 #include <asm/byteorder.h>
 #include <jffs2/jffs2.h>
 #include <nand.h>
@@ -417,12 +418,14 @@ static void nand_print_and_set_info(int idx)
                printf("%dx ", chip->numchips);
        printf("%s, sector size %u KiB\n",
               mtd->name, mtd->erasesize >> 10);
-       printf("  Page size   %8d b\n", mtd->writesize);
-       printf("  OOB size    %8d b\n", mtd->oobsize);
-       printf("  Erase size  %8d b\n", mtd->erasesize);
-       printf("  subpagesize %8d b\n", chip->subpagesize);
-       printf("  options     0x%08x\n", chip->options);
-       printf("  bbt options 0x%08x\n", chip->bbt_options);
+       printf("  Page size     %8d b\n", mtd->writesize);
+       printf("  OOB size      %8d b\n", mtd->oobsize);
+       printf("  Erase size    %8d b\n", mtd->erasesize);
+       printf("  ecc strength  %8d bits\n", mtd->ecc_strength);
+       printf("  ecc step size %8d b\n", mtd->ecc_step_size);
+       printf("  subpagesize   %8d b\n", chip->subpagesize);
+       printf("  options       0x%08x\n", chip->options);
+       printf("  bbt options   0x%08x\n", chip->bbt_options);
 
        /* Set geometry info */
        env_set_hex("nand_writesize", mtd->writesize);
@@ -430,7 +433,7 @@ static void nand_print_and_set_info(int idx)
        env_set_hex("nand_erasesize", mtd->erasesize);
 }
 
-static int raw_access(struct mtd_info *mtd, ulong addr, loff_t off,
+static int raw_access(struct mtd_info *mtd, void *buf, loff_t off,
                      ulong count, int read, int no_verify)
 {
        int ret = 0;
@@ -438,8 +441,8 @@ static int raw_access(struct mtd_info *mtd, ulong addr, loff_t off,
        while (count--) {
                /* Raw access */
                mtd_oob_ops_t ops = {
-                       .datbuf = (u8 *)addr,
-                       .oobbuf = ((u8 *)addr) + mtd->writesize,
+                       .datbuf = buf,
+                       .oobbuf = buf + mtd->writesize,
                        .len = mtd->writesize,
                        .ooblen = mtd->oobsize,
                        .mode = MTD_OPS_RAW
@@ -459,7 +462,7 @@ static int raw_access(struct mtd_info *mtd, ulong addr, loff_t off,
                        break;
                }
 
-               addr += mtd->writesize + mtd->oobsize;
+               buf += mtd->writesize + mtd->oobsize;
                off += mtd->writesize;
        }
 
@@ -565,9 +568,12 @@ static int do_nand(struct cmd_tbl *cmdtp, int flag, int argc,
 
        if (strcmp(cmd, "bad") == 0) {
                printf("\nDevice %d bad blocks:\n", dev);
-               for (off = 0; off < mtd->size; off += mtd->erasesize)
-                       if (nand_block_isbad(mtd, off))
-                               printf("  %08llx\n", (unsigned long long)off);
+               for (off = 0; off < mtd->size; off += mtd->erasesize) {
+                       ret = nand_block_isbad(mtd, off);
+                       if (ret)
+                               printf("  0x%08llx%s\n", (unsigned long long)off,
+                                      ret == 2 ? "\t (bbt reserved)" : "");
+               }
                return 0;
        }
 
@@ -670,6 +676,7 @@ static int do_nand(struct cmd_tbl *cmdtp, int flag, int argc,
                int read;
                int raw = 0;
                int no_verify = 0;
+               void *buf;
 
                if (argc < 4)
                        goto usage;
@@ -725,32 +732,32 @@ static int do_nand(struct cmd_tbl *cmdtp, int flag, int argc,
                }
 
                mtd = get_nand_dev_by_index(dev);
+               buf = map_sysmem(addr, maxsize);
 
                if (!s || !strcmp(s, ".jffs2") ||
                    !strcmp(s, ".e") || !strcmp(s, ".i")) {
                        if (read)
                                ret = nand_read_skip_bad(mtd, off, &rwsize,
-                                                        NULL, maxsize,
-                                                        (u_char *)addr);
+                                                        NULL, maxsize, buf);
                        else
                                ret = nand_write_skip_bad(mtd, off, &rwsize,
-                                                         NULL, maxsize,
-                                                         (u_char *)addr,
+                                                         NULL, maxsize, buf,
                                                          WITH_WR_VERIFY);
 #ifdef CONFIG_CMD_NAND_TRIMFFS
                } else if (!strcmp(s, ".trimffs")) {
                        if (read) {
                                printf("Unknown nand command suffix '%s'\n", s);
+                               unmap_sysmem(buf);
                                return 1;
                        }
                        ret = nand_write_skip_bad(mtd, off, &rwsize, NULL,
-                                               maxsize, (u_char *)addr,
+                                               maxsize, buf,
                                                WITH_DROP_FFS | WITH_WR_VERIFY);
 #endif
                } else if (!strcmp(s, ".oob")) {
                        /* out-of-band data */
                        mtd_oob_ops_t ops = {
-                               .oobbuf = (u8 *)addr,
+                               .oobbuf = buf,
                                .ooblen = rwsize,
                                .mode = MTD_OPS_RAW
                        };
@@ -760,13 +767,15 @@ static int do_nand(struct cmd_tbl *cmdtp, int flag, int argc,
                        else
                                ret = mtd_write_oob(mtd, off, &ops);
                } else if (raw) {
-                       ret = raw_access(mtd, addr, off, pagecount, read,
+                       ret = raw_access(mtd, buf, off, pagecount, read,
                                         no_verify);
                } else {
                        printf("Unknown nand command suffix '%s'.\n", s);
+                       unmap_sysmem(buf);
                        return 1;
                }
 
+               unmap_sysmem(buf);
                printf(" %zu bytes %s: %s\n", rwsize,
                       read ? "read" : "written", ret ? "ERROR" : "OK");
 
@@ -914,8 +923,7 @@ usage:
        return CMD_RET_USAGE;
 }
 
-#ifdef CONFIG_SYS_LONGHELP
-static char nand_help_text[] =
+U_BOOT_LONGHELP(nand,
        "info - show available NAND devices\n"
        "nand device [dev] - show or set current device\n"
        "nand read - addr off|partition size\n"
@@ -960,8 +968,7 @@ static char nand_help_text[] =
        "nand env.oob set off|partition - set enviromnent offset\n"
        "nand env.oob get - get environment offset"
 #endif
-       "";
-#endif
+       );
 
 U_BOOT_CMD(
        nand, CONFIG_SYS_MAXARGS, 1, do_nand,
@@ -975,7 +982,7 @@ static int nand_load_image(struct cmd_tbl *cmdtp, struct mtd_info *mtd,
        char *s;
        size_t cnt;
 #if defined(CONFIG_LEGACY_IMAGE_FORMAT)
-       image_header_t *hdr;
+       struct legacy_img_hdr *hdr;
 #endif
 #if defined(CONFIG_FIT)
        const void *fit_hdr = NULL;
@@ -1004,7 +1011,7 @@ static int nand_load_image(struct cmd_tbl *cmdtp, struct mtd_info *mtd,
        switch (genimg_get_format ((void *)addr)) {
 #if defined(CONFIG_LEGACY_IMAGE_FORMAT)
        case IMAGE_FORMAT_LEGACY:
-               hdr = (image_header_t *)addr;
+               hdr = (struct legacy_img_hdr *)addr;
 
                bootstage_mark(BOOTSTAGE_ID_NAND_TYPE);
                image_print_contents (hdr);
This page took 0.029566 seconds and 4 git commands to generate.