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
;
73 /* Handle the last stage of initialization (BBT scan, partitioning) */
74 int (*late_init
)(struct mtd_info
*mtd
);
77 /* This is the ecc value computed by the HW ecc generator upon writing an empty
78 page, one with all 0xff for data. */
79 static u_char empty_write_ecc
[6] = { 0x4b, 0x00, 0xe2, 0x0e, 0x93, 0xf7 };
81 #define INFTL_BBT_RESERVED_BLOCKS 4
83 #define DoC_is_MillenniumPlus(doc) ((doc)->ChipID == DOC_ChipID_DocMilPlus16 || (doc)->ChipID == DOC_ChipID_DocMilPlus32)
84 #define DoC_is_Millennium(doc) ((doc)->ChipID == DOC_ChipID_DocMil)
85 #define DoC_is_2000(doc) ((doc)->ChipID == DOC_ChipID_Doc2k)
87 static void doc200x_hwcontrol(struct mtd_info
*mtd
, int cmd
,
88 unsigned int bitmask
);
89 static void doc200x_select_chip(struct mtd_info
*mtd
, int chip
);
92 module_param(debug
, int, 0);
94 static int try_dword
= 1;
95 module_param(try_dword
, int, 0);
97 static int no_ecc_failures
= 0;
98 module_param(no_ecc_failures
, int, 0);
100 static int no_autopart
= 0;
101 module_param(no_autopart
, int, 0);
103 static int show_firmware_partition
= 0;
104 module_param(show_firmware_partition
, int, 0);
106 #ifdef CONFIG_MTD_NAND_DISKONCHIP_BBTWRITE
107 static int inftl_bbt_write
= 1;
109 static int inftl_bbt_write
= 0;
111 module_param(inftl_bbt_write
, int, 0);
113 static unsigned long doc_config_location
= CONFIG_MTD_NAND_DISKONCHIP_PROBE_ADDRESS
;
114 module_param(doc_config_location
, ulong
, 0);
115 MODULE_PARM_DESC(doc_config_location
, "Physical memory address at which to probe for DiskOnChip");
117 /* Sector size for HW ECC */
118 #define SECTOR_SIZE 512
119 /* The sector bytes are packed into NB_DATA 10 bit words */
120 #define NB_DATA (((SECTOR_SIZE + 1) * 8 + 6) / 10)
121 /* Number of roots */
123 /* First consective root */
125 /* Number of symbols */
128 /* the Reed Solomon control structure */
129 static struct rs_control
*rs_decoder
;
132 * The HW decoder in the DoC ASIC's provides us a error syndrome,
133 * which we must convert to a standard syndrome usable by the generic
134 * Reed-Solomon library code.
136 * Fabrice Bellard figured this out in the old docecc code. I added
137 * some comments, improved a minor bit and converted it to make use
138 * of the generic Reed-Solomon library. tglx
140 static int doc_ecc_decode(struct rs_control
*rs
, uint8_t *data
, uint8_t *ecc
)
142 int i
, j
, nerr
, errpos
[8];
144 uint16_t ds
[4], s
[5], tmp
, errval
[8], syn
[4];
146 memset(syn
, 0, sizeof(syn
));
147 /* Convert the ecc bytes into words */
148 ds
[0] = ((ecc
[4] & 0xff) >> 0) | ((ecc
[5] & 0x03) << 8);
149 ds
[1] = ((ecc
[5] & 0xfc) >> 2) | ((ecc
[2] & 0x0f) << 6);
150 ds
[2] = ((ecc
[2] & 0xf0) >> 4) | ((ecc
[3] & 0x3f) << 4);
151 ds
[3] = ((ecc
[3] & 0xc0) >> 6) | ((ecc
[0] & 0xff) << 2);
154 /* Initialize the syndrome buffer */
155 for (i
= 0; i
< NROOTS
; i
++)
159 * s[i] = ds[3]x^3 + ds[2]x^2 + ds[1]x^1 + ds[0]
160 * where x = alpha^(FCR + i)
162 for (j
= 1; j
< NROOTS
; j
++) {
165 tmp
= rs
->index_of
[ds
[j
]];
166 for (i
= 0; i
< NROOTS
; i
++)
167 s
[i
] ^= rs
->alpha_to
[rs_modnn(rs
, tmp
+ (FCR
+ i
) * j
)];
170 /* Calc syn[i] = s[i] / alpha^(v + i) */
171 for (i
= 0; i
< NROOTS
; i
++) {
173 syn
[i
] = rs_modnn(rs
, rs
->index_of
[s
[i
]] + (NN
- FCR
- i
));
175 /* Call the decoder library */
176 nerr
= decode_rs16(rs
, NULL
, NULL
, 1019, syn
, 0, errpos
, 0, errval
);
178 /* Incorrectable errors ? */
183 * Correct the errors. The bitpositions are a bit of magic,
184 * but they are given by the design of the de/encoder circuit
187 for (i
= 0; i
< nerr
; i
++) {
188 int index
, bitpos
, pos
= 1015 - errpos
[i
];
190 if (pos
>= NB_DATA
&& pos
< 1019)
193 /* extract bit position (MSB first) */
194 pos
= 10 * (NB_DATA
- 1 - pos
) - 6;
195 /* now correct the following 10 bits. At most two bytes
196 can be modified since pos is even */
197 index
= (pos
>> 3) ^ 1;
199 if ((index
>= 0 && index
< SECTOR_SIZE
) || index
== (SECTOR_SIZE
+ 1)) {
200 val
= (uint8_t) (errval
[i
] >> (2 + bitpos
));
202 if (index
< SECTOR_SIZE
)
205 index
= ((pos
>> 3) + 1) ^ 1;
206 bitpos
= (bitpos
+ 10) & 7;
209 if ((index
>= 0 && index
< SECTOR_SIZE
) || index
== (SECTOR_SIZE
+ 1)) {
210 val
= (uint8_t) (errval
[i
] << (8 - bitpos
));
212 if (index
< SECTOR_SIZE
)
217 /* If the parity is wrong, no rescue possible */
218 return parity
? -EBADMSG
: nerr
;
221 static void DoC_Delay(struct doc_priv
*doc
, unsigned short cycles
)
226 for (i
= 0; i
< cycles
; i
++) {
227 if (DoC_is_Millennium(doc
))
228 dummy
= ReadDOC(doc
->virtadr
, NOP
);
229 else if (DoC_is_MillenniumPlus(doc
))
230 dummy
= ReadDOC(doc
->virtadr
, Mplus_NOP
);
232 dummy
= ReadDOC(doc
->virtadr
, DOCStatus
);
237 #define CDSN_CTRL_FR_B_MASK (CDSN_CTRL_FR_B0 | CDSN_CTRL_FR_B1)
239 /* DOC_WaitReady: Wait for RDY line to be asserted by the flash chip */
240 static int _DoC_WaitReady(struct doc_priv
*doc
)
242 void __iomem
*docptr
= doc
->virtadr
;
243 unsigned long timeo
= jiffies
+ (HZ
* 10);
246 printk("_DoC_WaitReady...\n");
247 /* Out-of-line routine to wait for chip response */
248 if (DoC_is_MillenniumPlus(doc
)) {
249 while ((ReadDOC(docptr
, Mplus_FlashControl
) & CDSN_CTRL_FR_B_MASK
) != CDSN_CTRL_FR_B_MASK
) {
250 if (time_after(jiffies
, timeo
)) {
251 printk("_DoC_WaitReady timed out.\n");
258 while (!(ReadDOC(docptr
, CDSNControl
) & CDSN_CTRL_FR_B
)) {
259 if (time_after(jiffies
, timeo
)) {
260 printk("_DoC_WaitReady timed out.\n");
271 static inline int DoC_WaitReady(struct doc_priv
*doc
)
273 void __iomem
*docptr
= doc
->virtadr
;
276 if (DoC_is_MillenniumPlus(doc
)) {
279 if ((ReadDOC(docptr
, Mplus_FlashControl
) & CDSN_CTRL_FR_B_MASK
) != CDSN_CTRL_FR_B_MASK
)
280 /* Call the out-of-line routine to wait */
281 ret
= _DoC_WaitReady(doc
);
285 if (!(ReadDOC(docptr
, CDSNControl
) & CDSN_CTRL_FR_B
))
286 /* Call the out-of-line routine to wait */
287 ret
= _DoC_WaitReady(doc
);
292 printk("DoC_WaitReady OK\n");
296 static void doc2000_write_byte(struct mtd_info
*mtd
, u_char datum
)
298 struct nand_chip
*this = mtd_to_nand(mtd
);
299 struct doc_priv
*doc
= nand_get_controller_data(this);
300 void __iomem
*docptr
= doc
->virtadr
;
303 printk("write_byte %02x\n", datum
);
304 WriteDOC(datum
, docptr
, CDSNSlowIO
);
305 WriteDOC(datum
, docptr
, 2k_CDSN_IO
);
308 static u_char
doc2000_read_byte(struct mtd_info
*mtd
)
310 struct nand_chip
*this = mtd_to_nand(mtd
);
311 struct doc_priv
*doc
= nand_get_controller_data(this);
312 void __iomem
*docptr
= doc
->virtadr
;
315 ReadDOC(docptr
, CDSNSlowIO
);
317 ret
= ReadDOC(docptr
, 2k_CDSN_IO
);
319 printk("read_byte returns %02x\n", ret
);
323 static void doc2000_writebuf(struct mtd_info
*mtd
, const u_char
*buf
, int len
)
325 struct nand_chip
*this = mtd_to_nand(mtd
);
326 struct doc_priv
*doc
= nand_get_controller_data(this);
327 void __iomem
*docptr
= doc
->virtadr
;
330 printk("writebuf of %d bytes: ", len
);
331 for (i
= 0; i
< len
; i
++) {
332 WriteDOC_(buf
[i
], docptr
, DoC_2k_CDSN_IO
+ i
);
334 printk("%02x ", buf
[i
]);
340 static void doc2000_readbuf(struct mtd_info
*mtd
, u_char
*buf
, int len
)
342 struct nand_chip
*this = mtd_to_nand(mtd
);
343 struct doc_priv
*doc
= nand_get_controller_data(this);
344 void __iomem
*docptr
= doc
->virtadr
;
348 printk("readbuf of %d bytes: ", len
);
350 for (i
= 0; i
< len
; i
++) {
351 buf
[i
] = ReadDOC(docptr
, 2k_CDSN_IO
+ i
);
355 static void doc2000_readbuf_dword(struct mtd_info
*mtd
, u_char
*buf
, int len
)
357 struct nand_chip
*this = mtd_to_nand(mtd
);
358 struct doc_priv
*doc
= nand_get_controller_data(this);
359 void __iomem
*docptr
= doc
->virtadr
;
363 printk("readbuf_dword of %d bytes: ", len
);
365 if (unlikely((((unsigned long)buf
) | len
) & 3)) {
366 for (i
= 0; i
< len
; i
++) {
367 *(uint8_t *) (&buf
[i
]) = ReadDOC(docptr
, 2k_CDSN_IO
+ i
);
370 for (i
= 0; i
< len
; i
+= 4) {
371 *(uint32_t *) (&buf
[i
]) = readl(docptr
+ DoC_2k_CDSN_IO
+ i
);
376 static uint16_t __init
doc200x_ident_chip(struct mtd_info
*mtd
, int nr
)
378 struct nand_chip
*this = mtd_to_nand(mtd
);
379 struct doc_priv
*doc
= nand_get_controller_data(this);
382 doc200x_select_chip(mtd
, nr
);
383 doc200x_hwcontrol(mtd
, NAND_CMD_READID
,
384 NAND_CTRL_CLE
| NAND_CTRL_CHANGE
);
385 doc200x_hwcontrol(mtd
, 0, NAND_CTRL_ALE
| NAND_CTRL_CHANGE
);
386 doc200x_hwcontrol(mtd
, NAND_CMD_NONE
, NAND_NCE
| NAND_CTRL_CHANGE
);
388 /* We can't use dev_ready here, but at least we wait for the
389 * command to complete
393 ret
= this->read_byte(mtd
) << 8;
394 ret
|= this->read_byte(mtd
);
396 if (doc
->ChipID
== DOC_ChipID_Doc2k
&& try_dword
&& !nr
) {
397 /* First chip probe. See if we get same results by 32-bit access */
402 void __iomem
*docptr
= doc
->virtadr
;
404 doc200x_hwcontrol(mtd
, NAND_CMD_READID
,
405 NAND_CTRL_CLE
| NAND_CTRL_CHANGE
);
406 doc200x_hwcontrol(mtd
, 0, NAND_CTRL_ALE
| NAND_CTRL_CHANGE
);
407 doc200x_hwcontrol(mtd
, NAND_CMD_NONE
,
408 NAND_NCE
| NAND_CTRL_CHANGE
);
412 ident
.dword
= readl(docptr
+ DoC_2k_CDSN_IO
);
413 if (((ident
.byte
[0] << 8) | ident
.byte
[1]) == ret
) {
414 printk(KERN_INFO
"DiskOnChip 2000 responds to DWORD access\n");
415 this->read_buf
= &doc2000_readbuf_dword
;
422 static void __init
doc2000_count_chips(struct mtd_info
*mtd
)
424 struct nand_chip
*this = mtd_to_nand(mtd
);
425 struct doc_priv
*doc
= nand_get_controller_data(this);
429 /* Max 4 chips per floor on DiskOnChip 2000 */
430 doc
->chips_per_floor
= 4;
432 /* Find out what the first chip is */
433 mfrid
= doc200x_ident_chip(mtd
, 0);
435 /* Find how many chips in each floor. */
436 for (i
= 1; i
< 4; i
++) {
437 if (doc200x_ident_chip(mtd
, i
) != mfrid
)
440 doc
->chips_per_floor
= i
;
441 printk(KERN_DEBUG
"Detected %d chips per floor.\n", i
);
444 static int doc200x_wait(struct mtd_info
*mtd
, struct nand_chip
*this)
446 struct doc_priv
*doc
= nand_get_controller_data(this);
451 this->cmdfunc(mtd
, NAND_CMD_STATUS
, -1, -1);
453 status
= (int)this->read_byte(mtd
);
458 static void doc2001_write_byte(struct mtd_info
*mtd
, u_char datum
)
460 struct nand_chip
*this = mtd_to_nand(mtd
);
461 struct doc_priv
*doc
= nand_get_controller_data(this);
462 void __iomem
*docptr
= doc
->virtadr
;
464 WriteDOC(datum
, docptr
, CDSNSlowIO
);
465 WriteDOC(datum
, docptr
, Mil_CDSN_IO
);
466 WriteDOC(datum
, docptr
, WritePipeTerm
);
469 static u_char
doc2001_read_byte(struct mtd_info
*mtd
)
471 struct nand_chip
*this = mtd_to_nand(mtd
);
472 struct doc_priv
*doc
= nand_get_controller_data(this);
473 void __iomem
*docptr
= doc
->virtadr
;
475 //ReadDOC(docptr, CDSNSlowIO);
476 /* 11.4.5 -- delay twice to allow extended length cycle */
478 ReadDOC(docptr
, ReadPipeInit
);
479 //return ReadDOC(docptr, Mil_CDSN_IO);
480 return ReadDOC(docptr
, LastDataRead
);
483 static void doc2001_writebuf(struct mtd_info
*mtd
, const u_char
*buf
, int len
)
485 struct nand_chip
*this = mtd_to_nand(mtd
);
486 struct doc_priv
*doc
= nand_get_controller_data(this);
487 void __iomem
*docptr
= doc
->virtadr
;
490 for (i
= 0; i
< len
; i
++)
491 WriteDOC_(buf
[i
], docptr
, DoC_Mil_CDSN_IO
+ i
);
492 /* Terminate write pipeline */
493 WriteDOC(0x00, docptr
, WritePipeTerm
);
496 static void doc2001_readbuf(struct mtd_info
*mtd
, u_char
*buf
, int len
)
498 struct nand_chip
*this = mtd_to_nand(mtd
);
499 struct doc_priv
*doc
= nand_get_controller_data(this);
500 void __iomem
*docptr
= doc
->virtadr
;
503 /* Start read pipeline */
504 ReadDOC(docptr
, ReadPipeInit
);
506 for (i
= 0; i
< len
- 1; i
++)
507 buf
[i
] = ReadDOC(docptr
, Mil_CDSN_IO
+ (i
& 0xff));
509 /* Terminate read pipeline */
510 buf
[i
] = ReadDOC(docptr
, LastDataRead
);
513 static u_char
doc2001plus_read_byte(struct mtd_info
*mtd
)
515 struct nand_chip
*this = mtd_to_nand(mtd
);
516 struct doc_priv
*doc
= nand_get_controller_data(this);
517 void __iomem
*docptr
= doc
->virtadr
;
520 ReadDOC(docptr
, Mplus_ReadPipeInit
);
521 ReadDOC(docptr
, Mplus_ReadPipeInit
);
522 ret
= ReadDOC(docptr
, Mplus_LastDataRead
);
524 printk("read_byte returns %02x\n", ret
);
528 static void doc2001plus_writebuf(struct mtd_info
*mtd
, const u_char
*buf
, int len
)
530 struct nand_chip
*this = mtd_to_nand(mtd
);
531 struct doc_priv
*doc
= nand_get_controller_data(this);
532 void __iomem
*docptr
= doc
->virtadr
;
536 printk("writebuf of %d bytes: ", len
);
537 for (i
= 0; i
< len
; i
++) {
538 WriteDOC_(buf
[i
], docptr
, DoC_Mil_CDSN_IO
+ i
);
540 printk("%02x ", buf
[i
]);
546 static void doc2001plus_readbuf(struct mtd_info
*mtd
, u_char
*buf
, int len
)
548 struct nand_chip
*this = mtd_to_nand(mtd
);
549 struct doc_priv
*doc
= nand_get_controller_data(this);
550 void __iomem
*docptr
= doc
->virtadr
;
554 printk("readbuf of %d bytes: ", len
);
556 /* Start read pipeline */
557 ReadDOC(docptr
, Mplus_ReadPipeInit
);
558 ReadDOC(docptr
, Mplus_ReadPipeInit
);
560 for (i
= 0; i
< len
- 2; i
++) {
561 buf
[i
] = ReadDOC(docptr
, Mil_CDSN_IO
);
563 printk("%02x ", buf
[i
]);
566 /* Terminate read pipeline */
567 buf
[len
- 2] = ReadDOC(docptr
, Mplus_LastDataRead
);
569 printk("%02x ", buf
[len
- 2]);
570 buf
[len
- 1] = ReadDOC(docptr
, Mplus_LastDataRead
);
572 printk("%02x ", buf
[len
- 1]);
577 static void doc2001plus_select_chip(struct mtd_info
*mtd
, int chip
)
579 struct nand_chip
*this = mtd_to_nand(mtd
);
580 struct doc_priv
*doc
= nand_get_controller_data(this);
581 void __iomem
*docptr
= doc
->virtadr
;
585 printk("select chip (%d)\n", chip
);
588 /* Disable flash internally */
589 WriteDOC(0, docptr
, Mplus_FlashSelect
);
593 floor
= chip
/ doc
->chips_per_floor
;
594 chip
-= (floor
* doc
->chips_per_floor
);
596 /* Assert ChipEnable and deassert WriteProtect */
597 WriteDOC((DOC_FLASH_CE
), docptr
, Mplus_FlashSelect
);
598 this->cmdfunc(mtd
, NAND_CMD_RESET
, -1, -1);
601 doc
->curfloor
= floor
;
604 static void doc200x_select_chip(struct mtd_info
*mtd
, int chip
)
606 struct nand_chip
*this = mtd_to_nand(mtd
);
607 struct doc_priv
*doc
= nand_get_controller_data(this);
608 void __iomem
*docptr
= doc
->virtadr
;
612 printk("select chip (%d)\n", chip
);
617 floor
= chip
/ doc
->chips_per_floor
;
618 chip
-= (floor
* doc
->chips_per_floor
);
620 /* 11.4.4 -- deassert CE before changing chip */
621 doc200x_hwcontrol(mtd
, NAND_CMD_NONE
, 0 | NAND_CTRL_CHANGE
);
623 WriteDOC(floor
, docptr
, FloorSelect
);
624 WriteDOC(chip
, docptr
, CDSNDeviceSelect
);
626 doc200x_hwcontrol(mtd
, NAND_CMD_NONE
, NAND_NCE
| NAND_CTRL_CHANGE
);
629 doc
->curfloor
= floor
;
632 #define CDSN_CTRL_MSK (CDSN_CTRL_CE | CDSN_CTRL_CLE | CDSN_CTRL_ALE)
634 static void doc200x_hwcontrol(struct mtd_info
*mtd
, int cmd
,
637 struct nand_chip
*this = mtd_to_nand(mtd
);
638 struct doc_priv
*doc
= nand_get_controller_data(this);
639 void __iomem
*docptr
= doc
->virtadr
;
641 if (ctrl
& NAND_CTRL_CHANGE
) {
642 doc
->CDSNControl
&= ~CDSN_CTRL_MSK
;
643 doc
->CDSNControl
|= ctrl
& CDSN_CTRL_MSK
;
645 printk("hwcontrol(%d): %02x\n", cmd
, doc
->CDSNControl
);
646 WriteDOC(doc
->CDSNControl
, docptr
, CDSNControl
);
647 /* 11.4.3 -- 4 NOPs after CSDNControl write */
650 if (cmd
!= NAND_CMD_NONE
) {
651 if (DoC_is_2000(doc
))
652 doc2000_write_byte(mtd
, cmd
);
654 doc2001_write_byte(mtd
, cmd
);
658 static void doc2001plus_command(struct mtd_info
*mtd
, unsigned command
, int column
, int page_addr
)
660 struct nand_chip
*this = mtd_to_nand(mtd
);
661 struct doc_priv
*doc
= nand_get_controller_data(this);
662 void __iomem
*docptr
= doc
->virtadr
;
665 * Must terminate write pipeline before sending any commands
668 if (command
== NAND_CMD_PAGEPROG
) {
669 WriteDOC(0x00, docptr
, Mplus_WritePipeTerm
);
670 WriteDOC(0x00, docptr
, Mplus_WritePipeTerm
);
674 * Write out the command to the device.
676 if (command
== NAND_CMD_SEQIN
) {
679 if (column
>= mtd
->writesize
) {
681 column
-= mtd
->writesize
;
682 readcmd
= NAND_CMD_READOOB
;
683 } else if (column
< 256) {
684 /* First 256 bytes --> READ0 */
685 readcmd
= NAND_CMD_READ0
;
688 readcmd
= NAND_CMD_READ1
;
690 WriteDOC(readcmd
, docptr
, Mplus_FlashCmd
);
692 WriteDOC(command
, docptr
, Mplus_FlashCmd
);
693 WriteDOC(0, docptr
, Mplus_WritePipeTerm
);
694 WriteDOC(0, docptr
, Mplus_WritePipeTerm
);
696 if (column
!= -1 || page_addr
!= -1) {
697 /* Serially input address */
699 /* Adjust columns for 16 bit buswidth */
700 if (this->options
& NAND_BUSWIDTH_16
&&
701 !nand_opcode_8bits(command
))
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_to_nand(mtd
);
767 struct doc_priv
*doc
= nand_get_controller_data(this);
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
)
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_to_nand(mtd
);
807 struct doc_priv
*doc
= nand_get_controller_data(this);
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_to_nand(mtd
);
826 struct doc_priv
*doc
= nand_get_controller_data(this);
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_to_nand(mtd
);
846 struct doc_priv
*doc
= nand_get_controller_data(this);
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_to_nand(mtd
);
907 struct doc_priv
*doc
= nand_get_controller_data(this);
908 void __iomem
*docptr
= doc
->virtadr
;
910 volatile u_char dummy
;
912 /* flush the pipeline */
913 if (DoC_is_2000(doc
)) {
914 dummy
= ReadDOC(docptr
, 2k_ECCStatus
);
915 dummy
= ReadDOC(docptr
, 2k_ECCStatus
);
916 dummy
= ReadDOC(docptr
, 2k_ECCStatus
);
917 } else if (DoC_is_MillenniumPlus(doc
)) {
918 dummy
= ReadDOC(docptr
, Mplus_ECCConf
);
919 dummy
= ReadDOC(docptr
, Mplus_ECCConf
);
920 dummy
= ReadDOC(docptr
, Mplus_ECCConf
);
922 dummy
= ReadDOC(docptr
, ECCConf
);
923 dummy
= ReadDOC(docptr
, ECCConf
);
924 dummy
= ReadDOC(docptr
, ECCConf
);
927 /* Error occurred ? */
929 for (i
= 0; i
< 6; i
++) {
930 if (DoC_is_MillenniumPlus(doc
))
931 calc_ecc
[i
] = ReadDOC_(docptr
, DoC_Mplus_ECCSyndrome0
+ i
);
933 calc_ecc
[i
] = ReadDOC_(docptr
, DoC_ECCSyndrome0
+ i
);
936 ret
= doc_ecc_decode(rs_decoder
, dat
, calc_ecc
);
938 printk(KERN_ERR
"doc200x_correct_data corrected %d errors\n", ret
);
940 if (DoC_is_MillenniumPlus(doc
))
941 WriteDOC(DOC_ECC_DIS
, docptr
, Mplus_ECCConf
);
943 WriteDOC(DOC_ECC_DIS
, docptr
, ECCConf
);
944 if (no_ecc_failures
&& mtd_is_eccerr(ret
)) {
945 printk(KERN_ERR
"suppressing ECC failure\n");
951 //u_char mydatabuf[528];
953 static int doc200x_ooblayout_ecc(struct mtd_info
*mtd
, int section
,
954 struct mtd_oob_region
*oobregion
)
959 oobregion
->offset
= 0;
960 oobregion
->length
= 6;
965 static int doc200x_ooblayout_free(struct mtd_info
*mtd
, int section
,
966 struct mtd_oob_region
*oobregion
)
972 * The strange out-of-order free bytes definition is a (possibly
973 * unneeded) attempt to retain compatibility. It used to read:
974 * .oobfree = { {8, 8} }
975 * Since that leaves two bytes unusable, it was changed. But the
976 * following scheme might affect existing jffs2 installs by moving the
978 * .oobfree = { {6, 10} }
979 * jffs2 seems to handle the above gracefully, but the current scheme
980 * seems safer. The only problem with it is that any code retrieving
981 * free bytes position must be able to handle out-of-order segments.
984 oobregion
->offset
= 8;
985 oobregion
->length
= 8;
987 oobregion
->offset
= 6;
988 oobregion
->length
= 2;
994 static const struct mtd_ooblayout_ops doc200x_ooblayout_ops
= {
995 .ecc
= doc200x_ooblayout_ecc
,
996 .free
= doc200x_ooblayout_free
,
999 /* Find the (I)NFTL Media Header, and optionally also the mirror media header.
1000 On successful return, buf will contain a copy of the media header for
1001 further processing. id is the string to scan for, and will presumably be
1002 either "ANAND" or "BNAND". If findmirror=1, also look for the mirror media
1003 header. The page #s of the found media headers are placed in mh0_page and
1004 mh1_page in the DOC private structure. */
1005 static int __init
find_media_headers(struct mtd_info
*mtd
, u_char
*buf
, const char *id
, int findmirror
)
1007 struct nand_chip
*this = mtd_to_nand(mtd
);
1008 struct doc_priv
*doc
= nand_get_controller_data(this);
1013 for (offs
= 0; offs
< mtd
->size
; offs
+= mtd
->erasesize
) {
1014 ret
= mtd_read(mtd
, offs
, mtd
->writesize
, &retlen
, buf
);
1015 if (retlen
!= mtd
->writesize
)
1018 printk(KERN_WARNING
"ECC error scanning DOC at 0x%x\n", offs
);
1020 if (memcmp(buf
, id
, 6))
1022 printk(KERN_INFO
"Found DiskOnChip %s Media Header at 0x%x\n", id
, offs
);
1023 if (doc
->mh0_page
== -1) {
1024 doc
->mh0_page
= offs
>> this->page_shift
;
1029 doc
->mh1_page
= offs
>> this->page_shift
;
1032 if (doc
->mh0_page
== -1) {
1033 printk(KERN_WARNING
"DiskOnChip %s Media Header not found.\n", id
);
1036 /* Only one mediaheader was found. We want buf to contain a
1037 mediaheader on return, so we'll have to re-read the one we found. */
1038 offs
= doc
->mh0_page
<< this->page_shift
;
1039 ret
= mtd_read(mtd
, offs
, mtd
->writesize
, &retlen
, buf
);
1040 if (retlen
!= mtd
->writesize
) {
1041 /* Insanity. Give up. */
1042 printk(KERN_ERR
"Read DiskOnChip Media Header once, but can't reread it???\n");
1048 static inline int __init
nftl_partscan(struct mtd_info
*mtd
, struct mtd_partition
*parts
)
1050 struct nand_chip
*this = mtd_to_nand(mtd
);
1051 struct doc_priv
*doc
= nand_get_controller_data(this);
1054 struct NFTLMediaHeader
*mh
;
1055 const unsigned psize
= 1 << this->page_shift
;
1057 unsigned blocks
, maxblocks
;
1058 int offs
, numheaders
;
1060 buf
= kmalloc(mtd
->writesize
, GFP_KERNEL
);
1064 if (!(numheaders
= find_media_headers(mtd
, buf
, "ANAND", 1)))
1066 mh
= (struct NFTLMediaHeader
*)buf
;
1068 le16_to_cpus(&mh
->NumEraseUnits
);
1069 le16_to_cpus(&mh
->FirstPhysicalEUN
);
1070 le32_to_cpus(&mh
->FormattedSize
);
1072 printk(KERN_INFO
" DataOrgID = %s\n"
1073 " NumEraseUnits = %d\n"
1074 " FirstPhysicalEUN = %d\n"
1075 " FormattedSize = %d\n"
1076 " UnitSizeFactor = %d\n",
1077 mh
->DataOrgID
, mh
->NumEraseUnits
,
1078 mh
->FirstPhysicalEUN
, mh
->FormattedSize
,
1079 mh
->UnitSizeFactor
);
1081 blocks
= mtd
->size
>> this->phys_erase_shift
;
1082 maxblocks
= min(32768U, mtd
->erasesize
- psize
);
1084 if (mh
->UnitSizeFactor
== 0x00) {
1085 /* Auto-determine UnitSizeFactor. The constraints are:
1086 - There can be at most 32768 virtual blocks.
1087 - There can be at most (virtual block size - page size)
1088 virtual blocks (because MediaHeader+BBT must fit in 1).
1090 mh
->UnitSizeFactor
= 0xff;
1091 while (blocks
> maxblocks
) {
1093 maxblocks
= min(32768U, (maxblocks
<< 1) + psize
);
1094 mh
->UnitSizeFactor
--;
1096 printk(KERN_WARNING
"UnitSizeFactor=0x00 detected. Correct value is assumed to be 0x%02x.\n", mh
->UnitSizeFactor
);
1099 /* NOTE: The lines below modify internal variables of the NAND and MTD
1100 layers; variables with have already been configured by nand_scan.
1101 Unfortunately, we didn't know before this point what these values
1102 should be. Thus, this code is somewhat dependent on the exact
1103 implementation of the NAND layer. */
1104 if (mh
->UnitSizeFactor
!= 0xff) {
1105 this->bbt_erase_shift
+= (0xff - mh
->UnitSizeFactor
);
1106 mtd
->erasesize
<<= (0xff - mh
->UnitSizeFactor
);
1107 printk(KERN_INFO
"Setting virtual erase size to %d\n", mtd
->erasesize
);
1108 blocks
= mtd
->size
>> this->bbt_erase_shift
;
1109 maxblocks
= min(32768U, mtd
->erasesize
- psize
);
1112 if (blocks
> maxblocks
) {
1113 printk(KERN_ERR
"UnitSizeFactor of 0x%02x is inconsistent with device size. Aborting.\n", mh
->UnitSizeFactor
);
1117 /* Skip past the media headers. */
1118 offs
= max(doc
->mh0_page
, doc
->mh1_page
);
1119 offs
<<= this->page_shift
;
1120 offs
+= mtd
->erasesize
;
1122 if (show_firmware_partition
== 1) {
1123 parts
[0].name
= " DiskOnChip Firmware / Media Header partition";
1124 parts
[0].offset
= 0;
1125 parts
[0].size
= offs
;
1129 parts
[numparts
].name
= " DiskOnChip BDTL partition";
1130 parts
[numparts
].offset
= offs
;
1131 parts
[numparts
].size
= (mh
->NumEraseUnits
- numheaders
) << this->bbt_erase_shift
;
1133 offs
+= parts
[numparts
].size
;
1136 if (offs
< mtd
->size
) {
1137 parts
[numparts
].name
= " DiskOnChip Remainder partition";
1138 parts
[numparts
].offset
= offs
;
1139 parts
[numparts
].size
= mtd
->size
- offs
;
1149 /* This is a stripped-down copy of the code in inftlmount.c */
1150 static inline int __init
inftl_partscan(struct mtd_info
*mtd
, struct mtd_partition
*parts
)
1152 struct nand_chip
*this = mtd_to_nand(mtd
);
1153 struct doc_priv
*doc
= nand_get_controller_data(this);
1156 struct INFTLMediaHeader
*mh
;
1157 struct INFTLPartition
*ip
;
1160 int vshift
, lastvunit
= 0;
1162 int end
= mtd
->size
;
1164 if (inftl_bbt_write
)
1165 end
-= (INFTL_BBT_RESERVED_BLOCKS
<< this->phys_erase_shift
);
1167 buf
= kmalloc(mtd
->writesize
, GFP_KERNEL
);
1172 if (!find_media_headers(mtd
, buf
, "BNAND", 0))
1174 doc
->mh1_page
= doc
->mh0_page
+ (4096 >> this->page_shift
);
1175 mh
= (struct INFTLMediaHeader
*)buf
;
1177 le32_to_cpus(&mh
->NoOfBootImageBlocks
);
1178 le32_to_cpus(&mh
->NoOfBinaryPartitions
);
1179 le32_to_cpus(&mh
->NoOfBDTLPartitions
);
1180 le32_to_cpus(&mh
->BlockMultiplierBits
);
1181 le32_to_cpus(&mh
->FormatFlags
);
1182 le32_to_cpus(&mh
->PercentUsed
);
1184 printk(KERN_INFO
" bootRecordID = %s\n"
1185 " NoOfBootImageBlocks = %d\n"
1186 " NoOfBinaryPartitions = %d\n"
1187 " NoOfBDTLPartitions = %d\n"
1188 " BlockMultiplerBits = %d\n"
1189 " FormatFlgs = %d\n"
1190 " OsakVersion = %d.%d.%d.%d\n"
1191 " PercentUsed = %d\n",
1192 mh
->bootRecordID
, mh
->NoOfBootImageBlocks
,
1193 mh
->NoOfBinaryPartitions
,
1194 mh
->NoOfBDTLPartitions
,
1195 mh
->BlockMultiplierBits
, mh
->FormatFlags
,
1196 ((unsigned char *) &mh
->OsakVersion
)[0] & 0xf,
1197 ((unsigned char *) &mh
->OsakVersion
)[1] & 0xf,
1198 ((unsigned char *) &mh
->OsakVersion
)[2] & 0xf,
1199 ((unsigned char *) &mh
->OsakVersion
)[3] & 0xf,
1202 vshift
= this->phys_erase_shift
+ mh
->BlockMultiplierBits
;
1204 blocks
= mtd
->size
>> vshift
;
1205 if (blocks
> 32768) {
1206 printk(KERN_ERR
"BlockMultiplierBits=%d is inconsistent with device size. Aborting.\n", mh
->BlockMultiplierBits
);
1210 blocks
= doc
->chips_per_floor
<< (this->chip_shift
- this->phys_erase_shift
);
1211 if (inftl_bbt_write
&& (blocks
> mtd
->erasesize
)) {
1212 printk(KERN_ERR
"Writeable BBTs spanning more than one erase block are not yet supported. FIX ME!\n");
1216 /* Scan the partitions */
1217 for (i
= 0; (i
< 4); i
++) {
1218 ip
= &(mh
->Partitions
[i
]);
1219 le32_to_cpus(&ip
->virtualUnits
);
1220 le32_to_cpus(&ip
->firstUnit
);
1221 le32_to_cpus(&ip
->lastUnit
);
1222 le32_to_cpus(&ip
->flags
);
1223 le32_to_cpus(&ip
->spareUnits
);
1224 le32_to_cpus(&ip
->Reserved0
);
1226 printk(KERN_INFO
" PARTITION[%d] ->\n"
1227 " virtualUnits = %d\n"
1231 " spareUnits = %d\n",
1232 i
, ip
->virtualUnits
, ip
->firstUnit
,
1233 ip
->lastUnit
, ip
->flags
,
1236 if ((show_firmware_partition
== 1) &&
1237 (i
== 0) && (ip
->firstUnit
> 0)) {
1238 parts
[0].name
= " DiskOnChip IPL / Media Header partition";
1239 parts
[0].offset
= 0;
1240 parts
[0].size
= mtd
->erasesize
* ip
->firstUnit
;
1244 if (ip
->flags
& INFTL_BINARY
)
1245 parts
[numparts
].name
= " DiskOnChip BDK partition";
1247 parts
[numparts
].name
= " DiskOnChip BDTL partition";
1248 parts
[numparts
].offset
= ip
->firstUnit
<< vshift
;
1249 parts
[numparts
].size
= (1 + ip
->lastUnit
- ip
->firstUnit
) << vshift
;
1251 if (ip
->lastUnit
> lastvunit
)
1252 lastvunit
= ip
->lastUnit
;
1253 if (ip
->flags
& INFTL_LAST
)
1257 if ((lastvunit
<< vshift
) < end
) {
1258 parts
[numparts
].name
= " DiskOnChip Remainder partition";
1259 parts
[numparts
].offset
= lastvunit
<< vshift
;
1260 parts
[numparts
].size
= end
- parts
[numparts
].offset
;
1269 static int __init
nftl_scan_bbt(struct mtd_info
*mtd
)
1272 struct nand_chip
*this = mtd_to_nand(mtd
);
1273 struct doc_priv
*doc
= nand_get_controller_data(this);
1274 struct mtd_partition parts
[2];
1276 memset((char *)parts
, 0, sizeof(parts
));
1277 /* On NFTL, we have to find the media headers before we can read the
1278 BBTs, since they're stored in the media header eraseblocks. */
1279 numparts
= nftl_partscan(mtd
, parts
);
1282 this->bbt_td
->options
= NAND_BBT_ABSPAGE
| NAND_BBT_8BIT
|
1283 NAND_BBT_SAVECONTENT
| NAND_BBT_WRITE
|
1285 this->bbt_td
->veroffs
= 7;
1286 this->bbt_td
->pages
[0] = doc
->mh0_page
+ 1;
1287 if (doc
->mh1_page
!= -1) {
1288 this->bbt_md
->options
= NAND_BBT_ABSPAGE
| NAND_BBT_8BIT
|
1289 NAND_BBT_SAVECONTENT
| NAND_BBT_WRITE
|
1291 this->bbt_md
->veroffs
= 7;
1292 this->bbt_md
->pages
[0] = doc
->mh1_page
+ 1;
1294 this->bbt_md
= NULL
;
1297 ret
= this->scan_bbt(mtd
);
1301 return mtd_device_register(mtd
, parts
, no_autopart
? 0 : numparts
);
1304 static int __init
inftl_scan_bbt(struct mtd_info
*mtd
)
1307 struct nand_chip
*this = mtd_to_nand(mtd
);
1308 struct doc_priv
*doc
= nand_get_controller_data(this);
1309 struct mtd_partition parts
[5];
1311 if (this->numchips
> doc
->chips_per_floor
) {
1312 printk(KERN_ERR
"Multi-floor INFTL devices not yet supported.\n");
1316 if (DoC_is_MillenniumPlus(doc
)) {
1317 this->bbt_td
->options
= NAND_BBT_2BIT
| NAND_BBT_ABSPAGE
;
1318 if (inftl_bbt_write
)
1319 this->bbt_td
->options
|= NAND_BBT_WRITE
;
1320 this->bbt_td
->pages
[0] = 2;
1321 this->bbt_md
= NULL
;
1323 this->bbt_td
->options
= NAND_BBT_LASTBLOCK
| NAND_BBT_8BIT
| NAND_BBT_VERSION
;
1324 if (inftl_bbt_write
)
1325 this->bbt_td
->options
|= NAND_BBT_WRITE
;
1326 this->bbt_td
->offs
= 8;
1327 this->bbt_td
->len
= 8;
1328 this->bbt_td
->veroffs
= 7;
1329 this->bbt_td
->maxblocks
= INFTL_BBT_RESERVED_BLOCKS
;
1330 this->bbt_td
->reserved_block_code
= 0x01;
1331 this->bbt_td
->pattern
= "MSYS_BBT";
1333 this->bbt_md
->options
= NAND_BBT_LASTBLOCK
| NAND_BBT_8BIT
| NAND_BBT_VERSION
;
1334 if (inftl_bbt_write
)
1335 this->bbt_md
->options
|= NAND_BBT_WRITE
;
1336 this->bbt_md
->offs
= 8;
1337 this->bbt_md
->len
= 8;
1338 this->bbt_md
->veroffs
= 7;
1339 this->bbt_md
->maxblocks
= INFTL_BBT_RESERVED_BLOCKS
;
1340 this->bbt_md
->reserved_block_code
= 0x01;
1341 this->bbt_md
->pattern
= "TBB_SYSM";
1344 ret
= this->scan_bbt(mtd
);
1348 memset((char *)parts
, 0, sizeof(parts
));
1349 numparts
= inftl_partscan(mtd
, parts
);
1350 /* At least for now, require the INFTL Media Header. We could probably
1351 do without it for non-INFTL use, since all it gives us is
1352 autopartitioning, but I want to give it more thought. */
1355 return mtd_device_register(mtd
, parts
, no_autopart
? 0 : numparts
);
1358 static inline int __init
doc2000_init(struct mtd_info
*mtd
)
1360 struct nand_chip
*this = mtd_to_nand(mtd
);
1361 struct doc_priv
*doc
= nand_get_controller_data(this);
1363 this->read_byte
= doc2000_read_byte
;
1364 this->write_buf
= doc2000_writebuf
;
1365 this->read_buf
= doc2000_readbuf
;
1366 doc
->late_init
= nftl_scan_bbt
;
1368 doc
->CDSNControl
= CDSN_CTRL_FLASH_IO
| CDSN_CTRL_ECC_IO
;
1369 doc2000_count_chips(mtd
);
1370 mtd
->name
= "DiskOnChip 2000 (NFTL Model)";
1371 return (4 * doc
->chips_per_floor
);
1374 static inline int __init
doc2001_init(struct mtd_info
*mtd
)
1376 struct nand_chip
*this = mtd_to_nand(mtd
);
1377 struct doc_priv
*doc
= nand_get_controller_data(this);
1379 this->read_byte
= doc2001_read_byte
;
1380 this->write_buf
= doc2001_writebuf
;
1381 this->read_buf
= doc2001_readbuf
;
1383 ReadDOC(doc
->virtadr
, ChipID
);
1384 ReadDOC(doc
->virtadr
, ChipID
);
1385 ReadDOC(doc
->virtadr
, ChipID
);
1386 if (ReadDOC(doc
->virtadr
, ChipID
) != DOC_ChipID_DocMil
) {
1387 /* It's not a Millennium; it's one of the newer
1388 DiskOnChip 2000 units with a similar ASIC.
1389 Treat it like a Millennium, except that it
1390 can have multiple chips. */
1391 doc2000_count_chips(mtd
);
1392 mtd
->name
= "DiskOnChip 2000 (INFTL Model)";
1393 doc
->late_init
= inftl_scan_bbt
;
1394 return (4 * doc
->chips_per_floor
);
1396 /* Bog-standard Millennium */
1397 doc
->chips_per_floor
= 1;
1398 mtd
->name
= "DiskOnChip Millennium";
1399 doc
->late_init
= nftl_scan_bbt
;
1404 static inline int __init
doc2001plus_init(struct mtd_info
*mtd
)
1406 struct nand_chip
*this = mtd_to_nand(mtd
);
1407 struct doc_priv
*doc
= nand_get_controller_data(this);
1409 this->read_byte
= doc2001plus_read_byte
;
1410 this->write_buf
= doc2001plus_writebuf
;
1411 this->read_buf
= doc2001plus_readbuf
;
1412 doc
->late_init
= inftl_scan_bbt
;
1413 this->cmd_ctrl
= NULL
;
1414 this->select_chip
= doc2001plus_select_chip
;
1415 this->cmdfunc
= doc2001plus_command
;
1416 this->ecc
.hwctl
= doc2001plus_enable_hwecc
;
1418 doc
->chips_per_floor
= 1;
1419 mtd
->name
= "DiskOnChip Millennium Plus";
1424 static int __init
doc_probe(unsigned long physadr
)
1426 unsigned char ChipID
;
1427 struct mtd_info
*mtd
;
1428 struct nand_chip
*nand
;
1429 struct doc_priv
*doc
;
1430 void __iomem
*virtadr
;
1431 unsigned char save_control
;
1432 unsigned char tmp
, tmpb
, tmpc
;
1433 int reg
, len
, numchips
;
1436 if (!request_mem_region(physadr
, DOC_IOREMAP_LEN
, "DiskOnChip"))
1438 virtadr
= ioremap(physadr
, DOC_IOREMAP_LEN
);
1440 printk(KERN_ERR
"Diskonchip ioremap failed: 0x%x bytes at 0x%lx\n", DOC_IOREMAP_LEN
, physadr
);
1445 /* It's not possible to cleanly detect the DiskOnChip - the
1446 * bootup procedure will put the device into reset mode, and
1447 * it's not possible to talk to it without actually writing
1448 * to the DOCControl register. So we store the current contents
1449 * of the DOCControl register's location, in case we later decide
1450 * that it's not a DiskOnChip, and want to put it back how we
1453 save_control
= ReadDOC(virtadr
, DOCControl
);
1455 /* Reset the DiskOnChip ASIC */
1456 WriteDOC(DOC_MODE_CLR_ERR
| DOC_MODE_MDWREN
| DOC_MODE_RESET
, virtadr
, DOCControl
);
1457 WriteDOC(DOC_MODE_CLR_ERR
| DOC_MODE_MDWREN
| DOC_MODE_RESET
, virtadr
, DOCControl
);
1459 /* Enable the DiskOnChip ASIC */
1460 WriteDOC(DOC_MODE_CLR_ERR
| DOC_MODE_MDWREN
| DOC_MODE_NORMAL
, virtadr
, DOCControl
);
1461 WriteDOC(DOC_MODE_CLR_ERR
| DOC_MODE_MDWREN
| DOC_MODE_NORMAL
, virtadr
, DOCControl
);
1463 ChipID
= ReadDOC(virtadr
, ChipID
);
1466 case DOC_ChipID_Doc2k
:
1467 reg
= DoC_2k_ECCStatus
;
1469 case DOC_ChipID_DocMil
:
1472 case DOC_ChipID_DocMilPlus16
:
1473 case DOC_ChipID_DocMilPlus32
:
1475 /* Possible Millennium Plus, need to do more checks */
1476 /* Possibly release from power down mode */
1477 for (tmp
= 0; (tmp
< 4); tmp
++)
1478 ReadDOC(virtadr
, Mplus_Power
);
1480 /* Reset the Millennium Plus ASIC */
1481 tmp
= DOC_MODE_RESET
| DOC_MODE_MDWREN
| DOC_MODE_RST_LAT
| DOC_MODE_BDECT
;
1482 WriteDOC(tmp
, virtadr
, Mplus_DOCControl
);
1483 WriteDOC(~tmp
, virtadr
, Mplus_CtrlConfirm
);
1486 /* Enable the Millennium Plus ASIC */
1487 tmp
= DOC_MODE_NORMAL
| DOC_MODE_MDWREN
| DOC_MODE_RST_LAT
| DOC_MODE_BDECT
;
1488 WriteDOC(tmp
, virtadr
, Mplus_DOCControl
);
1489 WriteDOC(~tmp
, virtadr
, Mplus_CtrlConfirm
);
1492 ChipID
= ReadDOC(virtadr
, ChipID
);
1495 case DOC_ChipID_DocMilPlus16
:
1496 reg
= DoC_Mplus_Toggle
;
1498 case DOC_ChipID_DocMilPlus32
:
1499 printk(KERN_ERR
"DiskOnChip Millennium Plus 32MB is not supported, ignoring.\n");
1510 /* Check the TOGGLE bit in the ECC register */
1511 tmp
= ReadDOC_(virtadr
, reg
) & DOC_TOGGLE_BIT
;
1512 tmpb
= ReadDOC_(virtadr
, reg
) & DOC_TOGGLE_BIT
;
1513 tmpc
= ReadDOC_(virtadr
, reg
) & DOC_TOGGLE_BIT
;
1514 if ((tmp
== tmpb
) || (tmp
!= tmpc
)) {
1515 printk(KERN_WARNING
"Possible DiskOnChip at 0x%lx failed TOGGLE test, dropping.\n", physadr
);
1520 for (mtd
= doclist
; mtd
; mtd
= doc
->nextdoc
) {
1521 unsigned char oldval
;
1522 unsigned char newval
;
1523 nand
= mtd_to_nand(mtd
);
1524 doc
= nand_get_controller_data(nand
);
1525 /* Use the alias resolution register to determine if this is
1526 in fact the same DOC aliased to a new address. If writes
1527 to one chip's alias resolution register change the value on
1528 the other chip, they're the same chip. */
1529 if (ChipID
== DOC_ChipID_DocMilPlus16
) {
1530 oldval
= ReadDOC(doc
->virtadr
, Mplus_AliasResolution
);
1531 newval
= ReadDOC(virtadr
, Mplus_AliasResolution
);
1533 oldval
= ReadDOC(doc
->virtadr
, AliasResolution
);
1534 newval
= ReadDOC(virtadr
, AliasResolution
);
1536 if (oldval
!= newval
)
1538 if (ChipID
== DOC_ChipID_DocMilPlus16
) {
1539 WriteDOC(~newval
, virtadr
, Mplus_AliasResolution
);
1540 oldval
= ReadDOC(doc
->virtadr
, Mplus_AliasResolution
);
1541 WriteDOC(newval
, virtadr
, Mplus_AliasResolution
); // restore it
1543 WriteDOC(~newval
, virtadr
, AliasResolution
);
1544 oldval
= ReadDOC(doc
->virtadr
, AliasResolution
);
1545 WriteDOC(newval
, virtadr
, AliasResolution
); // restore it
1548 if (oldval
== newval
) {
1549 printk(KERN_DEBUG
"Found alias of DOC at 0x%lx to 0x%lx\n", doc
->physadr
, physadr
);
1554 printk(KERN_NOTICE
"DiskOnChip found at 0x%lx\n", physadr
);
1556 len
= sizeof(struct nand_chip
) + sizeof(struct doc_priv
) +
1557 (2 * sizeof(struct nand_bbt_descr
));
1558 nand
= kzalloc(len
, GFP_KERNEL
);
1564 mtd
= nand_to_mtd(nand
);
1565 doc
= (struct doc_priv
*) (nand
+ 1);
1566 nand
->bbt_td
= (struct nand_bbt_descr
*) (doc
+ 1);
1567 nand
->bbt_md
= nand
->bbt_td
+ 1;
1569 mtd
->owner
= THIS_MODULE
;
1570 mtd_set_ooblayout(mtd
, &doc200x_ooblayout_ops
);
1572 nand_set_controller_data(nand
, doc
);
1573 nand
->select_chip
= doc200x_select_chip
;
1574 nand
->cmd_ctrl
= doc200x_hwcontrol
;
1575 nand
->dev_ready
= doc200x_dev_ready
;
1576 nand
->waitfunc
= doc200x_wait
;
1577 nand
->block_bad
= doc200x_block_bad
;
1578 nand
->ecc
.hwctl
= doc200x_enable_hwecc
;
1579 nand
->ecc
.calculate
= doc200x_calculate_ecc
;
1580 nand
->ecc
.correct
= doc200x_correct_data
;
1582 nand
->ecc
.mode
= NAND_ECC_HW_SYNDROME
;
1583 nand
->ecc
.size
= 512;
1584 nand
->ecc
.bytes
= 6;
1585 nand
->ecc
.strength
= 2;
1586 nand
->ecc
.options
= NAND_ECC_GENERIC_ERASED_CHECK
;
1587 nand
->bbt_options
= NAND_BBT_USE_FLASH
;
1588 /* Skip the automatic BBT scan so we can run it manually */
1589 nand
->options
|= NAND_SKIP_BBTSCAN
;
1591 doc
->physadr
= physadr
;
1592 doc
->virtadr
= virtadr
;
1593 doc
->ChipID
= ChipID
;
1598 doc
->nextdoc
= doclist
;
1600 if (ChipID
== DOC_ChipID_Doc2k
)
1601 numchips
= doc2000_init(mtd
);
1602 else if (ChipID
== DOC_ChipID_DocMilPlus16
)
1603 numchips
= doc2001plus_init(mtd
);
1605 numchips
= doc2001_init(mtd
);
1607 if ((ret
= nand_scan(mtd
, numchips
)) || (ret
= doc
->late_init(mtd
))) {
1608 /* DBB note: i believe nand_release is necessary here, as
1609 buffers may have been allocated in nand_base. Check with
1611 /* nand_release will call mtd_device_unregister, but we
1612 haven't yet added it. This is handled without incident by
1613 mtd_device_unregister, as far as I can tell. */
1624 /* Put back the contents of the DOCControl register, in case it's not
1625 actually a DiskOnChip. */
1626 WriteDOC(save_control
, virtadr
, DOCControl
);
1631 release_mem_region(physadr
, DOC_IOREMAP_LEN
);
1636 static void release_nanddoc(void)
1638 struct mtd_info
*mtd
, *nextmtd
;
1639 struct nand_chip
*nand
;
1640 struct doc_priv
*doc
;
1642 for (mtd
= doclist
; mtd
; mtd
= nextmtd
) {
1643 nand
= mtd_to_nand(mtd
);
1644 doc
= nand_get_controller_data(nand
);
1646 nextmtd
= doc
->nextdoc
;
1648 iounmap(doc
->virtadr
);
1649 release_mem_region(doc
->physadr
, DOC_IOREMAP_LEN
);
1654 static int __init
init_nanddoc(void)
1658 /* We could create the decoder on demand, if memory is a concern.
1659 * This way we have it handy, if an error happens
1661 * Symbolsize is 10 (bits)
1662 * Primitve polynomial is x^10+x^3+1
1663 * first consecutive root is 510
1664 * primitve element to generate roots = 1
1665 * generator polinomial degree = 4
1667 rs_decoder
= init_rs(10, 0x409, FCR
, 1, NROOTS
);
1669 printk(KERN_ERR
"DiskOnChip: Could not create a RS decoder\n");
1673 if (doc_config_location
) {
1674 printk(KERN_INFO
"Using configured DiskOnChip probe address 0x%lx\n", doc_config_location
);
1675 ret
= doc_probe(doc_config_location
);
1679 for (i
= 0; (doc_locations
[i
] != 0xffffffff); i
++) {
1680 doc_probe(doc_locations
[i
]);
1683 /* No banner message any more. Print a message if no DiskOnChip
1684 found, so the user knows we at least tried. */
1686 printk(KERN_INFO
"No valid DiskOnChip devices found\n");
1692 free_rs(rs_decoder
);
1696 static void __exit
cleanup_nanddoc(void)
1698 /* Cleanup the nand/DoC resources */
1701 /* Free the reed solomon resources */
1703 free_rs(rs_decoder
);
1707 module_init(init_nanddoc
);
1708 module_exit(cleanup_nanddoc
);
1710 MODULE_LICENSE("GPL");
1711 MODULE_AUTHOR("David Woodhouse <dwmw2@infradead.org>");
1712 MODULE_DESCRIPTION("M-Systems DiskOnChip 2000, Millennium and Millennium Plus device driver");