1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22#include <linux/kernel.h>
23#include <linux/module.h>
24#include <linux/errno.h>
25#include <linux/of.h>
26#include <linux/platform_device.h>
27#include <linux/string.h>
28#include <linux/slab.h>
29#include <linux/io.h>
30#include <linux/delay.h>
31#include <linux/mtd/mtd.h>
32#include <linux/mtd/partitions.h>
33#include <linux/bitmap.h>
34#include <linux/bitrev.h>
35#include <linux/bch.h>
36
37#include <linux/debugfs.h>
38#include <linux/seq_file.h>
39
40#define CREATE_TRACE_POINTS
41#include "docg3.h"
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65static unsigned int reliable_mode;
66module_param(reliable_mode, uint, 0);
67MODULE_PARM_DESC(reliable_mode, "Set the docg3 mode (0=normal MLC, 1=fast, "
68 "2=reliable) : MLC normal operations are in normal mode");
69
70static int docg3_ooblayout_ecc(struct mtd_info *mtd, int section,
71 struct mtd_oob_region *oobregion)
72{
73 if (section)
74 return -ERANGE;
75
76
77 oobregion->offset = 7;
78 oobregion->length = 8;
79
80 return 0;
81}
82
83static int docg3_ooblayout_free(struct mtd_info *mtd, int section,
84 struct mtd_oob_region *oobregion)
85{
86 if (section > 1)
87 return -ERANGE;
88
89
90 if (!section) {
91 oobregion->offset = 0;
92 oobregion->length = 7;
93 } else {
94 oobregion->offset = 15;
95 oobregion->length = 1;
96 }
97
98 return 0;
99}
100
101static const struct mtd_ooblayout_ops nand_ooblayout_docg3_ops = {
102 .ecc = docg3_ooblayout_ecc,
103 .free = docg3_ooblayout_free,
104};
105
106static inline u8 doc_readb(struct docg3 *docg3, u16 reg)
107{
108 u8 val = readb(docg3->cascade->base + reg);
109
110 trace_docg3_io(0, 8, reg, (int)val);
111 return val;
112}
113
114static inline u16 doc_readw(struct docg3 *docg3, u16 reg)
115{
116 u16 val = readw(docg3->cascade->base + reg);
117
118 trace_docg3_io(0, 16, reg, (int)val);
119 return val;
120}
121
122static inline void doc_writeb(struct docg3 *docg3, u8 val, u16 reg)
123{
124 writeb(val, docg3->cascade->base + reg);
125 trace_docg3_io(1, 8, reg, val);
126}
127
128static inline void doc_writew(struct docg3 *docg3, u16 val, u16 reg)
129{
130 writew(val, docg3->cascade->base + reg);
131 trace_docg3_io(1, 16, reg, val);
132}
133
134static inline void doc_flash_command(struct docg3 *docg3, u8 cmd)
135{
136 doc_writeb(docg3, cmd, DOC_FLASHCOMMAND);
137}
138
139static inline void doc_flash_sequence(struct docg3 *docg3, u8 seq)
140{
141 doc_writeb(docg3, seq, DOC_FLASHSEQUENCE);
142}
143
144static inline void doc_flash_address(struct docg3 *docg3, u8 addr)
145{
146 doc_writeb(docg3, addr, DOC_FLASHADDRESS);
147}
148
149static char const * const part_probes[] = { "cmdlinepart", "saftlpart", NULL };
150
151static int doc_register_readb(struct docg3 *docg3, int reg)
152{
153 u8 val;
154
155 doc_writew(docg3, reg, DOC_READADDRESS);
156 val = doc_readb(docg3, reg);
157 doc_vdbg("Read register %04x : %02x\n", reg, val);
158 return val;
159}
160
161static int doc_register_readw(struct docg3 *docg3, int reg)
162{
163 u16 val;
164
165 doc_writew(docg3, reg, DOC_READADDRESS);
166 val = doc_readw(docg3, reg);
167 doc_vdbg("Read register %04x : %04x\n", reg, val);
168 return val;
169}
170
171
172
173
174
175
176
177
178
179
180
181
182static void doc_delay(struct docg3 *docg3, int nbNOPs)
183{
184 int i;
185
186 doc_vdbg("NOP x %d\n", nbNOPs);
187 for (i = 0; i < nbNOPs; i++)
188 doc_writeb(docg3, 0, DOC_NOP);
189}
190
191static int is_prot_seq_error(struct docg3 *docg3)
192{
193 int ctrl;
194
195 ctrl = doc_register_readb(docg3, DOC_FLASHCONTROL);
196 return ctrl & (DOC_CTRL_PROTECTION_ERROR | DOC_CTRL_SEQUENCE_ERROR);
197}
198
199static int doc_is_ready(struct docg3 *docg3)
200{
201 int ctrl;
202
203 ctrl = doc_register_readb(docg3, DOC_FLASHCONTROL);
204 return ctrl & DOC_CTRL_FLASHREADY;
205}
206
207static int doc_wait_ready(struct docg3 *docg3)
208{
209 int maxWaitCycles = 100;
210
211 do {
212 doc_delay(docg3, 4);
213 cpu_relax();
214 } while (!doc_is_ready(docg3) && maxWaitCycles--);
215 doc_delay(docg3, 2);
216 if (maxWaitCycles > 0)
217 return 0;
218 else
219 return -EIO;
220}
221
222static int doc_reset_seq(struct docg3 *docg3)
223{
224 int ret;
225
226 doc_writeb(docg3, 0x10, DOC_FLASHCONTROL);
227 doc_flash_sequence(docg3, DOC_SEQ_RESET);
228 doc_flash_command(docg3, DOC_CMD_RESET);
229 doc_delay(docg3, 2);
230 ret = doc_wait_ready(docg3);
231
232 doc_dbg("doc_reset_seq() -> isReady=%s\n", ret ? "false" : "true");
233 return ret;
234}
235
236
237
238
239
240
241
242
243
244
245static void doc_read_data_area(struct docg3 *docg3, void *buf, int len,
246 int first)
247{
248 int i, cdr, len4;
249 u16 data16, *dst16;
250 u8 data8, *dst8;
251
252 doc_dbg("doc_read_data_area(buf=%p, len=%d)\n", buf, len);
253 cdr = len & 0x1;
254 len4 = len - cdr;
255
256 if (first)
257 doc_writew(docg3, DOC_IOSPACE_DATA, DOC_READADDRESS);
258 dst16 = buf;
259 for (i = 0; i < len4; i += 2) {
260 data16 = doc_readw(docg3, DOC_IOSPACE_DATA);
261 if (dst16) {
262 *dst16 = data16;
263 dst16++;
264 }
265 }
266
267 if (cdr) {
268 doc_writew(docg3, DOC_IOSPACE_DATA | DOC_READADDR_ONE_BYTE,
269 DOC_READADDRESS);
270 doc_delay(docg3, 1);
271 dst8 = (u8 *)dst16;
272 for (i = 0; i < cdr; i++) {
273 data8 = doc_readb(docg3, DOC_IOSPACE_DATA);
274 if (dst8) {
275 *dst8 = data8;
276 dst8++;
277 }
278 }
279 }
280}
281
282
283
284
285
286
287
288
289
290static void doc_write_data_area(struct docg3 *docg3, const void *buf, int len)
291{
292 int i, cdr, len4;
293 u16 *src16;
294 u8 *src8;
295
296 doc_dbg("doc_write_data_area(buf=%p, len=%d)\n", buf, len);
297 cdr = len & 0x3;
298 len4 = len - cdr;
299
300 doc_writew(docg3, DOC_IOSPACE_DATA, DOC_READADDRESS);
301 src16 = (u16 *)buf;
302 for (i = 0; i < len4; i += 2) {
303 doc_writew(docg3, *src16, DOC_IOSPACE_DATA);
304 src16++;
305 }
306
307 src8 = (u8 *)src16;
308 for (i = 0; i < cdr; i++) {
309 doc_writew(docg3, DOC_IOSPACE_DATA | DOC_READADDR_ONE_BYTE,
310 DOC_READADDRESS);
311 doc_writeb(docg3, *src8, DOC_IOSPACE_DATA);
312 src8++;
313 }
314}
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331static void doc_set_reliable_mode(struct docg3 *docg3)
332{
333 static char *strmode[] = { "normal", "fast", "reliable", "invalid" };
334
335 doc_dbg("doc_set_reliable_mode(%s)\n", strmode[docg3->reliable]);
336 switch (docg3->reliable) {
337 case 0:
338 break;
339 case 1:
340 doc_flash_sequence(docg3, DOC_SEQ_SET_FASTMODE);
341 doc_flash_command(docg3, DOC_CMD_FAST_MODE);
342 break;
343 case 2:
344 doc_flash_sequence(docg3, DOC_SEQ_SET_RELIABLEMODE);
345 doc_flash_command(docg3, DOC_CMD_FAST_MODE);
346 doc_flash_command(docg3, DOC_CMD_RELIABLE_MODE);
347 break;
348 default:
349 doc_err("doc_set_reliable_mode(): invalid mode\n");
350 break;
351 }
352 doc_delay(docg3, 2);
353}
354
355
356
357
358
359
360
361
362
363
364
365static void doc_set_asic_mode(struct docg3 *docg3, u8 mode)
366{
367 int i;
368
369 for (i = 0; i < 12; i++)
370 doc_readb(docg3, DOC_IOSPACE_IPL);
371
372 mode |= DOC_ASICMODE_MDWREN;
373 doc_dbg("doc_set_asic_mode(%02x)\n", mode);
374 doc_writeb(docg3, mode, DOC_ASICMODE);
375 doc_writeb(docg3, ~mode, DOC_ASICMODECONFIRM);
376 doc_delay(docg3, 1);
377}
378
379
380
381
382
383
384
385
386
387static void doc_set_device_id(struct docg3 *docg3, int id)
388{
389 u8 ctrl;
390
391 doc_dbg("doc_set_device_id(%d)\n", id);
392 doc_writeb(docg3, id, DOC_DEVICESELECT);
393 ctrl = doc_register_readb(docg3, DOC_FLASHCONTROL);
394
395 ctrl &= ~DOC_CTRL_VIOLATION;
396 ctrl |= DOC_CTRL_CE;
397 doc_writeb(docg3, ctrl, DOC_FLASHCONTROL);
398}
399
400
401
402
403
404
405
406
407
408
409
410
411static int doc_set_extra_page_mode(struct docg3 *docg3)
412{
413 int fctrl;
414
415 doc_dbg("doc_set_extra_page_mode()\n");
416 doc_flash_sequence(docg3, DOC_SEQ_PAGE_SIZE_532);
417 doc_flash_command(docg3, DOC_CMD_PAGE_SIZE_532);
418 doc_delay(docg3, 2);
419
420 fctrl = doc_register_readb(docg3, DOC_FLASHCONTROL);
421 if (fctrl & (DOC_CTRL_PROTECTION_ERROR | DOC_CTRL_SEQUENCE_ERROR))
422 return -EIO;
423 else
424 return 0;
425}
426
427
428
429
430
431
432static void doc_setup_addr_sector(struct docg3 *docg3, int sector)
433{
434 doc_delay(docg3, 1);
435 doc_flash_address(docg3, sector & 0xff);
436 doc_flash_address(docg3, (sector >> 8) & 0xff);
437 doc_flash_address(docg3, (sector >> 16) & 0xff);
438 doc_delay(docg3, 1);
439}
440
441
442
443
444
445
446
447static void doc_setup_writeaddr_sector(struct docg3 *docg3, int sector, int ofs)
448{
449 ofs = ofs >> 2;
450 doc_delay(docg3, 1);
451 doc_flash_address(docg3, ofs & 0xff);
452 doc_flash_address(docg3, sector & 0xff);
453 doc_flash_address(docg3, (sector >> 8) & 0xff);
454 doc_flash_address(docg3, (sector >> 16) & 0xff);
455 doc_delay(docg3, 1);
456}
457
458
459
460
461
462
463
464
465
466
467
468
469
470static int doc_read_seek(struct docg3 *docg3, int block0, int block1, int page,
471 int wear, int ofs)
472{
473 int sector, ret = 0;
474
475 doc_dbg("doc_seek(blocks=(%d,%d), page=%d, ofs=%d, wear=%d)\n",
476 block0, block1, page, ofs, wear);
477
478 if (!wear && (ofs < 2 * DOC_LAYOUT_PAGE_SIZE)) {
479 doc_flash_sequence(docg3, DOC_SEQ_SET_PLANE1);
480 doc_flash_command(docg3, DOC_CMD_READ_PLANE1);
481 doc_delay(docg3, 2);
482 } else {
483 doc_flash_sequence(docg3, DOC_SEQ_SET_PLANE2);
484 doc_flash_command(docg3, DOC_CMD_READ_PLANE2);
485 doc_delay(docg3, 2);
486 }
487
488 doc_set_reliable_mode(docg3);
489 if (wear)
490 ret = doc_set_extra_page_mode(docg3);
491 if (ret)
492 goto out;
493
494 doc_flash_sequence(docg3, DOC_SEQ_READ);
495 sector = (block0 << DOC_ADDR_BLOCK_SHIFT) + (page & DOC_ADDR_PAGE_MASK);
496 doc_flash_command(docg3, DOC_CMD_PROG_BLOCK_ADDR);
497 doc_setup_addr_sector(docg3, sector);
498
499 sector = (block1 << DOC_ADDR_BLOCK_SHIFT) + (page & DOC_ADDR_PAGE_MASK);
500 doc_flash_command(docg3, DOC_CMD_PROG_BLOCK_ADDR);
501 doc_setup_addr_sector(docg3, sector);
502 doc_delay(docg3, 1);
503
504out:
505 return ret;
506}
507
508
509
510
511
512
513
514
515
516
517
518
519static int doc_write_seek(struct docg3 *docg3, int block0, int block1, int page,
520 int ofs)
521{
522 int ret = 0, sector;
523
524 doc_dbg("doc_write_seek(blocks=(%d,%d), page=%d, ofs=%d)\n",
525 block0, block1, page, ofs);
526
527 doc_set_reliable_mode(docg3);
528
529 if (ofs < 2 * DOC_LAYOUT_PAGE_SIZE) {
530 doc_flash_sequence(docg3, DOC_SEQ_SET_PLANE1);
531 doc_flash_command(docg3, DOC_CMD_READ_PLANE1);
532 doc_delay(docg3, 2);
533 } else {
534 doc_flash_sequence(docg3, DOC_SEQ_SET_PLANE2);
535 doc_flash_command(docg3, DOC_CMD_READ_PLANE2);
536 doc_delay(docg3, 2);
537 }
538
539 doc_flash_sequence(docg3, DOC_SEQ_PAGE_SETUP);
540 doc_flash_command(docg3, DOC_CMD_PROG_CYCLE1);
541
542 sector = (block0 << DOC_ADDR_BLOCK_SHIFT) + (page & DOC_ADDR_PAGE_MASK);
543 doc_setup_writeaddr_sector(docg3, sector, ofs);
544
545 doc_flash_command(docg3, DOC_CMD_PROG_CYCLE3);
546 doc_delay(docg3, 2);
547 ret = doc_wait_ready(docg3);
548 if (ret)
549 goto out;
550
551 doc_flash_command(docg3, DOC_CMD_PROG_CYCLE1);
552 sector = (block1 << DOC_ADDR_BLOCK_SHIFT) + (page & DOC_ADDR_PAGE_MASK);
553 doc_setup_writeaddr_sector(docg3, sector, ofs);
554 doc_delay(docg3, 1);
555
556out:
557 return ret;
558}
559
560
561
562
563
564
565
566
567
568
569
570
571static int doc_read_page_ecc_init(struct docg3 *docg3, int len)
572{
573 doc_writew(docg3, DOC_ECCCONF0_READ_MODE
574 | DOC_ECCCONF0_BCH_ENABLE | DOC_ECCCONF0_HAMMING_ENABLE
575 | (len & DOC_ECCCONF0_DATA_BYTES_MASK),
576 DOC_ECCCONF0);
577 doc_delay(docg3, 4);
578 doc_register_readb(docg3, DOC_FLASHCONTROL);
579 return doc_wait_ready(docg3);
580}
581
582
583
584
585
586
587
588
589
590
591
592static int doc_write_page_ecc_init(struct docg3 *docg3, int len)
593{
594 doc_writew(docg3, DOC_ECCCONF0_WRITE_MODE
595 | DOC_ECCCONF0_BCH_ENABLE | DOC_ECCCONF0_HAMMING_ENABLE
596 | (len & DOC_ECCCONF0_DATA_BYTES_MASK),
597 DOC_ECCCONF0);
598 doc_delay(docg3, 4);
599 doc_register_readb(docg3, DOC_FLASHCONTROL);
600 return doc_wait_ready(docg3);
601}
602
603
604
605
606
607
608
609
610static void doc_ecc_disable(struct docg3 *docg3)
611{
612 doc_writew(docg3, DOC_ECCCONF0_READ_MODE, DOC_ECCCONF0);
613 doc_delay(docg3, 4);
614}
615
616
617
618
619
620
621
622
623
624static void doc_hamming_ecc_init(struct docg3 *docg3, int nb_bytes)
625{
626 u8 ecc_conf1;
627
628 ecc_conf1 = doc_register_readb(docg3, DOC_ECCCONF1);
629 ecc_conf1 &= ~DOC_ECCCONF1_HAMMING_BITS_MASK;
630 ecc_conf1 |= (nb_bytes & DOC_ECCCONF1_HAMMING_BITS_MASK);
631 doc_writeb(docg3, ecc_conf1, DOC_ECCCONF1);
632}
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657static int doc_ecc_bch_fix_data(struct docg3 *docg3, void *buf, u8 *hwecc)
658{
659 u8 ecc[DOC_ECC_BCH_SIZE];
660 int errorpos[DOC_ECC_BCH_T], i, numerrs;
661
662 for (i = 0; i < DOC_ECC_BCH_SIZE; i++)
663 ecc[i] = bitrev8(hwecc[i]);
664 numerrs = decode_bch(docg3->cascade->bch, NULL,
665 DOC_ECC_BCH_COVERED_BYTES,
666 NULL, ecc, NULL, errorpos);
667 BUG_ON(numerrs == -EINVAL);
668 if (numerrs < 0)
669 goto out;
670
671 for (i = 0; i < numerrs; i++)
672 errorpos[i] = (errorpos[i] & ~7) | (7 - (errorpos[i] & 7));
673 for (i = 0; i < numerrs; i++)
674 if (errorpos[i] < DOC_ECC_BCH_COVERED_BYTES*8)
675
676 change_bit(errorpos[i], buf);
677out:
678 doc_dbg("doc_ecc_bch_fix_data: flipped %d bits\n", numerrs);
679 return numerrs;
680}
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709static int doc_read_page_prepare(struct docg3 *docg3, int block0, int block1,
710 int page, int offset)
711{
712 int wear_area = 0, ret = 0;
713
714 doc_dbg("doc_read_page_prepare(blocks=(%d,%d), page=%d, ofsInPage=%d)\n",
715 block0, block1, page, offset);
716 if (offset >= DOC_LAYOUT_WEAR_OFFSET)
717 wear_area = 1;
718 if (!wear_area && offset > (DOC_LAYOUT_PAGE_OOB_SIZE * 2))
719 return -EINVAL;
720
721 doc_set_device_id(docg3, docg3->device_id);
722 ret = doc_reset_seq(docg3);
723 if (ret)
724 goto err;
725
726
727 ret = doc_read_seek(docg3, block0, block1, page, wear_area, offset);
728 if (ret)
729 goto err;
730
731 doc_flash_command(docg3, DOC_CMD_READ_ALL_PLANES);
732 doc_delay(docg3, 2);
733 doc_wait_ready(docg3);
734
735 doc_flash_command(docg3, DOC_CMD_SET_ADDR_READ);
736 doc_delay(docg3, 1);
737 if (offset >= DOC_LAYOUT_PAGE_SIZE * 2)
738 offset -= 2 * DOC_LAYOUT_PAGE_SIZE;
739 doc_flash_address(docg3, offset >> 2);
740 doc_delay(docg3, 1);
741 doc_wait_ready(docg3);
742
743 doc_flash_command(docg3, DOC_CMD_READ_FLASH);
744
745 return 0;
746err:
747 doc_writeb(docg3, 0, DOC_DATAEND);
748 doc_delay(docg3, 2);
749 return -EIO;
750}
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767static int doc_read_page_getbytes(struct docg3 *docg3, int len, u_char *buf,
768 int first, int last_odd)
769{
770 if (last_odd && len > 0) {
771 doc_read_data_area(docg3, buf, 1, first);
772 doc_read_data_area(docg3, buf ? buf + 1 : buf, len - 1, 0);
773 } else {
774 doc_read_data_area(docg3, buf, len, first);
775 }
776 doc_delay(docg3, 2);
777 return len;
778}
779
780
781
782
783
784
785
786
787static void doc_write_page_putbytes(struct docg3 *docg3, int len,
788 const u_char *buf)
789{
790 doc_write_data_area(docg3, buf, len);
791 doc_delay(docg3, 2);
792}
793
794
795
796
797
798
799static void doc_get_bch_hw_ecc(struct docg3 *docg3, u8 *hwecc)
800{
801 int i;
802
803 for (i = 0; i < DOC_ECC_BCH_SIZE; i++)
804 hwecc[i] = doc_register_readb(docg3, DOC_BCH_HW_ECC(i));
805}
806
807
808
809
810
811static void doc_page_finish(struct docg3 *docg3)
812{
813 doc_writeb(docg3, 0, DOC_DATAEND);
814 doc_delay(docg3, 2);
815}
816
817
818
819
820
821
822
823
824
825static void doc_read_page_finish(struct docg3 *docg3)
826{
827 doc_page_finish(docg3);
828 doc_set_device_id(docg3, 0);
829}
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846static void calc_block_sector(loff_t from, int *block0, int *block1, int *page,
847 int *ofs, int reliable)
848{
849 uint sector, pages_biblock;
850
851 pages_biblock = DOC_LAYOUT_PAGES_PER_BLOCK * DOC_LAYOUT_NBPLANES;
852 if (reliable == 1 || reliable == 2)
853 pages_biblock /= 2;
854
855 sector = from / DOC_LAYOUT_PAGE_SIZE;
856 *block0 = sector / pages_biblock * DOC_LAYOUT_NBPLANES;
857 *block1 = *block0 + 1;
858 *page = sector % pages_biblock;
859 *page /= DOC_LAYOUT_NBPLANES;
860 if (reliable == 1 || reliable == 2)
861 *page *= 2;
862 if (sector % 2)
863 *ofs = DOC_LAYOUT_PAGE_OOB_SIZE;
864 else
865 *ofs = 0;
866}
867
868
869
870
871
872
873
874
875
876
877
878
879static int doc_read_oob(struct mtd_info *mtd, loff_t from,
880 struct mtd_oob_ops *ops)
881{
882 struct docg3 *docg3 = mtd->priv;
883 int block0, block1, page, ret, skip, ofs = 0;
884 u8 *oobbuf = ops->oobbuf;
885 u8 *buf = ops->datbuf;
886 size_t len, ooblen, nbdata, nboob;
887 u8 hwecc[DOC_ECC_BCH_SIZE], eccconf1;
888 int max_bitflips = 0;
889
890 if (buf)
891 len = ops->len;
892 else
893 len = 0;
894 if (oobbuf)
895 ooblen = ops->ooblen;
896 else
897 ooblen = 0;
898
899 if (oobbuf && ops->mode == MTD_OPS_PLACE_OOB)
900 oobbuf += ops->ooboffs;
901
902 doc_dbg("doc_read_oob(from=%lld, mode=%d, data=(%p:%zu), oob=(%p:%zu))\n",
903 from, ops->mode, buf, len, oobbuf, ooblen);
904 if (ooblen % DOC_LAYOUT_OOB_SIZE)
905 return -EINVAL;
906
907 if (from + len > mtd->size)
908 return -EINVAL;
909
910 ops->oobretlen = 0;
911 ops->retlen = 0;
912 ret = 0;
913 skip = from % DOC_LAYOUT_PAGE_SIZE;
914 mutex_lock(&docg3->cascade->lock);
915 while (ret >= 0 && (len > 0 || ooblen > 0)) {
916 calc_block_sector(from - skip, &block0, &block1, &page, &ofs,
917 docg3->reliable);
918 nbdata = min_t(size_t, len, DOC_LAYOUT_PAGE_SIZE - skip);
919 nboob = min_t(size_t, ooblen, (size_t)DOC_LAYOUT_OOB_SIZE);
920 ret = doc_read_page_prepare(docg3, block0, block1, page, ofs);
921 if (ret < 0)
922 goto out;
923 ret = doc_read_page_ecc_init(docg3, DOC_ECC_BCH_TOTAL_BYTES);
924 if (ret < 0)
925 goto err_in_read;
926 ret = doc_read_page_getbytes(docg3, skip, NULL, 1, 0);
927 if (ret < skip)
928 goto err_in_read;
929 ret = doc_read_page_getbytes(docg3, nbdata, buf, 0, skip % 2);
930 if (ret < nbdata)
931 goto err_in_read;
932 doc_read_page_getbytes(docg3,
933 DOC_LAYOUT_PAGE_SIZE - nbdata - skip,
934 NULL, 0, (skip + nbdata) % 2);
935 ret = doc_read_page_getbytes(docg3, nboob, oobbuf, 0, 0);
936 if (ret < nboob)
937 goto err_in_read;
938 doc_read_page_getbytes(docg3, DOC_LAYOUT_OOB_SIZE - nboob,
939 NULL, 0, nboob % 2);
940
941 doc_get_bch_hw_ecc(docg3, hwecc);
942 eccconf1 = doc_register_readb(docg3, DOC_ECCCONF1);
943
944 if (nboob >= DOC_LAYOUT_OOB_SIZE) {
945 doc_dbg("OOB - INFO: %*phC\n", 7, oobbuf);
946 doc_dbg("OOB - HAMMING: %02x\n", oobbuf[7]);
947 doc_dbg("OOB - BCH_ECC: %*phC\n", 7, oobbuf + 8);
948 doc_dbg("OOB - UNUSED: %02x\n", oobbuf[15]);
949 }
950 doc_dbg("ECC checks: ECCConf1=%x\n", eccconf1);
951 doc_dbg("ECC HW_ECC: %*phC\n", 7, hwecc);
952
953 ret = -EIO;
954 if (is_prot_seq_error(docg3))
955 goto err_in_read;
956 ret = 0;
957 if ((block0 >= DOC_LAYOUT_BLOCK_FIRST_DATA) &&
958 (eccconf1 & DOC_ECCCONF1_BCH_SYNDROM_ERR) &&
959 (eccconf1 & DOC_ECCCONF1_PAGE_IS_WRITTEN) &&
960 (ops->mode != MTD_OPS_RAW) &&
961 (nbdata == DOC_LAYOUT_PAGE_SIZE)) {
962 ret = doc_ecc_bch_fix_data(docg3, buf, hwecc);
963 if (ret < 0) {
964 mtd->ecc_stats.failed++;
965 ret = -EBADMSG;
966 }
967 if (ret > 0) {
968 mtd->ecc_stats.corrected += ret;
969 max_bitflips = max(max_bitflips, ret);
970 ret = max_bitflips;
971 }
972 }
973
974 doc_read_page_finish(docg3);
975 ops->retlen += nbdata;
976 ops->oobretlen += nboob;
977 buf += nbdata;
978 oobbuf += nboob;
979 len -= nbdata;
980 ooblen -= nboob;
981 from += DOC_LAYOUT_PAGE_SIZE;
982 skip = 0;
983 }
984
985out:
986 mutex_unlock(&docg3->cascade->lock);
987 return ret;
988err_in_read:
989 doc_read_page_finish(docg3);
990 goto out;
991}
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007static int doc_read(struct mtd_info *mtd, loff_t from, size_t len,
1008 size_t *retlen, u_char *buf)
1009{
1010 struct mtd_oob_ops ops;
1011 size_t ret;
1012
1013 memset(&ops, 0, sizeof(ops));
1014 ops.datbuf = buf;
1015 ops.len = len;
1016 ops.mode = MTD_OPS_AUTO_OOB;
1017
1018 ret = doc_read_oob(mtd, from, &ops);
1019 *retlen = ops.retlen;
1020 return ret;
1021}
1022
1023static int doc_reload_bbt(struct docg3 *docg3)
1024{
1025 int block = DOC_LAYOUT_BLOCK_BBT;
1026 int ret = 0, nbpages, page;
1027 u_char *buf = docg3->bbt;
1028
1029 nbpages = DIV_ROUND_UP(docg3->max_block + 1, 8 * DOC_LAYOUT_PAGE_SIZE);
1030 for (page = 0; !ret && (page < nbpages); page++) {
1031 ret = doc_read_page_prepare(docg3, block, block + 1,
1032 page + DOC_LAYOUT_PAGE_BBT, 0);
1033 if (!ret)
1034 ret = doc_read_page_ecc_init(docg3,
1035 DOC_LAYOUT_PAGE_SIZE);
1036 if (!ret)
1037 doc_read_page_getbytes(docg3, DOC_LAYOUT_PAGE_SIZE,
1038 buf, 1, 0);
1039 buf += DOC_LAYOUT_PAGE_SIZE;
1040 }
1041 doc_read_page_finish(docg3);
1042 return ret;
1043}
1044
1045
1046
1047
1048
1049
1050
1051
1052static int doc_block_isbad(struct mtd_info *mtd, loff_t from)
1053{
1054 struct docg3 *docg3 = mtd->priv;
1055 int block0, block1, page, ofs, is_good;
1056
1057 calc_block_sector(from, &block0, &block1, &page, &ofs,
1058 docg3->reliable);
1059 doc_dbg("doc_block_isbad(from=%lld) => block=(%d,%d), page=%d, ofs=%d\n",
1060 from, block0, block1, page, ofs);
1061
1062 if (block0 < DOC_LAYOUT_BLOCK_FIRST_DATA)
1063 return 0;
1064 if (block1 > docg3->max_block)
1065 return -EINVAL;
1066
1067 is_good = docg3->bbt[block0 >> 3] & (1 << (block0 & 0x7));
1068 return !is_good;
1069}
1070
1071#if 0
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082static int doc_get_erase_count(struct docg3 *docg3, loff_t from)
1083{
1084 u8 buf[DOC_LAYOUT_WEAR_SIZE];
1085 int ret, plane1_erase_count, plane2_erase_count;
1086 int block0, block1, page, ofs;
1087
1088 doc_dbg("doc_get_erase_count(from=%lld, buf=%p)\n", from, buf);
1089 if (from % DOC_LAYOUT_PAGE_SIZE)
1090 return -EINVAL;
1091 calc_block_sector(from, &block0, &block1, &page, &ofs, docg3->reliable);
1092 if (block1 > docg3->max_block)
1093 return -EINVAL;
1094
1095 ret = doc_reset_seq(docg3);
1096 if (!ret)
1097 ret = doc_read_page_prepare(docg3, block0, block1, page,
1098 ofs + DOC_LAYOUT_WEAR_OFFSET, 0);
1099 if (!ret)
1100 ret = doc_read_page_getbytes(docg3, DOC_LAYOUT_WEAR_SIZE,
1101 buf, 1, 0);
1102 doc_read_page_finish(docg3);
1103
1104 if (ret || (buf[0] != DOC_ERASE_MARK) || (buf[2] != DOC_ERASE_MARK))
1105 return -EIO;
1106 plane1_erase_count = (u8)(~buf[1]) | ((u8)(~buf[4]) << 8)
1107 | ((u8)(~buf[5]) << 16);
1108 plane2_erase_count = (u8)(~buf[3]) | ((u8)(~buf[6]) << 8)
1109 | ((u8)(~buf[7]) << 16);
1110
1111 return max(plane1_erase_count, plane2_erase_count);
1112}
1113#endif
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123static int doc_get_op_status(struct docg3 *docg3)
1124{
1125 u8 status;
1126
1127 doc_flash_sequence(docg3, DOC_SEQ_PLANES_STATUS);
1128 doc_flash_command(docg3, DOC_CMD_PLANES_STATUS);
1129 doc_delay(docg3, 5);
1130
1131 doc_ecc_disable(docg3);
1132 doc_read_data_area(docg3, &status, 1, 1);
1133 return status;
1134}
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146static int doc_write_erase_wait_status(struct docg3 *docg3)
1147{
1148 int i, status, ret = 0;
1149
1150 for (i = 0; !doc_is_ready(docg3) && i < 5; i++)
1151 msleep(20);
1152 if (!doc_is_ready(docg3)) {
1153 doc_dbg("Timeout reached and the chip is still not ready\n");
1154 ret = -EAGAIN;
1155 goto out;
1156 }
1157
1158 status = doc_get_op_status(docg3);
1159 if (status & DOC_PLANES_STATUS_FAIL) {
1160 doc_dbg("Erase/Write failed on (a) plane(s), status = %x\n",
1161 status);
1162 ret = -EIO;
1163 }
1164
1165out:
1166 doc_page_finish(docg3);
1167 return ret;
1168}
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181static int doc_erase_block(struct docg3 *docg3, int block0, int block1)
1182{
1183 int ret, sector;
1184
1185 doc_dbg("doc_erase_block(blocks=(%d,%d))\n", block0, block1);
1186 ret = doc_reset_seq(docg3);
1187 if (ret)
1188 return -EIO;
1189
1190 doc_set_reliable_mode(docg3);
1191 doc_flash_sequence(docg3, DOC_SEQ_ERASE);
1192
1193 sector = block0 << DOC_ADDR_BLOCK_SHIFT;
1194 doc_flash_command(docg3, DOC_CMD_PROG_BLOCK_ADDR);
1195 doc_setup_addr_sector(docg3, sector);
1196 sector = block1 << DOC_ADDR_BLOCK_SHIFT;
1197 doc_flash_command(docg3, DOC_CMD_PROG_BLOCK_ADDR);
1198 doc_setup_addr_sector(docg3, sector);
1199 doc_delay(docg3, 1);
1200
1201 doc_flash_command(docg3, DOC_CMD_ERASECYCLE2);
1202 doc_delay(docg3, 2);
1203
1204 if (is_prot_seq_error(docg3)) {
1205 doc_err("Erase blocks %d,%d error\n", block0, block1);
1206 return -EIO;
1207 }
1208
1209 return doc_write_erase_wait_status(docg3);
1210}
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223static int doc_erase(struct mtd_info *mtd, struct erase_info *info)
1224{
1225 struct docg3 *docg3 = mtd->priv;
1226 uint64_t len;
1227 int block0, block1, page, ret, ofs = 0;
1228
1229 doc_dbg("doc_erase(from=%lld, len=%lld\n", info->addr, info->len);
1230
1231 info->state = MTD_ERASE_PENDING;
1232 calc_block_sector(info->addr + info->len, &block0, &block1, &page,
1233 &ofs, docg3->reliable);
1234 ret = -EINVAL;
1235 if (info->addr + info->len > mtd->size || page || ofs)
1236 goto reset_err;
1237
1238 ret = 0;
1239 calc_block_sector(info->addr, &block0, &block1, &page, &ofs,
1240 docg3->reliable);
1241 mutex_lock(&docg3->cascade->lock);
1242 doc_set_device_id(docg3, docg3->device_id);
1243 doc_set_reliable_mode(docg3);
1244 for (len = info->len; !ret && len > 0; len -= mtd->erasesize) {
1245 info->state = MTD_ERASING;
1246 ret = doc_erase_block(docg3, block0, block1);
1247 block0 += 2;
1248 block1 += 2;
1249 }
1250 mutex_unlock(&docg3->cascade->lock);
1251
1252 if (ret)
1253 goto reset_err;
1254
1255 info->state = MTD_ERASE_DONE;
1256 return 0;
1257
1258reset_err:
1259 info->state = MTD_ERASE_FAILED;
1260 return ret;
1261}
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282static int doc_write_page(struct docg3 *docg3, loff_t to, const u_char *buf,
1283 const u_char *oob, int autoecc)
1284{
1285 int block0, block1, page, ret, ofs = 0;
1286 u8 hwecc[DOC_ECC_BCH_SIZE], hamming;
1287
1288 doc_dbg("doc_write_page(to=%lld)\n", to);
1289 calc_block_sector(to, &block0, &block1, &page, &ofs, docg3->reliable);
1290
1291 doc_set_device_id(docg3, docg3->device_id);
1292 ret = doc_reset_seq(docg3);
1293 if (ret)
1294 goto err;
1295
1296
1297 ret = doc_write_seek(docg3, block0, block1, page, ofs);
1298 if (ret)
1299 goto err;
1300
1301 doc_write_page_ecc_init(docg3, DOC_ECC_BCH_TOTAL_BYTES);
1302 doc_delay(docg3, 2);
1303 doc_write_page_putbytes(docg3, DOC_LAYOUT_PAGE_SIZE, buf);
1304
1305 if (oob && autoecc) {
1306 doc_write_page_putbytes(docg3, DOC_LAYOUT_OOB_PAGEINFO_SZ, oob);
1307 doc_delay(docg3, 2);
1308 oob += DOC_LAYOUT_OOB_UNUSED_OFS;
1309
1310 hamming = doc_register_readb(docg3, DOC_HAMMINGPARITY);
1311 doc_delay(docg3, 2);
1312 doc_write_page_putbytes(docg3, DOC_LAYOUT_OOB_HAMMING_SZ,
1313 &hamming);
1314 doc_delay(docg3, 2);
1315
1316 doc_get_bch_hw_ecc(docg3, hwecc);
1317 doc_write_page_putbytes(docg3, DOC_LAYOUT_OOB_BCH_SZ, hwecc);
1318 doc_delay(docg3, 2);
1319
1320 doc_write_page_putbytes(docg3, DOC_LAYOUT_OOB_UNUSED_SZ, oob);
1321 }
1322 if (oob && !autoecc)
1323 doc_write_page_putbytes(docg3, DOC_LAYOUT_OOB_SIZE, oob);
1324
1325 doc_delay(docg3, 2);
1326 doc_page_finish(docg3);
1327 doc_delay(docg3, 2);
1328 doc_flash_command(docg3, DOC_CMD_PROG_CYCLE2);
1329 doc_delay(docg3, 2);
1330
1331
1332
1333
1334
1335 ret = doc_write_erase_wait_status(docg3);
1336 return ret;
1337err:
1338 doc_read_page_finish(docg3);
1339 return ret;
1340}
1341
1342
1343
1344
1345
1346
1347
1348static int doc_guess_autoecc(struct mtd_oob_ops *ops)
1349{
1350 int autoecc;
1351
1352 switch (ops->mode) {
1353 case MTD_OPS_PLACE_OOB:
1354 case MTD_OPS_AUTO_OOB:
1355 autoecc = 1;
1356 break;
1357 case MTD_OPS_RAW:
1358 autoecc = 0;
1359 break;
1360 default:
1361 autoecc = -EINVAL;
1362 }
1363 return autoecc;
1364}
1365
1366
1367
1368
1369
1370
1371
1372static void doc_fill_autooob(u8 *dst, u8 *oobsrc)
1373{
1374 memcpy(dst, oobsrc, DOC_LAYOUT_OOB_PAGEINFO_SZ);
1375 dst[DOC_LAYOUT_OOB_UNUSED_OFS] = oobsrc[DOC_LAYOUT_OOB_PAGEINFO_SZ];
1376}
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395static int doc_backup_oob(struct docg3 *docg3, loff_t to,
1396 struct mtd_oob_ops *ops)
1397{
1398 int ooblen = ops->ooblen, autoecc;
1399
1400 if (ooblen != DOC_LAYOUT_OOB_SIZE)
1401 return -EINVAL;
1402 autoecc = doc_guess_autoecc(ops);
1403 if (autoecc < 0)
1404 return autoecc;
1405
1406 docg3->oob_write_ofs = to;
1407 docg3->oob_autoecc = autoecc;
1408 if (ops->mode == MTD_OPS_AUTO_OOB) {
1409 doc_fill_autooob(docg3->oob_write_buf, ops->oobbuf);
1410 ops->oobretlen = 8;
1411 } else {
1412 memcpy(docg3->oob_write_buf, ops->oobbuf, DOC_LAYOUT_OOB_SIZE);
1413 ops->oobretlen = DOC_LAYOUT_OOB_SIZE;
1414 }
1415 return 0;
1416}
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433static int doc_write_oob(struct mtd_info *mtd, loff_t ofs,
1434 struct mtd_oob_ops *ops)
1435{
1436 struct docg3 *docg3 = mtd->priv;
1437 int ret, autoecc, oobdelta;
1438 u8 *oobbuf = ops->oobbuf;
1439 u8 *buf = ops->datbuf;
1440 size_t len, ooblen;
1441 u8 oob[DOC_LAYOUT_OOB_SIZE];
1442
1443 if (buf)
1444 len = ops->len;
1445 else
1446 len = 0;
1447 if (oobbuf)
1448 ooblen = ops->ooblen;
1449 else
1450 ooblen = 0;
1451
1452 if (oobbuf && ops->mode == MTD_OPS_PLACE_OOB)
1453 oobbuf += ops->ooboffs;
1454
1455 doc_dbg("doc_write_oob(from=%lld, mode=%d, data=(%p:%zu), oob=(%p:%zu))\n",
1456 ofs, ops->mode, buf, len, oobbuf, ooblen);
1457 switch (ops->mode) {
1458 case MTD_OPS_PLACE_OOB:
1459 case MTD_OPS_RAW:
1460 oobdelta = mtd->oobsize;
1461 break;
1462 case MTD_OPS_AUTO_OOB:
1463 oobdelta = mtd->oobavail;
1464 break;
1465 default:
1466 return -EINVAL;
1467 }
1468 if ((len % DOC_LAYOUT_PAGE_SIZE) || (ooblen % oobdelta) ||
1469 (ofs % DOC_LAYOUT_PAGE_SIZE))
1470 return -EINVAL;
1471 if (len && ooblen &&
1472 (len / DOC_LAYOUT_PAGE_SIZE) != (ooblen / oobdelta))
1473 return -EINVAL;
1474 if (ofs + len > mtd->size)
1475 return -EINVAL;
1476
1477 ops->oobretlen = 0;
1478 ops->retlen = 0;
1479 ret = 0;
1480 if (len == 0 && ooblen == 0)
1481 return -EINVAL;
1482 if (len == 0 && ooblen > 0)
1483 return doc_backup_oob(docg3, ofs, ops);
1484
1485 autoecc = doc_guess_autoecc(ops);
1486 if (autoecc < 0)
1487 return autoecc;
1488
1489 mutex_lock(&docg3->cascade->lock);
1490 while (!ret && len > 0) {
1491 memset(oob, 0, sizeof(oob));
1492 if (ofs == docg3->oob_write_ofs)
1493 memcpy(oob, docg3->oob_write_buf, DOC_LAYOUT_OOB_SIZE);
1494 else if (ooblen > 0 && ops->mode == MTD_OPS_AUTO_OOB)
1495 doc_fill_autooob(oob, oobbuf);
1496 else if (ooblen > 0)
1497 memcpy(oob, oobbuf, DOC_LAYOUT_OOB_SIZE);
1498 ret = doc_write_page(docg3, ofs, buf, oob, autoecc);
1499
1500 ofs += DOC_LAYOUT_PAGE_SIZE;
1501 len -= DOC_LAYOUT_PAGE_SIZE;
1502 buf += DOC_LAYOUT_PAGE_SIZE;
1503 if (ooblen) {
1504 oobbuf += oobdelta;
1505 ooblen -= oobdelta;
1506 ops->oobretlen += oobdelta;
1507 }
1508 ops->retlen += DOC_LAYOUT_PAGE_SIZE;
1509 }
1510
1511 doc_set_device_id(docg3, 0);
1512 mutex_unlock(&docg3->cascade->lock);
1513 return ret;
1514}
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529static int doc_write(struct mtd_info *mtd, loff_t to, size_t len,
1530 size_t *retlen, const u_char *buf)
1531{
1532 struct docg3 *docg3 = mtd->priv;
1533 int ret;
1534 struct mtd_oob_ops ops;
1535
1536 doc_dbg("doc_write(to=%lld, len=%zu)\n", to, len);
1537 ops.datbuf = (char *)buf;
1538 ops.len = len;
1539 ops.mode = MTD_OPS_PLACE_OOB;
1540 ops.oobbuf = NULL;
1541 ops.ooblen = 0;
1542 ops.ooboffs = 0;
1543
1544 ret = doc_write_oob(mtd, to, &ops);
1545 *retlen = ops.retlen;
1546 return ret;
1547}
1548
1549static struct docg3 *sysfs_dev2docg3(struct device *dev,
1550 struct device_attribute *attr)
1551{
1552 int floor;
1553 struct platform_device *pdev = to_platform_device(dev);
1554 struct mtd_info **docg3_floors = platform_get_drvdata(pdev);
1555
1556 floor = attr->attr.name[1] - '0';
1557 if (floor < 0 || floor >= DOC_MAX_NBFLOORS)
1558 return NULL;
1559 else
1560 return docg3_floors[floor]->priv;
1561}
1562
1563static ssize_t dps0_is_key_locked(struct device *dev,
1564 struct device_attribute *attr, char *buf)
1565{
1566 struct docg3 *docg3 = sysfs_dev2docg3(dev, attr);
1567 int dps0;
1568
1569 mutex_lock(&docg3->cascade->lock);
1570 doc_set_device_id(docg3, docg3->device_id);
1571 dps0 = doc_register_readb(docg3, DOC_DPS0_STATUS);
1572 doc_set_device_id(docg3, 0);
1573 mutex_unlock(&docg3->cascade->lock);
1574
1575 return sprintf(buf, "%d\n", !(dps0 & DOC_DPS_KEY_OK));
1576}
1577
1578static ssize_t dps1_is_key_locked(struct device *dev,
1579 struct device_attribute *attr, char *buf)
1580{
1581 struct docg3 *docg3 = sysfs_dev2docg3(dev, attr);
1582 int dps1;
1583
1584 mutex_lock(&docg3->cascade->lock);
1585 doc_set_device_id(docg3, docg3->device_id);
1586 dps1 = doc_register_readb(docg3, DOC_DPS1_STATUS);
1587 doc_set_device_id(docg3, 0);
1588 mutex_unlock(&docg3->cascade->lock);
1589
1590 return sprintf(buf, "%d\n", !(dps1 & DOC_DPS_KEY_OK));
1591}
1592
1593static ssize_t dps0_insert_key(struct device *dev,
1594 struct device_attribute *attr,
1595 const char *buf, size_t count)
1596{
1597 struct docg3 *docg3 = sysfs_dev2docg3(dev, attr);
1598 int i;
1599
1600 if (count != DOC_LAYOUT_DPS_KEY_LENGTH)
1601 return -EINVAL;
1602
1603 mutex_lock(&docg3->cascade->lock);
1604 doc_set_device_id(docg3, docg3->device_id);
1605 for (i = 0; i < DOC_LAYOUT_DPS_KEY_LENGTH; i++)
1606 doc_writeb(docg3, buf[i], DOC_DPS0_KEY);
1607 doc_set_device_id(docg3, 0);
1608 mutex_unlock(&docg3->cascade->lock);
1609 return count;
1610}
1611
1612static ssize_t dps1_insert_key(struct device *dev,
1613 struct device_attribute *attr,
1614 const char *buf, size_t count)
1615{
1616 struct docg3 *docg3 = sysfs_dev2docg3(dev, attr);
1617 int i;
1618
1619 if (count != DOC_LAYOUT_DPS_KEY_LENGTH)
1620 return -EINVAL;
1621
1622 mutex_lock(&docg3->cascade->lock);
1623 doc_set_device_id(docg3, docg3->device_id);
1624 for (i = 0; i < DOC_LAYOUT_DPS_KEY_LENGTH; i++)
1625 doc_writeb(docg3, buf[i], DOC_DPS1_KEY);
1626 doc_set_device_id(docg3, 0);
1627 mutex_unlock(&docg3->cascade->lock);
1628 return count;
1629}
1630
1631#define FLOOR_SYSFS(id) { \
1632 __ATTR(f##id##_dps0_is_keylocked, S_IRUGO, dps0_is_key_locked, NULL), \
1633 __ATTR(f##id##_dps1_is_keylocked, S_IRUGO, dps1_is_key_locked, NULL), \
1634 __ATTR(f##id##_dps0_protection_key, S_IWUSR|S_IWGRP, NULL, dps0_insert_key), \
1635 __ATTR(f##id##_dps1_protection_key, S_IWUSR|S_IWGRP, NULL, dps1_insert_key), \
1636}
1637
1638static struct device_attribute doc_sys_attrs[DOC_MAX_NBFLOORS][4] = {
1639 FLOOR_SYSFS(0), FLOOR_SYSFS(1), FLOOR_SYSFS(2), FLOOR_SYSFS(3)
1640};
1641
1642static int doc_register_sysfs(struct platform_device *pdev,
1643 struct docg3_cascade *cascade)
1644{
1645 struct device *dev = &pdev->dev;
1646 int floor;
1647 int ret;
1648 int i;
1649
1650 for (floor = 0;
1651 floor < DOC_MAX_NBFLOORS && cascade->floors[floor];
1652 floor++) {
1653 for (i = 0; i < 4; i++) {
1654 ret = device_create_file(dev, &doc_sys_attrs[floor][i]);
1655 if (ret)
1656 goto remove_files;
1657 }
1658 }
1659
1660 return 0;
1661
1662remove_files:
1663 do {
1664 while (--i >= 0)
1665 device_remove_file(dev, &doc_sys_attrs[floor][i]);
1666 i = 4;
1667 } while (--floor >= 0);
1668
1669 return ret;
1670}
1671
1672static void doc_unregister_sysfs(struct platform_device *pdev,
1673 struct docg3_cascade *cascade)
1674{
1675 struct device *dev = &pdev->dev;
1676 int floor, i;
1677
1678 for (floor = 0; floor < DOC_MAX_NBFLOORS && cascade->floors[floor];
1679 floor++)
1680 for (i = 0; i < 4; i++)
1681 device_remove_file(dev, &doc_sys_attrs[floor][i]);
1682}
1683
1684
1685
1686
1687static int dbg_flashctrl_show(struct seq_file *s, void *p)
1688{
1689 struct docg3 *docg3 = (struct docg3 *)s->private;
1690
1691 u8 fctrl;
1692
1693 mutex_lock(&docg3->cascade->lock);
1694 fctrl = doc_register_readb(docg3, DOC_FLASHCONTROL);
1695 mutex_unlock(&docg3->cascade->lock);
1696
1697 seq_printf(s, "FlashControl : 0x%02x (%s,CE# %s,%s,%s,flash %s)\n",
1698 fctrl,
1699 fctrl & DOC_CTRL_VIOLATION ? "protocol violation" : "-",
1700 fctrl & DOC_CTRL_CE ? "active" : "inactive",
1701 fctrl & DOC_CTRL_PROTECTION_ERROR ? "protection error" : "-",
1702 fctrl & DOC_CTRL_SEQUENCE_ERROR ? "sequence error" : "-",
1703 fctrl & DOC_CTRL_FLASHREADY ? "ready" : "not ready");
1704
1705 return 0;
1706}
1707DEBUGFS_RO_ATTR(flashcontrol, dbg_flashctrl_show);
1708
1709static int dbg_asicmode_show(struct seq_file *s, void *p)
1710{
1711 struct docg3 *docg3 = (struct docg3 *)s->private;
1712
1713 int pctrl, mode;
1714
1715 mutex_lock(&docg3->cascade->lock);
1716 pctrl = doc_register_readb(docg3, DOC_ASICMODE);
1717 mode = pctrl & 0x03;
1718 mutex_unlock(&docg3->cascade->lock);
1719
1720 seq_printf(s,
1721 "%04x : RAM_WE=%d,RSTIN_RESET=%d,BDETCT_RESET=%d,WRITE_ENABLE=%d,POWERDOWN=%d,MODE=%d%d (",
1722 pctrl,
1723 pctrl & DOC_ASICMODE_RAM_WE ? 1 : 0,
1724 pctrl & DOC_ASICMODE_RSTIN_RESET ? 1 : 0,
1725 pctrl & DOC_ASICMODE_BDETCT_RESET ? 1 : 0,
1726 pctrl & DOC_ASICMODE_MDWREN ? 1 : 0,
1727 pctrl & DOC_ASICMODE_POWERDOWN ? 1 : 0,
1728 mode >> 1, mode & 0x1);
1729
1730 switch (mode) {
1731 case DOC_ASICMODE_RESET:
1732 seq_puts(s, "reset");
1733 break;
1734 case DOC_ASICMODE_NORMAL:
1735 seq_puts(s, "normal");
1736 break;
1737 case DOC_ASICMODE_POWERDOWN:
1738 seq_puts(s, "powerdown");
1739 break;
1740 }
1741 seq_puts(s, ")\n");
1742 return 0;
1743}
1744DEBUGFS_RO_ATTR(asic_mode, dbg_asicmode_show);
1745
1746static int dbg_device_id_show(struct seq_file *s, void *p)
1747{
1748 struct docg3 *docg3 = (struct docg3 *)s->private;
1749 int id;
1750
1751 mutex_lock(&docg3->cascade->lock);
1752 id = doc_register_readb(docg3, DOC_DEVICESELECT);
1753 mutex_unlock(&docg3->cascade->lock);
1754
1755 seq_printf(s, "DeviceId = %d\n", id);
1756 return 0;
1757}
1758DEBUGFS_RO_ATTR(device_id, dbg_device_id_show);
1759
1760static int dbg_protection_show(struct seq_file *s, void *p)
1761{
1762 struct docg3 *docg3 = (struct docg3 *)s->private;
1763 int protect, dps0, dps0_low, dps0_high, dps1, dps1_low, dps1_high;
1764
1765 mutex_lock(&docg3->cascade->lock);
1766 protect = doc_register_readb(docg3, DOC_PROTECTION);
1767 dps0 = doc_register_readb(docg3, DOC_DPS0_STATUS);
1768 dps0_low = doc_register_readw(docg3, DOC_DPS0_ADDRLOW);
1769 dps0_high = doc_register_readw(docg3, DOC_DPS0_ADDRHIGH);
1770 dps1 = doc_register_readb(docg3, DOC_DPS1_STATUS);
1771 dps1_low = doc_register_readw(docg3, DOC_DPS1_ADDRLOW);
1772 dps1_high = doc_register_readw(docg3, DOC_DPS1_ADDRHIGH);
1773 mutex_unlock(&docg3->cascade->lock);
1774
1775 seq_printf(s, "Protection = 0x%02x (", protect);
1776 if (protect & DOC_PROTECT_FOUNDRY_OTP_LOCK)
1777 seq_puts(s, "FOUNDRY_OTP_LOCK,");
1778 if (protect & DOC_PROTECT_CUSTOMER_OTP_LOCK)
1779 seq_puts(s, "CUSTOMER_OTP_LOCK,");
1780 if (protect & DOC_PROTECT_LOCK_INPUT)
1781 seq_puts(s, "LOCK_INPUT,");
1782 if (protect & DOC_PROTECT_STICKY_LOCK)
1783 seq_puts(s, "STICKY_LOCK,");
1784 if (protect & DOC_PROTECT_PROTECTION_ENABLED)
1785 seq_puts(s, "PROTECTION ON,");
1786 if (protect & DOC_PROTECT_IPL_DOWNLOAD_LOCK)
1787 seq_puts(s, "IPL_DOWNLOAD_LOCK,");
1788 if (protect & DOC_PROTECT_PROTECTION_ERROR)
1789 seq_puts(s, "PROTECT_ERR,");
1790 else
1791 seq_puts(s, "NO_PROTECT_ERR");
1792 seq_puts(s, ")\n");
1793
1794 seq_printf(s, "DPS0 = 0x%02x : Protected area [0x%x - 0x%x] : OTP=%d, READ=%d, WRITE=%d, HW_LOCK=%d, KEY_OK=%d\n",
1795 dps0, dps0_low, dps0_high,
1796 !!(dps0 & DOC_DPS_OTP_PROTECTED),
1797 !!(dps0 & DOC_DPS_READ_PROTECTED),
1798 !!(dps0 & DOC_DPS_WRITE_PROTECTED),
1799 !!(dps0 & DOC_DPS_HW_LOCK_ENABLED),
1800 !!(dps0 & DOC_DPS_KEY_OK));
1801 seq_printf(s, "DPS1 = 0x%02x : Protected area [0x%x - 0x%x] : OTP=%d, READ=%d, WRITE=%d, HW_LOCK=%d, KEY_OK=%d\n",
1802 dps1, dps1_low, dps1_high,
1803 !!(dps1 & DOC_DPS_OTP_PROTECTED),
1804 !!(dps1 & DOC_DPS_READ_PROTECTED),
1805 !!(dps1 & DOC_DPS_WRITE_PROTECTED),
1806 !!(dps1 & DOC_DPS_HW_LOCK_ENABLED),
1807 !!(dps1 & DOC_DPS_KEY_OK));
1808 return 0;
1809}
1810DEBUGFS_RO_ATTR(protection, dbg_protection_show);
1811
1812static void __init doc_dbg_register(struct mtd_info *floor)
1813{
1814 struct dentry *root = floor->dbg.dfs_dir;
1815 struct docg3 *docg3 = floor->priv;
1816
1817 if (IS_ERR_OR_NULL(root))
1818 return;
1819
1820 debugfs_create_file("docg3_flashcontrol", S_IRUSR, root, docg3,
1821 &flashcontrol_fops);
1822 debugfs_create_file("docg3_asic_mode", S_IRUSR, root, docg3,
1823 &asic_mode_fops);
1824 debugfs_create_file("docg3_device_id", S_IRUSR, root, docg3,
1825 &device_id_fops);
1826 debugfs_create_file("docg3_protection", S_IRUSR, root, docg3,
1827 &protection_fops);
1828}
1829
1830
1831
1832
1833
1834
1835static int __init doc_set_driver_info(int chip_id, struct mtd_info *mtd)
1836{
1837 struct docg3 *docg3 = mtd->priv;
1838 int cfg;
1839
1840 cfg = doc_register_readb(docg3, DOC_CONFIGURATION);
1841 docg3->if_cfg = (cfg & DOC_CONF_IF_CFG ? 1 : 0);
1842 docg3->reliable = reliable_mode;
1843
1844 switch (chip_id) {
1845 case DOC_CHIPID_G3:
1846 mtd->name = kasprintf(GFP_KERNEL, "docg3.%d",
1847 docg3->device_id);
1848 if (!mtd->name)
1849 return -ENOMEM;
1850 docg3->max_block = 2047;
1851 break;
1852 }
1853 mtd->type = MTD_NANDFLASH;
1854 mtd->flags = MTD_CAP_NANDFLASH;
1855 mtd->size = (docg3->max_block + 1) * DOC_LAYOUT_BLOCK_SIZE;
1856 if (docg3->reliable == 2)
1857 mtd->size /= 2;
1858 mtd->erasesize = DOC_LAYOUT_BLOCK_SIZE * DOC_LAYOUT_NBPLANES;
1859 if (docg3->reliable == 2)
1860 mtd->erasesize /= 2;
1861 mtd->writebufsize = mtd->writesize = DOC_LAYOUT_PAGE_SIZE;
1862 mtd->oobsize = DOC_LAYOUT_OOB_SIZE;
1863 mtd->_erase = doc_erase;
1864 mtd->_read = doc_read;
1865 mtd->_write = doc_write;
1866 mtd->_read_oob = doc_read_oob;
1867 mtd->_write_oob = doc_write_oob;
1868 mtd->_block_isbad = doc_block_isbad;
1869 mtd_set_ooblayout(mtd, &nand_ooblayout_docg3_ops);
1870 mtd->oobavail = 8;
1871 mtd->ecc_strength = DOC_ECC_BCH_T;
1872
1873 return 0;
1874}
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889static struct mtd_info * __init
1890doc_probe_device(struct docg3_cascade *cascade, int floor, struct device *dev)
1891{
1892 int ret, bbt_nbpages;
1893 u16 chip_id, chip_id_inv;
1894 struct docg3 *docg3;
1895 struct mtd_info *mtd;
1896
1897 ret = -ENOMEM;
1898 docg3 = kzalloc(sizeof(struct docg3), GFP_KERNEL);
1899 if (!docg3)
1900 goto nomem1;
1901 mtd = kzalloc(sizeof(struct mtd_info), GFP_KERNEL);
1902 if (!mtd)
1903 goto nomem2;
1904 mtd->priv = docg3;
1905 mtd->dev.parent = dev;
1906 bbt_nbpages = DIV_ROUND_UP(docg3->max_block + 1,
1907 8 * DOC_LAYOUT_PAGE_SIZE);
1908 docg3->bbt = kzalloc(bbt_nbpages * DOC_LAYOUT_PAGE_SIZE, GFP_KERNEL);
1909 if (!docg3->bbt)
1910 goto nomem3;
1911
1912 docg3->dev = dev;
1913 docg3->device_id = floor;
1914 docg3->cascade = cascade;
1915 doc_set_device_id(docg3, docg3->device_id);
1916 if (!floor)
1917 doc_set_asic_mode(docg3, DOC_ASICMODE_RESET);
1918 doc_set_asic_mode(docg3, DOC_ASICMODE_NORMAL);
1919
1920 chip_id = doc_register_readw(docg3, DOC_CHIPID);
1921 chip_id_inv = doc_register_readw(docg3, DOC_CHIPID_INV);
1922
1923 ret = 0;
1924 if (chip_id != (u16)(~chip_id_inv)) {
1925 goto nomem4;
1926 }
1927
1928 switch (chip_id) {
1929 case DOC_CHIPID_G3:
1930 doc_info("Found a G3 DiskOnChip at addr %p, floor %d\n",
1931 docg3->cascade->base, floor);
1932 break;
1933 default:
1934 doc_err("Chip id %04x is not a DiskOnChip G3 chip\n", chip_id);
1935 goto nomem4;
1936 }
1937
1938 ret = doc_set_driver_info(chip_id, mtd);
1939 if (ret)
1940 goto nomem4;
1941
1942 doc_hamming_ecc_init(docg3, DOC_LAYOUT_OOB_PAGEINFO_SZ);
1943 doc_reload_bbt(docg3);
1944 return mtd;
1945
1946nomem4:
1947 kfree(docg3->bbt);
1948nomem3:
1949 kfree(mtd);
1950nomem2:
1951 kfree(docg3);
1952nomem1:
1953 return ERR_PTR(ret);
1954}
1955
1956
1957
1958
1959
1960static void doc_release_device(struct mtd_info *mtd)
1961{
1962 struct docg3 *docg3 = mtd->priv;
1963
1964 mtd_device_unregister(mtd);
1965 kfree(docg3->bbt);
1966 kfree(docg3);
1967 kfree(mtd->name);
1968 kfree(mtd);
1969}
1970
1971
1972
1973
1974
1975
1976
1977static int docg3_resume(struct platform_device *pdev)
1978{
1979 int i;
1980 struct docg3_cascade *cascade;
1981 struct mtd_info **docg3_floors, *mtd;
1982 struct docg3 *docg3;
1983
1984 cascade = platform_get_drvdata(pdev);
1985 docg3_floors = cascade->floors;
1986 mtd = docg3_floors[0];
1987 docg3 = mtd->priv;
1988
1989 doc_dbg("docg3_resume()\n");
1990 for (i = 0; i < 12; i++)
1991 doc_readb(docg3, DOC_IOSPACE_IPL);
1992 return 0;
1993}
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004static int docg3_suspend(struct platform_device *pdev, pm_message_t state)
2005{
2006 int floor, i;
2007 struct docg3_cascade *cascade;
2008 struct mtd_info **docg3_floors, *mtd;
2009 struct docg3 *docg3;
2010 u8 ctrl, pwr_down;
2011
2012 cascade = platform_get_drvdata(pdev);
2013 docg3_floors = cascade->floors;
2014 for (floor = 0; floor < DOC_MAX_NBFLOORS; floor++) {
2015 mtd = docg3_floors[floor];
2016 if (!mtd)
2017 continue;
2018 docg3 = mtd->priv;
2019
2020 doc_writeb(docg3, floor, DOC_DEVICESELECT);
2021 ctrl = doc_register_readb(docg3, DOC_FLASHCONTROL);
2022 ctrl &= ~DOC_CTRL_VIOLATION & ~DOC_CTRL_CE;
2023 doc_writeb(docg3, ctrl, DOC_FLASHCONTROL);
2024
2025 for (i = 0; i < 10; i++) {
2026 usleep_range(3000, 4000);
2027 pwr_down = doc_register_readb(docg3, DOC_POWERMODE);
2028 if (pwr_down & DOC_POWERDOWN_READY)
2029 break;
2030 }
2031 if (pwr_down & DOC_POWERDOWN_READY) {
2032 doc_dbg("docg3_suspend(): floor %d powerdown ok\n",
2033 floor);
2034 } else {
2035 doc_err("docg3_suspend(): floor %d powerdown failed\n",
2036 floor);
2037 return -EIO;
2038 }
2039 }
2040
2041 mtd = docg3_floors[0];
2042 docg3 = mtd->priv;
2043 doc_set_asic_mode(docg3, DOC_ASICMODE_POWERDOWN);
2044 return 0;
2045}
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056static int __init docg3_probe(struct platform_device *pdev)
2057{
2058 struct device *dev = &pdev->dev;
2059 struct mtd_info *mtd;
2060 struct resource *ress;
2061 void __iomem *base;
2062 int ret, floor;
2063 struct docg3_cascade *cascade;
2064
2065 ret = -ENXIO;
2066 ress = platform_get_resource(pdev, IORESOURCE_MEM, 0);
2067 if (!ress) {
2068 dev_err(dev, "No I/O memory resource defined\n");
2069 return ret;
2070 }
2071 base = devm_ioremap(dev, ress->start, DOC_IOSPACE_SIZE);
2072
2073 ret = -ENOMEM;
2074 cascade = devm_kzalloc(dev, sizeof(*cascade) * DOC_MAX_NBFLOORS,
2075 GFP_KERNEL);
2076 if (!cascade)
2077 return ret;
2078 cascade->base = base;
2079 mutex_init(&cascade->lock);
2080 cascade->bch = init_bch(DOC_ECC_BCH_M, DOC_ECC_BCH_T,
2081 DOC_ECC_BCH_PRIMPOLY);
2082 if (!cascade->bch)
2083 return ret;
2084
2085 for (floor = 0; floor < DOC_MAX_NBFLOORS; floor++) {
2086 mtd = doc_probe_device(cascade, floor, dev);
2087 if (IS_ERR(mtd)) {
2088 ret = PTR_ERR(mtd);
2089 goto err_probe;
2090 }
2091 if (!mtd) {
2092 if (floor == 0)
2093 goto notfound;
2094 else
2095 continue;
2096 }
2097 cascade->floors[floor] = mtd;
2098 ret = mtd_device_parse_register(mtd, part_probes, NULL, NULL,
2099 0);
2100 if (ret)
2101 goto err_probe;
2102
2103 doc_dbg_register(cascade->floors[floor]);
2104 }
2105
2106 ret = doc_register_sysfs(pdev, cascade);
2107 if (ret)
2108 goto err_probe;
2109
2110 platform_set_drvdata(pdev, cascade);
2111 return 0;
2112
2113notfound:
2114 ret = -ENODEV;
2115 dev_info(dev, "No supported DiskOnChip found\n");
2116err_probe:
2117 free_bch(cascade->bch);
2118 for (floor = 0; floor < DOC_MAX_NBFLOORS; floor++)
2119 if (cascade->floors[floor])
2120 doc_release_device(cascade->floors[floor]);
2121 return ret;
2122}
2123
2124
2125
2126
2127
2128
2129
2130static int docg3_release(struct platform_device *pdev)
2131{
2132 struct docg3_cascade *cascade = platform_get_drvdata(pdev);
2133 struct docg3 *docg3 = cascade->floors[0]->priv;
2134 int floor;
2135
2136 doc_unregister_sysfs(pdev, cascade);
2137 for (floor = 0; floor < DOC_MAX_NBFLOORS; floor++)
2138 if (cascade->floors[floor])
2139 doc_release_device(cascade->floors[floor]);
2140
2141 free_bch(docg3->cascade->bch);
2142 return 0;
2143}
2144
2145#ifdef CONFIG_OF
2146static const struct of_device_id docg3_dt_ids[] = {
2147 { .compatible = "m-systems,diskonchip-g3" },
2148 {}
2149};
2150MODULE_DEVICE_TABLE(of, docg3_dt_ids);
2151#endif
2152
2153static struct platform_driver g3_driver = {
2154 .driver = {
2155 .name = "docg3",
2156 .of_match_table = of_match_ptr(docg3_dt_ids),
2157 },
2158 .suspend = docg3_suspend,
2159 .resume = docg3_resume,
2160 .remove = docg3_release,
2161};
2162
2163module_platform_driver_probe(g3_driver, docg3_probe);
2164
2165MODULE_LICENSE("GPL");
2166MODULE_AUTHOR("Robert Jarzmik <robert.jarzmik@free.fr>");
2167MODULE_DESCRIPTION("MTD driver for DiskOnChip G3");
2168