xref: /OK3568_Linux_fs/u-boot/drivers/mtd/nand/raw/nand_util.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 /*
2  * drivers/mtd/nand/raw/nand_util.c
3  *
4  * Copyright (C) 2006 by Weiss-Electronic GmbH.
5  * All rights reserved.
6  *
7  * @author:	Guido Classen <clagix@gmail.com>
8  * @descr:	NAND Flash support
9  * @references: borrowed heavily from Linux mtd-utils code:
10  *		flash_eraseall.c by Arcom Control System Ltd
11  *		nandwrite.c by Steven J. Hill (sjhill@realitydiluted.com)
12  *			       and Thomas Gleixner (tglx@linutronix.de)
13  *
14  * Copyright (C) 2008 Nokia Corporation: drop_ffs() function by
15  * Artem Bityutskiy <dedekind1@gmail.com> from mtd-utils
16  *
17  * Copyright 2010 Freescale Semiconductor
18  *
19  * SPDX-License-Identifier:	GPL-2.0
20  */
21 
22 #include <common.h>
23 #include <command.h>
24 #include <watchdog.h>
25 #include <malloc.h>
26 #include <memalign.h>
27 #include <div64.h>
28 
29 #include <linux/errno.h>
30 #include <linux/mtd/mtd.h>
31 #include <nand.h>
32 #include <jffs2/jffs2.h>
33 
34 typedef struct erase_info	erase_info_t;
35 typedef struct mtd_info		mtd_info_t;
36 
37 /* support only for native endian JFFS2 */
38 #define cpu_to_je16(x) (x)
39 #define cpu_to_je32(x) (x)
40 
41 /**
42  * nand_erase_opts: - erase NAND flash with support for various options
43  *		      (jffs2 formatting)
44  *
45  * @param mtd		nand mtd instance to erase
46  * @param opts		options,  @see struct nand_erase_options
47  * @return		0 in case of success
48  *
49  * This code is ported from flash_eraseall.c from Linux mtd utils by
50  * Arcom Control System Ltd.
51  */
nand_erase_opts(struct mtd_info * mtd,const nand_erase_options_t * opts)52 int nand_erase_opts(struct mtd_info *mtd,
53 		    const nand_erase_options_t *opts)
54 {
55 	struct jffs2_unknown_node cleanmarker;
56 	erase_info_t erase;
57 	unsigned long erase_length, erased_length; /* in blocks */
58 	int result;
59 	int percent_complete = -1;
60 	const char *mtd_device = mtd->name;
61 	struct mtd_oob_ops oob_opts;
62 	struct nand_chip *chip = mtd_to_nand(mtd);
63 
64 	if ((opts->offset & (mtd->erasesize - 1)) != 0) {
65 		printf("Attempt to erase non block-aligned data\n");
66 		return -1;
67 	}
68 
69 	memset(&erase, 0, sizeof(erase));
70 	memset(&oob_opts, 0, sizeof(oob_opts));
71 
72 	erase.mtd = mtd;
73 	erase.len = mtd->erasesize;
74 	erase.addr = opts->offset;
75 	erase_length = lldiv(opts->length + mtd->erasesize - 1,
76 			     mtd->erasesize);
77 
78 	cleanmarker.magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
79 	cleanmarker.nodetype = cpu_to_je16(JFFS2_NODETYPE_CLEANMARKER);
80 	cleanmarker.totlen = cpu_to_je32(8);
81 
82 	/* scrub option allows to erase badblock. To prevent internal
83 	 * check from erase() method, set block check method to dummy
84 	 * and disable bad block table while erasing.
85 	 */
86 	if (opts->scrub) {
87 		erase.scrub = opts->scrub;
88 		/*
89 		 * We don't need the bad block table anymore...
90 		 * after scrub, there are no bad blocks left!
91 		 */
92 		if (chip->bbt) {
93 			kfree(chip->bbt);
94 		}
95 		chip->bbt = NULL;
96 		chip->options &= ~NAND_BBT_SCANNED;
97 	}
98 
99 	for (erased_length = 0;
100 	     erased_length < erase_length;
101 	     erase.addr += mtd->erasesize) {
102 
103 		WATCHDOG_RESET();
104 
105 		if (opts->lim && (erase.addr >= (opts->offset + opts->lim))) {
106 			puts("Size of erase exceeds limit\n");
107 			return -EFBIG;
108 		}
109 		if (!opts->scrub) {
110 			int ret = mtd_block_isbad(mtd, erase.addr);
111 			if (ret > 0) {
112 				if (!opts->quiet)
113 					printf("\rSkipping bad block at  "
114 					       "0x%08llx                 "
115 					       "                         \n",
116 					       erase.addr);
117 
118 				if (!opts->spread)
119 					erased_length++;
120 
121 				continue;
122 
123 			} else if (ret < 0) {
124 				printf("\n%s: MTD get bad block failed: %d\n",
125 				       mtd_device,
126 				       ret);
127 				return -1;
128 			}
129 		}
130 
131 		erased_length++;
132 
133 		result = mtd_erase(mtd, &erase);
134 		if (result != 0) {
135 			printf("\n%s: MTD Erase failure: %d\n",
136 			       mtd_device, result);
137 			continue;
138 		}
139 
140 		/* format for JFFS2 ? */
141 		if (opts->jffs2 && chip->ecc.layout->oobavail >= 8) {
142 			struct mtd_oob_ops ops;
143 			ops.ooblen = 8;
144 			ops.datbuf = NULL;
145 			ops.oobbuf = (uint8_t *)&cleanmarker;
146 			ops.ooboffs = 0;
147 			ops.mode = MTD_OPS_AUTO_OOB;
148 
149 			result = mtd_write_oob(mtd, erase.addr, &ops);
150 			if (result != 0) {
151 				printf("\n%s: MTD writeoob failure: %d\n",
152 				       mtd_device, result);
153 				continue;
154 			}
155 		}
156 
157 		if (!opts->quiet) {
158 			unsigned long long n = erased_length * 100ULL;
159 			int percent;
160 
161 			do_div(n, erase_length);
162 			percent = (int)n;
163 
164 			/* output progress message only at whole percent
165 			 * steps to reduce the number of messages printed
166 			 * on (slow) serial consoles
167 			 */
168 			if (percent != percent_complete) {
169 				percent_complete = percent;
170 
171 				printf("\rErasing at 0x%llx -- %3d%% complete.",
172 				       erase.addr, percent);
173 
174 				if (opts->jffs2 && result == 0)
175 					printf(" Cleanmarker written at 0x%llx.",
176 					       erase.addr);
177 			}
178 		}
179 	}
180 	if (!opts->quiet)
181 		printf("\n");
182 
183 	return 0;
184 }
185 
186 #ifdef CONFIG_CMD_NAND_LOCK_UNLOCK
187 
188 #define NAND_CMD_LOCK_TIGHT     0x2c
189 #define NAND_CMD_LOCK_STATUS    0x7a
190 
191 /******************************************************************************
192  * Support for locking / unlocking operations of some NAND devices
193  *****************************************************************************/
194 
195 /**
196  * nand_lock: Set all pages of NAND flash chip to the LOCK or LOCK-TIGHT
197  *	      state
198  *
199  * @param mtd		nand mtd instance
200  * @param tight		bring device in lock tight mode
201  *
202  * @return		0 on success, -1 in case of error
203  *
204  * The lock / lock-tight command only applies to the whole chip. To get some
205  * parts of the chip lock and others unlocked use the following sequence:
206  *
207  * - Lock all pages of the chip using nand_lock(mtd, 0) (or the lockpre pin)
208  * - Call nand_unlock() once for each consecutive area to be unlocked
209  * - If desired: Bring the chip to the lock-tight state using nand_lock(mtd, 1)
210  *
211  *   If the device is in lock-tight state software can't change the
212  *   current active lock/unlock state of all pages. nand_lock() / nand_unlock()
213  *   calls will fail. It is only posible to leave lock-tight state by
214  *   an hardware signal (low pulse on _WP pin) or by power down.
215  */
nand_lock(struct mtd_info * mtd,int tight)216 int nand_lock(struct mtd_info *mtd, int tight)
217 {
218 	int ret = 0;
219 	int status;
220 	struct nand_chip *chip = mtd_to_nand(mtd);
221 
222 	/* select the NAND device */
223 	chip->select_chip(mtd, 0);
224 
225 	/* check the Lock Tight Status */
226 	chip->cmdfunc(mtd, NAND_CMD_LOCK_STATUS, -1, 0);
227 	if (chip->read_byte(mtd) & NAND_LOCK_STATUS_TIGHT) {
228 		printf("nand_lock: Device is locked tight!\n");
229 		ret = -1;
230 		goto out;
231 	}
232 
233 	chip->cmdfunc(mtd,
234 		      (tight ? NAND_CMD_LOCK_TIGHT : NAND_CMD_LOCK),
235 		      -1, -1);
236 
237 	/* call wait ready function */
238 	status = chip->waitfunc(mtd, chip);
239 
240 	/* see if device thinks it succeeded */
241 	if (status & 0x01) {
242 		ret = -1;
243 	}
244 
245  out:
246 	/* de-select the NAND device */
247 	chip->select_chip(mtd, -1);
248 	return ret;
249 }
250 
251 /**
252  * nand_get_lock_status: - query current lock state from one page of NAND
253  *			   flash
254  *
255  * @param mtd		nand mtd instance
256  * @param offset	page address to query (must be page-aligned!)
257  *
258  * @return		-1 in case of error
259  *			>0 lock status:
260  *			  bitfield with the following combinations:
261  *			  NAND_LOCK_STATUS_TIGHT: page in tight state
262  *			  NAND_LOCK_STATUS_UNLOCK: page unlocked
263  *
264  */
nand_get_lock_status(struct mtd_info * mtd,loff_t offset)265 int nand_get_lock_status(struct mtd_info *mtd, loff_t offset)
266 {
267 	int ret = 0;
268 	int chipnr;
269 	int page;
270 	struct nand_chip *chip = mtd_to_nand(mtd);
271 
272 	/* select the NAND device */
273 	chipnr = (int)(offset >> chip->chip_shift);
274 	chip->select_chip(mtd, chipnr);
275 
276 
277 	if ((offset & (mtd->writesize - 1)) != 0) {
278 		printf("nand_get_lock_status: "
279 			"Start address must be beginning of "
280 			"nand page!\n");
281 		ret = -1;
282 		goto out;
283 	}
284 
285 	/* check the Lock Status */
286 	page = (int)(offset >> chip->page_shift);
287 	chip->cmdfunc(mtd, NAND_CMD_LOCK_STATUS, -1, page & chip->pagemask);
288 
289 	ret = chip->read_byte(mtd) & (NAND_LOCK_STATUS_TIGHT
290 					  | NAND_LOCK_STATUS_UNLOCK);
291 
292  out:
293 	/* de-select the NAND device */
294 	chip->select_chip(mtd, -1);
295 	return ret;
296 }
297 
298 /**
299  * nand_unlock: - Unlock area of NAND pages
300  *		  only one consecutive area can be unlocked at one time!
301  *
302  * @param mtd		nand mtd instance
303  * @param start		start byte address
304  * @param length	number of bytes to unlock (must be a multiple of
305  *			page size mtd->writesize)
306  * @param allexcept	if set, unlock everything not selected
307  *
308  * @return		0 on success, -1 in case of error
309  */
nand_unlock(struct mtd_info * mtd,loff_t start,size_t length,int allexcept)310 int nand_unlock(struct mtd_info *mtd, loff_t start, size_t length,
311 	int allexcept)
312 {
313 	int ret = 0;
314 	int chipnr;
315 	int status;
316 	int page;
317 	struct nand_chip *chip = mtd_to_nand(mtd);
318 
319 	debug("nand_unlock%s: start: %08llx, length: %zd!\n",
320 		allexcept ? " (allexcept)" : "", start, length);
321 
322 	/* select the NAND device */
323 	chipnr = (int)(start >> chip->chip_shift);
324 	chip->select_chip(mtd, chipnr);
325 
326 	/* check the WP bit */
327 	chip->cmdfunc(mtd, NAND_CMD_STATUS, -1, -1);
328 	if (!(chip->read_byte(mtd) & NAND_STATUS_WP)) {
329 		printf("nand_unlock: Device is write protected!\n");
330 		ret = -1;
331 		goto out;
332 	}
333 
334 	/* check the Lock Tight Status */
335 	page = (int)(start >> chip->page_shift);
336 	chip->cmdfunc(mtd, NAND_CMD_LOCK_STATUS, -1, page & chip->pagemask);
337 	if (chip->read_byte(mtd) & NAND_LOCK_STATUS_TIGHT) {
338 		printf("nand_unlock: Device is locked tight!\n");
339 		ret = -1;
340 		goto out;
341 	}
342 
343 	if ((start & (mtd->erasesize - 1)) != 0) {
344 		printf("nand_unlock: Start address must be beginning of "
345 			"nand block!\n");
346 		ret = -1;
347 		goto out;
348 	}
349 
350 	if (length == 0 || (length & (mtd->erasesize - 1)) != 0) {
351 		printf("nand_unlock: Length must be a multiple of nand block "
352 			"size %08x!\n", mtd->erasesize);
353 		ret = -1;
354 		goto out;
355 	}
356 
357 	/*
358 	 * Set length so that the last address is set to the
359 	 * starting address of the last block
360 	 */
361 	length -= mtd->erasesize;
362 
363 	/* submit address of first page to unlock */
364 	chip->cmdfunc(mtd, NAND_CMD_UNLOCK1, -1, page & chip->pagemask);
365 
366 	/* submit ADDRESS of LAST page to unlock */
367 	page += (int)(length >> chip->page_shift);
368 
369 	/*
370 	 * Page addresses for unlocking are supposed to be block-aligned.
371 	 * At least some NAND chips use the low bit to indicate that the
372 	 * page range should be inverted.
373 	 */
374 	if (allexcept)
375 		page |= 1;
376 
377 	chip->cmdfunc(mtd, NAND_CMD_UNLOCK2, -1, page & chip->pagemask);
378 
379 	/* call wait ready function */
380 	status = chip->waitfunc(mtd, chip);
381 	/* see if device thinks it succeeded */
382 	if (status & 0x01) {
383 		/* there was an error */
384 		ret = -1;
385 		goto out;
386 	}
387 
388  out:
389 	/* de-select the NAND device */
390 	chip->select_chip(mtd, -1);
391 	return ret;
392 }
393 #endif
394 
395 /**
396  * check_skip_len
397  *
398  * Check if there are any bad blocks, and whether length including bad
399  * blocks fits into device
400  *
401  * @param mtd nand mtd instance
402  * @param offset offset in flash
403  * @param length image length
404  * @param used length of flash needed for the requested length
405  * @return 0 if the image fits and there are no bad blocks
406  *         1 if the image fits, but there are bad blocks
407  *        -1 if the image does not fit
408  */
check_skip_len(struct mtd_info * mtd,loff_t offset,size_t length,size_t * used)409 static int check_skip_len(struct mtd_info *mtd, loff_t offset, size_t length,
410 			  size_t *used)
411 {
412 	size_t len_excl_bad = 0;
413 	int ret = 0;
414 
415 	while (len_excl_bad < length) {
416 		size_t block_len, block_off;
417 		loff_t block_start;
418 
419 		if (offset >= mtd->size)
420 			return -1;
421 
422 		block_start = offset & ~(loff_t)(mtd->erasesize - 1);
423 		block_off = offset & (mtd->erasesize - 1);
424 		block_len = mtd->erasesize - block_off;
425 
426 		if (!nand_block_isbad(mtd, block_start))
427 			len_excl_bad += block_len;
428 		else
429 			ret = 1;
430 
431 		offset += block_len;
432 		*used += block_len;
433 	}
434 
435 	/* If the length is not a multiple of block_len, adjust. */
436 	if (len_excl_bad > length)
437 		*used -= (len_excl_bad - length);
438 
439 	return ret;
440 }
441 
442 #ifdef CONFIG_CMD_NAND_TRIMFFS
drop_ffs(const struct mtd_info * mtd,const u_char * buf,const size_t * len)443 static size_t drop_ffs(const struct mtd_info *mtd, const u_char *buf,
444 			const size_t *len)
445 {
446 	size_t l = *len;
447 	ssize_t i;
448 
449 	for (i = l - 1; i >= 0; i--)
450 		if (buf[i] != 0xFF)
451 			break;
452 
453 	/* The resulting length must be aligned to the minimum flash I/O size */
454 	l = i + 1;
455 	l = (l + mtd->writesize - 1) / mtd->writesize;
456 	l *=  mtd->writesize;
457 
458 	/*
459 	 * since the input length may be unaligned, prevent access past the end
460 	 * of the buffer
461 	 */
462 	return min(l, *len);
463 }
464 #endif
465 
466 /**
467  * nand_verify_page_oob:
468  *
469  * Verify a page of NAND flash, including the OOB.
470  * Reads page of NAND and verifies the contents and OOB against the
471  * values in ops.
472  *
473  * @param mtd		nand mtd instance
474  * @param ops		MTD operations, including data to verify
475  * @param ofs		offset in flash
476  * @return		0 in case of success
477  */
nand_verify_page_oob(struct mtd_info * mtd,struct mtd_oob_ops * ops,loff_t ofs)478 int nand_verify_page_oob(struct mtd_info *mtd, struct mtd_oob_ops *ops,
479 			 loff_t ofs)
480 {
481 	int rval;
482 	struct mtd_oob_ops vops;
483 	size_t verlen = mtd->writesize + mtd->oobsize;
484 
485 	memcpy(&vops, ops, sizeof(vops));
486 
487 	vops.datbuf = memalign(ARCH_DMA_MINALIGN, verlen);
488 
489 	if (!vops.datbuf)
490 		return -ENOMEM;
491 
492 	vops.oobbuf = vops.datbuf + mtd->writesize;
493 
494 	rval = mtd_read_oob(mtd, ofs, &vops);
495 	if (!rval)
496 		rval = memcmp(ops->datbuf, vops.datbuf, vops.len);
497 	if (!rval)
498 		rval = memcmp(ops->oobbuf, vops.oobbuf, vops.ooblen);
499 
500 	free(vops.datbuf);
501 
502 	return rval ? -EIO : 0;
503 }
504 
505 /**
506  * nand_verify:
507  *
508  * Verify a region of NAND flash.
509  * Reads NAND in page-sized chunks and verifies the contents against
510  * the contents of a buffer.  The offset into the NAND must be
511  * page-aligned, and the function doesn't handle skipping bad blocks.
512  *
513  * @param mtd		nand mtd instance
514  * @param ofs		offset in flash
515  * @param len		buffer length
516  * @param buf		buffer to read from
517  * @return		0 in case of success
518  */
nand_verify(struct mtd_info * mtd,loff_t ofs,size_t len,u_char * buf)519 int nand_verify(struct mtd_info *mtd, loff_t ofs, size_t len, u_char *buf)
520 {
521 	int rval = 0;
522 	size_t verofs;
523 	size_t verlen = mtd->writesize;
524 	uint8_t *verbuf = memalign(ARCH_DMA_MINALIGN, verlen);
525 
526 	if (!verbuf)
527 		return -ENOMEM;
528 
529 	/* Read the NAND back in page-size groups to limit malloc size */
530 	for (verofs = ofs; verofs < ofs + len;
531 	     verofs += verlen, buf += verlen) {
532 		verlen = min(mtd->writesize, (uint32_t)(ofs + len - verofs));
533 		rval = nand_read(mtd, verofs, &verlen, verbuf);
534 		if (!rval || (rval == -EUCLEAN))
535 			rval = memcmp(buf, verbuf, verlen);
536 
537 		if (rval)
538 			break;
539 	}
540 
541 	free(verbuf);
542 
543 	return rval ? -EIO : 0;
544 }
545 
546 
547 
548 /**
549  * nand_write_skip_bad:
550  *
551  * Write image to NAND flash.
552  * Blocks that are marked bad are skipped and the is written to the next
553  * block instead as long as the image is short enough to fit even after
554  * skipping the bad blocks.  Due to bad blocks we may not be able to
555  * perform the requested write.  In the case where the write would
556  * extend beyond the end of the NAND device, both length and actual (if
557  * not NULL) are set to 0.  In the case where the write would extend
558  * beyond the limit we are passed, length is set to 0 and actual is set
559  * to the required length.
560  *
561  * @param mtd		nand mtd instance
562  * @param offset	offset in flash
563  * @param length	buffer length
564  * @param actual	set to size required to write length worth of
565  *			buffer or 0 on error, if not NULL
566  * @param lim		maximum size that actual may be in order to not
567  *			exceed the buffer
568  * @param buffer        buffer to read from
569  * @param flags		flags modifying the behaviour of the write to NAND
570  * @return		0 in case of success
571  */
nand_write_skip_bad(struct mtd_info * mtd,loff_t offset,size_t * length,size_t * actual,loff_t lim,u_char * buffer,int flags)572 int nand_write_skip_bad(struct mtd_info *mtd, loff_t offset, size_t *length,
573 			size_t *actual, loff_t lim, u_char *buffer, int flags)
574 {
575 	int rval = 0, blocksize;
576 	size_t left_to_write = *length;
577 	size_t used_for_write = 0;
578 	u_char *p_buffer = buffer;
579 	int need_skip;
580 
581 	if (actual)
582 		*actual = 0;
583 
584 	blocksize = mtd->erasesize;
585 
586 	/*
587 	 * nand_write() handles unaligned, partial page writes.
588 	 *
589 	 * We allow length to be unaligned, for convenience in
590 	 * using the $filesize variable.
591 	 *
592 	 * However, starting at an unaligned offset makes the
593 	 * semantics of bad block skipping ambiguous (really,
594 	 * you should only start a block skipping access at a
595 	 * partition boundary).  So don't try to handle that.
596 	 */
597 	if ((offset & (mtd->writesize - 1)) != 0) {
598 		printf("Attempt to write non page-aligned data\n");
599 		*length = 0;
600 		return -EINVAL;
601 	}
602 
603 	need_skip = check_skip_len(mtd, offset, *length, &used_for_write);
604 
605 	if (actual)
606 		*actual = used_for_write;
607 
608 	if (need_skip < 0) {
609 		printf("Attempt to write outside the flash area\n");
610 		*length = 0;
611 		return -EINVAL;
612 	}
613 
614 	if (used_for_write > lim) {
615 		puts("Size of write exceeds partition or device limit\n");
616 		*length = 0;
617 		return -EFBIG;
618 	}
619 
620 	if (!need_skip && !(flags & WITH_DROP_FFS)) {
621 		rval = nand_write(mtd, offset, length, buffer);
622 
623 		if ((flags & WITH_WR_VERIFY) && !rval)
624 			rval = nand_verify(mtd, offset, *length, buffer);
625 
626 		if (rval == 0)
627 			return 0;
628 
629 		*length = 0;
630 		printf("NAND write to offset %llx failed %d\n",
631 			offset, rval);
632 		return rval;
633 	}
634 
635 	while (left_to_write > 0) {
636 		size_t block_offset = offset & (mtd->erasesize - 1);
637 		size_t write_size, truncated_write_size;
638 
639 		WATCHDOG_RESET();
640 
641 		if (nand_block_isbad(mtd, offset & ~(mtd->erasesize - 1))) {
642 			printf("Skip bad block 0x%08llx\n",
643 				offset & ~(mtd->erasesize - 1));
644 			offset += mtd->erasesize - block_offset;
645 			continue;
646 		}
647 
648 		if (left_to_write < (blocksize - block_offset))
649 			write_size = left_to_write;
650 		else
651 			write_size = blocksize - block_offset;
652 
653 		truncated_write_size = write_size;
654 #ifdef CONFIG_CMD_NAND_TRIMFFS
655 		if (flags & WITH_DROP_FFS)
656 			truncated_write_size = drop_ffs(mtd, p_buffer,
657 					&write_size);
658 #endif
659 
660 		rval = nand_write(mtd, offset, &truncated_write_size,
661 				p_buffer);
662 
663 		if ((flags & WITH_WR_VERIFY) && !rval)
664 			rval = nand_verify(mtd, offset,
665 				truncated_write_size, p_buffer);
666 
667 		offset += write_size;
668 		p_buffer += write_size;
669 
670 		if (rval != 0) {
671 			printf("NAND write to offset %llx failed %d\n",
672 				offset, rval);
673 			*length -= left_to_write;
674 			return rval;
675 		}
676 
677 		left_to_write -= write_size;
678 	}
679 
680 	return 0;
681 }
682 
683 /**
684  * nand_read_skip_bad:
685  *
686  * Read image from NAND flash.
687  * Blocks that are marked bad are skipped and the next block is read
688  * instead as long as the image is short enough to fit even after
689  * skipping the bad blocks.  Due to bad blocks we may not be able to
690  * perform the requested read.  In the case where the read would extend
691  * beyond the end of the NAND device, both length and actual (if not
692  * NULL) are set to 0.  In the case where the read would extend beyond
693  * the limit we are passed, length is set to 0 and actual is set to the
694  * required length.
695  *
696  * @param mtd nand mtd instance
697  * @param offset offset in flash
698  * @param length buffer length, on return holds number of read bytes
699  * @param actual set to size required to read length worth of buffer or 0
700  * on error, if not NULL
701  * @param lim maximum size that actual may be in order to not exceed the
702  * buffer
703  * @param buffer buffer to write to
704  * @return 0 in case of success
705  */
nand_read_skip_bad(struct mtd_info * mtd,loff_t offset,size_t * length,size_t * actual,loff_t lim,u_char * buffer)706 int nand_read_skip_bad(struct mtd_info *mtd, loff_t offset, size_t *length,
707 		       size_t *actual, loff_t lim, u_char *buffer)
708 {
709 	int rval;
710 	size_t left_to_read = *length;
711 	size_t used_for_read = 0;
712 	u_char *p_buffer = buffer;
713 	int need_skip;
714 
715 	need_skip = check_skip_len(mtd, offset, *length, &used_for_read);
716 
717 	if (actual)
718 		*actual = used_for_read;
719 
720 	if (need_skip < 0) {
721 		printf("Attempt to read outside the flash area\n");
722 		*length = 0;
723 		return -EINVAL;
724 	}
725 
726 	if (used_for_read > lim) {
727 		puts("Size of read exceeds partition or device limit\n");
728 		*length = 0;
729 		return -EFBIG;
730 	}
731 
732 	if (!need_skip) {
733 		rval = nand_read(mtd, offset, length, buffer);
734 		if (!rval || rval == -EUCLEAN)
735 			return 0;
736 
737 		*length = 0;
738 		printf("NAND read from offset %llx failed %d\n",
739 			offset, rval);
740 		return rval;
741 	}
742 
743 	while (left_to_read > 0) {
744 		size_t block_offset = offset & (mtd->erasesize - 1);
745 		size_t read_length;
746 
747 		WATCHDOG_RESET();
748 
749 		if (nand_block_isbad(mtd, offset & ~(mtd->erasesize - 1))) {
750 			printf("Skipping bad block 0x%08llx\n",
751 				offset & ~(mtd->erasesize - 1));
752 			offset += mtd->erasesize - block_offset;
753 			continue;
754 		}
755 
756 		if (left_to_read < (mtd->erasesize - block_offset))
757 			read_length = left_to_read;
758 		else
759 			read_length = mtd->erasesize - block_offset;
760 
761 		rval = nand_read(mtd, offset, &read_length, p_buffer);
762 		if (rval && rval != -EUCLEAN) {
763 			printf("NAND read from offset %llx failed %d\n",
764 				offset, rval);
765 			*length -= left_to_read;
766 			return rval;
767 		}
768 
769 		left_to_read -= read_length;
770 		offset       += read_length;
771 		p_buffer     += read_length;
772 	}
773 
774 	return 0;
775 }
776 
777 #ifdef CONFIG_CMD_NAND_TORTURE
778 
779 /**
780  * check_pattern:
781  *
782  * Check if buffer contains only a certain byte pattern.
783  *
784  * @param buf buffer to check
785  * @param patt the pattern to check
786  * @param size buffer size in bytes
787  * @return 1 if there are only patt bytes in buf
788  *         0 if something else was found
789  */
check_pattern(const u_char * buf,u_char patt,int size)790 static int check_pattern(const u_char *buf, u_char patt, int size)
791 {
792 	int i;
793 
794 	for (i = 0; i < size; i++)
795 		if (buf[i] != patt)
796 			return 0;
797 	return 1;
798 }
799 
800 /**
801  * nand_torture:
802  *
803  * Torture a block of NAND flash.
804  * This is useful to determine if a block that caused a write error is still
805  * good or should be marked as bad.
806  *
807  * @param mtd nand mtd instance
808  * @param offset offset in flash
809  * @return 0 if the block is still good
810  */
nand_torture(struct mtd_info * mtd,loff_t offset)811 int nand_torture(struct mtd_info *mtd, loff_t offset)
812 {
813 	u_char patterns[] = {0xa5, 0x5a, 0x00};
814 	struct erase_info instr = {
815 		.mtd = mtd,
816 		.addr = offset,
817 		.len = mtd->erasesize,
818 	};
819 	size_t retlen;
820 	int err, ret = -1, i, patt_count;
821 	u_char *buf;
822 
823 	if ((offset & (mtd->erasesize - 1)) != 0) {
824 		puts("Attempt to torture a block at a non block-aligned offset\n");
825 		return -EINVAL;
826 	}
827 
828 	if (offset + mtd->erasesize > mtd->size) {
829 		puts("Attempt to torture a block outside the flash area\n");
830 		return -EINVAL;
831 	}
832 
833 	patt_count = ARRAY_SIZE(patterns);
834 
835 	buf = malloc_cache_aligned(mtd->erasesize);
836 	if (buf == NULL) {
837 		puts("Out of memory for erase block buffer\n");
838 		return -ENOMEM;
839 	}
840 
841 	for (i = 0; i < patt_count; i++) {
842 		err = mtd_erase(mtd, &instr);
843 		if (err) {
844 			printf("%s: erase() failed for block at 0x%llx: %d\n",
845 				mtd->name, instr.addr, err);
846 			goto out;
847 		}
848 
849 		/* Make sure the block contains only 0xff bytes */
850 		err = mtd_read(mtd, offset, mtd->erasesize, &retlen, buf);
851 		if ((err && err != -EUCLEAN) || retlen != mtd->erasesize) {
852 			printf("%s: read() failed for block at 0x%llx: %d\n",
853 				mtd->name, instr.addr, err);
854 			goto out;
855 		}
856 
857 		err = check_pattern(buf, 0xff, mtd->erasesize);
858 		if (!err) {
859 			printf("Erased block at 0x%llx, but a non-0xff byte was found\n",
860 				offset);
861 			ret = -EIO;
862 			goto out;
863 		}
864 
865 		/* Write a pattern and check it */
866 		memset(buf, patterns[i], mtd->erasesize);
867 		err = mtd_write(mtd, offset, mtd->erasesize, &retlen, buf);
868 		if (err || retlen != mtd->erasesize) {
869 			printf("%s: write() failed for block at 0x%llx: %d\n",
870 				mtd->name, instr.addr, err);
871 			goto out;
872 		}
873 
874 		err = mtd_read(mtd, offset, mtd->erasesize, &retlen, buf);
875 		if ((err && err != -EUCLEAN) || retlen != mtd->erasesize) {
876 			printf("%s: read() failed for block at 0x%llx: %d\n",
877 				mtd->name, instr.addr, err);
878 			goto out;
879 		}
880 
881 		err = check_pattern(buf, patterns[i], mtd->erasesize);
882 		if (!err) {
883 			printf("Pattern 0x%.2x checking failed for block at "
884 					"0x%llx\n", patterns[i], offset);
885 			ret = -EIO;
886 			goto out;
887 		}
888 	}
889 
890 	ret = 0;
891 
892 out:
893 	free(buf);
894 	return ret;
895 }
896 
897 #endif
898