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