2 * Driver for NAND support, Rick Bronson
3 * borrowed heavily from:
4 * (c) 1999 Machine Vision Holdings, Inc.
5 * (c) 1999, 2000 David Woodhouse <dwmw2@infradead.org>
7 * Ported 'dynenv' to 'nand env.oob' command
8 * (C) 2010 Nanometrics, Inc.
9 * 'dynenv' -- Dynamic environment offset in NAND OOB
10 * (C) Copyright 2006-2007 OpenMoko, Inc.
11 * Added 16-bit nand support
12 * (C) 2004 Texas Instruments
14 * Copyright 2010, 2012 Freescale Semiconductor
15 * The portions of this file whose copyright is held by Freescale and which
16 * are not considered a derived work of GPL v2-only code may be distributed
17 * and/or modified under the terms of the GNU General Public License as
18 * published by the Free Software Foundation; either version 2 of the
19 * License, or (at your option) any later version.
21 * The function nand_biterror() in this file is inspired from
22 * mtd-utils/nand-utils/nandflipbits.c which was released under GPLv2
27 #include <bootstage.h>
29 #include <asm/cache.h>
30 #include <linux/mtd/mtd.h>
31 #include <linux/mtd/rawnand.h>
37 #include <asm/byteorder.h>
38 #include <jffs2/jffs2.h>
41 #include "legacy-mtd-utils.h"
43 #if defined(CONFIG_CMD_MTDPARTS)
45 /* partition handling routines */
46 int mtdparts_init(void);
47 int find_dev_and_part(const char *id, struct mtd_device **dev,
48 u8 *part_num, struct part_info **part);
51 #define MAX_NUM_PAGES 64
53 static int nand_biterror(struct mtd_info *mtd, ulong off, int bit)
58 u_char *datbuf[MAX_NUM_PAGES]; /* Data and OOB */
60 int pages_per_blk = mtd->erasesize / mtd->writesize;
61 struct erase_info einfo;
63 if (pages_per_blk > MAX_NUM_PAGES) {
64 printf("Too many pages in one erase block\n");
68 if (bit < 0 || bit > 7) {
69 printf("bit position 0 to 7 is allowed\n");
74 memset(datbuf, 0, sizeof(datbuf));
75 for (page = 0; page < pages_per_blk ; page++) {
76 datbuf[page] = malloc(mtd->writesize + mtd->oobsize);
78 printf("No memory for page buffer\n");
84 /* Align to erase block boundary */
85 block_off = off & (~(mtd->erasesize - 1));
87 /* Read out memory as first step */
88 for (page = 0; page < pages_per_blk ; page++) {
89 struct mtd_oob_ops ops;
90 loff_t addr = (loff_t)block_off;
92 memset(&ops, 0, sizeof(ops));
93 ops.datbuf = datbuf[page];
94 ops.oobbuf = datbuf[page] + mtd->writesize;
95 ops.len = mtd->writesize;
96 ops.ooblen = mtd->oobsize;
97 ops.mode = MTD_OPS_RAW;
98 ret = mtd_read_oob(mtd, addr, &ops);
100 printf("Error (%d) reading page %08lx\n",
105 block_off += mtd->writesize;
108 /* Erase the block */
109 memset(&einfo, 0, sizeof(einfo));
111 /* Align to erase block boundary */
112 einfo.addr = (loff_t)(off & (~(mtd->erasesize - 1)));
113 einfo.len = mtd->erasesize;
114 ret = mtd_erase(mtd, &einfo);
116 printf("Error (%d) nand_erase_nand page %08llx\n",
122 /* Twist a bit in data part */
123 block_off = off & (mtd->erasesize - 1);
124 data = datbuf[block_off / mtd->writesize][block_off % mtd->writesize];
126 datbuf[block_off / mtd->writesize][block_off % mtd->writesize] = data;
128 printf("Flip data at 0x%lx with xor 0x%02x (bit=%d) to value=0x%02x\n",
129 off, (1 << bit), bit, data);
131 /* Write back twisted data and unmodified OOB */
132 /* Align to erase block boundary */
133 block_off = off & (~(mtd->erasesize - 1));
134 for (page = 0; page < pages_per_blk; page++) {
135 struct mtd_oob_ops ops;
136 loff_t addr = (loff_t)block_off;
138 memset(&ops, 0, sizeof(ops));
139 ops.datbuf = datbuf[page];
140 ops.oobbuf = datbuf[page] + mtd->writesize;
141 ops.len = mtd->writesize;
142 ops.ooblen = mtd->oobsize;
143 ops.mode = MTD_OPS_RAW;
144 ret = mtd_write_oob(mtd, addr, &ops);
146 printf("Error (%d) write page %08lx\n", ret, block_off);
150 block_off += mtd->writesize;
154 for (page = 0; page < pages_per_blk ; page++) {
161 static int nand_dump(struct mtd_info *mtd, ulong off, int only_oob,
165 u_char *datbuf, *oobbuf, *p;
170 off = last + mtd->writesize;
174 datbuf = memalign(ARCH_DMA_MINALIGN, mtd->writesize);
176 puts("No memory for page buffer\n");
180 oobbuf = memalign(ARCH_DMA_MINALIGN, mtd->oobsize);
182 puts("No memory for page buffer\n");
186 off &= ~(mtd->writesize - 1);
187 loff_t addr = (loff_t) off;
188 struct mtd_oob_ops ops;
189 memset(&ops, 0, sizeof(ops));
192 ops.len = mtd->writesize;
193 ops.ooblen = mtd->oobsize;
194 ops.mode = MTD_OPS_RAW;
195 i = mtd_read_oob(mtd, addr, &ops);
197 printf("Error (%d) reading page %08lx\n", i, off);
201 printf("Page %08lx dump:\n", off);
204 i = mtd->writesize >> 4;
208 printf("\t%02x %02x %02x %02x %02x %02x %02x %02x"
209 " %02x %02x %02x %02x %02x %02x %02x %02x\n",
210 p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7],
211 p[8], p[9], p[10], p[11], p[12], p[13], p[14],
218 i = mtd->oobsize >> 3;
221 printf("\t%02x %02x %02x %02x %02x %02x %02x %02x\n",
222 p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7]);
234 /* ------------------------------------------------------------------------- */
236 static int set_dev(int dev)
238 struct mtd_info *mtd = get_nand_dev_by_index(dev);
243 if (nand_curr_device == dev)
246 printf("Device %d: %s", dev, mtd->name);
247 puts("... is now current device\n");
248 nand_curr_device = dev;
250 #ifdef CONFIG_SYS_NAND_SELECT_DEVICE
251 board_nand_select_device(mtd_to_nand(mtd), dev);
257 #ifdef CONFIG_CMD_NAND_LOCK_UNLOCK
258 static void print_status(ulong start, ulong end, ulong erasesize, int status)
261 * Micron NAND flash (e.g. MT29F4G08ABADAH4) BLOCK LOCK READ STATUS is
262 * not the same as others. Instead of bit 1 being lock, it is
263 * #lock_tight. To make the driver support either format, ignore bit 1
264 * and use only bit 0 and bit 2.
266 printf("%08lx - %08lx: %08lx blocks %s%s%s\n",
269 (end - start) / erasesize,
270 ((status & NAND_LOCK_STATUS_TIGHT) ? "TIGHT " : ""),
271 (!(status & NAND_LOCK_STATUS_UNLOCK) ? "LOCK " : ""),
272 ((status & NAND_LOCK_STATUS_UNLOCK) ? "UNLOCK " : ""));
275 static void do_nand_status(struct mtd_info *mtd)
277 ulong block_start = 0;
279 int last_status = -1;
281 struct nand_chip *nand_chip = mtd_to_nand(mtd);
282 /* check the WP bit */
283 nand_chip->cmdfunc(mtd, NAND_CMD_STATUS, -1, -1);
284 printf("device is %swrite protected\n",
285 (nand_chip->read_byte(mtd) & 0x80 ?
288 for (off = 0; off < mtd->size; off += mtd->erasesize) {
289 int s = nand_get_lock_status(mtd, off);
291 /* print message only if status has changed */
292 if (s != last_status && off != 0) {
293 print_status(block_start, off, mtd->erasesize,
299 /* Print the last block info */
300 print_status(block_start, off, mtd->erasesize, last_status);
304 #ifdef CONFIG_ENV_OFFSET_OOB
305 unsigned long nand_env_oob_offset;
307 int do_nand_env_oob(struct cmd_tbl *cmdtp, int argc, char *const argv[])
310 uint32_t oob_buf[ENV_OFFSET_SIZE/sizeof(uint32_t)];
311 struct mtd_info *mtd = get_nand_dev_by_index(0);
314 if (CONFIG_SYS_MAX_NAND_DEVICE == 0 || !mtd) {
315 puts("no devices available\n");
321 if (!strcmp(cmd, "get")) {
322 ret = get_nand_env_oob(mtd, &nand_env_oob_offset);
326 printf("0x%08lx\n", nand_env_oob_offset);
327 } else if (!strcmp(cmd, "set")) {
330 struct mtd_oob_ops ops;
336 mtd = get_nand_dev_by_index(idx);
337 /* We don't care about size, or maxsize. */
338 if (mtd_arg_off(argv[2], &idx, &addr, &maxsize, &maxsize,
339 MTD_DEV_TYPE_NAND, mtd->size)) {
340 puts("Offset or partition name expected\n");
344 puts("Offset or partition name expected\n");
349 puts("Partition not on first NAND device\n");
353 if (mtd->oobavail < ENV_OFFSET_SIZE) {
354 printf("Insufficient available OOB bytes:\n"
355 "%d OOB bytes available but %d required for "
357 mtd->oobavail, ENV_OFFSET_SIZE);
361 if ((addr & (mtd->erasesize - 1)) != 0) {
362 printf("Environment offset must be block-aligned\n");
367 ops.mode = MTD_OOB_AUTO;
369 ops.ooblen = ENV_OFFSET_SIZE;
370 ops.oobbuf = (void *) oob_buf;
372 oob_buf[0] = ENV_OOB_MARKER;
373 oob_buf[1] = addr / mtd->erasesize;
375 ret = mtd->write_oob(mtd, ENV_OFFSET_SIZE, &ops);
377 printf("Error writing OOB block 0\n");
381 ret = get_nand_env_oob(mtd, &nand_env_oob_offset);
383 printf("Error reading env offset in OOB\n");
387 if (addr != nand_env_oob_offset) {
388 printf("Verification of env offset in OOB failed: "
389 "0x%08llx expected but got 0x%08lx\n",
390 (unsigned long long)addr, nand_env_oob_offset);
400 return CMD_RET_USAGE;
405 static void nand_print_and_set_info(int idx)
407 struct mtd_info *mtd;
408 struct nand_chip *chip;
410 mtd = get_nand_dev_by_index(idx);
414 chip = mtd_to_nand(mtd);
415 printf("Device %d: ", idx);
416 if (chip->numchips > 1)
417 printf("%dx ", chip->numchips);
418 printf("%s, sector size %u KiB\n",
419 mtd->name, mtd->erasesize >> 10);
420 printf(" Page size %8d b\n", mtd->writesize);
421 printf(" OOB size %8d b\n", mtd->oobsize);
422 printf(" Erase size %8d b\n", mtd->erasesize);
423 printf(" subpagesize %8d b\n", chip->subpagesize);
424 printf(" options 0x%08x\n", chip->options);
425 printf(" bbt options 0x%08x\n", chip->bbt_options);
427 /* Set geometry info */
428 env_set_hex("nand_writesize", mtd->writesize);
429 env_set_hex("nand_oobsize", mtd->oobsize);
430 env_set_hex("nand_erasesize", mtd->erasesize);
433 static int raw_access(struct mtd_info *mtd, ulong addr, loff_t off,
434 ulong count, int read, int no_verify)
440 mtd_oob_ops_t ops = {
441 .datbuf = (u8 *)addr,
442 .oobbuf = ((u8 *)addr) + mtd->writesize,
443 .len = mtd->writesize,
444 .ooblen = mtd->oobsize,
449 ret = mtd_read_oob(mtd, off, &ops);
451 ret = mtd_write_oob(mtd, off, &ops);
452 if (!ret && !no_verify)
453 ret = nand_verify_page_oob(mtd, &ops, off);
457 printf("%s: error at offset %llx, ret %d\n",
458 __func__, (long long)off, ret);
462 addr += mtd->writesize + mtd->oobsize;
463 off += mtd->writesize;
469 /* Adjust a chip/partition size down for bad blocks so we don't
470 * read/write past the end of a chip/partition by accident.
472 static void adjust_size_for_badblocks(loff_t *size, loff_t offset, int dev)
474 /* We grab the nand info object here fresh because this is usually
475 * called after arg_off_size() which can change the value of dev.
477 struct mtd_info *mtd = get_nand_dev_by_index(dev);
478 loff_t maxoffset = offset + *size;
481 /* count badblocks in NAND from offset to offset + size */
482 for (; offset < maxoffset; offset += mtd->erasesize) {
483 if (nand_block_isbad(mtd, offset))
486 /* adjust size if any bad blocks found */
488 *size -= badblocks * mtd->erasesize;
489 printf("size adjusted to 0x%llx (%d bad blocks)\n",
490 (unsigned long long)*size, badblocks);
494 static int do_nand(struct cmd_tbl *cmdtp, int flag, int argc,
499 loff_t off, size, maxsize;
501 struct mtd_info *mtd;
502 #ifdef CONFIG_SYS_NAND_QUIET
503 int quiet = CONFIG_SYS_NAND_QUIET;
507 const char *quiet_str = env_get("quiet");
508 int dev = nand_curr_device;
509 int repeat = flag & CMD_FLAG_REPEAT;
511 /* at least two arguments please */
516 quiet = simple_strtoul(quiet_str, NULL, 0) != 0;
520 /* Only "dump" is repeatable. */
521 if (repeat && strcmp(cmd, "dump"))
524 if (strcmp(cmd, "info") == 0) {
527 for (i = 0; i < CONFIG_SYS_MAX_NAND_DEVICE; i++)
528 nand_print_and_set_info(i);
532 if (strcmp(cmd, "device") == 0) {
535 if (dev < 0 || dev >= CONFIG_SYS_MAX_NAND_DEVICE)
536 puts("no devices available\n");
538 nand_print_and_set_info(dev);
542 dev = (int)dectoul(argv[2], NULL);
548 #ifdef CONFIG_ENV_OFFSET_OOB
549 /* this command operates only on the first nand device */
550 if (strcmp(cmd, "env.oob") == 0)
551 return do_nand_env_oob(cmdtp, argc - 1, argv + 1);
554 /* The following commands operate on the current device, unless
555 * overridden by a partition specifier. Note that if somehow the
556 * current device is invalid, it will have to be changed to a valid
557 * one before these commands can run, even if a partition specifier
558 * for another device is to be used.
560 mtd = get_nand_dev_by_index(dev);
562 puts("\nno devices available\n");
566 if (strcmp(cmd, "bad") == 0) {
567 printf("\nDevice %d bad blocks:\n", dev);
568 for (off = 0; off < mtd->size; off += mtd->erasesize)
569 if (nand_block_isbad(mtd, off))
570 printf(" %08llx\n", (unsigned long long)off);
577 * nand erase [clean] [off size]
579 if (strncmp(cmd, "erase", 5) == 0 || strncmp(cmd, "scrub", 5) == 0) {
580 nand_erase_options_t opts;
581 /* "clean" at index 2 means request to write cleanmarker */
582 int clean = argc > 2 && !strcmp("clean", argv[2]);
583 int scrub_yes = argc > 2 && !strcmp("-y", argv[2]);
584 int o = (clean || scrub_yes) ? 3 : 2;
585 int scrub = !strncmp(cmd, "scrub", 5);
588 const char *scrub_warn =
590 "scrub option will erase all factory set bad blocks!\n"
592 "There is no reliable way to recover them.\n"
594 "Use this command only for testing purposes if you\n"
596 "are sure of what you are doing!\n"
597 "\nReally scrub this NAND flash? <y/N>\n";
600 if (!strcmp(&cmd[5], ".spread")) {
602 } else if (!strcmp(&cmd[5], ".part")) {
604 } else if (!strcmp(&cmd[5], ".chip")) {
612 * Don't allow missing arguments to cause full chip/partition
613 * erases -- easy to do accidentally, e.g. with a misspelled
616 if (argc != o + args)
619 printf("\nNAND %s: ", cmd);
620 /* skip first two or three arguments, look for offset and size */
621 if (mtd_arg_off_size(argc - o, argv + o, &dev, &off, &size,
622 &maxsize, MTD_DEV_TYPE_NAND,
629 mtd = get_nand_dev_by_index(dev);
631 memset(&opts, 0, sizeof(opts));
636 opts.spread = spread;
643 if (confirm_yesno()) {
646 puts("scrub aborted\n");
651 ret = nand_erase_opts(mtd, &opts);
652 printf("%s\n", ret ? "ERROR" : "OK");
654 return ret == 0 ? 0 : 1;
657 if (strncmp(cmd, "dump", 4) == 0) {
661 off = (int)hextoul(argv[2], NULL);
662 ret = nand_dump(mtd, off, !strcmp(&cmd[4], ".oob"), repeat);
664 return ret == 0 ? 1 : 0;
667 if (strncmp(cmd, "read", 4) == 0 || strncmp(cmd, "write", 5) == 0) {
677 addr = (ulong)hextoul(argv[2], NULL);
679 read = strncmp(cmd, "read", 4) == 0; /* 1 = read, 0 = write */
680 printf("\nNAND %s: ", read ? "read" : "write");
682 s = strchr(cmd, '.');
684 if (s && !strncmp(s, ".raw", 4)) {
687 if (!strcmp(s, ".raw.noverify"))
690 if (mtd_arg_off(argv[3], &dev, &off, &size, &maxsize,
698 mtd = get_nand_dev_by_index(dev);
700 if (argc > 4 && !str2long(argv[4], &pagecount)) {
701 printf("'%s' is not a number\n", argv[4]);
705 if (pagecount * mtd->writesize > size) {
706 puts("Size exceeds partition or device limit\n");
710 rwsize = pagecount * (mtd->writesize + mtd->oobsize);
712 if (mtd_arg_off_size(argc - 3, argv + 3, &dev, &off,
721 /* size is unspecified */
723 adjust_size_for_badblocks(&size, off, dev);
727 mtd = get_nand_dev_by_index(dev);
729 if (!s || !strcmp(s, ".jffs2") ||
730 !strcmp(s, ".e") || !strcmp(s, ".i")) {
732 ret = nand_read_skip_bad(mtd, off, &rwsize,
736 ret = nand_write_skip_bad(mtd, off, &rwsize,
740 #ifdef CONFIG_CMD_NAND_TRIMFFS
741 } else if (!strcmp(s, ".trimffs")) {
743 printf("Unknown nand command suffix '%s'\n", s);
746 ret = nand_write_skip_bad(mtd, off, &rwsize, NULL,
747 maxsize, (u_char *)addr,
748 WITH_DROP_FFS | WITH_WR_VERIFY);
750 } else if (!strcmp(s, ".oob")) {
751 /* out-of-band data */
752 mtd_oob_ops_t ops = {
753 .oobbuf = (u8 *)addr,
759 ret = mtd_read_oob(mtd, off, &ops);
761 ret = mtd_write_oob(mtd, off, &ops);
763 ret = raw_access(mtd, addr, off, pagecount, read,
766 printf("Unknown nand command suffix '%s'.\n", s);
770 printf(" %zu bytes %s: %s\n", rwsize,
771 read ? "read" : "written", ret ? "ERROR" : "OK");
773 return ret == 0 ? 0 : 1;
776 #ifdef CONFIG_CMD_NAND_TORTURE
777 if (strcmp(cmd, "torture") == 0) {
779 unsigned int failed = 0, passed = 0;
784 if (!str2off(argv[2], &off)) {
785 puts("Offset is not a valid number\n");
789 size = mtd->erasesize;
791 if (!str2off(argv[3], &size)) {
792 puts("Size is not a valid number\n");
798 if (endoff > mtd->size) {
799 puts("Arguments beyond end of NAND\n");
803 off = round_down(off, mtd->erasesize);
804 endoff = round_up(endoff, mtd->erasesize);
806 printf("\nNAND torture: device %d offset 0x%llx size 0x%llx (block size 0x%x)\n",
807 dev, off, size, mtd->erasesize);
808 while (off < endoff) {
809 ret = nand_torture(mtd, off);
812 printf(" block at 0x%llx failed\n", off);
816 off += mtd->erasesize;
818 printf(" Passed: %u, failed: %u\n", passed, failed);
823 if (strcmp(cmd, "markbad") == 0) {
831 addr = hextoul(*argv, NULL);
833 if (mtd_block_markbad(mtd, addr)) {
834 printf("block 0x%08lx NOT marked "
835 "as bad! ERROR %d\n",
839 printf("block 0x%08lx successfully "
849 if (strcmp(cmd, "biterr") == 0) {
855 off = (int)simple_strtoul(argv[2], NULL, 16);
856 bit = (int)simple_strtoul(argv[3], NULL, 10);
857 ret = nand_biterror(mtd, off, bit);
861 #ifdef CONFIG_CMD_NAND_LOCK_UNLOCK
862 if (strcmp(cmd, "lock") == 0) {
866 if (!strcmp("tight", argv[2]))
868 if (!strcmp("status", argv[2]))
874 if (!nand_lock(mtd, tight)) {
875 puts("NAND flash successfully locked\n");
877 puts("Error locking NAND flash\n");
884 if (strncmp(cmd, "unlock", 5) == 0) {
887 s = strchr(cmd, '.');
889 if (s && !strcmp(s, ".allexcept"))
892 if (mtd_arg_off_size(argc - 2, argv + 2, &dev, &off, &size,
893 &maxsize, MTD_DEV_TYPE_NAND,
900 mtd = get_nand_dev_by_index(dev);
902 if (!nand_unlock(mtd, off, size, allexcept)) {
903 puts("NAND flash successfully unlocked\n");
905 puts("Error unlocking NAND flash, "
906 "write and erase will probably fail\n");
914 return CMD_RET_USAGE;
917 #ifdef CONFIG_SYS_LONGHELP
918 static char nand_help_text[] =
919 "info - show available NAND devices\n"
920 "nand device [dev] - show or set current device\n"
921 "nand read - addr off|partition size\n"
922 "nand write - addr off|partition size\n"
923 " read/write 'size' bytes starting at offset 'off'\n"
924 " to/from memory address 'addr', skipping bad blocks.\n"
925 "nand read.raw - addr off|partition [count]\n"
926 "nand write.raw[.noverify] - addr off|partition [count]\n"
927 " Use read.raw/write.raw to avoid ECC and access the flash as-is.\n"
928 #ifdef CONFIG_CMD_NAND_TRIMFFS
929 "nand write.trimffs - addr off|partition size\n"
930 " write 'size' bytes starting at offset 'off' from memory address\n"
931 " 'addr', skipping bad blocks and dropping any pages at the end\n"
932 " of eraseblocks that contain only 0xFF\n"
934 "nand erase[.spread] [clean] off size - erase 'size' bytes "
935 "from offset 'off'\n"
936 " With '.spread', erase enough for given file size, otherwise,\n"
937 " 'size' includes skipped bad blocks.\n"
938 "nand erase.part [clean] partition - erase entire mtd partition'\n"
939 "nand erase.chip [clean] - erase entire chip'\n"
940 "nand bad - show bad blocks\n"
941 "nand dump[.oob] off - dump page\n"
942 #ifdef CONFIG_CMD_NAND_TORTURE
943 "nand torture off - torture one block at offset\n"
944 "nand torture off [size] - torture blocks from off to off+size\n"
946 "nand scrub [-y] off size | scrub.part partition | scrub.chip\n"
947 " really clean NAND erasing bad blocks (UNSAFE)\n"
948 "nand markbad off [...] - mark bad block(s) at offset (UNSAFE)\n"
949 "nand biterr off bit - make a bit error at offset and bit position (UNSAFE)"
950 #ifdef CONFIG_CMD_NAND_LOCK_UNLOCK
952 "nand lock [tight] [status]\n"
953 " bring nand to lock state or display locked pages\n"
954 "nand unlock[.allexcept] [offset] [size] - unlock section"
956 #ifdef CONFIG_ENV_OFFSET_OOB
958 "nand env.oob - environment offset in OOB of block 0 of"
960 "nand env.oob set off|partition - set enviromnent offset\n"
961 "nand env.oob get - get environment offset"
967 nand, CONFIG_SYS_MAXARGS, 1, do_nand,
968 "NAND sub-system", nand_help_text
971 static int nand_load_image(struct cmd_tbl *cmdtp, struct mtd_info *mtd,
972 ulong offset, ulong addr, char *cmd)
977 #if defined(CONFIG_LEGACY_IMAGE_FORMAT)
978 struct legacy_img_hdr *hdr;
980 #if defined(CONFIG_FIT)
981 const void *fit_hdr = NULL;
984 s = strchr(cmd, '.');
986 (strcmp(s, ".jffs2") && strcmp(s, ".e") && strcmp(s, ".i"))) {
987 printf("Unknown nand load suffix '%s'\n", s);
988 bootstage_error(BOOTSTAGE_ID_NAND_SUFFIX);
992 printf("\nLoading from %s, offset 0x%lx\n", mtd->name, offset);
994 cnt = mtd->writesize;
995 r = nand_read_skip_bad(mtd, offset, &cnt, NULL, mtd->size,
998 puts("** Read error\n");
999 bootstage_error(BOOTSTAGE_ID_NAND_HDR_READ);
1002 bootstage_mark(BOOTSTAGE_ID_NAND_HDR_READ);
1004 switch (genimg_get_format ((void *)addr)) {
1005 #if defined(CONFIG_LEGACY_IMAGE_FORMAT)
1006 case IMAGE_FORMAT_LEGACY:
1007 hdr = (struct legacy_img_hdr *)addr;
1009 bootstage_mark(BOOTSTAGE_ID_NAND_TYPE);
1010 image_print_contents (hdr);
1012 cnt = image_get_image_size (hdr);
1015 #if defined(CONFIG_FIT)
1016 case IMAGE_FORMAT_FIT:
1017 fit_hdr = (const void *)addr;
1018 puts ("Fit image detected...\n");
1020 cnt = fit_get_size (fit_hdr);
1024 bootstage_error(BOOTSTAGE_ID_NAND_TYPE);
1025 puts ("** Unknown image type\n");
1028 bootstage_mark(BOOTSTAGE_ID_NAND_TYPE);
1030 r = nand_read_skip_bad(mtd, offset, &cnt, NULL, mtd->size,
1033 puts("** Read error\n");
1034 bootstage_error(BOOTSTAGE_ID_NAND_READ);
1037 bootstage_mark(BOOTSTAGE_ID_NAND_READ);
1039 #if defined(CONFIG_FIT)
1040 /* This cannot be done earlier, we need complete FIT image in RAM first */
1041 if (genimg_get_format ((void *)addr) == IMAGE_FORMAT_FIT) {
1042 if (fit_check_format(fit_hdr, IMAGE_SIZE_INVAL)) {
1043 bootstage_error(BOOTSTAGE_ID_NAND_FIT_READ);
1044 puts ("** Bad FIT image format\n");
1047 bootstage_mark(BOOTSTAGE_ID_NAND_FIT_READ_OK);
1048 fit_print_contents (fit_hdr);
1052 /* Loading ok, update default load address */
1054 image_load_addr = addr;
1056 return bootm_maybe_autostart(cmdtp, cmd);
1059 static int do_nandboot(struct cmd_tbl *cmdtp, int flag, int argc,
1062 char *boot_device = NULL;
1064 ulong addr, offset = 0;
1065 struct mtd_info *mtd;
1066 #if defined(CONFIG_CMD_MTDPARTS)
1067 struct mtd_device *dev;
1068 struct part_info *part;
1072 char *p = (argc == 2) ? argv[1] : argv[2];
1073 if (!(str2long(p, &addr)) && (mtdparts_init() == 0) &&
1074 (find_dev_and_part(p, &dev, &pnum, &part) == 0)) {
1075 if (dev->id->type != MTD_DEV_TYPE_NAND) {
1076 puts("Not a NAND device\n");
1082 addr = hextoul(argv[1], NULL);
1084 addr = CONFIG_SYS_LOAD_ADDR;
1086 mtd = get_nand_dev_by_index(dev->id->num);
1087 return nand_load_image(cmdtp, mtd, part->offset,
1093 bootstage_mark(BOOTSTAGE_ID_NAND_PART);
1096 addr = CONFIG_SYS_LOAD_ADDR;
1097 boot_device = env_get("bootdevice");
1100 addr = hextoul(argv[1], NULL);
1101 boot_device = env_get("bootdevice");
1104 addr = hextoul(argv[1], NULL);
1105 boot_device = argv[2];
1108 addr = hextoul(argv[1], NULL);
1109 boot_device = argv[2];
1110 offset = hextoul(argv[3], NULL);
1113 #if defined(CONFIG_CMD_MTDPARTS)
1116 bootstage_error(BOOTSTAGE_ID_NAND_SUFFIX);
1117 return CMD_RET_USAGE;
1119 bootstage_mark(BOOTSTAGE_ID_NAND_SUFFIX);
1122 puts("\n** No boot device **\n");
1123 bootstage_error(BOOTSTAGE_ID_NAND_BOOT_DEVICE);
1126 bootstage_mark(BOOTSTAGE_ID_NAND_BOOT_DEVICE);
1128 idx = hextoul(boot_device, NULL);
1130 mtd = get_nand_dev_by_index(idx);
1132 printf("\n** Device %d not available\n", idx);
1133 bootstage_error(BOOTSTAGE_ID_NAND_AVAILABLE);
1136 bootstage_mark(BOOTSTAGE_ID_NAND_AVAILABLE);
1138 return nand_load_image(cmdtp, mtd, offset, addr, argv[0]);
1141 U_BOOT_CMD(nboot, 4, 1, do_nandboot,
1142 "boot from NAND device",
1143 "[partition] | [[[loadAddr] dev] offset]"