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