]> git.ipfire.org Git - people/ms/u-boot.git/blame - common/cmd_nand.c
* Patch by Matthias Fuchs, 03 May 2005:
[people/ms/u-boot.git] / common / cmd_nand.c
CommitLineData
dc7c9a1a
WD
1/*
2 * Driver for NAND support, Rick Bronson
3 * borrowed heavily from:
4 * (c) 1999 Machine Vision Holdings, Inc.
5 * (c) 1999, 2000 David Woodhouse <dwmw2@infradead.org>
384cc687
WD
6 *
7 * Added 16-bit nand support
8 * (C) 2004 Texas Instruments
dc7c9a1a
WD
9 */
10
11#include <common.h>
dc7c9a1a
WD
12#include <command.h>
13#include <malloc.h>
14#include <asm/io.h>
a3d991bd 15#include <watchdog.h>
dc7c9a1a
WD
16
17#ifdef CONFIG_SHOW_BOOT_PROGRESS
18# include <status_led.h>
19# define SHOW_BOOT_PROGRESS(arg) show_boot_progress(arg)
20#else
21# define SHOW_BOOT_PROGRESS(arg)
22#endif
23
24#if (CONFIG_COMMANDS & CFG_CMD_NAND)
25
dc7c9a1a
WD
26#include <linux/mtd/nand.h>
27#include <linux/mtd/nand_ids.h>
7a8e9bed 28#include <jffs2/jffs2.h>
dc7c9a1a 29
1f4bb37d
WD
30#ifdef CONFIG_OMAP1510
31void archflashwp(void *archdata, int wp);
32#endif
33
34#define ROUND_DOWN(value,boundary) ((value) & (~((boundary)-1)))
35
dc7c9a1a
WD
36/*
37 * Definition of the out of band configuration structure
38 */
39struct nand_oob_config {
40 int ecc_pos[6]; /* position of ECC bytes inside oob */
41 int badblock_pos; /* position of bad block flag inside oob -1 = inactive */
42 int eccvalid_pos; /* position of ECC valid flag inside oob -1 = inactive */
43} oob_config = { {0}, 0, 0};
44
a43278a4 45#undef NAND_DEBUG
dc7c9a1a 46#undef PSYCHO_DEBUG
7a8e9bed
WD
47
48/* ****************** WARNING *********************
49 * When ALLOW_ERASE_BAD_DEBUG is non-zero the erase command will
50 * erase (or at least attempt to erase) blocks that are marked
51 * bad. This can be very handy if you are _sure_ that the block
52 * is OK, say because you marked a good block bad to test bad
53 * block handling and you are done testing, or if you have
54 * accidentally marked blocks bad.
55 *
56 * Erasing factory marked bad blocks is a _bad_ idea. If the
57 * erase succeeds there is no reliable way to find them again,
58 * and attempting to program or erase bad blocks can affect
59 * the data in _other_ (good) blocks.
60 */
61#define ALLOW_ERASE_BAD_DEBUG 0
dc7c9a1a
WD
62
63#define CONFIG_MTD_NAND_ECC /* enable ECC */
1f4bb37d 64#define CONFIG_MTD_NAND_ECC_JFFS2
dc7c9a1a 65
7a8e9bed
WD
66/* bits for nand_rw() `cmd'; or together as needed */
67#define NANDRW_READ 0x01
68#define NANDRW_WRITE 0x00
69#define NANDRW_JFFS2 0x02
a3d991bd 70#define NANDRW_JFFS2_SKIP 0x04
7a8e9bed 71
dc7c9a1a
WD
72/*
73 * Function Prototypes
74 */
75static void nand_print(struct nand_chip *nand);
13a5695b 76int nand_rw (struct nand_chip* nand, int cmd,
dc7c9a1a
WD
77 size_t start, size_t len,
78 size_t * retlen, u_char * buf);
13a5695b 79int nand_erase(struct nand_chip* nand, size_t ofs, size_t len, int clean);
dc7c9a1a
WD
80static int nand_read_ecc(struct nand_chip *nand, size_t start, size_t len,
81 size_t * retlen, u_char *buf, u_char *ecc_code);
82static int nand_write_ecc (struct nand_chip* nand, size_t to, size_t len,
83 size_t * retlen, const u_char * buf, u_char * ecc_code);
7a8e9bed
WD
84static void nand_print_bad(struct nand_chip *nand);
85static int nand_read_oob(struct nand_chip* nand, size_t ofs, size_t len,
86 size_t * retlen, u_char * buf);
87static int nand_write_oob(struct nand_chip* nand, size_t ofs, size_t len,
88 size_t * retlen, const u_char * buf);
1f4bb37d 89static int NanD_WaitReady(struct nand_chip *nand, int ale_wait);
dc7c9a1a
WD
90#ifdef CONFIG_MTD_NAND_ECC
91static int nand_correct_data (u_char *dat, u_char *read_ecc, u_char *calc_ecc);
92static void nand_calculate_ecc (const u_char *dat, u_char *ecc_code);
93#endif
94
7a8e9bed 95struct nand_chip nand_dev_desc[CFG_MAX_NAND_DEVICE] = {{0}};
dc7c9a1a
WD
96
97/* Current NAND Device */
98static int curr_device = -1;
99
100/* ------------------------------------------------------------------------- */
101
102int do_nand (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
103{
104 int rcode = 0;
105
106 switch (argc) {
107 case 0:
108 case 1:
109 printf ("Usage:\n%s\n", cmdtp->usage);
110 return 1;
111 case 2:
8bde7f77 112 if (strcmp(argv[1],"info") == 0) {
dc7c9a1a
WD
113 int i;
114
115 putc ('\n');
116
117 for (i=0; i<CFG_MAX_NAND_DEVICE; ++i) {
118 if(nand_dev_desc[i].ChipID == NAND_ChipID_UNKNOWN)
119 continue; /* list only known devices */
120 printf ("Device %d: ", i);
121 nand_print(&nand_dev_desc[i]);
122 }
123 return 0;
124
125 } else if (strcmp(argv[1],"device") == 0) {
126 if ((curr_device < 0) || (curr_device >= CFG_MAX_NAND_DEVICE)) {
127 puts ("\nno devices available\n");
128 return 1;
129 }
130 printf ("\nDevice %d: ", curr_device);
131 nand_print(&nand_dev_desc[curr_device]);
132 return 0;
7a8e9bed
WD
133
134 } else if (strcmp(argv[1],"bad") == 0) {
135 if ((curr_device < 0) || (curr_device >= CFG_MAX_NAND_DEVICE)) {
136 puts ("\nno devices available\n");
137 return 1;
138 }
139 printf ("\nDevice %d bad blocks:\n", curr_device);
140 nand_print_bad(&nand_dev_desc[curr_device]);
141 return 0;
142
dc7c9a1a
WD
143 }
144 printf ("Usage:\n%s\n", cmdtp->usage);
145 return 1;
146 case 3:
147 if (strcmp(argv[1],"device") == 0) {
148 int dev = (int)simple_strtoul(argv[2], NULL, 10);
149
150 printf ("\nDevice %d: ", dev);
151 if (dev >= CFG_MAX_NAND_DEVICE) {
152 puts ("unknown device\n");
153 return 1;
154 }
155 nand_print(&nand_dev_desc[dev]);
156 /*nand_print (dev);*/
157
158 if (nand_dev_desc[dev].ChipID == NAND_ChipID_UNKNOWN) {
159 return 1;
160 }
161
162 curr_device = dev;
163
164 puts ("... is now current device\n");
165
166 return 0;
167 }
7a8e9bed
WD
168 else if (strcmp(argv[1],"erase") == 0 && strcmp(argv[2], "clean") == 0) {
169 struct nand_chip* nand = &nand_dev_desc[curr_device];
170 ulong off = 0;
171 ulong size = nand->totlen;
172 int ret;
173
174 printf ("\nNAND erase: device %d offset %ld, size %ld ... ",
175 curr_device, off, size);
176
177 ret = nand_erase (nand, off, size, 1);
178
179 printf("%s\n", ret ? "ERROR" : "OK");
180
181 return ret;
182 }
dc7c9a1a
WD
183
184 printf ("Usage:\n%s\n", cmdtp->usage);
185 return 1;
186 default:
187 /* at least 4 args */
188
7a8e9bed
WD
189 if (strncmp(argv[1], "read", 4) == 0 ||
190 strncmp(argv[1], "write", 5) == 0) {
dc7c9a1a
WD
191 ulong addr = simple_strtoul(argv[2], NULL, 16);
192 ulong off = simple_strtoul(argv[3], NULL, 16);
193 ulong size = simple_strtoul(argv[4], NULL, 16);
7a8e9bed
WD
194 int cmd = (strncmp(argv[1], "read", 4) == 0) ?
195 NANDRW_READ : NANDRW_WRITE;
dc7c9a1a 196 int ret, total;
7a8e9bed
WD
197 char* cmdtail = strchr(argv[1], '.');
198
199 if (cmdtail && !strncmp(cmdtail, ".oob", 2)) {
200 /* read out-of-band data */
201 if (cmd & NANDRW_READ) {
202 ret = nand_read_oob(nand_dev_desc + curr_device,
203 off, size, &total,
204 (u_char*)addr);
205 }
206 else {
207 ret = nand_write_oob(nand_dev_desc + curr_device,
208 off, size, &total,
209 (u_char*)addr);
210 }
211 return ret;
212 }
213 else if (cmdtail && !strncmp(cmdtail, ".jffs2", 2))
214 cmd |= NANDRW_JFFS2; /* skip bad blocks */
a3d991bd
WD
215 else if (cmdtail && !strncmp(cmdtail, ".jffs2s", 2)) {
216 cmd |= NANDRW_JFFS2; /* skip bad blocks (on read too) */
217 if (cmd & NANDRW_READ)
218 cmd |= NANDRW_JFFS2_SKIP; /* skip bad blocks (on read too) */
219 }
7a8e9bed
WD
220#ifdef SXNI855T
221 /* need ".e" same as ".j" for compatibility with older units */
222 else if (cmdtail && !strcmp(cmdtail, ".e"))
223 cmd |= NANDRW_JFFS2; /* skip bad blocks */
224#endif
a842a6d2
SR
225#ifdef CFG_NAND_SKIP_BAD_DOT_I
226 /* need ".i" same as ".jffs2s" for compatibility with older units (esd) */
227 /* ".i" for image -> read skips bad block (no 0xff) */
228 else if (cmdtail && !strcmp(cmdtail, ".i"))
229 cmd |= NANDRW_JFFS2; /* skip bad blocks (on read too) */
230 if (cmd & NANDRW_READ)
231 cmd |= NANDRW_JFFS2_SKIP; /* skip bad blocks (on read too) */
232#endif /* CFG_NAND_SKIP_BAD_DOT_I */
7a8e9bed
WD
233 else if (cmdtail) {
234 printf ("Usage:\n%s\n", cmdtp->usage);
235 return 1;
236 }
dc7c9a1a
WD
237
238 printf ("\nNAND %s: device %d offset %ld, size %ld ... ",
7a8e9bed
WD
239 (cmd & NANDRW_READ) ? "read" : "write",
240 curr_device, off, size);
dc7c9a1a
WD
241
242 ret = nand_rw(nand_dev_desc + curr_device, cmd, off, size,
243 &total, (u_char*)addr);
244
1f4bb37d 245 printf (" %d bytes %s: %s\n", total,
998eaaec 246 (cmd & NANDRW_READ) ? "read" : "written",
dc7c9a1a
WD
247 ret ? "ERROR" : "OK");
248
249 return ret;
7a8e9bed
WD
250 } else if (strcmp(argv[1],"erase") == 0 &&
251 (argc == 4 || strcmp("clean", argv[2]) == 0)) {
252 int clean = argc == 5;
253 ulong off = simple_strtoul(argv[2 + clean], NULL, 16);
254 ulong size = simple_strtoul(argv[3 + clean], NULL, 16);
dc7c9a1a
WD
255 int ret;
256
257 printf ("\nNAND erase: device %d offset %ld, size %ld ... ",
258 curr_device, off, size);
259
7a8e9bed 260 ret = nand_erase (nand_dev_desc + curr_device, off, size, clean);
dc7c9a1a
WD
261
262 printf("%s\n", ret ? "ERROR" : "OK");
263
264 return ret;
265 } else {
266 printf ("Usage:\n%s\n", cmdtp->usage);
267 rcode = 1;
268 }
269
270 return rcode;
271 }
272}
273
0d498393
WD
274U_BOOT_CMD(
275 nand, 5, 1, do_nand,
b0fce99b
WD
276 "nand - NAND sub-system\n",
277 "info - show available NAND devices\n"
278 "nand device [dev] - show or set current device\n"
a3d991bd 279 "nand read[.jffs2[s]] addr off size\n"
b0fce99b
WD
280 "nand write[.jffs2] addr off size - read/write `size' bytes starting\n"
281 " at offset `off' to/from memory address `addr'\n"
282 "nand erase [clean] [off size] - erase `size' bytes from\n"
283 " offset `off' (entire device if not specified)\n"
284 "nand bad - show bad blocks\n"
285 "nand read.oob addr off size - read out-of-band data\n"
286 "nand write.oob addr off size - read out-of-band data\n"
287);
288
dc7c9a1a
WD
289int do_nandboot (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
290{
291 char *boot_device = NULL;
292 char *ep;
293 int dev;
294 ulong cnt;
295 ulong addr;
296 ulong offset = 0;
297 image_header_t *hdr;
298 int rcode = 0;
299 switch (argc) {
300 case 1:
301 addr = CFG_LOAD_ADDR;
302 boot_device = getenv ("bootdevice");
303 break;
304 case 2:
305 addr = simple_strtoul(argv[1], NULL, 16);
306 boot_device = getenv ("bootdevice");
307 break;
308 case 3:
309 addr = simple_strtoul(argv[1], NULL, 16);
310 boot_device = argv[2];
311 break;
312 case 4:
313 addr = simple_strtoul(argv[1], NULL, 16);
314 boot_device = argv[2];
315 offset = simple_strtoul(argv[3], NULL, 16);
316 break;
317 default:
318 printf ("Usage:\n%s\n", cmdtp->usage);
319 SHOW_BOOT_PROGRESS (-1);
320 return 1;
321 }
322
323 if (!boot_device) {
324 puts ("\n** No boot device **\n");
325 SHOW_BOOT_PROGRESS (-1);
326 return 1;
327 }
328
329 dev = simple_strtoul(boot_device, &ep, 16);
330
331 if ((dev >= CFG_MAX_NAND_DEVICE) ||
332 (nand_dev_desc[dev].ChipID == NAND_ChipID_UNKNOWN)) {
333 printf ("\n** Device %d not available\n", dev);
334 SHOW_BOOT_PROGRESS (-1);
335 return 1;
336 }
337
7a8e9bed 338 printf ("\nLoading from device %d: %s at 0x%lx (offset 0x%lx)\n",
dc7c9a1a
WD
339 dev, nand_dev_desc[dev].name, nand_dev_desc[dev].IO_ADDR,
340 offset);
341
7a8e9bed 342 if (nand_rw (nand_dev_desc + dev, NANDRW_READ, offset,
dc7c9a1a
WD
343 SECTORSIZE, NULL, (u_char *)addr)) {
344 printf ("** Read error on %d\n", dev);
345 SHOW_BOOT_PROGRESS (-1);
346 return 1;
347 }
348
349 hdr = (image_header_t *)addr;
350
351 if (ntohl(hdr->ih_magic) == IH_MAGIC) {
352
353 print_image_hdr (hdr);
354
355 cnt = (ntohl(hdr->ih_size) + sizeof(image_header_t));
356 cnt -= SECTORSIZE;
357 } else {
358 printf ("\n** Bad Magic Number 0x%x **\n", hdr->ih_magic);
359 SHOW_BOOT_PROGRESS (-1);
360 return 1;
361 }
362
7a8e9bed 363 if (nand_rw (nand_dev_desc + dev, NANDRW_READ, offset + SECTORSIZE, cnt,
dc7c9a1a
WD
364 NULL, (u_char *)(addr+SECTORSIZE))) {
365 printf ("** Read error on %d\n", dev);
366 SHOW_BOOT_PROGRESS (-1);
367 return 1;
368 }
369
370 /* Loading ok, update default load address */
371
372 load_addr = addr;
373
374 /* Check if we should attempt an auto-start */
375 if (((ep = getenv("autostart")) != NULL) && (strcmp(ep,"yes") == 0)) {
376 char *local_args[2];
377 extern int do_bootm (cmd_tbl_t *, int, int, char *[]);
378
379 local_args[0] = argv[0];
380 local_args[1] = NULL;
381
7a8e9bed 382 printf ("Automatic boot of image at addr 0x%08lx ...\n", addr);
dc7c9a1a
WD
383
384 do_bootm (cmdtp, 0, 1, local_args);
385 rcode = 1;
386 }
387 return rcode;
388}
389
0d498393
WD
390U_BOOT_CMD(
391 nboot, 4, 1, do_nandboot,
b0fce99b
WD
392 "nboot - boot from NAND device\n",
393 "loadAddr dev\n"
394);
395
7a8e9bed
WD
396/* returns 0 if block containing pos is OK:
397 * valid erase block and
398 * not marked bad, or no bad mark position is specified
399 * returns 1 if marked bad or otherwise invalid
400 */
384cc687 401int check_block (struct nand_chip *nand, unsigned long pos)
7a8e9bed
WD
402{
403 int retlen;
404 uint8_t oob_data;
384cc687 405 uint16_t oob_data16[6];
7a8e9bed
WD
406 int page0 = pos & (-nand->erasesize);
407 int page1 = page0 + nand->oobblock;
408 int badpos = oob_config.badblock_pos;
409
410 if (pos >= nand->totlen)
411 return 1;
412
413 if (badpos < 0)
414 return 0; /* no way to check, assume OK */
415
384cc687
WD
416 if (nand->bus16) {
417 if (nand_read_oob(nand, (page0 + 0), 12, &retlen, (uint8_t *)oob_data16)
418 || (oob_data16[2] & 0xff00) != 0xff00)
419 return 1;
420 if (nand_read_oob(nand, (page1 + 0), 12, &retlen, (uint8_t *)oob_data16)
421 || (oob_data16[2] & 0xff00) != 0xff00)
422 return 1;
423 } else {
424 /* Note - bad block marker can be on first or second page */
425 if (nand_read_oob(nand, page0 + badpos, 1, &retlen, &oob_data)
426 || oob_data != 0xff
427 || nand_read_oob (nand, page1 + badpos, 1, &retlen, &oob_data)
428 || oob_data != 0xff)
429 return 1;
430 }
7a8e9bed
WD
431
432 return 0;
433}
8bde7f77 434
7a8e9bed
WD
435/* print bad blocks in NAND flash */
436static void nand_print_bad(struct nand_chip* nand)
437{
438 unsigned long pos;
439
440 for (pos = 0; pos < nand->totlen; pos += nand->erasesize) {
441 if (check_block(nand, pos))
442 printf(" 0x%8.8lx\n", pos);
443 }
444 puts("\n");
445}
446
447/* cmd: 0: NANDRW_WRITE write, fail on bad block
448 * 1: NANDRW_READ read, fail on bad block
449 * 2: NANDRW_WRITE | NANDRW_JFFS2 write, skip bad blocks
450 * 3: NANDRW_READ | NANDRW_JFFS2 read, data all 0xff for bad blocks
a3d991bd 451 * 7: NANDRW_READ | NANDRW_JFFS2 | NANDRW_JFFS2_SKIP read, skip bad blocks
7a8e9bed 452 */
13a5695b 453int nand_rw (struct nand_chip* nand, int cmd,
dc7c9a1a
WD
454 size_t start, size_t len,
455 size_t * retlen, u_char * buf)
456{
1f4bb37d 457 int ret = 0, n, total = 0;
dc7c9a1a 458 char eccbuf[6];
7a8e9bed
WD
459 /* eblk (once set) is the start of the erase block containing the
460 * data being processed.
461 */
462 unsigned long eblk = ~0; /* force mismatch on first pass */
463 unsigned long erasesize = nand->erasesize;
464
465 while (len) {
466 if ((start & (-erasesize)) != eblk) {
467 /* have crossed into new erase block, deal with
468 * it if it is sure marked bad.
469 */
470 eblk = start & (-erasesize); /* start of block */
471 if (check_block(nand, eblk)) {
472 if (cmd == (NANDRW_READ | NANDRW_JFFS2)) {
473 while (len > 0 &&
474 start - eblk < erasesize) {
475 *(buf++) = 0xff;
476 ++start;
477 ++total;
478 --len;
479 }
480 continue;
384cc687 481 } else if (cmd == (NANDRW_READ | NANDRW_JFFS2 | NANDRW_JFFS2_SKIP)) {
a3d991bd
WD
482 start += erasesize;
483 continue;
384cc687 484 } else if (cmd == (NANDRW_WRITE | NANDRW_JFFS2)) {
7a8e9bed
WD
485 /* skip bad block */
486 start += erasesize;
487 continue;
384cc687 488 } else {
7a8e9bed
WD
489 ret = 1;
490 break;
491 }
492 }
493 }
dc7c9a1a
WD
494 /* The ECC will not be calculated correctly if
495 less than 512 is written or read */
1f4bb37d
WD
496 /* Is request at least 512 bytes AND it starts on a proper boundry */
497 if((start != ROUND_DOWN(start, 0x200)) || (len < 0x200))
498 printf("Warning block writes should be at least 512 bytes and start on a 512 byte boundry\n");
499
384cc687 500 if (cmd & NANDRW_READ) {
7a8e9bed
WD
501 ret = nand_read_ecc(nand, start,
502 min(len, eblk + erasesize - start),
1f4bb37d 503 &n, (u_char*)buf, eccbuf);
384cc687 504 } else {
7a8e9bed
WD
505 ret = nand_write_ecc(nand, start,
506 min(len, eblk + erasesize - start),
1f4bb37d 507 &n, (u_char*)buf, eccbuf);
384cc687 508 }
dc7c9a1a
WD
509
510 if (ret)
511 break;
512
513 start += n;
514 buf += n;
515 total += n;
516 len -= n;
517 }
518 if (retlen)
519 *retlen = total;
520
521 return ret;
522}
523
524static void nand_print(struct nand_chip *nand)
0db5bca8 525{
7a8e9bed
WD
526 if (nand->numchips > 1) {
527 printf("%s at 0x%lx,\n"
528 "\t %d chips %s, size %d MB, \n"
529 "\t total size %ld MB, sector size %ld kB\n",
530 nand->name, nand->IO_ADDR, nand->numchips,
531 nand->chips_name, 1 << (nand->chipshift - 20),
532 nand->totlen >> 20, nand->erasesize >> 10);
533 }
534 else {
8bde7f77 535 printf("%s at 0x%lx (", nand->chips_name, nand->IO_ADDR);
7a8e9bed
WD
536 print_size(nand->totlen, ", ");
537 print_size(nand->erasesize, " sector)\n");
dc7c9a1a
WD
538 }
539}
540
541/* ------------------------------------------------------------------------- */
542
1f4bb37d 543static int NanD_WaitReady(struct nand_chip *nand, int ale_wait)
dc7c9a1a
WD
544{
545 /* This is inline, to optimise the common case, where it's ready instantly */
546 int ret = 0;
dc7c9a1a 547
1f4bb37d
WD
548#ifdef NAND_NO_RB /* in config file, shorter delays currently wrap accesses */
549 if(ale_wait)
550 NAND_WAIT_READY(nand); /* do the worst case 25us wait */
551 else
552 udelay(10);
553#else /* has functional r/b signal */
12f34241 554 NAND_WAIT_READY(nand);
1f4bb37d 555#endif
dc7c9a1a
WD
556 return ret;
557}
558
559/* NanD_Command: Send a flash command to the flash chip */
560
561static inline int NanD_Command(struct nand_chip *nand, unsigned char command)
562{
563 unsigned long nandptr = nand->IO_ADDR;
564
565 /* Assert the CLE (Command Latch Enable) line to the flash chip */
566 NAND_CTL_SETCLE(nandptr);
567
568 /* Send the command */
569 WRITE_NAND_COMMAND(command, nandptr);
570
571 /* Lower the CLE line */
572 NAND_CTL_CLRCLE(nandptr);
573
1f4bb37d
WD
574#ifdef NAND_NO_RB
575 if(command == NAND_CMD_RESET){
576 u_char ret_val;
577 NanD_Command(nand, NAND_CMD_STATUS);
384cc687 578 do {
1f4bb37d
WD
579 ret_val = READ_NAND(nandptr);/* wait till ready */
580 } while((ret_val & 0x40) != 0x40);
581 }
582#endif
583 return NanD_WaitReady(nand, 0);
dc7c9a1a
WD
584}
585
586/* NanD_Address: Set the current address for the flash chip */
587
588static int NanD_Address(struct nand_chip *nand, int numbytes, unsigned long ofs)
0db5bca8
WD
589{
590 unsigned long nandptr;
591 int i;
dc7c9a1a 592
0db5bca8 593 nandptr = nand->IO_ADDR;
dc7c9a1a
WD
594
595 /* Assert the ALE (Address Latch Enable) line to the flash chip */
0db5bca8
WD
596 NAND_CTL_SETALE(nandptr);
597
598 /* Send the address */
599 /* Devices with 256-byte page are addressed as:
600 * Column (bits 0-7), Page (bits 8-15, 16-23, 24-31)
601 * there is no device on the market with page256
602 * and more than 24 bits.
603 * Devices with 512-byte page are addressed as:
604 * Column (bits 0-7), Page (bits 9-16, 17-24, 25-31)
605 * 25-31 is sent only if the chip support it.
606 * bit 8 changes the read command to be sent
607 * (NAND_CMD_READ0 or NAND_CMD_READ1).
dc7c9a1a
WD
608 */
609
0db5bca8
WD
610 if (numbytes == ADDR_COLUMN || numbytes == ADDR_COLUMN_PAGE)
611 WRITE_NAND_ADDRESS(ofs, nandptr);
dc7c9a1a 612
0db5bca8 613 ofs = ofs >> nand->page_shift;
dc7c9a1a 614
384cc687
WD
615 if (numbytes == ADDR_PAGE || numbytes == ADDR_COLUMN_PAGE) {
616 for (i = 0; i < nand->pageadrlen; i++, ofs = ofs >> 8) {
0db5bca8 617 WRITE_NAND_ADDRESS(ofs, nandptr);
384cc687
WD
618 }
619 }
dc7c9a1a 620
0db5bca8
WD
621 /* Lower the ALE line */
622 NAND_CTL_CLRALE(nandptr);
dc7c9a1a 623
0db5bca8 624 /* Wait for the chip to respond */
1f4bb37d 625 return NanD_WaitReady(nand, 1);
0db5bca8 626}
dc7c9a1a
WD
627
628/* NanD_SelectChip: Select a given flash chip within the current floor */
629
630static inline int NanD_SelectChip(struct nand_chip *nand, int chip)
631{
632 /* Wait for it to be ready */
1f4bb37d 633 return NanD_WaitReady(nand, 0);
dc7c9a1a
WD
634}
635
636/* NanD_IdentChip: Identify a given NAND chip given {floor,chip} */
637
638static int NanD_IdentChip(struct nand_chip *nand, int floor, int chip)
639{
640 int mfr, id, i;
641
0db5bca8 642 NAND_ENABLE_CE(nand); /* set pin low */
dc7c9a1a
WD
643 /* Reset the chip */
644 if (NanD_Command(nand, NAND_CMD_RESET)) {
645#ifdef NAND_DEBUG
646 printf("NanD_Command (reset) for %d,%d returned true\n",
647 floor, chip);
648#endif
0db5bca8 649 NAND_DISABLE_CE(nand); /* set pin high */
dc7c9a1a
WD
650 return 0;
651 }
652
653 /* Read the NAND chip ID: 1. Send ReadID command */
654 if (NanD_Command(nand, NAND_CMD_READID)) {
655#ifdef NAND_DEBUG
656 printf("NanD_Command (ReadID) for %d,%d returned true\n",
657 floor, chip);
658#endif
0db5bca8 659 NAND_DISABLE_CE(nand); /* set pin high */
dc7c9a1a
WD
660 return 0;
661 }
662
663 /* Read the NAND chip ID: 2. Send address byte zero */
664 NanD_Address(nand, ADDR_COLUMN, 0);
665
666 /* Read the manufacturer and device id codes from the device */
667
668 mfr = READ_NAND(nand->IO_ADDR);
669
670 id = READ_NAND(nand->IO_ADDR);
671
8bde7f77 672 NAND_DISABLE_CE(nand); /* set pin high */
dc7c9a1a 673 /* No response - return failure */
0db5bca8 674 if (mfr == 0xff || mfr == 0) {
4d816774 675#ifdef NAND_DEBUG
0db5bca8 676 printf("NanD_Command (ReadID) got %d %d\n", mfr, id);
4d816774 677#endif
0db5bca8
WD
678 return 0;
679 }
dc7c9a1a
WD
680
681 /* Check it's the same as the first chip we identified.
682 * M-Systems say that any given nand_chip device should only
683 * contain _one_ type of flash part, although that's not a
684 * hardware restriction. */
685 if (nand->mfr) {
384cc687 686 if (nand->mfr == mfr && nand->id == id) {
dc7c9a1a 687 return 1; /* This is another the same the first */
384cc687 688 } else {
dc7c9a1a
WD
689 printf("Flash chip at floor %d, chip %d is different:\n",
690 floor, chip);
384cc687 691 }
dc7c9a1a
WD
692 }
693
694 /* Print and store the manufacturer and ID codes. */
695 for (i = 0; nand_flash_ids[i].name != NULL; i++) {
696 if (mfr == nand_flash_ids[i].manufacture_id &&
697 id == nand_flash_ids[i].model_id) {
698#ifdef NAND_DEBUG
699 printf("Flash chip found:\n\t Manufacturer ID: 0x%2.2X, "
700 "Chip ID: 0x%2.2X (%s)\n", mfr, id,
701 nand_flash_ids[i].name);
702#endif
703 if (!nand->mfr) {
704 nand->mfr = mfr;
705 nand->id = id;
706 nand->chipshift =
707 nand_flash_ids[i].chipshift;
708 nand->page256 = nand_flash_ids[i].page256;
7a8e9bed 709 nand->eccsize = 256;
dc7c9a1a
WD
710 if (nand->page256) {
711 nand->oobblock = 256;
712 nand->oobsize = 8;
713 nand->page_shift = 8;
714 } else {
715 nand->oobblock = 512;
716 nand->oobsize = 16;
717 nand->page_shift = 9;
718 }
384cc687
WD
719 nand->pageadrlen = nand_flash_ids[i].pageadrlen;
720 nand->erasesize = nand_flash_ids[i].erasesize;
721 nand->chips_name = nand_flash_ids[i].name;
722 nand->bus16 = nand_flash_ids[i].bus16;
723 return 1;
dc7c9a1a
WD
724 }
725 return 0;
726 }
727 }
728
729
730#ifdef NAND_DEBUG
731 /* We haven't fully identified the chip. Print as much as we know. */
732 printf("Unknown flash chip found: %2.2X %2.2X\n",
733 id, mfr);
734#endif
735
736 return 0;
737}
738
739/* NanD_ScanChips: Find all NAND chips present in a nand_chip, and identify them */
740
741static void NanD_ScanChips(struct nand_chip *nand)
742{
743 int floor, chip;
744 int numchips[NAND_MAX_FLOORS];
745 int maxchips = NAND_MAX_CHIPS;
746 int ret = 1;
747
748 nand->numchips = 0;
749 nand->mfr = 0;
750 nand->id = 0;
751
752
753 /* For each floor, find the number of valid chips it contains */
754 for (floor = 0; floor < NAND_MAX_FLOORS; floor++) {
755 ret = 1;
756 numchips[floor] = 0;
757 for (chip = 0; chip < maxchips && ret != 0; chip++) {
758
759 ret = NanD_IdentChip(nand, floor, chip);
760 if (ret) {
761 numchips[floor]++;
762 nand->numchips++;
763 }
764 }
765 }
766
767 /* If there are none at all that we recognise, bail */
768 if (!nand->numchips) {
a43278a4 769#ifdef NAND_DEBUG
4d816774 770 puts ("No NAND flash chips recognised.\n");
a43278a4 771#endif
dc7c9a1a
WD
772 return;
773 }
774
775 /* Allocate an array to hold the information for each chip */
776 nand->chips = malloc(sizeof(struct Nand) * nand->numchips);
777 if (!nand->chips) {
778 puts ("No memory for allocating chip info structures\n");
779 return;
780 }
781
782 ret = 0;
783
784 /* Fill out the chip array with {floor, chipno} for each
785 * detected chip in the device. */
786 for (floor = 0; floor < NAND_MAX_FLOORS; floor++) {
787 for (chip = 0; chip < numchips[floor]; chip++) {
788 nand->chips[ret].floor = floor;
789 nand->chips[ret].chip = chip;
790 nand->chips[ret].curadr = 0;
791 nand->chips[ret].curmode = 0x50;
792 ret++;
793 }
794 }
795
796 /* Calculate and print the total size of the device */
797 nand->totlen = nand->numchips * (1 << nand->chipshift);
798
799#ifdef NAND_DEBUG
800 printf("%d flash chips found. Total nand_chip size: %ld MB\n",
801 nand->numchips, nand->totlen >> 20);
802#endif
803}
0db5bca8 804
dc7c9a1a 805/* we need to be fast here, 1 us per read translates to 1 second per meg */
384cc687 806static void NanD_ReadBuf (struct nand_chip *nand, u_char * data_buf, int cntr)
0db5bca8 807{
7a8e9bed 808 unsigned long nandptr = nand->IO_ADDR;
0db5bca8 809
384cc687
WD
810 NanD_Command (nand, NAND_CMD_READ0);
811
812 if (nand->bus16) {
813 u16 val;
814
815 while (cntr >= 16) {
816 val = READ_NAND (nandptr);
817 *data_buf++ = val & 0xff;
818 *data_buf++ = val >> 8;
819 val = READ_NAND (nandptr);
820 *data_buf++ = val & 0xff;
821 *data_buf++ = val >> 8;
822 val = READ_NAND (nandptr);
823 *data_buf++ = val & 0xff;
824 *data_buf++ = val >> 8;
825 val = READ_NAND (nandptr);
826 *data_buf++ = val & 0xff;
827 *data_buf++ = val >> 8;
828 val = READ_NAND (nandptr);
829 *data_buf++ = val & 0xff;
830 *data_buf++ = val >> 8;
831 val = READ_NAND (nandptr);
832 *data_buf++ = val & 0xff;
833 *data_buf++ = val >> 8;
834 val = READ_NAND (nandptr);
835 *data_buf++ = val & 0xff;
836 *data_buf++ = val >> 8;
837 val = READ_NAND (nandptr);
838 *data_buf++ = val & 0xff;
839 *data_buf++ = val >> 8;
840 cntr -= 16;
841 }
842
843 while (cntr > 0) {
844 val = READ_NAND (nandptr);
845 *data_buf++ = val & 0xff;
846 *data_buf++ = val >> 8;
847 cntr -= 2;
848 }
849 } else {
850 while (cntr >= 16) {
851 *data_buf++ = READ_NAND (nandptr);
852 *data_buf++ = READ_NAND (nandptr);
853 *data_buf++ = READ_NAND (nandptr);
854 *data_buf++ = READ_NAND (nandptr);
855 *data_buf++ = READ_NAND (nandptr);
856 *data_buf++ = READ_NAND (nandptr);
857 *data_buf++ = READ_NAND (nandptr);
858 *data_buf++ = READ_NAND (nandptr);
859 *data_buf++ = READ_NAND (nandptr);
860 *data_buf++ = READ_NAND (nandptr);
861 *data_buf++ = READ_NAND (nandptr);
862 *data_buf++ = READ_NAND (nandptr);
863 *data_buf++ = READ_NAND (nandptr);
864 *data_buf++ = READ_NAND (nandptr);
865 *data_buf++ = READ_NAND (nandptr);
866 *data_buf++ = READ_NAND (nandptr);
867 cntr -= 16;
868 }
869
870 while (cntr > 0) {
871 *data_buf++ = READ_NAND (nandptr);
872 cntr--;
873 }
0db5bca8
WD
874 }
875}
dc7c9a1a 876
dc7c9a1a
WD
877/*
878 * NAND read with ECC
879 */
880static int nand_read_ecc(struct nand_chip *nand, size_t start, size_t len,
881 size_t * retlen, u_char *buf, u_char *ecc_code)
882{
883 int col, page;
884 int ecc_status = 0;
885#ifdef CONFIG_MTD_NAND_ECC
886 int j;
887 int ecc_failed = 0;
888 u_char *data_poi;
889 u_char ecc_calc[6];
890#endif
dc7c9a1a
WD
891
892 /* Do not allow reads past end of device */
893 if ((start + len) > nand->totlen) {
384cc687
WD
894 printf ("%s: Attempt read beyond end of device %x %x %x\n",
895 __FUNCTION__, (uint) start, (uint) len, (uint) nand->totlen);
dc7c9a1a
WD
896 *retlen = 0;
897 return -1;
898 }
899
900 /* First we calculate the starting page */
0db5bca8
WD
901 /*page = shr(start, nand->page_shift);*/
902 page = start >> nand->page_shift;
dc7c9a1a
WD
903
904 /* Get raw starting column */
905 col = start & (nand->oobblock - 1);
906
907 /* Initialize return value */
908 *retlen = 0;
909
910 /* Select the NAND device */
911 NAND_ENABLE_CE(nand); /* set pin low */
912
913 /* Loop until all data read */
914 while (*retlen < len) {
915
dc7c9a1a 916#ifdef CONFIG_MTD_NAND_ECC
dc7c9a1a
WD
917 /* Do we have this page in cache ? */
918 if (nand->cache_page == page)
919 goto readdata;
920 /* Send the read command */
921 NanD_Command(nand, NAND_CMD_READ0);
384cc687
WD
922 if (nand->bus16) {
923 NanD_Address(nand, ADDR_COLUMN_PAGE,
924 (page << nand->page_shift) + (col >> 1));
925 } else {
926 NanD_Address(nand, ADDR_COLUMN_PAGE,
927 (page << nand->page_shift) + col);
928 }
929
dc7c9a1a 930 /* Read in a page + oob data */
7a8e9bed 931 NanD_ReadBuf(nand, nand->data_buf, nand->oobblock + nand->oobsize);
dc7c9a1a
WD
932
933 /* copy data into cache, for read out of cache and if ecc fails */
384cc687
WD
934 if (nand->data_cache) {
935 memcpy (nand->data_cache, nand->data_buf,
936 nand->oobblock + nand->oobsize);
937 }
dc7c9a1a
WD
938
939 /* Pick the ECC bytes out of the oob data */
384cc687 940 for (j = 0; j < 6; j++) {
dc7c9a1a 941 ecc_code[j] = nand->data_buf[(nand->oobblock + oob_config.ecc_pos[j])];
384cc687 942 }
dc7c9a1a
WD
943
944 /* Calculate the ECC and verify it */
945 /* If block was not written with ECC, skip ECC */
946 if (oob_config.eccvalid_pos != -1 &&
947 (nand->data_buf[nand->oobblock + oob_config.eccvalid_pos] & 0x0f) != 0x0f) {
948
949 nand_calculate_ecc (&nand->data_buf[0], &ecc_calc[0]);
950 switch (nand_correct_data (&nand->data_buf[0], &ecc_code[0], &ecc_calc[0])) {
951 case -1:
0db5bca8 952 printf ("%s: Failed ECC read, page 0x%08x\n", __FUNCTION__, page);
dc7c9a1a
WD
953 ecc_failed++;
954 break;
955 case 1:
956 case 2: /* transfer ECC corrected data to cache */
7a8e9bed
WD
957 if (nand->data_cache)
958 memcpy (nand->data_cache, nand->data_buf, 256);
dc7c9a1a
WD
959 break;
960 }
961 }
962
963 if (oob_config.eccvalid_pos != -1 &&
964 nand->oobblock == 512 && (nand->data_buf[nand->oobblock + oob_config.eccvalid_pos] & 0xf0) != 0xf0) {
965
966 nand_calculate_ecc (&nand->data_buf[256], &ecc_calc[3]);
967 switch (nand_correct_data (&nand->data_buf[256], &ecc_code[3], &ecc_calc[3])) {
968 case -1:
0db5bca8 969 printf ("%s: Failed ECC read, page 0x%08x\n", __FUNCTION__, page);
dc7c9a1a
WD
970 ecc_failed++;
971 break;
972 case 1:
973 case 2: /* transfer ECC corrected data to cache */
974 if (nand->data_cache)
975 memcpy (&nand->data_cache[256], &nand->data_buf[256], 256);
976 break;
977 }
978 }
979readdata:
980 /* Read the data from ECC data buffer into return buffer */
981 data_poi = (nand->data_cache) ? nand->data_cache : nand->data_buf;
982 data_poi += col;
983 if ((*retlen + (nand->oobblock - col)) >= len) {
7a8e9bed 984 memcpy (buf + *retlen, data_poi, len - *retlen);
dc7c9a1a
WD
985 *retlen = len;
986 } else {
7a8e9bed 987 memcpy (buf + *retlen, data_poi, nand->oobblock - col);
dc7c9a1a
WD
988 *retlen += nand->oobblock - col;
989 }
990 /* Set cache page address, invalidate, if ecc_failed */
991 nand->cache_page = (nand->data_cache && !ecc_failed) ? page : -1;
992
993 ecc_status += ecc_failed;
994 ecc_failed = 0;
995
996#else
997 /* Send the read command */
998 NanD_Command(nand, NAND_CMD_READ0);
384cc687
WD
999 if (nand->bus16) {
1000 NanD_Address(nand, ADDR_COLUMN_PAGE,
1001 (page << nand->page_shift) + (col >> 1));
1002 } else {
1003 NanD_Address(nand, ADDR_COLUMN_PAGE,
1004 (page << nand->page_shift) + col);
1005 }
1006
dc7c9a1a
WD
1007 /* Read the data directly into the return buffer */
1008 if ((*retlen + (nand->oobblock - col)) >= len) {
7a8e9bed 1009 NanD_ReadBuf(nand, buf + *retlen, len - *retlen);
dc7c9a1a
WD
1010 *retlen = len;
1011 /* We're done */
1012 continue;
1013 } else {
7a8e9bed 1014 NanD_ReadBuf(nand, buf + *retlen, nand->oobblock - col);
dc7c9a1a
WD
1015 *retlen += nand->oobblock - col;
1016 }
1017#endif
1018 /* For subsequent reads align to page boundary. */
1019 col = 0;
1020 /* Increment page address */
1021 page++;
1022 }
1023
1024 /* De-select the NAND device */
0db5bca8 1025 NAND_DISABLE_CE(nand); /* set pin high */
dc7c9a1a
WD
1026
1027 /*
1028 * Return success, if no ECC failures, else -EIO
1029 * fs driver will take care of that, because
1030 * retlen == desired len and result == -EIO
1031 */
1032 return ecc_status ? -1 : 0;
1033}
1034
dc7c9a1a
WD
1035/*
1036 * Nand_page_program function is used for write and writev !
1037 */
1038static int nand_write_page (struct nand_chip *nand,
1039 int page, int col, int last, u_char * ecc_code)
1040{
1041
1042 int i;
dc7c9a1a 1043 unsigned long nandptr = nand->IO_ADDR;
384cc687 1044
1f4bb37d 1045#ifdef CONFIG_MTD_NAND_ECC
dc7c9a1a
WD
1046#ifdef CONFIG_MTD_NAND_VERIFY_WRITE
1047 int ecc_bytes = (nand->oobblock == 512) ? 6 : 3;
1048#endif
1049#endif
1050 /* pad oob area */
1051 for (i = nand->oobblock; i < nand->oobblock + nand->oobsize; i++)
1052 nand->data_buf[i] = 0xff;
1053
1054#ifdef CONFIG_MTD_NAND_ECC
1055 /* Zero out the ECC array */
1056 for (i = 0; i < 6; i++)
1057 ecc_code[i] = 0x00;
1058
1059 /* Read back previous written data, if col > 0 */
1060 if (col) {
384cc687
WD
1061 NanD_Command (nand, NAND_CMD_READ0);
1062 if (nand->bus16) {
1063 NanD_Address (nand, ADDR_COLUMN_PAGE,
1064 (page << nand->page_shift) + (col >> 1));
1065 } else {
1066 NanD_Address (nand, ADDR_COLUMN_PAGE,
1067 (page << nand->page_shift) + col);
1068 }
1069
1070 if (nand->bus16) {
1071 u16 val;
1072
1073 for (i = 0; i < col; i += 2) {
1074 val = READ_NAND (nandptr);
1075 nand->data_buf[i] = val & 0xff;
1076 nand->data_buf[i + 1] = val >> 8;
1077 }
1078 } else {
1079 for (i = 0; i < col; i++)
1080 nand->data_buf[i] = READ_NAND (nandptr);
1081 }
dc7c9a1a
WD
1082 }
1083
1084 /* Calculate and write the ECC if we have enough data */
1085 if ((col < nand->eccsize) && (last >= nand->eccsize)) {
1086 nand_calculate_ecc (&nand->data_buf[0], &(ecc_code[0]));
384cc687
WD
1087 for (i = 0; i < 3; i++) {
1088 nand->data_buf[(nand->oobblock +
1089 oob_config.ecc_pos[i])] = ecc_code[i];
1090 }
1091 if (oob_config.eccvalid_pos != -1) {
1092 nand->data_buf[nand->oobblock +
1093 oob_config.eccvalid_pos] = 0xf0;
1094 }
dc7c9a1a
WD
1095 }
1096
1097 /* Calculate and write the second ECC if we have enough data */
1098 if ((nand->oobblock == 512) && (last == nand->oobblock)) {
1099 nand_calculate_ecc (&nand->data_buf[256], &(ecc_code[3]));
384cc687
WD
1100 for (i = 3; i < 6; i++) {
1101 nand->data_buf[(nand->oobblock +
1102 oob_config.ecc_pos[i])] = ecc_code[i];
1103 }
1104 if (oob_config.eccvalid_pos != -1) {
1105 nand->data_buf[nand->oobblock +
1106 oob_config.eccvalid_pos] &= 0x0f;
1107 }
dc7c9a1a
WD
1108 }
1109#endif
1110 /* Prepad for partial page programming !!! */
1111 for (i = 0; i < col; i++)
1112 nand->data_buf[i] = 0xff;
1113
1114 /* Postpad for partial page programming !!! oob is already padded */
1115 for (i = last; i < nand->oobblock; i++)
1116 nand->data_buf[i] = 0xff;
1117
1118 /* Send command to begin auto page programming */
384cc687
WD
1119 NanD_Command (nand, NAND_CMD_READ0);
1120 NanD_Command (nand, NAND_CMD_SEQIN);
1121 if (nand->bus16) {
1122 NanD_Address (nand, ADDR_COLUMN_PAGE,
1123 (page << nand->page_shift) + (col >> 1));
1124 } else {
1125 NanD_Address (nand, ADDR_COLUMN_PAGE,
1126 (page << nand->page_shift) + col);
1127 }
dc7c9a1a
WD
1128
1129 /* Write out complete page of data */
384cc687
WD
1130 if (nand->bus16) {
1131 for (i = 0; i < (nand->oobblock + nand->oobsize); i += 2) {
1132 WRITE_NAND (nand->data_buf[i] +
1133 (nand->data_buf[i + 1] << 8),
1134 nand->IO_ADDR);
1135 }
1136 } else {
1137 for (i = 0; i < (nand->oobblock + nand->oobsize); i++)
1138 WRITE_NAND (nand->data_buf[i], nand->IO_ADDR);
1139 }
dc7c9a1a
WD
1140
1141 /* Send command to actually program the data */
384cc687
WD
1142 NanD_Command (nand, NAND_CMD_PAGEPROG);
1143 NanD_Command (nand, NAND_CMD_STATUS);
1f4bb37d 1144#ifdef NAND_NO_RB
384cc687
WD
1145 {
1146 u_char ret_val;
dc7c9a1a 1147
384cc687
WD
1148 do {
1149 ret_val = READ_NAND (nandptr); /* wait till ready */
1150 } while ((ret_val & 0x40) != 0x40);
1f4bb37d
WD
1151 }
1152#endif
dc7c9a1a 1153 /* See if device thinks it succeeded */
384cc687
WD
1154 if (READ_NAND (nand->IO_ADDR) & 0x01) {
1155 printf ("%s: Failed write, page 0x%08x, ", __FUNCTION__,
1156 page);
dc7c9a1a
WD
1157 return -1;
1158 }
1159#ifdef CONFIG_MTD_NAND_VERIFY_WRITE
1160 /*
1161 * The NAND device assumes that it is always writing to
1162 * a cleanly erased page. Hence, it performs its internal
1163 * write verification only on bits that transitioned from
1164 * 1 to 0. The device does NOT verify the whole page on a
1165 * byte by byte basis. It is possible that the page was
1166 * not completely erased or the page is becoming unusable
1167 * due to wear. The read with ECC would catch the error
1168 * later when the ECC page check fails, but we would rather
1169 * catch it early in the page write stage. Better to write
1170 * no data than invalid data.
1171 */
1172
1173 /* Send command to read back the page */
1174 if (col < nand->eccsize)
384cc687 1175 NanD_Command (nand, NAND_CMD_READ0);
dc7c9a1a 1176 else
384cc687
WD
1177 NanD_Command (nand, NAND_CMD_READ1);
1178 if (nand->bus16) {
1179 NanD_Address (nand, ADDR_COLUMN_PAGE,
1180 (page << nand->page_shift) + (col >> 1));
1181 } else {
1182 NanD_Address (nand, ADDR_COLUMN_PAGE,
1183 (page << nand->page_shift) + col);
1184 }
dc7c9a1a
WD
1185
1186 /* Loop through and verify the data */
384cc687
WD
1187 if (nand->bus16) {
1188 for (i = col; i < last; i = +2) {
1189 if ((nand->data_buf[i] +
1190 (nand->data_buf[i + 1] << 8)) != READ_NAND (nand->IO_ADDR)) {
1191 printf ("%s: Failed write verify, page 0x%08x ",
1192 __FUNCTION__, page);
1193 return -1;
1194 }
1195 }
1196 } else {
1197 for (i = col; i < last; i++) {
1198 if (nand->data_buf[i] != READ_NAND (nand->IO_ADDR)) {
1199 printf ("%s: Failed write verify, page 0x%08x ",
1200 __FUNCTION__, page);
1201 return -1;
1202 }
dc7c9a1a
WD
1203 }
1204 }
1205
1206#ifdef CONFIG_MTD_NAND_ECC
1207 /*
1208 * We also want to check that the ECC bytes wrote
1209 * correctly for the same reasons stated above.
1210 */
384cc687
WD
1211 NanD_Command (nand, NAND_CMD_READOOB);
1212 if (nand->bus16) {
1213 NanD_Address (nand, ADDR_COLUMN_PAGE,
1214 (page << nand->page_shift) + (col >> 1));
1215 } else {
1216 NanD_Address (nand, ADDR_COLUMN_PAGE,
1217 (page << nand->page_shift) + col);
1218 }
1219 if (nand->bus16) {
1220 for (i = 0; i < nand->oobsize; i += 2) {
81b83c9e
SR
1221 u16 val;
1222
384cc687
WD
1223 val = READ_NAND (nand->IO_ADDR);
1224 nand->data_buf[i] = val & 0xff;
1225 nand->data_buf[i + 1] = val >> 8;
1226 }
1227 } else {
1228 for (i = 0; i < nand->oobsize; i++) {
1229 nand->data_buf[i] = READ_NAND (nand->IO_ADDR);
1230 }
1231 }
dc7c9a1a
WD
1232 for (i = 0; i < ecc_bytes; i++) {
1233 if ((nand->data_buf[(oob_config.ecc_pos[i])] != ecc_code[i]) && ecc_code[i]) {
0db5bca8 1234 printf ("%s: Failed ECC write "
384cc687
WD
1235 "verify, page 0x%08x, "
1236 "%6i bytes were succesful\n",
1237 __FUNCTION__, page, i);
dc7c9a1a
WD
1238 return -1;
1239 }
1240 }
384cc687
WD
1241#endif /* CONFIG_MTD_NAND_ECC */
1242#endif /* CONFIG_MTD_NAND_VERIFY_WRITE */
dc7c9a1a
WD
1243 return 0;
1244}
0db5bca8 1245
dc7c9a1a
WD
1246static int nand_write_ecc (struct nand_chip* nand, size_t to, size_t len,
1247 size_t * retlen, const u_char * buf, u_char * ecc_code)
1248{
1249 int i, page, col, cnt, ret = 0;
1250
1251 /* Do not allow write past end of device */
1252 if ((to + len) > nand->totlen) {
0db5bca8 1253 printf ("%s: Attempt to write past end of page\n", __FUNCTION__);
dc7c9a1a
WD
1254 return -1;
1255 }
1256
1257 /* Shift to get page */
1258 page = ((int) to) >> nand->page_shift;
1259
1260 /* Get the starting column */
1261 col = to & (nand->oobblock - 1);
1262
1263 /* Initialize return length value */
1264 *retlen = 0;
1265
1266 /* Select the NAND device */
1f4bb37d
WD
1267#ifdef CONFIG_OMAP1510
1268 archflashwp(0,0);
1269#endif
384cc687
WD
1270#ifdef CFG_NAND_WP
1271 NAND_WP_OFF();
1272#endif
1273
1f4bb37d 1274 NAND_ENABLE_CE(nand); /* set pin low */
dc7c9a1a
WD
1275
1276 /* Check the WP bit */
0db5bca8 1277 NanD_Command(nand, NAND_CMD_STATUS);
dc7c9a1a 1278 if (!(READ_NAND(nand->IO_ADDR) & 0x80)) {
0db5bca8 1279 printf ("%s: Device is write protected!!!\n", __FUNCTION__);
dc7c9a1a
WD
1280 ret = -1;
1281 goto out;
1282 }
1283
1284 /* Loop until all data is written */
1285 while (*retlen < len) {
1286 /* Invalidate cache, if we write to this page */
1287 if (nand->cache_page == page)
1288 nand->cache_page = -1;
1289
1290 /* Write data into buffer */
384cc687
WD
1291 if ((col + len) >= nand->oobblock) {
1292 for (i = col, cnt = 0; i < nand->oobblock; i++, cnt++) {
dc7c9a1a 1293 nand->data_buf[i] = buf[(*retlen + cnt)];
384cc687
WD
1294 }
1295 } else {
1296 for (i = col, cnt = 0; cnt < (len - *retlen); i++, cnt++) {
dc7c9a1a 1297 nand->data_buf[i] = buf[(*retlen + cnt)];
384cc687
WD
1298 }
1299 }
dc7c9a1a
WD
1300 /* We use the same function for write and writev !) */
1301 ret = nand_write_page (nand, page, col, i, ecc_code);
1302 if (ret)
1303 goto out;
1304
1305 /* Next data start at page boundary */
1306 col = 0;
1307
1308 /* Update written bytes count */
1309 *retlen += cnt;
1310
1311 /* Increment page address */
1312 page++;
1313 }
1314
1315 /* Return happy */
1316 *retlen = len;
1317
1318out:
1319 /* De-select the NAND device */
0db5bca8 1320 NAND_DISABLE_CE(nand); /* set pin high */
1f4bb37d
WD
1321#ifdef CONFIG_OMAP1510
1322 archflashwp(0,1);
1323#endif
384cc687
WD
1324#ifdef CFG_NAND_WP
1325 NAND_WP_ON();
1326#endif
1327
dc7c9a1a
WD
1328 return ret;
1329}
1330
7a8e9bed
WD
1331/* read from the 16 bytes of oob data that correspond to a 512 byte
1332 * page or 2 256-byte pages.
dc7c9a1a 1333 */
dc7c9a1a 1334static int nand_read_oob(struct nand_chip* nand, size_t ofs, size_t len,
7a8e9bed 1335 size_t * retlen, u_char * buf)
dc7c9a1a 1336{
7a8e9bed 1337 int len256 = 0;
dc7c9a1a 1338 struct Nand *mychip;
0db5bca8 1339 int ret = 0;
dc7c9a1a 1340
7a8e9bed 1341 mychip = &nand->chips[ofs >> nand->chipshift];
dc7c9a1a
WD
1342
1343 /* update address for 2M x 8bit devices. OOB starts on the second */
1344 /* page to maintain compatibility with nand_read_ecc. */
1345 if (nand->page256) {
1346 if (!(ofs & 0x8))
1347 ofs += 0x100;
1348 else
1349 ofs -= 0x8;
1350 }
1351
7a8e9bed 1352 NAND_ENABLE_CE(nand); /* set pin low */
dc7c9a1a 1353 NanD_Command(nand, NAND_CMD_READOOB);
384cc687
WD
1354 if (nand->bus16) {
1355 NanD_Address(nand, ADDR_COLUMN_PAGE,
1356 ((ofs >> nand->page_shift) << nand->page_shift) +
1357 ((ofs & (nand->oobblock - 1)) >> 1));
1358 } else {
1359 NanD_Address(nand, ADDR_COLUMN_PAGE, ofs);
1360 }
dc7c9a1a
WD
1361
1362 /* treat crossing 8-byte OOB data for 2M x 8bit devices */
1363 /* Note: datasheet says it should automaticaly wrap to the */
1364 /* next OOB block, but it didn't work here. mf. */
1365 if (nand->page256 && ofs + len > (ofs | 0x7) + 1) {
1366 len256 = (ofs | 0x7) + 1 - ofs;
1367 NanD_ReadBuf(nand, buf, len256);
1368
1369 NanD_Command(nand, NAND_CMD_READOOB);
1370 NanD_Address(nand, ADDR_COLUMN_PAGE, ofs & (~0x1ff));
1371 }
1372
1373 NanD_ReadBuf(nand, &buf[len256], len - len256);
1374
1375 *retlen = len;
1376 /* Reading the full OOB data drops us off of the end of the page,
8bde7f77
WD
1377 * causing the flash device to go into busy mode, so we need
1378 * to wait until ready 11.4.1 and Toshiba TC58256FT nands */
dc7c9a1a 1379
1f4bb37d 1380 ret = NanD_WaitReady(nand, 1);
8bde7f77 1381 NAND_DISABLE_CE(nand); /* set pin high */
dc7c9a1a
WD
1382
1383 return ret;
1384
1385}
7a8e9bed
WD
1386
1387/* write to the 16 bytes of oob data that correspond to a 512 byte
1388 * page or 2 256-byte pages.
1389 */
dc7c9a1a
WD
1390static int nand_write_oob(struct nand_chip* nand, size_t ofs, size_t len,
1391 size_t * retlen, const u_char * buf)
1392{
1393 int len256 = 0;
7a8e9bed 1394 int i;
dc7c9a1a
WD
1395 unsigned long nandptr = nand->IO_ADDR;
1396
1397#ifdef PSYCHO_DEBUG
1398 printf("nand_write_oob(%lx, %d): %2.2X %2.2X %2.2X %2.2X ... %2.2X %2.2X .. %2.2X %2.2X\n",
1399 (long)ofs, len, buf[0], buf[1], buf[2], buf[3],
1400 buf[8], buf[9], buf[14],buf[15]);
1401#endif
1402
7a8e9bed
WD
1403 NAND_ENABLE_CE(nand); /* set pin low to enable chip */
1404
dc7c9a1a
WD
1405 /* Reset the chip */
1406 NanD_Command(nand, NAND_CMD_RESET);
1407
1408 /* issue the Read2 command to set the pointer to the Spare Data Area. */
1409 NanD_Command(nand, NAND_CMD_READOOB);
384cc687
WD
1410 if (nand->bus16) {
1411 NanD_Address(nand, ADDR_COLUMN_PAGE,
1412 ((ofs >> nand->page_shift) << nand->page_shift) +
1413 ((ofs & (nand->oobblock - 1)) >> 1));
1414 } else {
1415 NanD_Address(nand, ADDR_COLUMN_PAGE, ofs);
1416 }
dc7c9a1a
WD
1417
1418 /* update address for 2M x 8bit devices. OOB starts on the second */
1419 /* page to maintain compatibility with nand_read_ecc. */
1420 if (nand->page256) {
1421 if (!(ofs & 0x8))
1422 ofs += 0x100;
1423 else
1424 ofs -= 0x8;
1425 }
1426
1427 /* issue the Serial Data In command to initial the Page Program process */
1428 NanD_Command(nand, NAND_CMD_SEQIN);
384cc687
WD
1429 if (nand->bus16) {
1430 NanD_Address(nand, ADDR_COLUMN_PAGE,
1431 ((ofs >> nand->page_shift) << nand->page_shift) +
1432 ((ofs & (nand->oobblock - 1)) >> 1));
1433 } else {
1434 NanD_Address(nand, ADDR_COLUMN_PAGE, ofs);
1435 }
dc7c9a1a
WD
1436
1437 /* treat crossing 8-byte OOB data for 2M x 8bit devices */
1438 /* Note: datasheet says it should automaticaly wrap to the */
1439 /* next OOB block, but it didn't work here. mf. */
1440 if (nand->page256 && ofs + len > (ofs | 0x7) + 1) {
1441 len256 = (ofs | 0x7) + 1 - ofs;
7a8e9bed
WD
1442 for (i = 0; i < len256; i++)
1443 WRITE_NAND(buf[i], nandptr);
dc7c9a1a
WD
1444
1445 NanD_Command(nand, NAND_CMD_PAGEPROG);
1446 NanD_Command(nand, NAND_CMD_STATUS);
1f4bb37d
WD
1447#ifdef NAND_NO_RB
1448 { u_char ret_val;
384cc687
WD
1449 do {
1450 ret_val = READ_NAND(nandptr); /* wait till ready */
1451 } while ((ret_val & 0x40) != 0x40);
1f4bb37d
WD
1452 }
1453#endif
dc7c9a1a
WD
1454 if (READ_NAND(nandptr) & 1) {
1455 puts ("Error programming oob data\n");
1456 /* There was an error */
7a8e9bed 1457 NAND_DISABLE_CE(nand); /* set pin high */
dc7c9a1a
WD
1458 *retlen = 0;
1459 return -1;
1460 }
1461 NanD_Command(nand, NAND_CMD_SEQIN);
1462 NanD_Address(nand, ADDR_COLUMN_PAGE, ofs & (~0x1ff));
1463 }
1464
384cc687
WD
1465 if (nand->bus16) {
1466 for (i = len256; i < len; i += 2) {
1467 WRITE_NAND(buf[i] + (buf[i+1] << 8), nandptr);
1468 }
1469 } else {
1470 for (i = len256; i < len; i++)
1471 WRITE_NAND(buf[i], nandptr);
1472 }
dc7c9a1a
WD
1473
1474 NanD_Command(nand, NAND_CMD_PAGEPROG);
1475 NanD_Command(nand, NAND_CMD_STATUS);
1f4bb37d 1476#ifdef NAND_NO_RB
384cc687
WD
1477 { u_char ret_val;
1478 do {
1479 ret_val = READ_NAND(nandptr); /* wait till ready */
1480 } while ((ret_val & 0x40) != 0x40);
1f4bb37d
WD
1481 }
1482#endif
dc7c9a1a
WD
1483 if (READ_NAND(nandptr) & 1) {
1484 puts ("Error programming oob data\n");
1485 /* There was an error */
7a8e9bed 1486 NAND_DISABLE_CE(nand); /* set pin high */
dc7c9a1a
WD
1487 *retlen = 0;
1488 return -1;
1489 }
1490
7a8e9bed 1491 NAND_DISABLE_CE(nand); /* set pin high */
dc7c9a1a
WD
1492 *retlen = len;
1493 return 0;
1494
1495}
dc7c9a1a 1496
13a5695b 1497int nand_erase(struct nand_chip* nand, size_t ofs, size_t len, int clean)
dc7c9a1a 1498{
7a8e9bed
WD
1499 /* This is defined as a structure so it will work on any system
1500 * using native endian jffs2 (the default).
1501 */
1502 static struct jffs2_unknown_node clean_marker = {
1503 JFFS2_MAGIC_BITMASK,
1504 JFFS2_NODETYPE_CLEANMARKER,
1505 8 /* 8 bytes in this node */
1506 };
dc7c9a1a
WD
1507 unsigned long nandptr;
1508 struct Nand *mychip;
85ec0bcc 1509 int ret = 0;
dc7c9a1a
WD
1510
1511 if (ofs & (nand->erasesize-1) || len & (nand->erasesize-1)) {
1512 printf ("Offset and size must be sector aligned, erasesize = %d\n",
8bde7f77 1513 (int) nand->erasesize);
dc7c9a1a
WD
1514 return -1;
1515 }
1516
1517 nandptr = nand->IO_ADDR;
1518
85ec0bcc 1519 /* Select the NAND device */
1f4bb37d
WD
1520#ifdef CONFIG_OMAP1510
1521 archflashwp(0,0);
384cc687
WD
1522#endif
1523#ifdef CFG_NAND_WP
1524 NAND_WP_OFF();
1f4bb37d
WD
1525#endif
1526 NAND_ENABLE_CE(nand); /* set pin low */
85ec0bcc
WD
1527
1528 /* Check the WP bit */
1529 NanD_Command(nand, NAND_CMD_STATUS);
1530 if (!(READ_NAND(nand->IO_ADDR) & 0x80)) {
1531 printf ("nand_write_ecc: Device is write protected!!!\n");
1532 ret = -1;
1533 goto out;
1534 }
1535
0db5bca8
WD
1536 /* Check the WP bit */
1537 NanD_Command(nand, NAND_CMD_STATUS);
1538 if (!(READ_NAND(nand->IO_ADDR) & 0x80)) {
1539 printf ("%s: Device is write protected!!!\n", __FUNCTION__);
1540 ret = -1;
1541 goto out;
1542 }
1543
dc7c9a1a
WD
1544 /* FIXME: Do nand in the background. Use timers or schedule_task() */
1545 while(len) {
0db5bca8
WD
1546 /*mychip = &nand->chips[shr(ofs, nand->chipshift)];*/
1547 mychip = &nand->chips[ofs >> nand->chipshift];
dc7c9a1a 1548
7a8e9bed
WD
1549 /* always check for bad block first, genuine bad blocks
1550 * should _never_ be erased.
1551 */
1552 if (ALLOW_ERASE_BAD_DEBUG || !check_block(nand, ofs)) {
1553 /* Select the NAND device */
1554 NAND_ENABLE_CE(nand); /* set pin low */
1555
1556 NanD_Command(nand, NAND_CMD_ERASE1);
1557 NanD_Address(nand, ADDR_PAGE, ofs);
1558 NanD_Command(nand, NAND_CMD_ERASE2);
1559
1560 NanD_Command(nand, NAND_CMD_STATUS);
1561
1f4bb37d 1562#ifdef NAND_NO_RB
384cc687
WD
1563 { u_char ret_val;
1564 do {
1565 ret_val = READ_NAND(nandptr); /* wait till ready */
1566 } while ((ret_val & 0x40) != 0x40);
1f4bb37d
WD
1567 }
1568#endif
7a8e9bed
WD
1569 if (READ_NAND(nandptr) & 1) {
1570 printf ("%s: Error erasing at 0x%lx\n",
1571 __FUNCTION__, (long)ofs);
1572 /* There was an error */
1573 ret = -1;
1574 goto out;
1575 }
1576 if (clean) {
1577 int n; /* return value not used */
1578 int p, l;
1579
1580 /* clean marker position and size depend
1581 * on the page size, since 256 byte pages
1582 * only have 8 bytes of oob data
1583 */
1584 if (nand->page256) {
1585 p = NAND_JFFS2_OOB8_FSDAPOS;
1586 l = NAND_JFFS2_OOB8_FSDALEN;
384cc687 1587 } else {
7a8e9bed
WD
1588 p = NAND_JFFS2_OOB16_FSDAPOS;
1589 l = NAND_JFFS2_OOB16_FSDALEN;
1590 }
dc7c9a1a 1591
7a8e9bed
WD
1592 ret = nand_write_oob(nand, ofs + p, l, &n,
1593 (u_char *)&clean_marker);
1594 /* quit here if write failed */
1595 if (ret)
1596 goto out;
1597 }
dc7c9a1a
WD
1598 }
1599 ofs += nand->erasesize;
1600 len -= nand->erasesize;
1601 }
1602
85ec0bcc
WD
1603out:
1604 /* De-select the NAND device */
1605 NAND_DISABLE_CE(nand); /* set pin high */
1f4bb37d
WD
1606#ifdef CONFIG_OMAP1510
1607 archflashwp(0,1);
1608#endif
384cc687
WD
1609#ifdef CFG_NAND_WP
1610 NAND_WP_ON();
1611#endif
1612
85ec0bcc 1613 return ret;
dc7c9a1a
WD
1614}
1615
1616static inline int nandcheck(unsigned long potential, unsigned long physadr)
1617{
dc7c9a1a
WD
1618 return 0;
1619}
1620
a43278a4 1621unsigned long nand_probe(unsigned long physadr)
dc7c9a1a
WD
1622{
1623 struct nand_chip *nand = NULL;
1624 int i = 0, ChipID = 1;
1625
1626#ifdef CONFIG_MTD_NAND_ECC_JFFS2
1627 oob_config.ecc_pos[0] = NAND_JFFS2_OOB_ECCPOS0;
1628 oob_config.ecc_pos[1] = NAND_JFFS2_OOB_ECCPOS1;
1629 oob_config.ecc_pos[2] = NAND_JFFS2_OOB_ECCPOS2;
1630 oob_config.ecc_pos[3] = NAND_JFFS2_OOB_ECCPOS3;
1631 oob_config.ecc_pos[4] = NAND_JFFS2_OOB_ECCPOS4;
1632 oob_config.ecc_pos[5] = NAND_JFFS2_OOB_ECCPOS5;
dc7c9a1a
WD
1633 oob_config.eccvalid_pos = 4;
1634#else
1635 oob_config.ecc_pos[0] = NAND_NOOB_ECCPOS0;
1636 oob_config.ecc_pos[1] = NAND_NOOB_ECCPOS1;
1637 oob_config.ecc_pos[2] = NAND_NOOB_ECCPOS2;
1638 oob_config.ecc_pos[3] = NAND_NOOB_ECCPOS3;
1639 oob_config.ecc_pos[4] = NAND_NOOB_ECCPOS4;
1640 oob_config.ecc_pos[5] = NAND_NOOB_ECCPOS5;
dc7c9a1a
WD
1641 oob_config.eccvalid_pos = NAND_NOOB_ECCVPOS;
1642#endif
7a8e9bed 1643 oob_config.badblock_pos = 5;
dc7c9a1a
WD
1644
1645 for (i=0; i<CFG_MAX_NAND_DEVICE; i++) {
1646 if (nand_dev_desc[i].ChipID == NAND_ChipID_UNKNOWN) {
a43278a4 1647 nand = &nand_dev_desc[i];
dc7c9a1a
WD
1648 break;
1649 }
1650 }
a43278a4
WD
1651 if (!nand)
1652 return (0);
dc7c9a1a 1653
0db5bca8 1654 memset((char *)nand, 0, sizeof(struct nand_chip));
dc7c9a1a 1655
0db5bca8 1656 nand->IO_ADDR = physadr;
7a8e9bed 1657 nand->cache_page = -1; /* init the cache page */
0db5bca8 1658 NanD_ScanChips(nand);
7a8e9bed
WD
1659
1660 if (nand->totlen == 0) {
1661 /* no chips found, clean up and quit */
1662 memset((char *)nand, 0, sizeof(struct nand_chip));
1663 nand->ChipID = NAND_ChipID_UNKNOWN;
a43278a4 1664 return (0);
7a8e9bed
WD
1665 }
1666
1667 nand->ChipID = ChipID;
1668 if (curr_device == -1)
1669 curr_device = i;
1670
0db5bca8
WD
1671 nand->data_buf = malloc (nand->oobblock + nand->oobsize);
1672 if (!nand->data_buf) {
1673 puts ("Cannot allocate memory for data structures.\n");
a43278a4 1674 return (0);
0db5bca8 1675 }
a43278a4
WD
1676
1677 return (nand->totlen);
dc7c9a1a
WD
1678}
1679
1680#ifdef CONFIG_MTD_NAND_ECC
1681/*
1682 * Pre-calculated 256-way 1 byte column parity
1683 */
1684static const u_char nand_ecc_precalc_table[] = {
384cc687
WD
1685 0x00, 0x55, 0x56, 0x03, 0x59, 0x0c, 0x0f, 0x5a,
1686 0x5a, 0x0f, 0x0c, 0x59, 0x03, 0x56, 0x55, 0x00,
1687 0x65, 0x30, 0x33, 0x66, 0x3c, 0x69, 0x6a, 0x3f,
1688 0x3f, 0x6a, 0x69, 0x3c, 0x66, 0x33, 0x30, 0x65,
1689 0x66, 0x33, 0x30, 0x65, 0x3f, 0x6a, 0x69, 0x3c,
1690 0x3c, 0x69, 0x6a, 0x3f, 0x65, 0x30, 0x33, 0x66,
1691 0x03, 0x56, 0x55, 0x00, 0x5a, 0x0f, 0x0c, 0x59,
1692 0x59, 0x0c, 0x0f, 0x5a, 0x00, 0x55, 0x56, 0x03,
1693 0x69, 0x3c, 0x3f, 0x6a, 0x30, 0x65, 0x66, 0x33,
1694 0x33, 0x66, 0x65, 0x30, 0x6a, 0x3f, 0x3c, 0x69,
1695 0x0c, 0x59, 0x5a, 0x0f, 0x55, 0x00, 0x03, 0x56,
1696 0x56, 0x03, 0x00, 0x55, 0x0f, 0x5a, 0x59, 0x0c,
1697 0x0f, 0x5a, 0x59, 0x0c, 0x56, 0x03, 0x00, 0x55,
1698 0x55, 0x00, 0x03, 0x56, 0x0c, 0x59, 0x5a, 0x0f,
1699 0x6a, 0x3f, 0x3c, 0x69, 0x33, 0x66, 0x65, 0x30,
1700 0x30, 0x65, 0x66, 0x33, 0x69, 0x3c, 0x3f, 0x6a,
1701 0x6a, 0x3f, 0x3c, 0x69, 0x33, 0x66, 0x65, 0x30,
1702 0x30, 0x65, 0x66, 0x33, 0x69, 0x3c, 0x3f, 0x6a,
1703 0x0f, 0x5a, 0x59, 0x0c, 0x56, 0x03, 0x00, 0x55,
1704 0x55, 0x00, 0x03, 0x56, 0x0c, 0x59, 0x5a, 0x0f,
1705 0x0c, 0x59, 0x5a, 0x0f, 0x55, 0x00, 0x03, 0x56,
1706 0x56, 0x03, 0x00, 0x55, 0x0f, 0x5a, 0x59, 0x0c,
1707 0x69, 0x3c, 0x3f, 0x6a, 0x30, 0x65, 0x66, 0x33,
1708 0x33, 0x66, 0x65, 0x30, 0x6a, 0x3f, 0x3c, 0x69,
1709 0x03, 0x56, 0x55, 0x00, 0x5a, 0x0f, 0x0c, 0x59,
1710 0x59, 0x0c, 0x0f, 0x5a, 0x00, 0x55, 0x56, 0x03,
1711 0x66, 0x33, 0x30, 0x65, 0x3f, 0x6a, 0x69, 0x3c,
1712 0x3c, 0x69, 0x6a, 0x3f, 0x65, 0x30, 0x33, 0x66,
1713 0x65, 0x30, 0x33, 0x66, 0x3c, 0x69, 0x6a, 0x3f,
1714 0x3f, 0x6a, 0x69, 0x3c, 0x66, 0x33, 0x30, 0x65,
1715 0x00, 0x55, 0x56, 0x03, 0x59, 0x0c, 0x0f, 0x5a,
1716 0x5a, 0x0f, 0x0c, 0x59, 0x03, 0x56, 0x55, 0x00
dc7c9a1a
WD
1717};
1718
1719
1720/*
1721 * Creates non-inverted ECC code from line parity
1722 */
1723static void nand_trans_result(u_char reg2, u_char reg3,
1724 u_char *ecc_code)
1725{
1726 u_char a, b, i, tmp1, tmp2;
1727
1728 /* Initialize variables */
1729 a = b = 0x80;
1730 tmp1 = tmp2 = 0;
1731
1732 /* Calculate first ECC byte */
1733 for (i = 0; i < 4; i++) {
1734 if (reg3 & a) /* LP15,13,11,9 --> ecc_code[0] */
1735 tmp1 |= b;
1736 b >>= 1;
1737 if (reg2 & a) /* LP14,12,10,8 --> ecc_code[0] */
1738 tmp1 |= b;
1739 b >>= 1;
1740 a >>= 1;
1741 }
1742
1743 /* Calculate second ECC byte */
1744 b = 0x80;
1745 for (i = 0; i < 4; i++) {
1746 if (reg3 & a) /* LP7,5,3,1 --> ecc_code[1] */
1747 tmp2 |= b;
1748 b >>= 1;
1749 if (reg2 & a) /* LP6,4,2,0 --> ecc_code[1] */
1750 tmp2 |= b;
1751 b >>= 1;
1752 a >>= 1;
1753 }
1754
1755 /* Store two of the ECC bytes */
1756 ecc_code[0] = tmp1;
1757 ecc_code[1] = tmp2;
1758}
1759
1760/*
1761 * Calculate 3 byte ECC code for 256 byte block
1762 */
1763static void nand_calculate_ecc (const u_char *dat, u_char *ecc_code)
1764{
7a8e9bed 1765 u_char idx, reg1, reg3;
dc7c9a1a
WD
1766 int j;
1767
1768 /* Initialize variables */
7a8e9bed 1769 reg1 = reg3 = 0;
dc7c9a1a
WD
1770 ecc_code[0] = ecc_code[1] = ecc_code[2] = 0;
1771
1772 /* Build up column parity */
1773 for(j = 0; j < 256; j++) {
1774
1775 /* Get CP0 - CP5 from table */
1776 idx = nand_ecc_precalc_table[dat[j]];
7a8e9bed 1777 reg1 ^= idx;
dc7c9a1a
WD
1778
1779 /* All bit XOR = 1 ? */
1780 if (idx & 0x40) {
1781 reg3 ^= (u_char) j;
dc7c9a1a
WD
1782 }
1783 }
1784
1785 /* Create non-inverted ECC code from line parity */
7a8e9bed 1786 nand_trans_result((reg1 & 0x40) ? ~reg3 : reg3, reg3, ecc_code);
dc7c9a1a
WD
1787
1788 /* Calculate final ECC code */
1789 ecc_code[0] = ~ecc_code[0];
1790 ecc_code[1] = ~ecc_code[1];
1791 ecc_code[2] = ((~reg1) << 2) | 0x03;
1792}
1793
1794/*
1795 * Detect and correct a 1 bit error for 256 byte block
1796 */
1797static int nand_correct_data (u_char *dat, u_char *read_ecc, u_char *calc_ecc)
1798{
1799 u_char a, b, c, d1, d2, d3, add, bit, i;
1800
1801 /* Do error detection */
1802 d1 = calc_ecc[0] ^ read_ecc[0];
1803 d2 = calc_ecc[1] ^ read_ecc[1];
1804 d3 = calc_ecc[2] ^ read_ecc[2];
1805
1806 if ((d1 | d2 | d3) == 0) {
1807 /* No errors */
1808 return 0;
384cc687 1809 } else {
dc7c9a1a
WD
1810 a = (d1 ^ (d1 >> 1)) & 0x55;
1811 b = (d2 ^ (d2 >> 1)) & 0x55;
1812 c = (d3 ^ (d3 >> 1)) & 0x54;
1813
1814 /* Found and will correct single bit error in the data */
1815 if ((a == 0x55) && (b == 0x55) && (c == 0x54)) {
1816 c = 0x80;
1817 add = 0;
1818 a = 0x80;
1819 for (i=0; i<4; i++) {
1820 if (d1 & c)
1821 add |= a;
1822 c >>= 2;
1823 a >>= 1;
1824 }
1825 c = 0x80;
1826 for (i=0; i<4; i++) {
1827 if (d2 & c)
1828 add |= a;
1829 c >>= 2;
1830 a >>= 1;
1831 }
1832 bit = 0;
1833 b = 0x04;
1834 c = 0x80;
1835 for (i=0; i<3; i++) {
1836 if (d3 & c)
1837 bit |= b;
1838 c >>= 2;
1839 b >>= 1;
1840 }
1841 b = 0x01;
1842 a = dat[add];
1843 a ^= (b << bit);
1844 dat[add] = a;
1845 return 1;
1846 }
1847 else {
1848 i = 0;
1849 while (d1) {
1850 if (d1 & 0x01)
1851 ++i;
1852 d1 >>= 1;
1853 }
1854 while (d2) {
1855 if (d2 & 0x01)
1856 ++i;
1857 d2 >>= 1;
1858 }
1859 while (d3) {
1860 if (d3 & 0x01)
1861 ++i;
1862 d3 >>= 1;
1863 }
1864 if (i == 1) {
1865 /* ECC Code Error Correction */
1866 read_ecc[0] = calc_ecc[0];
1867 read_ecc[1] = calc_ecc[1];
1868 read_ecc[2] = calc_ecc[2];
1869 return 2;
1870 }
1871 else {
1872 /* Uncorrectable Error */
1873 return -1;
1874 }
1875 }
1876 }
1877
1878 /* Should never happen */
1879 return -1;
1880}
1f4bb37d 1881
dc7c9a1a 1882#endif
998eaaec
WD
1883
1884#ifdef CONFIG_JFFS2_NAND
1885
1886int read_jffs2_nand(size_t start, size_t len,
1887 size_t * retlen, u_char * buf, int nanddev)
1888{
1889 return nand_rw(nand_dev_desc + nanddev, NANDRW_READ | NANDRW_JFFS2,
1890 start, len, retlen, buf);
1891}
1892
1893#endif /* CONFIG_JFFS2_NAND */
1894
1895
dc7c9a1a 1896#endif /* (CONFIG_COMMANDS & CFG_CMD_NAND) */