mtd: flash drivers set ecc strength
[deliverable/linux.git] / drivers / mtd / nand / diskonchip.c
CommitLineData
61b03bd7 1/*
1da177e4
LT
2 * drivers/mtd/nand/diskonchip.c
3 *
4 * (C) 2003 Red Hat, Inc.
5 * (C) 2004 Dan Brown <dan_brown@ieee.org>
6 * (C) 2004 Kalev Lember <kalev@smartlink.ee>
7 *
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>
61b03bd7 11 *
1da177e4 12 * Error correction code lifted from the old docecc code
61b03bd7 13 * Author: Fabrice Bellard (fabrice.bellard@netgem.com)
1da177e4
LT
14 * Copyright (C) 2000 Netgem S.A.
15 * converted to the generic Reed-Solomon library by Thomas Gleixner <tglx@linutronix.de>
61b03bd7 16 *
1da177e4 17 * Interface to generic NAND code for M-Systems DiskOnChip devices
1da177e4
LT
18 */
19
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>
5a0e3ad6 26#include <linux/slab.h>
1da177e4
LT
27#include <asm/io.h>
28
29#include <linux/mtd/mtd.h>
30#include <linux/mtd/nand.h>
31#include <linux/mtd/doc2000.h>
1da177e4
LT
32#include <linux/mtd/partitions.h>
33#include <linux/mtd/inftl.h>
a0e5cc58 34#include <linux/module.h>
1da177e4
LT
35
36/* Where to look for the devices? */
651078ba
TG
37#ifndef CONFIG_MTD_NAND_DISKONCHIP_PROBE_ADDRESS
38#define CONFIG_MTD_NAND_DISKONCHIP_PROBE_ADDRESS 0
1da177e4
LT
39#endif
40
41static unsigned long __initdata doc_locations[] = {
42#if defined (__alpha__) || defined(__i386__) || defined(__x86_64__)
651078ba 43#ifdef CONFIG_MTD_NAND_DISKONCHIP_PROBE_HIGH
61b03bd7 44 0xfffc8000, 0xfffca000, 0xfffcc000, 0xfffce000,
1da177e4 45 0xfffd0000, 0xfffd2000, 0xfffd4000, 0xfffd6000,
61b03bd7
TG
46 0xfffd8000, 0xfffda000, 0xfffdc000, 0xfffde000,
47 0xfffe0000, 0xfffe2000, 0xfffe4000, 0xfffe6000,
1da177e4
LT
48 0xfffe8000, 0xfffea000, 0xfffec000, 0xfffee000,
49#else /* CONFIG_MTD_DOCPROBE_HIGH */
61b03bd7 50 0xc8000, 0xca000, 0xcc000, 0xce000,
1da177e4 51 0xd0000, 0xd2000, 0xd4000, 0xd6000,
61b03bd7
TG
52 0xd8000, 0xda000, 0xdc000, 0xde000,
53 0xe0000, 0xe2000, 0xe4000, 0xe6000,
1da177e4
LT
54 0xe8000, 0xea000, 0xec000, 0xee000,
55#endif /* CONFIG_MTD_DOCPROBE_HIGH */
e0c7d767 56#else
1da177e4
LT
57#warning Unknown architecture for DiskOnChip. No default probe locations defined
58#endif
59 0xffffffff };
60
61static struct mtd_info *doclist = NULL;
62
63struct doc_priv {
64 void __iomem *virtadr;
65 unsigned long physadr;
66 u_char ChipID;
67 u_char CDSNControl;
e0c7d767 68 int chips_per_floor; /* The number of chips detected on each floor */
1da177e4
LT
69 int curfloor;
70 int curchip;
71 int mh0_page;
72 int mh1_page;
73 struct mtd_info *nextdoc;
74};
75
1da177e4
LT
76/* This is the syndrome computed by the HW ecc generator upon reading an empty
77 page, one with all 0xff for data and stored ecc code. */
78static u_char empty_read_syndrome[6] = { 0x26, 0xff, 0x6d, 0x47, 0x73, 0x7a };
e0c7d767 79
1da177e4
LT
80/* This is the ecc value computed by the HW ecc generator upon writing an empty
81 page, one with all 0xff for data. */
82static u_char empty_write_ecc[6] = { 0x4b, 0x00, 0xe2, 0x0e, 0x93, 0xf7 };
83
84#define INFTL_BBT_RESERVED_BLOCKS 4
85
86#define DoC_is_MillenniumPlus(doc) ((doc)->ChipID == DOC_ChipID_DocMilPlus16 || (doc)->ChipID == DOC_ChipID_DocMilPlus32)
87#define DoC_is_Millennium(doc) ((doc)->ChipID == DOC_ChipID_DocMil)
88#define DoC_is_2000(doc) ((doc)->ChipID == DOC_ChipID_Doc2k)
89
7abd3ef9
TG
90static void doc200x_hwcontrol(struct mtd_info *mtd, int cmd,
91 unsigned int bitmask);
1da177e4
LT
92static void doc200x_select_chip(struct mtd_info *mtd, int chip);
93
e0c7d767 94static int debug = 0;
1da177e4
LT
95module_param(debug, int, 0);
96
e0c7d767 97static int try_dword = 1;
1da177e4
LT
98module_param(try_dword, int, 0);
99
e0c7d767 100static int no_ecc_failures = 0;
1da177e4
LT
101module_param(no_ecc_failures, int, 0);
102
e0c7d767 103static int no_autopart = 0;
1da177e4 104module_param(no_autopart, int, 0);
1a78ff6b 105
e0c7d767 106static int show_firmware_partition = 0;
1a78ff6b 107module_param(show_firmware_partition, int, 0);
1da177e4 108
89e2bf61 109#ifdef CONFIG_MTD_NAND_DISKONCHIP_BBTWRITE
e0c7d767 110static int inftl_bbt_write = 1;
1da177e4 111#else
e0c7d767 112static int inftl_bbt_write = 0;
1da177e4
LT
113#endif
114module_param(inftl_bbt_write, int, 0);
115
651078ba 116static unsigned long doc_config_location = CONFIG_MTD_NAND_DISKONCHIP_PROBE_ADDRESS;
1da177e4
LT
117module_param(doc_config_location, ulong, 0);
118MODULE_PARM_DESC(doc_config_location, "Physical memory address at which to probe for DiskOnChip");
119
1da177e4
LT
120/* Sector size for HW ECC */
121#define SECTOR_SIZE 512
122/* The sector bytes are packed into NB_DATA 10 bit words */
123#define NB_DATA (((SECTOR_SIZE + 1) * 8 + 6) / 10)
124/* Number of roots */
125#define NROOTS 4
126/* First consective root */
127#define FCR 510
128/* Number of symbols */
129#define NN 1023
130
131/* the Reed Solomon control structure */
132static struct rs_control *rs_decoder;
133
61b03bd7 134/*
1da177e4 135 * The HW decoder in the DoC ASIC's provides us a error syndrome,
7854d3f7 136 * which we must convert to a standard syndrome usable by the generic
1da177e4
LT
137 * Reed-Solomon library code.
138 *
139 * Fabrice Bellard figured this out in the old docecc code. I added
140 * some comments, improved a minor bit and converted it to make use
25985edc 141 * of the generic Reed-Solomon library. tglx
1da177e4 142 */
e0c7d767 143static int doc_ecc_decode(struct rs_control *rs, uint8_t *data, uint8_t *ecc)
1da177e4
LT
144{
145 int i, j, nerr, errpos[8];
146 uint8_t parity;
147 uint16_t ds[4], s[5], tmp, errval[8], syn[4];
148
c9fb6773 149 memset(syn, 0, sizeof(syn));
1da177e4
LT
150 /* Convert the ecc bytes into words */
151 ds[0] = ((ecc[4] & 0xff) >> 0) | ((ecc[5] & 0x03) << 8);
152 ds[1] = ((ecc[5] & 0xfc) >> 2) | ((ecc[2] & 0x0f) << 6);
153 ds[2] = ((ecc[2] & 0xf0) >> 4) | ((ecc[3] & 0x3f) << 4);
154 ds[3] = ((ecc[3] & 0xc0) >> 6) | ((ecc[0] & 0xff) << 2);
155 parity = ecc[1];
156
7854d3f7 157 /* Initialize the syndrome buffer */
1da177e4
LT
158 for (i = 0; i < NROOTS; i++)
159 s[i] = ds[0];
61b03bd7
TG
160 /*
161 * Evaluate
1da177e4
LT
162 * s[i] = ds[3]x^3 + ds[2]x^2 + ds[1]x^1 + ds[0]
163 * where x = alpha^(FCR + i)
164 */
e0c7d767
DW
165 for (j = 1; j < NROOTS; j++) {
166 if (ds[j] == 0)
1da177e4
LT
167 continue;
168 tmp = rs->index_of[ds[j]];
e0c7d767 169 for (i = 0; i < NROOTS; i++)
1da177e4
LT
170 s[i] ^= rs->alpha_to[rs_modnn(rs, tmp + (FCR + i) * j)];
171 }
172
c9fb6773 173 /* Calc syn[i] = s[i] / alpha^(v + i) */
1da177e4 174 for (i = 0; i < NROOTS; i++) {
c9fb6773 175 if (s[i])
e0c7d767 176 syn[i] = rs_modnn(rs, rs->index_of[s[i]] + (NN - FCR - i));
1da177e4
LT
177 }
178 /* Call the decoder library */
179 nerr = decode_rs16(rs, NULL, NULL, 1019, syn, 0, errpos, 0, errval);
180
181 /* Incorrectable errors ? */
182 if (nerr < 0)
183 return nerr;
184
61b03bd7 185 /*
1da177e4
LT
186 * Correct the errors. The bitpositions are a bit of magic,
187 * but they are given by the design of the de/encoder circuit
188 * in the DoC ASIC's.
189 */
e0c7d767 190 for (i = 0; i < nerr; i++) {
1da177e4
LT
191 int index, bitpos, pos = 1015 - errpos[i];
192 uint8_t val;
193 if (pos >= NB_DATA && pos < 1019)
194 continue;
195 if (pos < NB_DATA) {
196 /* extract bit position (MSB first) */
197 pos = 10 * (NB_DATA - 1 - pos) - 6;
198 /* now correct the following 10 bits. At most two bytes
199 can be modified since pos is even */
200 index = (pos >> 3) ^ 1;
201 bitpos = pos & 7;
e0c7d767 202 if ((index >= 0 && index < SECTOR_SIZE) || index == (SECTOR_SIZE + 1)) {
1da177e4
LT
203 val = (uint8_t) (errval[i] >> (2 + bitpos));
204 parity ^= val;
205 if (index < SECTOR_SIZE)
206 data[index] ^= val;
207 }
208 index = ((pos >> 3) + 1) ^ 1;
209 bitpos = (bitpos + 10) & 7;
210 if (bitpos == 0)
211 bitpos = 8;
e0c7d767
DW
212 if ((index >= 0 && index < SECTOR_SIZE) || index == (SECTOR_SIZE + 1)) {
213 val = (uint8_t) (errval[i] << (8 - bitpos));
1da177e4
LT
214 parity ^= val;
215 if (index < SECTOR_SIZE)
216 data[index] ^= val;
217 }
218 }
219 }
220 /* If the parity is wrong, no rescue possible */
eb684507 221 return parity ? -EBADMSG : nerr;
1da177e4
LT
222}
223
224static void DoC_Delay(struct doc_priv *doc, unsigned short cycles)
225{
226 volatile char dummy;
227 int i;
61b03bd7 228
1da177e4
LT
229 for (i = 0; i < cycles; i++) {
230 if (DoC_is_Millennium(doc))
231 dummy = ReadDOC(doc->virtadr, NOP);
232 else if (DoC_is_MillenniumPlus(doc))
233 dummy = ReadDOC(doc->virtadr, Mplus_NOP);
234 else
235 dummy = ReadDOC(doc->virtadr, DOCStatus);
236 }
61b03bd7 237
1da177e4
LT
238}
239
240#define CDSN_CTRL_FR_B_MASK (CDSN_CTRL_FR_B0 | CDSN_CTRL_FR_B1)
241
242/* DOC_WaitReady: Wait for RDY line to be asserted by the flash chip */
243static int _DoC_WaitReady(struct doc_priv *doc)
244{
e0c7d767 245 void __iomem *docptr = doc->virtadr;
1da177e4
LT
246 unsigned long timeo = jiffies + (HZ * 10);
247
e0c7d767
DW
248 if (debug)
249 printk("_DoC_WaitReady...\n");
1da177e4
LT
250 /* Out-of-line routine to wait for chip response */
251 if (DoC_is_MillenniumPlus(doc)) {
252 while ((ReadDOC(docptr, Mplus_FlashControl) & CDSN_CTRL_FR_B_MASK) != CDSN_CTRL_FR_B_MASK) {
253 if (time_after(jiffies, timeo)) {
254 printk("_DoC_WaitReady timed out.\n");
255 return -EIO;
256 }
257 udelay(1);
258 cond_resched();
259 }
260 } else {
261 while (!(ReadDOC(docptr, CDSNControl) & CDSN_CTRL_FR_B)) {
262 if (time_after(jiffies, timeo)) {
263 printk("_DoC_WaitReady timed out.\n");
264 return -EIO;
265 }
266 udelay(1);
267 cond_resched();
268 }
269 }
270
271 return 0;
272}
273
274static inline int DoC_WaitReady(struct doc_priv *doc)
275{
e0c7d767 276 void __iomem *docptr = doc->virtadr;
1da177e4
LT
277 int ret = 0;
278
279 if (DoC_is_MillenniumPlus(doc)) {
280 DoC_Delay(doc, 4);
281
282 if ((ReadDOC(docptr, Mplus_FlashControl) & CDSN_CTRL_FR_B_MASK) != CDSN_CTRL_FR_B_MASK)
283 /* Call the out-of-line routine to wait */
284 ret = _DoC_WaitReady(doc);
285 } else {
286 DoC_Delay(doc, 4);
287
288 if (!(ReadDOC(docptr, CDSNControl) & CDSN_CTRL_FR_B))
289 /* Call the out-of-line routine to wait */
290 ret = _DoC_WaitReady(doc);
291 DoC_Delay(doc, 2);
292 }
293
e0c7d767
DW
294 if (debug)
295 printk("DoC_WaitReady OK\n");
1da177e4
LT
296 return ret;
297}
298
299static void doc2000_write_byte(struct mtd_info *mtd, u_char datum)
300{
301 struct nand_chip *this = mtd->priv;
302 struct doc_priv *doc = this->priv;
e0c7d767 303 void __iomem *docptr = doc->virtadr;
1da177e4 304
e0c7d767
DW
305 if (debug)
306 printk("write_byte %02x\n", datum);
1da177e4
LT
307 WriteDOC(datum, docptr, CDSNSlowIO);
308 WriteDOC(datum, docptr, 2k_CDSN_IO);
309}
310
311static u_char doc2000_read_byte(struct mtd_info *mtd)
312{
313 struct nand_chip *this = mtd->priv;
314 struct doc_priv *doc = this->priv;
e0c7d767 315 void __iomem *docptr = doc->virtadr;
1da177e4
LT
316 u_char ret;
317
318 ReadDOC(docptr, CDSNSlowIO);
319 DoC_Delay(doc, 2);
320 ret = ReadDOC(docptr, 2k_CDSN_IO);
e0c7d767
DW
321 if (debug)
322 printk("read_byte returns %02x\n", ret);
1da177e4
LT
323 return ret;
324}
325
e0c7d767 326static void doc2000_writebuf(struct mtd_info *mtd, const u_char *buf, int len)
1da177e4
LT
327{
328 struct nand_chip *this = mtd->priv;
329 struct doc_priv *doc = this->priv;
e0c7d767 330 void __iomem *docptr = doc->virtadr;
1da177e4 331 int i;
e0c7d767
DW
332 if (debug)
333 printk("writebuf of %d bytes: ", len);
334 for (i = 0; i < len; i++) {
1da177e4
LT
335 WriteDOC_(buf[i], docptr, DoC_2k_CDSN_IO + i);
336 if (debug && i < 16)
337 printk("%02x ", buf[i]);
338 }
e0c7d767
DW
339 if (debug)
340 printk("\n");
1da177e4
LT
341}
342
e0c7d767 343static void doc2000_readbuf(struct mtd_info *mtd, u_char *buf, int len)
1da177e4
LT
344{
345 struct nand_chip *this = mtd->priv;
346 struct doc_priv *doc = this->priv;
e0c7d767
DW
347 void __iomem *docptr = doc->virtadr;
348 int i;
1da177e4 349
e0c7d767
DW
350 if (debug)
351 printk("readbuf of %d bytes: ", len);
1da177e4 352
e0c7d767 353 for (i = 0; i < len; i++) {
1da177e4
LT
354 buf[i] = ReadDOC(docptr, 2k_CDSN_IO + i);
355 }
356}
357
e0c7d767 358static void doc2000_readbuf_dword(struct mtd_info *mtd, u_char *buf, int len)
1da177e4
LT
359{
360 struct nand_chip *this = mtd->priv;
361 struct doc_priv *doc = this->priv;
e0c7d767
DW
362 void __iomem *docptr = doc->virtadr;
363 int i;
1da177e4 364
e0c7d767
DW
365 if (debug)
366 printk("readbuf_dword of %d bytes: ", len);
1da177e4 367
e0c7d767
DW
368 if (unlikely((((unsigned long)buf) | len) & 3)) {
369 for (i = 0; i < len; i++) {
370 *(uint8_t *) (&buf[i]) = ReadDOC(docptr, 2k_CDSN_IO + i);
1da177e4
LT
371 }
372 } else {
e0c7d767
DW
373 for (i = 0; i < len; i += 4) {
374 *(uint32_t *) (&buf[i]) = readl(docptr + DoC_2k_CDSN_IO + i);
1da177e4
LT
375 }
376 }
377}
378
e0c7d767 379static int doc2000_verifybuf(struct mtd_info *mtd, const u_char *buf, int len)
1da177e4
LT
380{
381 struct nand_chip *this = mtd->priv;
382 struct doc_priv *doc = this->priv;
e0c7d767 383 void __iomem *docptr = doc->virtadr;
1da177e4
LT
384 int i;
385
e0c7d767 386 for (i = 0; i < len; i++)
1da177e4
LT
387 if (buf[i] != ReadDOC(docptr, 2k_CDSN_IO))
388 return -EFAULT;
389 return 0;
390}
391
392static uint16_t __init doc200x_ident_chip(struct mtd_info *mtd, int nr)
393{
394 struct nand_chip *this = mtd->priv;
395 struct doc_priv *doc = this->priv;
396 uint16_t ret;
397
398 doc200x_select_chip(mtd, nr);
7abd3ef9
TG
399 doc200x_hwcontrol(mtd, NAND_CMD_READID,
400 NAND_CTRL_CLE | NAND_CTRL_CHANGE);
401 doc200x_hwcontrol(mtd, 0, NAND_CTRL_ALE | NAND_CTRL_CHANGE);
402 doc200x_hwcontrol(mtd, NAND_CMD_NONE, NAND_NCE | NAND_CTRL_CHANGE);
61b03bd7 403
e9c54999 404 /* We can't use dev_ready here, but at least we wait for the
61b03bd7 405 * command to complete
dfd61294
TG
406 */
407 udelay(50);
61b03bd7 408
1da177e4
LT
409 ret = this->read_byte(mtd) << 8;
410 ret |= this->read_byte(mtd);
411
412 if (doc->ChipID == DOC_ChipID_Doc2k && try_dword && !nr) {
413 /* First chip probe. See if we get same results by 32-bit access */
414 union {
415 uint32_t dword;
416 uint8_t byte[4];
417 } ident;
418 void __iomem *docptr = doc->virtadr;
419
7abd3ef9
TG
420 doc200x_hwcontrol(mtd, NAND_CMD_READID,
421 NAND_CTRL_CLE | NAND_CTRL_CHANGE);
422 doc200x_hwcontrol(mtd, 0, NAND_CTRL_ALE | NAND_CTRL_CHANGE);
423 doc200x_hwcontrol(mtd, NAND_CMD_NONE,
424 NAND_NCE | NAND_CTRL_CHANGE);
1da177e4 425
dfd61294
TG
426 udelay(50);
427
1da177e4
LT
428 ident.dword = readl(docptr + DoC_2k_CDSN_IO);
429 if (((ident.byte[0] << 8) | ident.byte[1]) == ret) {
430 printk(KERN_INFO "DiskOnChip 2000 responds to DWORD access\n");
431 this->read_buf = &doc2000_readbuf_dword;
432 }
433 }
61b03bd7 434
1da177e4
LT
435 return ret;
436}
437
438static void __init doc2000_count_chips(struct mtd_info *mtd)
439{
440 struct nand_chip *this = mtd->priv;
441 struct doc_priv *doc = this->priv;
442 uint16_t mfrid;
443 int i;
444
445 /* Max 4 chips per floor on DiskOnChip 2000 */
446 doc->chips_per_floor = 4;
447
448 /* Find out what the first chip is */
449 mfrid = doc200x_ident_chip(mtd, 0);
450
451 /* Find how many chips in each floor. */
452 for (i = 1; i < 4; i++) {
453 if (doc200x_ident_chip(mtd, i) != mfrid)
454 break;
455 }
456 doc->chips_per_floor = i;
457 printk(KERN_DEBUG "Detected %d chips per floor.\n", i);
458}
459
7bc3312b 460static int doc200x_wait(struct mtd_info *mtd, struct nand_chip *this)
1da177e4
LT
461{
462 struct doc_priv *doc = this->priv;
463
464 int status;
61b03bd7 465
1da177e4
LT
466 DoC_WaitReady(doc);
467 this->cmdfunc(mtd, NAND_CMD_STATUS, -1, -1);
468 DoC_WaitReady(doc);
469 status = (int)this->read_byte(mtd);
470
471 return status;
472}
473
474static void doc2001_write_byte(struct mtd_info *mtd, u_char datum)
475{
476 struct nand_chip *this = mtd->priv;
477 struct doc_priv *doc = this->priv;
e0c7d767 478 void __iomem *docptr = doc->virtadr;
1da177e4
LT
479
480 WriteDOC(datum, docptr, CDSNSlowIO);
481 WriteDOC(datum, docptr, Mil_CDSN_IO);
482 WriteDOC(datum, docptr, WritePipeTerm);
483}
484
485static u_char doc2001_read_byte(struct mtd_info *mtd)
486{
487 struct nand_chip *this = mtd->priv;
488 struct doc_priv *doc = this->priv;
e0c7d767 489 void __iomem *docptr = doc->virtadr;
1da177e4
LT
490
491 //ReadDOC(docptr, CDSNSlowIO);
492 /* 11.4.5 -- delay twice to allow extended length cycle */
493 DoC_Delay(doc, 2);
494 ReadDOC(docptr, ReadPipeInit);
495 //return ReadDOC(docptr, Mil_CDSN_IO);
496 return ReadDOC(docptr, LastDataRead);
497}
498
e0c7d767 499static void doc2001_writebuf(struct mtd_info *mtd, const u_char *buf, int len)
1da177e4
LT
500{
501 struct nand_chip *this = mtd->priv;
502 struct doc_priv *doc = this->priv;
e0c7d767 503 void __iomem *docptr = doc->virtadr;
1da177e4
LT
504 int i;
505
e0c7d767 506 for (i = 0; i < len; i++)
1da177e4
LT
507 WriteDOC_(buf[i], docptr, DoC_Mil_CDSN_IO + i);
508 /* Terminate write pipeline */
509 WriteDOC(0x00, docptr, WritePipeTerm);
510}
511
e0c7d767 512static void doc2001_readbuf(struct mtd_info *mtd, u_char *buf, int len)
1da177e4
LT
513{
514 struct nand_chip *this = mtd->priv;
515 struct doc_priv *doc = this->priv;
e0c7d767 516 void __iomem *docptr = doc->virtadr;
1da177e4
LT
517 int i;
518
519 /* Start read pipeline */
520 ReadDOC(docptr, ReadPipeInit);
521
e0c7d767 522 for (i = 0; i < len - 1; i++)
1da177e4
LT
523 buf[i] = ReadDOC(docptr, Mil_CDSN_IO + (i & 0xff));
524
525 /* Terminate read pipeline */
526 buf[i] = ReadDOC(docptr, LastDataRead);
527}
528
e0c7d767 529static int doc2001_verifybuf(struct mtd_info *mtd, const u_char *buf, int len)
1da177e4
LT
530{
531 struct nand_chip *this = mtd->priv;
532 struct doc_priv *doc = this->priv;
e0c7d767 533 void __iomem *docptr = doc->virtadr;
1da177e4
LT
534 int i;
535
536 /* Start read pipeline */
537 ReadDOC(docptr, ReadPipeInit);
538
e0c7d767 539 for (i = 0; i < len - 1; i++)
1da177e4
LT
540 if (buf[i] != ReadDOC(docptr, Mil_CDSN_IO)) {
541 ReadDOC(docptr, LastDataRead);
542 return i;
543 }
544 if (buf[i] != ReadDOC(docptr, LastDataRead))
545 return i;
546 return 0;
547}
548
549static u_char doc2001plus_read_byte(struct mtd_info *mtd)
550{
551 struct nand_chip *this = mtd->priv;
552 struct doc_priv *doc = this->priv;
e0c7d767 553 void __iomem *docptr = doc->virtadr;
1da177e4
LT
554 u_char ret;
555
e0c7d767
DW
556 ReadDOC(docptr, Mplus_ReadPipeInit);
557 ReadDOC(docptr, Mplus_ReadPipeInit);
558 ret = ReadDOC(docptr, Mplus_LastDataRead);
559 if (debug)
560 printk("read_byte returns %02x\n", ret);
1da177e4
LT
561 return ret;
562}
563
e0c7d767 564static void doc2001plus_writebuf(struct mtd_info *mtd, const u_char *buf, int len)
1da177e4
LT
565{
566 struct nand_chip *this = mtd->priv;
567 struct doc_priv *doc = this->priv;
e0c7d767 568 void __iomem *docptr = doc->virtadr;
1da177e4
LT
569 int i;
570
e0c7d767
DW
571 if (debug)
572 printk("writebuf of %d bytes: ", len);
573 for (i = 0; i < len; i++) {
1da177e4
LT
574 WriteDOC_(buf[i], docptr, DoC_Mil_CDSN_IO + i);
575 if (debug && i < 16)
576 printk("%02x ", buf[i]);
577 }
e0c7d767
DW
578 if (debug)
579 printk("\n");
1da177e4
LT
580}
581
e0c7d767 582static void doc2001plus_readbuf(struct mtd_info *mtd, u_char *buf, int len)
1da177e4
LT
583{
584 struct nand_chip *this = mtd->priv;
585 struct doc_priv *doc = this->priv;
e0c7d767 586 void __iomem *docptr = doc->virtadr;
1da177e4
LT
587 int i;
588
e0c7d767
DW
589 if (debug)
590 printk("readbuf of %d bytes: ", len);
1da177e4
LT
591
592 /* Start read pipeline */
593 ReadDOC(docptr, Mplus_ReadPipeInit);
594 ReadDOC(docptr, Mplus_ReadPipeInit);
595
e0c7d767 596 for (i = 0; i < len - 2; i++) {
1da177e4
LT
597 buf[i] = ReadDOC(docptr, Mil_CDSN_IO);
598 if (debug && i < 16)
599 printk("%02x ", buf[i]);
600 }
601
602 /* Terminate read pipeline */
e0c7d767 603 buf[len - 2] = ReadDOC(docptr, Mplus_LastDataRead);
1da177e4 604 if (debug && i < 16)
e0c7d767
DW
605 printk("%02x ", buf[len - 2]);
606 buf[len - 1] = ReadDOC(docptr, Mplus_LastDataRead);
1da177e4 607 if (debug && i < 16)
e0c7d767
DW
608 printk("%02x ", buf[len - 1]);
609 if (debug)
610 printk("\n");
1da177e4
LT
611}
612
e0c7d767 613static int doc2001plus_verifybuf(struct mtd_info *mtd, const u_char *buf, int len)
1da177e4
LT
614{
615 struct nand_chip *this = mtd->priv;
616 struct doc_priv *doc = this->priv;
e0c7d767 617 void __iomem *docptr = doc->virtadr;
1da177e4
LT
618 int i;
619
e0c7d767
DW
620 if (debug)
621 printk("verifybuf of %d bytes: ", len);
1da177e4
LT
622
623 /* Start read pipeline */
624 ReadDOC(docptr, Mplus_ReadPipeInit);
625 ReadDOC(docptr, Mplus_ReadPipeInit);
626
e0c7d767 627 for (i = 0; i < len - 2; i++)
1da177e4
LT
628 if (buf[i] != ReadDOC(docptr, Mil_CDSN_IO)) {
629 ReadDOC(docptr, Mplus_LastDataRead);
630 ReadDOC(docptr, Mplus_LastDataRead);
631 return i;
632 }
e0c7d767
DW
633 if (buf[len - 2] != ReadDOC(docptr, Mplus_LastDataRead))
634 return len - 2;
635 if (buf[len - 1] != ReadDOC(docptr, Mplus_LastDataRead))
636 return len - 1;
1da177e4
LT
637 return 0;
638}
639
640static void doc2001plus_select_chip(struct mtd_info *mtd, int chip)
641{
642 struct nand_chip *this = mtd->priv;
643 struct doc_priv *doc = this->priv;
e0c7d767 644 void __iomem *docptr = doc->virtadr;
1da177e4
LT
645 int floor = 0;
646
e0c7d767
DW
647 if (debug)
648 printk("select chip (%d)\n", chip);
1da177e4
LT
649
650 if (chip == -1) {
651 /* Disable flash internally */
652 WriteDOC(0, docptr, Mplus_FlashSelect);
653 return;
654 }
655
656 floor = chip / doc->chips_per_floor;
e0c7d767 657 chip -= (floor * doc->chips_per_floor);
1da177e4
LT
658
659 /* Assert ChipEnable and deassert WriteProtect */
660 WriteDOC((DOC_FLASH_CE), docptr, Mplus_FlashSelect);
661 this->cmdfunc(mtd, NAND_CMD_RESET, -1, -1);
662
663 doc->curchip = chip;
664 doc->curfloor = floor;
665}
666
667static void doc200x_select_chip(struct mtd_info *mtd, int chip)
668{
669 struct nand_chip *this = mtd->priv;
670 struct doc_priv *doc = this->priv;
e0c7d767 671 void __iomem *docptr = doc->virtadr;
1da177e4
LT
672 int floor = 0;
673
e0c7d767
DW
674 if (debug)
675 printk("select chip (%d)\n", chip);
1da177e4
LT
676
677 if (chip == -1)
678 return;
679
680 floor = chip / doc->chips_per_floor;
e0c7d767 681 chip -= (floor * doc->chips_per_floor);
1da177e4
LT
682
683 /* 11.4.4 -- deassert CE before changing chip */
7abd3ef9 684 doc200x_hwcontrol(mtd, NAND_CMD_NONE, 0 | NAND_CTRL_CHANGE);
1da177e4
LT
685
686 WriteDOC(floor, docptr, FloorSelect);
687 WriteDOC(chip, docptr, CDSNDeviceSelect);
688
7abd3ef9 689 doc200x_hwcontrol(mtd, NAND_CMD_NONE, NAND_NCE | NAND_CTRL_CHANGE);
1da177e4
LT
690
691 doc->curchip = chip;
692 doc->curfloor = floor;
693}
694
7abd3ef9
TG
695#define CDSN_CTRL_MSK (CDSN_CTRL_CE | CDSN_CTRL_CLE | CDSN_CTRL_ALE)
696
697static void doc200x_hwcontrol(struct mtd_info *mtd, int cmd,
698 unsigned int ctrl)
1da177e4
LT
699{
700 struct nand_chip *this = mtd->priv;
701 struct doc_priv *doc = this->priv;
e0c7d767 702 void __iomem *docptr = doc->virtadr;
1da177e4 703
7abd3ef9
TG
704 if (ctrl & NAND_CTRL_CHANGE) {
705 doc->CDSNControl &= ~CDSN_CTRL_MSK;
706 doc->CDSNControl |= ctrl & CDSN_CTRL_MSK;
707 if (debug)
708 printk("hwcontrol(%d): %02x\n", cmd, doc->CDSNControl);
709 WriteDOC(doc->CDSNControl, docptr, CDSNControl);
710 /* 11.4.3 -- 4 NOPs after CSDNControl write */
711 DoC_Delay(doc, 4);
1da177e4 712 }
cad74f2c
TG
713 if (cmd != NAND_CMD_NONE) {
714 if (DoC_is_2000(doc))
715 doc2000_write_byte(mtd, cmd);
716 else
717 doc2001_write_byte(mtd, cmd);
718 }
1da177e4
LT
719}
720
e0c7d767 721static void doc2001plus_command(struct mtd_info *mtd, unsigned command, int column, int page_addr)
1da177e4
LT
722{
723 struct nand_chip *this = mtd->priv;
724 struct doc_priv *doc = this->priv;
e0c7d767 725 void __iomem *docptr = doc->virtadr;
1da177e4
LT
726
727 /*
728 * Must terminate write pipeline before sending any commands
729 * to the device.
730 */
731 if (command == NAND_CMD_PAGEPROG) {
732 WriteDOC(0x00, docptr, Mplus_WritePipeTerm);
733 WriteDOC(0x00, docptr, Mplus_WritePipeTerm);
734 }
735
736 /*
737 * Write out the command to the device.
738 */
739 if (command == NAND_CMD_SEQIN) {
740 int readcmd;
741
28318776 742 if (column >= mtd->writesize) {
1da177e4 743 /* OOB area */
28318776 744 column -= mtd->writesize;
1da177e4
LT
745 readcmd = NAND_CMD_READOOB;
746 } else if (column < 256) {
747 /* First 256 bytes --> READ0 */
748 readcmd = NAND_CMD_READ0;
749 } else {
750 column -= 256;
751 readcmd = NAND_CMD_READ1;
752 }
753 WriteDOC(readcmd, docptr, Mplus_FlashCmd);
754 }
755 WriteDOC(command, docptr, Mplus_FlashCmd);
756 WriteDOC(0, docptr, Mplus_WritePipeTerm);
757 WriteDOC(0, docptr, Mplus_WritePipeTerm);
758
759 if (column != -1 || page_addr != -1) {
760 /* Serially input address */
761 if (column != -1) {
762 /* Adjust columns for 16 bit buswidth */
763 if (this->options & NAND_BUSWIDTH_16)
764 column >>= 1;
765 WriteDOC(column, docptr, Mplus_FlashAddress);
766 }
767 if (page_addr != -1) {
e0c7d767
DW
768 WriteDOC((unsigned char)(page_addr & 0xff), docptr, Mplus_FlashAddress);
769 WriteDOC((unsigned char)((page_addr >> 8) & 0xff), docptr, Mplus_FlashAddress);
1da177e4
LT
770 /* One more address cycle for higher density devices */
771 if (this->chipsize & 0x0c000000) {
e0c7d767 772 WriteDOC((unsigned char)((page_addr >> 16) & 0x0f), docptr, Mplus_FlashAddress);
1da177e4
LT
773 printk("high density\n");
774 }
775 }
776 WriteDOC(0, docptr, Mplus_WritePipeTerm);
777 WriteDOC(0, docptr, Mplus_WritePipeTerm);
778 /* deassert ALE */
e0c7d767
DW
779 if (command == NAND_CMD_READ0 || command == NAND_CMD_READ1 ||
780 command == NAND_CMD_READOOB || command == NAND_CMD_READID)
1da177e4
LT
781 WriteDOC(0, docptr, Mplus_FlashControl);
782 }
783
61b03bd7 784 /*
1da177e4
LT
785 * program and erase have their own busy handlers
786 * status and sequential in needs no delay
e0c7d767 787 */
1da177e4
LT
788 switch (command) {
789
790 case NAND_CMD_PAGEPROG:
791 case NAND_CMD_ERASE1:
792 case NAND_CMD_ERASE2:
793 case NAND_CMD_SEQIN:
794 case NAND_CMD_STATUS:
795 return;
796
797 case NAND_CMD_RESET:
798 if (this->dev_ready)
799 break;
800 udelay(this->chip_delay);
801 WriteDOC(NAND_CMD_STATUS, docptr, Mplus_FlashCmd);
802 WriteDOC(0, docptr, Mplus_WritePipeTerm);
803 WriteDOC(0, docptr, Mplus_WritePipeTerm);
e0c7d767 804 while (!(this->read_byte(mtd) & 0x40)) ;
1da177e4
LT
805 return;
806
e0c7d767 807 /* This applies to read commands */
1da177e4 808 default:
61b03bd7 809 /*
1da177e4
LT
810 * If we don't have access to the busy pin, we apply the given
811 * command delay
e0c7d767 812 */
1da177e4 813 if (!this->dev_ready) {
e0c7d767 814 udelay(this->chip_delay);
1da177e4
LT
815 return;
816 }
817 }
818
819 /* Apply this short delay always to ensure that we do wait tWB in
820 * any case on any machine. */
e0c7d767 821 ndelay(100);
1da177e4 822 /* wait until command is processed */
e0c7d767 823 while (!this->dev_ready(mtd)) ;
1da177e4
LT
824}
825
826static int doc200x_dev_ready(struct mtd_info *mtd)
827{
828 struct nand_chip *this = mtd->priv;
829 struct doc_priv *doc = this->priv;
e0c7d767 830 void __iomem *docptr = doc->virtadr;
1da177e4
LT
831
832 if (DoC_is_MillenniumPlus(doc)) {
833 /* 11.4.2 -- must NOP four times before checking FR/B# */
834 DoC_Delay(doc, 4);
835 if ((ReadDOC(docptr, Mplus_FlashControl) & CDSN_CTRL_FR_B_MASK) != CDSN_CTRL_FR_B_MASK) {
e0c7d767 836 if (debug)
1da177e4
LT
837 printk("not ready\n");
838 return 0;
839 }
e0c7d767
DW
840 if (debug)
841 printk("was ready\n");
1da177e4
LT
842 return 1;
843 } else {
844 /* 11.4.2 -- must NOP four times before checking FR/B# */
845 DoC_Delay(doc, 4);
846 if (!(ReadDOC(docptr, CDSNControl) & CDSN_CTRL_FR_B)) {
e0c7d767 847 if (debug)
1da177e4
LT
848 printk("not ready\n");
849 return 0;
850 }
851 /* 11.4.2 -- Must NOP twice if it's ready */
852 DoC_Delay(doc, 2);
e0c7d767
DW
853 if (debug)
854 printk("was ready\n");
1da177e4
LT
855 return 1;
856 }
857}
858
859static int doc200x_block_bad(struct mtd_info *mtd, loff_t ofs, int getchip)
860{
861 /* This is our last resort if we couldn't find or create a BBT. Just
862 pretend all blocks are good. */
863 return 0;
864}
865
866static void doc200x_enable_hwecc(struct mtd_info *mtd, int mode)
867{
868 struct nand_chip *this = mtd->priv;
869 struct doc_priv *doc = this->priv;
e0c7d767 870 void __iomem *docptr = doc->virtadr;
1da177e4
LT
871
872 /* Prime the ECC engine */
e0c7d767 873 switch (mode) {
1da177e4
LT
874 case NAND_ECC_READ:
875 WriteDOC(DOC_ECC_RESET, docptr, ECCConf);
876 WriteDOC(DOC_ECC_EN, docptr, ECCConf);
877 break;
878 case NAND_ECC_WRITE:
879 WriteDOC(DOC_ECC_RESET, docptr, ECCConf);
880 WriteDOC(DOC_ECC_EN | DOC_ECC_RW, docptr, ECCConf);
881 break;
882 }
883}
884
885static void doc2001plus_enable_hwecc(struct mtd_info *mtd, int mode)
886{
887 struct nand_chip *this = mtd->priv;
888 struct doc_priv *doc = this->priv;
e0c7d767 889 void __iomem *docptr = doc->virtadr;
1da177e4
LT
890
891 /* Prime the ECC engine */
e0c7d767 892 switch (mode) {
1da177e4
LT
893 case NAND_ECC_READ:
894 WriteDOC(DOC_ECC_RESET, docptr, Mplus_ECCConf);
895 WriteDOC(DOC_ECC_EN, docptr, Mplus_ECCConf);
896 break;
897 case NAND_ECC_WRITE:
898 WriteDOC(DOC_ECC_RESET, docptr, Mplus_ECCConf);
899 WriteDOC(DOC_ECC_EN | DOC_ECC_RW, docptr, Mplus_ECCConf);
900 break;
901 }
902}
903
904/* This code is only called on write */
e0c7d767 905static int doc200x_calculate_ecc(struct mtd_info *mtd, const u_char *dat, unsigned char *ecc_code)
1da177e4
LT
906{
907 struct nand_chip *this = mtd->priv;
908 struct doc_priv *doc = this->priv;
e0c7d767 909 void __iomem *docptr = doc->virtadr;
1da177e4
LT
910 int i;
911 int emptymatch = 1;
912
913 /* flush the pipeline */
914 if (DoC_is_2000(doc)) {
915 WriteDOC(doc->CDSNControl & ~CDSN_CTRL_FLASH_IO, docptr, CDSNControl);
916 WriteDOC(0, docptr, 2k_CDSN_IO);
917 WriteDOC(0, docptr, 2k_CDSN_IO);
918 WriteDOC(0, docptr, 2k_CDSN_IO);
919 WriteDOC(doc->CDSNControl, docptr, CDSNControl);
920 } else if (DoC_is_MillenniumPlus(doc)) {
921 WriteDOC(0, docptr, Mplus_NOP);
922 WriteDOC(0, docptr, Mplus_NOP);
923 WriteDOC(0, docptr, Mplus_NOP);
924 } else {
925 WriteDOC(0, docptr, NOP);
926 WriteDOC(0, docptr, NOP);
927 WriteDOC(0, docptr, NOP);
928 }
929
930 for (i = 0; i < 6; i++) {
931 if (DoC_is_MillenniumPlus(doc))
932 ecc_code[i] = ReadDOC_(docptr, DoC_Mplus_ECCSyndrome0 + i);
61b03bd7 933 else
1da177e4
LT
934 ecc_code[i] = ReadDOC_(docptr, DoC_ECCSyndrome0 + i);
935 if (ecc_code[i] != empty_write_ecc[i])
936 emptymatch = 0;
937 }
938 if (DoC_is_MillenniumPlus(doc))
939 WriteDOC(DOC_ECC_DIS, docptr, Mplus_ECCConf);
940 else
941 WriteDOC(DOC_ECC_DIS, docptr, ECCConf);
942#if 0
943 /* If emptymatch=1, we might have an all-0xff data buffer. Check. */
944 if (emptymatch) {
945 /* Note: this somewhat expensive test should not be triggered
946 often. It could be optimized away by examining the data in
947 the writebuf routine, and remembering the result. */
948 for (i = 0; i < 512; i++) {
e0c7d767
DW
949 if (dat[i] == 0xff)
950 continue;
1da177e4
LT
951 emptymatch = 0;
952 break;
953 }
954 }
955 /* If emptymatch still =1, we do have an all-0xff data buffer.
956 Return all-0xff ecc value instead of the computed one, so
957 it'll look just like a freshly-erased page. */
e0c7d767
DW
958 if (emptymatch)
959 memset(ecc_code, 0xff, 6);
1da177e4
LT
960#endif
961 return 0;
962}
963
f5bbdacc
TG
964static int doc200x_correct_data(struct mtd_info *mtd, u_char *dat,
965 u_char *read_ecc, u_char *isnull)
1da177e4
LT
966{
967 int i, ret = 0;
968 struct nand_chip *this = mtd->priv;
969 struct doc_priv *doc = this->priv;
e0c7d767 970 void __iomem *docptr = doc->virtadr;
f5bbdacc 971 uint8_t calc_ecc[6];
1da177e4
LT
972 volatile u_char dummy;
973 int emptymatch = 1;
61b03bd7 974
1da177e4
LT
975 /* flush the pipeline */
976 if (DoC_is_2000(doc)) {
977 dummy = ReadDOC(docptr, 2k_ECCStatus);
978 dummy = ReadDOC(docptr, 2k_ECCStatus);
979 dummy = ReadDOC(docptr, 2k_ECCStatus);
980 } else if (DoC_is_MillenniumPlus(doc)) {
981 dummy = ReadDOC(docptr, Mplus_ECCConf);
982 dummy = ReadDOC(docptr, Mplus_ECCConf);
983 dummy = ReadDOC(docptr, Mplus_ECCConf);
984 } else {
985 dummy = ReadDOC(docptr, ECCConf);
986 dummy = ReadDOC(docptr, ECCConf);
987 dummy = ReadDOC(docptr, ECCConf);
988 }
61b03bd7 989
25985edc 990 /* Error occurred ? */
1da177e4
LT
991 if (dummy & 0x80) {
992 for (i = 0; i < 6; i++) {
993 if (DoC_is_MillenniumPlus(doc))
994 calc_ecc[i] = ReadDOC_(docptr, DoC_Mplus_ECCSyndrome0 + i);
995 else
996 calc_ecc[i] = ReadDOC_(docptr, DoC_ECCSyndrome0 + i);
997 if (calc_ecc[i] != empty_read_syndrome[i])
998 emptymatch = 0;
999 }
1000 /* If emptymatch=1, the read syndrome is consistent with an
1001 all-0xff data and stored ecc block. Check the stored ecc. */
1002 if (emptymatch) {
1003 for (i = 0; i < 6; i++) {
e0c7d767
DW
1004 if (read_ecc[i] == 0xff)
1005 continue;
1da177e4
LT
1006 emptymatch = 0;
1007 break;
1008 }
1009 }
1010 /* If emptymatch still =1, check the data block. */
1011 if (emptymatch) {
e0c7d767
DW
1012 /* Note: this somewhat expensive test should not be triggered
1013 often. It could be optimized away by examining the data in
1014 the readbuf routine, and remembering the result. */
1da177e4 1015 for (i = 0; i < 512; i++) {
e0c7d767
DW
1016 if (dat[i] == 0xff)
1017 continue;
1da177e4
LT
1018 emptymatch = 0;
1019 break;
1020 }
1021 }
1022 /* If emptymatch still =1, this is almost certainly a freshly-
1023 erased block, in which case the ECC will not come out right.
1024 We'll suppress the error and tell the caller everything's
1025 OK. Because it is. */
e0c7d767
DW
1026 if (!emptymatch)
1027 ret = doc_ecc_decode(rs_decoder, dat, calc_ecc);
1da177e4
LT
1028 if (ret > 0)
1029 printk(KERN_ERR "doc200x_correct_data corrected %d errors\n", ret);
61b03bd7 1030 }
1da177e4
LT
1031 if (DoC_is_MillenniumPlus(doc))
1032 WriteDOC(DOC_ECC_DIS, docptr, Mplus_ECCConf);
1033 else
1034 WriteDOC(DOC_ECC_DIS, docptr, ECCConf);
d57f4054 1035 if (no_ecc_failures && mtd_is_eccerr(ret)) {
1da177e4
LT
1036 printk(KERN_ERR "suppressing ECC failure\n");
1037 ret = 0;
1038 }
1039 return ret;
1040}
61b03bd7 1041
1da177e4
LT
1042//u_char mydatabuf[528];
1043
abc37e67
DB
1044/* The strange out-of-order .oobfree list below is a (possibly unneeded)
1045 * attempt to retain compatibility. It used to read:
1046 * .oobfree = { {8, 8} }
1047 * Since that leaves two bytes unusable, it was changed. But the following
1048 * scheme might affect existing jffs2 installs by moving the cleanmarker:
1049 * .oobfree = { {6, 10} }
1050 * jffs2 seems to handle the above gracefully, but the current scheme seems
1051 * safer. The only problem with it is that any code that parses oobfree must
1052 * be able to handle out-of-order segments.
1053 */
5bd34c09 1054static struct nand_ecclayout doc200x_oobinfo = {
e0c7d767
DW
1055 .eccbytes = 6,
1056 .eccpos = {0, 1, 2, 3, 4, 5},
1057 .oobfree = {{8, 8}, {6, 2}}
1da177e4 1058};
61b03bd7 1059
1da177e4 1060/* Find the (I)NFTL Media Header, and optionally also the mirror media header.
af901ca1 1061 On successful return, buf will contain a copy of the media header for
1da177e4
LT
1062 further processing. id is the string to scan for, and will presumably be
1063 either "ANAND" or "BNAND". If findmirror=1, also look for the mirror media
1064 header. The page #s of the found media headers are placed in mh0_page and
1065 mh1_page in the DOC private structure. */
e0c7d767 1066static int __init find_media_headers(struct mtd_info *mtd, u_char *buf, const char *id, int findmirror)
1da177e4
LT
1067{
1068 struct nand_chip *this = mtd->priv;
1069 struct doc_priv *doc = this->priv;
1a78ff6b 1070 unsigned offs;
1da177e4
LT
1071 int ret;
1072 size_t retlen;
1073
1a78ff6b 1074 for (offs = 0; offs < mtd->size; offs += mtd->erasesize) {
329ad399 1075 ret = mtd_read(mtd, offs, mtd->writesize, &retlen, buf);
28318776 1076 if (retlen != mtd->writesize)
e0c7d767 1077 continue;
1da177e4 1078 if (ret) {
e0c7d767 1079 printk(KERN_WARNING "ECC error scanning DOC at 0x%x\n", offs);
1da177e4 1080 }
e0c7d767
DW
1081 if (memcmp(buf, id, 6))
1082 continue;
1da177e4
LT
1083 printk(KERN_INFO "Found DiskOnChip %s Media Header at 0x%x\n", id, offs);
1084 if (doc->mh0_page == -1) {
1085 doc->mh0_page = offs >> this->page_shift;
e0c7d767
DW
1086 if (!findmirror)
1087 return 1;
1da177e4
LT
1088 continue;
1089 }
1090 doc->mh1_page = offs >> this->page_shift;
1091 return 2;
1092 }
1093 if (doc->mh0_page == -1) {
1094 printk(KERN_WARNING "DiskOnChip %s Media Header not found.\n", id);
1095 return 0;
1096 }
1097 /* Only one mediaheader was found. We want buf to contain a
1098 mediaheader on return, so we'll have to re-read the one we found. */
1099 offs = doc->mh0_page << this->page_shift;
329ad399 1100 ret = mtd_read(mtd, offs, mtd->writesize, &retlen, buf);
28318776 1101 if (retlen != mtd->writesize) {
1da177e4
LT
1102 /* Insanity. Give up. */
1103 printk(KERN_ERR "Read DiskOnChip Media Header once, but can't reread it???\n");
1104 return 0;
1105 }
1106 return 1;
1107}
1108
e0c7d767 1109static inline int __init nftl_partscan(struct mtd_info *mtd, struct mtd_partition *parts)
1da177e4
LT
1110{
1111 struct nand_chip *this = mtd->priv;
1112 struct doc_priv *doc = this->priv;
1113 int ret = 0;
1114 u_char *buf;
1115 struct NFTLMediaHeader *mh;
1116 const unsigned psize = 1 << this->page_shift;
1a78ff6b 1117 int numparts = 0;
1da177e4
LT
1118 unsigned blocks, maxblocks;
1119 int offs, numheaders;
1120
28318776 1121 buf = kmalloc(mtd->writesize, GFP_KERNEL);
1da177e4
LT
1122 if (!buf) {
1123 printk(KERN_ERR "DiskOnChip mediaheader kmalloc failed!\n");
1124 return 0;
1125 }
e0c7d767
DW
1126 if (!(numheaders = find_media_headers(mtd, buf, "ANAND", 1)))
1127 goto out;
1128 mh = (struct NFTLMediaHeader *)buf;
1da177e4 1129
96372446
HH
1130 le16_to_cpus(&mh->NumEraseUnits);
1131 le16_to_cpus(&mh->FirstPhysicalEUN);
1132 le32_to_cpus(&mh->FormattedSize);
f29a4b86 1133
1da177e4
LT
1134 printk(KERN_INFO " DataOrgID = %s\n"
1135 " NumEraseUnits = %d\n"
1136 " FirstPhysicalEUN = %d\n"
1137 " FormattedSize = %d\n"
1138 " UnitSizeFactor = %d\n",
1139 mh->DataOrgID, mh->NumEraseUnits,
1140 mh->FirstPhysicalEUN, mh->FormattedSize,
1141 mh->UnitSizeFactor);
1da177e4
LT
1142
1143 blocks = mtd->size >> this->phys_erase_shift;
1144 maxblocks = min(32768U, mtd->erasesize - psize);
1145
1146 if (mh->UnitSizeFactor == 0x00) {
1147 /* Auto-determine UnitSizeFactor. The constraints are:
1148 - There can be at most 32768 virtual blocks.
1149 - There can be at most (virtual block size - page size)
e0c7d767
DW
1150 virtual blocks (because MediaHeader+BBT must fit in 1).
1151 */
1da177e4
LT
1152 mh->UnitSizeFactor = 0xff;
1153 while (blocks > maxblocks) {
1154 blocks >>= 1;
1155 maxblocks = min(32768U, (maxblocks << 1) + psize);
1156 mh->UnitSizeFactor--;
1157 }
1158 printk(KERN_WARNING "UnitSizeFactor=0x00 detected. Correct value is assumed to be 0x%02x.\n", mh->UnitSizeFactor);
1159 }
1160
1161 /* NOTE: The lines below modify internal variables of the NAND and MTD
1162 layers; variables with have already been configured by nand_scan.
1163 Unfortunately, we didn't know before this point what these values
25985edc 1164 should be. Thus, this code is somewhat dependent on the exact
1da177e4
LT
1165 implementation of the NAND layer. */
1166 if (mh->UnitSizeFactor != 0xff) {
1167 this->bbt_erase_shift += (0xff - mh->UnitSizeFactor);
1168 mtd->erasesize <<= (0xff - mh->UnitSizeFactor);
1169 printk(KERN_INFO "Setting virtual erase size to %d\n", mtd->erasesize);
1170 blocks = mtd->size >> this->bbt_erase_shift;
1171 maxblocks = min(32768U, mtd->erasesize - psize);
1172 }
1173
1174 if (blocks > maxblocks) {
1175 printk(KERN_ERR "UnitSizeFactor of 0x%02x is inconsistent with device size. Aborting.\n", mh->UnitSizeFactor);
1176 goto out;
1177 }
1178
1179 /* Skip past the media headers. */
1180 offs = max(doc->mh0_page, doc->mh1_page);
1181 offs <<= this->page_shift;
1182 offs += mtd->erasesize;
1183
1a78ff6b
DB
1184 if (show_firmware_partition == 1) {
1185 parts[0].name = " DiskOnChip Firmware / Media Header partition";
1186 parts[0].offset = 0;
1187 parts[0].size = offs;
1188 numparts = 1;
1189 }
1190
1191 parts[numparts].name = " DiskOnChip BDTL partition";
1192 parts[numparts].offset = offs;
1193 parts[numparts].size = (mh->NumEraseUnits - numheaders) << this->bbt_erase_shift;
1194
1195 offs += parts[numparts].size;
1196 numparts++;
1da177e4 1197
1da177e4 1198 if (offs < mtd->size) {
1a78ff6b
DB
1199 parts[numparts].name = " DiskOnChip Remainder partition";
1200 parts[numparts].offset = offs;
1201 parts[numparts].size = mtd->size - offs;
1202 numparts++;
1da177e4 1203 }
1a78ff6b
DB
1204
1205 ret = numparts;
e0c7d767 1206 out:
1da177e4
LT
1207 kfree(buf);
1208 return ret;
1209}
1210
1211/* This is a stripped-down copy of the code in inftlmount.c */
e0c7d767 1212static inline int __init inftl_partscan(struct mtd_info *mtd, struct mtd_partition *parts)
1da177e4
LT
1213{
1214 struct nand_chip *this = mtd->priv;
1215 struct doc_priv *doc = this->priv;
1216 int ret = 0;
1217 u_char *buf;
1218 struct INFTLMediaHeader *mh;
1219 struct INFTLPartition *ip;
1220 int numparts = 0;
1221 int blocks;
1222 int vshift, lastvunit = 0;
1223 int i;
1224 int end = mtd->size;
1225
1226 if (inftl_bbt_write)
1227 end -= (INFTL_BBT_RESERVED_BLOCKS << this->phys_erase_shift);
1228
28318776 1229 buf = kmalloc(mtd->writesize, GFP_KERNEL);
1da177e4
LT
1230 if (!buf) {
1231 printk(KERN_ERR "DiskOnChip mediaheader kmalloc failed!\n");
1232 return 0;
1233 }
1234
e0c7d767
DW
1235 if (!find_media_headers(mtd, buf, "BNAND", 0))
1236 goto out;
1da177e4 1237 doc->mh1_page = doc->mh0_page + (4096 >> this->page_shift);
e0c7d767 1238 mh = (struct INFTLMediaHeader *)buf;
1da177e4 1239
96372446
HH
1240 le32_to_cpus(&mh->NoOfBootImageBlocks);
1241 le32_to_cpus(&mh->NoOfBinaryPartitions);
1242 le32_to_cpus(&mh->NoOfBDTLPartitions);
1243 le32_to_cpus(&mh->BlockMultiplierBits);
1244 le32_to_cpus(&mh->FormatFlags);
1245 le32_to_cpus(&mh->PercentUsed);
61b03bd7 1246
1da177e4
LT
1247 printk(KERN_INFO " bootRecordID = %s\n"
1248 " NoOfBootImageBlocks = %d\n"
1249 " NoOfBinaryPartitions = %d\n"
1250 " NoOfBDTLPartitions = %d\n"
1251 " BlockMultiplerBits = %d\n"
1252 " FormatFlgs = %d\n"
1253 " OsakVersion = %d.%d.%d.%d\n"
1254 " PercentUsed = %d\n",
1255 mh->bootRecordID, mh->NoOfBootImageBlocks,
1256 mh->NoOfBinaryPartitions,
1257 mh->NoOfBDTLPartitions,
1258 mh->BlockMultiplierBits, mh->FormatFlags,
1259 ((unsigned char *) &mh->OsakVersion)[0] & 0xf,
1260 ((unsigned char *) &mh->OsakVersion)[1] & 0xf,
1261 ((unsigned char *) &mh->OsakVersion)[2] & 0xf,
1262 ((unsigned char *) &mh->OsakVersion)[3] & 0xf,
1263 mh->PercentUsed);
1da177e4
LT
1264
1265 vshift = this->phys_erase_shift + mh->BlockMultiplierBits;
1266
1267 blocks = mtd->size >> vshift;
1268 if (blocks > 32768) {
1269 printk(KERN_ERR "BlockMultiplierBits=%d is inconsistent with device size. Aborting.\n", mh->BlockMultiplierBits);
1270 goto out;
1271 }
1272
1273 blocks = doc->chips_per_floor << (this->chip_shift - this->phys_erase_shift);
1274 if (inftl_bbt_write && (blocks > mtd->erasesize)) {
1275 printk(KERN_ERR "Writeable BBTs spanning more than one erase block are not yet supported. FIX ME!\n");
1276 goto out;
1277 }
1278
1279 /* Scan the partitions */
1280 for (i = 0; (i < 4); i++) {
1281 ip = &(mh->Partitions[i]);
96372446
HH
1282 le32_to_cpus(&ip->virtualUnits);
1283 le32_to_cpus(&ip->firstUnit);
1284 le32_to_cpus(&ip->lastUnit);
1285 le32_to_cpus(&ip->flags);
1286 le32_to_cpus(&ip->spareUnits);
1287 le32_to_cpus(&ip->Reserved0);
1da177e4 1288
1da177e4
LT
1289 printk(KERN_INFO " PARTITION[%d] ->\n"
1290 " virtualUnits = %d\n"
1291 " firstUnit = %d\n"
1292 " lastUnit = %d\n"
1293 " flags = 0x%x\n"
1294 " spareUnits = %d\n",
1295 i, ip->virtualUnits, ip->firstUnit,
1296 ip->lastUnit, ip->flags,
1297 ip->spareUnits);
1da177e4 1298
1a78ff6b
DB
1299 if ((show_firmware_partition == 1) &&
1300 (i == 0) && (ip->firstUnit > 0)) {
1da177e4
LT
1301 parts[0].name = " DiskOnChip IPL / Media Header partition";
1302 parts[0].offset = 0;
1303 parts[0].size = mtd->erasesize * ip->firstUnit;
1304 numparts = 1;
1305 }
1da177e4
LT
1306
1307 if (ip->flags & INFTL_BINARY)
1308 parts[numparts].name = " DiskOnChip BDK partition";
1309 else
1310 parts[numparts].name = " DiskOnChip BDTL partition";
1311 parts[numparts].offset = ip->firstUnit << vshift;
1312 parts[numparts].size = (1 + ip->lastUnit - ip->firstUnit) << vshift;
1313 numparts++;
e0c7d767
DW
1314 if (ip->lastUnit > lastvunit)
1315 lastvunit = ip->lastUnit;
1316 if (ip->flags & INFTL_LAST)
1317 break;
1da177e4
LT
1318 }
1319 lastvunit++;
1320 if ((lastvunit << vshift) < end) {
1321 parts[numparts].name = " DiskOnChip Remainder partition";
1322 parts[numparts].offset = lastvunit << vshift;
1323 parts[numparts].size = end - parts[numparts].offset;
1324 numparts++;
1325 }
1326 ret = numparts;
e0c7d767 1327 out:
1da177e4
LT
1328 kfree(buf);
1329 return ret;
1330}
1331
1332static int __init nftl_scan_bbt(struct mtd_info *mtd)
1333{
1334 int ret, numparts;
1335 struct nand_chip *this = mtd->priv;
1336 struct doc_priv *doc = this->priv;
1337 struct mtd_partition parts[2];
1338
e0c7d767 1339 memset((char *)parts, 0, sizeof(parts));
1da177e4
LT
1340 /* On NFTL, we have to find the media headers before we can read the
1341 BBTs, since they're stored in the media header eraseblocks. */
1342 numparts = nftl_partscan(mtd, parts);
e0c7d767
DW
1343 if (!numparts)
1344 return -EIO;
1da177e4
LT
1345 this->bbt_td->options = NAND_BBT_ABSPAGE | NAND_BBT_8BIT |
1346 NAND_BBT_SAVECONTENT | NAND_BBT_WRITE |
1347 NAND_BBT_VERSION;
1348 this->bbt_td->veroffs = 7;
1349 this->bbt_td->pages[0] = doc->mh0_page + 1;
1350 if (doc->mh1_page != -1) {
1351 this->bbt_md->options = NAND_BBT_ABSPAGE | NAND_BBT_8BIT |
1352 NAND_BBT_SAVECONTENT | NAND_BBT_WRITE |
1353 NAND_BBT_VERSION;
1354 this->bbt_md->veroffs = 7;
1355 this->bbt_md->pages[0] = doc->mh1_page + 1;
1356 } else {
1357 this->bbt_md = NULL;
1358 }
1359
1360 /* It's safe to set bd=NULL below because NAND_BBT_CREATE is not set.
1361 At least as nand_bbt.c is currently written. */
1362 if ((ret = nand_scan_bbt(mtd, NULL)))
1363 return ret;
0f47e952 1364 mtd_device_register(mtd, NULL, 0);
1da177e4 1365 if (!no_autopart)
0f47e952 1366 mtd_device_register(mtd, parts, numparts);
1da177e4
LT
1367 return 0;
1368}
1369
1370static int __init inftl_scan_bbt(struct mtd_info *mtd)
1371{
1372 int ret, numparts;
1373 struct nand_chip *this = mtd->priv;
1374 struct doc_priv *doc = this->priv;
1375 struct mtd_partition parts[5];
1376
1377 if (this->numchips > doc->chips_per_floor) {
1378 printk(KERN_ERR "Multi-floor INFTL devices not yet supported.\n");
1379 return -EIO;
1380 }
1381
1382 if (DoC_is_MillenniumPlus(doc)) {
1383 this->bbt_td->options = NAND_BBT_2BIT | NAND_BBT_ABSPAGE;
1384 if (inftl_bbt_write)
1385 this->bbt_td->options |= NAND_BBT_WRITE;
1386 this->bbt_td->pages[0] = 2;
1387 this->bbt_md = NULL;
1388 } else {
e0c7d767 1389 this->bbt_td->options = NAND_BBT_LASTBLOCK | NAND_BBT_8BIT | NAND_BBT_VERSION;
1da177e4
LT
1390 if (inftl_bbt_write)
1391 this->bbt_td->options |= NAND_BBT_WRITE;
1392 this->bbt_td->offs = 8;
1393 this->bbt_td->len = 8;
1394 this->bbt_td->veroffs = 7;
1395 this->bbt_td->maxblocks = INFTL_BBT_RESERVED_BLOCKS;
1396 this->bbt_td->reserved_block_code = 0x01;
1397 this->bbt_td->pattern = "MSYS_BBT";
1398
e0c7d767 1399 this->bbt_md->options = NAND_BBT_LASTBLOCK | NAND_BBT_8BIT | NAND_BBT_VERSION;
1da177e4
LT
1400 if (inftl_bbt_write)
1401 this->bbt_md->options |= NAND_BBT_WRITE;
1402 this->bbt_md->offs = 8;
1403 this->bbt_md->len = 8;
1404 this->bbt_md->veroffs = 7;
1405 this->bbt_md->maxblocks = INFTL_BBT_RESERVED_BLOCKS;
1406 this->bbt_md->reserved_block_code = 0x01;
1407 this->bbt_md->pattern = "TBB_SYSM";
1408 }
1409
1410 /* It's safe to set bd=NULL below because NAND_BBT_CREATE is not set.
1411 At least as nand_bbt.c is currently written. */
1412 if ((ret = nand_scan_bbt(mtd, NULL)))
1413 return ret;
e0c7d767 1414 memset((char *)parts, 0, sizeof(parts));
1da177e4
LT
1415 numparts = inftl_partscan(mtd, parts);
1416 /* At least for now, require the INFTL Media Header. We could probably
1417 do without it for non-INFTL use, since all it gives us is
1418 autopartitioning, but I want to give it more thought. */
e0c7d767
DW
1419 if (!numparts)
1420 return -EIO;
0f47e952 1421 mtd_device_register(mtd, NULL, 0);
1da177e4 1422 if (!no_autopart)
0f47e952 1423 mtd_device_register(mtd, parts, numparts);
1da177e4
LT
1424 return 0;
1425}
1426
1427static inline int __init doc2000_init(struct mtd_info *mtd)
1428{
1429 struct nand_chip *this = mtd->priv;
1430 struct doc_priv *doc = this->priv;
1431
1da177e4
LT
1432 this->read_byte = doc2000_read_byte;
1433 this->write_buf = doc2000_writebuf;
1434 this->read_buf = doc2000_readbuf;
1435 this->verify_buf = doc2000_verifybuf;
1436 this->scan_bbt = nftl_scan_bbt;
1437
1438 doc->CDSNControl = CDSN_CTRL_FLASH_IO | CDSN_CTRL_ECC_IO;
1439 doc2000_count_chips(mtd);
1440 mtd->name = "DiskOnChip 2000 (NFTL Model)";
1441 return (4 * doc->chips_per_floor);
1442}
1443
1444static inline int __init doc2001_init(struct mtd_info *mtd)
1445{
1446 struct nand_chip *this = mtd->priv;
1447 struct doc_priv *doc = this->priv;
1448
1da177e4
LT
1449 this->read_byte = doc2001_read_byte;
1450 this->write_buf = doc2001_writebuf;
1451 this->read_buf = doc2001_readbuf;
1452 this->verify_buf = doc2001_verifybuf;
1453
1454 ReadDOC(doc->virtadr, ChipID);
1455 ReadDOC(doc->virtadr, ChipID);
1456 ReadDOC(doc->virtadr, ChipID);
1457 if (ReadDOC(doc->virtadr, ChipID) != DOC_ChipID_DocMil) {
1458 /* It's not a Millennium; it's one of the newer
61b03bd7 1459 DiskOnChip 2000 units with a similar ASIC.
1da177e4
LT
1460 Treat it like a Millennium, except that it
1461 can have multiple chips. */
1462 doc2000_count_chips(mtd);
1463 mtd->name = "DiskOnChip 2000 (INFTL Model)";
1464 this->scan_bbt = inftl_scan_bbt;
1465 return (4 * doc->chips_per_floor);
1466 } else {
1467 /* Bog-standard Millennium */
1468 doc->chips_per_floor = 1;
1469 mtd->name = "DiskOnChip Millennium";
1470 this->scan_bbt = nftl_scan_bbt;
1471 return 1;
1472 }
1473}
1474
1475static inline int __init doc2001plus_init(struct mtd_info *mtd)
1476{
1477 struct nand_chip *this = mtd->priv;
1478 struct doc_priv *doc = this->priv;
1479
1da177e4
LT
1480 this->read_byte = doc2001plus_read_byte;
1481 this->write_buf = doc2001plus_writebuf;
1482 this->read_buf = doc2001plus_readbuf;
1483 this->verify_buf = doc2001plus_verifybuf;
1484 this->scan_bbt = inftl_scan_bbt;
7abd3ef9 1485 this->cmd_ctrl = NULL;
1da177e4
LT
1486 this->select_chip = doc2001plus_select_chip;
1487 this->cmdfunc = doc2001plus_command;
0cddd6c2 1488 this->ecc.hwctl = doc2001plus_enable_hwecc;
1da177e4
LT
1489
1490 doc->chips_per_floor = 1;
1491 mtd->name = "DiskOnChip Millennium Plus";
1492
1493 return 1;
1494}
1495
858119e1 1496static int __init doc_probe(unsigned long physadr)
1da177e4
LT
1497{
1498 unsigned char ChipID;
1499 struct mtd_info *mtd;
1500 struct nand_chip *nand;
1501 struct doc_priv *doc;
1502 void __iomem *virtadr;
1503 unsigned char save_control;
1504 unsigned char tmp, tmpb, tmpc;
1505 int reg, len, numchips;
1506 int ret = 0;
1507
1508 virtadr = ioremap(physadr, DOC_IOREMAP_LEN);
1509 if (!virtadr) {
1510 printk(KERN_ERR "Diskonchip ioremap failed: 0x%x bytes at 0x%lx\n", DOC_IOREMAP_LEN, physadr);
1511 return -EIO;
1512 }
1513
1514 /* It's not possible to cleanly detect the DiskOnChip - the
1515 * bootup procedure will put the device into reset mode, and
1516 * it's not possible to talk to it without actually writing
1517 * to the DOCControl register. So we store the current contents
1518 * of the DOCControl register's location, in case we later decide
1519 * that it's not a DiskOnChip, and want to put it back how we
61b03bd7 1520 * found it.
1da177e4
LT
1521 */
1522 save_control = ReadDOC(virtadr, DOCControl);
1523
1524 /* Reset the DiskOnChip ASIC */
e0c7d767
DW
1525 WriteDOC(DOC_MODE_CLR_ERR | DOC_MODE_MDWREN | DOC_MODE_RESET, virtadr, DOCControl);
1526 WriteDOC(DOC_MODE_CLR_ERR | DOC_MODE_MDWREN | DOC_MODE_RESET, virtadr, DOCControl);
1da177e4
LT
1527
1528 /* Enable the DiskOnChip ASIC */
e0c7d767
DW
1529 WriteDOC(DOC_MODE_CLR_ERR | DOC_MODE_MDWREN | DOC_MODE_NORMAL, virtadr, DOCControl);
1530 WriteDOC(DOC_MODE_CLR_ERR | DOC_MODE_MDWREN | DOC_MODE_NORMAL, virtadr, DOCControl);
1da177e4
LT
1531
1532 ChipID = ReadDOC(virtadr, ChipID);
1533
e0c7d767 1534 switch (ChipID) {
1da177e4
LT
1535 case DOC_ChipID_Doc2k:
1536 reg = DoC_2k_ECCStatus;
1537 break;
1538 case DOC_ChipID_DocMil:
1539 reg = DoC_ECCConf;
1540 break;
1541 case DOC_ChipID_DocMilPlus16:
1542 case DOC_ChipID_DocMilPlus32:
1543 case 0:
1544 /* Possible Millennium Plus, need to do more checks */
1545 /* Possibly release from power down mode */
1546 for (tmp = 0; (tmp < 4); tmp++)
1547 ReadDOC(virtadr, Mplus_Power);
1548
1549 /* Reset the Millennium Plus ASIC */
e0c7d767 1550 tmp = DOC_MODE_RESET | DOC_MODE_MDWREN | DOC_MODE_RST_LAT | DOC_MODE_BDECT;
1da177e4
LT
1551 WriteDOC(tmp, virtadr, Mplus_DOCControl);
1552 WriteDOC(~tmp, virtadr, Mplus_CtrlConfirm);
1553
1554 mdelay(1);
1555 /* Enable the Millennium Plus ASIC */
e0c7d767 1556 tmp = DOC_MODE_NORMAL | DOC_MODE_MDWREN | DOC_MODE_RST_LAT | DOC_MODE_BDECT;
1da177e4
LT
1557 WriteDOC(tmp, virtadr, Mplus_DOCControl);
1558 WriteDOC(~tmp, virtadr, Mplus_CtrlConfirm);
1559 mdelay(1);
1560
1561 ChipID = ReadDOC(virtadr, ChipID);
1562
1563 switch (ChipID) {
1564 case DOC_ChipID_DocMilPlus16:
1565 reg = DoC_Mplus_Toggle;
1566 break;
1567 case DOC_ChipID_DocMilPlus32:
1568 printk(KERN_ERR "DiskOnChip Millennium Plus 32MB is not supported, ignoring.\n");
1569 default:
1570 ret = -ENODEV;
1571 goto notfound;
1572 }
1573 break;
1574
1575 default:
1576 ret = -ENODEV;
1577 goto notfound;
1578 }
1579 /* Check the TOGGLE bit in the ECC register */
e0c7d767 1580 tmp = ReadDOC_(virtadr, reg) & DOC_TOGGLE_BIT;
1da177e4
LT
1581 tmpb = ReadDOC_(virtadr, reg) & DOC_TOGGLE_BIT;
1582 tmpc = ReadDOC_(virtadr, reg) & DOC_TOGGLE_BIT;
1583 if ((tmp == tmpb) || (tmp != tmpc)) {
1584 printk(KERN_WARNING "Possible DiskOnChip at 0x%lx failed TOGGLE test, dropping.\n", physadr);
1585 ret = -ENODEV;
1586 goto notfound;
1587 }
1588
1589 for (mtd = doclist; mtd; mtd = doc->nextdoc) {
1590 unsigned char oldval;
1591 unsigned char newval;
1592 nand = mtd->priv;
1593 doc = nand->priv;
1594 /* Use the alias resolution register to determine if this is
1595 in fact the same DOC aliased to a new address. If writes
1596 to one chip's alias resolution register change the value on
1597 the other chip, they're the same chip. */
1598 if (ChipID == DOC_ChipID_DocMilPlus16) {
1599 oldval = ReadDOC(doc->virtadr, Mplus_AliasResolution);
1600 newval = ReadDOC(virtadr, Mplus_AliasResolution);
1601 } else {
1602 oldval = ReadDOC(doc->virtadr, AliasResolution);
1603 newval = ReadDOC(virtadr, AliasResolution);
1604 }
1605 if (oldval != newval)
1606 continue;
1607 if (ChipID == DOC_ChipID_DocMilPlus16) {
1608 WriteDOC(~newval, virtadr, Mplus_AliasResolution);
1609 oldval = ReadDOC(doc->virtadr, Mplus_AliasResolution);
e0c7d767 1610 WriteDOC(newval, virtadr, Mplus_AliasResolution); // restore it
1da177e4
LT
1611 } else {
1612 WriteDOC(~newval, virtadr, AliasResolution);
1613 oldval = ReadDOC(doc->virtadr, AliasResolution);
e0c7d767 1614 WriteDOC(newval, virtadr, AliasResolution); // restore it
1da177e4
LT
1615 }
1616 newval = ~newval;
1617 if (oldval == newval) {
1618 printk(KERN_DEBUG "Found alias of DOC at 0x%lx to 0x%lx\n", doc->physadr, physadr);
1619 goto notfound;
1620 }
1621 }
1622
1623 printk(KERN_NOTICE "DiskOnChip found at 0x%lx\n", physadr);
1624
1625 len = sizeof(struct mtd_info) +
e0c7d767 1626 sizeof(struct nand_chip) + sizeof(struct doc_priv) + (2 * sizeof(struct nand_bbt_descr));
95b93a0c 1627 mtd = kzalloc(len, GFP_KERNEL);
1da177e4
LT
1628 if (!mtd) {
1629 printk(KERN_ERR "DiskOnChip kmalloc (%d bytes) failed!\n", len);
1630 ret = -ENOMEM;
1631 goto fail;
1632 }
1da177e4
LT
1633
1634 nand = (struct nand_chip *) (mtd + 1);
1635 doc = (struct doc_priv *) (nand + 1);
1636 nand->bbt_td = (struct nand_bbt_descr *) (doc + 1);
1637 nand->bbt_md = nand->bbt_td + 1;
1638
1639 mtd->priv = nand;
1640 mtd->owner = THIS_MODULE;
1641
1642 nand->priv = doc;
1643 nand->select_chip = doc200x_select_chip;
7abd3ef9 1644 nand->cmd_ctrl = doc200x_hwcontrol;
1da177e4
LT
1645 nand->dev_ready = doc200x_dev_ready;
1646 nand->waitfunc = doc200x_wait;
1647 nand->block_bad = doc200x_block_bad;
6dfc6d25
TG
1648 nand->ecc.hwctl = doc200x_enable_hwecc;
1649 nand->ecc.calculate = doc200x_calculate_ecc;
1650 nand->ecc.correct = doc200x_correct_data;
1da177e4 1651
5bd34c09 1652 nand->ecc.layout = &doc200x_oobinfo;
6dfc6d25
TG
1653 nand->ecc.mode = NAND_ECC_HW_SYNDROME;
1654 nand->ecc.size = 512;
1655 nand->ecc.bytes = 6;
6a918bad 1656 nand->ecc.strength = 2;
bb9ebd4e 1657 nand->bbt_options = NAND_BBT_USE_FLASH;
1da177e4
LT
1658
1659 doc->physadr = physadr;
1660 doc->virtadr = virtadr;
1661 doc->ChipID = ChipID;
1662 doc->curfloor = -1;
1663 doc->curchip = -1;
1664 doc->mh0_page = -1;
1665 doc->mh1_page = -1;
1666 doc->nextdoc = doclist;
1667
1668 if (ChipID == DOC_ChipID_Doc2k)
1669 numchips = doc2000_init(mtd);
1670 else if (ChipID == DOC_ChipID_DocMilPlus16)
1671 numchips = doc2001plus_init(mtd);
1672 else
1673 numchips = doc2001_init(mtd);
1674
1675 if ((ret = nand_scan(mtd, numchips))) {
1676 /* DBB note: i believe nand_release is necessary here, as
1677 buffers may have been allocated in nand_base. Check with
1678 Thomas. FIX ME! */
0f47e952
JI
1679 /* nand_release will call mtd_device_unregister, but we
1680 haven't yet added it. This is handled without incident by
1681 mtd_device_unregister, as far as I can tell. */
1da177e4
LT
1682 nand_release(mtd);
1683 kfree(mtd);
1684 goto fail;
1685 }
1686
1687 /* Success! */
1688 doclist = mtd;
1689 return 0;
1690
e0c7d767 1691 notfound:
1da177e4
LT
1692 /* Put back the contents of the DOCControl register, in case it's not
1693 actually a DiskOnChip. */
1694 WriteDOC(save_control, virtadr, DOCControl);
e0c7d767 1695 fail:
1da177e4
LT
1696 iounmap(virtadr);
1697 return ret;
1698}
1699
1700static void release_nanddoc(void)
1701{
e0c7d767 1702 struct mtd_info *mtd, *nextmtd;
1da177e4
LT
1703 struct nand_chip *nand;
1704 struct doc_priv *doc;
1705
1706 for (mtd = doclist; mtd; mtd = nextmtd) {
1707 nand = mtd->priv;
1708 doc = nand->priv;
1709
1710 nextmtd = doc->nextdoc;
1711 nand_release(mtd);
1712 iounmap(doc->virtadr);
1713 kfree(mtd);
1714 }
1715}
1716
1717static int __init init_nanddoc(void)
1718{
1719 int i, ret = 0;
1720
1721 /* We could create the decoder on demand, if memory is a concern.
61b03bd7 1722 * This way we have it handy, if an error happens
1da177e4
LT
1723 *
1724 * Symbolsize is 10 (bits)
1725 * Primitve polynomial is x^10+x^3+1
1726 * first consecutive root is 510
1727 * primitve element to generate roots = 1
1728 * generator polinomial degree = 4
1729 */
1730 rs_decoder = init_rs(10, 0x409, FCR, 1, NROOTS);
e0c7d767
DW
1731 if (!rs_decoder) {
1732 printk(KERN_ERR "DiskOnChip: Could not create a RS decoder\n");
1da177e4
LT
1733 return -ENOMEM;
1734 }
1735
1736 if (doc_config_location) {
1737 printk(KERN_INFO "Using configured DiskOnChip probe address 0x%lx\n", doc_config_location);
1738 ret = doc_probe(doc_config_location);
1739 if (ret < 0)
1740 goto outerr;
1741 } else {
e0c7d767 1742 for (i = 0; (doc_locations[i] != 0xffffffff); i++) {
1da177e4
LT
1743 doc_probe(doc_locations[i]);
1744 }
1745 }
1746 /* No banner message any more. Print a message if no DiskOnChip
1747 found, so the user knows we at least tried. */
1748 if (!doclist) {
1749 printk(KERN_INFO "No valid DiskOnChip devices found\n");
1750 ret = -ENODEV;
1751 goto outerr;
1752 }
1753 return 0;
e0c7d767 1754 outerr:
1da177e4
LT
1755 free_rs(rs_decoder);
1756 return ret;
1757}
1758
1759static void __exit cleanup_nanddoc(void)
1760{
1761 /* Cleanup the nand/DoC resources */
1762 release_nanddoc();
1763
1764 /* Free the reed solomon resources */
1765 if (rs_decoder) {
1766 free_rs(rs_decoder);
1767 }
1768}
1769
1770module_init(init_nanddoc);
1771module_exit(cleanup_nanddoc);
1772
1773MODULE_LICENSE("GPL");
1774MODULE_AUTHOR("David Woodhouse <dwmw2@infradead.org>");
2a7af8ca 1775MODULE_DESCRIPTION("M-Systems DiskOnChip 2000, Millennium and Millennium Plus device driver");
This page took 0.565206 seconds and 5 git commands to generate.