2 * (C) 2003 Red Hat, Inc.
3 * (C) 2004 Dan Brown <dan_brown@ieee.org>
4 * (C) 2004 Kalev Lember <kalev@smartlink.ee>
6 * Author: David Woodhouse <dwmw2@infradead.org>
7 * Additional Diskonchip 2000 and Millennium support by Dan Brown <dan_brown@ieee.org>
8 * Diskonchip Millennium Plus support by Kalev Lember <kalev@smartlink.ee>
10 * Error correction code lifted from the old docecc code
11 * Author: Fabrice Bellard (fabrice.bellard@netgem.com)
12 * Copyright (C) 2000 Netgem S.A.
13 * converted to the generic Reed-Solomon library by Thomas Gleixner <tglx@linutronix.de>
15 * Interface to generic NAND code for M-Systems DiskOnChip devices
18 #include <linux/kernel.h>
19 #include <linux/init.h>
20 #include <linux/sched.h>
21 #include <linux/delay.h>
22 #include <linux/rslib.h>
23 #include <linux/moduleparam.h>
24 #include <linux/slab.h>
27 #include <linux/mtd/mtd.h>
28 #include <linux/mtd/rawnand.h>
29 #include <linux/mtd/doc2000.h>
30 #include <linux/mtd/partitions.h>
31 #include <linux/mtd/inftl.h>
32 #include <linux/module.h>
34 /* Where to look for the devices? */
35 #ifndef CONFIG_MTD_NAND_DISKONCHIP_PROBE_ADDRESS
36 #define CONFIG_MTD_NAND_DISKONCHIP_PROBE_ADDRESS 0
39 static unsigned long doc_locations
[] __initdata
= {
40 #if defined (__alpha__) || defined(__i386__) || defined(__x86_64__)
41 #ifdef CONFIG_MTD_NAND_DISKONCHIP_PROBE_HIGH
42 0xfffc8000, 0xfffca000, 0xfffcc000, 0xfffce000,
43 0xfffd0000, 0xfffd2000, 0xfffd4000, 0xfffd6000,
44 0xfffd8000, 0xfffda000, 0xfffdc000, 0xfffde000,
45 0xfffe0000, 0xfffe2000, 0xfffe4000, 0xfffe6000,
46 0xfffe8000, 0xfffea000, 0xfffec000, 0xfffee000,
48 0xc8000, 0xca000, 0xcc000, 0xce000,
49 0xd0000, 0xd2000, 0xd4000, 0xd6000,
50 0xd8000, 0xda000, 0xdc000, 0xde000,
51 0xe0000, 0xe2000, 0xe4000, 0xe6000,
52 0xe8000, 0xea000, 0xec000, 0xee000,
57 static struct mtd_info
*doclist
= NULL
;
60 void __iomem
*virtadr
;
61 unsigned long physadr
;
64 int chips_per_floor
; /* The number of chips detected on each floor */
69 struct rs_control
*rs_decoder
;
70 struct mtd_info
*nextdoc
;
72 /* Handle the last stage of initialization (BBT scan, partitioning) */
73 int (*late_init
)(struct mtd_info
*mtd
);
76 /* This is the ecc value computed by the HW ecc generator upon writing an empty
77 page, one with all 0xff for data. */
78 static u_char empty_write_ecc
[6] = { 0x4b, 0x00, 0xe2, 0x0e, 0x93, 0xf7 };
80 #define INFTL_BBT_RESERVED_BLOCKS 4
82 #define DoC_is_MillenniumPlus(doc) ((doc)->ChipID == DOC_ChipID_DocMilPlus16 || (doc)->ChipID == DOC_ChipID_DocMilPlus32)
83 #define DoC_is_Millennium(doc) ((doc)->ChipID == DOC_ChipID_DocMil)
84 #define DoC_is_2000(doc) ((doc)->ChipID == DOC_ChipID_Doc2k)
86 static void doc200x_hwcontrol(struct mtd_info
*mtd
, int cmd
,
87 unsigned int bitmask
);
88 static void doc200x_select_chip(struct mtd_info
*mtd
, int chip
);
91 module_param(debug
, int, 0);
93 static int try_dword
= 1;
94 module_param(try_dword
, int, 0);
96 static int no_ecc_failures
= 0;
97 module_param(no_ecc_failures
, int, 0);
99 static int no_autopart
= 0;
100 module_param(no_autopart
, int, 0);
102 static int show_firmware_partition
= 0;
103 module_param(show_firmware_partition
, int, 0);
105 #ifdef CONFIG_MTD_NAND_DISKONCHIP_BBTWRITE
106 static int inftl_bbt_write
= 1;
108 static int inftl_bbt_write
= 0;
110 module_param(inftl_bbt_write
, int, 0);
112 static unsigned long doc_config_location
= CONFIG_MTD_NAND_DISKONCHIP_PROBE_ADDRESS
;
113 module_param(doc_config_location
, ulong
, 0);
114 MODULE_PARM_DESC(doc_config_location
, "Physical memory address at which to probe for DiskOnChip");
116 /* Sector size for HW ECC */
117 #define SECTOR_SIZE 512
118 /* The sector bytes are packed into NB_DATA 10 bit words */
119 #define NB_DATA (((SECTOR_SIZE + 1) * 8 + 6) / 10)
120 /* Number of roots */
122 /* First consective root */
124 /* Number of symbols */
128 * The HW decoder in the DoC ASIC's provides us a error syndrome,
129 * which we must convert to a standard syndrome usable by the generic
130 * Reed-Solomon library code.
132 * Fabrice Bellard figured this out in the old docecc code. I added
133 * some comments, improved a minor bit and converted it to make use
134 * of the generic Reed-Solomon library. tglx
136 static int doc_ecc_decode(struct rs_control
*rs
, uint8_t *data
, uint8_t *ecc
)
138 int i
, j
, nerr
, errpos
[8];
140 uint16_t ds
[4], s
[5], tmp
, errval
[8], syn
[4];
141 struct rs_codec
*cd
= rs
->codec
;
143 memset(syn
, 0, sizeof(syn
));
144 /* Convert the ecc bytes into words */
145 ds
[0] = ((ecc
[4] & 0xff) >> 0) | ((ecc
[5] & 0x03) << 8);
146 ds
[1] = ((ecc
[5] & 0xfc) >> 2) | ((ecc
[2] & 0x0f) << 6);
147 ds
[2] = ((ecc
[2] & 0xf0) >> 4) | ((ecc
[3] & 0x3f) << 4);
148 ds
[3] = ((ecc
[3] & 0xc0) >> 6) | ((ecc
[0] & 0xff) << 2);
151 /* Initialize the syndrome buffer */
152 for (i
= 0; i
< NROOTS
; i
++)
156 * s[i] = ds[3]x^3 + ds[2]x^2 + ds[1]x^1 + ds[0]
157 * where x = alpha^(FCR + i)
159 for (j
= 1; j
< NROOTS
; j
++) {
162 tmp
= cd
->index_of
[ds
[j
]];
163 for (i
= 0; i
< NROOTS
; i
++)
164 s
[i
] ^= cd
->alpha_to
[rs_modnn(cd
, tmp
+ (FCR
+ i
) * j
)];
167 /* Calc syn[i] = s[i] / alpha^(v + i) */
168 for (i
= 0; i
< NROOTS
; i
++) {
170 syn
[i
] = rs_modnn(cd
, cd
->index_of
[s
[i
]] + (NN
- FCR
- i
));
172 /* Call the decoder library */
173 nerr
= decode_rs16(rs
, NULL
, NULL
, 1019, syn
, 0, errpos
, 0, errval
);
175 /* Incorrectable errors ? */
180 * Correct the errors. The bitpositions are a bit of magic,
181 * but they are given by the design of the de/encoder circuit
184 for (i
= 0; i
< nerr
; i
++) {
185 int index
, bitpos
, pos
= 1015 - errpos
[i
];
187 if (pos
>= NB_DATA
&& pos
< 1019)
190 /* extract bit position (MSB first) */
191 pos
= 10 * (NB_DATA
- 1 - pos
) - 6;
192 /* now correct the following 10 bits. At most two bytes
193 can be modified since pos is even */
194 index
= (pos
>> 3) ^ 1;
196 if ((index
>= 0 && index
< SECTOR_SIZE
) || index
== (SECTOR_SIZE
+ 1)) {
197 val
= (uint8_t) (errval
[i
] >> (2 + bitpos
));
199 if (index
< SECTOR_SIZE
)
202 index
= ((pos
>> 3) + 1) ^ 1;
203 bitpos
= (bitpos
+ 10) & 7;
206 if ((index
>= 0 && index
< SECTOR_SIZE
) || index
== (SECTOR_SIZE
+ 1)) {
207 val
= (uint8_t) (errval
[i
] << (8 - bitpos
));
209 if (index
< SECTOR_SIZE
)
214 /* If the parity is wrong, no rescue possible */
215 return parity
? -EBADMSG
: nerr
;
218 static void DoC_Delay(struct doc_priv
*doc
, unsigned short cycles
)
223 for (i
= 0; i
< cycles
; i
++) {
224 if (DoC_is_Millennium(doc
))
225 dummy
= ReadDOC(doc
->virtadr
, NOP
);
226 else if (DoC_is_MillenniumPlus(doc
))
227 dummy
= ReadDOC(doc
->virtadr
, Mplus_NOP
);
229 dummy
= ReadDOC(doc
->virtadr
, DOCStatus
);
234 #define CDSN_CTRL_FR_B_MASK (CDSN_CTRL_FR_B0 | CDSN_CTRL_FR_B1)
236 /* DOC_WaitReady: Wait for RDY line to be asserted by the flash chip */
237 static int _DoC_WaitReady(struct doc_priv
*doc
)
239 void __iomem
*docptr
= doc
->virtadr
;
240 unsigned long timeo
= jiffies
+ (HZ
* 10);
243 printk("_DoC_WaitReady...\n");
244 /* Out-of-line routine to wait for chip response */
245 if (DoC_is_MillenniumPlus(doc
)) {
246 while ((ReadDOC(docptr
, Mplus_FlashControl
) & CDSN_CTRL_FR_B_MASK
) != CDSN_CTRL_FR_B_MASK
) {
247 if (time_after(jiffies
, timeo
)) {
248 printk("_DoC_WaitReady timed out.\n");
255 while (!(ReadDOC(docptr
, CDSNControl
) & CDSN_CTRL_FR_B
)) {
256 if (time_after(jiffies
, timeo
)) {
257 printk("_DoC_WaitReady timed out.\n");
268 static inline int DoC_WaitReady(struct doc_priv
*doc
)
270 void __iomem
*docptr
= doc
->virtadr
;
273 if (DoC_is_MillenniumPlus(doc
)) {
276 if ((ReadDOC(docptr
, Mplus_FlashControl
) & CDSN_CTRL_FR_B_MASK
) != CDSN_CTRL_FR_B_MASK
)
277 /* Call the out-of-line routine to wait */
278 ret
= _DoC_WaitReady(doc
);
282 if (!(ReadDOC(docptr
, CDSNControl
) & CDSN_CTRL_FR_B
))
283 /* Call the out-of-line routine to wait */
284 ret
= _DoC_WaitReady(doc
);
289 printk("DoC_WaitReady OK\n");
293 static void doc2000_write_byte(struct mtd_info
*mtd
, u_char datum
)
295 struct nand_chip
*this = mtd_to_nand(mtd
);
296 struct doc_priv
*doc
= nand_get_controller_data(this);
297 void __iomem
*docptr
= doc
->virtadr
;
300 printk("write_byte %02x\n", datum
);
301 WriteDOC(datum
, docptr
, CDSNSlowIO
);
302 WriteDOC(datum
, docptr
, 2k_CDSN_IO
);
305 static u_char
doc2000_read_byte(struct mtd_info
*mtd
)
307 struct nand_chip
*this = mtd_to_nand(mtd
);
308 struct doc_priv
*doc
= nand_get_controller_data(this);
309 void __iomem
*docptr
= doc
->virtadr
;
312 ReadDOC(docptr
, CDSNSlowIO
);
314 ret
= ReadDOC(docptr
, 2k_CDSN_IO
);
316 printk("read_byte returns %02x\n", ret
);
320 static void doc2000_writebuf(struct mtd_info
*mtd
, const u_char
*buf
, int len
)
322 struct nand_chip
*this = mtd_to_nand(mtd
);
323 struct doc_priv
*doc
= nand_get_controller_data(this);
324 void __iomem
*docptr
= doc
->virtadr
;
327 printk("writebuf of %d bytes: ", len
);
328 for (i
= 0; i
< len
; i
++) {
329 WriteDOC_(buf
[i
], docptr
, DoC_2k_CDSN_IO
+ i
);
331 printk("%02x ", buf
[i
]);
337 static void doc2000_readbuf(struct mtd_info
*mtd
, u_char
*buf
, int len
)
339 struct nand_chip
*this = mtd_to_nand(mtd
);
340 struct doc_priv
*doc
= nand_get_controller_data(this);
341 void __iomem
*docptr
= doc
->virtadr
;
345 printk("readbuf of %d bytes: ", len
);
347 for (i
= 0; i
< len
; i
++) {
348 buf
[i
] = ReadDOC(docptr
, 2k_CDSN_IO
+ i
);
352 static void doc2000_readbuf_dword(struct mtd_info
*mtd
, u_char
*buf
, int len
)
354 struct nand_chip
*this = mtd_to_nand(mtd
);
355 struct doc_priv
*doc
= nand_get_controller_data(this);
356 void __iomem
*docptr
= doc
->virtadr
;
360 printk("readbuf_dword of %d bytes: ", len
);
362 if (unlikely((((unsigned long)buf
) | len
) & 3)) {
363 for (i
= 0; i
< len
; i
++) {
364 *(uint8_t *) (&buf
[i
]) = ReadDOC(docptr
, 2k_CDSN_IO
+ i
);
367 for (i
= 0; i
< len
; i
+= 4) {
368 *(uint32_t *) (&buf
[i
]) = readl(docptr
+ DoC_2k_CDSN_IO
+ i
);
373 static uint16_t __init
doc200x_ident_chip(struct mtd_info
*mtd
, int nr
)
375 struct nand_chip
*this = mtd_to_nand(mtd
);
376 struct doc_priv
*doc
= nand_get_controller_data(this);
379 doc200x_select_chip(mtd
, nr
);
380 doc200x_hwcontrol(mtd
, NAND_CMD_READID
,
381 NAND_CTRL_CLE
| NAND_CTRL_CHANGE
);
382 doc200x_hwcontrol(mtd
, 0, NAND_CTRL_ALE
| NAND_CTRL_CHANGE
);
383 doc200x_hwcontrol(mtd
, NAND_CMD_NONE
, NAND_NCE
| NAND_CTRL_CHANGE
);
385 /* We can't use dev_ready here, but at least we wait for the
386 * command to complete
390 ret
= this->read_byte(mtd
) << 8;
391 ret
|= this->read_byte(mtd
);
393 if (doc
->ChipID
== DOC_ChipID_Doc2k
&& try_dword
&& !nr
) {
394 /* First chip probe. See if we get same results by 32-bit access */
399 void __iomem
*docptr
= doc
->virtadr
;
401 doc200x_hwcontrol(mtd
, NAND_CMD_READID
,
402 NAND_CTRL_CLE
| NAND_CTRL_CHANGE
);
403 doc200x_hwcontrol(mtd
, 0, NAND_CTRL_ALE
| NAND_CTRL_CHANGE
);
404 doc200x_hwcontrol(mtd
, NAND_CMD_NONE
,
405 NAND_NCE
| NAND_CTRL_CHANGE
);
409 ident
.dword
= readl(docptr
+ DoC_2k_CDSN_IO
);
410 if (((ident
.byte
[0] << 8) | ident
.byte
[1]) == ret
) {
411 pr_info("DiskOnChip 2000 responds to DWORD access\n");
412 this->read_buf
= &doc2000_readbuf_dword
;
419 static void __init
doc2000_count_chips(struct mtd_info
*mtd
)
421 struct nand_chip
*this = mtd_to_nand(mtd
);
422 struct doc_priv
*doc
= nand_get_controller_data(this);
426 /* Max 4 chips per floor on DiskOnChip 2000 */
427 doc
->chips_per_floor
= 4;
429 /* Find out what the first chip is */
430 mfrid
= doc200x_ident_chip(mtd
, 0);
432 /* Find how many chips in each floor. */
433 for (i
= 1; i
< 4; i
++) {
434 if (doc200x_ident_chip(mtd
, i
) != mfrid
)
437 doc
->chips_per_floor
= i
;
438 pr_debug("Detected %d chips per floor.\n", i
);
441 static int doc200x_wait(struct mtd_info
*mtd
, struct nand_chip
*this)
443 struct doc_priv
*doc
= nand_get_controller_data(this);
448 nand_status_op(this, NULL
);
450 status
= (int)this->read_byte(mtd
);
455 static void doc2001_write_byte(struct mtd_info
*mtd
, u_char datum
)
457 struct nand_chip
*this = mtd_to_nand(mtd
);
458 struct doc_priv
*doc
= nand_get_controller_data(this);
459 void __iomem
*docptr
= doc
->virtadr
;
461 WriteDOC(datum
, docptr
, CDSNSlowIO
);
462 WriteDOC(datum
, docptr
, Mil_CDSN_IO
);
463 WriteDOC(datum
, docptr
, WritePipeTerm
);
466 static u_char
doc2001_read_byte(struct mtd_info
*mtd
)
468 struct nand_chip
*this = mtd_to_nand(mtd
);
469 struct doc_priv
*doc
= nand_get_controller_data(this);
470 void __iomem
*docptr
= doc
->virtadr
;
472 //ReadDOC(docptr, CDSNSlowIO);
473 /* 11.4.5 -- delay twice to allow extended length cycle */
475 ReadDOC(docptr
, ReadPipeInit
);
476 //return ReadDOC(docptr, Mil_CDSN_IO);
477 return ReadDOC(docptr
, LastDataRead
);
480 static void doc2001_writebuf(struct mtd_info
*mtd
, const u_char
*buf
, int len
)
482 struct nand_chip
*this = mtd_to_nand(mtd
);
483 struct doc_priv
*doc
= nand_get_controller_data(this);
484 void __iomem
*docptr
= doc
->virtadr
;
487 for (i
= 0; i
< len
; i
++)
488 WriteDOC_(buf
[i
], docptr
, DoC_Mil_CDSN_IO
+ i
);
489 /* Terminate write pipeline */
490 WriteDOC(0x00, docptr
, WritePipeTerm
);
493 static void doc2001_readbuf(struct mtd_info
*mtd
, u_char
*buf
, int len
)
495 struct nand_chip
*this = mtd_to_nand(mtd
);
496 struct doc_priv
*doc
= nand_get_controller_data(this);
497 void __iomem
*docptr
= doc
->virtadr
;
500 /* Start read pipeline */
501 ReadDOC(docptr
, ReadPipeInit
);
503 for (i
= 0; i
< len
- 1; i
++)
504 buf
[i
] = ReadDOC(docptr
, Mil_CDSN_IO
+ (i
& 0xff));
506 /* Terminate read pipeline */
507 buf
[i
] = ReadDOC(docptr
, LastDataRead
);
510 static u_char
doc2001plus_read_byte(struct mtd_info
*mtd
)
512 struct nand_chip
*this = mtd_to_nand(mtd
);
513 struct doc_priv
*doc
= nand_get_controller_data(this);
514 void __iomem
*docptr
= doc
->virtadr
;
517 ReadDOC(docptr
, Mplus_ReadPipeInit
);
518 ReadDOC(docptr
, Mplus_ReadPipeInit
);
519 ret
= ReadDOC(docptr
, Mplus_LastDataRead
);
521 printk("read_byte returns %02x\n", ret
);
525 static void doc2001plus_writebuf(struct mtd_info
*mtd
, const u_char
*buf
, int len
)
527 struct nand_chip
*this = mtd_to_nand(mtd
);
528 struct doc_priv
*doc
= nand_get_controller_data(this);
529 void __iomem
*docptr
= doc
->virtadr
;
533 printk("writebuf of %d bytes: ", len
);
534 for (i
= 0; i
< len
; i
++) {
535 WriteDOC_(buf
[i
], docptr
, DoC_Mil_CDSN_IO
+ i
);
537 printk("%02x ", buf
[i
]);
543 static void doc2001plus_readbuf(struct mtd_info
*mtd
, u_char
*buf
, int len
)
545 struct nand_chip
*this = mtd_to_nand(mtd
);
546 struct doc_priv
*doc
= nand_get_controller_data(this);
547 void __iomem
*docptr
= doc
->virtadr
;
551 printk("readbuf of %d bytes: ", len
);
553 /* Start read pipeline */
554 ReadDOC(docptr
, Mplus_ReadPipeInit
);
555 ReadDOC(docptr
, Mplus_ReadPipeInit
);
557 for (i
= 0; i
< len
- 2; i
++) {
558 buf
[i
] = ReadDOC(docptr
, Mil_CDSN_IO
);
560 printk("%02x ", buf
[i
]);
563 /* Terminate read pipeline */
564 buf
[len
- 2] = ReadDOC(docptr
, Mplus_LastDataRead
);
566 printk("%02x ", buf
[len
- 2]);
567 buf
[len
- 1] = ReadDOC(docptr
, Mplus_LastDataRead
);
569 printk("%02x ", buf
[len
- 1]);
574 static void doc2001plus_select_chip(struct mtd_info
*mtd
, int chip
)
576 struct nand_chip
*this = mtd_to_nand(mtd
);
577 struct doc_priv
*doc
= nand_get_controller_data(this);
578 void __iomem
*docptr
= doc
->virtadr
;
582 printk("select chip (%d)\n", chip
);
585 /* Disable flash internally */
586 WriteDOC(0, docptr
, Mplus_FlashSelect
);
590 floor
= chip
/ doc
->chips_per_floor
;
591 chip
-= (floor
* doc
->chips_per_floor
);
593 /* Assert ChipEnable and deassert WriteProtect */
594 WriteDOC((DOC_FLASH_CE
), docptr
, Mplus_FlashSelect
);
598 doc
->curfloor
= floor
;
601 static void doc200x_select_chip(struct mtd_info
*mtd
, int chip
)
603 struct nand_chip
*this = mtd_to_nand(mtd
);
604 struct doc_priv
*doc
= nand_get_controller_data(this);
605 void __iomem
*docptr
= doc
->virtadr
;
609 printk("select chip (%d)\n", chip
);
614 floor
= chip
/ doc
->chips_per_floor
;
615 chip
-= (floor
* doc
->chips_per_floor
);
617 /* 11.4.4 -- deassert CE before changing chip */
618 doc200x_hwcontrol(mtd
, NAND_CMD_NONE
, 0 | NAND_CTRL_CHANGE
);
620 WriteDOC(floor
, docptr
, FloorSelect
);
621 WriteDOC(chip
, docptr
, CDSNDeviceSelect
);
623 doc200x_hwcontrol(mtd
, NAND_CMD_NONE
, NAND_NCE
| NAND_CTRL_CHANGE
);
626 doc
->curfloor
= floor
;
629 #define CDSN_CTRL_MSK (CDSN_CTRL_CE | CDSN_CTRL_CLE | CDSN_CTRL_ALE)
631 static void doc200x_hwcontrol(struct mtd_info
*mtd
, int cmd
,
634 struct nand_chip
*this = mtd_to_nand(mtd
);
635 struct doc_priv
*doc
= nand_get_controller_data(this);
636 void __iomem
*docptr
= doc
->virtadr
;
638 if (ctrl
& NAND_CTRL_CHANGE
) {
639 doc
->CDSNControl
&= ~CDSN_CTRL_MSK
;
640 doc
->CDSNControl
|= ctrl
& CDSN_CTRL_MSK
;
642 printk("hwcontrol(%d): %02x\n", cmd
, doc
->CDSNControl
);
643 WriteDOC(doc
->CDSNControl
, docptr
, CDSNControl
);
644 /* 11.4.3 -- 4 NOPs after CSDNControl write */
647 if (cmd
!= NAND_CMD_NONE
) {
648 if (DoC_is_2000(doc
))
649 doc2000_write_byte(mtd
, cmd
);
651 doc2001_write_byte(mtd
, cmd
);
655 static void doc2001plus_command(struct mtd_info
*mtd
, unsigned command
, int column
, int page_addr
)
657 struct nand_chip
*this = mtd_to_nand(mtd
);
658 struct doc_priv
*doc
= nand_get_controller_data(this);
659 void __iomem
*docptr
= doc
->virtadr
;
662 * Must terminate write pipeline before sending any commands
665 if (command
== NAND_CMD_PAGEPROG
) {
666 WriteDOC(0x00, docptr
, Mplus_WritePipeTerm
);
667 WriteDOC(0x00, docptr
, Mplus_WritePipeTerm
);
671 * Write out the command to the device.
673 if (command
== NAND_CMD_SEQIN
) {
676 if (column
>= mtd
->writesize
) {
678 column
-= mtd
->writesize
;
679 readcmd
= NAND_CMD_READOOB
;
680 } else if (column
< 256) {
681 /* First 256 bytes --> READ0 */
682 readcmd
= NAND_CMD_READ0
;
685 readcmd
= NAND_CMD_READ1
;
687 WriteDOC(readcmd
, docptr
, Mplus_FlashCmd
);
689 WriteDOC(command
, docptr
, Mplus_FlashCmd
);
690 WriteDOC(0, docptr
, Mplus_WritePipeTerm
);
691 WriteDOC(0, docptr
, Mplus_WritePipeTerm
);
693 if (column
!= -1 || page_addr
!= -1) {
694 /* Serially input address */
696 /* Adjust columns for 16 bit buswidth */
697 if (this->options
& NAND_BUSWIDTH_16
&&
698 !nand_opcode_8bits(command
))
700 WriteDOC(column
, docptr
, Mplus_FlashAddress
);
702 if (page_addr
!= -1) {
703 WriteDOC((unsigned char)(page_addr
& 0xff), docptr
, Mplus_FlashAddress
);
704 WriteDOC((unsigned char)((page_addr
>> 8) & 0xff), docptr
, Mplus_FlashAddress
);
705 if (this->options
& NAND_ROW_ADDR_3
) {
706 WriteDOC((unsigned char)((page_addr
>> 16) & 0x0f), docptr
, Mplus_FlashAddress
);
707 printk("high density\n");
710 WriteDOC(0, docptr
, Mplus_WritePipeTerm
);
711 WriteDOC(0, docptr
, Mplus_WritePipeTerm
);
713 if (command
== NAND_CMD_READ0
|| command
== NAND_CMD_READ1
||
714 command
== NAND_CMD_READOOB
|| command
== NAND_CMD_READID
)
715 WriteDOC(0, docptr
, Mplus_FlashControl
);
719 * program and erase have their own busy handlers
720 * status and sequential in needs no delay
724 case NAND_CMD_PAGEPROG
:
725 case NAND_CMD_ERASE1
:
726 case NAND_CMD_ERASE2
:
728 case NAND_CMD_STATUS
:
734 udelay(this->chip_delay
);
735 WriteDOC(NAND_CMD_STATUS
, docptr
, Mplus_FlashCmd
);
736 WriteDOC(0, docptr
, Mplus_WritePipeTerm
);
737 WriteDOC(0, docptr
, Mplus_WritePipeTerm
);
738 while (!(this->read_byte(mtd
) & 0x40)) ;
741 /* This applies to read commands */
744 * If we don't have access to the busy pin, we apply the given
747 if (!this->dev_ready
) {
748 udelay(this->chip_delay
);
753 /* Apply this short delay always to ensure that we do wait tWB in
754 * any case on any machine. */
756 /* wait until command is processed */
757 while (!this->dev_ready(mtd
)) ;
760 static int doc200x_dev_ready(struct mtd_info
*mtd
)
762 struct nand_chip
*this = mtd_to_nand(mtd
);
763 struct doc_priv
*doc
= nand_get_controller_data(this);
764 void __iomem
*docptr
= doc
->virtadr
;
766 if (DoC_is_MillenniumPlus(doc
)) {
767 /* 11.4.2 -- must NOP four times before checking FR/B# */
769 if ((ReadDOC(docptr
, Mplus_FlashControl
) & CDSN_CTRL_FR_B_MASK
) != CDSN_CTRL_FR_B_MASK
) {
771 printk("not ready\n");
775 printk("was ready\n");
778 /* 11.4.2 -- must NOP four times before checking FR/B# */
780 if (!(ReadDOC(docptr
, CDSNControl
) & CDSN_CTRL_FR_B
)) {
782 printk("not ready\n");
785 /* 11.4.2 -- Must NOP twice if it's ready */
788 printk("was ready\n");
793 static int doc200x_block_bad(struct mtd_info
*mtd
, loff_t ofs
)
795 /* This is our last resort if we couldn't find or create a BBT. Just
796 pretend all blocks are good. */
800 static void doc200x_enable_hwecc(struct mtd_info
*mtd
, int mode
)
802 struct nand_chip
*this = mtd_to_nand(mtd
);
803 struct doc_priv
*doc
= nand_get_controller_data(this);
804 void __iomem
*docptr
= doc
->virtadr
;
806 /* Prime the ECC engine */
809 WriteDOC(DOC_ECC_RESET
, docptr
, ECCConf
);
810 WriteDOC(DOC_ECC_EN
, docptr
, ECCConf
);
813 WriteDOC(DOC_ECC_RESET
, docptr
, ECCConf
);
814 WriteDOC(DOC_ECC_EN
| DOC_ECC_RW
, docptr
, ECCConf
);
819 static void doc2001plus_enable_hwecc(struct mtd_info
*mtd
, int mode
)
821 struct nand_chip
*this = mtd_to_nand(mtd
);
822 struct doc_priv
*doc
= nand_get_controller_data(this);
823 void __iomem
*docptr
= doc
->virtadr
;
825 /* Prime the ECC engine */
828 WriteDOC(DOC_ECC_RESET
, docptr
, Mplus_ECCConf
);
829 WriteDOC(DOC_ECC_EN
, docptr
, Mplus_ECCConf
);
832 WriteDOC(DOC_ECC_RESET
, docptr
, Mplus_ECCConf
);
833 WriteDOC(DOC_ECC_EN
| DOC_ECC_RW
, docptr
, Mplus_ECCConf
);
838 /* This code is only called on write */
839 static int doc200x_calculate_ecc(struct mtd_info
*mtd
, const u_char
*dat
, unsigned char *ecc_code
)
841 struct nand_chip
*this = mtd_to_nand(mtd
);
842 struct doc_priv
*doc
= nand_get_controller_data(this);
843 void __iomem
*docptr
= doc
->virtadr
;
847 /* flush the pipeline */
848 if (DoC_is_2000(doc
)) {
849 WriteDOC(doc
->CDSNControl
& ~CDSN_CTRL_FLASH_IO
, docptr
, CDSNControl
);
850 WriteDOC(0, docptr
, 2k_CDSN_IO
);
851 WriteDOC(0, docptr
, 2k_CDSN_IO
);
852 WriteDOC(0, docptr
, 2k_CDSN_IO
);
853 WriteDOC(doc
->CDSNControl
, docptr
, CDSNControl
);
854 } else if (DoC_is_MillenniumPlus(doc
)) {
855 WriteDOC(0, docptr
, Mplus_NOP
);
856 WriteDOC(0, docptr
, Mplus_NOP
);
857 WriteDOC(0, docptr
, Mplus_NOP
);
859 WriteDOC(0, docptr
, NOP
);
860 WriteDOC(0, docptr
, NOP
);
861 WriteDOC(0, docptr
, NOP
);
864 for (i
= 0; i
< 6; i
++) {
865 if (DoC_is_MillenniumPlus(doc
))
866 ecc_code
[i
] = ReadDOC_(docptr
, DoC_Mplus_ECCSyndrome0
+ i
);
868 ecc_code
[i
] = ReadDOC_(docptr
, DoC_ECCSyndrome0
+ i
);
869 if (ecc_code
[i
] != empty_write_ecc
[i
])
872 if (DoC_is_MillenniumPlus(doc
))
873 WriteDOC(DOC_ECC_DIS
, docptr
, Mplus_ECCConf
);
875 WriteDOC(DOC_ECC_DIS
, docptr
, ECCConf
);
877 /* If emptymatch=1, we might have an all-0xff data buffer. Check. */
879 /* Note: this somewhat expensive test should not be triggered
880 often. It could be optimized away by examining the data in
881 the writebuf routine, and remembering the result. */
882 for (i
= 0; i
< 512; i
++) {
889 /* If emptymatch still =1, we do have an all-0xff data buffer.
890 Return all-0xff ecc value instead of the computed one, so
891 it'll look just like a freshly-erased page. */
893 memset(ecc_code
, 0xff, 6);
898 static int doc200x_correct_data(struct mtd_info
*mtd
, u_char
*dat
,
899 u_char
*read_ecc
, u_char
*isnull
)
902 struct nand_chip
*this = mtd_to_nand(mtd
);
903 struct doc_priv
*doc
= nand_get_controller_data(this);
904 void __iomem
*docptr
= doc
->virtadr
;
906 volatile u_char dummy
;
908 /* flush the pipeline */
909 if (DoC_is_2000(doc
)) {
910 dummy
= ReadDOC(docptr
, 2k_ECCStatus
);
911 dummy
= ReadDOC(docptr
, 2k_ECCStatus
);
912 dummy
= ReadDOC(docptr
, 2k_ECCStatus
);
913 } else if (DoC_is_MillenniumPlus(doc
)) {
914 dummy
= ReadDOC(docptr
, Mplus_ECCConf
);
915 dummy
= ReadDOC(docptr
, Mplus_ECCConf
);
916 dummy
= ReadDOC(docptr
, Mplus_ECCConf
);
918 dummy
= ReadDOC(docptr
, ECCConf
);
919 dummy
= ReadDOC(docptr
, ECCConf
);
920 dummy
= ReadDOC(docptr
, ECCConf
);
923 /* Error occurred ? */
925 for (i
= 0; i
< 6; i
++) {
926 if (DoC_is_MillenniumPlus(doc
))
927 calc_ecc
[i
] = ReadDOC_(docptr
, DoC_Mplus_ECCSyndrome0
+ i
);
929 calc_ecc
[i
] = ReadDOC_(docptr
, DoC_ECCSyndrome0
+ i
);
932 ret
= doc_ecc_decode(doc
->rs_decoder
, dat
, calc_ecc
);
934 pr_err("doc200x_correct_data corrected %d errors\n",
937 if (DoC_is_MillenniumPlus(doc
))
938 WriteDOC(DOC_ECC_DIS
, docptr
, Mplus_ECCConf
);
940 WriteDOC(DOC_ECC_DIS
, docptr
, ECCConf
);
941 if (no_ecc_failures
&& mtd_is_eccerr(ret
)) {
942 pr_err("suppressing ECC failure\n");
948 //u_char mydatabuf[528];
950 static int doc200x_ooblayout_ecc(struct mtd_info
*mtd
, int section
,
951 struct mtd_oob_region
*oobregion
)
956 oobregion
->offset
= 0;
957 oobregion
->length
= 6;
962 static int doc200x_ooblayout_free(struct mtd_info
*mtd
, int section
,
963 struct mtd_oob_region
*oobregion
)
969 * The strange out-of-order free bytes definition is a (possibly
970 * unneeded) attempt to retain compatibility. It used to read:
971 * .oobfree = { {8, 8} }
972 * Since that leaves two bytes unusable, it was changed. But the
973 * following scheme might affect existing jffs2 installs by moving the
975 * .oobfree = { {6, 10} }
976 * jffs2 seems to handle the above gracefully, but the current scheme
977 * seems safer. The only problem with it is that any code retrieving
978 * free bytes position must be able to handle out-of-order segments.
981 oobregion
->offset
= 8;
982 oobregion
->length
= 8;
984 oobregion
->offset
= 6;
985 oobregion
->length
= 2;
991 static const struct mtd_ooblayout_ops doc200x_ooblayout_ops
= {
992 .ecc
= doc200x_ooblayout_ecc
,
993 .free
= doc200x_ooblayout_free
,
996 /* Find the (I)NFTL Media Header, and optionally also the mirror media header.
997 On successful return, buf will contain a copy of the media header for
998 further processing. id is the string to scan for, and will presumably be
999 either "ANAND" or "BNAND". If findmirror=1, also look for the mirror media
1000 header. The page #s of the found media headers are placed in mh0_page and
1001 mh1_page in the DOC private structure. */
1002 static int __init
find_media_headers(struct mtd_info
*mtd
, u_char
*buf
, const char *id
, int findmirror
)
1004 struct nand_chip
*this = mtd_to_nand(mtd
);
1005 struct doc_priv
*doc
= nand_get_controller_data(this);
1010 for (offs
= 0; offs
< mtd
->size
; offs
+= mtd
->erasesize
) {
1011 ret
= mtd_read(mtd
, offs
, mtd
->writesize
, &retlen
, buf
);
1012 if (retlen
!= mtd
->writesize
)
1015 pr_warn("ECC error scanning DOC at 0x%x\n", offs
);
1017 if (memcmp(buf
, id
, 6))
1019 pr_info("Found DiskOnChip %s Media Header at 0x%x\n", id
, offs
);
1020 if (doc
->mh0_page
== -1) {
1021 doc
->mh0_page
= offs
>> this->page_shift
;
1026 doc
->mh1_page
= offs
>> this->page_shift
;
1029 if (doc
->mh0_page
== -1) {
1030 pr_warn("DiskOnChip %s Media Header not found.\n", id
);
1033 /* Only one mediaheader was found. We want buf to contain a
1034 mediaheader on return, so we'll have to re-read the one we found. */
1035 offs
= doc
->mh0_page
<< this->page_shift
;
1036 ret
= mtd_read(mtd
, offs
, mtd
->writesize
, &retlen
, buf
);
1037 if (retlen
!= mtd
->writesize
) {
1038 /* Insanity. Give up. */
1039 pr_err("Read DiskOnChip Media Header once, but can't reread it???\n");
1045 static inline int __init
nftl_partscan(struct mtd_info
*mtd
, struct mtd_partition
*parts
)
1047 struct nand_chip
*this = mtd_to_nand(mtd
);
1048 struct doc_priv
*doc
= nand_get_controller_data(this);
1051 struct NFTLMediaHeader
*mh
;
1052 const unsigned psize
= 1 << this->page_shift
;
1054 unsigned blocks
, maxblocks
;
1055 int offs
, numheaders
;
1057 buf
= kmalloc(mtd
->writesize
, GFP_KERNEL
);
1061 if (!(numheaders
= find_media_headers(mtd
, buf
, "ANAND", 1)))
1063 mh
= (struct NFTLMediaHeader
*)buf
;
1065 le16_to_cpus(&mh
->NumEraseUnits
);
1066 le16_to_cpus(&mh
->FirstPhysicalEUN
);
1067 le32_to_cpus(&mh
->FormattedSize
);
1069 pr_info(" DataOrgID = %s\n"
1070 " NumEraseUnits = %d\n"
1071 " FirstPhysicalEUN = %d\n"
1072 " FormattedSize = %d\n"
1073 " UnitSizeFactor = %d\n",
1074 mh
->DataOrgID
, mh
->NumEraseUnits
,
1075 mh
->FirstPhysicalEUN
, mh
->FormattedSize
,
1076 mh
->UnitSizeFactor
);
1078 blocks
= mtd
->size
>> this->phys_erase_shift
;
1079 maxblocks
= min(32768U, mtd
->erasesize
- psize
);
1081 if (mh
->UnitSizeFactor
== 0x00) {
1082 /* Auto-determine UnitSizeFactor. The constraints are:
1083 - There can be at most 32768 virtual blocks.
1084 - There can be at most (virtual block size - page size)
1085 virtual blocks (because MediaHeader+BBT must fit in 1).
1087 mh
->UnitSizeFactor
= 0xff;
1088 while (blocks
> maxblocks
) {
1090 maxblocks
= min(32768U, (maxblocks
<< 1) + psize
);
1091 mh
->UnitSizeFactor
--;
1093 pr_warn("UnitSizeFactor=0x00 detected. Correct value is assumed to be 0x%02x.\n", mh
->UnitSizeFactor
);
1096 /* NOTE: The lines below modify internal variables of the NAND and MTD
1097 layers; variables with have already been configured by nand_scan.
1098 Unfortunately, we didn't know before this point what these values
1099 should be. Thus, this code is somewhat dependent on the exact
1100 implementation of the NAND layer. */
1101 if (mh
->UnitSizeFactor
!= 0xff) {
1102 this->bbt_erase_shift
+= (0xff - mh
->UnitSizeFactor
);
1103 mtd
->erasesize
<<= (0xff - mh
->UnitSizeFactor
);
1104 pr_info("Setting virtual erase size to %d\n", mtd
->erasesize
);
1105 blocks
= mtd
->size
>> this->bbt_erase_shift
;
1106 maxblocks
= min(32768U, mtd
->erasesize
- psize
);
1109 if (blocks
> maxblocks
) {
1110 pr_err("UnitSizeFactor of 0x%02x is inconsistent with device size. Aborting.\n", mh
->UnitSizeFactor
);
1114 /* Skip past the media headers. */
1115 offs
= max(doc
->mh0_page
, doc
->mh1_page
);
1116 offs
<<= this->page_shift
;
1117 offs
+= mtd
->erasesize
;
1119 if (show_firmware_partition
== 1) {
1120 parts
[0].name
= " DiskOnChip Firmware / Media Header partition";
1121 parts
[0].offset
= 0;
1122 parts
[0].size
= offs
;
1126 parts
[numparts
].name
= " DiskOnChip BDTL partition";
1127 parts
[numparts
].offset
= offs
;
1128 parts
[numparts
].size
= (mh
->NumEraseUnits
- numheaders
) << this->bbt_erase_shift
;
1130 offs
+= parts
[numparts
].size
;
1133 if (offs
< mtd
->size
) {
1134 parts
[numparts
].name
= " DiskOnChip Remainder partition";
1135 parts
[numparts
].offset
= offs
;
1136 parts
[numparts
].size
= mtd
->size
- offs
;
1146 /* This is a stripped-down copy of the code in inftlmount.c */
1147 static inline int __init
inftl_partscan(struct mtd_info
*mtd
, struct mtd_partition
*parts
)
1149 struct nand_chip
*this = mtd_to_nand(mtd
);
1150 struct doc_priv
*doc
= nand_get_controller_data(this);
1153 struct INFTLMediaHeader
*mh
;
1154 struct INFTLPartition
*ip
;
1157 int vshift
, lastvunit
= 0;
1159 int end
= mtd
->size
;
1161 if (inftl_bbt_write
)
1162 end
-= (INFTL_BBT_RESERVED_BLOCKS
<< this->phys_erase_shift
);
1164 buf
= kmalloc(mtd
->writesize
, GFP_KERNEL
);
1169 if (!find_media_headers(mtd
, buf
, "BNAND", 0))
1171 doc
->mh1_page
= doc
->mh0_page
+ (4096 >> this->page_shift
);
1172 mh
= (struct INFTLMediaHeader
*)buf
;
1174 le32_to_cpus(&mh
->NoOfBootImageBlocks
);
1175 le32_to_cpus(&mh
->NoOfBinaryPartitions
);
1176 le32_to_cpus(&mh
->NoOfBDTLPartitions
);
1177 le32_to_cpus(&mh
->BlockMultiplierBits
);
1178 le32_to_cpus(&mh
->FormatFlags
);
1179 le32_to_cpus(&mh
->PercentUsed
);
1181 pr_info(" bootRecordID = %s\n"
1182 " NoOfBootImageBlocks = %d\n"
1183 " NoOfBinaryPartitions = %d\n"
1184 " NoOfBDTLPartitions = %d\n"
1185 " BlockMultiplerBits = %d\n"
1186 " FormatFlgs = %d\n"
1187 " OsakVersion = %d.%d.%d.%d\n"
1188 " PercentUsed = %d\n",
1189 mh
->bootRecordID
, mh
->NoOfBootImageBlocks
,
1190 mh
->NoOfBinaryPartitions
,
1191 mh
->NoOfBDTLPartitions
,
1192 mh
->BlockMultiplierBits
, mh
->FormatFlags
,
1193 ((unsigned char *) &mh
->OsakVersion
)[0] & 0xf,
1194 ((unsigned char *) &mh
->OsakVersion
)[1] & 0xf,
1195 ((unsigned char *) &mh
->OsakVersion
)[2] & 0xf,
1196 ((unsigned char *) &mh
->OsakVersion
)[3] & 0xf,
1199 vshift
= this->phys_erase_shift
+ mh
->BlockMultiplierBits
;
1201 blocks
= mtd
->size
>> vshift
;
1202 if (blocks
> 32768) {
1203 pr_err("BlockMultiplierBits=%d is inconsistent with device size. Aborting.\n", mh
->BlockMultiplierBits
);
1207 blocks
= doc
->chips_per_floor
<< (this->chip_shift
- this->phys_erase_shift
);
1208 if (inftl_bbt_write
&& (blocks
> mtd
->erasesize
)) {
1209 pr_err("Writeable BBTs spanning more than one erase block are not yet supported. FIX ME!\n");
1213 /* Scan the partitions */
1214 for (i
= 0; (i
< 4); i
++) {
1215 ip
= &(mh
->Partitions
[i
]);
1216 le32_to_cpus(&ip
->virtualUnits
);
1217 le32_to_cpus(&ip
->firstUnit
);
1218 le32_to_cpus(&ip
->lastUnit
);
1219 le32_to_cpus(&ip
->flags
);
1220 le32_to_cpus(&ip
->spareUnits
);
1221 le32_to_cpus(&ip
->Reserved0
);
1223 pr_info(" PARTITION[%d] ->\n"
1224 " virtualUnits = %d\n"
1228 " spareUnits = %d\n",
1229 i
, ip
->virtualUnits
, ip
->firstUnit
,
1230 ip
->lastUnit
, ip
->flags
,
1233 if ((show_firmware_partition
== 1) &&
1234 (i
== 0) && (ip
->firstUnit
> 0)) {
1235 parts
[0].name
= " DiskOnChip IPL / Media Header partition";
1236 parts
[0].offset
= 0;
1237 parts
[0].size
= mtd
->erasesize
* ip
->firstUnit
;
1241 if (ip
->flags
& INFTL_BINARY
)
1242 parts
[numparts
].name
= " DiskOnChip BDK partition";
1244 parts
[numparts
].name
= " DiskOnChip BDTL partition";
1245 parts
[numparts
].offset
= ip
->firstUnit
<< vshift
;
1246 parts
[numparts
].size
= (1 + ip
->lastUnit
- ip
->firstUnit
) << vshift
;
1248 if (ip
->lastUnit
> lastvunit
)
1249 lastvunit
= ip
->lastUnit
;
1250 if (ip
->flags
& INFTL_LAST
)
1254 if ((lastvunit
<< vshift
) < end
) {
1255 parts
[numparts
].name
= " DiskOnChip Remainder partition";
1256 parts
[numparts
].offset
= lastvunit
<< vshift
;
1257 parts
[numparts
].size
= end
- parts
[numparts
].offset
;
1266 static int __init
nftl_scan_bbt(struct mtd_info
*mtd
)
1269 struct nand_chip
*this = mtd_to_nand(mtd
);
1270 struct doc_priv
*doc
= nand_get_controller_data(this);
1271 struct mtd_partition parts
[2];
1273 memset((char *)parts
, 0, sizeof(parts
));
1274 /* On NFTL, we have to find the media headers before we can read the
1275 BBTs, since they're stored in the media header eraseblocks. */
1276 numparts
= nftl_partscan(mtd
, parts
);
1279 this->bbt_td
->options
= NAND_BBT_ABSPAGE
| NAND_BBT_8BIT
|
1280 NAND_BBT_SAVECONTENT
| NAND_BBT_WRITE
|
1282 this->bbt_td
->veroffs
= 7;
1283 this->bbt_td
->pages
[0] = doc
->mh0_page
+ 1;
1284 if (doc
->mh1_page
!= -1) {
1285 this->bbt_md
->options
= NAND_BBT_ABSPAGE
| NAND_BBT_8BIT
|
1286 NAND_BBT_SAVECONTENT
| NAND_BBT_WRITE
|
1288 this->bbt_md
->veroffs
= 7;
1289 this->bbt_md
->pages
[0] = doc
->mh1_page
+ 1;
1291 this->bbt_md
= NULL
;
1294 ret
= nand_create_bbt(this);
1298 return mtd_device_register(mtd
, parts
, no_autopart
? 0 : numparts
);
1301 static int __init
inftl_scan_bbt(struct mtd_info
*mtd
)
1304 struct nand_chip
*this = mtd_to_nand(mtd
);
1305 struct doc_priv
*doc
= nand_get_controller_data(this);
1306 struct mtd_partition parts
[5];
1308 if (this->numchips
> doc
->chips_per_floor
) {
1309 pr_err("Multi-floor INFTL devices not yet supported.\n");
1313 if (DoC_is_MillenniumPlus(doc
)) {
1314 this->bbt_td
->options
= NAND_BBT_2BIT
| NAND_BBT_ABSPAGE
;
1315 if (inftl_bbt_write
)
1316 this->bbt_td
->options
|= NAND_BBT_WRITE
;
1317 this->bbt_td
->pages
[0] = 2;
1318 this->bbt_md
= NULL
;
1320 this->bbt_td
->options
= NAND_BBT_LASTBLOCK
| NAND_BBT_8BIT
| NAND_BBT_VERSION
;
1321 if (inftl_bbt_write
)
1322 this->bbt_td
->options
|= NAND_BBT_WRITE
;
1323 this->bbt_td
->offs
= 8;
1324 this->bbt_td
->len
= 8;
1325 this->bbt_td
->veroffs
= 7;
1326 this->bbt_td
->maxblocks
= INFTL_BBT_RESERVED_BLOCKS
;
1327 this->bbt_td
->reserved_block_code
= 0x01;
1328 this->bbt_td
->pattern
= "MSYS_BBT";
1330 this->bbt_md
->options
= NAND_BBT_LASTBLOCK
| NAND_BBT_8BIT
| NAND_BBT_VERSION
;
1331 if (inftl_bbt_write
)
1332 this->bbt_md
->options
|= NAND_BBT_WRITE
;
1333 this->bbt_md
->offs
= 8;
1334 this->bbt_md
->len
= 8;
1335 this->bbt_md
->veroffs
= 7;
1336 this->bbt_md
->maxblocks
= INFTL_BBT_RESERVED_BLOCKS
;
1337 this->bbt_md
->reserved_block_code
= 0x01;
1338 this->bbt_md
->pattern
= "TBB_SYSM";
1341 ret
= nand_create_bbt(this);
1345 memset((char *)parts
, 0, sizeof(parts
));
1346 numparts
= inftl_partscan(mtd
, parts
);
1347 /* At least for now, require the INFTL Media Header. We could probably
1348 do without it for non-INFTL use, since all it gives us is
1349 autopartitioning, but I want to give it more thought. */
1352 return mtd_device_register(mtd
, parts
, no_autopart
? 0 : numparts
);
1355 static inline int __init
doc2000_init(struct mtd_info
*mtd
)
1357 struct nand_chip
*this = mtd_to_nand(mtd
);
1358 struct doc_priv
*doc
= nand_get_controller_data(this);
1360 this->read_byte
= doc2000_read_byte
;
1361 this->write_buf
= doc2000_writebuf
;
1362 this->read_buf
= doc2000_readbuf
;
1363 doc
->late_init
= nftl_scan_bbt
;
1365 doc
->CDSNControl
= CDSN_CTRL_FLASH_IO
| CDSN_CTRL_ECC_IO
;
1366 doc2000_count_chips(mtd
);
1367 mtd
->name
= "DiskOnChip 2000 (NFTL Model)";
1368 return (4 * doc
->chips_per_floor
);
1371 static inline int __init
doc2001_init(struct mtd_info
*mtd
)
1373 struct nand_chip
*this = mtd_to_nand(mtd
);
1374 struct doc_priv
*doc
= nand_get_controller_data(this);
1376 this->read_byte
= doc2001_read_byte
;
1377 this->write_buf
= doc2001_writebuf
;
1378 this->read_buf
= doc2001_readbuf
;
1380 ReadDOC(doc
->virtadr
, ChipID
);
1381 ReadDOC(doc
->virtadr
, ChipID
);
1382 ReadDOC(doc
->virtadr
, ChipID
);
1383 if (ReadDOC(doc
->virtadr
, ChipID
) != DOC_ChipID_DocMil
) {
1384 /* It's not a Millennium; it's one of the newer
1385 DiskOnChip 2000 units with a similar ASIC.
1386 Treat it like a Millennium, except that it
1387 can have multiple chips. */
1388 doc2000_count_chips(mtd
);
1389 mtd
->name
= "DiskOnChip 2000 (INFTL Model)";
1390 doc
->late_init
= inftl_scan_bbt
;
1391 return (4 * doc
->chips_per_floor
);
1393 /* Bog-standard Millennium */
1394 doc
->chips_per_floor
= 1;
1395 mtd
->name
= "DiskOnChip Millennium";
1396 doc
->late_init
= nftl_scan_bbt
;
1401 static inline int __init
doc2001plus_init(struct mtd_info
*mtd
)
1403 struct nand_chip
*this = mtd_to_nand(mtd
);
1404 struct doc_priv
*doc
= nand_get_controller_data(this);
1406 this->read_byte
= doc2001plus_read_byte
;
1407 this->write_buf
= doc2001plus_writebuf
;
1408 this->read_buf
= doc2001plus_readbuf
;
1409 doc
->late_init
= inftl_scan_bbt
;
1410 this->cmd_ctrl
= NULL
;
1411 this->select_chip
= doc2001plus_select_chip
;
1412 this->cmdfunc
= doc2001plus_command
;
1413 this->ecc
.hwctl
= doc2001plus_enable_hwecc
;
1415 doc
->chips_per_floor
= 1;
1416 mtd
->name
= "DiskOnChip Millennium Plus";
1421 static int __init
doc_probe(unsigned long physadr
)
1423 struct nand_chip
*nand
= NULL
;
1424 struct doc_priv
*doc
= NULL
;
1425 unsigned char ChipID
;
1426 struct mtd_info
*mtd
;
1427 void __iomem
*virtadr
;
1428 unsigned char save_control
;
1429 unsigned char tmp
, tmpb
, tmpc
;
1430 int reg
, len
, numchips
;
1433 if (!request_mem_region(physadr
, DOC_IOREMAP_LEN
, "DiskOnChip"))
1435 virtadr
= ioremap(physadr
, DOC_IOREMAP_LEN
);
1437 pr_err("Diskonchip ioremap failed: 0x%x bytes at 0x%lx\n",
1438 DOC_IOREMAP_LEN
, physadr
);
1443 /* It's not possible to cleanly detect the DiskOnChip - the
1444 * bootup procedure will put the device into reset mode, and
1445 * it's not possible to talk to it without actually writing
1446 * to the DOCControl register. So we store the current contents
1447 * of the DOCControl register's location, in case we later decide
1448 * that it's not a DiskOnChip, and want to put it back how we
1451 save_control
= ReadDOC(virtadr
, DOCControl
);
1453 /* Reset the DiskOnChip ASIC */
1454 WriteDOC(DOC_MODE_CLR_ERR
| DOC_MODE_MDWREN
| DOC_MODE_RESET
, virtadr
, DOCControl
);
1455 WriteDOC(DOC_MODE_CLR_ERR
| DOC_MODE_MDWREN
| DOC_MODE_RESET
, virtadr
, DOCControl
);
1457 /* Enable the DiskOnChip ASIC */
1458 WriteDOC(DOC_MODE_CLR_ERR
| DOC_MODE_MDWREN
| DOC_MODE_NORMAL
, virtadr
, DOCControl
);
1459 WriteDOC(DOC_MODE_CLR_ERR
| DOC_MODE_MDWREN
| DOC_MODE_NORMAL
, virtadr
, DOCControl
);
1461 ChipID
= ReadDOC(virtadr
, ChipID
);
1464 case DOC_ChipID_Doc2k
:
1465 reg
= DoC_2k_ECCStatus
;
1467 case DOC_ChipID_DocMil
:
1470 case DOC_ChipID_DocMilPlus16
:
1471 case DOC_ChipID_DocMilPlus32
:
1473 /* Possible Millennium Plus, need to do more checks */
1474 /* Possibly release from power down mode */
1475 for (tmp
= 0; (tmp
< 4); tmp
++)
1476 ReadDOC(virtadr
, Mplus_Power
);
1478 /* Reset the Millennium Plus ASIC */
1479 tmp
= DOC_MODE_RESET
| DOC_MODE_MDWREN
| DOC_MODE_RST_LAT
| DOC_MODE_BDECT
;
1480 WriteDOC(tmp
, virtadr
, Mplus_DOCControl
);
1481 WriteDOC(~tmp
, virtadr
, Mplus_CtrlConfirm
);
1483 usleep_range(1000, 2000);
1484 /* Enable the Millennium Plus ASIC */
1485 tmp
= DOC_MODE_NORMAL
| DOC_MODE_MDWREN
| DOC_MODE_RST_LAT
| DOC_MODE_BDECT
;
1486 WriteDOC(tmp
, virtadr
, Mplus_DOCControl
);
1487 WriteDOC(~tmp
, virtadr
, Mplus_CtrlConfirm
);
1488 usleep_range(1000, 2000);
1490 ChipID
= ReadDOC(virtadr
, ChipID
);
1493 case DOC_ChipID_DocMilPlus16
:
1494 reg
= DoC_Mplus_Toggle
;
1496 case DOC_ChipID_DocMilPlus32
:
1497 pr_err("DiskOnChip Millennium Plus 32MB is not supported, ignoring.\n");
1508 /* Check the TOGGLE bit in the ECC register */
1509 tmp
= ReadDOC_(virtadr
, reg
) & DOC_TOGGLE_BIT
;
1510 tmpb
= ReadDOC_(virtadr
, reg
) & DOC_TOGGLE_BIT
;
1511 tmpc
= ReadDOC_(virtadr
, reg
) & DOC_TOGGLE_BIT
;
1512 if ((tmp
== tmpb
) || (tmp
!= tmpc
)) {
1513 pr_warn("Possible DiskOnChip at 0x%lx failed TOGGLE test, dropping.\n", physadr
);
1518 for (mtd
= doclist
; mtd
; mtd
= doc
->nextdoc
) {
1519 unsigned char oldval
;
1520 unsigned char newval
;
1521 nand
= mtd_to_nand(mtd
);
1522 doc
= nand_get_controller_data(nand
);
1523 /* Use the alias resolution register to determine if this is
1524 in fact the same DOC aliased to a new address. If writes
1525 to one chip's alias resolution register change the value on
1526 the other chip, they're the same chip. */
1527 if (ChipID
== DOC_ChipID_DocMilPlus16
) {
1528 oldval
= ReadDOC(doc
->virtadr
, Mplus_AliasResolution
);
1529 newval
= ReadDOC(virtadr
, Mplus_AliasResolution
);
1531 oldval
= ReadDOC(doc
->virtadr
, AliasResolution
);
1532 newval
= ReadDOC(virtadr
, AliasResolution
);
1534 if (oldval
!= newval
)
1536 if (ChipID
== DOC_ChipID_DocMilPlus16
) {
1537 WriteDOC(~newval
, virtadr
, Mplus_AliasResolution
);
1538 oldval
= ReadDOC(doc
->virtadr
, Mplus_AliasResolution
);
1539 WriteDOC(newval
, virtadr
, Mplus_AliasResolution
); // restore it
1541 WriteDOC(~newval
, virtadr
, AliasResolution
);
1542 oldval
= ReadDOC(doc
->virtadr
, AliasResolution
);
1543 WriteDOC(newval
, virtadr
, AliasResolution
); // restore it
1546 if (oldval
== newval
) {
1547 pr_debug("Found alias of DOC at 0x%lx to 0x%lx\n",
1548 doc
->physadr
, physadr
);
1553 pr_notice("DiskOnChip found at 0x%lx\n", physadr
);
1555 len
= sizeof(struct nand_chip
) + sizeof(struct doc_priv
) +
1556 (2 * sizeof(struct nand_bbt_descr
));
1557 nand
= kzalloc(len
, GFP_KERNEL
);
1565 * Allocate a RS codec instance
1567 * Symbolsize is 10 (bits)
1568 * Primitve polynomial is x^10+x^3+1
1569 * First consecutive root is 510
1570 * Primitve element to generate roots = 1
1571 * Generator polinomial degree = 4
1573 doc
= (struct doc_priv
*) (nand
+ 1);
1574 doc
->rs_decoder
= init_rs(10, 0x409, FCR
, 1, NROOTS
);
1575 if (!doc
->rs_decoder
) {
1576 pr_err("DiskOnChip: Could not create a RS codec\n");
1581 mtd
= nand_to_mtd(nand
);
1582 nand
->bbt_td
= (struct nand_bbt_descr
*) (doc
+ 1);
1583 nand
->bbt_md
= nand
->bbt_td
+ 1;
1585 mtd
->owner
= THIS_MODULE
;
1586 mtd_set_ooblayout(mtd
, &doc200x_ooblayout_ops
);
1588 nand_set_controller_data(nand
, doc
);
1589 nand
->select_chip
= doc200x_select_chip
;
1590 nand
->cmd_ctrl
= doc200x_hwcontrol
;
1591 nand
->dev_ready
= doc200x_dev_ready
;
1592 nand
->waitfunc
= doc200x_wait
;
1593 nand
->block_bad
= doc200x_block_bad
;
1594 nand
->ecc
.hwctl
= doc200x_enable_hwecc
;
1595 nand
->ecc
.calculate
= doc200x_calculate_ecc
;
1596 nand
->ecc
.correct
= doc200x_correct_data
;
1598 nand
->ecc
.mode
= NAND_ECC_HW_SYNDROME
;
1599 nand
->ecc
.size
= 512;
1600 nand
->ecc
.bytes
= 6;
1601 nand
->ecc
.strength
= 2;
1602 nand
->ecc
.options
= NAND_ECC_GENERIC_ERASED_CHECK
;
1603 nand
->bbt_options
= NAND_BBT_USE_FLASH
;
1604 /* Skip the automatic BBT scan so we can run it manually */
1605 nand
->options
|= NAND_SKIP_BBTSCAN
;
1607 doc
->physadr
= physadr
;
1608 doc
->virtadr
= virtadr
;
1609 doc
->ChipID
= ChipID
;
1614 doc
->nextdoc
= doclist
;
1616 if (ChipID
== DOC_ChipID_Doc2k
)
1617 numchips
= doc2000_init(mtd
);
1618 else if (ChipID
== DOC_ChipID_DocMilPlus16
)
1619 numchips
= doc2001plus_init(mtd
);
1621 numchips
= doc2001_init(mtd
);
1623 if ((ret
= nand_scan(nand
, numchips
)) || (ret
= doc
->late_init(mtd
))) {
1624 /* DBB note: i believe nand_cleanup is necessary here, as
1625 buffers may have been allocated in nand_base. Check with
1636 /* Put back the contents of the DOCControl register, in case it's not
1637 actually a DiskOnChip. */
1638 WriteDOC(save_control
, virtadr
, DOCControl
);
1641 free_rs(doc
->rs_decoder
);
1646 release_mem_region(physadr
, DOC_IOREMAP_LEN
);
1651 static void release_nanddoc(void)
1653 struct mtd_info
*mtd
, *nextmtd
;
1654 struct nand_chip
*nand
;
1655 struct doc_priv
*doc
;
1657 for (mtd
= doclist
; mtd
; mtd
= nextmtd
) {
1658 nand
= mtd_to_nand(mtd
);
1659 doc
= nand_get_controller_data(nand
);
1661 nextmtd
= doc
->nextdoc
;
1663 iounmap(doc
->virtadr
);
1664 release_mem_region(doc
->physadr
, DOC_IOREMAP_LEN
);
1665 free_rs(doc
->rs_decoder
);
1670 static int __init
init_nanddoc(void)
1674 if (doc_config_location
) {
1675 pr_info("Using configured DiskOnChip probe address 0x%lx\n",
1676 doc_config_location
);
1677 ret
= doc_probe(doc_config_location
);
1681 for (i
= 0; (doc_locations
[i
] != 0xffffffff); i
++) {
1682 doc_probe(doc_locations
[i
]);
1685 /* No banner message any more. Print a message if no DiskOnChip
1686 found, so the user knows we at least tried. */
1688 pr_info("No valid DiskOnChip devices found\n");
1694 static void __exit
cleanup_nanddoc(void)
1696 /* Cleanup the nand/DoC resources */
1700 module_init(init_nanddoc
);
1701 module_exit(cleanup_nanddoc
);
1703 MODULE_LICENSE("GPL");
1704 MODULE_AUTHOR("David Woodhouse <dwmw2@infradead.org>");
1705 MODULE_DESCRIPTION("M-Systems DiskOnChip 2000, Millennium and Millennium Plus device driver");