1
2
3
4
5
6
7
8
9#include <common.h>
10#include <log.h>
11#include <malloc.h>
12#include <asm/io.h>
13#include <linux/delay.h>
14#include <linux/errno.h>
15#include <nand.h>
16#include <linux/ioport.h>
17#include <linux/mtd/mtd.h>
18#include <linux/mtd/rawnand.h>
19#include <linux/mtd/partitions.h>
20#include <linux/mtd/nand_ecc.h>
21#include <asm/arch/hardware.h>
22#include <asm/arch/sys_proto.h>
23#include <dm.h>
24
25
26#define ZYNQ_NAND_CMD_PHASE 1
27#define ZYNQ_NAND_DATA_PHASE 2
28#define ZYNQ_NAND_ECC_SIZE 512
29#define ZYNQ_NAND_SET_OPMODE_8BIT (0 << 0)
30#define ZYNQ_NAND_SET_OPMODE_16BIT (1 << 0)
31#define ZYNQ_NAND_ECC_STATUS (1 << 6)
32#define ZYNQ_MEMC_CLRCR_INT_CLR1 (1 << 4)
33#define ZYNQ_MEMC_SR_RAW_INT_ST1 (1 << 6)
34#define ZYNQ_MEMC_SR_INT_ST1 (1 << 4)
35#define ZYNQ_MEMC_NAND_ECC_MODE_MASK 0xC
36
37
38#define ZYNQ_NAND_CLR_CONFIG ((0x1 << 1) | \
39 (0x1 << 4) | \
40 (0x1 << 6))
41
42#ifndef CONFIG_NAND_ZYNQ_USE_BOOTLOADER1_TIMINGS
43
44
45#define ZYNQ_NAND_SET_CYCLES ((0x2 << 20) | \
46 (0x2 << 17) | \
47 (0x1 << 14) | \
48 (0x3 << 11) | \
49 (0x2 << 8) | \
50 (0x5 << 4) | \
51 (0x5 << 0))
52#endif
53
54
55#define ZYNQ_NAND_DIRECT_CMD ((0x4 << 23) | \
56 (0x2 << 21))
57
58#define ZYNQ_NAND_ECC_CONFIG ((0x1 << 2) | \
59 (0x1 << 4) | \
60 (0x0 << 5))
61
62#define ZYNQ_NAND_ECC_CMD1 ((0x80) | \
63 (0x00 << 8) | \
64 (0x30 << 16) | \
65 (0x1 << 24))
66
67#define ZYNQ_NAND_ECC_CMD2 ((0x85) | \
68 (0x05 << 8) | \
69 (0xE0 << 16) | \
70 (0x1 << 24))
71
72
73#define START_CMD_SHIFT 3
74#define END_CMD_SHIFT 11
75#define END_CMD_VALID_SHIFT 20
76#define ADDR_CYCLES_SHIFT 21
77#define CLEAR_CS_SHIFT 21
78#define ECC_LAST_SHIFT 10
79#define COMMAND_PHASE (0 << 19)
80#define DATA_PHASE (1 << 19)
81#define ONDIE_ECC_FEATURE_ADDR 0x90
82#define ONDIE_ECC_FEATURE_ENABLE 0x08
83
84#define ZYNQ_NAND_ECC_LAST (1 << ECC_LAST_SHIFT)
85#define ZYNQ_NAND_CLEAR_CS (1 << CLEAR_CS_SHIFT)
86
87
88#define ZYNQ_NAND_ECC_BUSY (1 << 6)
89#define ZYNQ_NAND_ECC_MASK 0x00FFFFFF
90
91#define ZYNQ_NAND_ROW_ADDR_CYCL_MASK 0x0F
92#define ZYNQ_NAND_COL_ADDR_CYCL_MASK 0xF0
93
94#define ZYNQ_NAND_MIO_NUM_NAND_8BIT 13
95#define ZYNQ_NAND_MIO_NUM_NAND_16BIT 8
96
97enum zynq_nand_bus_width {
98 NAND_BW_UNKNOWN = -1,
99 NAND_BW_8BIT,
100 NAND_BW_16BIT,
101};
102
103#ifndef NAND_CMD_LOCK_TIGHT
104#define NAND_CMD_LOCK_TIGHT 0x2c
105#endif
106
107#ifndef NAND_CMD_LOCK_STATUS
108#define NAND_CMD_LOCK_STATUS 0x7a
109#endif
110
111
112struct zynq_nand_smc_regs {
113 u32 csr;
114 u32 reserved0[2];
115 u32 cfr;
116 u32 dcr;
117 u32 scr;
118 u32 sor;
119 u32 reserved1[249];
120 u32 esr;
121 u32 emcr;
122 u32 emcmd1r;
123 u32 emcmd2r;
124 u32 reserved2[2];
125 u32 eval0r;
126};
127
128
129
130
131
132
133
134
135struct nand_config {
136 void __iomem *nand_base;
137 u8 end_cmd_pending;
138 u8 end_cmd;
139};
140
141struct nand_drv {
142 struct zynq_nand_smc_regs *reg;
143 struct nand_config config;
144};
145
146struct zynq_nand_info {
147 struct udevice *dev;
148 struct nand_drv nand_ctrl;
149 struct nand_chip nand_chip;
150};
151
152
153
154
155
156
157
158
159struct zynq_nand_command_format {
160 u8 start_cmd;
161 u8 end_cmd;
162 u8 addr_cycles;
163 u8 end_cmd_valid;
164};
165
166
167static const struct zynq_nand_command_format zynq_nand_commands[] = {
168 {NAND_CMD_READ0, NAND_CMD_READSTART, 5, ZYNQ_NAND_CMD_PHASE},
169 {NAND_CMD_RNDOUT, NAND_CMD_RNDOUTSTART, 2, ZYNQ_NAND_CMD_PHASE},
170 {NAND_CMD_READID, NAND_CMD_NONE, 1, 0},
171 {NAND_CMD_STATUS, NAND_CMD_NONE, 0, 0},
172 {NAND_CMD_SEQIN, NAND_CMD_PAGEPROG, 5, ZYNQ_NAND_DATA_PHASE},
173 {NAND_CMD_RNDIN, NAND_CMD_NONE, 2, 0},
174 {NAND_CMD_ERASE1, NAND_CMD_ERASE2, 3, ZYNQ_NAND_CMD_PHASE},
175 {NAND_CMD_RESET, NAND_CMD_NONE, 0, 0},
176 {NAND_CMD_PARAM, NAND_CMD_NONE, 1, 0},
177 {NAND_CMD_GET_FEATURES, NAND_CMD_NONE, 1, 0},
178 {NAND_CMD_SET_FEATURES, NAND_CMD_NONE, 1, 0},
179 {NAND_CMD_LOCK, NAND_CMD_NONE, 0, 0},
180 {NAND_CMD_LOCK_TIGHT, NAND_CMD_NONE, 0, 0},
181 {NAND_CMD_UNLOCK1, NAND_CMD_NONE, 3, 0},
182 {NAND_CMD_UNLOCK2, NAND_CMD_NONE, 3, 0},
183 {NAND_CMD_LOCK_STATUS, NAND_CMD_NONE, 3, 0},
184 {NAND_CMD_NONE, NAND_CMD_NONE, 0, 0},
185
186};
187
188
189static struct nand_ecclayout nand_oob_16 = {
190 .eccbytes = 3,
191 .eccpos = {0, 1, 2},
192 .oobfree = {
193 { .offset = 8, .length = 8 }
194 }
195};
196
197static struct nand_ecclayout nand_oob_64 = {
198 .eccbytes = 12,
199 .eccpos = {
200 52, 53, 54, 55, 56, 57,
201 58, 59, 60, 61, 62, 63},
202 .oobfree = {
203 { .offset = 2, .length = 50 }
204 }
205};
206
207static struct nand_ecclayout ondie_nand_oob_64 = {
208 .eccbytes = 32,
209
210 .eccpos = {
211 8, 9, 10, 11, 12, 13, 14, 15,
212 24, 25, 26, 27, 28, 29, 30, 31,
213 40, 41, 42, 43, 44, 45, 46, 47,
214 56, 57, 58, 59, 60, 61, 62, 63
215 },
216
217 .oobfree = {
218 { .offset = 4, .length = 4 },
219 { .offset = 20, .length = 4 },
220 { .offset = 36, .length = 4 },
221 { .offset = 52, .length = 4 }
222 }
223};
224
225
226
227static u8 bbt_pattern[] = {'B', 'b', 't', '0' };
228static u8 mirror_pattern[] = {'1', 't', 'b', 'B' };
229
230static struct nand_bbt_descr bbt_main_descr = {
231 .options = NAND_BBT_LASTBLOCK | NAND_BBT_CREATE | NAND_BBT_WRITE |
232 NAND_BBT_2BIT | NAND_BBT_VERSION | NAND_BBT_PERCHIP,
233 .offs = 4,
234 .len = 4,
235 .veroffs = 20,
236 .maxblocks = 4,
237 .pattern = bbt_pattern
238};
239
240static struct nand_bbt_descr bbt_mirror_descr = {
241 .options = NAND_BBT_LASTBLOCK | NAND_BBT_CREATE | NAND_BBT_WRITE |
242 NAND_BBT_2BIT | NAND_BBT_VERSION | NAND_BBT_PERCHIP,
243 .offs = 4,
244 .len = 4,
245 .veroffs = 20,
246 .maxblocks = 4,
247 .pattern = mirror_pattern
248};
249
250
251
252
253
254
255static int zynq_nand_waitfor_ecc_completion(struct mtd_info *mtd)
256{
257 struct nand_chip *nand_chip = mtd_to_nand(mtd);
258 struct nand_drv *smc = nand_get_controller_data(nand_chip);
259 unsigned long timeout;
260 u32 status;
261
262
263 timeout = 10;
264 status = readl(&smc->reg->esr);
265 while (status & ZYNQ_NAND_ECC_BUSY) {
266 status = readl(&smc->reg->esr);
267 if (timeout == 0)
268 return -1;
269 timeout--;
270 udelay(1);
271 }
272
273 return status;
274}
275
276
277
278
279
280
281
282
283
284static int zynq_nand_init_nand_flash(struct mtd_info *mtd, int option)
285{
286 struct nand_chip *nand_chip = mtd_to_nand(mtd);
287 struct nand_drv *smc = nand_get_controller_data(nand_chip);
288 u32 status;
289
290
291 writel(ZYNQ_NAND_CLR_CONFIG, &smc->reg->cfr);
292#ifndef CONFIG_NAND_ZYNQ_USE_BOOTLOADER1_TIMINGS
293
294 writel(ZYNQ_NAND_SET_CYCLES, &smc->reg->scr);
295#endif
296 if (option & NAND_BUSWIDTH_16)
297 writel(ZYNQ_NAND_SET_OPMODE_16BIT, &smc->reg->sor);
298 else
299 writel(ZYNQ_NAND_SET_OPMODE_8BIT, &smc->reg->sor);
300
301 writel(ZYNQ_NAND_DIRECT_CMD, &smc->reg->dcr);
302
303
304 status = zynq_nand_waitfor_ecc_completion(mtd);
305 if (status < 0) {
306 printf("%s: Timeout\n", __func__);
307 return status;
308 }
309
310
311 writel(ZYNQ_NAND_ECC_CMD1, &smc->reg->emcmd1r);
312 writel(ZYNQ_NAND_ECC_CMD2, &smc->reg->emcmd2r);
313
314 return 0;
315}
316
317
318
319
320
321
322
323
324
325
326
327
328static int zynq_nand_calculate_hwecc(struct mtd_info *mtd, const u8 *data,
329 u8 *ecc_code)
330{
331 struct nand_chip *nand_chip = mtd_to_nand(mtd);
332 struct nand_drv *smc = nand_get_controller_data(nand_chip);
333 u32 ecc_value = 0;
334 u8 ecc_reg, ecc_byte;
335 u32 ecc_status;
336
337
338 ecc_status = zynq_nand_waitfor_ecc_completion(mtd);
339 if (ecc_status < 0) {
340 printf("%s: Timeout\n", __func__);
341 return ecc_status;
342 }
343
344 for (ecc_reg = 0; ecc_reg < 4; ecc_reg++) {
345
346 ecc_value = readl(&smc->reg->eval0r + ecc_reg);
347
348
349 ecc_status = (ecc_value >> 24) & 0xFF;
350
351
352 if (ecc_status & ZYNQ_NAND_ECC_STATUS) {
353 for (ecc_byte = 0; ecc_byte < 3; ecc_byte++) {
354
355 *ecc_code = ecc_value & 0xFF;
356 ecc_value = ecc_value >> 8;
357 ecc_code++;
358 }
359 } else {
360 debug("%s: ecc status failed\n", __func__);
361 }
362 }
363
364 return 0;
365}
366
367
368
369
370
371
372
373
374
375
376static bool onehot(unsigned short value)
377{
378 bool onehot;
379
380 onehot = value && !(value & (value - 1));
381 return onehot;
382}
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397static int zynq_nand_correct_data(struct mtd_info *mtd, unsigned char *buf,
398 unsigned char *read_ecc, unsigned char *calc_ecc)
399{
400 unsigned char bit_addr;
401 unsigned int byte_addr;
402 unsigned short ecc_odd, ecc_even;
403 unsigned short read_ecc_lower, read_ecc_upper;
404 unsigned short calc_ecc_lower, calc_ecc_upper;
405
406 read_ecc_lower = (read_ecc[0] | (read_ecc[1] << 8)) & 0xfff;
407 read_ecc_upper = ((read_ecc[1] >> 4) | (read_ecc[2] << 4)) & 0xfff;
408
409 calc_ecc_lower = (calc_ecc[0] | (calc_ecc[1] << 8)) & 0xfff;
410 calc_ecc_upper = ((calc_ecc[1] >> 4) | (calc_ecc[2] << 4)) & 0xfff;
411
412 ecc_odd = read_ecc_lower ^ calc_ecc_lower;
413 ecc_even = read_ecc_upper ^ calc_ecc_upper;
414
415 if ((ecc_odd == 0) && (ecc_even == 0))
416 return 0;
417
418 if (ecc_odd == (~ecc_even & 0xfff)) {
419
420 byte_addr = (ecc_odd >> 3) & 0x1ff;
421
422 bit_addr = ecc_odd & 0x7;
423
424 buf[byte_addr] ^= (1 << bit_addr);
425 return 1;
426 }
427
428 if (onehot(ecc_odd | ecc_even))
429 return 1;
430
431 return -1;
432}
433
434
435
436
437
438
439
440
441static int zynq_nand_read_oob(struct mtd_info *mtd, struct nand_chip *chip,
442 int page)
443{
444 unsigned long data_phase_addr = 0;
445 int data_width = 4;
446 u8 *p;
447
448 chip->cmdfunc(mtd, NAND_CMD_READOOB, 0, page);
449
450 p = chip->oob_poi;
451 chip->read_buf(mtd, p, (mtd->oobsize - data_width));
452 p += mtd->oobsize - data_width;
453
454 data_phase_addr = (unsigned long)chip->IO_ADDR_R;
455 data_phase_addr |= ZYNQ_NAND_CLEAR_CS;
456 chip->IO_ADDR_R = (void __iomem *)data_phase_addr;
457 chip->read_buf(mtd, p, data_width);
458
459 return 0;
460}
461
462
463
464
465
466
467
468static int zynq_nand_write_oob(struct mtd_info *mtd, struct nand_chip *chip,
469 int page)
470{
471 int status = 0, data_width = 4;
472 const u8 *buf = chip->oob_poi;
473 unsigned long data_phase_addr = 0;
474
475 chip->cmdfunc(mtd, NAND_CMD_SEQIN, mtd->writesize, page);
476
477 chip->write_buf(mtd, buf, (mtd->oobsize - data_width));
478 buf += mtd->oobsize - data_width;
479
480 data_phase_addr = (unsigned long)chip->IO_ADDR_W;
481 data_phase_addr |= ZYNQ_NAND_CLEAR_CS;
482 data_phase_addr |= (1 << END_CMD_VALID_SHIFT);
483 chip->IO_ADDR_W = (void __iomem *)data_phase_addr;
484 chip->write_buf(mtd, buf, data_width);
485
486
487 chip->cmdfunc(mtd, NAND_CMD_PAGEPROG, -1, -1);
488 status = chip->waitfunc(mtd, chip);
489
490 return status & NAND_STATUS_FAIL ? -EIO : 0;
491}
492
493
494
495
496
497
498
499
500
501static int zynq_nand_read_page_raw(struct mtd_info *mtd, struct nand_chip *chip,
502 u8 *buf, int oob_required, int page)
503{
504 unsigned long data_width = 4;
505 unsigned long data_phase_addr = 0;
506 u8 *p;
507
508 chip->read_buf(mtd, buf, mtd->writesize);
509
510 p = chip->oob_poi;
511 chip->read_buf(mtd, p, (mtd->oobsize - data_width));
512 p += (mtd->oobsize - data_width);
513
514 data_phase_addr = (unsigned long)chip->IO_ADDR_R;
515 data_phase_addr |= ZYNQ_NAND_CLEAR_CS;
516 chip->IO_ADDR_R = (void __iomem *)data_phase_addr;
517
518 chip->read_buf(mtd, p, data_width);
519 return 0;
520}
521
522static int zynq_nand_read_page_raw_nooob(struct mtd_info *mtd,
523 struct nand_chip *chip, u8 *buf, int oob_required, int page)
524{
525 chip->read_buf(mtd, buf, mtd->writesize);
526 return 0;
527}
528
529static int zynq_nand_read_subpage_raw(struct mtd_info *mtd,
530 struct nand_chip *chip, u32 data_offs,
531 u32 readlen, u8 *buf, int page)
532{
533 if (data_offs != 0) {
534 chip->cmdfunc(mtd, NAND_CMD_RNDOUT, data_offs, -1);
535 buf += data_offs;
536 }
537 chip->read_buf(mtd, buf, readlen);
538
539 return 0;
540}
541
542
543
544
545
546
547
548
549static int zynq_nand_write_page_raw(struct mtd_info *mtd,
550 struct nand_chip *chip, const u8 *buf, int oob_required, int page)
551{
552 unsigned long data_width = 4;
553 unsigned long data_phase_addr = 0;
554 u8 *p;
555
556 chip->write_buf(mtd, buf, mtd->writesize);
557
558 p = chip->oob_poi;
559 chip->write_buf(mtd, p, (mtd->oobsize - data_width));
560 p += (mtd->oobsize - data_width);
561
562 data_phase_addr = (unsigned long)chip->IO_ADDR_W;
563 data_phase_addr |= ZYNQ_NAND_CLEAR_CS;
564 data_phase_addr |= (1 << END_CMD_VALID_SHIFT);
565 chip->IO_ADDR_W = (void __iomem *)data_phase_addr;
566
567 chip->write_buf(mtd, p, data_width);
568
569 return 0;
570}
571
572
573
574
575
576
577
578
579
580
581static int zynq_nand_write_page_hwecc(struct mtd_info *mtd,
582 struct nand_chip *chip, const u8 *buf, int oob_required, int page)
583{
584 int i, eccsteps, eccsize = chip->ecc.size;
585 u8 *ecc_calc = chip->buffers->ecccalc;
586 const u8 *p = buf;
587 u32 *eccpos = chip->ecc.layout->eccpos;
588 unsigned long data_phase_addr = 0;
589 unsigned long data_width = 4;
590 u8 *oob_ptr;
591
592 for (eccsteps = chip->ecc.steps; (eccsteps - 1); eccsteps--) {
593 chip->write_buf(mtd, p, eccsize);
594 p += eccsize;
595 }
596 chip->write_buf(mtd, p, (eccsize - data_width));
597 p += eccsize - data_width;
598
599
600 data_phase_addr = (unsigned long) chip->IO_ADDR_W;
601 data_phase_addr |= ZYNQ_NAND_ECC_LAST;
602 chip->IO_ADDR_W = (void __iomem *)data_phase_addr;
603 chip->write_buf(mtd, p, data_width);
604
605
606 p = buf;
607 chip->ecc.calculate(mtd, p, &ecc_calc[0]);
608
609 for (i = 0; i < chip->ecc.total; i++)
610 chip->oob_poi[eccpos[i]] = ~(ecc_calc[i]);
611
612
613 data_phase_addr = (unsigned long)chip->IO_ADDR_W;
614 data_phase_addr &= ~ZYNQ_NAND_ECC_LAST;
615 chip->IO_ADDR_W = (void __iomem *)data_phase_addr;
616
617
618 oob_ptr = chip->oob_poi;
619 chip->write_buf(mtd, oob_ptr, (mtd->oobsize - data_width));
620
621 data_phase_addr = (unsigned long)chip->IO_ADDR_W;
622 data_phase_addr |= ZYNQ_NAND_CLEAR_CS;
623 data_phase_addr |= (1 << END_CMD_VALID_SHIFT);
624 chip->IO_ADDR_W = (void __iomem *)data_phase_addr;
625 oob_ptr += (mtd->oobsize - data_width);
626 chip->write_buf(mtd, oob_ptr, data_width);
627
628 return 0;
629}
630
631
632
633
634
635
636
637
638
639static int zynq_nand_write_page_swecc(struct mtd_info *mtd,
640 struct nand_chip *chip, const u8 *buf, int oob_required, int page)
641{
642 int i, eccsize = chip->ecc.size;
643 int eccbytes = chip->ecc.bytes;
644 int eccsteps = chip->ecc.steps;
645 u8 *ecc_calc = chip->buffers->ecccalc;
646 const u8 *p = buf;
647 u32 *eccpos = chip->ecc.layout->eccpos;
648
649
650 for (i = 0; eccsteps; eccsteps--, i += eccbytes, p += eccsize)
651 chip->ecc.calculate(mtd, p, &ecc_calc[i]);
652
653 for (i = 0; i < chip->ecc.total; i++)
654 chip->oob_poi[eccpos[i]] = ecc_calc[i];
655
656 return chip->ecc.write_page_raw(mtd, chip, buf, 1, page);
657}
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672static int zynq_nand_read_page_hwecc(struct mtd_info *mtd,
673 struct nand_chip *chip, u8 *buf, int oob_required, int page)
674{
675 int i, stat, eccsteps, eccsize = chip->ecc.size;
676 int eccbytes = chip->ecc.bytes;
677 u8 *p = buf;
678 u8 *ecc_calc = chip->buffers->ecccalc;
679 u8 *ecc_code = chip->buffers->ecccode;
680 u32 *eccpos = chip->ecc.layout->eccpos;
681 unsigned long data_phase_addr = 0;
682 unsigned long data_width = 4;
683 u8 *oob_ptr;
684
685 for (eccsteps = chip->ecc.steps; (eccsteps - 1); eccsteps--) {
686 chip->read_buf(mtd, p, eccsize);
687 p += eccsize;
688 }
689 chip->read_buf(mtd, p, (eccsize - data_width));
690 p += eccsize - data_width;
691
692
693 data_phase_addr = (unsigned long)chip->IO_ADDR_R;
694 data_phase_addr |= ZYNQ_NAND_ECC_LAST;
695 chip->IO_ADDR_R = (void __iomem *)data_phase_addr;
696 chip->read_buf(mtd, p, data_width);
697
698
699 p = buf;
700 chip->ecc.calculate(mtd, p, &ecc_calc[0]);
701
702
703 data_phase_addr = (unsigned long)chip->IO_ADDR_R;
704 data_phase_addr &= ~ZYNQ_NAND_ECC_LAST;
705 chip->IO_ADDR_R = (void __iomem *)data_phase_addr;
706
707
708 oob_ptr = chip->oob_poi;
709 chip->read_buf(mtd, oob_ptr, (mtd->oobsize - data_width));
710
711
712 data_phase_addr = (unsigned long)chip->IO_ADDR_R;
713 data_phase_addr |= ZYNQ_NAND_CLEAR_CS;
714 chip->IO_ADDR_R = (void __iomem *)data_phase_addr;
715
716 oob_ptr += (mtd->oobsize - data_width);
717 chip->read_buf(mtd, oob_ptr, data_width);
718
719 for (i = 0; i < chip->ecc.total; i++)
720 ecc_code[i] = ~(chip->oob_poi[eccpos[i]]);
721
722 eccsteps = chip->ecc.steps;
723 p = buf;
724
725
726 for (i = 0; eccsteps; eccsteps--, i += eccbytes, p += eccsize) {
727 stat = chip->ecc.correct(mtd, p, &ecc_code[i], &ecc_calc[i]);
728 if (stat < 0)
729 mtd->ecc_stats.failed++;
730 else
731 mtd->ecc_stats.corrected += stat;
732 }
733 return 0;
734}
735
736
737
738
739
740
741
742
743
744static int zynq_nand_read_page_swecc(struct mtd_info *mtd,
745 struct nand_chip *chip, u8 *buf, int oob_required, int page)
746{
747 int i, eccsize = chip->ecc.size;
748 int eccbytes = chip->ecc.bytes;
749 int eccsteps = chip->ecc.steps;
750 u8 *p = buf;
751 u8 *ecc_calc = chip->buffers->ecccalc;
752 u8 *ecc_code = chip->buffers->ecccode;
753 u32 *eccpos = chip->ecc.layout->eccpos;
754
755 chip->ecc.read_page_raw(mtd, chip, buf, 1, page);
756
757 for (i = 0; eccsteps; eccsteps--, i += eccbytes, p += eccsize)
758 chip->ecc.calculate(mtd, p, &ecc_calc[i]);
759
760 for (i = 0; i < chip->ecc.total; i++)
761 ecc_code[i] = chip->oob_poi[eccpos[i]];
762
763 eccsteps = chip->ecc.steps;
764 p = buf;
765
766 for (i = 0; eccsteps; eccsteps--, i += eccbytes, p += eccsize) {
767 int stat;
768
769 stat = chip->ecc.correct(mtd, p, &ecc_code[i], &ecc_calc[i]);
770 if (stat < 0)
771 mtd->ecc_stats.failed++;
772 else
773 mtd->ecc_stats.corrected += stat;
774 }
775 return 0;
776}
777
778
779
780
781
782
783
784
785
786static void zynq_nand_select_chip(struct mtd_info *mtd, int chip)
787{
788
789}
790
791
792
793
794
795
796
797
798static void zynq_nand_cmd_function(struct mtd_info *mtd, unsigned int command,
799 int column, int page_addr)
800{
801 struct nand_chip *chip = mtd_to_nand(mtd);
802 struct nand_drv *smc = nand_get_controller_data(chip);
803 const struct zynq_nand_command_format *curr_cmd = NULL;
804 u8 addr_cycles = 0;
805 struct nand_config *xnand = &smc->config;
806 void *cmd_addr;
807 unsigned long cmd_data = 0;
808 unsigned long cmd_phase_addr = 0;
809 unsigned long data_phase_addr = 0;
810 u8 end_cmd = 0;
811 u8 end_cmd_valid = 0;
812 u32 index;
813
814 if (xnand->end_cmd_pending) {
815
816
817
818 if (xnand->end_cmd == command) {
819 xnand->end_cmd = 0;
820 xnand->end_cmd_pending = 0;
821 return;
822 }
823 }
824
825
826 if ((mtd->writesize > ZYNQ_NAND_ECC_SIZE) &&
827 (command == NAND_CMD_READOOB)) {
828 column += mtd->writesize;
829 command = NAND_CMD_READ0;
830 }
831
832
833 for (index = 0; index < ARRAY_SIZE(zynq_nand_commands); index++)
834 if (command == zynq_nand_commands[index].start_cmd)
835 break;
836
837 if (index == ARRAY_SIZE(zynq_nand_commands)) {
838 printf("%s: Unsupported start cmd %02x\n", __func__, command);
839 return;
840 }
841 curr_cmd = &zynq_nand_commands[index];
842
843
844 writel(ZYNQ_MEMC_CLRCR_INT_CLR1, &smc->reg->cfr);
845
846
847 if (curr_cmd->end_cmd_valid == ZYNQ_NAND_CMD_PHASE)
848 end_cmd_valid = 1;
849
850 if (curr_cmd->end_cmd == (u8)NAND_CMD_NONE)
851 end_cmd = 0x0;
852 else
853 end_cmd = curr_cmd->end_cmd;
854
855 if (command == NAND_CMD_READ0 ||
856 command == NAND_CMD_SEQIN) {
857 addr_cycles = chip->onfi_params.addr_cycles &
858 ZYNQ_NAND_ROW_ADDR_CYCL_MASK;
859 addr_cycles += ((chip->onfi_params.addr_cycles &
860 ZYNQ_NAND_COL_ADDR_CYCL_MASK) >> 4);
861 } else {
862 addr_cycles = curr_cmd->addr_cycles;
863 }
864
865 cmd_phase_addr = (unsigned long)xnand->nand_base |
866 (addr_cycles << ADDR_CYCLES_SHIFT) |
867 (end_cmd_valid << END_CMD_VALID_SHIFT) |
868 (COMMAND_PHASE) |
869 (end_cmd << END_CMD_SHIFT) |
870 (curr_cmd->start_cmd << START_CMD_SHIFT);
871
872 cmd_addr = (void __iomem *)cmd_phase_addr;
873
874
875 end_cmd_valid = 0;
876
877 data_phase_addr = (unsigned long)xnand->nand_base |
878 (0x0 << CLEAR_CS_SHIFT) |
879 (end_cmd_valid << END_CMD_VALID_SHIFT) |
880 (DATA_PHASE) |
881 (end_cmd << END_CMD_SHIFT) |
882 (0x0 << ECC_LAST_SHIFT);
883
884 chip->IO_ADDR_R = (void __iomem *)data_phase_addr;
885 chip->IO_ADDR_W = chip->IO_ADDR_R;
886
887
888 if (column != -1 && page_addr != -1) {
889
890 if (chip->options & NAND_BUSWIDTH_16)
891 column >>= 1;
892 cmd_data = column;
893 if (mtd->writesize > ZYNQ_NAND_ECC_SIZE) {
894 cmd_data |= page_addr << 16;
895
896 if (chip->chipsize > (128 << 20)) {
897 writel(cmd_data, cmd_addr);
898 cmd_data = (page_addr >> 16);
899 }
900 } else {
901 cmd_data |= page_addr << 8;
902 }
903 } else if (page_addr != -1) {
904 cmd_data = page_addr;
905 } else if (column != -1) {
906
907 if ((chip->options & NAND_BUSWIDTH_16) &&
908 ((command == NAND_CMD_READ0) ||
909 (command == NAND_CMD_SEQIN) ||
910 (command == NAND_CMD_RNDOUT) ||
911 (command == NAND_CMD_RNDIN)))
912 column >>= 1;
913 cmd_data = column;
914 }
915
916 writel(cmd_data, cmd_addr);
917
918 if (curr_cmd->end_cmd_valid) {
919 xnand->end_cmd = curr_cmd->end_cmd;
920 xnand->end_cmd_pending = 1;
921 }
922
923 ndelay(100);
924
925 if ((command == NAND_CMD_READ0) ||
926 (command == NAND_CMD_RESET) ||
927 (command == NAND_CMD_PARAM) ||
928 (command == NAND_CMD_GET_FEATURES))
929
930 nand_wait_ready(mtd);
931}
932
933
934
935
936
937
938
939static void zynq_nand_read_buf(struct mtd_info *mtd, u8 *buf, int len)
940{
941 struct nand_chip *chip = mtd_to_nand(mtd);
942
943
944 if (((unsigned long)buf & 0x3) != 0) {
945 if (((unsigned long)buf & 0x1) != 0) {
946 if (len) {
947 *buf = readb(chip->IO_ADDR_R);
948 buf += 1;
949 len--;
950 }
951 }
952
953 if (((unsigned long)buf & 0x3) != 0) {
954 if (len >= 2) {
955 *(u16 *)buf = readw(chip->IO_ADDR_R);
956 buf += 2;
957 len -= 2;
958 }
959 }
960 }
961
962
963 while (len >= 4) {
964 *(u32 *)buf = readl(chip->IO_ADDR_R);
965 buf += 4;
966 len -= 4;
967 }
968
969
970 if (len) {
971 if (len >= 2) {
972 *(u16 *)buf = readw(chip->IO_ADDR_R);
973 buf += 2;
974 len -= 2;
975 }
976 if (len)
977 *buf = readb(chip->IO_ADDR_R);
978 }
979}
980
981
982
983
984
985
986
987static void zynq_nand_write_buf(struct mtd_info *mtd, const u8 *buf, int len)
988{
989 struct nand_chip *chip = mtd_to_nand(mtd);
990 const u32 *nand = chip->IO_ADDR_W;
991
992
993 if (((unsigned long)buf & 0x3) != 0) {
994 if (((unsigned long)buf & 0x1) != 0) {
995 if (len) {
996 writeb(*buf, nand);
997 buf += 1;
998 len--;
999 }
1000 }
1001
1002 if (((unsigned long)buf & 0x3) != 0) {
1003 if (len >= 2) {
1004 writew(*(u16 *)buf, nand);
1005 buf += 2;
1006 len -= 2;
1007 }
1008 }
1009 }
1010
1011
1012 while (len >= 4) {
1013 writel(*(u32 *)buf, nand);
1014 buf += 4;
1015 len -= 4;
1016 }
1017
1018
1019 if (len) {
1020 if (len >= 2) {
1021 writew(*(u16 *)buf, nand);
1022 buf += 2;
1023 len -= 2;
1024 }
1025
1026 if (len)
1027 writeb(*buf, nand);
1028 }
1029}
1030
1031
1032
1033
1034
1035
1036
1037static int zynq_nand_device_ready(struct mtd_info *mtd)
1038{
1039 struct nand_chip *nand_chip = mtd_to_nand(mtd);
1040 struct nand_drv *smc = nand_get_controller_data(nand_chip);
1041 u32 csr_val;
1042
1043 csr_val = readl(&smc->reg->csr);
1044
1045 if (csr_val & ZYNQ_MEMC_SR_RAW_INT_ST1) {
1046
1047 writel(ZYNQ_MEMC_SR_INT_ST1, &smc->reg->cfr);
1048 return 1;
1049 }
1050
1051 return 0;
1052}
1053
1054static int zynq_nand_check_is_16bit_bw_flash(void)
1055{
1056 int is_16bit_bw = NAND_BW_UNKNOWN;
1057 int mio_num_8bit = 0, mio_num_16bit = 0;
1058
1059 mio_num_8bit = zynq_slcr_get_mio_pin_status("nand8");
1060 if (mio_num_8bit == ZYNQ_NAND_MIO_NUM_NAND_8BIT)
1061 is_16bit_bw = NAND_BW_8BIT;
1062
1063 mio_num_16bit = zynq_slcr_get_mio_pin_status("nand16");
1064 if (mio_num_8bit == ZYNQ_NAND_MIO_NUM_NAND_8BIT &&
1065 mio_num_16bit == ZYNQ_NAND_MIO_NUM_NAND_16BIT)
1066 is_16bit_bw = NAND_BW_16BIT;
1067
1068 return is_16bit_bw;
1069}
1070
1071static int zynq_nand_probe(struct udevice *dev)
1072{
1073 struct zynq_nand_info *zynq = dev_get_priv(dev);
1074 struct nand_chip *nand_chip = &zynq->nand_chip;
1075 struct nand_drv *smc = &zynq->nand_ctrl;
1076 struct nand_config *xnand = &smc->config;
1077 struct mtd_info *mtd;
1078 struct resource res;
1079 ofnode of_nand;
1080 unsigned long ecc_page_size;
1081 u8 maf_id, dev_id, i;
1082 u8 get_feature[4];
1083 u8 set_feature[4] = {ONDIE_ECC_FEATURE_ENABLE, 0x00, 0x00, 0x00};
1084 unsigned long ecc_cfg;
1085 int ondie_ecc_enabled = 0;
1086 int is_16bit_bw;
1087
1088 smc->reg = (struct zynq_nand_smc_regs *)dev_read_addr(dev);
1089 of_nand = dev_read_subnode(dev, "flash@e1000000");
1090 if (!ofnode_valid(of_nand)) {
1091 printf("Failed to find nand node in dt\n");
1092 return -ENODEV;
1093 }
1094
1095 if (!ofnode_is_available(of_nand)) {
1096 debug("Nand node in dt disabled\n");
1097 return dm_scan_fdt_dev(dev);
1098 }
1099
1100 if (ofnode_read_resource(of_nand, 0, &res)) {
1101 printf("Failed to get nand resource\n");
1102 return -ENODEV;
1103 }
1104
1105 xnand->nand_base = (void __iomem *)res.start;
1106 mtd = nand_to_mtd(nand_chip);
1107 nand_set_controller_data(nand_chip, &zynq->nand_ctrl);
1108
1109
1110 nand_chip->IO_ADDR_R = xnand->nand_base;
1111 nand_chip->IO_ADDR_W = xnand->nand_base;
1112
1113
1114 nand_chip->cmdfunc = zynq_nand_cmd_function;
1115 nand_chip->dev_ready = zynq_nand_device_ready;
1116 nand_chip->select_chip = zynq_nand_select_chip;
1117
1118
1119 nand_chip->chip_delay = 30;
1120
1121
1122 nand_chip->read_buf = zynq_nand_read_buf;
1123 nand_chip->write_buf = zynq_nand_write_buf;
1124
1125 is_16bit_bw = zynq_nand_check_is_16bit_bw_flash();
1126 if (is_16bit_bw == NAND_BW_UNKNOWN) {
1127 printf("%s: Unable detect NAND based on MIO settings\n",
1128 __func__);
1129 return -EINVAL;
1130 }
1131
1132 if (is_16bit_bw == NAND_BW_16BIT)
1133 nand_chip->options = NAND_BUSWIDTH_16;
1134
1135 nand_chip->bbt_options = NAND_BBT_USE_FLASH;
1136
1137
1138 if (zynq_nand_init_nand_flash(mtd, nand_chip->options) < 0) {
1139 printf("%s: nand flash init failed\n", __func__);
1140 return -EINVAL;
1141 }
1142
1143
1144 if (nand_scan_ident(mtd, 1, NULL)) {
1145 printf("%s: nand_scan_ident failed\n", __func__);
1146 return -EINVAL;
1147 }
1148
1149 nand_chip->cmdfunc(mtd, NAND_CMD_RESET, -1, -1);
1150 nand_chip->cmdfunc(mtd, NAND_CMD_READID, 0x00, -1);
1151
1152
1153 maf_id = nand_chip->read_byte(mtd);
1154 dev_id = nand_chip->read_byte(mtd);
1155
1156 if ((maf_id == 0x2c) && ((dev_id == 0xf1) ||
1157 (dev_id == 0xa1) || (dev_id == 0xb1) ||
1158 (dev_id == 0xaa) || (dev_id == 0xba) ||
1159 (dev_id == 0xda) || (dev_id == 0xca) ||
1160 (dev_id == 0xac) || (dev_id == 0xbc) ||
1161 (dev_id == 0xdc) || (dev_id == 0xcc) ||
1162 (dev_id == 0xa3) || (dev_id == 0xb3) ||
1163 (dev_id == 0xd3) || (dev_id == 0xc3))) {
1164 nand_chip->cmdfunc(mtd, NAND_CMD_SET_FEATURES,
1165 ONDIE_ECC_FEATURE_ADDR, -1);
1166 for (i = 0; i < 4; i++)
1167 writeb(set_feature[i], nand_chip->IO_ADDR_W);
1168
1169
1170 ndelay(1000);
1171
1172 nand_chip->cmdfunc(mtd, NAND_CMD_GET_FEATURES,
1173 ONDIE_ECC_FEATURE_ADDR, -1);
1174 nand_chip->read_buf(mtd, get_feature, 4);
1175
1176 if (get_feature[0] & ONDIE_ECC_FEATURE_ENABLE) {
1177 debug("%s: OnDie ECC flash\n", __func__);
1178 ondie_ecc_enabled = 1;
1179 } else {
1180 printf("%s: Unable to detect OnDie ECC\n", __func__);
1181 }
1182 }
1183
1184 if (ondie_ecc_enabled) {
1185
1186 ecc_cfg = readl(&smc->reg->emcr);
1187 ecc_cfg &= ~ZYNQ_MEMC_NAND_ECC_MODE_MASK;
1188 writel(ecc_cfg, &smc->reg->emcr);
1189
1190
1191
1192
1193 nand_chip->ecc.mode = NAND_ECC_HW;
1194 nand_chip->ecc.strength = 1;
1195 nand_chip->ecc.read_page = zynq_nand_read_page_raw_nooob;
1196 nand_chip->ecc.read_subpage = zynq_nand_read_subpage_raw;
1197 nand_chip->ecc.write_page = zynq_nand_write_page_raw;
1198 nand_chip->ecc.read_page_raw = zynq_nand_read_page_raw;
1199 nand_chip->ecc.write_page_raw = zynq_nand_write_page_raw;
1200 nand_chip->ecc.read_oob = zynq_nand_read_oob;
1201 nand_chip->ecc.write_oob = zynq_nand_write_oob;
1202 nand_chip->ecc.size = mtd->writesize;
1203 nand_chip->ecc.bytes = 0;
1204
1205
1206 nand_chip->options |= NAND_SUBPAGE_READ;
1207
1208
1209 nand_chip->ecc.layout = &ondie_nand_oob_64;
1210
1211 nand_chip->bbt_td = &bbt_main_descr;
1212 nand_chip->bbt_md = &bbt_mirror_descr;
1213 } else {
1214
1215 nand_chip->ecc.mode = NAND_ECC_HW;
1216 nand_chip->ecc.strength = 1;
1217 nand_chip->ecc.size = ZYNQ_NAND_ECC_SIZE;
1218 nand_chip->ecc.bytes = 3;
1219 nand_chip->ecc.calculate = zynq_nand_calculate_hwecc;
1220 nand_chip->ecc.correct = zynq_nand_correct_data;
1221 nand_chip->ecc.hwctl = NULL;
1222 nand_chip->ecc.read_page = zynq_nand_read_page_hwecc;
1223 nand_chip->ecc.write_page = zynq_nand_write_page_hwecc;
1224 nand_chip->ecc.read_page_raw = zynq_nand_read_page_raw;
1225 nand_chip->ecc.write_page_raw = zynq_nand_write_page_raw;
1226 nand_chip->ecc.read_oob = zynq_nand_read_oob;
1227 nand_chip->ecc.write_oob = zynq_nand_write_oob;
1228
1229 switch (mtd->writesize) {
1230 case 512:
1231 ecc_page_size = 0x1;
1232
1233 writel((ZYNQ_NAND_ECC_CONFIG | ecc_page_size),
1234 &smc->reg->emcr);
1235 break;
1236 case 1024:
1237 ecc_page_size = 0x2;
1238
1239 writel((ZYNQ_NAND_ECC_CONFIG | ecc_page_size),
1240 &smc->reg->emcr);
1241 break;
1242 case 2048:
1243 ecc_page_size = 0x3;
1244
1245 writel((ZYNQ_NAND_ECC_CONFIG | ecc_page_size),
1246 &smc->reg->emcr);
1247 break;
1248 default:
1249 nand_chip->ecc.mode = NAND_ECC_SOFT;
1250 nand_chip->ecc.calculate = nand_calculate_ecc;
1251 nand_chip->ecc.correct = nand_correct_data;
1252 nand_chip->ecc.read_page = zynq_nand_read_page_swecc;
1253 nand_chip->ecc.write_page = zynq_nand_write_page_swecc;
1254 nand_chip->ecc.size = 256;
1255 break;
1256 }
1257
1258 if (mtd->oobsize == 16)
1259 nand_chip->ecc.layout = &nand_oob_16;
1260 else if (mtd->oobsize == 64)
1261 nand_chip->ecc.layout = &nand_oob_64;
1262 else
1263 printf("%s: No oob layout found\n", __func__);
1264 }
1265
1266
1267 if (nand_scan_tail(mtd)) {
1268 printf("%s: nand_scan_tail failed\n", __func__);
1269 return -EINVAL;
1270 }
1271 if (nand_register(0, mtd))
1272 return -EINVAL;
1273
1274 return 0;
1275}
1276
1277static const struct udevice_id zynq_nand_dt_ids[] = {
1278 {.compatible = "arm,pl353-smc-r2p1",},
1279 { }
1280};
1281
1282U_BOOT_DRIVER(zynq_nand) = {
1283 .name = "zynq_nand",
1284 .id = UCLASS_MTD,
1285 .of_match = zynq_nand_dt_ids,
1286 .probe = zynq_nand_probe,
1287 .priv_auto = sizeof(struct zynq_nand_info),
1288};
1289
1290void board_nand_init(void)
1291{
1292 struct udevice *dev;
1293 int ret;
1294
1295 ret = uclass_get_device_by_driver(UCLASS_MTD,
1296 DM_DRIVER_GET(zynq_nand), &dev);
1297 if (ret && ret != -ENODEV)
1298 pr_err("Failed to initialize %s. (error %d)\n", dev->name, ret);
1299}
1300