1 /*
2  *  drivers/mtd/nand_bbt.c
3  *
4  *  Overview:
5  *   Bad block table support for the NAND driver
6  *
7  *  Copyright (C) 2004 Thomas Gleixner (tglx@linutronix.de)
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License version 2 as
11  * published by the Free Software Foundation.
12  *
13  * Description:
14  *
15  * When nand_scan_bbt is called, then it tries to find the bad block table
16  * depending on the options in the BBT descriptor(s). If no flash based BBT
17  * (NAND_BBT_USE_FLASH) is specified then the device is scanned for factory
18  * marked good / bad blocks. This information is used to create a memory BBT.
19  * Once a new bad block is discovered then the "factory" information is updated
20  * on the device.
21  * If a flash based BBT is specified then the function first tries to find the
22  * BBT on flash. If a BBT is found then the contents are read and the memory
23  * based BBT is created. If a mirrored BBT is selected then the mirror is
24  * searched too and the versions are compared. If the mirror has a greater
25  * version number than the mirror BBT is used to build the memory based BBT.
26  * If the tables are not versioned, then we "or" the bad block information.
27  * If one of the BBTs is out of date or does not exist it is (re)created.
28  * If no BBT exists at all then the device is scanned for factory marked
29  * good / bad blocks and the bad block tables are created.
30  *
31  * For manufacturer created BBTs like the one found on M-SYS DOC devices
32  * the BBT is searched and read but never created
33  *
34  * The auto generated bad block table is located in the last good blocks
35  * of the device. The table is mirrored, so it can be updated eventually.
36  * The table is marked in the OOB area with an ident pattern and a version
37  * number which indicates which of both tables is more up to date. If the NAND
38  * controller needs the complete OOB area for the ECC information then the
39  * option NAND_BBT_NO_OOB should be used (along with NAND_BBT_USE_FLASH, of
40  * course): it moves the ident pattern and the version byte into the data area
41  * and the OOB area will remain untouched.
42  *
43  * The table uses 2 bits per block
44  * 11b:		block is good
45  * 00b:		block is factory marked bad
46  * 01b, 10b:	block is marked bad due to wear
47  *
48  * The memory bad block table uses the following scheme:
49  * 00b:		block is good
50  * 01b:		block is marked bad due to wear
51  * 10b:		block is reserved (to protect the bbt area)
52  * 11b:		block is factory marked bad
53  *
54  * Multichip devices like DOC store the bad block info per floor.
55  *
56  * Following assumptions are made:
57  * - bbts start at a page boundary, if autolocated on a block boundary
58  * - the space necessary for a bbt in FLASH does not exceed a block boundary
59  *
60  */
61 
62 #include <linux/slab.h>
63 #include <linux/types.h>
64 #include <linux/mtd/mtd.h>
65 #include <linux/mtd/nand.h>
66 #include <linux/mtd/nand_ecc.h>
67 #include <linux/bitops.h>
68 #include <linux/delay.h>
69 #include <linux/vmalloc.h>
70 #include <linux/export.h>
71 
check_pattern_no_oob(uint8_t * buf,struct nand_bbt_descr * td)72 static int check_pattern_no_oob(uint8_t *buf, struct nand_bbt_descr *td)
73 {
74 	int ret;
75 
76 	ret = memcmp(buf, td->pattern, td->len);
77 	if (!ret)
78 		return ret;
79 	return -1;
80 }
81 
82 /**
83  * check_pattern - [GENERIC] check if a pattern is in the buffer
84  * @buf: the buffer to search
85  * @len: the length of buffer to search
86  * @paglen: the pagelength
87  * @td: search pattern descriptor
88  *
89  * Check for a pattern at the given place. Used to search bad block tables and
90  * good / bad block identifiers. If the SCAN_EMPTY option is set then check, if
91  * all bytes except the pattern area contain 0xff.
92  */
check_pattern(uint8_t * buf,int len,int paglen,struct nand_bbt_descr * td)93 static int check_pattern(uint8_t *buf, int len, int paglen, struct nand_bbt_descr *td)
94 {
95 	int i, end = 0;
96 	uint8_t *p = buf;
97 
98 	if (td->options & NAND_BBT_NO_OOB)
99 		return check_pattern_no_oob(buf, td);
100 
101 	end = paglen + td->offs;
102 	if (td->options & NAND_BBT_SCANEMPTY) {
103 		for (i = 0; i < end; i++) {
104 			if (p[i] != 0xff)
105 				return -1;
106 		}
107 	}
108 	p += end;
109 
110 	/* Compare the pattern */
111 	if (memcmp(p, td->pattern, td->len))
112 		return -1;
113 
114 	if (td->options & NAND_BBT_SCANEMPTY) {
115 		p += td->len;
116 		end += td->len;
117 		for (i = end; i < len; i++) {
118 			if (*p++ != 0xff)
119 				return -1;
120 		}
121 	}
122 	return 0;
123 }
124 
125 /**
126  * check_short_pattern - [GENERIC] check if a pattern is in the buffer
127  * @buf: the buffer to search
128  * @td:	search pattern descriptor
129  *
130  * Check for a pattern at the given place. Used to search bad block tables and
131  * good / bad block identifiers. Same as check_pattern, but no optional empty
132  * check.
133  */
check_short_pattern(uint8_t * buf,struct nand_bbt_descr * td)134 static int check_short_pattern(uint8_t *buf, struct nand_bbt_descr *td)
135 {
136 	int i;
137 	uint8_t *p = buf;
138 
139 	/* Compare the pattern */
140 	for (i = 0; i < td->len; i++) {
141 		if (p[td->offs + i] != td->pattern[i])
142 			return -1;
143 	}
144 	return 0;
145 }
146 
147 /**
148  * add_marker_len - compute the length of the marker in data area
149  * @td: BBT descriptor used for computation
150  *
151  * The length will be 0 if the marker is located in OOB area.
152  */
add_marker_len(struct nand_bbt_descr * td)153 static u32 add_marker_len(struct nand_bbt_descr *td)
154 {
155 	u32 len;
156 
157 	if (!(td->options & NAND_BBT_NO_OOB))
158 		return 0;
159 
160 	len = td->len;
161 	if (td->options & NAND_BBT_VERSION)
162 		len++;
163 	return len;
164 }
165 
166 /**
167  * read_bbt - [GENERIC] Read the bad block table starting from page
168  * @mtd: MTD device structure
169  * @buf: temporary buffer
170  * @page: the starting page
171  * @num: the number of bbt descriptors to read
172  * @td: the bbt describtion table
173  * @offs: offset in the memory table
174  *
175  * Read the bad block table starting from page.
176  */
read_bbt(struct mtd_info * mtd,uint8_t * buf,int page,int num,struct nand_bbt_descr * td,int offs)177 static int read_bbt(struct mtd_info *mtd, uint8_t *buf, int page, int num,
178 		struct nand_bbt_descr *td, int offs)
179 {
180 	int res, ret = 0, i, j, act = 0;
181 	struct nand_chip *this = mtd->priv;
182 	size_t retlen, len, totlen;
183 	loff_t from;
184 	int bits = td->options & NAND_BBT_NRBITS_MSK;
185 	uint8_t msk = (uint8_t)((1 << bits) - 1);
186 	u32 marker_len;
187 	int reserved_block_code = td->reserved_block_code;
188 
189 	totlen = (num * bits) >> 3;
190 	marker_len = add_marker_len(td);
191 	from = ((loff_t)page) << this->page_shift;
192 
193 	while (totlen) {
194 		len = min(totlen, (size_t)(1 << this->bbt_erase_shift));
195 		if (marker_len) {
196 			/*
197 			 * In case the BBT marker is not in the OOB area it
198 			 * will be just in the first page.
199 			 */
200 			len -= marker_len;
201 			from += marker_len;
202 			marker_len = 0;
203 		}
204 		res = mtd_read(mtd, from, len, &retlen, buf);
205 		if (res < 0) {
206 			if (mtd_is_eccerr(res)) {
207 				pr_info("nand_bbt: ECC error in BBT at "
208 					"0x%012llx\n", from & ~mtd->writesize);
209 				return res;
210 			} else if (mtd_is_bitflip(res)) {
211 				pr_info("nand_bbt: corrected error in BBT at "
212 					"0x%012llx\n", from & ~mtd->writesize);
213 				ret = res;
214 			} else {
215 				pr_info("nand_bbt: error reading BBT\n");
216 				return res;
217 			}
218 		}
219 
220 		/* Analyse data */
221 		for (i = 0; i < len; i++) {
222 			uint8_t dat = buf[i];
223 			for (j = 0; j < 8; j += bits, act += 2) {
224 				uint8_t tmp = (dat >> j) & msk;
225 				if (tmp == msk)
226 					continue;
227 				if (reserved_block_code && (tmp == reserved_block_code)) {
228 					pr_info("nand_read_bbt: reserved block at 0x%012llx\n",
229 						 (loff_t)((offs << 2) + (act >> 1)) << this->bbt_erase_shift);
230 					this->bbt[offs + (act >> 3)] |= 0x2 << (act & 0x06);
231 					mtd->ecc_stats.bbtblocks++;
232 					continue;
233 				}
234 				/*
235 				 * Leave it for now, if it's matured we can
236 				 * move this message to pr_debug.
237 				 */
238 				pr_info("nand_read_bbt: bad block at 0x%012llx\n",
239 					 (loff_t)((offs << 2) + (act >> 1)) << this->bbt_erase_shift);
240 				/* Factory marked bad or worn out? */
241 				if (tmp == 0)
242 					this->bbt[offs + (act >> 3)] |= 0x3 << (act & 0x06);
243 				else
244 					this->bbt[offs + (act >> 3)] |= 0x1 << (act & 0x06);
245 				mtd->ecc_stats.badblocks++;
246 			}
247 		}
248 		totlen -= len;
249 		from += len;
250 	}
251 	return ret;
252 }
253 
254 /**
255  * read_abs_bbt - [GENERIC] Read the bad block table starting at a given page
256  * @mtd: MTD device structure
257  * @buf: temporary buffer
258  * @td: descriptor for the bad block table
259  * @chip: read the table for a specific chip, -1 read all chips; applies only if
260  *        NAND_BBT_PERCHIP option is set
261  *
262  * Read the bad block table for all chips starting at a given page. We assume
263  * that the bbt bits are in consecutive order.
264  */
read_abs_bbt(struct mtd_info * mtd,uint8_t * buf,struct nand_bbt_descr * td,int chip)265 static int read_abs_bbt(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr *td, int chip)
266 {
267 	struct nand_chip *this = mtd->priv;
268 	int res = 0, i;
269 
270 	if (td->options & NAND_BBT_PERCHIP) {
271 		int offs = 0;
272 		for (i = 0; i < this->numchips; i++) {
273 			if (chip == -1 || chip == i)
274 				res = read_bbt(mtd, buf, td->pages[i],
275 					this->chipsize >> this->bbt_erase_shift,
276 					td, offs);
277 			if (res)
278 				return res;
279 			offs += this->chipsize >> (this->bbt_erase_shift + 2);
280 		}
281 	} else {
282 		res = read_bbt(mtd, buf, td->pages[0],
283 				mtd->size >> this->bbt_erase_shift, td, 0);
284 		if (res)
285 			return res;
286 	}
287 	return 0;
288 }
289 
290 /* BBT marker is in the first page, no OOB */
scan_read_raw_data(struct mtd_info * mtd,uint8_t * buf,loff_t offs,struct nand_bbt_descr * td)291 static int scan_read_raw_data(struct mtd_info *mtd, uint8_t *buf, loff_t offs,
292 			 struct nand_bbt_descr *td)
293 {
294 	size_t retlen;
295 	size_t len;
296 
297 	len = td->len;
298 	if (td->options & NAND_BBT_VERSION)
299 		len++;
300 
301 	return mtd_read(mtd, offs, len, &retlen, buf);
302 }
303 
304 /* Scan read raw data from flash */
scan_read_raw_oob(struct mtd_info * mtd,uint8_t * buf,loff_t offs,size_t len)305 static int scan_read_raw_oob(struct mtd_info *mtd, uint8_t *buf, loff_t offs,
306 			 size_t len)
307 {
308 	struct mtd_oob_ops ops;
309 	int res;
310 
311 	ops.mode = MTD_OPS_RAW;
312 	ops.ooboffs = 0;
313 	ops.ooblen = mtd->oobsize;
314 
315 	while (len > 0) {
316 		ops.datbuf = buf;
317 		ops.len = min(len, (size_t)mtd->writesize);
318 		ops.oobbuf = buf + ops.len;
319 
320 		res = mtd_read_oob(mtd, offs, &ops);
321 
322 		if (res)
323 			return res;
324 
325 		buf += mtd->oobsize + mtd->writesize;
326 		len -= mtd->writesize;
327 	}
328 	return 0;
329 }
330 
scan_read_raw(struct mtd_info * mtd,uint8_t * buf,loff_t offs,size_t len,struct nand_bbt_descr * td)331 static int scan_read_raw(struct mtd_info *mtd, uint8_t *buf, loff_t offs,
332 			 size_t len, struct nand_bbt_descr *td)
333 {
334 	if (td->options & NAND_BBT_NO_OOB)
335 		return scan_read_raw_data(mtd, buf, offs, td);
336 	else
337 		return scan_read_raw_oob(mtd, buf, offs, len);
338 }
339 
340 /* Scan write data with oob to flash */
scan_write_bbt(struct mtd_info * mtd,loff_t offs,size_t len,uint8_t * buf,uint8_t * oob)341 static int scan_write_bbt(struct mtd_info *mtd, loff_t offs, size_t len,
342 			  uint8_t *buf, uint8_t *oob)
343 {
344 	struct mtd_oob_ops ops;
345 
346 	ops.mode = MTD_OPS_PLACE_OOB;
347 	ops.ooboffs = 0;
348 	ops.ooblen = mtd->oobsize;
349 	ops.datbuf = buf;
350 	ops.oobbuf = oob;
351 	ops.len = len;
352 
353 	return mtd_write_oob(mtd, offs, &ops);
354 }
355 
bbt_get_ver_offs(struct mtd_info * mtd,struct nand_bbt_descr * td)356 static u32 bbt_get_ver_offs(struct mtd_info *mtd, struct nand_bbt_descr *td)
357 {
358 	u32 ver_offs = td->veroffs;
359 
360 	if (!(td->options & NAND_BBT_NO_OOB))
361 		ver_offs += mtd->writesize;
362 	return ver_offs;
363 }
364 
365 /**
366  * read_abs_bbts - [GENERIC] Read the bad block table(s) for all chips starting at a given page
367  * @mtd: MTD device structure
368  * @buf: temporary buffer
369  * @td: descriptor for the bad block table
370  * @md:	descriptor for the bad block table mirror
371  *
372  * Read the bad block table(s) for all chips starting at a given page. We
373  * assume that the bbt bits are in consecutive order.
374  */
read_abs_bbts(struct mtd_info * mtd,uint8_t * buf,struct nand_bbt_descr * td,struct nand_bbt_descr * md)375 static int read_abs_bbts(struct mtd_info *mtd, uint8_t *buf,
376 			 struct nand_bbt_descr *td, struct nand_bbt_descr *md)
377 {
378 	struct nand_chip *this = mtd->priv;
379 
380 	/* Read the primary version, if available */
381 	if (td->options & NAND_BBT_VERSION) {
382 		scan_read_raw(mtd, buf, (loff_t)td->pages[0] << this->page_shift,
383 			      mtd->writesize, td);
384 		td->version[0] = buf[bbt_get_ver_offs(mtd, td)];
385 		pr_info("Bad block table at page %d, version 0x%02X\n",
386 			 td->pages[0], td->version[0]);
387 	}
388 
389 	/* Read the mirror version, if available */
390 	if (md && (md->options & NAND_BBT_VERSION)) {
391 		scan_read_raw(mtd, buf, (loff_t)md->pages[0] << this->page_shift,
392 			      mtd->writesize, td);
393 		md->version[0] = buf[bbt_get_ver_offs(mtd, md)];
394 		pr_info("Bad block table at page %d, version 0x%02X\n",
395 			 md->pages[0], md->version[0]);
396 	}
397 	return 1;
398 }
399 
400 /* Scan a given block full */
scan_block_full(struct mtd_info * mtd,struct nand_bbt_descr * bd,loff_t offs,uint8_t * buf,size_t readlen,int scanlen,int len)401 static int scan_block_full(struct mtd_info *mtd, struct nand_bbt_descr *bd,
402 			   loff_t offs, uint8_t *buf, size_t readlen,
403 			   int scanlen, int len)
404 {
405 	int ret, j;
406 
407 	ret = scan_read_raw_oob(mtd, buf, offs, readlen);
408 	/* Ignore ECC errors when checking for BBM */
409 	if (ret && !mtd_is_bitflip_or_eccerr(ret))
410 		return ret;
411 
412 	for (j = 0; j < len; j++, buf += scanlen) {
413 		if (check_pattern(buf, scanlen, mtd->writesize, bd))
414 			return 1;
415 	}
416 	return 0;
417 }
418 
419 /* Scan a given block partially */
scan_block_fast(struct mtd_info * mtd,struct nand_bbt_descr * bd,loff_t offs,uint8_t * buf,int len)420 static int scan_block_fast(struct mtd_info *mtd, struct nand_bbt_descr *bd,
421 			   loff_t offs, uint8_t *buf, int len)
422 {
423 	struct mtd_oob_ops ops;
424 	int j, ret;
425 
426 	ops.ooblen = mtd->oobsize;
427 	ops.oobbuf = buf;
428 	ops.ooboffs = 0;
429 	ops.datbuf = NULL;
430 	ops.mode = MTD_OPS_PLACE_OOB;
431 
432 	for (j = 0; j < len; j++) {
433 		/*
434 		 * Read the full oob until read_oob is fixed to handle single
435 		 * byte reads for 16 bit buswidth.
436 		 */
437 		ret = mtd_read_oob(mtd, offs, &ops);
438 		/* Ignore ECC errors when checking for BBM */
439 		if (ret && !mtd_is_bitflip_or_eccerr(ret))
440 			return ret;
441 
442 		if (check_short_pattern(buf, bd))
443 			return 1;
444 
445 		offs += mtd->writesize;
446 	}
447 	return 0;
448 }
449 
450 /**
451  * create_bbt - [GENERIC] Create a bad block table by scanning the device
452  * @mtd: MTD device structure
453  * @buf: temporary buffer
454  * @bd: descriptor for the good/bad block search pattern
455  * @chip: create the table for a specific chip, -1 read all chips; applies only
456  *        if NAND_BBT_PERCHIP option is set
457  *
458  * Create a bad block table by scanning the device for the given good/bad block
459  * identify pattern.
460  */
create_bbt(struct mtd_info * mtd,uint8_t * buf,struct nand_bbt_descr * bd,int chip)461 static int create_bbt(struct mtd_info *mtd, uint8_t *buf,
462 	struct nand_bbt_descr *bd, int chip)
463 {
464 	struct nand_chip *this = mtd->priv;
465 	int i, numblocks, len, scanlen;
466 	int startblock;
467 	loff_t from;
468 	size_t readlen;
469 
470 	pr_info("Scanning device for bad blocks\n");
471 
472 	if (bd->options & NAND_BBT_SCANALLPAGES)
473 		len = 1 << (this->bbt_erase_shift - this->page_shift);
474 	else if (bd->options & NAND_BBT_SCAN2NDPAGE)
475 		len = 2;
476 	else
477 		len = 1;
478 
479 	if (!(bd->options & NAND_BBT_SCANEMPTY)) {
480 		/* We need only read few bytes from the OOB area */
481 		scanlen = 0;
482 		readlen = bd->len;
483 	} else {
484 		/* Full page content should be read */
485 		scanlen = mtd->writesize + mtd->oobsize;
486 		readlen = len * mtd->writesize;
487 	}
488 
489 	if (chip == -1) {
490 		/*
491 		 * Note that numblocks is 2 * (real numblocks) here, see i+=2
492 		 * below as it makes shifting and masking less painful
493 		 */
494 		numblocks = mtd->size >> (this->bbt_erase_shift - 1);
495 		startblock = 0;
496 		from = 0;
497 	} else {
498 		if (chip >= this->numchips) {
499 			pr_warn("create_bbt(): chipnr (%d) > available chips (%d)\n",
500 			       chip + 1, this->numchips);
501 			return -EINVAL;
502 		}
503 		numblocks = this->chipsize >> (this->bbt_erase_shift - 1);
504 		startblock = chip * numblocks;
505 		numblocks += startblock;
506 		from = (loff_t)startblock << (this->bbt_erase_shift - 1);
507 	}
508 
509 	if (this->bbt_options & NAND_BBT_SCANLASTPAGE)
510 		from += mtd->erasesize - (mtd->writesize * len);
511 
512 	for (i = startblock; i < numblocks;) {
513 		int ret;
514 
515 		BUG_ON(bd->options & NAND_BBT_NO_OOB);
516 
517 		if (bd->options & NAND_BBT_SCANALLPAGES)
518 			ret = scan_block_full(mtd, bd, from, buf, readlen,
519 					      scanlen, len);
520 		else
521 			ret = scan_block_fast(mtd, bd, from, buf, len);
522 
523 		if (ret < 0)
524 			return ret;
525 
526 		if (ret) {
527 			this->bbt[i >> 3] |= 0x03 << (i & 0x6);
528 			pr_warn("Bad eraseblock %d at 0x%012llx\n",
529 				i >> 1, (unsigned long long)from);
530 			mtd->ecc_stats.badblocks++;
531 		}
532 
533 		i += 2;
534 		from += (1 << this->bbt_erase_shift);
535 	}
536 	return 0;
537 }
538 
539 /**
540  * search_bbt - [GENERIC] scan the device for a specific bad block table
541  * @mtd: MTD device structure
542  * @buf: temporary buffer
543  * @td: descriptor for the bad block table
544  *
545  * Read the bad block table by searching for a given ident pattern. Search is
546  * preformed either from the beginning up or from the end of the device
547  * downwards. The search starts always at the start of a block. If the option
548  * NAND_BBT_PERCHIP is given, each chip is searched for a bbt, which contains
549  * the bad block information of this chip. This is necessary to provide support
550  * for certain DOC devices.
551  *
552  * The bbt ident pattern resides in the oob area of the first page in a block.
553  */
search_bbt(struct mtd_info * mtd,uint8_t * buf,struct nand_bbt_descr * td)554 static int search_bbt(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr *td)
555 {
556 	struct nand_chip *this = mtd->priv;
557 	int i, chips;
558 	int bits, startblock, block, dir;
559 	int scanlen = mtd->writesize + mtd->oobsize;
560 	int bbtblocks;
561 	int blocktopage = this->bbt_erase_shift - this->page_shift;
562 
563 	/* Search direction top -> down? */
564 	if (td->options & NAND_BBT_LASTBLOCK) {
565 		startblock = (mtd->size >> this->bbt_erase_shift) - 1;
566 		dir = -1;
567 	} else {
568 		startblock = 0;
569 		dir = 1;
570 	}
571 
572 	/* Do we have a bbt per chip? */
573 	if (td->options & NAND_BBT_PERCHIP) {
574 		chips = this->numchips;
575 		bbtblocks = this->chipsize >> this->bbt_erase_shift;
576 		startblock &= bbtblocks - 1;
577 	} else {
578 		chips = 1;
579 		bbtblocks = mtd->size >> this->bbt_erase_shift;
580 	}
581 
582 	/* Number of bits for each erase block in the bbt */
583 	bits = td->options & NAND_BBT_NRBITS_MSK;
584 
585 	for (i = 0; i < chips; i++) {
586 		/* Reset version information */
587 		td->version[i] = 0;
588 		td->pages[i] = -1;
589 		/* Scan the maximum number of blocks */
590 		for (block = 0; block < td->maxblocks; block++) {
591 
592 			int actblock = startblock + dir * block;
593 			loff_t offs = (loff_t)actblock << this->bbt_erase_shift;
594 
595 			/* Read first page */
596 			scan_read_raw(mtd, buf, offs, mtd->writesize, td);
597 			if (!check_pattern(buf, scanlen, mtd->writesize, td)) {
598 				td->pages[i] = actblock << blocktopage;
599 				if (td->options & NAND_BBT_VERSION) {
600 					offs = bbt_get_ver_offs(mtd, td);
601 					td->version[i] = buf[offs];
602 				}
603 				break;
604 			}
605 		}
606 		startblock += this->chipsize >> this->bbt_erase_shift;
607 	}
608 	/* Check, if we found a bbt for each requested chip */
609 	for (i = 0; i < chips; i++) {
610 		if (td->pages[i] == -1)
611 			pr_warn("Bad block table not found for chip %d\n", i);
612 		else
613 			pr_info("Bad block table found at page %d, version "
614 				 "0x%02X\n", td->pages[i], td->version[i]);
615 	}
616 	return 0;
617 }
618 
619 /**
620  * search_read_bbts - [GENERIC] scan the device for bad block table(s)
621  * @mtd: MTD device structure
622  * @buf: temporary buffer
623  * @td: descriptor for the bad block table
624  * @md: descriptor for the bad block table mirror
625  *
626  * Search and read the bad block table(s).
627  */
search_read_bbts(struct mtd_info * mtd,uint8_t * buf,struct nand_bbt_descr * td,struct nand_bbt_descr * md)628 static int search_read_bbts(struct mtd_info *mtd, uint8_t * buf, struct nand_bbt_descr *td, struct nand_bbt_descr *md)
629 {
630 	/* Search the primary table */
631 	search_bbt(mtd, buf, td);
632 
633 	/* Search the mirror table */
634 	if (md)
635 		search_bbt(mtd, buf, md);
636 
637 	/* Force result check */
638 	return 1;
639 }
640 
641 /**
642  * write_bbt - [GENERIC] (Re)write the bad block table
643  * @mtd: MTD device structure
644  * @buf: temporary buffer
645  * @td: descriptor for the bad block table
646  * @md: descriptor for the bad block table mirror
647  * @chipsel: selector for a specific chip, -1 for all
648  *
649  * (Re)write the bad block table.
650  */
write_bbt(struct mtd_info * mtd,uint8_t * buf,struct nand_bbt_descr * td,struct nand_bbt_descr * md,int chipsel)651 static int write_bbt(struct mtd_info *mtd, uint8_t *buf,
652 		     struct nand_bbt_descr *td, struct nand_bbt_descr *md,
653 		     int chipsel)
654 {
655 	struct nand_chip *this = mtd->priv;
656 	struct erase_info einfo;
657 	int i, j, res, chip = 0;
658 	int bits, startblock, dir, page, offs, numblocks, sft, sftmsk;
659 	int nrchips, bbtoffs, pageoffs, ooboffs;
660 	uint8_t msk[4];
661 	uint8_t rcode = td->reserved_block_code;
662 	size_t retlen, len = 0;
663 	loff_t to;
664 	struct mtd_oob_ops ops;
665 
666 	ops.ooblen = mtd->oobsize;
667 	ops.ooboffs = 0;
668 	ops.datbuf = NULL;
669 	ops.mode = MTD_OPS_PLACE_OOB;
670 
671 	if (!rcode)
672 		rcode = 0xff;
673 	/* Write bad block table per chip rather than per device? */
674 	if (td->options & NAND_BBT_PERCHIP) {
675 		numblocks = (int)(this->chipsize >> this->bbt_erase_shift);
676 		/* Full device write or specific chip? */
677 		if (chipsel == -1) {
678 			nrchips = this->numchips;
679 		} else {
680 			nrchips = chipsel + 1;
681 			chip = chipsel;
682 		}
683 	} else {
684 		numblocks = (int)(mtd->size >> this->bbt_erase_shift);
685 		nrchips = 1;
686 	}
687 
688 	/* Loop through the chips */
689 	for (; chip < nrchips; chip++) {
690 		/*
691 		 * There was already a version of the table, reuse the page
692 		 * This applies for absolute placement too, as we have the
693 		 * page nr. in td->pages.
694 		 */
695 		if (td->pages[chip] != -1) {
696 			page = td->pages[chip];
697 			goto write;
698 		}
699 
700 		/*
701 		 * Automatic placement of the bad block table. Search direction
702 		 * top -> down?
703 		 */
704 		if (td->options & NAND_BBT_LASTBLOCK) {
705 			startblock = numblocks * (chip + 1) - 1;
706 			dir = -1;
707 		} else {
708 			startblock = chip * numblocks;
709 			dir = 1;
710 		}
711 
712 		for (i = 0; i < td->maxblocks; i++) {
713 			int block = startblock + dir * i;
714 			/* Check, if the block is bad */
715 			switch ((this->bbt[block >> 2] >>
716 				 (2 * (block & 0x03))) & 0x03) {
717 			case 0x01:
718 			case 0x03:
719 				continue;
720 			}
721 			page = block <<
722 				(this->bbt_erase_shift - this->page_shift);
723 			/* Check, if the block is used by the mirror table */
724 			if (!md || md->pages[chip] != page)
725 				goto write;
726 		}
727 		pr_err("No space left to write bad block table\n");
728 		return -ENOSPC;
729 	write:
730 
731 		/* Set up shift count and masks for the flash table */
732 		bits = td->options & NAND_BBT_NRBITS_MSK;
733 		msk[2] = ~rcode;
734 		switch (bits) {
735 		case 1: sft = 3; sftmsk = 0x07; msk[0] = 0x00; msk[1] = 0x01;
736 			msk[3] = 0x01;
737 			break;
738 		case 2: sft = 2; sftmsk = 0x06; msk[0] = 0x00; msk[1] = 0x01;
739 			msk[3] = 0x03;
740 			break;
741 		case 4: sft = 1; sftmsk = 0x04; msk[0] = 0x00; msk[1] = 0x0C;
742 			msk[3] = 0x0f;
743 			break;
744 		case 8: sft = 0; sftmsk = 0x00; msk[0] = 0x00; msk[1] = 0x0F;
745 			msk[3] = 0xff;
746 			break;
747 		default: return -EINVAL;
748 		}
749 
750 		bbtoffs = chip * (numblocks >> 2);
751 
752 		to = ((loff_t)page) << this->page_shift;
753 
754 		/* Must we save the block contents? */
755 		if (td->options & NAND_BBT_SAVECONTENT) {
756 			/* Make it block aligned */
757 			to &= ~((loff_t)((1 << this->bbt_erase_shift) - 1));
758 			len = 1 << this->bbt_erase_shift;
759 			res = mtd_read(mtd, to, len, &retlen, buf);
760 			if (res < 0) {
761 				if (retlen != len) {
762 					pr_info("nand_bbt: error reading block "
763 						"for writing the bad block table\n");
764 					return res;
765 				}
766 				pr_warn("nand_bbt: ECC error while reading "
767 					"block for writing bad block table\n");
768 			}
769 			/* Read oob data */
770 			ops.ooblen = (len >> this->page_shift) * mtd->oobsize;
771 			ops.oobbuf = &buf[len];
772 			res = mtd_read_oob(mtd, to + mtd->writesize, &ops);
773 			if (res < 0 || ops.oobretlen != ops.ooblen)
774 				goto outerr;
775 
776 			/* Calc the byte offset in the buffer */
777 			pageoffs = page - (int)(to >> this->page_shift);
778 			offs = pageoffs << this->page_shift;
779 			/* Preset the bbt area with 0xff */
780 			memset(&buf[offs], 0xff, (size_t)(numblocks >> sft));
781 			ooboffs = len + (pageoffs * mtd->oobsize);
782 
783 		} else if (td->options & NAND_BBT_NO_OOB) {
784 			ooboffs = 0;
785 			offs = td->len;
786 			/* The version byte */
787 			if (td->options & NAND_BBT_VERSION)
788 				offs++;
789 			/* Calc length */
790 			len = (size_t)(numblocks >> sft);
791 			len += offs;
792 			/* Make it page aligned! */
793 			len = ALIGN(len, mtd->writesize);
794 			/* Preset the buffer with 0xff */
795 			memset(buf, 0xff, len);
796 			/* Pattern is located at the begin of first page */
797 			memcpy(buf, td->pattern, td->len);
798 		} else {
799 			/* Calc length */
800 			len = (size_t)(numblocks >> sft);
801 			/* Make it page aligned! */
802 			len = ALIGN(len, mtd->writesize);
803 			/* Preset the buffer with 0xff */
804 			memset(buf, 0xff, len +
805 			       (len >> this->page_shift)* mtd->oobsize);
806 			offs = 0;
807 			ooboffs = len;
808 			/* Pattern is located in oob area of first page */
809 			memcpy(&buf[ooboffs + td->offs], td->pattern, td->len);
810 		}
811 
812 		if (td->options & NAND_BBT_VERSION)
813 			buf[ooboffs + td->veroffs] = td->version[chip];
814 
815 		/* Walk through the memory table */
816 		for (i = 0; i < numblocks;) {
817 			uint8_t dat;
818 			dat = this->bbt[bbtoffs + (i >> 2)];
819 			for (j = 0; j < 4; j++, i++) {
820 				int sftcnt = (i << (3 - sft)) & sftmsk;
821 				/* Do not store the reserved bbt blocks! */
822 				buf[offs + (i >> sft)] &=
823 					~(msk[dat & 0x03] << sftcnt);
824 				dat >>= 2;
825 			}
826 		}
827 
828 		memset(&einfo, 0, sizeof(einfo));
829 		einfo.mtd = mtd;
830 		einfo.addr = to;
831 		einfo.len = 1 << this->bbt_erase_shift;
832 		res = nand_erase_nand(mtd, &einfo, 1);
833 		if (res < 0)
834 			goto outerr;
835 
836 		res = scan_write_bbt(mtd, to, len, buf,
837 				td->options & NAND_BBT_NO_OOB ? NULL :
838 				&buf[len]);
839 		if (res < 0)
840 			goto outerr;
841 
842 		pr_info("Bad block table written to 0x%012llx, version 0x%02X\n",
843 			 (unsigned long long)to, td->version[chip]);
844 
845 		/* Mark it as used */
846 		td->pages[chip] = page;
847 	}
848 	return 0;
849 
850  outerr:
851 	pr_warn("nand_bbt: error while writing bad block table %d\n", res);
852 	return res;
853 }
854 
855 /**
856  * nand_memory_bbt - [GENERIC] create a memory based bad block table
857  * @mtd: MTD device structure
858  * @bd: descriptor for the good/bad block search pattern
859  *
860  * The function creates a memory based bbt by scanning the device for
861  * manufacturer / software marked good / bad blocks.
862  */
nand_memory_bbt(struct mtd_info * mtd,struct nand_bbt_descr * bd)863 static inline int nand_memory_bbt(struct mtd_info *mtd, struct nand_bbt_descr *bd)
864 {
865 	struct nand_chip *this = mtd->priv;
866 
867 	bd->options &= ~NAND_BBT_SCANEMPTY;
868 	return create_bbt(mtd, this->buffers->databuf, bd, -1);
869 }
870 
871 /**
872  * check_create - [GENERIC] create and write bbt(s) if necessary
873  * @mtd: MTD device structure
874  * @buf: temporary buffer
875  * @bd: descriptor for the good/bad block search pattern
876  *
877  * The function checks the results of the previous call to read_bbt and creates
878  * / updates the bbt(s) if necessary. Creation is necessary if no bbt was found
879  * for the chip/device. Update is necessary if one of the tables is missing or
880  * the version nr. of one table is less than the other.
881  */
check_create(struct mtd_info * mtd,uint8_t * buf,struct nand_bbt_descr * bd)882 static int check_create(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr *bd)
883 {
884 	int i, chips, writeops, create, chipsel, res, res2;
885 	struct nand_chip *this = mtd->priv;
886 	struct nand_bbt_descr *td = this->bbt_td;
887 	struct nand_bbt_descr *md = this->bbt_md;
888 	struct nand_bbt_descr *rd, *rd2;
889 
890 	/* Do we have a bbt per chip? */
891 	if (td->options & NAND_BBT_PERCHIP)
892 		chips = this->numchips;
893 	else
894 		chips = 1;
895 
896 	for (i = 0; i < chips; i++) {
897 		writeops = 0;
898 		create = 0;
899 		rd = NULL;
900 		rd2 = NULL;
901 		res = res2 = 0;
902 		/* Per chip or per device? */
903 		chipsel = (td->options & NAND_BBT_PERCHIP) ? i : -1;
904 		/* Mirrored table available? */
905 		if (md) {
906 			if (td->pages[i] == -1 && md->pages[i] == -1) {
907 				create = 1;
908 				writeops = 0x03;
909 			} else if (td->pages[i] == -1) {
910 				rd = md;
911 				writeops = 0x01;
912 			} else if (md->pages[i] == -1) {
913 				rd = td;
914 				writeops = 0x02;
915 			} else if (td->version[i] == md->version[i]) {
916 				rd = td;
917 				if (!(td->options & NAND_BBT_VERSION))
918 					rd2 = md;
919 			} else if (((int8_t)(td->version[i] - md->version[i])) > 0) {
920 				rd = td;
921 				writeops = 0x02;
922 			} else {
923 				rd = md;
924 				writeops = 0x01;
925 			}
926 		} else {
927 			if (td->pages[i] == -1) {
928 				create = 1;
929 				writeops = 0x01;
930 			} else {
931 				rd = td;
932 			}
933 		}
934 
935 		if (create) {
936 			/* Create the bad block table by scanning the device? */
937 			if (!(td->options & NAND_BBT_CREATE))
938 				continue;
939 
940 			/* Create the table in memory by scanning the chip(s) */
941 			if (!(this->bbt_options & NAND_BBT_CREATE_EMPTY))
942 				create_bbt(mtd, buf, bd, chipsel);
943 
944 			td->version[i] = 1;
945 			if (md)
946 				md->version[i] = 1;
947 		}
948 
949 		/* Read back first? */
950 		if (rd) {
951 			res = read_abs_bbt(mtd, buf, rd, chipsel);
952 			if (mtd_is_eccerr(res)) {
953 				/* Mark table as invalid */
954 				rd->pages[i] = -1;
955 				rd->version[i] = 0;
956 				i--;
957 				continue;
958 			}
959 		}
960 		/* If they weren't versioned, read both */
961 		if (rd2) {
962 			res2 = read_abs_bbt(mtd, buf, rd2, chipsel);
963 			if (mtd_is_eccerr(res2)) {
964 				/* Mark table as invalid */
965 				rd2->pages[i] = -1;
966 				rd2->version[i] = 0;
967 				i--;
968 				continue;
969 			}
970 		}
971 
972 		/* Scrub the flash table(s)? */
973 		if (mtd_is_bitflip(res) || mtd_is_bitflip(res2))
974 			writeops = 0x03;
975 
976 		/* Update version numbers before writing */
977 		if (md) {
978 			td->version[i] = max(td->version[i], md->version[i]);
979 			md->version[i] = td->version[i];
980 		}
981 
982 		/* Write the bad block table to the device? */
983 		if ((writeops & 0x01) && (td->options & NAND_BBT_WRITE)) {
984 			res = write_bbt(mtd, buf, td, md, chipsel);
985 			if (res < 0)
986 				return res;
987 		}
988 
989 		/* Write the mirror bad block table to the device? */
990 		if ((writeops & 0x02) && md && (md->options & NAND_BBT_WRITE)) {
991 			res = write_bbt(mtd, buf, md, td, chipsel);
992 			if (res < 0)
993 				return res;
994 		}
995 	}
996 	return 0;
997 }
998 
999 /**
1000  * mark_bbt_regions - [GENERIC] mark the bad block table regions
1001  * @mtd: MTD device structure
1002  * @td: bad block table descriptor
1003  *
1004  * The bad block table regions are marked as "bad" to prevent accidental
1005  * erasures / writes. The regions are identified by the mark 0x02.
1006  */
mark_bbt_region(struct mtd_info * mtd,struct nand_bbt_descr * td)1007 static void mark_bbt_region(struct mtd_info *mtd, struct nand_bbt_descr *td)
1008 {
1009 	struct nand_chip *this = mtd->priv;
1010 	int i, j, chips, block, nrblocks, update;
1011 	uint8_t oldval, newval;
1012 
1013 	/* Do we have a bbt per chip? */
1014 	if (td->options & NAND_BBT_PERCHIP) {
1015 		chips = this->numchips;
1016 		nrblocks = (int)(this->chipsize >> this->bbt_erase_shift);
1017 	} else {
1018 		chips = 1;
1019 		nrblocks = (int)(mtd->size >> this->bbt_erase_shift);
1020 	}
1021 
1022 	for (i = 0; i < chips; i++) {
1023 		if ((td->options & NAND_BBT_ABSPAGE) ||
1024 		    !(td->options & NAND_BBT_WRITE)) {
1025 			if (td->pages[i] == -1)
1026 				continue;
1027 			block = td->pages[i] >> (this->bbt_erase_shift - this->page_shift);
1028 			block <<= 1;
1029 			oldval = this->bbt[(block >> 3)];
1030 			newval = oldval | (0x2 << (block & 0x06));
1031 			this->bbt[(block >> 3)] = newval;
1032 			if ((oldval != newval) && td->reserved_block_code)
1033 				nand_update_bbt(mtd, (loff_t)block << (this->bbt_erase_shift - 1));
1034 			continue;
1035 		}
1036 		update = 0;
1037 		if (td->options & NAND_BBT_LASTBLOCK)
1038 			block = ((i + 1) * nrblocks) - td->maxblocks;
1039 		else
1040 			block = i * nrblocks;
1041 		block <<= 1;
1042 		for (j = 0; j < td->maxblocks; j++) {
1043 			oldval = this->bbt[(block >> 3)];
1044 			newval = oldval | (0x2 << (block & 0x06));
1045 			this->bbt[(block >> 3)] = newval;
1046 			if (oldval != newval)
1047 				update = 1;
1048 			block += 2;
1049 		}
1050 		/*
1051 		 * If we want reserved blocks to be recorded to flash, and some
1052 		 * new ones have been marked, then we need to update the stored
1053 		 * bbts.  This should only happen once.
1054 		 */
1055 		if (update && td->reserved_block_code)
1056 			nand_update_bbt(mtd, (loff_t)(block - 2) << (this->bbt_erase_shift - 1));
1057 	}
1058 }
1059 
1060 /**
1061  * verify_bbt_descr - verify the bad block description
1062  * @mtd: MTD device structure
1063  * @bd: the table to verify
1064  *
1065  * This functions performs a few sanity checks on the bad block description
1066  * table.
1067  */
verify_bbt_descr(struct mtd_info * mtd,struct nand_bbt_descr * bd)1068 static void verify_bbt_descr(struct mtd_info *mtd, struct nand_bbt_descr *bd)
1069 {
1070 	struct nand_chip *this = mtd->priv;
1071 	u32 pattern_len;
1072 	u32 bits;
1073 	u32 table_size;
1074 
1075 	if (!bd)
1076 		return;
1077 
1078 	pattern_len = bd->len;
1079 	bits = bd->options & NAND_BBT_NRBITS_MSK;
1080 
1081 	BUG_ON((this->bbt_options & NAND_BBT_NO_OOB) &&
1082 			!(this->bbt_options & NAND_BBT_USE_FLASH));
1083 	BUG_ON(!bits);
1084 
1085 	if (bd->options & NAND_BBT_VERSION)
1086 		pattern_len++;
1087 
1088 	if (bd->options & NAND_BBT_NO_OOB) {
1089 		BUG_ON(!(this->bbt_options & NAND_BBT_USE_FLASH));
1090 		BUG_ON(!(this->bbt_options & NAND_BBT_NO_OOB));
1091 		BUG_ON(bd->offs);
1092 		if (bd->options & NAND_BBT_VERSION)
1093 			BUG_ON(bd->veroffs != bd->len);
1094 		BUG_ON(bd->options & NAND_BBT_SAVECONTENT);
1095 	}
1096 
1097 	if (bd->options & NAND_BBT_PERCHIP)
1098 		table_size = this->chipsize >> this->bbt_erase_shift;
1099 	else
1100 		table_size = mtd->size >> this->bbt_erase_shift;
1101 	table_size >>= 3;
1102 	table_size *= bits;
1103 	if (bd->options & NAND_BBT_NO_OOB)
1104 		table_size += pattern_len;
1105 	BUG_ON(table_size > (1 << this->bbt_erase_shift));
1106 }
1107 
1108 /**
1109  * nand_scan_bbt - [NAND Interface] scan, find, read and maybe create bad block table(s)
1110  * @mtd: MTD device structure
1111  * @bd: descriptor for the good/bad block search pattern
1112  *
1113  * The function checks, if a bad block table(s) is/are already available. If
1114  * not it scans the device for manufacturer marked good / bad blocks and writes
1115  * the bad block table(s) to the selected place.
1116  *
1117  * The bad block table memory is allocated here. It must be freed by calling
1118  * the nand_free_bbt function.
1119  */
nand_scan_bbt(struct mtd_info * mtd,struct nand_bbt_descr * bd)1120 int nand_scan_bbt(struct mtd_info *mtd, struct nand_bbt_descr *bd)
1121 {
1122 	struct nand_chip *this = mtd->priv;
1123 	int len, res = 0;
1124 	uint8_t *buf;
1125 	struct nand_bbt_descr *td = this->bbt_td;
1126 	struct nand_bbt_descr *md = this->bbt_md;
1127 
1128 	len = mtd->size >> (this->bbt_erase_shift + 2);
1129 	/*
1130 	 * Allocate memory (2bit per block) and clear the memory bad block
1131 	 * table.
1132 	 */
1133 	this->bbt = kzalloc(len, GFP_KERNEL);
1134 	if (!this->bbt)
1135 		return -ENOMEM;
1136 
1137 	/*
1138 	 * If no primary table decriptor is given, scan the device to build a
1139 	 * memory based bad block table.
1140 	 */
1141 	if (!td) {
1142 		if ((res = nand_memory_bbt(mtd, bd))) {
1143 			pr_err("nand_bbt: can't scan flash and build the RAM-based BBT\n");
1144 			kfree(this->bbt);
1145 			this->bbt = NULL;
1146 		}
1147 		return res;
1148 	}
1149 	verify_bbt_descr(mtd, td);
1150 	verify_bbt_descr(mtd, md);
1151 
1152 	/* Allocate a temporary buffer for one eraseblock incl. oob */
1153 	len = (1 << this->bbt_erase_shift);
1154 	len += (len >> this->page_shift) * mtd->oobsize;
1155 	buf = vmalloc(len);
1156 	if (!buf) {
1157 		kfree(this->bbt);
1158 		this->bbt = NULL;
1159 		return -ENOMEM;
1160 	}
1161 
1162 	/* Is the bbt at a given page? */
1163 	if (td->options & NAND_BBT_ABSPAGE) {
1164 		res = read_abs_bbts(mtd, buf, td, md);
1165 	} else {
1166 		/* Search the bad block table using a pattern in oob */
1167 		res = search_read_bbts(mtd, buf, td, md);
1168 	}
1169 
1170 	if (res)
1171 		res = check_create(mtd, buf, bd);
1172 
1173 	/* Prevent the bbt regions from erasing / writing */
1174 	mark_bbt_region(mtd, td);
1175 	if (md)
1176 		mark_bbt_region(mtd, md);
1177 
1178 	vfree(buf);
1179 	return res;
1180 }
1181 
1182 /**
1183  * nand_update_bbt - [NAND Interface] update bad block table(s)
1184  * @mtd: MTD device structure
1185  * @offs: the offset of the newly marked block
1186  *
1187  * The function updates the bad block table(s).
1188  */
nand_update_bbt(struct mtd_info * mtd,loff_t offs)1189 int nand_update_bbt(struct mtd_info *mtd, loff_t offs)
1190 {
1191 	struct nand_chip *this = mtd->priv;
1192 	int len, res = 0;
1193 	int chip, chipsel;
1194 	uint8_t *buf;
1195 	struct nand_bbt_descr *td = this->bbt_td;
1196 	struct nand_bbt_descr *md = this->bbt_md;
1197 
1198 	if (!this->bbt || !td)
1199 		return -EINVAL;
1200 
1201 	/* Allocate a temporary buffer for one eraseblock incl. oob */
1202 	len = (1 << this->bbt_erase_shift);
1203 	len += (len >> this->page_shift) * mtd->oobsize;
1204 	buf = kmalloc(len, GFP_KERNEL);
1205 	if (!buf)
1206 		return -ENOMEM;
1207 
1208 	/* Do we have a bbt per chip? */
1209 	if (td->options & NAND_BBT_PERCHIP) {
1210 		chip = (int)(offs >> this->chip_shift);
1211 		chipsel = chip;
1212 	} else {
1213 		chip = 0;
1214 		chipsel = -1;
1215 	}
1216 
1217 	td->version[chip]++;
1218 	if (md)
1219 		md->version[chip]++;
1220 
1221 	/* Write the bad block table to the device? */
1222 	if (td->options & NAND_BBT_WRITE) {
1223 		res = write_bbt(mtd, buf, td, md, chipsel);
1224 		if (res < 0)
1225 			goto out;
1226 	}
1227 	/* Write the mirror bad block table to the device? */
1228 	if (md && (md->options & NAND_BBT_WRITE)) {
1229 		res = write_bbt(mtd, buf, md, td, chipsel);
1230 	}
1231 
1232  out:
1233 	kfree(buf);
1234 	return res;
1235 }
1236 
1237 /*
1238  * Define some generic bad / good block scan pattern which are used
1239  * while scanning a device for factory marked good / bad blocks.
1240  */
1241 static uint8_t scan_ff_pattern[] = { 0xff, 0xff };
1242 
1243 static uint8_t scan_agand_pattern[] = { 0x1C, 0x71, 0xC7, 0x1C, 0x71, 0xC7 };
1244 
1245 static struct nand_bbt_descr agand_flashbased = {
1246 	.options = NAND_BBT_SCANEMPTY | NAND_BBT_SCANALLPAGES,
1247 	.offs = 0x20,
1248 	.len = 6,
1249 	.pattern = scan_agand_pattern
1250 };
1251 
1252 /* Generic flash bbt descriptors */
1253 static uint8_t bbt_pattern[] = {'B', 'b', 't', '0' };
1254 static uint8_t mirror_pattern[] = {'1', 't', 'b', 'B' };
1255 
1256 static struct nand_bbt_descr bbt_main_descr = {
1257 	.options = NAND_BBT_LASTBLOCK | NAND_BBT_CREATE | NAND_BBT_WRITE
1258 		| NAND_BBT_2BIT | NAND_BBT_VERSION | NAND_BBT_PERCHIP,
1259 	.offs =	8,
1260 	.len = 4,
1261 	.veroffs = 12,
1262 	.maxblocks = 4,
1263 	.pattern = bbt_pattern
1264 };
1265 
1266 static struct nand_bbt_descr bbt_mirror_descr = {
1267 	.options = NAND_BBT_LASTBLOCK | NAND_BBT_CREATE | NAND_BBT_WRITE
1268 		| NAND_BBT_2BIT | NAND_BBT_VERSION | NAND_BBT_PERCHIP,
1269 	.offs =	8,
1270 	.len = 4,
1271 	.veroffs = 12,
1272 	.maxblocks = 4,
1273 	.pattern = mirror_pattern
1274 };
1275 
1276 static struct nand_bbt_descr bbt_main_no_bbt_descr = {
1277 	.options = NAND_BBT_LASTBLOCK | NAND_BBT_CREATE | NAND_BBT_WRITE
1278 		| NAND_BBT_2BIT | NAND_BBT_VERSION | NAND_BBT_PERCHIP
1279 		| NAND_BBT_NO_OOB,
1280 	.len = 4,
1281 	.veroffs = 4,
1282 	.maxblocks = 4,
1283 	.pattern = bbt_pattern
1284 };
1285 
1286 static struct nand_bbt_descr bbt_mirror_no_bbt_descr = {
1287 	.options = NAND_BBT_LASTBLOCK | NAND_BBT_CREATE | NAND_BBT_WRITE
1288 		| NAND_BBT_2BIT | NAND_BBT_VERSION | NAND_BBT_PERCHIP
1289 		| NAND_BBT_NO_OOB,
1290 	.len = 4,
1291 	.veroffs = 4,
1292 	.maxblocks = 4,
1293 	.pattern = mirror_pattern
1294 };
1295 
1296 #define BADBLOCK_SCAN_MASK (~NAND_BBT_NO_OOB)
1297 /**
1298  * nand_create_badblock_pattern - [INTERN] Creates a BBT descriptor structure
1299  * @this: NAND chip to create descriptor for
1300  *
1301  * This function allocates and initializes a nand_bbt_descr for BBM detection
1302  * based on the properties of @this. The new descriptor is stored in
1303  * this->badblock_pattern. Thus, this->badblock_pattern should be NULL when
1304  * passed to this function.
1305  */
nand_create_badblock_pattern(struct nand_chip * this)1306 static int nand_create_badblock_pattern(struct nand_chip *this)
1307 {
1308 	struct nand_bbt_descr *bd;
1309 	if (this->badblock_pattern) {
1310 		pr_warn("Bad block pattern already allocated; not replacing\n");
1311 		return -EINVAL;
1312 	}
1313 	bd = kzalloc(sizeof(*bd), GFP_KERNEL);
1314 	if (!bd)
1315 		return -ENOMEM;
1316 	bd->options = this->bbt_options & BADBLOCK_SCAN_MASK;
1317 	bd->offs = this->badblockpos;
1318 	bd->len = (this->options & NAND_BUSWIDTH_16) ? 2 : 1;
1319 	bd->pattern = scan_ff_pattern;
1320 	bd->options |= NAND_BBT_DYNAMICSTRUCT;
1321 	this->badblock_pattern = bd;
1322 	return 0;
1323 }
1324 
1325 /**
1326  * nand_default_bbt - [NAND Interface] Select a default bad block table for the device
1327  * @mtd: MTD device structure
1328  *
1329  * This function selects the default bad block table support for the device and
1330  * calls the nand_scan_bbt function.
1331  */
nand_default_bbt(struct mtd_info * mtd)1332 int nand_default_bbt(struct mtd_info *mtd)
1333 {
1334 	struct nand_chip *this = mtd->priv;
1335 
1336 	/*
1337 	 * Default for AG-AND. We must use a flash based bad block table as the
1338 	 * devices have factory marked _good_ blocks. Erasing those blocks
1339 	 * leads to loss of the good / bad information, so we _must_ store this
1340 	 * information in a good / bad table during startup.
1341 	 */
1342 	if (this->options & NAND_IS_AND) {
1343 		/* Use the default pattern descriptors */
1344 		if (!this->bbt_td) {
1345 			this->bbt_td = &bbt_main_descr;
1346 			this->bbt_md = &bbt_mirror_descr;
1347 		}
1348 		this->bbt_options |= NAND_BBT_USE_FLASH;
1349 		return nand_scan_bbt(mtd, &agand_flashbased);
1350 	}
1351 
1352 	/* Is a flash based bad block table requested? */
1353 	if (this->bbt_options & NAND_BBT_USE_FLASH) {
1354 		/* Use the default pattern descriptors */
1355 		if (!this->bbt_td) {
1356 			if (this->bbt_options & NAND_BBT_NO_OOB) {
1357 				this->bbt_td = &bbt_main_no_bbt_descr;
1358 				this->bbt_md = &bbt_mirror_no_bbt_descr;
1359 			} else {
1360 				this->bbt_td = &bbt_main_descr;
1361 				this->bbt_md = &bbt_mirror_descr;
1362 			}
1363 		}
1364 	} else {
1365 		this->bbt_td = NULL;
1366 		this->bbt_md = NULL;
1367 	}
1368 
1369 	if (!this->badblock_pattern)
1370 		nand_create_badblock_pattern(this);
1371 
1372 	return nand_scan_bbt(mtd, this->badblock_pattern);
1373 }
1374 
1375 /**
1376  * nand_isbad_bbt - [NAND Interface] Check if a block is bad
1377  * @mtd: MTD device structure
1378  * @offs: offset in the device
1379  * @allowbbt: allow access to bad block table region
1380  */
nand_isbad_bbt(struct mtd_info * mtd,loff_t offs,int allowbbt)1381 int nand_isbad_bbt(struct mtd_info *mtd, loff_t offs, int allowbbt)
1382 {
1383 	struct nand_chip *this = mtd->priv;
1384 	int block;
1385 	uint8_t res;
1386 
1387 	/* Get block number * 2 */
1388 	block = (int)(offs >> (this->bbt_erase_shift - 1));
1389 	res = (this->bbt[block >> 3] >> (block & 0x06)) & 0x03;
1390 
1391 	pr_debug("nand_isbad_bbt(): bbt info for offs 0x%08x: "
1392 			"(block %d) 0x%02x\n",
1393 			(unsigned int)offs, block >> 1, res);
1394 
1395 	switch ((int)res) {
1396 	case 0x00:
1397 		return 0;
1398 	case 0x01:
1399 		return 1;
1400 	case 0x02:
1401 		return allowbbt ? 0 : 1;
1402 	}
1403 	return 1;
1404 }
1405 
1406 EXPORT_SYMBOL(nand_scan_bbt);
1407 EXPORT_SYMBOL(nand_default_bbt);
1408