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