1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62#ifndef __UBOOT__
63#include <linux/slab.h>
64#include <linux/types.h>
65#include <linux/mtd/mtd.h>
66#include <linux/mtd/bbm.h>
67#include <linux/mtd/nand.h>
68#include <linux/mtd/nand_ecc.h>
69#include <linux/bitops.h>
70#include <linux/delay.h>
71#include <linux/vmalloc.h>
72#include <linux/export.h>
73#include <linux/string.h>
74#else
75#include <common.h>
76#include <malloc.h>
77#include <linux/compat.h>
78
79 #include <linux/mtd/mtd.h>
80 #include <linux/mtd/bbm.h>
81 #include <linux/mtd/nand.h>
82 #include <linux/mtd/nand_ecc.h>
83 #include <linux/bitops.h>
84 #include <linux/string.h>
85#endif
86
87#define BBT_BLOCK_GOOD 0x00
88#define BBT_BLOCK_WORN 0x01
89#define BBT_BLOCK_RESERVED 0x02
90#define BBT_BLOCK_FACTORY_BAD 0x03
91
92#define BBT_ENTRY_MASK 0x03
93#define BBT_ENTRY_SHIFT 2
94
95static int nand_update_bbt(struct mtd_info *mtd, loff_t offs);
96
97static inline uint8_t bbt_get_entry(struct nand_chip *chip, int block)
98{
99 uint8_t entry = chip->bbt[block >> BBT_ENTRY_SHIFT];
100 entry >>= (block & BBT_ENTRY_MASK) * 2;
101 return entry & BBT_ENTRY_MASK;
102}
103
104static inline void bbt_mark_entry(struct nand_chip *chip, int block,
105 uint8_t mark)
106{
107 uint8_t msk = (mark & BBT_ENTRY_MASK) << ((block & BBT_ENTRY_MASK) * 2);
108 chip->bbt[block >> BBT_ENTRY_SHIFT] |= msk;
109}
110
111static int check_pattern_no_oob(uint8_t *buf, struct nand_bbt_descr *td)
112{
113 if (memcmp(buf, td->pattern, td->len))
114 return -1;
115 return 0;
116}
117
118
119
120
121
122
123
124
125
126
127
128static int check_pattern(uint8_t *buf, int len, int paglen, struct nand_bbt_descr *td)
129{
130 if (td->options & NAND_BBT_NO_OOB)
131 return check_pattern_no_oob(buf, td);
132
133
134 if (memcmp(buf + paglen + td->offs, td->pattern, td->len))
135 return -1;
136
137 return 0;
138}
139
140
141
142
143
144
145
146
147
148
149static int check_short_pattern(uint8_t *buf, struct nand_bbt_descr *td)
150{
151
152 if (memcmp(buf + td->offs, td->pattern, td->len))
153 return -1;
154 return 0;
155}
156
157
158
159
160
161
162
163static u32 add_marker_len(struct nand_bbt_descr *td)
164{
165 u32 len;
166
167 if (!(td->options & NAND_BBT_NO_OOB))
168 return 0;
169
170 len = td->len;
171 if (td->options & NAND_BBT_VERSION)
172 len++;
173 return len;
174}
175
176
177
178
179
180
181
182
183
184
185
186
187static int read_bbt(struct mtd_info *mtd, uint8_t *buf, int page, int num,
188 struct nand_bbt_descr *td, int offs)
189{
190 int res, ret = 0, i, j, act = 0;
191 struct nand_chip *this = mtd->priv;
192 size_t retlen, len, totlen;
193 loff_t from;
194 int bits = td->options & NAND_BBT_NRBITS_MSK;
195 uint8_t msk = (uint8_t)((1 << bits) - 1);
196 u32 marker_len;
197 int reserved_block_code = td->reserved_block_code;
198
199 totlen = (num * bits) >> 3;
200 marker_len = add_marker_len(td);
201 from = ((loff_t)page) << this->page_shift;
202
203 while (totlen) {
204 len = min(totlen, (size_t)(1 << this->bbt_erase_shift));
205 if (marker_len) {
206
207
208
209
210 len -= marker_len;
211 from += marker_len;
212 marker_len = 0;
213 }
214 res = mtd_read(mtd, from, len, &retlen, buf);
215 if (res < 0) {
216 if (mtd_is_eccerr(res)) {
217 pr_info("nand_bbt: ECC error in BBT at "
218 "0x%012llx\n", from & ~mtd->writesize);
219 return res;
220 } else if (mtd_is_bitflip(res)) {
221 pr_info("nand_bbt: corrected error in BBT at "
222 "0x%012llx\n", from & ~mtd->writesize);
223 ret = res;
224 } else {
225 pr_info("nand_bbt: error reading BBT\n");
226 return res;
227 }
228 }
229
230
231 for (i = 0; i < len; i++) {
232 uint8_t dat = buf[i];
233 for (j = 0; j < 8; j += bits, act++) {
234 uint8_t tmp = (dat >> j) & msk;
235 if (tmp == msk)
236 continue;
237 if (reserved_block_code && (tmp == reserved_block_code)) {
238 pr_info("nand_read_bbt: reserved block at 0x%012llx\n",
239 (loff_t)(offs + act) <<
240 this->bbt_erase_shift);
241 bbt_mark_entry(this, offs + act,
242 BBT_BLOCK_RESERVED);
243 mtd->ecc_stats.bbtblocks++;
244 continue;
245 }
246
247
248
249
250 pr_info("nand_read_bbt: bad block at 0x%012llx\n",
251 (loff_t)(offs + act) <<
252 this->bbt_erase_shift);
253
254 if (tmp == 0)
255 bbt_mark_entry(this, offs + act,
256 BBT_BLOCK_FACTORY_BAD);
257 else
258 bbt_mark_entry(this, offs + act,
259 BBT_BLOCK_WORN);
260 mtd->ecc_stats.badblocks++;
261 }
262 }
263 totlen -= len;
264 from += len;
265 }
266 return ret;
267}
268
269
270
271
272
273
274
275
276
277
278
279
280static int read_abs_bbt(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr *td, int chip)
281{
282 struct nand_chip *this = mtd->priv;
283 int res = 0, i;
284
285 if (td->options & NAND_BBT_PERCHIP) {
286 int offs = 0;
287 for (i = 0; i < this->numchips; i++) {
288 if (chip == -1 || chip == i)
289 res = read_bbt(mtd, buf, td->pages[i],
290 this->chipsize >> this->bbt_erase_shift,
291 td, offs);
292 if (res)
293 return res;
294 offs += this->chipsize >> this->bbt_erase_shift;
295 }
296 } else {
297 res = read_bbt(mtd, buf, td->pages[0],
298 mtd->size >> this->bbt_erase_shift, td, 0);
299 if (res)
300 return res;
301 }
302 return 0;
303}
304
305
306static int scan_read_data(struct mtd_info *mtd, uint8_t *buf, loff_t offs,
307 struct nand_bbt_descr *td)
308{
309 size_t retlen;
310 size_t len;
311
312 len = td->len;
313 if (td->options & NAND_BBT_VERSION)
314 len++;
315
316 return mtd_read(mtd, offs, len, &retlen, buf);
317}
318
319
320
321
322
323
324
325
326
327
328
329
330static int scan_read_oob(struct mtd_info *mtd, uint8_t *buf, loff_t offs,
331 size_t len)
332{
333 struct mtd_oob_ops ops;
334 int res, ret = 0;
335
336 ops.mode = MTD_OPS_PLACE_OOB;
337 ops.ooboffs = 0;
338 ops.ooblen = mtd->oobsize;
339
340 while (len > 0) {
341 ops.datbuf = buf;
342 ops.len = min(len, (size_t)mtd->writesize);
343 ops.oobbuf = buf + ops.len;
344
345 res = mtd_read_oob(mtd, offs, &ops);
346 if (res) {
347 if (!mtd_is_bitflip_or_eccerr(res))
348 return res;
349 else if (mtd_is_eccerr(res) || !ret)
350 ret = res;
351 }
352
353 buf += mtd->oobsize + mtd->writesize;
354 len -= mtd->writesize;
355 offs += mtd->writesize;
356 }
357 return ret;
358}
359
360static int scan_read(struct mtd_info *mtd, uint8_t *buf, loff_t offs,
361 size_t len, struct nand_bbt_descr *td)
362{
363 if (td->options & NAND_BBT_NO_OOB)
364 return scan_read_data(mtd, buf, offs, td);
365 else
366 return scan_read_oob(mtd, buf, offs, len);
367}
368
369
370static int scan_write_bbt(struct mtd_info *mtd, loff_t offs, size_t len,
371 uint8_t *buf, uint8_t *oob)
372{
373 struct mtd_oob_ops ops;
374
375 ops.mode = MTD_OPS_PLACE_OOB;
376 ops.ooboffs = 0;
377 ops.ooblen = mtd->oobsize;
378 ops.datbuf = buf;
379 ops.oobbuf = oob;
380 ops.len = len;
381
382 return mtd_write_oob(mtd, offs, &ops);
383}
384
385static u32 bbt_get_ver_offs(struct mtd_info *mtd, struct nand_bbt_descr *td)
386{
387 u32 ver_offs = td->veroffs;
388
389 if (!(td->options & NAND_BBT_NO_OOB))
390 ver_offs += mtd->writesize;
391 return ver_offs;
392}
393
394
395
396
397
398
399
400
401
402
403
404static void read_abs_bbts(struct mtd_info *mtd, uint8_t *buf,
405 struct nand_bbt_descr *td, struct nand_bbt_descr *md)
406{
407 struct nand_chip *this = mtd->priv;
408
409
410 if (td->options & NAND_BBT_VERSION) {
411 scan_read(mtd, buf, (loff_t)td->pages[0] << this->page_shift,
412 mtd->writesize, td);
413 td->version[0] = buf[bbt_get_ver_offs(mtd, td)];
414 pr_info("Bad block table at page %d, version 0x%02X\n",
415 td->pages[0], td->version[0]);
416 }
417
418
419 if (md && (md->options & NAND_BBT_VERSION)) {
420 scan_read(mtd, buf, (loff_t)md->pages[0] << this->page_shift,
421 mtd->writesize, md);
422 md->version[0] = buf[bbt_get_ver_offs(mtd, md)];
423 pr_info("Bad block table at page %d, version 0x%02X\n",
424 md->pages[0], md->version[0]);
425 }
426}
427
428
429static int scan_block_fast(struct mtd_info *mtd, struct nand_bbt_descr *bd,
430 loff_t offs, uint8_t *buf, int numpages)
431{
432 struct mtd_oob_ops ops;
433 int j, ret;
434
435 ops.ooblen = mtd->oobsize;
436 ops.oobbuf = buf;
437 ops.ooboffs = 0;
438 ops.datbuf = NULL;
439 ops.mode = MTD_OPS_PLACE_OOB;
440
441 for (j = 0; j < numpages; j++) {
442
443
444
445
446 ret = mtd_read_oob(mtd, offs, &ops);
447
448 if (ret && !mtd_is_bitflip_or_eccerr(ret))
449 return ret;
450
451 if (check_short_pattern(buf, bd))
452 return 1;
453
454 offs += mtd->writesize;
455 }
456 return 0;
457}
458
459
460
461
462
463
464
465
466
467
468
469
470static int create_bbt(struct mtd_info *mtd, uint8_t *buf,
471 struct nand_bbt_descr *bd, int chip)
472{
473 struct nand_chip *this = mtd->priv;
474 int i, numblocks, numpages;
475 int startblock;
476 loff_t from;
477
478 pr_info("Scanning device for bad blocks\n");
479
480 if (bd->options & NAND_BBT_SCAN2NDPAGE)
481 numpages = 2;
482 else
483 numpages = 1;
484
485 if (chip == -1) {
486 numblocks = mtd->size >> this->bbt_erase_shift;
487 startblock = 0;
488 from = 0;
489 } else {
490 if (chip >= this->numchips) {
491 pr_warn("create_bbt(): chipnr (%d) > available chips (%d)\n",
492 chip + 1, this->numchips);
493 return -EINVAL;
494 }
495 numblocks = this->chipsize >> this->bbt_erase_shift;
496 startblock = chip * numblocks;
497 numblocks += startblock;
498 from = (loff_t)startblock << this->bbt_erase_shift;
499 }
500
501 if (this->bbt_options & NAND_BBT_SCANLASTPAGE)
502 from += mtd->erasesize - (mtd->writesize * numpages);
503
504 for (i = startblock; i < numblocks; i++) {
505 int ret;
506
507 BUG_ON(bd->options & NAND_BBT_NO_OOB);
508
509 ret = scan_block_fast(mtd, bd, from, buf, numpages);
510 if (ret < 0)
511 return ret;
512
513 if (ret) {
514 bbt_mark_entry(this, i, BBT_BLOCK_FACTORY_BAD);
515 pr_warn("Bad eraseblock %d at 0x%012llx\n",
516 i, (unsigned long long)from);
517 mtd->ecc_stats.badblocks++;
518 }
519
520 from += (1 << this->bbt_erase_shift);
521 }
522 return 0;
523}
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540static int search_bbt(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr *td)
541{
542 struct nand_chip *this = mtd->priv;
543 int i, chips;
544#ifndef __UBOOT__
545 int bits, startblock, block, dir;
546#else
547 int startblock, block, dir;
548#endif
549 int scanlen = mtd->writesize + mtd->oobsize;
550 int bbtblocks;
551 int blocktopage = this->bbt_erase_shift - this->page_shift;
552
553
554 if (td->options & NAND_BBT_LASTBLOCK) {
555 startblock = (mtd->size >> this->bbt_erase_shift) - 1;
556 dir = -1;
557 } else {
558 startblock = 0;
559 dir = 1;
560 }
561
562
563 if (td->options & NAND_BBT_PERCHIP) {
564 chips = this->numchips;
565 bbtblocks = this->chipsize >> this->bbt_erase_shift;
566 startblock &= bbtblocks - 1;
567 } else {
568 chips = 1;
569 bbtblocks = mtd->size >> this->bbt_erase_shift;
570 }
571
572#ifndef __UBOOT__
573
574 bits = td->options & NAND_BBT_NRBITS_MSK;
575#endif
576
577 for (i = 0; i < chips; i++) {
578
579 td->version[i] = 0;
580 td->pages[i] = -1;
581
582 for (block = 0; block < td->maxblocks; block++) {
583
584 int actblock = startblock + dir * block;
585 loff_t offs = (loff_t)actblock << this->bbt_erase_shift;
586
587
588 scan_read(mtd, buf, offs, mtd->writesize, td);
589 if (!check_pattern(buf, scanlen, mtd->writesize, td)) {
590 td->pages[i] = actblock << blocktopage;
591 if (td->options & NAND_BBT_VERSION) {
592 offs = bbt_get_ver_offs(mtd, td);
593 td->version[i] = buf[offs];
594 }
595 break;
596 }
597 }
598 startblock += this->chipsize >> this->bbt_erase_shift;
599 }
600
601 for (i = 0; i < chips; i++) {
602 if (td->pages[i] == -1)
603 pr_warn("Bad block table not found for chip %d\n", i);
604 else
605 pr_info("Bad block table found at page %d, version "
606 "0x%02X\n", td->pages[i], td->version[i]);
607 }
608 return 0;
609}
610
611
612
613
614
615
616
617
618
619
620static void search_read_bbts(struct mtd_info *mtd, uint8_t *buf,
621 struct nand_bbt_descr *td,
622 struct nand_bbt_descr *md)
623{
624
625 search_bbt(mtd, buf, td);
626
627
628 if (md)
629 search_bbt(mtd, buf, md);
630}
631
632
633
634
635
636
637
638
639
640
641
642static int write_bbt(struct mtd_info *mtd, uint8_t *buf,
643 struct nand_bbt_descr *td, struct nand_bbt_descr *md,
644 int chipsel)
645{
646 struct nand_chip *this = mtd->priv;
647 struct erase_info einfo;
648 int i, res, chip = 0;
649 int bits, startblock, dir, page, offs, numblocks, sft, sftmsk;
650 int nrchips, pageoffs, ooboffs;
651 uint8_t msk[4];
652 uint8_t rcode = td->reserved_block_code;
653 size_t retlen, len = 0;
654 loff_t to;
655 struct mtd_oob_ops ops;
656
657 ops.ooblen = mtd->oobsize;
658 ops.ooboffs = 0;
659 ops.datbuf = NULL;
660 ops.mode = MTD_OPS_PLACE_OOB;
661
662 if (!rcode)
663 rcode = 0xff;
664
665 if (td->options & NAND_BBT_PERCHIP) {
666 numblocks = (int)(this->chipsize >> this->bbt_erase_shift);
667
668 if (chipsel == -1) {
669 nrchips = this->numchips;
670 } else {
671 nrchips = chipsel + 1;
672 chip = chipsel;
673 }
674 } else {
675 numblocks = (int)(mtd->size >> this->bbt_erase_shift);
676 nrchips = 1;
677 }
678
679
680 for (; chip < nrchips; chip++) {
681
682
683
684
685
686 if (td->pages[chip] != -1) {
687 page = td->pages[chip];
688 goto write;
689 }
690
691
692
693
694
695 if (td->options & NAND_BBT_LASTBLOCK) {
696 startblock = numblocks * (chip + 1) - 1;
697 dir = -1;
698 } else {
699 startblock = chip * numblocks;
700 dir = 1;
701 }
702
703 for (i = 0; i < td->maxblocks; i++) {
704 int block = startblock + dir * i;
705
706 switch (bbt_get_entry(this, block)) {
707 case BBT_BLOCK_WORN:
708 case BBT_BLOCK_FACTORY_BAD:
709 continue;
710 }
711 page = block <<
712 (this->bbt_erase_shift - this->page_shift);
713
714 if (!md || md->pages[chip] != page)
715 goto write;
716 }
717 pr_err("No space left to write bad block table\n");
718 return -ENOSPC;
719 write:
720
721
722 bits = td->options & NAND_BBT_NRBITS_MSK;
723 msk[2] = ~rcode;
724 switch (bits) {
725 case 1: sft = 3; sftmsk = 0x07; msk[0] = 0x00; msk[1] = 0x01;
726 msk[3] = 0x01;
727 break;
728 case 2: sft = 2; sftmsk = 0x06; msk[0] = 0x00; msk[1] = 0x01;
729 msk[3] = 0x03;
730 break;
731 case 4: sft = 1; sftmsk = 0x04; msk[0] = 0x00; msk[1] = 0x0C;
732 msk[3] = 0x0f;
733 break;
734 case 8: sft = 0; sftmsk = 0x00; msk[0] = 0x00; msk[1] = 0x0F;
735 msk[3] = 0xff;
736 break;
737 default: return -EINVAL;
738 }
739
740 to = ((loff_t)page) << this->page_shift;
741
742
743 if (td->options & NAND_BBT_SAVECONTENT) {
744
745 to &= ~((loff_t)((1 << this->bbt_erase_shift) - 1));
746 len = 1 << this->bbt_erase_shift;
747 res = mtd_read(mtd, to, len, &retlen, buf);
748 if (res < 0) {
749 if (retlen != len) {
750 pr_info("nand_bbt: error reading block "
751 "for writing the bad block table\n");
752 return res;
753 }
754 pr_warn("nand_bbt: ECC error while reading "
755 "block for writing bad block table\n");
756 }
757
758 ops.ooblen = (len >> this->page_shift) * mtd->oobsize;
759 ops.oobbuf = &buf[len];
760 res = mtd_read_oob(mtd, to + mtd->writesize, &ops);
761 if (res < 0 || ops.oobretlen != ops.ooblen)
762 goto outerr;
763
764
765 pageoffs = page - (int)(to >> this->page_shift);
766 offs = pageoffs << this->page_shift;
767
768 memset(&buf[offs], 0xff, (size_t)(numblocks >> sft));
769 ooboffs = len + (pageoffs * mtd->oobsize);
770
771 } else if (td->options & NAND_BBT_NO_OOB) {
772 ooboffs = 0;
773 offs = td->len;
774
775 if (td->options & NAND_BBT_VERSION)
776 offs++;
777
778 len = (size_t)(numblocks >> sft);
779 len += offs;
780
781 len = ALIGN(len, mtd->writesize);
782
783 memset(buf, 0xff, len);
784
785 memcpy(buf, td->pattern, td->len);
786 } else {
787
788 len = (size_t)(numblocks >> sft);
789
790 len = ALIGN(len, mtd->writesize);
791
792 memset(buf, 0xff, len +
793 (len >> this->page_shift)* mtd->oobsize);
794 offs = 0;
795 ooboffs = len;
796
797 memcpy(&buf[ooboffs + td->offs], td->pattern, td->len);
798 }
799
800 if (td->options & NAND_BBT_VERSION)
801 buf[ooboffs + td->veroffs] = td->version[chip];
802
803
804 for (i = 0; i < numblocks; i++) {
805 uint8_t dat;
806 int sftcnt = (i << (3 - sft)) & sftmsk;
807 dat = bbt_get_entry(this, chip * numblocks + i);
808
809 buf[offs + (i >> sft)] &= ~(msk[dat] << sftcnt);
810 }
811
812 memset(&einfo, 0, sizeof(einfo));
813 einfo.mtd = mtd;
814 einfo.addr = to;
815 einfo.len = 1 << this->bbt_erase_shift;
816 res = nand_erase_nand(mtd, &einfo, 1);
817 if (res < 0)
818 goto outerr;
819
820 res = scan_write_bbt(mtd, to, len, buf,
821 td->options & NAND_BBT_NO_OOB ? NULL :
822 &buf[len]);
823 if (res < 0)
824 goto outerr;
825
826 pr_info("Bad block table written to 0x%012llx, version 0x%02X\n",
827 (unsigned long long)to, td->version[chip]);
828
829
830 td->pages[chip] = page;
831 }
832 return 0;
833
834 outerr:
835 pr_warn("nand_bbt: error while writing bad block table %d\n", res);
836 return res;
837}
838
839
840
841
842
843
844
845
846
847static inline int nand_memory_bbt(struct mtd_info *mtd, struct nand_bbt_descr *bd)
848{
849 struct nand_chip *this = mtd->priv;
850
851 return create_bbt(mtd, this->buffers->databuf, bd, -1);
852}
853
854
855
856
857
858
859
860
861
862
863
864
865static int check_create(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr *bd)
866{
867 int i, chips, writeops, create, chipsel, res, res2;
868 struct nand_chip *this = mtd->priv;
869 struct nand_bbt_descr *td = this->bbt_td;
870 struct nand_bbt_descr *md = this->bbt_md;
871 struct nand_bbt_descr *rd, *rd2;
872
873
874 if (td->options & NAND_BBT_PERCHIP)
875 chips = this->numchips;
876 else
877 chips = 1;
878
879 for (i = 0; i < chips; i++) {
880 writeops = 0;
881 create = 0;
882 rd = NULL;
883 rd2 = NULL;
884 res = res2 = 0;
885
886 chipsel = (td->options & NAND_BBT_PERCHIP) ? i : -1;
887
888 if (md) {
889 if (td->pages[i] == -1 && md->pages[i] == -1) {
890 create = 1;
891 writeops = 0x03;
892 } else if (td->pages[i] == -1) {
893 rd = md;
894 writeops = 0x01;
895 } else if (md->pages[i] == -1) {
896 rd = td;
897 writeops = 0x02;
898 } else if (td->version[i] == md->version[i]) {
899 rd = td;
900 if (!(td->options & NAND_BBT_VERSION))
901 rd2 = md;
902 } else if (((int8_t)(td->version[i] - md->version[i])) > 0) {
903 rd = td;
904 writeops = 0x02;
905 } else {
906 rd = md;
907 writeops = 0x01;
908 }
909 } else {
910 if (td->pages[i] == -1) {
911 create = 1;
912 writeops = 0x01;
913 } else {
914 rd = td;
915 }
916 }
917
918 if (create) {
919
920 if (!(td->options & NAND_BBT_CREATE))
921 continue;
922
923
924 if (!(this->bbt_options & NAND_BBT_CREATE_EMPTY))
925 create_bbt(mtd, buf, bd, chipsel);
926
927 td->version[i] = 1;
928 if (md)
929 md->version[i] = 1;
930 }
931
932
933 if (rd) {
934 res = read_abs_bbt(mtd, buf, rd, chipsel);
935 if (mtd_is_eccerr(res)) {
936
937 rd->pages[i] = -1;
938 rd->version[i] = 0;
939 i--;
940 continue;
941 }
942 }
943
944 if (rd2) {
945 res2 = read_abs_bbt(mtd, buf, rd2, chipsel);
946 if (mtd_is_eccerr(res2)) {
947
948 rd2->pages[i] = -1;
949 rd2->version[i] = 0;
950 i--;
951 continue;
952 }
953 }
954
955
956 if (mtd_is_bitflip(res) || mtd_is_bitflip(res2))
957 writeops = 0x03;
958
959
960 if (md) {
961 td->version[i] = max(td->version[i], md->version[i]);
962 md->version[i] = td->version[i];
963 }
964
965
966 if ((writeops & 0x01) && (td->options & NAND_BBT_WRITE)) {
967 res = write_bbt(mtd, buf, td, md, chipsel);
968 if (res < 0)
969 return res;
970 }
971
972
973 if ((writeops & 0x02) && md && (md->options & NAND_BBT_WRITE)) {
974 res = write_bbt(mtd, buf, md, td, chipsel);
975 if (res < 0)
976 return res;
977 }
978 }
979 return 0;
980}
981
982
983
984
985
986
987
988
989
990static void mark_bbt_region(struct mtd_info *mtd, struct nand_bbt_descr *td)
991{
992 struct nand_chip *this = mtd->priv;
993 int i, j, chips, block, nrblocks, update;
994 uint8_t oldval;
995
996
997 if (td->options & NAND_BBT_PERCHIP) {
998 chips = this->numchips;
999 nrblocks = (int)(this->chipsize >> this->bbt_erase_shift);
1000 } else {
1001 chips = 1;
1002 nrblocks = (int)(mtd->size >> this->bbt_erase_shift);
1003 }
1004
1005 for (i = 0; i < chips; i++) {
1006 if ((td->options & NAND_BBT_ABSPAGE) ||
1007 !(td->options & NAND_BBT_WRITE)) {
1008 if (td->pages[i] == -1)
1009 continue;
1010 block = td->pages[i] >> (this->bbt_erase_shift - this->page_shift);
1011 oldval = bbt_get_entry(this, block);
1012 bbt_mark_entry(this, block, BBT_BLOCK_RESERVED);
1013 if ((oldval != BBT_BLOCK_RESERVED) &&
1014 td->reserved_block_code)
1015 nand_update_bbt(mtd, (loff_t)block <<
1016 this->bbt_erase_shift);
1017 continue;
1018 }
1019 update = 0;
1020 if (td->options & NAND_BBT_LASTBLOCK)
1021 block = ((i + 1) * nrblocks) - td->maxblocks;
1022 else
1023 block = i * nrblocks;
1024 for (j = 0; j < td->maxblocks; j++) {
1025 oldval = bbt_get_entry(this, block);
1026 bbt_mark_entry(this, block, BBT_BLOCK_RESERVED);
1027 if (oldval != BBT_BLOCK_RESERVED)
1028 update = 1;
1029 block++;
1030 }
1031
1032
1033
1034
1035
1036 if (update && td->reserved_block_code)
1037 nand_update_bbt(mtd, (loff_t)(block - 1) <<
1038 this->bbt_erase_shift);
1039 }
1040}
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050static void verify_bbt_descr(struct mtd_info *mtd, struct nand_bbt_descr *bd)
1051{
1052 struct nand_chip *this = mtd->priv;
1053 u32 pattern_len;
1054 u32 bits;
1055 u32 table_size;
1056
1057 if (!bd)
1058 return;
1059
1060 pattern_len = bd->len;
1061 bits = bd->options & NAND_BBT_NRBITS_MSK;
1062
1063 BUG_ON((this->bbt_options & NAND_BBT_NO_OOB) &&
1064 !(this->bbt_options & NAND_BBT_USE_FLASH));
1065 BUG_ON(!bits);
1066
1067 if (bd->options & NAND_BBT_VERSION)
1068 pattern_len++;
1069
1070 if (bd->options & NAND_BBT_NO_OOB) {
1071 BUG_ON(!(this->bbt_options & NAND_BBT_USE_FLASH));
1072 BUG_ON(!(this->bbt_options & NAND_BBT_NO_OOB));
1073 BUG_ON(bd->offs);
1074 if (bd->options & NAND_BBT_VERSION)
1075 BUG_ON(bd->veroffs != bd->len);
1076 BUG_ON(bd->options & NAND_BBT_SAVECONTENT);
1077 }
1078
1079 if (bd->options & NAND_BBT_PERCHIP)
1080 table_size = this->chipsize >> this->bbt_erase_shift;
1081 else
1082 table_size = mtd->size >> this->bbt_erase_shift;
1083 table_size >>= 3;
1084 table_size *= bits;
1085 if (bd->options & NAND_BBT_NO_OOB)
1086 table_size += pattern_len;
1087 BUG_ON(table_size > (1 << this->bbt_erase_shift));
1088}
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102int nand_scan_bbt(struct mtd_info *mtd, struct nand_bbt_descr *bd)
1103{
1104 struct nand_chip *this = mtd->priv;
1105 int len, res = 0;
1106 uint8_t *buf;
1107 struct nand_bbt_descr *td = this->bbt_td;
1108 struct nand_bbt_descr *md = this->bbt_md;
1109
1110 len = mtd->size >> (this->bbt_erase_shift + 2);
1111
1112
1113
1114
1115 this->bbt = kzalloc(len, GFP_KERNEL);
1116 if (!this->bbt)
1117 return -ENOMEM;
1118
1119
1120
1121
1122
1123 if (!td) {
1124 if ((res = nand_memory_bbt(mtd, bd))) {
1125 pr_err("nand_bbt: can't scan flash and build the RAM-based BBT\n");
1126 kfree(this->bbt);
1127 this->bbt = NULL;
1128 }
1129 return res;
1130 }
1131 verify_bbt_descr(mtd, td);
1132 verify_bbt_descr(mtd, md);
1133
1134
1135 len = (1 << this->bbt_erase_shift);
1136 len += (len >> this->page_shift) * mtd->oobsize;
1137 buf = vmalloc(len);
1138 if (!buf) {
1139 kfree(this->bbt);
1140 this->bbt = NULL;
1141 return -ENOMEM;
1142 }
1143
1144
1145 if (td->options & NAND_BBT_ABSPAGE) {
1146 read_abs_bbts(mtd, buf, td, md);
1147 } else {
1148
1149 search_read_bbts(mtd, buf, td, md);
1150 }
1151
1152 res = check_create(mtd, buf, bd);
1153
1154
1155 mark_bbt_region(mtd, td);
1156 if (md)
1157 mark_bbt_region(mtd, md);
1158
1159 vfree(buf);
1160 return res;
1161}
1162
1163
1164
1165
1166
1167
1168
1169
1170static int nand_update_bbt(struct mtd_info *mtd, loff_t offs)
1171{
1172 struct nand_chip *this = mtd->priv;
1173 int len, res = 0;
1174 int chip, chipsel;
1175 uint8_t *buf;
1176 struct nand_bbt_descr *td = this->bbt_td;
1177 struct nand_bbt_descr *md = this->bbt_md;
1178
1179 if (!this->bbt || !td)
1180 return -EINVAL;
1181
1182
1183 len = (1 << this->bbt_erase_shift);
1184 len += (len >> this->page_shift) * mtd->oobsize;
1185 buf = kmalloc(len, GFP_KERNEL);
1186 if (!buf)
1187 return -ENOMEM;
1188
1189
1190 if (td->options & NAND_BBT_PERCHIP) {
1191 chip = (int)(offs >> this->chip_shift);
1192 chipsel = chip;
1193 } else {
1194 chip = 0;
1195 chipsel = -1;
1196 }
1197
1198 td->version[chip]++;
1199 if (md)
1200 md->version[chip]++;
1201
1202
1203 if (td->options & NAND_BBT_WRITE) {
1204 res = write_bbt(mtd, buf, td, md, chipsel);
1205 if (res < 0)
1206 goto out;
1207 }
1208
1209 if (md && (md->options & NAND_BBT_WRITE)) {
1210 res = write_bbt(mtd, buf, md, td, chipsel);
1211 }
1212
1213 out:
1214 kfree(buf);
1215 return res;
1216}
1217
1218
1219
1220
1221
1222static uint8_t scan_ff_pattern[] = { 0xff, 0xff };
1223
1224
1225static uint8_t bbt_pattern[] = {'B', 'b', 't', '0' };
1226static uint8_t mirror_pattern[] = {'1', 't', 'b', 'B' };
1227
1228static struct nand_bbt_descr bbt_main_descr = {
1229 .options = NAND_BBT_LASTBLOCK | NAND_BBT_CREATE | NAND_BBT_WRITE
1230 | NAND_BBT_2BIT | NAND_BBT_VERSION | NAND_BBT_PERCHIP,
1231 .offs = 8,
1232 .len = 4,
1233 .veroffs = 12,
1234 .maxblocks = NAND_BBT_SCAN_MAXBLOCKS,
1235 .pattern = bbt_pattern
1236};
1237
1238static struct nand_bbt_descr bbt_mirror_descr = {
1239 .options = NAND_BBT_LASTBLOCK | NAND_BBT_CREATE | NAND_BBT_WRITE
1240 | NAND_BBT_2BIT | NAND_BBT_VERSION | NAND_BBT_PERCHIP,
1241 .offs = 8,
1242 .len = 4,
1243 .veroffs = 12,
1244 .maxblocks = NAND_BBT_SCAN_MAXBLOCKS,
1245 .pattern = mirror_pattern
1246};
1247
1248static struct nand_bbt_descr bbt_main_no_oob_descr = {
1249 .options = NAND_BBT_LASTBLOCK | NAND_BBT_CREATE | NAND_BBT_WRITE
1250 | NAND_BBT_2BIT | NAND_BBT_VERSION | NAND_BBT_PERCHIP
1251 | NAND_BBT_NO_OOB,
1252 .len = 4,
1253 .veroffs = 4,
1254 .maxblocks = NAND_BBT_SCAN_MAXBLOCKS,
1255 .pattern = bbt_pattern
1256};
1257
1258static struct nand_bbt_descr bbt_mirror_no_oob_descr = {
1259 .options = NAND_BBT_LASTBLOCK | NAND_BBT_CREATE | NAND_BBT_WRITE
1260 | NAND_BBT_2BIT | NAND_BBT_VERSION | NAND_BBT_PERCHIP
1261 | NAND_BBT_NO_OOB,
1262 .len = 4,
1263 .veroffs = 4,
1264 .maxblocks = NAND_BBT_SCAN_MAXBLOCKS,
1265 .pattern = mirror_pattern
1266};
1267
1268#define BADBLOCK_SCAN_MASK (~NAND_BBT_NO_OOB)
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278static int nand_create_badblock_pattern(struct nand_chip *this)
1279{
1280 struct nand_bbt_descr *bd;
1281 if (this->badblock_pattern) {
1282 pr_warn("Bad block pattern already allocated; not replacing\n");
1283 return -EINVAL;
1284 }
1285 bd = kzalloc(sizeof(*bd), GFP_KERNEL);
1286 if (!bd)
1287 return -ENOMEM;
1288 bd->options = this->bbt_options & BADBLOCK_SCAN_MASK;
1289 bd->offs = this->badblockpos;
1290 bd->len = (this->options & NAND_BUSWIDTH_16) ? 2 : 1;
1291 bd->pattern = scan_ff_pattern;
1292 bd->options |= NAND_BBT_DYNAMICSTRUCT;
1293 this->badblock_pattern = bd;
1294 return 0;
1295}
1296
1297
1298
1299
1300
1301
1302
1303
1304int nand_default_bbt(struct mtd_info *mtd)
1305{
1306 struct nand_chip *this = mtd->priv;
1307
1308
1309 if (this->bbt_options & NAND_BBT_USE_FLASH) {
1310
1311 if (!this->bbt_td) {
1312 if (this->bbt_options & NAND_BBT_NO_OOB) {
1313 this->bbt_td = &bbt_main_no_oob_descr;
1314 this->bbt_md = &bbt_mirror_no_oob_descr;
1315 } else {
1316 this->bbt_td = &bbt_main_descr;
1317 this->bbt_md = &bbt_mirror_descr;
1318 }
1319 }
1320 } else {
1321 this->bbt_td = NULL;
1322 this->bbt_md = NULL;
1323 }
1324
1325 if (!this->badblock_pattern)
1326 nand_create_badblock_pattern(this);
1327
1328 return nand_scan_bbt(mtd, this->badblock_pattern);
1329}
1330
1331
1332
1333
1334
1335
1336
1337int nand_isbad_bbt(struct mtd_info *mtd, loff_t offs, int allowbbt)
1338{
1339 struct nand_chip *this = mtd->priv;
1340 int block, res;
1341
1342 block = (int)(offs >> this->bbt_erase_shift);
1343 res = bbt_get_entry(this, block);
1344
1345 pr_debug("nand_isbad_bbt(): bbt info for offs 0x%08x: "
1346 "(block %d) 0x%02x\n",
1347 (unsigned int)offs, block, res);
1348
1349 switch (res) {
1350 case BBT_BLOCK_GOOD:
1351 return 0;
1352 case BBT_BLOCK_WORN:
1353 return 1;
1354 case BBT_BLOCK_RESERVED:
1355 return allowbbt ? 0 : 1;
1356 }
1357 return 1;
1358}
1359
1360
1361
1362
1363
1364
1365int nand_markbad_bbt(struct mtd_info *mtd, loff_t offs)
1366{
1367 struct nand_chip *this = mtd->priv;
1368 int block, ret = 0;
1369
1370 block = (int)(offs >> this->bbt_erase_shift);
1371
1372
1373 bbt_mark_entry(this, block, BBT_BLOCK_WORN);
1374
1375
1376 if (this->bbt_options & NAND_BBT_USE_FLASH)
1377 ret = nand_update_bbt(mtd, offs);
1378
1379 return ret;
1380}
1381
1382EXPORT_SYMBOL(nand_scan_bbt);
1383