1
2
3
4
5
6
7
8
9#include <common.h>
10#include <malloc.h>
11#include <nand.h>
12
13#include <linux/mtd/mtd.h>
14#include <linux/mtd/rawnand.h>
15#include <linux/mtd/nand_ecc.h>
16
17#include <asm/io.h>
18#include <linux/errno.h>
19#include <fsl_ifc.h>
20
21#ifndef CONFIG_SYS_FSL_IFC_BANK_COUNT
22#define CONFIG_SYS_FSL_IFC_BANK_COUNT 4
23#endif
24
25#define MAX_BANKS CONFIG_SYS_FSL_IFC_BANK_COUNT
26#define ERR_BYTE 0xFF
27
28
29struct fsl_ifc_ctrl;
30
31
32struct fsl_ifc_mtd {
33 struct nand_chip chip;
34 struct fsl_ifc_ctrl *ctrl;
35
36 struct device *dev;
37 int bank;
38 unsigned int bufnum_mask;
39 u8 __iomem *vbase;
40};
41
42
43struct fsl_ifc_ctrl {
44 struct nand_hw_control controller;
45 struct fsl_ifc_mtd *chips[MAX_BANKS];
46
47
48 struct fsl_ifc regs;
49 void __iomem *addr;
50 unsigned int page;
51 unsigned int read_bytes;
52 unsigned int column;
53 unsigned int index;
54 unsigned int status;
55 unsigned int oob;
56 unsigned int eccread;
57};
58
59static struct fsl_ifc_ctrl *ifc_ctrl;
60
61
62static struct nand_ecclayout oob_512_8bit_ecc4 = {
63 .eccbytes = 8,
64 .eccpos = {8, 9, 10, 11, 12, 13, 14, 15},
65 .oobfree = { {0, 5}, {6, 2} },
66};
67
68
69static struct nand_ecclayout oob_512_16bit_ecc4 = {
70 .eccbytes = 8,
71 .eccpos = {8, 9, 10, 11, 12, 13, 14, 15},
72 .oobfree = { {2, 6}, },
73};
74
75
76static struct nand_ecclayout oob_2048_ecc4 = {
77 .eccbytes = 32,
78 .eccpos = {
79 8, 9, 10, 11, 12, 13, 14, 15,
80 16, 17, 18, 19, 20, 21, 22, 23,
81 24, 25, 26, 27, 28, 29, 30, 31,
82 32, 33, 34, 35, 36, 37, 38, 39,
83 },
84 .oobfree = { {2, 6}, {40, 24} },
85};
86
87
88static struct nand_ecclayout oob_4096_ecc4 = {
89 .eccbytes = 64,
90 .eccpos = {
91 8, 9, 10, 11, 12, 13, 14, 15,
92 16, 17, 18, 19, 20, 21, 22, 23,
93 24, 25, 26, 27, 28, 29, 30, 31,
94 32, 33, 34, 35, 36, 37, 38, 39,
95 40, 41, 42, 43, 44, 45, 46, 47,
96 48, 49, 50, 51, 52, 53, 54, 55,
97 56, 57, 58, 59, 60, 61, 62, 63,
98 64, 65, 66, 67, 68, 69, 70, 71,
99 },
100 .oobfree = { {2, 6}, {72, 56} },
101};
102
103
104static struct nand_ecclayout oob_4096_ecc8 = {
105 .eccbytes = 128,
106 .eccpos = {
107 8, 9, 10, 11, 12, 13, 14, 15,
108 16, 17, 18, 19, 20, 21, 22, 23,
109 24, 25, 26, 27, 28, 29, 30, 31,
110 32, 33, 34, 35, 36, 37, 38, 39,
111 40, 41, 42, 43, 44, 45, 46, 47,
112 48, 49, 50, 51, 52, 53, 54, 55,
113 56, 57, 58, 59, 60, 61, 62, 63,
114 64, 65, 66, 67, 68, 69, 70, 71,
115 72, 73, 74, 75, 76, 77, 78, 79,
116 80, 81, 82, 83, 84, 85, 86, 87,
117 88, 89, 90, 91, 92, 93, 94, 95,
118 96, 97, 98, 99, 100, 101, 102, 103,
119 104, 105, 106, 107, 108, 109, 110, 111,
120 112, 113, 114, 115, 116, 117, 118, 119,
121 120, 121, 122, 123, 124, 125, 126, 127,
122 128, 129, 130, 131, 132, 133, 134, 135,
123 },
124 .oobfree = { {2, 6}, {136, 82} },
125};
126
127
128static struct nand_ecclayout oob_8192_ecc4 = {
129 .eccbytes = 128,
130 .eccpos = {
131 8, 9, 10, 11, 12, 13, 14, 15,
132 16, 17, 18, 19, 20, 21, 22, 23,
133 24, 25, 26, 27, 28, 29, 30, 31,
134 32, 33, 34, 35, 36, 37, 38, 39,
135 40, 41, 42, 43, 44, 45, 46, 47,
136 48, 49, 50, 51, 52, 53, 54, 55,
137 56, 57, 58, 59, 60, 61, 62, 63,
138 64, 65, 66, 67, 68, 69, 70, 71,
139 72, 73, 74, 75, 76, 77, 78, 79,
140 80, 81, 82, 83, 84, 85, 86, 87,
141 88, 89, 90, 91, 92, 93, 94, 95,
142 96, 97, 98, 99, 100, 101, 102, 103,
143 104, 105, 106, 107, 108, 109, 110, 111,
144 112, 113, 114, 115, 116, 117, 118, 119,
145 120, 121, 122, 123, 124, 125, 126, 127,
146 128, 129, 130, 131, 132, 133, 134, 135,
147 },
148 .oobfree = { {2, 6}, {136, 208} },
149};
150
151
152static struct nand_ecclayout oob_8192_ecc8 = {
153 .eccbytes = 256,
154 .eccpos = {
155 8, 9, 10, 11, 12, 13, 14, 15,
156 16, 17, 18, 19, 20, 21, 22, 23,
157 24, 25, 26, 27, 28, 29, 30, 31,
158 32, 33, 34, 35, 36, 37, 38, 39,
159 40, 41, 42, 43, 44, 45, 46, 47,
160 48, 49, 50, 51, 52, 53, 54, 55,
161 56, 57, 58, 59, 60, 61, 62, 63,
162 64, 65, 66, 67, 68, 69, 70, 71,
163 72, 73, 74, 75, 76, 77, 78, 79,
164 80, 81, 82, 83, 84, 85, 86, 87,
165 88, 89, 90, 91, 92, 93, 94, 95,
166 96, 97, 98, 99, 100, 101, 102, 103,
167 104, 105, 106, 107, 108, 109, 110, 111,
168 112, 113, 114, 115, 116, 117, 118, 119,
169 120, 121, 122, 123, 124, 125, 126, 127,
170 128, 129, 130, 131, 132, 133, 134, 135,
171 136, 137, 138, 139, 140, 141, 142, 143,
172 144, 145, 146, 147, 148, 149, 150, 151,
173 152, 153, 154, 155, 156, 157, 158, 159,
174 160, 161, 162, 163, 164, 165, 166, 167,
175 168, 169, 170, 171, 172, 173, 174, 175,
176 176, 177, 178, 179, 180, 181, 182, 183,
177 184, 185, 186, 187, 188, 189, 190, 191,
178 192, 193, 194, 195, 196, 197, 198, 199,
179 200, 201, 202, 203, 204, 205, 206, 207,
180 208, 209, 210, 211, 212, 213, 214, 215,
181 216, 217, 218, 219, 220, 221, 222, 223,
182 224, 225, 226, 227, 228, 229, 230, 231,
183 232, 233, 234, 235, 236, 237, 238, 239,
184 240, 241, 242, 243, 244, 245, 246, 247,
185 248, 249, 250, 251, 252, 253, 254, 255,
186 256, 257, 258, 259, 260, 261, 262, 263,
187 },
188 .oobfree = { {2, 6}, {264, 80} },
189};
190
191
192
193
194static u8 bbt_pattern[] = {'B', 'b', 't', '0' };
195static u8 mirror_pattern[] = {'1', 't', 'b', 'B' };
196
197static struct nand_bbt_descr bbt_main_descr = {
198 .options = NAND_BBT_LASTBLOCK | NAND_BBT_CREATE | NAND_BBT_WRITE |
199 NAND_BBT_2BIT | NAND_BBT_VERSION,
200 .offs = 2,
201 .len = 4,
202 .veroffs = 6,
203 .maxblocks = 4,
204 .pattern = bbt_pattern,
205};
206
207static struct nand_bbt_descr bbt_mirror_descr = {
208 .options = NAND_BBT_LASTBLOCK | NAND_BBT_CREATE | NAND_BBT_WRITE |
209 NAND_BBT_2BIT | NAND_BBT_VERSION,
210 .offs = 2,
211 .len = 4,
212 .veroffs = 6,
213 .maxblocks = 4,
214 .pattern = mirror_pattern,
215};
216
217
218
219
220
221static void set_addr(struct mtd_info *mtd, int column, int page_addr, int oob)
222{
223 struct nand_chip *chip = mtd_to_nand(mtd);
224 struct fsl_ifc_mtd *priv = nand_get_controller_data(chip);
225 struct fsl_ifc_ctrl *ctrl = priv->ctrl;
226 struct fsl_ifc_runtime *ifc = ctrl->regs.rregs;
227 int buf_num;
228
229 ctrl->page = page_addr;
230
231
232 ifc_out32(&ifc->ifc_nand.row0, page_addr);
233 ifc_out32(&ifc->ifc_nand.col0, (oob ? IFC_NAND_COL_MS : 0) | column);
234
235 buf_num = page_addr & priv->bufnum_mask;
236
237 ctrl->addr = priv->vbase + buf_num * (mtd->writesize * 2);
238 ctrl->index = column;
239
240
241 if (oob)
242 ctrl->index += mtd->writesize;
243}
244
245static int is_blank(struct mtd_info *mtd, struct fsl_ifc_ctrl *ctrl,
246 unsigned int bufnum)
247{
248 struct nand_chip *chip = mtd_to_nand(mtd);
249 struct fsl_ifc_mtd *priv = nand_get_controller_data(chip);
250 u8 __iomem *addr = priv->vbase + bufnum * (mtd->writesize * 2);
251 u32 __iomem *main = (u32 *)addr;
252 u8 __iomem *oob = addr + mtd->writesize;
253 int i;
254
255 for (i = 0; i < mtd->writesize / 4; i++) {
256 if (__raw_readl(&main[i]) != 0xffffffff)
257 return 0;
258 }
259
260 for (i = 0; i < chip->ecc.layout->eccbytes; i++) {
261 int pos = chip->ecc.layout->eccpos[i];
262
263 if (__raw_readb(&oob[pos]) != 0xff)
264 return 0;
265 }
266
267 return 1;
268}
269
270
271static int check_read_ecc(struct mtd_info *mtd, struct fsl_ifc_ctrl *ctrl,
272 u32 eccstat, unsigned int bufnum)
273{
274 return (eccstat >> ((3 - bufnum % 4) * 8)) & 15;
275}
276
277
278
279
280static int fsl_ifc_run_command(struct mtd_info *mtd)
281{
282 struct nand_chip *chip = mtd_to_nand(mtd);
283 struct fsl_ifc_mtd *priv = nand_get_controller_data(chip);
284 struct fsl_ifc_ctrl *ctrl = priv->ctrl;
285 struct fsl_ifc_runtime *ifc = ctrl->regs.rregs;
286 u32 timeo = (CONFIG_SYS_HZ * 10) / 1000;
287 u32 time_start;
288 u32 eccstat;
289 int i;
290
291
292 ifc_out32(&ifc->ifc_nand.nand_csel, priv->bank << IFC_NAND_CSEL_SHIFT);
293
294
295 ifc_out32(&ifc->ifc_nand.nandseq_strt,
296 IFC_NAND_SEQ_STRT_FIR_STRT);
297
298
299 time_start = get_timer(0);
300
301 while (get_timer(time_start) < timeo) {
302 ctrl->status = ifc_in32(&ifc->ifc_nand.nand_evter_stat);
303
304 if (ctrl->status & IFC_NAND_EVTER_STAT_OPC)
305 break;
306 }
307
308 ifc_out32(&ifc->ifc_nand.nand_evter_stat, ctrl->status);
309
310 if (ctrl->status & IFC_NAND_EVTER_STAT_FTOER)
311 printf("%s: Flash Time Out Error\n", __func__);
312 if (ctrl->status & IFC_NAND_EVTER_STAT_WPER)
313 printf("%s: Write Protect Error\n", __func__);
314
315 if (ctrl->eccread) {
316 int errors;
317 int bufnum = ctrl->page & priv->bufnum_mask;
318 int sector_start = bufnum * chip->ecc.steps;
319 int sector_end = sector_start + chip->ecc.steps - 1;
320 u32 *eccstat_regs;
321
322 eccstat_regs = ifc->ifc_nand.nand_eccstat;
323 eccstat = ifc_in32(&eccstat_regs[sector_start / 4]);
324
325 for (i = sector_start; i <= sector_end; i++) {
326 if ((i != sector_start) && !(i % 4))
327 eccstat = ifc_in32(&eccstat_regs[i / 4]);
328
329 errors = check_read_ecc(mtd, ctrl, eccstat, i);
330
331 if (errors == 15) {
332
333
334
335
336
337
338
339
340 if (!is_blank(mtd, ctrl, bufnum))
341 ctrl->status |=
342 IFC_NAND_EVTER_STAT_ECCER;
343 break;
344 }
345
346 mtd->ecc_stats.corrected += errors;
347 }
348
349 ctrl->eccread = 0;
350 }
351
352
353 return ctrl->status == IFC_NAND_EVTER_STAT_OPC ? 0 : -EIO;
354}
355
356static void fsl_ifc_do_read(struct nand_chip *chip,
357 int oob,
358 struct mtd_info *mtd)
359{
360 struct fsl_ifc_mtd *priv = nand_get_controller_data(chip);
361 struct fsl_ifc_ctrl *ctrl = priv->ctrl;
362 struct fsl_ifc_runtime *ifc = ctrl->regs.rregs;
363
364
365 if (mtd->writesize > 512) {
366 ifc_out32(&ifc->ifc_nand.nand_fir0,
367 (IFC_FIR_OP_CW0 << IFC_NAND_FIR0_OP0_SHIFT) |
368 (IFC_FIR_OP_CA0 << IFC_NAND_FIR0_OP1_SHIFT) |
369 (IFC_FIR_OP_RA0 << IFC_NAND_FIR0_OP2_SHIFT) |
370 (IFC_FIR_OP_CMD1 << IFC_NAND_FIR0_OP3_SHIFT) |
371 (IFC_FIR_OP_RBCD << IFC_NAND_FIR0_OP4_SHIFT));
372 ifc_out32(&ifc->ifc_nand.nand_fir1, 0x0);
373
374 ifc_out32(&ifc->ifc_nand.nand_fcr0,
375 (NAND_CMD_READ0 << IFC_NAND_FCR0_CMD0_SHIFT) |
376 (NAND_CMD_READSTART << IFC_NAND_FCR0_CMD1_SHIFT));
377 } else {
378 ifc_out32(&ifc->ifc_nand.nand_fir0,
379 (IFC_FIR_OP_CW0 << IFC_NAND_FIR0_OP0_SHIFT) |
380 (IFC_FIR_OP_CA0 << IFC_NAND_FIR0_OP1_SHIFT) |
381 (IFC_FIR_OP_RA0 << IFC_NAND_FIR0_OP2_SHIFT) |
382 (IFC_FIR_OP_RBCD << IFC_NAND_FIR0_OP3_SHIFT));
383
384 if (oob)
385 ifc_out32(&ifc->ifc_nand.nand_fcr0,
386 NAND_CMD_READOOB << IFC_NAND_FCR0_CMD0_SHIFT);
387 else
388 ifc_out32(&ifc->ifc_nand.nand_fcr0,
389 NAND_CMD_READ0 << IFC_NAND_FCR0_CMD0_SHIFT);
390 }
391}
392
393
394static void fsl_ifc_cmdfunc(struct mtd_info *mtd, unsigned int command,
395 int column, int page_addr)
396{
397 struct nand_chip *chip = mtd_to_nand(mtd);
398 struct fsl_ifc_mtd *priv = nand_get_controller_data(chip);
399 struct fsl_ifc_ctrl *ctrl = priv->ctrl;
400 struct fsl_ifc_runtime *ifc = ctrl->regs.rregs;
401
402
403 ctrl->read_bytes = 0;
404 if (command != NAND_CMD_PAGEPROG)
405 ctrl->index = 0;
406
407 switch (command) {
408
409 case NAND_CMD_READ0: {
410 ifc_out32(&ifc->ifc_nand.nand_fbcr, 0);
411 set_addr(mtd, 0, page_addr, 0);
412
413 ctrl->read_bytes = mtd->writesize + mtd->oobsize;
414 ctrl->index += column;
415
416 if (chip->ecc.mode == NAND_ECC_HW)
417 ctrl->eccread = 1;
418
419 fsl_ifc_do_read(chip, 0, mtd);
420 fsl_ifc_run_command(mtd);
421 return;
422 }
423
424
425 case NAND_CMD_READOOB:
426 ifc_out32(&ifc->ifc_nand.nand_fbcr, mtd->oobsize - column);
427 set_addr(mtd, column, page_addr, 1);
428
429 ctrl->read_bytes = mtd->writesize + mtd->oobsize;
430
431 fsl_ifc_do_read(chip, 1, mtd);
432 fsl_ifc_run_command(mtd);
433
434 return;
435
436
437 case NAND_CMD_READID:
438 case NAND_CMD_PARAM: {
439 int timing = IFC_FIR_OP_RB;
440 if (command == NAND_CMD_PARAM)
441 timing = IFC_FIR_OP_RBCD;
442
443 ifc_out32(&ifc->ifc_nand.nand_fir0,
444 (IFC_FIR_OP_CW0 << IFC_NAND_FIR0_OP0_SHIFT) |
445 (IFC_FIR_OP_UA << IFC_NAND_FIR0_OP1_SHIFT) |
446 (timing << IFC_NAND_FIR0_OP2_SHIFT));
447 ifc_out32(&ifc->ifc_nand.nand_fcr0,
448 command << IFC_NAND_FCR0_CMD0_SHIFT);
449 ifc_out32(&ifc->ifc_nand.row3, column);
450
451
452
453
454
455 ifc_out32(&ifc->ifc_nand.nand_fbcr, 256);
456 ctrl->read_bytes = 256;
457
458 set_addr(mtd, 0, 0, 0);
459 fsl_ifc_run_command(mtd);
460 return;
461 }
462
463
464 case NAND_CMD_ERASE1:
465 set_addr(mtd, 0, page_addr, 0);
466 return;
467
468
469 case NAND_CMD_ERASE2:
470 ifc_out32(&ifc->ifc_nand.nand_fir0,
471 (IFC_FIR_OP_CW0 << IFC_NAND_FIR0_OP0_SHIFT) |
472 (IFC_FIR_OP_RA0 << IFC_NAND_FIR0_OP1_SHIFT) |
473 (IFC_FIR_OP_CMD1 << IFC_NAND_FIR0_OP2_SHIFT));
474
475 ifc_out32(&ifc->ifc_nand.nand_fcr0,
476 (NAND_CMD_ERASE1 << IFC_NAND_FCR0_CMD0_SHIFT) |
477 (NAND_CMD_ERASE2 << IFC_NAND_FCR0_CMD1_SHIFT));
478
479 ifc_out32(&ifc->ifc_nand.nand_fbcr, 0);
480 ctrl->read_bytes = 0;
481 fsl_ifc_run_command(mtd);
482 return;
483
484
485 case NAND_CMD_SEQIN: {
486 u32 nand_fcr0;
487 ctrl->column = column;
488 ctrl->oob = 0;
489
490 if (mtd->writesize > 512) {
491 nand_fcr0 =
492 (NAND_CMD_SEQIN << IFC_NAND_FCR0_CMD0_SHIFT) |
493 (NAND_CMD_STATUS << IFC_NAND_FCR0_CMD1_SHIFT) |
494 (NAND_CMD_PAGEPROG << IFC_NAND_FCR0_CMD2_SHIFT);
495
496 ifc_out32(&ifc->ifc_nand.nand_fir0,
497 (IFC_FIR_OP_CW0 << IFC_NAND_FIR0_OP0_SHIFT) |
498 (IFC_FIR_OP_CA0 << IFC_NAND_FIR0_OP1_SHIFT) |
499 (IFC_FIR_OP_RA0 << IFC_NAND_FIR0_OP2_SHIFT) |
500 (IFC_FIR_OP_WBCD <<
501 IFC_NAND_FIR0_OP3_SHIFT) |
502 (IFC_FIR_OP_CMD2 << IFC_NAND_FIR0_OP4_SHIFT));
503 ifc_out32(&ifc->ifc_nand.nand_fir1,
504 (IFC_FIR_OP_CW1 << IFC_NAND_FIR1_OP5_SHIFT) |
505 (IFC_FIR_OP_RDSTAT <<
506 IFC_NAND_FIR1_OP6_SHIFT) |
507 (IFC_FIR_OP_NOP << IFC_NAND_FIR1_OP7_SHIFT));
508 } else {
509 nand_fcr0 = ((NAND_CMD_PAGEPROG <<
510 IFC_NAND_FCR0_CMD1_SHIFT) |
511 (NAND_CMD_SEQIN <<
512 IFC_NAND_FCR0_CMD2_SHIFT) |
513 (NAND_CMD_STATUS <<
514 IFC_NAND_FCR0_CMD3_SHIFT));
515
516 ifc_out32(&ifc->ifc_nand.nand_fir0,
517 (IFC_FIR_OP_CW0 << IFC_NAND_FIR0_OP0_SHIFT) |
518 (IFC_FIR_OP_CMD2 << IFC_NAND_FIR0_OP1_SHIFT) |
519 (IFC_FIR_OP_CA0 << IFC_NAND_FIR0_OP2_SHIFT) |
520 (IFC_FIR_OP_RA0 << IFC_NAND_FIR0_OP3_SHIFT) |
521 (IFC_FIR_OP_WBCD << IFC_NAND_FIR0_OP4_SHIFT));
522 ifc_out32(&ifc->ifc_nand.nand_fir1,
523 (IFC_FIR_OP_CMD1 << IFC_NAND_FIR1_OP5_SHIFT) |
524 (IFC_FIR_OP_CW3 << IFC_NAND_FIR1_OP6_SHIFT) |
525 (IFC_FIR_OP_RDSTAT <<
526 IFC_NAND_FIR1_OP7_SHIFT) |
527 (IFC_FIR_OP_NOP << IFC_NAND_FIR1_OP8_SHIFT));
528
529 if (column >= mtd->writesize)
530 nand_fcr0 |=
531 NAND_CMD_READOOB << IFC_NAND_FCR0_CMD0_SHIFT;
532 else
533 nand_fcr0 |=
534 NAND_CMD_READ0 << IFC_NAND_FCR0_CMD0_SHIFT;
535 }
536
537 if (column >= mtd->writesize) {
538
539 column -= mtd->writesize;
540 ctrl->oob = 1;
541 }
542 ifc_out32(&ifc->ifc_nand.nand_fcr0, nand_fcr0);
543 set_addr(mtd, column, page_addr, ctrl->oob);
544 return;
545 }
546
547
548 case NAND_CMD_PAGEPROG:
549 if (ctrl->oob)
550 ifc_out32(&ifc->ifc_nand.nand_fbcr,
551 ctrl->index - ctrl->column);
552 else
553 ifc_out32(&ifc->ifc_nand.nand_fbcr, 0);
554
555 fsl_ifc_run_command(mtd);
556 return;
557
558 case NAND_CMD_STATUS:
559 ifc_out32(&ifc->ifc_nand.nand_fir0,
560 (IFC_FIR_OP_CW0 << IFC_NAND_FIR0_OP0_SHIFT) |
561 (IFC_FIR_OP_RB << IFC_NAND_FIR0_OP1_SHIFT));
562 ifc_out32(&ifc->ifc_nand.nand_fcr0,
563 NAND_CMD_STATUS << IFC_NAND_FCR0_CMD0_SHIFT);
564 ifc_out32(&ifc->ifc_nand.nand_fbcr, 1);
565 set_addr(mtd, 0, 0, 0);
566 ctrl->read_bytes = 1;
567
568 fsl_ifc_run_command(mtd);
569
570
571
572
573
574 if (chip->options & NAND_BUSWIDTH_16)
575 ifc_out16(ctrl->addr,
576 ifc_in16(ctrl->addr) | NAND_STATUS_WP);
577 else
578 out_8(ctrl->addr, in_8(ctrl->addr) | NAND_STATUS_WP);
579 return;
580
581 case NAND_CMD_RESET:
582 ifc_out32(&ifc->ifc_nand.nand_fir0,
583 IFC_FIR_OP_CW0 << IFC_NAND_FIR0_OP0_SHIFT);
584 ifc_out32(&ifc->ifc_nand.nand_fcr0,
585 NAND_CMD_RESET << IFC_NAND_FCR0_CMD0_SHIFT);
586 fsl_ifc_run_command(mtd);
587 return;
588
589 default:
590 printf("%s: error, unsupported command 0x%x.\n",
591 __func__, command);
592 }
593}
594
595
596
597
598static void fsl_ifc_write_buf(struct mtd_info *mtd, const u8 *buf, int len)
599{
600 struct nand_chip *chip = mtd_to_nand(mtd);
601 struct fsl_ifc_mtd *priv = nand_get_controller_data(chip);
602 struct fsl_ifc_ctrl *ctrl = priv->ctrl;
603 unsigned int bufsize = mtd->writesize + mtd->oobsize;
604
605 if (len <= 0) {
606 printf("%s of %d bytes", __func__, len);
607 ctrl->status = 0;
608 return;
609 }
610
611 if ((unsigned int)len > bufsize - ctrl->index) {
612 printf("%s beyond end of buffer "
613 "(%d requested, %u available)\n",
614 __func__, len, bufsize - ctrl->index);
615 len = bufsize - ctrl->index;
616 }
617
618 memcpy_toio(ctrl->addr + ctrl->index, buf, len);
619 ctrl->index += len;
620}
621
622
623
624
625
626static u8 fsl_ifc_read_byte(struct mtd_info *mtd)
627{
628 struct nand_chip *chip = mtd_to_nand(mtd);
629 struct fsl_ifc_mtd *priv = nand_get_controller_data(chip);
630 struct fsl_ifc_ctrl *ctrl = priv->ctrl;
631 unsigned int offset;
632
633
634
635
636
637 if (ctrl->index < ctrl->read_bytes) {
638 offset = ctrl->index++;
639 return in_8(ctrl->addr + offset);
640 }
641
642 printf("%s beyond end of buffer\n", __func__);
643 return ERR_BYTE;
644}
645
646
647
648
649
650static uint8_t fsl_ifc_read_byte16(struct mtd_info *mtd)
651{
652 struct nand_chip *chip = mtd_to_nand(mtd);
653 struct fsl_ifc_mtd *priv = nand_get_controller_data(chip);
654 struct fsl_ifc_ctrl *ctrl = priv->ctrl;
655 uint16_t data;
656
657
658
659
660
661 if (ctrl->index < ctrl->read_bytes) {
662 data = ifc_in16(ctrl->addr + ctrl->index);
663 ctrl->index += 2;
664 return (uint8_t)data;
665 }
666
667 printf("%s beyond end of buffer\n", __func__);
668 return ERR_BYTE;
669}
670
671
672
673
674static void fsl_ifc_read_buf(struct mtd_info *mtd, u8 *buf, int len)
675{
676 struct nand_chip *chip = mtd_to_nand(mtd);
677 struct fsl_ifc_mtd *priv = nand_get_controller_data(chip);
678 struct fsl_ifc_ctrl *ctrl = priv->ctrl;
679 int avail;
680
681 if (len < 0)
682 return;
683
684 avail = min((unsigned int)len, ctrl->read_bytes - ctrl->index);
685 memcpy_fromio(buf, ctrl->addr + ctrl->index, avail);
686 ctrl->index += avail;
687
688 if (len > avail)
689 printf("%s beyond end of buffer "
690 "(%d requested, %d available)\n",
691 __func__, len, avail);
692}
693
694
695
696
697static int fsl_ifc_wait(struct mtd_info *mtd, struct nand_chip *chip)
698{
699 struct fsl_ifc_mtd *priv = nand_get_controller_data(chip);
700 struct fsl_ifc_ctrl *ctrl = priv->ctrl;
701 struct fsl_ifc_runtime *ifc = ctrl->regs.rregs;
702 u32 nand_fsr;
703 int status;
704
705 if (ctrl->status != IFC_NAND_EVTER_STAT_OPC)
706 return NAND_STATUS_FAIL;
707
708
709 ifc_out32(&ifc->ifc_nand.nand_fir0,
710 (IFC_FIR_OP_CW0 << IFC_NAND_FIR0_OP0_SHIFT) |
711 (IFC_FIR_OP_RDSTAT << IFC_NAND_FIR0_OP1_SHIFT));
712 ifc_out32(&ifc->ifc_nand.nand_fcr0, NAND_CMD_STATUS <<
713 IFC_NAND_FCR0_CMD0_SHIFT);
714 ifc_out32(&ifc->ifc_nand.nand_fbcr, 1);
715 set_addr(mtd, 0, 0, 0);
716 ctrl->read_bytes = 1;
717
718 fsl_ifc_run_command(mtd);
719
720 if (ctrl->status != IFC_NAND_EVTER_STAT_OPC)
721 return NAND_STATUS_FAIL;
722
723 nand_fsr = ifc_in32(&ifc->ifc_nand.nand_fsr);
724 status = nand_fsr >> 24;
725
726
727 return status | NAND_STATUS_WP;
728}
729
730static int fsl_ifc_read_page(struct mtd_info *mtd, struct nand_chip *chip,
731 uint8_t *buf, int oob_required, int page)
732{
733 struct fsl_ifc_mtd *priv = nand_get_controller_data(chip);
734 struct fsl_ifc_ctrl *ctrl = priv->ctrl;
735
736 fsl_ifc_read_buf(mtd, buf, mtd->writesize);
737 fsl_ifc_read_buf(mtd, chip->oob_poi, mtd->oobsize);
738
739 if (ctrl->status != IFC_NAND_EVTER_STAT_OPC)
740 mtd->ecc_stats.failed++;
741
742 return 0;
743}
744
745
746
747
748static int fsl_ifc_write_page(struct mtd_info *mtd, struct nand_chip *chip,
749 const uint8_t *buf, int oob_required, int page)
750{
751 fsl_ifc_write_buf(mtd, buf, mtd->writesize);
752 fsl_ifc_write_buf(mtd, chip->oob_poi, mtd->oobsize);
753
754 return 0;
755}
756
757static void fsl_ifc_ctrl_init(void)
758{
759 uint32_t ver = 0;
760 ifc_ctrl = kzalloc(sizeof(*ifc_ctrl), GFP_KERNEL);
761 if (!ifc_ctrl)
762 return;
763
764 ifc_ctrl->regs.gregs = IFC_FCM_BASE_ADDR;
765
766 ver = ifc_in32(&ifc_ctrl->regs.gregs->ifc_rev);
767 if (ver >= FSL_IFC_V2_0_0)
768 ifc_ctrl->regs.rregs =
769 (void *)CONFIG_SYS_IFC_ADDR + IFC_RREGS_64KOFFSET;
770 else
771 ifc_ctrl->regs.rregs =
772 (void *)CONFIG_SYS_IFC_ADDR + IFC_RREGS_4KOFFSET;
773
774
775 ifc_out32(&ifc_ctrl->regs.rregs->ifc_nand.nand_evter_stat, ~0U);
776 ifc_out32(&ifc_ctrl->regs.rregs->ifc_nand.pgrdcmpl_evt_stat, ~0U);
777
778
779 ifc_out32(&ifc_ctrl->regs.rregs->ifc_nand.nand_evter_en,
780 IFC_NAND_EVTER_EN_OPC_EN |
781 IFC_NAND_EVTER_EN_PGRDCMPL_EN |
782 IFC_NAND_EVTER_EN_FTOER_EN |
783 IFC_NAND_EVTER_EN_WPER_EN);
784
785 ifc_out32(&ifc_ctrl->regs.rregs->ifc_nand.ncfgr, 0x0);
786}
787
788static void fsl_ifc_select_chip(struct mtd_info *mtd, int chip)
789{
790}
791
792static int fsl_ifc_sram_init(struct fsl_ifc_mtd *priv, uint32_t ver)
793{
794 struct fsl_ifc_runtime *ifc = ifc_ctrl->regs.rregs;
795 uint32_t cs = 0, csor = 0, csor_8k = 0, csor_ext = 0;
796 uint32_t ncfgr = 0;
797 u32 timeo = (CONFIG_SYS_HZ * 10) / 1000;
798 u32 time_start;
799
800 if (ver > FSL_IFC_V1_1_0) {
801 ncfgr = ifc_in32(&ifc->ifc_nand.ncfgr);
802 ifc_out32(&ifc->ifc_nand.ncfgr, ncfgr | IFC_NAND_SRAM_INIT_EN);
803
804
805 time_start = get_timer(0);
806 while (get_timer(time_start) < timeo) {
807 ifc_ctrl->status =
808 ifc_in32(&ifc->ifc_nand.nand_evter_stat);
809
810 if (!(ifc_ctrl->status & IFC_NAND_SRAM_INIT_EN))
811 return 0;
812 }
813 printf("fsl-ifc: Failed to Initialise SRAM\n");
814 return 1;
815 }
816
817 cs = priv->bank;
818
819
820 csor = ifc_in32(&ifc_ctrl->regs.gregs->csor_cs[cs].csor);
821 csor_ext = ifc_in32(&ifc_ctrl->regs.gregs->csor_cs[cs].csor_ext);
822
823
824 csor_8k = (csor & ~(CSOR_NAND_PGS_MASK)) | 0x0018C000;
825 ifc_out32(&ifc_ctrl->regs.gregs->csor_cs[cs].csor, csor_8k);
826 ifc_out32(&ifc_ctrl->regs.gregs->csor_cs[cs].csor_ext, 0x0000400);
827
828
829 ifc_out32(&ifc->ifc_nand.nand_fir0,
830 (IFC_FIR_OP_CW0 << IFC_NAND_FIR0_OP0_SHIFT) |
831 (IFC_FIR_OP_UA << IFC_NAND_FIR0_OP1_SHIFT) |
832 (IFC_FIR_OP_RB << IFC_NAND_FIR0_OP2_SHIFT));
833 ifc_out32(&ifc->ifc_nand.nand_fcr0,
834 NAND_CMD_READID << IFC_NAND_FCR0_CMD0_SHIFT);
835 ifc_out32(&ifc->ifc_nand.row3, 0x0);
836
837 ifc_out32(&ifc->ifc_nand.nand_fbcr, 0x0);
838
839
840 ifc_out32(&ifc->ifc_nand.row0, 0x0);
841 ifc_out32(&ifc->ifc_nand.col0, 0x0);
842
843
844 ifc_out32(&ifc->ifc_nand.nand_csel, priv->bank << IFC_NAND_CSEL_SHIFT);
845
846
847 ifc_out32(&ifc->ifc_nand.nandseq_strt, IFC_NAND_SEQ_STRT_FIR_STRT);
848
849 time_start = get_timer(0);
850
851 while (get_timer(time_start) < timeo) {
852 ifc_ctrl->status = ifc_in32(&ifc->ifc_nand.nand_evter_stat);
853
854 if (ifc_ctrl->status & IFC_NAND_EVTER_STAT_OPC)
855 break;
856 }
857
858 if (ifc_ctrl->status != IFC_NAND_EVTER_STAT_OPC) {
859 printf("fsl-ifc: Failed to Initialise SRAM\n");
860 return 1;
861 }
862
863 ifc_out32(&ifc->ifc_nand.nand_evter_stat, ifc_ctrl->status);
864
865
866 ifc_out32(&ifc_ctrl->regs.gregs->csor_cs[cs].csor, csor);
867 ifc_out32(&ifc_ctrl->regs.gregs->csor_cs[cs].csor_ext, csor_ext);
868
869 return 0;
870}
871
872static int fsl_ifc_chip_init(int devnum, u8 *addr)
873{
874 struct mtd_info *mtd;
875 struct nand_chip *nand;
876 struct fsl_ifc_mtd *priv;
877 struct nand_ecclayout *layout;
878 struct fsl_ifc_fcm *gregs = NULL;
879 uint32_t cspr = 0, csor = 0, ver = 0;
880 int ret = 0;
881
882 if (!ifc_ctrl) {
883 fsl_ifc_ctrl_init();
884 if (!ifc_ctrl)
885 return -1;
886 }
887
888 priv = kzalloc(sizeof(*priv), GFP_KERNEL);
889 if (!priv)
890 return -ENOMEM;
891
892 priv->ctrl = ifc_ctrl;
893 priv->vbase = addr;
894 gregs = ifc_ctrl->regs.gregs;
895
896
897
898 for (priv->bank = 0; priv->bank < MAX_BANKS; priv->bank++) {
899 phys_addr_t phys_addr = virt_to_phys(addr);
900
901 cspr = ifc_in32(&gregs->cspr_cs[priv->bank].cspr);
902 csor = ifc_in32(&gregs->csor_cs[priv->bank].csor);
903
904 if ((cspr & CSPR_V) && (cspr & CSPR_MSEL) == CSPR_MSEL_NAND &&
905 (cspr & CSPR_BA) == CSPR_PHYS_ADDR(phys_addr))
906 break;
907 }
908
909 if (priv->bank >= MAX_BANKS) {
910 printf("%s: address did not match any "
911 "chip selects\n", __func__);
912 kfree(priv);
913 return -ENODEV;
914 }
915
916 nand = &priv->chip;
917 mtd = nand_to_mtd(nand);
918
919 ifc_ctrl->chips[priv->bank] = priv;
920
921
922
923
924 nand->write_buf = fsl_ifc_write_buf;
925 nand->read_buf = fsl_ifc_read_buf;
926 nand->select_chip = fsl_ifc_select_chip;
927 nand->cmdfunc = fsl_ifc_cmdfunc;
928 nand->waitfunc = fsl_ifc_wait;
929
930
931 nand->bbt_td = &bbt_main_descr;
932 nand->bbt_md = &bbt_mirror_descr;
933
934
935 nand->options = NAND_NO_SUBPAGE_WRITE;
936 nand->bbt_options = NAND_BBT_USE_FLASH;
937
938 if (cspr & CSPR_PORT_SIZE_16) {
939 nand->read_byte = fsl_ifc_read_byte16;
940 nand->options |= NAND_BUSWIDTH_16;
941 } else {
942 nand->read_byte = fsl_ifc_read_byte;
943 }
944
945 nand->controller = &ifc_ctrl->controller;
946 nand_set_controller_data(nand, priv);
947
948 nand->ecc.read_page = fsl_ifc_read_page;
949 nand->ecc.write_page = fsl_ifc_write_page;
950
951
952 nand->ecc.size = 512;
953 nand->ecc.bytes = 8;
954
955 switch (csor & CSOR_NAND_PGS_MASK) {
956 case CSOR_NAND_PGS_512:
957 if (nand->options & NAND_BUSWIDTH_16) {
958 layout = &oob_512_16bit_ecc4;
959 } else {
960 layout = &oob_512_8bit_ecc4;
961
962
963 bbt_main_descr.offs = 0;
964 bbt_mirror_descr.offs = 0;
965 }
966
967 nand->ecc.strength = 4;
968 priv->bufnum_mask = 15;
969 break;
970
971 case CSOR_NAND_PGS_2K:
972 layout = &oob_2048_ecc4;
973 nand->ecc.strength = 4;
974 priv->bufnum_mask = 3;
975 break;
976
977 case CSOR_NAND_PGS_4K:
978 if ((csor & CSOR_NAND_ECC_MODE_MASK) ==
979 CSOR_NAND_ECC_MODE_4) {
980 layout = &oob_4096_ecc4;
981 nand->ecc.strength = 4;
982 } else {
983 layout = &oob_4096_ecc8;
984 nand->ecc.strength = 8;
985 nand->ecc.bytes = 16;
986 }
987
988 priv->bufnum_mask = 1;
989 break;
990
991 case CSOR_NAND_PGS_8K:
992 if ((csor & CSOR_NAND_ECC_MODE_MASK) ==
993 CSOR_NAND_ECC_MODE_4) {
994 layout = &oob_8192_ecc4;
995 nand->ecc.strength = 4;
996 } else {
997 layout = &oob_8192_ecc8;
998 nand->ecc.strength = 8;
999 nand->ecc.bytes = 16;
1000 }
1001
1002 priv->bufnum_mask = 0;
1003 break;
1004
1005
1006 default:
1007 printf("ifc nand: bad csor %#x: bad page size\n", csor);
1008 return -ENODEV;
1009 }
1010
1011
1012 if (csor & CSOR_NAND_ECC_DEC_EN) {
1013 nand->ecc.mode = NAND_ECC_HW;
1014 nand->ecc.layout = layout;
1015 } else {
1016 nand->ecc.mode = NAND_ECC_SOFT;
1017 }
1018
1019 ver = ifc_in32(&gregs->ifc_rev);
1020 if (ver >= FSL_IFC_V1_1_0)
1021 ret = fsl_ifc_sram_init(priv, ver);
1022 if (ret)
1023 return ret;
1024
1025 if (ver >= FSL_IFC_V2_0_0)
1026 priv->bufnum_mask = (priv->bufnum_mask * 2) + 1;
1027
1028 ret = nand_scan_ident(mtd, 1, NULL);
1029 if (ret)
1030 return ret;
1031
1032 ret = nand_scan_tail(mtd);
1033 if (ret)
1034 return ret;
1035
1036 ret = nand_register(devnum, mtd);
1037 if (ret)
1038 return ret;
1039 return 0;
1040}
1041
1042#ifndef CONFIG_SYS_NAND_BASE_LIST
1043#define CONFIG_SYS_NAND_BASE_LIST { CONFIG_SYS_NAND_BASE }
1044#endif
1045
1046static unsigned long base_address[CONFIG_SYS_MAX_NAND_DEVICE] =
1047 CONFIG_SYS_NAND_BASE_LIST;
1048
1049void board_nand_init(void)
1050{
1051 int i;
1052
1053 for (i = 0; i < CONFIG_SYS_MAX_NAND_DEVICE; i++)
1054 fsl_ifc_chip_init(i, (u8 *)base_address[i]);
1055}
1056