2 * drivers/mtd/nand/diskonchip.c
4 * (C) 2003 Red Hat, Inc.
5 * (C) 2004 Dan Brown <dan_brown@ieee.org>
6 * (C) 2004 Kalev Lember <kalev@smartlink.ee>
8 * Author: David Woodhouse <dwmw2@infradead.org>
9 * Additional Diskonchip 2000 and Millennium support by Dan Brown <dan_brown@ieee.org>
10 * Diskonchip Millennium Plus support by Kalev Lember <kalev@smartlink.ee>
12 * Error correction code lifted from the old docecc code
13 * Author: Fabrice Bellard (fabrice.bellard@netgem.com)
14 * Copyright (C) 2000 Netgem S.A.
15 * converted to the generic Reed-Solomon library by Thomas Gleixner <tglx@linutronix.de>
17 * Interface to generic NAND code for M-Systems DiskOnChip devices
20 #include <linux/kernel.h>
21 #include <linux/init.h>
22 #include <linux/sched.h>
23 #include <linux/delay.h>
24 #include <linux/rslib.h>
25 #include <linux/moduleparam.h>
26 #include <linux/slab.h>
29 #include <linux/mtd/mtd.h>
30 #include <linux/mtd/nand.h>
31 #include <linux/mtd/doc2000.h>
32 #include <linux/mtd/partitions.h>
33 #include <linux/mtd/inftl.h>
34 #include <linux/module.h>
36 /* Where to look for the devices? */
37 #ifndef CONFIG_MTD_NAND_DISKONCHIP_PROBE_ADDRESS
38 #define CONFIG_MTD_NAND_DISKONCHIP_PROBE_ADDRESS 0
41 static unsigned long doc_locations
[] __initdata
= {
42 #if defined (__alpha__) || defined(__i386__) || defined(__x86_64__)
43 #ifdef CONFIG_MTD_NAND_DISKONCHIP_PROBE_HIGH
44 0xfffc8000, 0xfffca000, 0xfffcc000, 0xfffce000,
45 0xfffd0000, 0xfffd2000, 0xfffd4000, 0xfffd6000,
46 0xfffd8000, 0xfffda000, 0xfffdc000, 0xfffde000,
47 0xfffe0000, 0xfffe2000, 0xfffe4000, 0xfffe6000,
48 0xfffe8000, 0xfffea000, 0xfffec000, 0xfffee000,
50 0xc8000, 0xca000, 0xcc000, 0xce000,
51 0xd0000, 0xd2000, 0xd4000, 0xd6000,
52 0xd8000, 0xda000, 0xdc000, 0xde000,
53 0xe0000, 0xe2000, 0xe4000, 0xe6000,
54 0xe8000, 0xea000, 0xec000, 0xee000,
59 static struct mtd_info
*doclist
= NULL
;
62 void __iomem
*virtadr
;
63 unsigned long physadr
;
66 int chips_per_floor
; /* The number of chips detected on each floor */
71 struct mtd_info
*nextdoc
;
74 /* This is the syndrome computed by the HW ecc generator upon reading an empty
75 page, one with all 0xff for data and stored ecc code. */
76 static u_char empty_read_syndrome
[6] = { 0x26, 0xff, 0x6d, 0x47, 0x73, 0x7a };
78 /* This is the ecc value computed by the HW ecc generator upon writing an empty
79 page, one with all 0xff for data. */
80 static u_char empty_write_ecc
[6] = { 0x4b, 0x00, 0xe2, 0x0e, 0x93, 0xf7 };
82 #define INFTL_BBT_RESERVED_BLOCKS 4
84 #define DoC_is_MillenniumPlus(doc) ((doc)->ChipID == DOC_ChipID_DocMilPlus16 || (doc)->ChipID == DOC_ChipID_DocMilPlus32)
85 #define DoC_is_Millennium(doc) ((doc)->ChipID == DOC_ChipID_DocMil)
86 #define DoC_is_2000(doc) ((doc)->ChipID == DOC_ChipID_Doc2k)
88 static void doc200x_hwcontrol(struct mtd_info
*mtd
, int cmd
,
89 unsigned int bitmask
);
90 static void doc200x_select_chip(struct mtd_info
*mtd
, int chip
);
93 module_param(debug
, int, 0);
95 static int try_dword
= 1;
96 module_param(try_dword
, int, 0);
98 static int no_ecc_failures
= 0;
99 module_param(no_ecc_failures
, int, 0);
101 static int no_autopart
= 0;
102 module_param(no_autopart
, int, 0);
104 static int show_firmware_partition
= 0;
105 module_param(show_firmware_partition
, int, 0);
107 #ifdef CONFIG_MTD_NAND_DISKONCHIP_BBTWRITE
108 static int inftl_bbt_write
= 1;
110 static int inftl_bbt_write
= 0;
112 module_param(inftl_bbt_write
, int, 0);
114 static unsigned long doc_config_location
= CONFIG_MTD_NAND_DISKONCHIP_PROBE_ADDRESS
;
115 module_param(doc_config_location
, ulong
, 0);
116 MODULE_PARM_DESC(doc_config_location
, "Physical memory address at which to probe for DiskOnChip");
118 /* Sector size for HW ECC */
119 #define SECTOR_SIZE 512
120 /* The sector bytes are packed into NB_DATA 10 bit words */
121 #define NB_DATA (((SECTOR_SIZE + 1) * 8 + 6) / 10)
122 /* Number of roots */
124 /* First consective root */
126 /* Number of symbols */
129 /* the Reed Solomon control structure */
130 static struct rs_control
*rs_decoder
;
133 * The HW decoder in the DoC ASIC's provides us a error syndrome,
134 * which we must convert to a standard syndrome usable by the generic
135 * Reed-Solomon library code.
137 * Fabrice Bellard figured this out in the old docecc code. I added
138 * some comments, improved a minor bit and converted it to make use
139 * of the generic Reed-Solomon library. tglx
141 static int doc_ecc_decode(struct rs_control
*rs
, uint8_t *data
, uint8_t *ecc
)
143 int i
, j
, nerr
, errpos
[8];
145 uint16_t ds
[4], s
[5], tmp
, errval
[8], syn
[4];
147 memset(syn
, 0, sizeof(syn
));
148 /* Convert the ecc bytes into words */
149 ds
[0] = ((ecc
[4] & 0xff) >> 0) | ((ecc
[5] & 0x03) << 8);
150 ds
[1] = ((ecc
[5] & 0xfc) >> 2) | ((ecc
[2] & 0x0f) << 6);
151 ds
[2] = ((ecc
[2] & 0xf0) >> 4) | ((ecc
[3] & 0x3f) << 4);
152 ds
[3] = ((ecc
[3] & 0xc0) >> 6) | ((ecc
[0] & 0xff) << 2);
155 /* Initialize the syndrome buffer */
156 for (i
= 0; i
< NROOTS
; i
++)
160 * s[i] = ds[3]x^3 + ds[2]x^2 + ds[1]x^1 + ds[0]
161 * where x = alpha^(FCR + i)
163 for (j
= 1; j
< NROOTS
; j
++) {
166 tmp
= rs
->index_of
[ds
[j
]];
167 for (i
= 0; i
< NROOTS
; i
++)
168 s
[i
] ^= rs
->alpha_to
[rs_modnn(rs
, tmp
+ (FCR
+ i
) * j
)];
171 /* Calc syn[i] = s[i] / alpha^(v + i) */
172 for (i
= 0; i
< NROOTS
; i
++) {
174 syn
[i
] = rs_modnn(rs
, rs
->index_of
[s
[i
]] + (NN
- FCR
- i
));
176 /* Call the decoder library */
177 nerr
= decode_rs16(rs
, NULL
, NULL
, 1019, syn
, 0, errpos
, 0, errval
);
179 /* Incorrectable errors ? */
184 * Correct the errors. The bitpositions are a bit of magic,
185 * but they are given by the design of the de/encoder circuit
188 for (i
= 0; i
< nerr
; i
++) {
189 int index
, bitpos
, pos
= 1015 - errpos
[i
];
191 if (pos
>= NB_DATA
&& pos
< 1019)
194 /* extract bit position (MSB first) */
195 pos
= 10 * (NB_DATA
- 1 - pos
) - 6;
196 /* now correct the following 10 bits. At most two bytes
197 can be modified since pos is even */
198 index
= (pos
>> 3) ^ 1;
200 if ((index
>= 0 && index
< SECTOR_SIZE
) || index
== (SECTOR_SIZE
+ 1)) {
201 val
= (uint8_t) (errval
[i
] >> (2 + bitpos
));
203 if (index
< SECTOR_SIZE
)
206 index
= ((pos
>> 3) + 1) ^ 1;
207 bitpos
= (bitpos
+ 10) & 7;
210 if ((index
>= 0 && index
< SECTOR_SIZE
) || index
== (SECTOR_SIZE
+ 1)) {
211 val
= (uint8_t) (errval
[i
] << (8 - bitpos
));
213 if (index
< SECTOR_SIZE
)
218 /* If the parity is wrong, no rescue possible */
219 return parity
? -EBADMSG
: nerr
;
222 static void DoC_Delay(struct doc_priv
*doc
, unsigned short cycles
)
227 for (i
= 0; i
< cycles
; i
++) {
228 if (DoC_is_Millennium(doc
))
229 dummy
= ReadDOC(doc
->virtadr
, NOP
);
230 else if (DoC_is_MillenniumPlus(doc
))
231 dummy
= ReadDOC(doc
->virtadr
, Mplus_NOP
);
233 dummy
= ReadDOC(doc
->virtadr
, DOCStatus
);
238 #define CDSN_CTRL_FR_B_MASK (CDSN_CTRL_FR_B0 | CDSN_CTRL_FR_B1)
240 /* DOC_WaitReady: Wait for RDY line to be asserted by the flash chip */
241 static int _DoC_WaitReady(struct doc_priv
*doc
)
243 void __iomem
*docptr
= doc
->virtadr
;
244 unsigned long timeo
= jiffies
+ (HZ
* 10);
247 printk("_DoC_WaitReady...\n");
248 /* Out-of-line routine to wait for chip response */
249 if (DoC_is_MillenniumPlus(doc
)) {
250 while ((ReadDOC(docptr
, Mplus_FlashControl
) & CDSN_CTRL_FR_B_MASK
) != CDSN_CTRL_FR_B_MASK
) {
251 if (time_after(jiffies
, timeo
)) {
252 printk("_DoC_WaitReady timed out.\n");
259 while (!(ReadDOC(docptr
, CDSNControl
) & CDSN_CTRL_FR_B
)) {
260 if (time_after(jiffies
, timeo
)) {
261 printk("_DoC_WaitReady timed out.\n");
272 static inline int DoC_WaitReady(struct doc_priv
*doc
)
274 void __iomem
*docptr
= doc
->virtadr
;
277 if (DoC_is_MillenniumPlus(doc
)) {
280 if ((ReadDOC(docptr
, Mplus_FlashControl
) & CDSN_CTRL_FR_B_MASK
) != CDSN_CTRL_FR_B_MASK
)
281 /* Call the out-of-line routine to wait */
282 ret
= _DoC_WaitReady(doc
);
286 if (!(ReadDOC(docptr
, CDSNControl
) & CDSN_CTRL_FR_B
))
287 /* Call the out-of-line routine to wait */
288 ret
= _DoC_WaitReady(doc
);
293 printk("DoC_WaitReady OK\n");
297 static void doc2000_write_byte(struct mtd_info
*mtd
, u_char datum
)
299 struct nand_chip
*this = mtd
->priv
;
300 struct doc_priv
*doc
= this->priv
;
301 void __iomem
*docptr
= doc
->virtadr
;
304 printk("write_byte %02x\n", datum
);
305 WriteDOC(datum
, docptr
, CDSNSlowIO
);
306 WriteDOC(datum
, docptr
, 2k_CDSN_IO
);
309 static u_char
doc2000_read_byte(struct mtd_info
*mtd
)
311 struct nand_chip
*this = mtd
->priv
;
312 struct doc_priv
*doc
= this->priv
;
313 void __iomem
*docptr
= doc
->virtadr
;
316 ReadDOC(docptr
, CDSNSlowIO
);
318 ret
= ReadDOC(docptr
, 2k_CDSN_IO
);
320 printk("read_byte returns %02x\n", ret
);
324 static void doc2000_writebuf(struct mtd_info
*mtd
, const u_char
*buf
, int len
)
326 struct nand_chip
*this = mtd
->priv
;
327 struct doc_priv
*doc
= this->priv
;
328 void __iomem
*docptr
= doc
->virtadr
;
331 printk("writebuf of %d bytes: ", len
);
332 for (i
= 0; i
< len
; i
++) {
333 WriteDOC_(buf
[i
], docptr
, DoC_2k_CDSN_IO
+ i
);
335 printk("%02x ", buf
[i
]);
341 static void doc2000_readbuf(struct mtd_info
*mtd
, u_char
*buf
, int len
)
343 struct nand_chip
*this = mtd
->priv
;
344 struct doc_priv
*doc
= this->priv
;
345 void __iomem
*docptr
= doc
->virtadr
;
349 printk("readbuf of %d bytes: ", len
);
351 for (i
= 0; i
< len
; i
++) {
352 buf
[i
] = ReadDOC(docptr
, 2k_CDSN_IO
+ i
);
356 static void doc2000_readbuf_dword(struct mtd_info
*mtd
, u_char
*buf
, int len
)
358 struct nand_chip
*this = mtd
->priv
;
359 struct doc_priv
*doc
= this->priv
;
360 void __iomem
*docptr
= doc
->virtadr
;
364 printk("readbuf_dword of %d bytes: ", len
);
366 if (unlikely((((unsigned long)buf
) | len
) & 3)) {
367 for (i
= 0; i
< len
; i
++) {
368 *(uint8_t *) (&buf
[i
]) = ReadDOC(docptr
, 2k_CDSN_IO
+ i
);
371 for (i
= 0; i
< len
; i
+= 4) {
372 *(uint32_t *) (&buf
[i
]) = readl(docptr
+ DoC_2k_CDSN_IO
+ i
);
377 static uint16_t __init
doc200x_ident_chip(struct mtd_info
*mtd
, int nr
)
379 struct nand_chip
*this = mtd
->priv
;
380 struct doc_priv
*doc
= this->priv
;
383 doc200x_select_chip(mtd
, nr
);
384 doc200x_hwcontrol(mtd
, NAND_CMD_READID
,
385 NAND_CTRL_CLE
| NAND_CTRL_CHANGE
);
386 doc200x_hwcontrol(mtd
, 0, NAND_CTRL_ALE
| NAND_CTRL_CHANGE
);
387 doc200x_hwcontrol(mtd
, NAND_CMD_NONE
, NAND_NCE
| NAND_CTRL_CHANGE
);
389 /* We can't use dev_ready here, but at least we wait for the
390 * command to complete
394 ret
= this->read_byte(mtd
) << 8;
395 ret
|= this->read_byte(mtd
);
397 if (doc
->ChipID
== DOC_ChipID_Doc2k
&& try_dword
&& !nr
) {
398 /* First chip probe. See if we get same results by 32-bit access */
403 void __iomem
*docptr
= doc
->virtadr
;
405 doc200x_hwcontrol(mtd
, NAND_CMD_READID
,
406 NAND_CTRL_CLE
| NAND_CTRL_CHANGE
);
407 doc200x_hwcontrol(mtd
, 0, NAND_CTRL_ALE
| NAND_CTRL_CHANGE
);
408 doc200x_hwcontrol(mtd
, NAND_CMD_NONE
,
409 NAND_NCE
| NAND_CTRL_CHANGE
);
413 ident
.dword
= readl(docptr
+ DoC_2k_CDSN_IO
);
414 if (((ident
.byte
[0] << 8) | ident
.byte
[1]) == ret
) {
415 printk(KERN_INFO
"DiskOnChip 2000 responds to DWORD access\n");
416 this->read_buf
= &doc2000_readbuf_dword
;
423 static void __init
doc2000_count_chips(struct mtd_info
*mtd
)
425 struct nand_chip
*this = mtd
->priv
;
426 struct doc_priv
*doc
= this->priv
;
430 /* Max 4 chips per floor on DiskOnChip 2000 */
431 doc
->chips_per_floor
= 4;
433 /* Find out what the first chip is */
434 mfrid
= doc200x_ident_chip(mtd
, 0);
436 /* Find how many chips in each floor. */
437 for (i
= 1; i
< 4; i
++) {
438 if (doc200x_ident_chip(mtd
, i
) != mfrid
)
441 doc
->chips_per_floor
= i
;
442 printk(KERN_DEBUG
"Detected %d chips per floor.\n", i
);
445 static int doc200x_wait(struct mtd_info
*mtd
, struct nand_chip
*this)
447 struct doc_priv
*doc
= this->priv
;
452 this->cmdfunc(mtd
, NAND_CMD_STATUS
, -1, -1);
454 status
= (int)this->read_byte(mtd
);
459 static void doc2001_write_byte(struct mtd_info
*mtd
, u_char datum
)
461 struct nand_chip
*this = mtd
->priv
;
462 struct doc_priv
*doc
= this->priv
;
463 void __iomem
*docptr
= doc
->virtadr
;
465 WriteDOC(datum
, docptr
, CDSNSlowIO
);
466 WriteDOC(datum
, docptr
, Mil_CDSN_IO
);
467 WriteDOC(datum
, docptr
, WritePipeTerm
);
470 static u_char
doc2001_read_byte(struct mtd_info
*mtd
)
472 struct nand_chip
*this = mtd
->priv
;
473 struct doc_priv
*doc
= this->priv
;
474 void __iomem
*docptr
= doc
->virtadr
;
476 //ReadDOC(docptr, CDSNSlowIO);
477 /* 11.4.5 -- delay twice to allow extended length cycle */
479 ReadDOC(docptr
, ReadPipeInit
);
480 //return ReadDOC(docptr, Mil_CDSN_IO);
481 return ReadDOC(docptr
, LastDataRead
);
484 static void doc2001_writebuf(struct mtd_info
*mtd
, const u_char
*buf
, int len
)
486 struct nand_chip
*this = mtd
->priv
;
487 struct doc_priv
*doc
= this->priv
;
488 void __iomem
*docptr
= doc
->virtadr
;
491 for (i
= 0; i
< len
; i
++)
492 WriteDOC_(buf
[i
], docptr
, DoC_Mil_CDSN_IO
+ i
);
493 /* Terminate write pipeline */
494 WriteDOC(0x00, docptr
, WritePipeTerm
);
497 static void doc2001_readbuf(struct mtd_info
*mtd
, u_char
*buf
, int len
)
499 struct nand_chip
*this = mtd
->priv
;
500 struct doc_priv
*doc
= this->priv
;
501 void __iomem
*docptr
= doc
->virtadr
;
504 /* Start read pipeline */
505 ReadDOC(docptr
, ReadPipeInit
);
507 for (i
= 0; i
< len
- 1; i
++)
508 buf
[i
] = ReadDOC(docptr
, Mil_CDSN_IO
+ (i
& 0xff));
510 /* Terminate read pipeline */
511 buf
[i
] = ReadDOC(docptr
, LastDataRead
);
514 static u_char
doc2001plus_read_byte(struct mtd_info
*mtd
)
516 struct nand_chip
*this = mtd
->priv
;
517 struct doc_priv
*doc
= this->priv
;
518 void __iomem
*docptr
= doc
->virtadr
;
521 ReadDOC(docptr
, Mplus_ReadPipeInit
);
522 ReadDOC(docptr
, Mplus_ReadPipeInit
);
523 ret
= ReadDOC(docptr
, Mplus_LastDataRead
);
525 printk("read_byte returns %02x\n", ret
);
529 static void doc2001plus_writebuf(struct mtd_info
*mtd
, const u_char
*buf
, int len
)
531 struct nand_chip
*this = mtd
->priv
;
532 struct doc_priv
*doc
= this->priv
;
533 void __iomem
*docptr
= doc
->virtadr
;
537 printk("writebuf of %d bytes: ", len
);
538 for (i
= 0; i
< len
; i
++) {
539 WriteDOC_(buf
[i
], docptr
, DoC_Mil_CDSN_IO
+ i
);
541 printk("%02x ", buf
[i
]);
547 static void doc2001plus_readbuf(struct mtd_info
*mtd
, u_char
*buf
, int len
)
549 struct nand_chip
*this = mtd
->priv
;
550 struct doc_priv
*doc
= this->priv
;
551 void __iomem
*docptr
= doc
->virtadr
;
555 printk("readbuf of %d bytes: ", len
);
557 /* Start read pipeline */
558 ReadDOC(docptr
, Mplus_ReadPipeInit
);
559 ReadDOC(docptr
, Mplus_ReadPipeInit
);
561 for (i
= 0; i
< len
- 2; i
++) {
562 buf
[i
] = ReadDOC(docptr
, Mil_CDSN_IO
);
564 printk("%02x ", buf
[i
]);
567 /* Terminate read pipeline */
568 buf
[len
- 2] = ReadDOC(docptr
, Mplus_LastDataRead
);
570 printk("%02x ", buf
[len
- 2]);
571 buf
[len
- 1] = ReadDOC(docptr
, Mplus_LastDataRead
);
573 printk("%02x ", buf
[len
- 1]);
578 static void doc2001plus_select_chip(struct mtd_info
*mtd
, int chip
)
580 struct nand_chip
*this = mtd
->priv
;
581 struct doc_priv
*doc
= this->priv
;
582 void __iomem
*docptr
= doc
->virtadr
;
586 printk("select chip (%d)\n", chip
);
589 /* Disable flash internally */
590 WriteDOC(0, docptr
, Mplus_FlashSelect
);
594 floor
= chip
/ doc
->chips_per_floor
;
595 chip
-= (floor
* doc
->chips_per_floor
);
597 /* Assert ChipEnable and deassert WriteProtect */
598 WriteDOC((DOC_FLASH_CE
), docptr
, Mplus_FlashSelect
);
599 this->cmdfunc(mtd
, NAND_CMD_RESET
, -1, -1);
602 doc
->curfloor
= floor
;
605 static void doc200x_select_chip(struct mtd_info
*mtd
, int chip
)
607 struct nand_chip
*this = mtd
->priv
;
608 struct doc_priv
*doc
= this->priv
;
609 void __iomem
*docptr
= doc
->virtadr
;
613 printk("select chip (%d)\n", chip
);
618 floor
= chip
/ doc
->chips_per_floor
;
619 chip
-= (floor
* doc
->chips_per_floor
);
621 /* 11.4.4 -- deassert CE before changing chip */
622 doc200x_hwcontrol(mtd
, NAND_CMD_NONE
, 0 | NAND_CTRL_CHANGE
);
624 WriteDOC(floor
, docptr
, FloorSelect
);
625 WriteDOC(chip
, docptr
, CDSNDeviceSelect
);
627 doc200x_hwcontrol(mtd
, NAND_CMD_NONE
, NAND_NCE
| NAND_CTRL_CHANGE
);
630 doc
->curfloor
= floor
;
633 #define CDSN_CTRL_MSK (CDSN_CTRL_CE | CDSN_CTRL_CLE | CDSN_CTRL_ALE)
635 static void doc200x_hwcontrol(struct mtd_info
*mtd
, int cmd
,
638 struct nand_chip
*this = mtd
->priv
;
639 struct doc_priv
*doc
= this->priv
;
640 void __iomem
*docptr
= doc
->virtadr
;
642 if (ctrl
& NAND_CTRL_CHANGE
) {
643 doc
->CDSNControl
&= ~CDSN_CTRL_MSK
;
644 doc
->CDSNControl
|= ctrl
& CDSN_CTRL_MSK
;
646 printk("hwcontrol(%d): %02x\n", cmd
, doc
->CDSNControl
);
647 WriteDOC(doc
->CDSNControl
, docptr
, CDSNControl
);
648 /* 11.4.3 -- 4 NOPs after CSDNControl write */
651 if (cmd
!= NAND_CMD_NONE
) {
652 if (DoC_is_2000(doc
))
653 doc2000_write_byte(mtd
, cmd
);
655 doc2001_write_byte(mtd
, cmd
);
659 static void doc2001plus_command(struct mtd_info
*mtd
, unsigned command
, int column
, int page_addr
)
661 struct nand_chip
*this = mtd
->priv
;
662 struct doc_priv
*doc
= this->priv
;
663 void __iomem
*docptr
= doc
->virtadr
;
666 * Must terminate write pipeline before sending any commands
669 if (command
== NAND_CMD_PAGEPROG
) {
670 WriteDOC(0x00, docptr
, Mplus_WritePipeTerm
);
671 WriteDOC(0x00, docptr
, Mplus_WritePipeTerm
);
675 * Write out the command to the device.
677 if (command
== NAND_CMD_SEQIN
) {
680 if (column
>= mtd
->writesize
) {
682 column
-= mtd
->writesize
;
683 readcmd
= NAND_CMD_READOOB
;
684 } else if (column
< 256) {
685 /* First 256 bytes --> READ0 */
686 readcmd
= NAND_CMD_READ0
;
689 readcmd
= NAND_CMD_READ1
;
691 WriteDOC(readcmd
, docptr
, Mplus_FlashCmd
);
693 WriteDOC(command
, docptr
, Mplus_FlashCmd
);
694 WriteDOC(0, docptr
, Mplus_WritePipeTerm
);
695 WriteDOC(0, docptr
, Mplus_WritePipeTerm
);
697 if (column
!= -1 || page_addr
!= -1) {
698 /* Serially input address */
700 /* Adjust columns for 16 bit buswidth */
701 if (this->options
& NAND_BUSWIDTH_16
)
703 WriteDOC(column
, docptr
, Mplus_FlashAddress
);
705 if (page_addr
!= -1) {
706 WriteDOC((unsigned char)(page_addr
& 0xff), docptr
, Mplus_FlashAddress
);
707 WriteDOC((unsigned char)((page_addr
>> 8) & 0xff), docptr
, Mplus_FlashAddress
);
708 /* One more address cycle for higher density devices */
709 if (this->chipsize
& 0x0c000000) {
710 WriteDOC((unsigned char)((page_addr
>> 16) & 0x0f), docptr
, Mplus_FlashAddress
);
711 printk("high density\n");
714 WriteDOC(0, docptr
, Mplus_WritePipeTerm
);
715 WriteDOC(0, docptr
, Mplus_WritePipeTerm
);
717 if (command
== NAND_CMD_READ0
|| command
== NAND_CMD_READ1
||
718 command
== NAND_CMD_READOOB
|| command
== NAND_CMD_READID
)
719 WriteDOC(0, docptr
, Mplus_FlashControl
);
723 * program and erase have their own busy handlers
724 * status and sequential in needs no delay
728 case NAND_CMD_PAGEPROG
:
729 case NAND_CMD_ERASE1
:
730 case NAND_CMD_ERASE2
:
732 case NAND_CMD_STATUS
:
738 udelay(this->chip_delay
);
739 WriteDOC(NAND_CMD_STATUS
, docptr
, Mplus_FlashCmd
);
740 WriteDOC(0, docptr
, Mplus_WritePipeTerm
);
741 WriteDOC(0, docptr
, Mplus_WritePipeTerm
);
742 while (!(this->read_byte(mtd
) & 0x40)) ;
745 /* This applies to read commands */
748 * If we don't have access to the busy pin, we apply the given
751 if (!this->dev_ready
) {
752 udelay(this->chip_delay
);
757 /* Apply this short delay always to ensure that we do wait tWB in
758 * any case on any machine. */
760 /* wait until command is processed */
761 while (!this->dev_ready(mtd
)) ;
764 static int doc200x_dev_ready(struct mtd_info
*mtd
)
766 struct nand_chip
*this = mtd
->priv
;
767 struct doc_priv
*doc
= this->priv
;
768 void __iomem
*docptr
= doc
->virtadr
;
770 if (DoC_is_MillenniumPlus(doc
)) {
771 /* 11.4.2 -- must NOP four times before checking FR/B# */
773 if ((ReadDOC(docptr
, Mplus_FlashControl
) & CDSN_CTRL_FR_B_MASK
) != CDSN_CTRL_FR_B_MASK
) {
775 printk("not ready\n");
779 printk("was ready\n");
782 /* 11.4.2 -- must NOP four times before checking FR/B# */
784 if (!(ReadDOC(docptr
, CDSNControl
) & CDSN_CTRL_FR_B
)) {
786 printk("not ready\n");
789 /* 11.4.2 -- Must NOP twice if it's ready */
792 printk("was ready\n");
797 static int doc200x_block_bad(struct mtd_info
*mtd
, loff_t ofs
, int getchip
)
799 /* This is our last resort if we couldn't find or create a BBT. Just
800 pretend all blocks are good. */
804 static void doc200x_enable_hwecc(struct mtd_info
*mtd
, int mode
)
806 struct nand_chip
*this = mtd
->priv
;
807 struct doc_priv
*doc
= this->priv
;
808 void __iomem
*docptr
= doc
->virtadr
;
810 /* Prime the ECC engine */
813 WriteDOC(DOC_ECC_RESET
, docptr
, ECCConf
);
814 WriteDOC(DOC_ECC_EN
, docptr
, ECCConf
);
817 WriteDOC(DOC_ECC_RESET
, docptr
, ECCConf
);
818 WriteDOC(DOC_ECC_EN
| DOC_ECC_RW
, docptr
, ECCConf
);
823 static void doc2001plus_enable_hwecc(struct mtd_info
*mtd
, int mode
)
825 struct nand_chip
*this = mtd
->priv
;
826 struct doc_priv
*doc
= this->priv
;
827 void __iomem
*docptr
= doc
->virtadr
;
829 /* Prime the ECC engine */
832 WriteDOC(DOC_ECC_RESET
, docptr
, Mplus_ECCConf
);
833 WriteDOC(DOC_ECC_EN
, docptr
, Mplus_ECCConf
);
836 WriteDOC(DOC_ECC_RESET
, docptr
, Mplus_ECCConf
);
837 WriteDOC(DOC_ECC_EN
| DOC_ECC_RW
, docptr
, Mplus_ECCConf
);
842 /* This code is only called on write */
843 static int doc200x_calculate_ecc(struct mtd_info
*mtd
, const u_char
*dat
, unsigned char *ecc_code
)
845 struct nand_chip
*this = mtd
->priv
;
846 struct doc_priv
*doc
= this->priv
;
847 void __iomem
*docptr
= doc
->virtadr
;
851 /* flush the pipeline */
852 if (DoC_is_2000(doc
)) {
853 WriteDOC(doc
->CDSNControl
& ~CDSN_CTRL_FLASH_IO
, docptr
, CDSNControl
);
854 WriteDOC(0, docptr
, 2k_CDSN_IO
);
855 WriteDOC(0, docptr
, 2k_CDSN_IO
);
856 WriteDOC(0, docptr
, 2k_CDSN_IO
);
857 WriteDOC(doc
->CDSNControl
, docptr
, CDSNControl
);
858 } else if (DoC_is_MillenniumPlus(doc
)) {
859 WriteDOC(0, docptr
, Mplus_NOP
);
860 WriteDOC(0, docptr
, Mplus_NOP
);
861 WriteDOC(0, docptr
, Mplus_NOP
);
863 WriteDOC(0, docptr
, NOP
);
864 WriteDOC(0, docptr
, NOP
);
865 WriteDOC(0, docptr
, NOP
);
868 for (i
= 0; i
< 6; i
++) {
869 if (DoC_is_MillenniumPlus(doc
))
870 ecc_code
[i
] = ReadDOC_(docptr
, DoC_Mplus_ECCSyndrome0
+ i
);
872 ecc_code
[i
] = ReadDOC_(docptr
, DoC_ECCSyndrome0
+ i
);
873 if (ecc_code
[i
] != empty_write_ecc
[i
])
876 if (DoC_is_MillenniumPlus(doc
))
877 WriteDOC(DOC_ECC_DIS
, docptr
, Mplus_ECCConf
);
879 WriteDOC(DOC_ECC_DIS
, docptr
, ECCConf
);
881 /* If emptymatch=1, we might have an all-0xff data buffer. Check. */
883 /* Note: this somewhat expensive test should not be triggered
884 often. It could be optimized away by examining the data in
885 the writebuf routine, and remembering the result. */
886 for (i
= 0; i
< 512; i
++) {
893 /* If emptymatch still =1, we do have an all-0xff data buffer.
894 Return all-0xff ecc value instead of the computed one, so
895 it'll look just like a freshly-erased page. */
897 memset(ecc_code
, 0xff, 6);
902 static int doc200x_correct_data(struct mtd_info
*mtd
, u_char
*dat
,
903 u_char
*read_ecc
, u_char
*isnull
)
906 struct nand_chip
*this = mtd
->priv
;
907 struct doc_priv
*doc
= this->priv
;
908 void __iomem
*docptr
= doc
->virtadr
;
910 volatile u_char dummy
;
913 /* flush the pipeline */
914 if (DoC_is_2000(doc
)) {
915 dummy
= ReadDOC(docptr
, 2k_ECCStatus
);
916 dummy
= ReadDOC(docptr
, 2k_ECCStatus
);
917 dummy
= ReadDOC(docptr
, 2k_ECCStatus
);
918 } else if (DoC_is_MillenniumPlus(doc
)) {
919 dummy
= ReadDOC(docptr
, Mplus_ECCConf
);
920 dummy
= ReadDOC(docptr
, Mplus_ECCConf
);
921 dummy
= ReadDOC(docptr
, Mplus_ECCConf
);
923 dummy
= ReadDOC(docptr
, ECCConf
);
924 dummy
= ReadDOC(docptr
, ECCConf
);
925 dummy
= ReadDOC(docptr
, ECCConf
);
928 /* Error occurred ? */
930 for (i
= 0; i
< 6; i
++) {
931 if (DoC_is_MillenniumPlus(doc
))
932 calc_ecc
[i
] = ReadDOC_(docptr
, DoC_Mplus_ECCSyndrome0
+ i
);
934 calc_ecc
[i
] = ReadDOC_(docptr
, DoC_ECCSyndrome0
+ i
);
935 if (calc_ecc
[i
] != empty_read_syndrome
[i
])
938 /* If emptymatch=1, the read syndrome is consistent with an
939 all-0xff data and stored ecc block. Check the stored ecc. */
941 for (i
= 0; i
< 6; i
++) {
942 if (read_ecc
[i
] == 0xff)
948 /* If emptymatch still =1, check the data block. */
950 /* Note: this somewhat expensive test should not be triggered
951 often. It could be optimized away by examining the data in
952 the readbuf routine, and remembering the result. */
953 for (i
= 0; i
< 512; i
++) {
960 /* If emptymatch still =1, this is almost certainly a freshly-
961 erased block, in which case the ECC will not come out right.
962 We'll suppress the error and tell the caller everything's
963 OK. Because it is. */
965 ret
= doc_ecc_decode(rs_decoder
, dat
, calc_ecc
);
967 printk(KERN_ERR
"doc200x_correct_data corrected %d errors\n", ret
);
969 if (DoC_is_MillenniumPlus(doc
))
970 WriteDOC(DOC_ECC_DIS
, docptr
, Mplus_ECCConf
);
972 WriteDOC(DOC_ECC_DIS
, docptr
, ECCConf
);
973 if (no_ecc_failures
&& mtd_is_eccerr(ret
)) {
974 printk(KERN_ERR
"suppressing ECC failure\n");
980 //u_char mydatabuf[528];
982 /* The strange out-of-order .oobfree list below is a (possibly unneeded)
983 * attempt to retain compatibility. It used to read:
984 * .oobfree = { {8, 8} }
985 * Since that leaves two bytes unusable, it was changed. But the following
986 * scheme might affect existing jffs2 installs by moving the cleanmarker:
987 * .oobfree = { {6, 10} }
988 * jffs2 seems to handle the above gracefully, but the current scheme seems
989 * safer. The only problem with it is that any code that parses oobfree must
990 * be able to handle out-of-order segments.
992 static struct nand_ecclayout doc200x_oobinfo
= {
994 .eccpos
= {0, 1, 2, 3, 4, 5},
995 .oobfree
= {{8, 8}, {6, 2}}
998 /* Find the (I)NFTL Media Header, and optionally also the mirror media header.
999 On successful return, buf will contain a copy of the media header for
1000 further processing. id is the string to scan for, and will presumably be
1001 either "ANAND" or "BNAND". If findmirror=1, also look for the mirror media
1002 header. The page #s of the found media headers are placed in mh0_page and
1003 mh1_page in the DOC private structure. */
1004 static int __init
find_media_headers(struct mtd_info
*mtd
, u_char
*buf
, const char *id
, int findmirror
)
1006 struct nand_chip
*this = mtd
->priv
;
1007 struct doc_priv
*doc
= this->priv
;
1012 for (offs
= 0; offs
< mtd
->size
; offs
+= mtd
->erasesize
) {
1013 ret
= mtd_read(mtd
, offs
, mtd
->writesize
, &retlen
, buf
);
1014 if (retlen
!= mtd
->writesize
)
1017 printk(KERN_WARNING
"ECC error scanning DOC at 0x%x\n", offs
);
1019 if (memcmp(buf
, id
, 6))
1021 printk(KERN_INFO
"Found DiskOnChip %s Media Header at 0x%x\n", id
, offs
);
1022 if (doc
->mh0_page
== -1) {
1023 doc
->mh0_page
= offs
>> this->page_shift
;
1028 doc
->mh1_page
= offs
>> this->page_shift
;
1031 if (doc
->mh0_page
== -1) {
1032 printk(KERN_WARNING
"DiskOnChip %s Media Header not found.\n", id
);
1035 /* Only one mediaheader was found. We want buf to contain a
1036 mediaheader on return, so we'll have to re-read the one we found. */
1037 offs
= doc
->mh0_page
<< this->page_shift
;
1038 ret
= mtd_read(mtd
, offs
, mtd
->writesize
, &retlen
, buf
);
1039 if (retlen
!= mtd
->writesize
) {
1040 /* Insanity. Give up. */
1041 printk(KERN_ERR
"Read DiskOnChip Media Header once, but can't reread it???\n");
1047 static inline int __init
nftl_partscan(struct mtd_info
*mtd
, struct mtd_partition
*parts
)
1049 struct nand_chip
*this = mtd
->priv
;
1050 struct doc_priv
*doc
= this->priv
;
1053 struct NFTLMediaHeader
*mh
;
1054 const unsigned psize
= 1 << this->page_shift
;
1056 unsigned blocks
, maxblocks
;
1057 int offs
, numheaders
;
1059 buf
= kmalloc(mtd
->writesize
, GFP_KERNEL
);
1063 if (!(numheaders
= find_media_headers(mtd
, buf
, "ANAND", 1)))
1065 mh
= (struct NFTLMediaHeader
*)buf
;
1067 le16_to_cpus(&mh
->NumEraseUnits
);
1068 le16_to_cpus(&mh
->FirstPhysicalEUN
);
1069 le32_to_cpus(&mh
->FormattedSize
);
1071 printk(KERN_INFO
" DataOrgID = %s\n"
1072 " NumEraseUnits = %d\n"
1073 " FirstPhysicalEUN = %d\n"
1074 " FormattedSize = %d\n"
1075 " UnitSizeFactor = %d\n",
1076 mh
->DataOrgID
, mh
->NumEraseUnits
,
1077 mh
->FirstPhysicalEUN
, mh
->FormattedSize
,
1078 mh
->UnitSizeFactor
);
1080 blocks
= mtd
->size
>> this->phys_erase_shift
;
1081 maxblocks
= min(32768U, mtd
->erasesize
- psize
);
1083 if (mh
->UnitSizeFactor
== 0x00) {
1084 /* Auto-determine UnitSizeFactor. The constraints are:
1085 - There can be at most 32768 virtual blocks.
1086 - There can be at most (virtual block size - page size)
1087 virtual blocks (because MediaHeader+BBT must fit in 1).
1089 mh
->UnitSizeFactor
= 0xff;
1090 while (blocks
> maxblocks
) {
1092 maxblocks
= min(32768U, (maxblocks
<< 1) + psize
);
1093 mh
->UnitSizeFactor
--;
1095 printk(KERN_WARNING
"UnitSizeFactor=0x00 detected. Correct value is assumed to be 0x%02x.\n", mh
->UnitSizeFactor
);
1098 /* NOTE: The lines below modify internal variables of the NAND and MTD
1099 layers; variables with have already been configured by nand_scan.
1100 Unfortunately, we didn't know before this point what these values
1101 should be. Thus, this code is somewhat dependent on the exact
1102 implementation of the NAND layer. */
1103 if (mh
->UnitSizeFactor
!= 0xff) {
1104 this->bbt_erase_shift
+= (0xff - mh
->UnitSizeFactor
);
1105 mtd
->erasesize
<<= (0xff - mh
->UnitSizeFactor
);
1106 printk(KERN_INFO
"Setting virtual erase size to %d\n", mtd
->erasesize
);
1107 blocks
= mtd
->size
>> this->bbt_erase_shift
;
1108 maxblocks
= min(32768U, mtd
->erasesize
- psize
);
1111 if (blocks
> maxblocks
) {
1112 printk(KERN_ERR
"UnitSizeFactor of 0x%02x is inconsistent with device size. Aborting.\n", mh
->UnitSizeFactor
);
1116 /* Skip past the media headers. */
1117 offs
= max(doc
->mh0_page
, doc
->mh1_page
);
1118 offs
<<= this->page_shift
;
1119 offs
+= mtd
->erasesize
;
1121 if (show_firmware_partition
== 1) {
1122 parts
[0].name
= " DiskOnChip Firmware / Media Header partition";
1123 parts
[0].offset
= 0;
1124 parts
[0].size
= offs
;
1128 parts
[numparts
].name
= " DiskOnChip BDTL partition";
1129 parts
[numparts
].offset
= offs
;
1130 parts
[numparts
].size
= (mh
->NumEraseUnits
- numheaders
) << this->bbt_erase_shift
;
1132 offs
+= parts
[numparts
].size
;
1135 if (offs
< mtd
->size
) {
1136 parts
[numparts
].name
= " DiskOnChip Remainder partition";
1137 parts
[numparts
].offset
= offs
;
1138 parts
[numparts
].size
= mtd
->size
- offs
;
1148 /* This is a stripped-down copy of the code in inftlmount.c */
1149 static inline int __init
inftl_partscan(struct mtd_info
*mtd
, struct mtd_partition
*parts
)
1151 struct nand_chip
*this = mtd
->priv
;
1152 struct doc_priv
*doc
= this->priv
;
1155 struct INFTLMediaHeader
*mh
;
1156 struct INFTLPartition
*ip
;
1159 int vshift
, lastvunit
= 0;
1161 int end
= mtd
->size
;
1163 if (inftl_bbt_write
)
1164 end
-= (INFTL_BBT_RESERVED_BLOCKS
<< this->phys_erase_shift
);
1166 buf
= kmalloc(mtd
->writesize
, GFP_KERNEL
);
1171 if (!find_media_headers(mtd
, buf
, "BNAND", 0))
1173 doc
->mh1_page
= doc
->mh0_page
+ (4096 >> this->page_shift
);
1174 mh
= (struct INFTLMediaHeader
*)buf
;
1176 le32_to_cpus(&mh
->NoOfBootImageBlocks
);
1177 le32_to_cpus(&mh
->NoOfBinaryPartitions
);
1178 le32_to_cpus(&mh
->NoOfBDTLPartitions
);
1179 le32_to_cpus(&mh
->BlockMultiplierBits
);
1180 le32_to_cpus(&mh
->FormatFlags
);
1181 le32_to_cpus(&mh
->PercentUsed
);
1183 printk(KERN_INFO
" bootRecordID = %s\n"
1184 " NoOfBootImageBlocks = %d\n"
1185 " NoOfBinaryPartitions = %d\n"
1186 " NoOfBDTLPartitions = %d\n"
1187 " BlockMultiplerBits = %d\n"
1188 " FormatFlgs = %d\n"
1189 " OsakVersion = %d.%d.%d.%d\n"
1190 " PercentUsed = %d\n",
1191 mh
->bootRecordID
, mh
->NoOfBootImageBlocks
,
1192 mh
->NoOfBinaryPartitions
,
1193 mh
->NoOfBDTLPartitions
,
1194 mh
->BlockMultiplierBits
, mh
->FormatFlags
,
1195 ((unsigned char *) &mh
->OsakVersion
)[0] & 0xf,
1196 ((unsigned char *) &mh
->OsakVersion
)[1] & 0xf,
1197 ((unsigned char *) &mh
->OsakVersion
)[2] & 0xf,
1198 ((unsigned char *) &mh
->OsakVersion
)[3] & 0xf,
1201 vshift
= this->phys_erase_shift
+ mh
->BlockMultiplierBits
;
1203 blocks
= mtd
->size
>> vshift
;
1204 if (blocks
> 32768) {
1205 printk(KERN_ERR
"BlockMultiplierBits=%d is inconsistent with device size. Aborting.\n", mh
->BlockMultiplierBits
);
1209 blocks
= doc
->chips_per_floor
<< (this->chip_shift
- this->phys_erase_shift
);
1210 if (inftl_bbt_write
&& (blocks
> mtd
->erasesize
)) {
1211 printk(KERN_ERR
"Writeable BBTs spanning more than one erase block are not yet supported. FIX ME!\n");
1215 /* Scan the partitions */
1216 for (i
= 0; (i
< 4); i
++) {
1217 ip
= &(mh
->Partitions
[i
]);
1218 le32_to_cpus(&ip
->virtualUnits
);
1219 le32_to_cpus(&ip
->firstUnit
);
1220 le32_to_cpus(&ip
->lastUnit
);
1221 le32_to_cpus(&ip
->flags
);
1222 le32_to_cpus(&ip
->spareUnits
);
1223 le32_to_cpus(&ip
->Reserved0
);
1225 printk(KERN_INFO
" PARTITION[%d] ->\n"
1226 " virtualUnits = %d\n"
1230 " spareUnits = %d\n",
1231 i
, ip
->virtualUnits
, ip
->firstUnit
,
1232 ip
->lastUnit
, ip
->flags
,
1235 if ((show_firmware_partition
== 1) &&
1236 (i
== 0) && (ip
->firstUnit
> 0)) {
1237 parts
[0].name
= " DiskOnChip IPL / Media Header partition";
1238 parts
[0].offset
= 0;
1239 parts
[0].size
= mtd
->erasesize
* ip
->firstUnit
;
1243 if (ip
->flags
& INFTL_BINARY
)
1244 parts
[numparts
].name
= " DiskOnChip BDK partition";
1246 parts
[numparts
].name
= " DiskOnChip BDTL partition";
1247 parts
[numparts
].offset
= ip
->firstUnit
<< vshift
;
1248 parts
[numparts
].size
= (1 + ip
->lastUnit
- ip
->firstUnit
) << vshift
;
1250 if (ip
->lastUnit
> lastvunit
)
1251 lastvunit
= ip
->lastUnit
;
1252 if (ip
->flags
& INFTL_LAST
)
1256 if ((lastvunit
<< vshift
) < end
) {
1257 parts
[numparts
].name
= " DiskOnChip Remainder partition";
1258 parts
[numparts
].offset
= lastvunit
<< vshift
;
1259 parts
[numparts
].size
= end
- parts
[numparts
].offset
;
1268 static int __init
nftl_scan_bbt(struct mtd_info
*mtd
)
1271 struct nand_chip
*this = mtd
->priv
;
1272 struct doc_priv
*doc
= this->priv
;
1273 struct mtd_partition parts
[2];
1275 memset((char *)parts
, 0, sizeof(parts
));
1276 /* On NFTL, we have to find the media headers before we can read the
1277 BBTs, since they're stored in the media header eraseblocks. */
1278 numparts
= nftl_partscan(mtd
, parts
);
1281 this->bbt_td
->options
= NAND_BBT_ABSPAGE
| NAND_BBT_8BIT
|
1282 NAND_BBT_SAVECONTENT
| NAND_BBT_WRITE
|
1284 this->bbt_td
->veroffs
= 7;
1285 this->bbt_td
->pages
[0] = doc
->mh0_page
+ 1;
1286 if (doc
->mh1_page
!= -1) {
1287 this->bbt_md
->options
= NAND_BBT_ABSPAGE
| NAND_BBT_8BIT
|
1288 NAND_BBT_SAVECONTENT
| NAND_BBT_WRITE
|
1290 this->bbt_md
->veroffs
= 7;
1291 this->bbt_md
->pages
[0] = doc
->mh1_page
+ 1;
1293 this->bbt_md
= NULL
;
1296 /* It's safe to set bd=NULL below because NAND_BBT_CREATE is not set.
1297 At least as nand_bbt.c is currently written. */
1298 if ((ret
= nand_scan_bbt(mtd
, NULL
)))
1300 mtd_device_register(mtd
, NULL
, 0);
1302 mtd_device_register(mtd
, parts
, numparts
);
1306 static int __init
inftl_scan_bbt(struct mtd_info
*mtd
)
1309 struct nand_chip
*this = mtd
->priv
;
1310 struct doc_priv
*doc
= this->priv
;
1311 struct mtd_partition parts
[5];
1313 if (this->numchips
> doc
->chips_per_floor
) {
1314 printk(KERN_ERR
"Multi-floor INFTL devices not yet supported.\n");
1318 if (DoC_is_MillenniumPlus(doc
)) {
1319 this->bbt_td
->options
= NAND_BBT_2BIT
| NAND_BBT_ABSPAGE
;
1320 if (inftl_bbt_write
)
1321 this->bbt_td
->options
|= NAND_BBT_WRITE
;
1322 this->bbt_td
->pages
[0] = 2;
1323 this->bbt_md
= NULL
;
1325 this->bbt_td
->options
= NAND_BBT_LASTBLOCK
| NAND_BBT_8BIT
| NAND_BBT_VERSION
;
1326 if (inftl_bbt_write
)
1327 this->bbt_td
->options
|= NAND_BBT_WRITE
;
1328 this->bbt_td
->offs
= 8;
1329 this->bbt_td
->len
= 8;
1330 this->bbt_td
->veroffs
= 7;
1331 this->bbt_td
->maxblocks
= INFTL_BBT_RESERVED_BLOCKS
;
1332 this->bbt_td
->reserved_block_code
= 0x01;
1333 this->bbt_td
->pattern
= "MSYS_BBT";
1335 this->bbt_md
->options
= NAND_BBT_LASTBLOCK
| NAND_BBT_8BIT
| NAND_BBT_VERSION
;
1336 if (inftl_bbt_write
)
1337 this->bbt_md
->options
|= NAND_BBT_WRITE
;
1338 this->bbt_md
->offs
= 8;
1339 this->bbt_md
->len
= 8;
1340 this->bbt_md
->veroffs
= 7;
1341 this->bbt_md
->maxblocks
= INFTL_BBT_RESERVED_BLOCKS
;
1342 this->bbt_md
->reserved_block_code
= 0x01;
1343 this->bbt_md
->pattern
= "TBB_SYSM";
1346 /* It's safe to set bd=NULL below because NAND_BBT_CREATE is not set.
1347 At least as nand_bbt.c is currently written. */
1348 if ((ret
= nand_scan_bbt(mtd
, NULL
)))
1350 memset((char *)parts
, 0, sizeof(parts
));
1351 numparts
= inftl_partscan(mtd
, parts
);
1352 /* At least for now, require the INFTL Media Header. We could probably
1353 do without it for non-INFTL use, since all it gives us is
1354 autopartitioning, but I want to give it more thought. */
1357 mtd_device_register(mtd
, NULL
, 0);
1359 mtd_device_register(mtd
, parts
, numparts
);
1363 static inline int __init
doc2000_init(struct mtd_info
*mtd
)
1365 struct nand_chip
*this = mtd
->priv
;
1366 struct doc_priv
*doc
= this->priv
;
1368 this->read_byte
= doc2000_read_byte
;
1369 this->write_buf
= doc2000_writebuf
;
1370 this->read_buf
= doc2000_readbuf
;
1371 this->scan_bbt
= nftl_scan_bbt
;
1373 doc
->CDSNControl
= CDSN_CTRL_FLASH_IO
| CDSN_CTRL_ECC_IO
;
1374 doc2000_count_chips(mtd
);
1375 mtd
->name
= "DiskOnChip 2000 (NFTL Model)";
1376 return (4 * doc
->chips_per_floor
);
1379 static inline int __init
doc2001_init(struct mtd_info
*mtd
)
1381 struct nand_chip
*this = mtd
->priv
;
1382 struct doc_priv
*doc
= this->priv
;
1384 this->read_byte
= doc2001_read_byte
;
1385 this->write_buf
= doc2001_writebuf
;
1386 this->read_buf
= doc2001_readbuf
;
1388 ReadDOC(doc
->virtadr
, ChipID
);
1389 ReadDOC(doc
->virtadr
, ChipID
);
1390 ReadDOC(doc
->virtadr
, ChipID
);
1391 if (ReadDOC(doc
->virtadr
, ChipID
) != DOC_ChipID_DocMil
) {
1392 /* It's not a Millennium; it's one of the newer
1393 DiskOnChip 2000 units with a similar ASIC.
1394 Treat it like a Millennium, except that it
1395 can have multiple chips. */
1396 doc2000_count_chips(mtd
);
1397 mtd
->name
= "DiskOnChip 2000 (INFTL Model)";
1398 this->scan_bbt
= inftl_scan_bbt
;
1399 return (4 * doc
->chips_per_floor
);
1401 /* Bog-standard Millennium */
1402 doc
->chips_per_floor
= 1;
1403 mtd
->name
= "DiskOnChip Millennium";
1404 this->scan_bbt
= nftl_scan_bbt
;
1409 static inline int __init
doc2001plus_init(struct mtd_info
*mtd
)
1411 struct nand_chip
*this = mtd
->priv
;
1412 struct doc_priv
*doc
= this->priv
;
1414 this->read_byte
= doc2001plus_read_byte
;
1415 this->write_buf
= doc2001plus_writebuf
;
1416 this->read_buf
= doc2001plus_readbuf
;
1417 this->scan_bbt
= inftl_scan_bbt
;
1418 this->cmd_ctrl
= NULL
;
1419 this->select_chip
= doc2001plus_select_chip
;
1420 this->cmdfunc
= doc2001plus_command
;
1421 this->ecc
.hwctl
= doc2001plus_enable_hwecc
;
1423 doc
->chips_per_floor
= 1;
1424 mtd
->name
= "DiskOnChip Millennium Plus";
1429 static int __init
doc_probe(unsigned long physadr
)
1431 unsigned char ChipID
;
1432 struct mtd_info
*mtd
;
1433 struct nand_chip
*nand
;
1434 struct doc_priv
*doc
;
1435 void __iomem
*virtadr
;
1436 unsigned char save_control
;
1437 unsigned char tmp
, tmpb
, tmpc
;
1438 int reg
, len
, numchips
;
1441 if (!request_mem_region(physadr
, DOC_IOREMAP_LEN
, NULL
))
1443 virtadr
= ioremap(physadr
, DOC_IOREMAP_LEN
);
1445 printk(KERN_ERR
"Diskonchip ioremap failed: 0x%x bytes at 0x%lx\n", DOC_IOREMAP_LEN
, physadr
);
1450 /* It's not possible to cleanly detect the DiskOnChip - the
1451 * bootup procedure will put the device into reset mode, and
1452 * it's not possible to talk to it without actually writing
1453 * to the DOCControl register. So we store the current contents
1454 * of the DOCControl register's location, in case we later decide
1455 * that it's not a DiskOnChip, and want to put it back how we
1458 save_control
= ReadDOC(virtadr
, DOCControl
);
1460 /* Reset the DiskOnChip ASIC */
1461 WriteDOC(DOC_MODE_CLR_ERR
| DOC_MODE_MDWREN
| DOC_MODE_RESET
, virtadr
, DOCControl
);
1462 WriteDOC(DOC_MODE_CLR_ERR
| DOC_MODE_MDWREN
| DOC_MODE_RESET
, virtadr
, DOCControl
);
1464 /* Enable the DiskOnChip ASIC */
1465 WriteDOC(DOC_MODE_CLR_ERR
| DOC_MODE_MDWREN
| DOC_MODE_NORMAL
, virtadr
, DOCControl
);
1466 WriteDOC(DOC_MODE_CLR_ERR
| DOC_MODE_MDWREN
| DOC_MODE_NORMAL
, virtadr
, DOCControl
);
1468 ChipID
= ReadDOC(virtadr
, ChipID
);
1471 case DOC_ChipID_Doc2k
:
1472 reg
= DoC_2k_ECCStatus
;
1474 case DOC_ChipID_DocMil
:
1477 case DOC_ChipID_DocMilPlus16
:
1478 case DOC_ChipID_DocMilPlus32
:
1480 /* Possible Millennium Plus, need to do more checks */
1481 /* Possibly release from power down mode */
1482 for (tmp
= 0; (tmp
< 4); tmp
++)
1483 ReadDOC(virtadr
, Mplus_Power
);
1485 /* Reset the Millennium Plus ASIC */
1486 tmp
= DOC_MODE_RESET
| DOC_MODE_MDWREN
| DOC_MODE_RST_LAT
| DOC_MODE_BDECT
;
1487 WriteDOC(tmp
, virtadr
, Mplus_DOCControl
);
1488 WriteDOC(~tmp
, virtadr
, Mplus_CtrlConfirm
);
1491 /* Enable the Millennium Plus ASIC */
1492 tmp
= DOC_MODE_NORMAL
| DOC_MODE_MDWREN
| DOC_MODE_RST_LAT
| DOC_MODE_BDECT
;
1493 WriteDOC(tmp
, virtadr
, Mplus_DOCControl
);
1494 WriteDOC(~tmp
, virtadr
, Mplus_CtrlConfirm
);
1497 ChipID
= ReadDOC(virtadr
, ChipID
);
1500 case DOC_ChipID_DocMilPlus16
:
1501 reg
= DoC_Mplus_Toggle
;
1503 case DOC_ChipID_DocMilPlus32
:
1504 printk(KERN_ERR
"DiskOnChip Millennium Plus 32MB is not supported, ignoring.\n");
1515 /* Check the TOGGLE bit in the ECC register */
1516 tmp
= ReadDOC_(virtadr
, reg
) & DOC_TOGGLE_BIT
;
1517 tmpb
= ReadDOC_(virtadr
, reg
) & DOC_TOGGLE_BIT
;
1518 tmpc
= ReadDOC_(virtadr
, reg
) & DOC_TOGGLE_BIT
;
1519 if ((tmp
== tmpb
) || (tmp
!= tmpc
)) {
1520 printk(KERN_WARNING
"Possible DiskOnChip at 0x%lx failed TOGGLE test, dropping.\n", physadr
);
1525 for (mtd
= doclist
; mtd
; mtd
= doc
->nextdoc
) {
1526 unsigned char oldval
;
1527 unsigned char newval
;
1530 /* Use the alias resolution register to determine if this is
1531 in fact the same DOC aliased to a new address. If writes
1532 to one chip's alias resolution register change the value on
1533 the other chip, they're the same chip. */
1534 if (ChipID
== DOC_ChipID_DocMilPlus16
) {
1535 oldval
= ReadDOC(doc
->virtadr
, Mplus_AliasResolution
);
1536 newval
= ReadDOC(virtadr
, Mplus_AliasResolution
);
1538 oldval
= ReadDOC(doc
->virtadr
, AliasResolution
);
1539 newval
= ReadDOC(virtadr
, AliasResolution
);
1541 if (oldval
!= newval
)
1543 if (ChipID
== DOC_ChipID_DocMilPlus16
) {
1544 WriteDOC(~newval
, virtadr
, Mplus_AliasResolution
);
1545 oldval
= ReadDOC(doc
->virtadr
, Mplus_AliasResolution
);
1546 WriteDOC(newval
, virtadr
, Mplus_AliasResolution
); // restore it
1548 WriteDOC(~newval
, virtadr
, AliasResolution
);
1549 oldval
= ReadDOC(doc
->virtadr
, AliasResolution
);
1550 WriteDOC(newval
, virtadr
, AliasResolution
); // restore it
1553 if (oldval
== newval
) {
1554 printk(KERN_DEBUG
"Found alias of DOC at 0x%lx to 0x%lx\n", doc
->physadr
, physadr
);
1559 printk(KERN_NOTICE
"DiskOnChip found at 0x%lx\n", physadr
);
1561 len
= sizeof(struct mtd_info
) +
1562 sizeof(struct nand_chip
) + sizeof(struct doc_priv
) + (2 * sizeof(struct nand_bbt_descr
));
1563 mtd
= kzalloc(len
, GFP_KERNEL
);
1569 nand
= (struct nand_chip
*) (mtd
+ 1);
1570 doc
= (struct doc_priv
*) (nand
+ 1);
1571 nand
->bbt_td
= (struct nand_bbt_descr
*) (doc
+ 1);
1572 nand
->bbt_md
= nand
->bbt_td
+ 1;
1575 mtd
->owner
= THIS_MODULE
;
1578 nand
->select_chip
= doc200x_select_chip
;
1579 nand
->cmd_ctrl
= doc200x_hwcontrol
;
1580 nand
->dev_ready
= doc200x_dev_ready
;
1581 nand
->waitfunc
= doc200x_wait
;
1582 nand
->block_bad
= doc200x_block_bad
;
1583 nand
->ecc
.hwctl
= doc200x_enable_hwecc
;
1584 nand
->ecc
.calculate
= doc200x_calculate_ecc
;
1585 nand
->ecc
.correct
= doc200x_correct_data
;
1587 nand
->ecc
.layout
= &doc200x_oobinfo
;
1588 nand
->ecc
.mode
= NAND_ECC_HW_SYNDROME
;
1589 nand
->ecc
.size
= 512;
1590 nand
->ecc
.bytes
= 6;
1591 nand
->ecc
.strength
= 2;
1592 nand
->bbt_options
= NAND_BBT_USE_FLASH
;
1594 doc
->physadr
= physadr
;
1595 doc
->virtadr
= virtadr
;
1596 doc
->ChipID
= ChipID
;
1601 doc
->nextdoc
= doclist
;
1603 if (ChipID
== DOC_ChipID_Doc2k
)
1604 numchips
= doc2000_init(mtd
);
1605 else if (ChipID
== DOC_ChipID_DocMilPlus16
)
1606 numchips
= doc2001plus_init(mtd
);
1608 numchips
= doc2001_init(mtd
);
1610 if ((ret
= nand_scan(mtd
, numchips
))) {
1611 /* DBB note: i believe nand_release is necessary here, as
1612 buffers may have been allocated in nand_base. Check with
1614 /* nand_release will call mtd_device_unregister, but we
1615 haven't yet added it. This is handled without incident by
1616 mtd_device_unregister, as far as I can tell. */
1627 /* Put back the contents of the DOCControl register, in case it's not
1628 actually a DiskOnChip. */
1629 WriteDOC(save_control
, virtadr
, DOCControl
);
1634 release_mem_region(physadr
, DOC_IOREMAP_LEN
);
1639 static void release_nanddoc(void)
1641 struct mtd_info
*mtd
, *nextmtd
;
1642 struct nand_chip
*nand
;
1643 struct doc_priv
*doc
;
1645 for (mtd
= doclist
; mtd
; mtd
= nextmtd
) {
1649 nextmtd
= doc
->nextdoc
;
1651 iounmap(doc
->virtadr
);
1652 release_mem_region(doc
->physadr
, DOC_IOREMAP_LEN
);
1657 static int __init
init_nanddoc(void)
1661 /* We could create the decoder on demand, if memory is a concern.
1662 * This way we have it handy, if an error happens
1664 * Symbolsize is 10 (bits)
1665 * Primitve polynomial is x^10+x^3+1
1666 * first consecutive root is 510
1667 * primitve element to generate roots = 1
1668 * generator polinomial degree = 4
1670 rs_decoder
= init_rs(10, 0x409, FCR
, 1, NROOTS
);
1672 printk(KERN_ERR
"DiskOnChip: Could not create a RS decoder\n");
1676 if (doc_config_location
) {
1677 printk(KERN_INFO
"Using configured DiskOnChip probe address 0x%lx\n", doc_config_location
);
1678 ret
= doc_probe(doc_config_location
);
1682 for (i
= 0; (doc_locations
[i
] != 0xffffffff); i
++) {
1683 doc_probe(doc_locations
[i
]);
1686 /* No banner message any more. Print a message if no DiskOnChip
1687 found, so the user knows we at least tried. */
1689 printk(KERN_INFO
"No valid DiskOnChip devices found\n");
1695 free_rs(rs_decoder
);
1699 static void __exit
cleanup_nanddoc(void)
1701 /* Cleanup the nand/DoC resources */
1704 /* Free the reed solomon resources */
1706 free_rs(rs_decoder
);
1710 module_init(init_nanddoc
);
1711 module_exit(cleanup_nanddoc
);
1713 MODULE_LICENSE("GPL");
1714 MODULE_AUTHOR("David Woodhouse <dwmw2@infradead.org>");
1715 MODULE_DESCRIPTION("M-Systems DiskOnChip 2000, Millennium and Millennium Plus device driver");