blob: e932a58bf6034238cd9cf7ec97bf28c35e94580a [file] [log] [blame]
Tom Rini10e47792018-05-06 17:58:06 -04001// SPDX-License-Identifier: GPL-2.0+
Siva Durga Prasad Paladuguc41d5cd2016-09-27 10:55:46 +05302/*
3 * (C) Copyright 2016 Xilinx, Inc.
4 *
5 * Xilinx Zynq NAND Flash Controller Driver
6 * This driver is based on plat_nand.c and mxc_nand.c drivers
Siva Durga Prasad Paladuguc41d5cd2016-09-27 10:55:46 +05307 */
8
9#include <common.h>
10#include <malloc.h>
11#include <asm/io.h>
12#include <linux/errno.h>
13#include <nand.h>
14#include <linux/mtd/mtd.h>
Masahiro Yamada2b7a8732017-11-30 13:45:24 +090015#include <linux/mtd/rawnand.h>
Siva Durga Prasad Paladuguc41d5cd2016-09-27 10:55:46 +053016#include <linux/mtd/partitions.h>
17#include <linux/mtd/nand_ecc.h>
18#include <asm/arch/hardware.h>
Siva Durga Prasad Paladugu8597e8a2017-05-25 14:25:55 +053019#include <asm/arch/sys_proto.h>
Siva Durga Prasad Paladuguc41d5cd2016-09-27 10:55:46 +053020
21/* The NAND flash driver defines */
22#define ZYNQ_NAND_CMD_PHASE 1
23#define ZYNQ_NAND_DATA_PHASE 2
24#define ZYNQ_NAND_ECC_SIZE 512
25#define ZYNQ_NAND_SET_OPMODE_8BIT (0 << 0)
26#define ZYNQ_NAND_SET_OPMODE_16BIT (1 << 0)
27#define ZYNQ_NAND_ECC_STATUS (1 << 6)
28#define ZYNQ_MEMC_CLRCR_INT_CLR1 (1 << 4)
29#define ZYNQ_MEMC_SR_RAW_INT_ST1 (1 << 6)
30#define ZYNQ_MEMC_SR_INT_ST1 (1 << 4)
31#define ZYNQ_MEMC_NAND_ECC_MODE_MASK 0xC
32
33/* Flash memory controller operating parameters */
34#define ZYNQ_NAND_CLR_CONFIG ((0x1 << 1) | /* Disable interrupt */ \
35 (0x1 << 4) | /* Clear interrupt */ \
36 (0x1 << 6)) /* Disable ECC interrupt */
37
Jeff Westfahl313b9c32017-11-06 00:34:46 -080038#ifndef CONFIG_NAND_ZYNQ_USE_BOOTLOADER1_TIMINGS
39
Siva Durga Prasad Paladuguc41d5cd2016-09-27 10:55:46 +053040/* Assuming 50MHz clock (20ns cycle time) and 3V operation */
41#define ZYNQ_NAND_SET_CYCLES ((0x2 << 20) | /* t_rr from nand_cycles */ \
42 (0x2 << 17) | /* t_ar from nand_cycles */ \
43 (0x1 << 14) | /* t_clr from nand_cycles */ \
44 (0x3 << 11) | /* t_wp from nand_cycles */ \
45 (0x2 << 8) | /* t_rea from nand_cycles */ \
46 (0x5 << 4) | /* t_wc from nand_cycles */ \
47 (0x5 << 0)) /* t_rc from nand_cycles */
Jeff Westfahl313b9c32017-11-06 00:34:46 -080048#endif
Siva Durga Prasad Paladuguc41d5cd2016-09-27 10:55:46 +053049
50
51#define ZYNQ_NAND_DIRECT_CMD ((0x4 << 23) | /* Chip 0 from interface 1 */ \
52 (0x2 << 21)) /* UpdateRegs operation */
53
54#define ZYNQ_NAND_ECC_CONFIG ((0x1 << 2) | /* ECC available on APB */ \
55 (0x1 << 4) | /* ECC read at end of page */ \
56 (0x0 << 5)) /* No Jumping */
57
58#define ZYNQ_NAND_ECC_CMD1 ((0x80) | /* Write command */ \
59 (0x00 << 8) | /* Read command */ \
60 (0x30 << 16) | /* Read End command */ \
61 (0x1 << 24)) /* Read End command calid */
62
63#define ZYNQ_NAND_ECC_CMD2 ((0x85) | /* Write col change cmd */ \
64 (0x05 << 8) | /* Read col change cmd */ \
65 (0xE0 << 16) | /* Read col change end cmd */ \
66 (0x1 << 24)) /* Read col change
67 end cmd valid */
68/* AXI Address definitions */
69#define START_CMD_SHIFT 3
70#define END_CMD_SHIFT 11
71#define END_CMD_VALID_SHIFT 20
72#define ADDR_CYCLES_SHIFT 21
73#define CLEAR_CS_SHIFT 21
74#define ECC_LAST_SHIFT 10
75#define COMMAND_PHASE (0 << 19)
76#define DATA_PHASE (1 << 19)
77#define ONDIE_ECC_FEATURE_ADDR 0x90
78#define ONDIE_ECC_FEATURE_ENABLE 0x08
79
80#define ZYNQ_NAND_ECC_LAST (1 << ECC_LAST_SHIFT) /* Set ECC_Last */
81#define ZYNQ_NAND_CLEAR_CS (1 << CLEAR_CS_SHIFT) /* Clear chip select */
82
83/* ECC block registers bit position and bit mask */
84#define ZYNQ_NAND_ECC_BUSY (1 << 6) /* ECC block is busy */
85#define ZYNQ_NAND_ECC_MASK 0x00FFFFFF /* ECC value mask */
86
Siva Durga Prasad Paladugu2e601592017-05-25 12:15:24 +053087#define ZYNQ_NAND_ROW_ADDR_CYCL_MASK 0x0F
88#define ZYNQ_NAND_COL_ADDR_CYCL_MASK 0xF0
89
Siva Durga Prasad Paladugu8597e8a2017-05-25 14:25:55 +053090#define ZYNQ_NAND_MIO_NUM_NAND_8BIT 13
91#define ZYNQ_NAND_MIO_NUM_NAND_16BIT 8
92
93enum zynq_nand_bus_width {
94 NAND_BW_UNKNOWN = -1,
95 NAND_BW_8BIT,
96 NAND_BW_16BIT,
97};
98
Joe Hershbergere7fa4372017-11-06 18:16:10 -080099#ifndef NAND_CMD_LOCK_TIGHT
100#define NAND_CMD_LOCK_TIGHT 0x2c
101#endif
102
103#ifndef NAND_CMD_LOCK_STATUS
104#define NAND_CMD_LOCK_STATUS 0x7a
105#endif
Siva Durga Prasad Paladuguc41d5cd2016-09-27 10:55:46 +0530106
107/* SMC register set */
108struct zynq_nand_smc_regs {
109 u32 csr; /* 0x00 */
110 u32 reserved0[2];
111 u32 cfr; /* 0x0C */
112 u32 dcr; /* 0x10 */
113 u32 scr; /* 0x14 */
114 u32 sor; /* 0x18 */
115 u32 reserved1[249];
116 u32 esr; /* 0x400 */
117 u32 emcr; /* 0x404 */
118 u32 emcmd1r; /* 0x408 */
119 u32 emcmd2r; /* 0x40C */
120 u32 reserved2[2];
121 u32 eval0r; /* 0x418 */
122};
123#define zynq_nand_smc_base ((struct zynq_nand_smc_regs __iomem *)\
124 ZYNQ_SMC_BASEADDR)
125
126/*
127 * struct zynq_nand_info - Defines the NAND flash driver instance
128 * @parts: Pointer to the mtd_partition structure
129 * @nand_base: Virtual address of the NAND flash device
130 * @end_cmd_pending: End command is pending
131 * @end_cmd: End command
132 */
133struct zynq_nand_info {
134 void __iomem *nand_base;
135 u8 end_cmd_pending;
136 u8 end_cmd;
137};
138
139/*
140 * struct zynq_nand_command_format - Defines NAND flash command format
141 * @start_cmd: First cycle command (Start command)
142 * @end_cmd: Second cycle command (Last command)
143 * @addr_cycles: Number of address cycles required to send the address
144 * @end_cmd_valid: The second cycle command is valid for cmd or data phase
145 */
146struct zynq_nand_command_format {
147 u8 start_cmd;
148 u8 end_cmd;
149 u8 addr_cycles;
150 u8 end_cmd_valid;
151};
152
153/* The NAND flash operations command format */
154static const struct zynq_nand_command_format zynq_nand_commands[] = {
155 {NAND_CMD_READ0, NAND_CMD_READSTART, 5, ZYNQ_NAND_CMD_PHASE},
156 {NAND_CMD_RNDOUT, NAND_CMD_RNDOUTSTART, 2, ZYNQ_NAND_CMD_PHASE},
157 {NAND_CMD_READID, NAND_CMD_NONE, 1, 0},
158 {NAND_CMD_STATUS, NAND_CMD_NONE, 0, 0},
159 {NAND_CMD_SEQIN, NAND_CMD_PAGEPROG, 5, ZYNQ_NAND_DATA_PHASE},
160 {NAND_CMD_RNDIN, NAND_CMD_NONE, 2, 0},
161 {NAND_CMD_ERASE1, NAND_CMD_ERASE2, 3, ZYNQ_NAND_CMD_PHASE},
162 {NAND_CMD_RESET, NAND_CMD_NONE, 0, 0},
163 {NAND_CMD_PARAM, NAND_CMD_NONE, 1, 0},
164 {NAND_CMD_GET_FEATURES, NAND_CMD_NONE, 1, 0},
165 {NAND_CMD_SET_FEATURES, NAND_CMD_NONE, 1, 0},
Joe Hershbergere7fa4372017-11-06 18:16:10 -0800166 {NAND_CMD_LOCK, NAND_CMD_NONE, 0, 0},
167 {NAND_CMD_LOCK_TIGHT, NAND_CMD_NONE, 0, 0},
168 {NAND_CMD_UNLOCK1, NAND_CMD_NONE, 3, 0},
169 {NAND_CMD_UNLOCK2, NAND_CMD_NONE, 3, 0},
170 {NAND_CMD_LOCK_STATUS, NAND_CMD_NONE, 3, 0},
Siva Durga Prasad Paladuguc41d5cd2016-09-27 10:55:46 +0530171 {NAND_CMD_NONE, NAND_CMD_NONE, 0, 0},
172 /* Add all the flash commands supported by the flash device */
173};
174
175/* Define default oob placement schemes for large and small page devices */
176static struct nand_ecclayout nand_oob_16 = {
177 .eccbytes = 3,
178 .eccpos = {0, 1, 2},
179 .oobfree = {
180 { .offset = 8, .length = 8 }
181 }
182};
183
184static struct nand_ecclayout nand_oob_64 = {
185 .eccbytes = 12,
186 .eccpos = {
187 52, 53, 54, 55, 56, 57,
188 58, 59, 60, 61, 62, 63},
189 .oobfree = {
190 { .offset = 2, .length = 50 }
191 }
192};
193
194static struct nand_ecclayout ondie_nand_oob_64 = {
195 .eccbytes = 32,
196
197 .eccpos = {
198 8, 9, 10, 11, 12, 13, 14, 15,
199 24, 25, 26, 27, 28, 29, 30, 31,
200 40, 41, 42, 43, 44, 45, 46, 47,
201 56, 57, 58, 59, 60, 61, 62, 63
202 },
203
204 .oobfree = {
205 { .offset = 4, .length = 4 },
206 { .offset = 20, .length = 4 },
207 { .offset = 36, .length = 4 },
208 { .offset = 52, .length = 4 }
209 }
210};
211
212/* bbt decriptors for chips with on-die ECC and
213 chips with 64-byte OOB */
214static u8 bbt_pattern[] = {'B', 'b', 't', '0' };
215static u8 mirror_pattern[] = {'1', 't', 'b', 'B' };
216
217static struct nand_bbt_descr bbt_main_descr = {
218 .options = NAND_BBT_LASTBLOCK | NAND_BBT_CREATE | NAND_BBT_WRITE |
219 NAND_BBT_2BIT | NAND_BBT_VERSION | NAND_BBT_PERCHIP,
220 .offs = 4,
221 .len = 4,
222 .veroffs = 20,
223 .maxblocks = 4,
224 .pattern = bbt_pattern
225};
226
227static struct nand_bbt_descr bbt_mirror_descr = {
228 .options = NAND_BBT_LASTBLOCK | NAND_BBT_CREATE | NAND_BBT_WRITE |
229 NAND_BBT_2BIT | NAND_BBT_VERSION | NAND_BBT_PERCHIP,
230 .offs = 4,
231 .len = 4,
232 .veroffs = 20,
233 .maxblocks = 4,
234 .pattern = mirror_pattern
235};
236
237/*
238 * zynq_nand_waitfor_ecc_completion - Wait for ECC completion
239 *
240 * returns: status for command completion, -1 for Timeout
241 */
242static int zynq_nand_waitfor_ecc_completion(void)
243{
244 unsigned long timeout;
245 u32 status;
246
247 /* Wait max 10us */
248 timeout = 10;
249 status = readl(&zynq_nand_smc_base->esr);
250 while (status & ZYNQ_NAND_ECC_BUSY) {
251 status = readl(&zynq_nand_smc_base->esr);
252 if (timeout == 0)
253 return -1;
254 timeout--;
255 udelay(1);
256 }
257
258 return status;
259}
260
261/*
262 * zynq_nand_init_nand_flash - Initialize NAND controller
263 * @option: Device property flags
264 *
265 * This function initializes the NAND flash interface on the NAND controller.
266 *
267 * returns: 0 on success or error value on failure
268 */
269static int zynq_nand_init_nand_flash(int option)
270{
271 u32 status;
272
273 /* disable interrupts */
274 writel(ZYNQ_NAND_CLR_CONFIG, &zynq_nand_smc_base->cfr);
Jeff Westfahl313b9c32017-11-06 00:34:46 -0800275#ifndef CONFIG_NAND_ZYNQ_USE_BOOTLOADER1_TIMINGS
Siva Durga Prasad Paladuguc41d5cd2016-09-27 10:55:46 +0530276 /* Initialize the NAND interface by setting cycles and operation mode */
277 writel(ZYNQ_NAND_SET_CYCLES, &zynq_nand_smc_base->scr);
Jeff Westfahl313b9c32017-11-06 00:34:46 -0800278#endif
Siva Durga Prasad Paladuguc41d5cd2016-09-27 10:55:46 +0530279 if (option & NAND_BUSWIDTH_16)
280 writel(ZYNQ_NAND_SET_OPMODE_16BIT, &zynq_nand_smc_base->sor);
281 else
282 writel(ZYNQ_NAND_SET_OPMODE_8BIT, &zynq_nand_smc_base->sor);
283
284 writel(ZYNQ_NAND_DIRECT_CMD, &zynq_nand_smc_base->dcr);
285
286 /* Wait till the ECC operation is complete */
287 status = zynq_nand_waitfor_ecc_completion();
288 if (status < 0) {
289 printf("%s: Timeout\n", __func__);
290 return status;
291 }
292
293 /* Set the command1 and command2 register */
294 writel(ZYNQ_NAND_ECC_CMD1, &zynq_nand_smc_base->emcmd1r);
295 writel(ZYNQ_NAND_ECC_CMD2, &zynq_nand_smc_base->emcmd2r);
296
297 return 0;
298}
299
300/*
301 * zynq_nand_calculate_hwecc - Calculate Hardware ECC
302 * @mtd: Pointer to the mtd_info structure
303 * @data: Pointer to the page data
304 * @ecc_code: Pointer to the ECC buffer where ECC data needs to be stored
305 *
306 * This function retrieves the Hardware ECC data from the controller and returns
307 * ECC data back to the MTD subsystem.
308 *
309 * returns: 0 on success or error value on failure
310 */
311static int zynq_nand_calculate_hwecc(struct mtd_info *mtd, const u8 *data,
312 u8 *ecc_code)
313{
314 u32 ecc_value = 0;
315 u8 ecc_reg, ecc_byte;
316 u32 ecc_status;
317
318 /* Wait till the ECC operation is complete */
319 ecc_status = zynq_nand_waitfor_ecc_completion();
320 if (ecc_status < 0) {
321 printf("%s: Timeout\n", __func__);
322 return ecc_status;
323 }
324
325 for (ecc_reg = 0; ecc_reg < 4; ecc_reg++) {
326 /* Read ECC value for each block */
327 ecc_value = readl(&zynq_nand_smc_base->eval0r + ecc_reg);
328
329 /* Get the ecc status from ecc read value */
330 ecc_status = (ecc_value >> 24) & 0xFF;
331
332 /* ECC value valid */
333 if (ecc_status & ZYNQ_NAND_ECC_STATUS) {
334 for (ecc_byte = 0; ecc_byte < 3; ecc_byte++) {
335 /* Copy ECC bytes to MTD buffer */
336 *ecc_code = ecc_value & 0xFF;
337 ecc_value = ecc_value >> 8;
338 ecc_code++;
339 }
340 } else {
341 debug("%s: ecc status failed\n", __func__);
342 }
343 }
344
345 return 0;
346}
347
348/*
349 * onehot - onehot function
350 * @value: value to check for onehot
351 *
352 * This function checks whether a value is onehot or not.
353 * onehot is if and only if one bit is set.
354 *
355 * FIXME: Try to move this in common.h
356 */
357static bool onehot(unsigned short value)
358{
359 bool onehot;
360
361 onehot = value && !(value & (value - 1));
362 return onehot;
363}
364
365/*
366 * zynq_nand_correct_data - ECC correction function
367 * @mtd: Pointer to the mtd_info structure
368 * @buf: Pointer to the page data
369 * @read_ecc: Pointer to the ECC value read from spare data area
370 * @calc_ecc: Pointer to the calculated ECC value
371 *
372 * This function corrects the ECC single bit errors & detects 2-bit errors.
373 *
374 * returns: 0 if no ECC errors found
375 * 1 if single bit error found and corrected.
376 * -1 if multiple ECC errors found.
377 */
378static int zynq_nand_correct_data(struct mtd_info *mtd, unsigned char *buf,
379 unsigned char *read_ecc, unsigned char *calc_ecc)
380{
381 unsigned char bit_addr;
382 unsigned int byte_addr;
383 unsigned short ecc_odd, ecc_even;
384 unsigned short read_ecc_lower, read_ecc_upper;
385 unsigned short calc_ecc_lower, calc_ecc_upper;
386
387 read_ecc_lower = (read_ecc[0] | (read_ecc[1] << 8)) & 0xfff;
388 read_ecc_upper = ((read_ecc[1] >> 4) | (read_ecc[2] << 4)) & 0xfff;
389
390 calc_ecc_lower = (calc_ecc[0] | (calc_ecc[1] << 8)) & 0xfff;
391 calc_ecc_upper = ((calc_ecc[1] >> 4) | (calc_ecc[2] << 4)) & 0xfff;
392
393 ecc_odd = read_ecc_lower ^ calc_ecc_lower;
394 ecc_even = read_ecc_upper ^ calc_ecc_upper;
395
396 if ((ecc_odd == 0) && (ecc_even == 0))
397 return 0; /* no error */
398
399 if (ecc_odd == (~ecc_even & 0xfff)) {
400 /* bits [11:3] of error code is byte offset */
401 byte_addr = (ecc_odd >> 3) & 0x1ff;
402 /* bits [2:0] of error code is bit offset */
403 bit_addr = ecc_odd & 0x7;
404 /* Toggling error bit */
405 buf[byte_addr] ^= (1 << bit_addr);
406 return 1;
407 }
408
409 if (onehot(ecc_odd | ecc_even))
410 return 1; /* one error in parity */
411
412 return -1; /* Uncorrectable error */
413}
414
415/*
416 * zynq_nand_read_oob - [REPLACABLE] the most common OOB data read function
417 * @mtd: mtd info structure
418 * @chip: nand chip info structure
419 * @page: page number to read
420 * @sndcmd: flag whether to issue read command or not
421 */
422static int zynq_nand_read_oob(struct mtd_info *mtd, struct nand_chip *chip,
423 int page)
424{
425 unsigned long data_phase_addr = 0;
426 int data_width = 4;
427 u8 *p;
428
429 chip->cmdfunc(mtd, NAND_CMD_READOOB, 0, page);
430
431 p = chip->oob_poi;
432 chip->read_buf(mtd, p, (mtd->oobsize - data_width));
433 p += mtd->oobsize - data_width;
434
435 data_phase_addr = (unsigned long)chip->IO_ADDR_R;
436 data_phase_addr |= ZYNQ_NAND_CLEAR_CS;
437 chip->IO_ADDR_R = (void __iomem *)data_phase_addr;
438 chip->read_buf(mtd, p, data_width);
439
440 return 0;
441}
442
443/*
444 * zynq_nand_write_oob - [REPLACABLE] the most common OOB data write function
445 * @mtd: mtd info structure
446 * @chip: nand chip info structure
447 * @page: page number to write
448 */
449static int zynq_nand_write_oob(struct mtd_info *mtd, struct nand_chip *chip,
450 int page)
451{
452 int status = 0, data_width = 4;
453 const u8 *buf = chip->oob_poi;
454 unsigned long data_phase_addr = 0;
455
456 chip->cmdfunc(mtd, NAND_CMD_SEQIN, mtd->writesize, page);
457
458 chip->write_buf(mtd, buf, (mtd->oobsize - data_width));
459 buf += mtd->oobsize - data_width;
460
461 data_phase_addr = (unsigned long)chip->IO_ADDR_W;
462 data_phase_addr |= ZYNQ_NAND_CLEAR_CS;
463 data_phase_addr |= (1 << END_CMD_VALID_SHIFT);
464 chip->IO_ADDR_W = (void __iomem *)data_phase_addr;
465 chip->write_buf(mtd, buf, data_width);
466
467 /* Send command to program the OOB data */
468 chip->cmdfunc(mtd, NAND_CMD_PAGEPROG, -1, -1);
469 status = chip->waitfunc(mtd, chip);
470
471 return status & NAND_STATUS_FAIL ? -EIO : 0;
472}
473
474/*
475 * zynq_nand_read_page_raw - [Intern] read raw page data without ecc
476 * @mtd: mtd info structure
477 * @chip: nand chip info structure
478 * @buf: buffer to store read data
479 * @oob_required: must write chip->oob_poi to OOB
480 * @page: page number to read
481 */
482static int zynq_nand_read_page_raw(struct mtd_info *mtd, struct nand_chip *chip,
483 u8 *buf, int oob_required, int page)
484{
485 unsigned long data_width = 4;
486 unsigned long data_phase_addr = 0;
487 u8 *p;
488
489 chip->read_buf(mtd, buf, mtd->writesize);
490
491 p = chip->oob_poi;
492 chip->read_buf(mtd, p, (mtd->oobsize - data_width));
493 p += (mtd->oobsize - data_width);
494
495 data_phase_addr = (unsigned long)chip->IO_ADDR_R;
496 data_phase_addr |= ZYNQ_NAND_CLEAR_CS;
497 chip->IO_ADDR_R = (void __iomem *)data_phase_addr;
498
499 chip->read_buf(mtd, p, data_width);
500 return 0;
501}
502
503static int zynq_nand_read_page_raw_nooob(struct mtd_info *mtd,
504 struct nand_chip *chip, u8 *buf, int oob_required, int page)
505{
506 chip->read_buf(mtd, buf, mtd->writesize);
507 return 0;
508}
509
510static int zynq_nand_read_subpage_raw(struct mtd_info *mtd,
511 struct nand_chip *chip, u32 data_offs,
512 u32 readlen, u8 *buf, int page)
513{
514 if (data_offs != 0) {
515 chip->cmdfunc(mtd, NAND_CMD_RNDOUT, data_offs, -1);
516 buf += data_offs;
517 }
518 chip->read_buf(mtd, buf, readlen);
519
520 return 0;
521}
522
523/*
524 * zynq_nand_write_page_raw - [Intern] raw page write function
525 * @mtd: mtd info structure
526 * @chip: nand chip info structure
527 * @buf: data buffer
528 * @oob_required: must write chip->oob_poi to OOB
529 */
530static int zynq_nand_write_page_raw(struct mtd_info *mtd,
531 struct nand_chip *chip, const u8 *buf, int oob_required, int page)
532{
533 unsigned long data_width = 4;
534 unsigned long data_phase_addr = 0;
535 u8 *p;
536
537 chip->write_buf(mtd, buf, mtd->writesize);
538
539 p = chip->oob_poi;
540 chip->write_buf(mtd, p, (mtd->oobsize - data_width));
541 p += (mtd->oobsize - data_width);
542
543 data_phase_addr = (unsigned long)chip->IO_ADDR_W;
544 data_phase_addr |= ZYNQ_NAND_CLEAR_CS;
545 data_phase_addr |= (1 << END_CMD_VALID_SHIFT);
546 chip->IO_ADDR_W = (void __iomem *)data_phase_addr;
547
548 chip->write_buf(mtd, p, data_width);
549
550 return 0;
551}
552
553/*
554 * nand_write_page_hwecc - Hardware ECC based page write function
555 * @mtd: Pointer to the mtd info structure
556 * @chip: Pointer to the NAND chip info structure
557 * @buf: Pointer to the data buffer
558 * @oob_required: must write chip->oob_poi to OOB
559 *
560 * This functions writes data and hardware generated ECC values in to the page.
561 */
562static int zynq_nand_write_page_hwecc(struct mtd_info *mtd,
563 struct nand_chip *chip, const u8 *buf, int oob_required, int page)
564{
565 int i, eccsteps, eccsize = chip->ecc.size;
566 u8 *ecc_calc = chip->buffers->ecccalc;
567 const u8 *p = buf;
568 u32 *eccpos = chip->ecc.layout->eccpos;
569 unsigned long data_phase_addr = 0;
570 unsigned long data_width = 4;
571 u8 *oob_ptr;
572
573 for (eccsteps = chip->ecc.steps; (eccsteps - 1); eccsteps--) {
574 chip->write_buf(mtd, p, eccsize);
575 p += eccsize;
576 }
577 chip->write_buf(mtd, p, (eccsize - data_width));
578 p += eccsize - data_width;
579
580 /* Set ECC Last bit to 1 */
581 data_phase_addr = (unsigned long) chip->IO_ADDR_W;
582 data_phase_addr |= ZYNQ_NAND_ECC_LAST;
583 chip->IO_ADDR_W = (void __iomem *)data_phase_addr;
584 chip->write_buf(mtd, p, data_width);
585
586 /* Wait for ECC to be calculated and read the error values */
587 p = buf;
588 chip->ecc.calculate(mtd, p, &ecc_calc[0]);
589
590 for (i = 0; i < chip->ecc.total; i++)
591 chip->oob_poi[eccpos[i]] = ~(ecc_calc[i]);
592
593 /* Clear ECC last bit */
594 data_phase_addr = (unsigned long)chip->IO_ADDR_W;
595 data_phase_addr &= ~ZYNQ_NAND_ECC_LAST;
596 chip->IO_ADDR_W = (void __iomem *)data_phase_addr;
597
598 /* Write the spare area with ECC bytes */
599 oob_ptr = chip->oob_poi;
600 chip->write_buf(mtd, oob_ptr, (mtd->oobsize - data_width));
601
602 data_phase_addr = (unsigned long)chip->IO_ADDR_W;
603 data_phase_addr |= ZYNQ_NAND_CLEAR_CS;
604 data_phase_addr |= (1 << END_CMD_VALID_SHIFT);
605 chip->IO_ADDR_W = (void __iomem *)data_phase_addr;
606 oob_ptr += (mtd->oobsize - data_width);
607 chip->write_buf(mtd, oob_ptr, data_width);
608
609 return 0;
610}
611
612/*
613 * zynq_nand_write_page_swecc - [REPLACABLE] software ecc based page
614 * write function
615 * @mtd: mtd info structure
616 * @chip: nand chip info structure
617 * @buf: data buffer
618 * @oob_required: must write chip->oob_poi to OOB
619 */
620static int zynq_nand_write_page_swecc(struct mtd_info *mtd,
621 struct nand_chip *chip, const u8 *buf, int oob_required, int page)
622{
623 int i, eccsize = chip->ecc.size;
624 int eccbytes = chip->ecc.bytes;
625 int eccsteps = chip->ecc.steps;
626 u8 *ecc_calc = chip->buffers->ecccalc;
627 const u8 *p = buf;
628 u32 *eccpos = chip->ecc.layout->eccpos;
629
630 /* Software ecc calculation */
631 for (i = 0; eccsteps; eccsteps--, i += eccbytes, p += eccsize)
632 chip->ecc.calculate(mtd, p, &ecc_calc[i]);
633
634 for (i = 0; i < chip->ecc.total; i++)
635 chip->oob_poi[eccpos[i]] = ecc_calc[i];
636
637 return chip->ecc.write_page_raw(mtd, chip, buf, 1, page);
638}
639
640/*
641 * nand_read_page_hwecc - Hardware ECC based page read function
642 * @mtd: Pointer to the mtd info structure
643 * @chip: Pointer to the NAND chip info structure
644 * @buf: Pointer to the buffer to store read data
645 * @oob_required: must write chip->oob_poi to OOB
646 * @page: page number to read
647 *
648 * This functions reads data and checks the data integrity by comparing hardware
649 * generated ECC values and read ECC values from spare area.
650 *
651 * returns: 0 always and updates ECC operation status in to MTD structure
652 */
653static int zynq_nand_read_page_hwecc(struct mtd_info *mtd,
654 struct nand_chip *chip, u8 *buf, int oob_required, int page)
655{
656 int i, stat, eccsteps, eccsize = chip->ecc.size;
657 int eccbytes = chip->ecc.bytes;
658 u8 *p = buf;
659 u8 *ecc_calc = chip->buffers->ecccalc;
660 u8 *ecc_code = chip->buffers->ecccode;
661 u32 *eccpos = chip->ecc.layout->eccpos;
662 unsigned long data_phase_addr = 0;
663 unsigned long data_width = 4;
664 u8 *oob_ptr;
665
666 for (eccsteps = chip->ecc.steps; (eccsteps - 1); eccsteps--) {
667 chip->read_buf(mtd, p, eccsize);
668 p += eccsize;
669 }
670 chip->read_buf(mtd, p, (eccsize - data_width));
671 p += eccsize - data_width;
672
673 /* Set ECC Last bit to 1 */
674 data_phase_addr = (unsigned long)chip->IO_ADDR_R;
675 data_phase_addr |= ZYNQ_NAND_ECC_LAST;
676 chip->IO_ADDR_R = (void __iomem *)data_phase_addr;
677 chip->read_buf(mtd, p, data_width);
678
679 /* Read the calculated ECC value */
680 p = buf;
681 chip->ecc.calculate(mtd, p, &ecc_calc[0]);
682
683 /* Clear ECC last bit */
684 data_phase_addr = (unsigned long)chip->IO_ADDR_R;
685 data_phase_addr &= ~ZYNQ_NAND_ECC_LAST;
686 chip->IO_ADDR_R = (void __iomem *)data_phase_addr;
687
688 /* Read the stored ECC value */
689 oob_ptr = chip->oob_poi;
690 chip->read_buf(mtd, oob_ptr, (mtd->oobsize - data_width));
691
692 /* de-assert chip select */
693 data_phase_addr = (unsigned long)chip->IO_ADDR_R;
694 data_phase_addr |= ZYNQ_NAND_CLEAR_CS;
695 chip->IO_ADDR_R = (void __iomem *)data_phase_addr;
696
697 oob_ptr += (mtd->oobsize - data_width);
698 chip->read_buf(mtd, oob_ptr, data_width);
699
700 for (i = 0; i < chip->ecc.total; i++)
701 ecc_code[i] = ~(chip->oob_poi[eccpos[i]]);
702
703 eccsteps = chip->ecc.steps;
704 p = buf;
705
706 /* Check ECC error for all blocks and correct if it is correctable */
707 for (i = 0; eccsteps; eccsteps--, i += eccbytes, p += eccsize) {
708 stat = chip->ecc.correct(mtd, p, &ecc_code[i], &ecc_calc[i]);
709 if (stat < 0)
710 mtd->ecc_stats.failed++;
711 else
712 mtd->ecc_stats.corrected += stat;
713 }
714 return 0;
715}
716
717/*
718 * zynq_nand_read_page_swecc - [REPLACABLE] software ecc based page
719 * read function
720 * @mtd: mtd info structure
721 * @chip: nand chip info structure
722 * @buf: buffer to store read data
723 * @page: page number to read
724 */
725static int zynq_nand_read_page_swecc(struct mtd_info *mtd,
726 struct nand_chip *chip, u8 *buf, int oob_required, int page)
727{
728 int i, eccsize = chip->ecc.size;
729 int eccbytes = chip->ecc.bytes;
730 int eccsteps = chip->ecc.steps;
731 u8 *p = buf;
732 u8 *ecc_calc = chip->buffers->ecccalc;
733 u8 *ecc_code = chip->buffers->ecccode;
734 u32 *eccpos = chip->ecc.layout->eccpos;
735
736 chip->ecc.read_page_raw(mtd, chip, buf, 1, page);
737
738 for (i = 0; eccsteps; eccsteps--, i += eccbytes, p += eccsize)
739 chip->ecc.calculate(mtd, p, &ecc_calc[i]);
740
741 for (i = 0; i < chip->ecc.total; i++)
742 ecc_code[i] = chip->oob_poi[eccpos[i]];
743
744 eccsteps = chip->ecc.steps;
745 p = buf;
746
747 for (i = 0; eccsteps; eccsteps--, i += eccbytes, p += eccsize) {
748 int stat;
749
750 stat = chip->ecc.correct(mtd, p, &ecc_code[i], &ecc_calc[i]);
751 if (stat < 0)
752 mtd->ecc_stats.failed++;
753 else
754 mtd->ecc_stats.corrected += stat;
755 }
756 return 0;
757}
758
759/*
760 * zynq_nand_select_chip - Select the flash device
761 * @mtd: Pointer to the mtd_info structure
762 * @chip: Chip number to be selected
763 *
764 * This function is empty as the NAND controller handles chip select line
765 * internally based on the chip address passed in command and data phase.
766 */
767static void zynq_nand_select_chip(struct mtd_info *mtd, int chip)
768{
769 /* Not support multiple chips yet */
770}
771
772/*
773 * zynq_nand_cmd_function - Send command to NAND device
774 * @mtd: Pointer to the mtd_info structure
775 * @command: The command to be sent to the flash device
776 * @column: The column address for this command, -1 if none
777 * @page_addr: The page address for this command, -1 if none
778 */
779static void zynq_nand_cmd_function(struct mtd_info *mtd, unsigned int command,
780 int column, int page_addr)
781{
782 struct nand_chip *chip = mtd->priv;
783 const struct zynq_nand_command_format *curr_cmd = NULL;
Siva Durga Prasad Paladugu2e601592017-05-25 12:15:24 +0530784 u8 addr_cycles = 0;
Siva Durga Prasad Paladuguc41d5cd2016-09-27 10:55:46 +0530785 struct zynq_nand_info *xnand = (struct zynq_nand_info *)chip->priv;
786 void *cmd_addr;
787 unsigned long cmd_data = 0;
788 unsigned long cmd_phase_addr = 0;
789 unsigned long data_phase_addr = 0;
790 u8 end_cmd = 0;
791 u8 end_cmd_valid = 0;
792 u32 index;
793
794 if (xnand->end_cmd_pending) {
795 /* Check for end command if this command request is same as the
796 * pending command then return
797 */
798 if (xnand->end_cmd == command) {
799 xnand->end_cmd = 0;
800 xnand->end_cmd_pending = 0;
801 return;
802 }
803 }
804
805 /* Emulate NAND_CMD_READOOB for large page device */
806 if ((mtd->writesize > ZYNQ_NAND_ECC_SIZE) &&
807 (command == NAND_CMD_READOOB)) {
808 column += mtd->writesize;
809 command = NAND_CMD_READ0;
810 }
811
812 /* Get the command format */
813 for (index = 0; index < ARRAY_SIZE(zynq_nand_commands); index++)
814 if (command == zynq_nand_commands[index].start_cmd)
815 break;
816
817 if (index == ARRAY_SIZE(zynq_nand_commands)) {
818 printf("%s: Unsupported start cmd %02x\n", __func__, command);
819 return;
820 }
821 curr_cmd = &zynq_nand_commands[index];
822
823 /* Clear interrupt */
824 writel(ZYNQ_MEMC_CLRCR_INT_CLR1, &zynq_nand_smc_base->cfr);
825
826 /* Get the command phase address */
827 if (curr_cmd->end_cmd_valid == ZYNQ_NAND_CMD_PHASE)
828 end_cmd_valid = 1;
829
830 if (curr_cmd->end_cmd == NAND_CMD_NONE)
831 end_cmd = 0x0;
832 else
833 end_cmd = curr_cmd->end_cmd;
834
Siva Durga Prasad Paladugu2e601592017-05-25 12:15:24 +0530835 if (command == NAND_CMD_READ0 ||
836 command == NAND_CMD_SEQIN) {
837 addr_cycles = chip->onfi_params.addr_cycles &
838 ZYNQ_NAND_ROW_ADDR_CYCL_MASK;
839 addr_cycles += ((chip->onfi_params.addr_cycles &
840 ZYNQ_NAND_COL_ADDR_CYCL_MASK) >> 4);
841 } else {
842 addr_cycles = curr_cmd->addr_cycles;
843 }
844
Siva Durga Prasad Paladuguc41d5cd2016-09-27 10:55:46 +0530845 cmd_phase_addr = (unsigned long)xnand->nand_base |
Siva Durga Prasad Paladugu2e601592017-05-25 12:15:24 +0530846 (addr_cycles << ADDR_CYCLES_SHIFT) |
Siva Durga Prasad Paladuguc41d5cd2016-09-27 10:55:46 +0530847 (end_cmd_valid << END_CMD_VALID_SHIFT) |
848 (COMMAND_PHASE) |
849 (end_cmd << END_CMD_SHIFT) |
850 (curr_cmd->start_cmd << START_CMD_SHIFT);
851
852 cmd_addr = (void __iomem *)cmd_phase_addr;
853
854 /* Get the data phase address */
855 end_cmd_valid = 0;
856
857 data_phase_addr = (unsigned long)xnand->nand_base |
858 (0x0 << CLEAR_CS_SHIFT) |
859 (end_cmd_valid << END_CMD_VALID_SHIFT) |
860 (DATA_PHASE) |
861 (end_cmd << END_CMD_SHIFT) |
862 (0x0 << ECC_LAST_SHIFT);
863
864 chip->IO_ADDR_R = (void __iomem *)data_phase_addr;
865 chip->IO_ADDR_W = chip->IO_ADDR_R;
866
867 /* Command phase AXI Read & Write */
868 if (column != -1 && page_addr != -1) {
869 /* Adjust columns for 16 bit bus width */
870 if (chip->options & NAND_BUSWIDTH_16)
871 column >>= 1;
872 cmd_data = column;
873 if (mtd->writesize > ZYNQ_NAND_ECC_SIZE) {
874 cmd_data |= page_addr << 16;
875 /* Another address cycle for devices > 128MiB */
876 if (chip->chipsize > (128 << 20)) {
877 writel(cmd_data, cmd_addr);
878 cmd_data = (page_addr >> 16);
879 }
880 } else {
881 cmd_data |= page_addr << 8;
882 }
883 } else if (page_addr != -1) { /* Erase */
884 cmd_data = page_addr;
885 } else if (column != -1) { /* Change read/write column, read id etc */
886 /* Adjust columns for 16 bit bus width */
887 if ((chip->options & NAND_BUSWIDTH_16) &&
888 ((command == NAND_CMD_READ0) ||
889 (command == NAND_CMD_SEQIN) ||
890 (command == NAND_CMD_RNDOUT) ||
891 (command == NAND_CMD_RNDIN)))
892 column >>= 1;
893 cmd_data = column;
894 }
895
896 writel(cmd_data, cmd_addr);
897
898 if (curr_cmd->end_cmd_valid) {
899 xnand->end_cmd = curr_cmd->end_cmd;
900 xnand->end_cmd_pending = 1;
901 }
902
903 ndelay(100);
904
905 if ((command == NAND_CMD_READ0) ||
906 (command == NAND_CMD_RESET) ||
907 (command == NAND_CMD_PARAM) ||
908 (command == NAND_CMD_GET_FEATURES))
909 /* wait until command is processed */
910 nand_wait_ready(mtd);
911}
912
913/*
914 * zynq_nand_read_buf - read chip data into buffer
915 * @mtd: MTD device structure
916 * @buf: buffer to store date
917 * @len: number of bytes to read
918 */
919static void zynq_nand_read_buf(struct mtd_info *mtd, u8 *buf, int len)
920{
921 struct nand_chip *chip = mtd->priv;
922
923 /* Make sure that buf is 32 bit aligned */
924 if (((unsigned long)buf & 0x3) != 0) {
925 if (((unsigned long)buf & 0x1) != 0) {
926 if (len) {
927 *buf = readb(chip->IO_ADDR_R);
928 buf += 1;
929 len--;
930 }
931 }
932
933 if (((unsigned long)buf & 0x3) != 0) {
934 if (len >= 2) {
935 *(u16 *)buf = readw(chip->IO_ADDR_R);
936 buf += 2;
937 len -= 2;
938 }
939 }
940 }
941
942 /* copy aligned data */
943 while (len >= 4) {
944 *(u32 *)buf = readl(chip->IO_ADDR_R);
945 buf += 4;
946 len -= 4;
947 }
948
949 /* mop up any remaining bytes */
950 if (len) {
951 if (len >= 2) {
952 *(u16 *)buf = readw(chip->IO_ADDR_R);
953 buf += 2;
954 len -= 2;
955 }
956 if (len)
957 *buf = readb(chip->IO_ADDR_R);
958 }
959}
960
961/*
962 * zynq_nand_write_buf - write buffer to chip
963 * @mtd: MTD device structure
964 * @buf: data buffer
965 * @len: number of bytes to write
966 */
967static void zynq_nand_write_buf(struct mtd_info *mtd, const u8 *buf, int len)
968{
969 struct nand_chip *chip = mtd->priv;
970 const u32 *nand = chip->IO_ADDR_W;
971
972 /* Make sure that buf is 32 bit aligned */
973 if (((unsigned long)buf & 0x3) != 0) {
974 if (((unsigned long)buf & 0x1) != 0) {
975 if (len) {
976 writeb(*buf, nand);
977 buf += 1;
978 len--;
979 }
980 }
981
982 if (((unsigned long)buf & 0x3) != 0) {
983 if (len >= 2) {
984 writew(*(u16 *)buf, nand);
985 buf += 2;
986 len -= 2;
987 }
988 }
989 }
990
991 /* copy aligned data */
992 while (len >= 4) {
993 writel(*(u32 *)buf, nand);
994 buf += 4;
995 len -= 4;
996 }
997
998 /* mop up any remaining bytes */
999 if (len) {
1000 if (len >= 2) {
1001 writew(*(u16 *)buf, nand);
1002 buf += 2;
1003 len -= 2;
1004 }
1005
1006 if (len)
1007 writeb(*buf, nand);
1008 }
1009}
1010
1011/*
1012 * zynq_nand_device_ready - Check device ready/busy line
1013 * @mtd: Pointer to the mtd_info structure
1014 *
1015 * returns: 0 on busy or 1 on ready state
1016 */
1017static int zynq_nand_device_ready(struct mtd_info *mtd)
1018{
1019 u32 csr_val;
1020
1021 csr_val = readl(&zynq_nand_smc_base->csr);
1022 /* Check the raw_int_status1 bit */
1023 if (csr_val & ZYNQ_MEMC_SR_RAW_INT_ST1) {
1024 /* Clear the interrupt condition */
1025 writel(ZYNQ_MEMC_SR_INT_ST1, &zynq_nand_smc_base->cfr);
1026 return 1;
1027 }
1028
1029 return 0;
1030}
1031
Siva Durga Prasad Paladugu8597e8a2017-05-25 14:25:55 +05301032static int zynq_nand_check_is_16bit_bw_flash(void)
1033{
1034 int is_16bit_bw = NAND_BW_UNKNOWN;
1035 int mio_num_8bit = 0, mio_num_16bit = 0;
1036
1037 mio_num_8bit = zynq_slcr_get_mio_pin_status("nand8");
1038 if (mio_num_8bit == ZYNQ_NAND_MIO_NUM_NAND_8BIT)
1039 is_16bit_bw = NAND_BW_8BIT;
1040
1041 mio_num_16bit = zynq_slcr_get_mio_pin_status("nand16");
1042 if (mio_num_8bit == ZYNQ_NAND_MIO_NUM_NAND_8BIT &&
1043 mio_num_16bit == ZYNQ_NAND_MIO_NUM_NAND_16BIT)
1044 is_16bit_bw = NAND_BW_16BIT;
1045
1046 return is_16bit_bw;
1047}
1048
Ezequiel Garciaa26ee2e2018-01-13 14:56:17 -03001049static int zynq_nand_init(struct nand_chip *nand_chip, int devnum)
Siva Durga Prasad Paladuguc41d5cd2016-09-27 10:55:46 +05301050{
1051 struct zynq_nand_info *xnand;
1052 struct mtd_info *mtd;
1053 unsigned long ecc_page_size;
1054 u8 maf_id, dev_id, i;
1055 u8 get_feature[4];
1056 u8 set_feature[4] = {ONDIE_ECC_FEATURE_ENABLE, 0x00, 0x00, 0x00};
1057 unsigned long ecc_cfg;
1058 int ondie_ecc_enabled = 0;
1059 int err = -1;
Siva Durga Prasad Paladugu8597e8a2017-05-25 14:25:55 +05301060 int is_16bit_bw;
Siva Durga Prasad Paladuguc41d5cd2016-09-27 10:55:46 +05301061
1062 xnand = calloc(1, sizeof(struct zynq_nand_info));
1063 if (!xnand) {
1064 printf("%s: failed to allocate\n", __func__);
1065 goto fail;
1066 }
1067
1068 xnand->nand_base = (void __iomem *)ZYNQ_NAND_BASEADDR;
Ezequiel Garcia9bdba1f2018-01-12 15:30:55 -03001069 mtd = nand_to_mtd(nand_chip);
Siva Durga Prasad Paladuguc41d5cd2016-09-27 10:55:46 +05301070
1071 nand_chip->priv = xnand;
1072 mtd->priv = nand_chip;
1073
1074 /* Set address of NAND IO lines */
1075 nand_chip->IO_ADDR_R = xnand->nand_base;
1076 nand_chip->IO_ADDR_W = xnand->nand_base;
1077
1078 /* Set the driver entry points for MTD */
1079 nand_chip->cmdfunc = zynq_nand_cmd_function;
1080 nand_chip->dev_ready = zynq_nand_device_ready;
1081 nand_chip->select_chip = zynq_nand_select_chip;
1082
1083 /* If we don't set this delay driver sets 20us by default */
1084 nand_chip->chip_delay = 30;
1085
1086 /* Buffer read/write routines */
1087 nand_chip->read_buf = zynq_nand_read_buf;
1088 nand_chip->write_buf = zynq_nand_write_buf;
1089
Siva Durga Prasad Paladugu8597e8a2017-05-25 14:25:55 +05301090 is_16bit_bw = zynq_nand_check_is_16bit_bw_flash();
1091 if (is_16bit_bw == NAND_BW_UNKNOWN) {
1092 printf("%s: Unable detect NAND based on MIO settings\n",
1093 __func__);
1094 goto fail;
1095 }
1096
1097 if (is_16bit_bw == NAND_BW_16BIT)
1098 nand_chip->options = NAND_BUSWIDTH_16;
1099
Siva Durga Prasad Paladuguc41d5cd2016-09-27 10:55:46 +05301100 nand_chip->bbt_options = NAND_BBT_USE_FLASH;
1101
1102 /* Initialize the NAND flash interface on NAND controller */
1103 if (zynq_nand_init_nand_flash(nand_chip->options) < 0) {
1104 printf("%s: nand flash init failed\n", __func__);
1105 goto fail;
1106 }
1107
1108 /* first scan to find the device and get the page size */
1109 if (nand_scan_ident(mtd, 1, NULL)) {
1110 printf("%s: nand_scan_ident failed\n", __func__);
1111 goto fail;
1112 }
1113 /* Send the command for reading device ID */
1114 nand_chip->cmdfunc(mtd, NAND_CMD_RESET, -1, -1);
1115 nand_chip->cmdfunc(mtd, NAND_CMD_READID, 0x00, -1);
1116
1117 /* Read manufacturer and device IDs */
1118 maf_id = nand_chip->read_byte(mtd);
1119 dev_id = nand_chip->read_byte(mtd);
1120
1121 if ((maf_id == 0x2c) && ((dev_id == 0xf1) ||
1122 (dev_id == 0xa1) || (dev_id == 0xb1) ||
1123 (dev_id == 0xaa) || (dev_id == 0xba) ||
1124 (dev_id == 0xda) || (dev_id == 0xca) ||
1125 (dev_id == 0xac) || (dev_id == 0xbc) ||
1126 (dev_id == 0xdc) || (dev_id == 0xcc) ||
1127 (dev_id == 0xa3) || (dev_id == 0xb3) ||
1128 (dev_id == 0xd3) || (dev_id == 0xc3))) {
1129 nand_chip->cmdfunc(mtd, NAND_CMD_SET_FEATURES,
1130 ONDIE_ECC_FEATURE_ADDR, -1);
1131 for (i = 0; i < 4; i++)
1132 writeb(set_feature[i], nand_chip->IO_ADDR_W);
1133
1134 /* Wait for 1us after writing data with SET_FEATURES command */
1135 ndelay(1000);
1136
1137 nand_chip->cmdfunc(mtd, NAND_CMD_GET_FEATURES,
1138 ONDIE_ECC_FEATURE_ADDR, -1);
1139 nand_chip->read_buf(mtd, get_feature, 4);
1140
1141 if (get_feature[0] & ONDIE_ECC_FEATURE_ENABLE) {
1142 debug("%s: OnDie ECC flash\n", __func__);
1143 ondie_ecc_enabled = 1;
1144 } else {
1145 printf("%s: Unable to detect OnDie ECC\n", __func__);
1146 }
1147 }
1148
1149 if (ondie_ecc_enabled) {
1150 /* Bypass the controller ECC block */
1151 ecc_cfg = readl(&zynq_nand_smc_base->emcr);
1152 ecc_cfg &= ~ZYNQ_MEMC_NAND_ECC_MODE_MASK;
1153 writel(ecc_cfg, &zynq_nand_smc_base->emcr);
1154
1155 /* The software ECC routines won't work
1156 * with the SMC controller
1157 */
1158 nand_chip->ecc.mode = NAND_ECC_HW;
1159 nand_chip->ecc.strength = 1;
1160 nand_chip->ecc.read_page = zynq_nand_read_page_raw_nooob;
1161 nand_chip->ecc.read_subpage = zynq_nand_read_subpage_raw;
1162 nand_chip->ecc.write_page = zynq_nand_write_page_raw;
1163 nand_chip->ecc.read_page_raw = zynq_nand_read_page_raw;
1164 nand_chip->ecc.write_page_raw = zynq_nand_write_page_raw;
1165 nand_chip->ecc.read_oob = zynq_nand_read_oob;
1166 nand_chip->ecc.write_oob = zynq_nand_write_oob;
1167 nand_chip->ecc.size = mtd->writesize;
1168 nand_chip->ecc.bytes = 0;
1169
1170 /* NAND with on-die ECC supports subpage reads */
1171 nand_chip->options |= NAND_SUBPAGE_READ;
1172
1173 /* On-Die ECC spare bytes offset 8 is used for ECC codes */
1174 if (ondie_ecc_enabled) {
1175 nand_chip->ecc.layout = &ondie_nand_oob_64;
1176 /* Use the BBT pattern descriptors */
1177 nand_chip->bbt_td = &bbt_main_descr;
1178 nand_chip->bbt_md = &bbt_mirror_descr;
1179 }
1180 } else {
1181 /* Hardware ECC generates 3 bytes ECC code for each 512 bytes */
1182 nand_chip->ecc.mode = NAND_ECC_HW;
1183 nand_chip->ecc.strength = 1;
1184 nand_chip->ecc.size = ZYNQ_NAND_ECC_SIZE;
1185 nand_chip->ecc.bytes = 3;
1186 nand_chip->ecc.calculate = zynq_nand_calculate_hwecc;
1187 nand_chip->ecc.correct = zynq_nand_correct_data;
1188 nand_chip->ecc.hwctl = NULL;
1189 nand_chip->ecc.read_page = zynq_nand_read_page_hwecc;
1190 nand_chip->ecc.write_page = zynq_nand_write_page_hwecc;
1191 nand_chip->ecc.read_page_raw = zynq_nand_read_page_raw;
1192 nand_chip->ecc.write_page_raw = zynq_nand_write_page_raw;
1193 nand_chip->ecc.read_oob = zynq_nand_read_oob;
1194 nand_chip->ecc.write_oob = zynq_nand_write_oob;
1195
1196 switch (mtd->writesize) {
1197 case 512:
1198 ecc_page_size = 0x1;
1199 /* Set the ECC memory config register */
1200 writel((ZYNQ_NAND_ECC_CONFIG | ecc_page_size),
1201 &zynq_nand_smc_base->emcr);
1202 break;
1203 case 1024:
1204 ecc_page_size = 0x2;
1205 /* Set the ECC memory config register */
1206 writel((ZYNQ_NAND_ECC_CONFIG | ecc_page_size),
1207 &zynq_nand_smc_base->emcr);
1208 break;
1209 case 2048:
1210 ecc_page_size = 0x3;
1211 /* Set the ECC memory config register */
1212 writel((ZYNQ_NAND_ECC_CONFIG | ecc_page_size),
1213 &zynq_nand_smc_base->emcr);
1214 break;
1215 default:
1216 nand_chip->ecc.mode = NAND_ECC_SOFT;
1217 nand_chip->ecc.calculate = nand_calculate_ecc;
1218 nand_chip->ecc.correct = nand_correct_data;
1219 nand_chip->ecc.read_page = zynq_nand_read_page_swecc;
1220 nand_chip->ecc.write_page = zynq_nand_write_page_swecc;
1221 nand_chip->ecc.size = 256;
1222 break;
1223 }
1224
1225 if (mtd->oobsize == 16)
1226 nand_chip->ecc.layout = &nand_oob_16;
1227 else if (mtd->oobsize == 64)
1228 nand_chip->ecc.layout = &nand_oob_64;
1229 else
1230 printf("%s: No oob layout found\n", __func__);
1231 }
1232
1233 /* Second phase scan */
1234 if (nand_scan_tail(mtd)) {
1235 printf("%s: nand_scan_tail failed\n", __func__);
1236 goto fail;
1237 }
1238 if (nand_register(devnum, mtd))
1239 goto fail;
1240 return 0;
1241fail:
1242 free(xnand);
1243 return err;
1244}
1245
1246static struct nand_chip nand_chip[CONFIG_SYS_MAX_NAND_DEVICE];
1247
Ezequiel Garciaa26ee2e2018-01-13 14:56:17 -03001248void board_nand_init(void)
Siva Durga Prasad Paladuguc41d5cd2016-09-27 10:55:46 +05301249{
1250 struct nand_chip *nand = &nand_chip[0];
1251
1252 if (zynq_nand_init(nand, 0))
1253 puts("ZYNQ NAND init failed\n");
1254}