blob: 92db2aa19c8602904d649d83ae9980c406db80f2 [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>
Simon Glass0f2af882020-05-10 11:40:05 -060010#include <log.h>
Siva Durga Prasad Paladuguc41d5cd2016-09-27 10:55:46 +053011#include <malloc.h>
12#include <asm/io.h>
Simon Glassdbd79542020-05-10 11:40:11 -060013#include <linux/delay.h>
Siva Durga Prasad Paladuguc41d5cd2016-09-27 10:55:46 +053014#include <linux/errno.h>
15#include <nand.h>
Ashok Reddy Soma0c3ad692019-12-27 04:47:13 -070016#include <linux/ioport.h>
Siva Durga Prasad Paladuguc41d5cd2016-09-27 10:55:46 +053017#include <linux/mtd/mtd.h>
Masahiro Yamada2b7a8732017-11-30 13:45:24 +090018#include <linux/mtd/rawnand.h>
Siva Durga Prasad Paladuguc41d5cd2016-09-27 10:55:46 +053019#include <linux/mtd/partitions.h>
20#include <linux/mtd/nand_ecc.h>
21#include <asm/arch/hardware.h>
Siva Durga Prasad Paladugu8597e8a2017-05-25 14:25:55 +053022#include <asm/arch/sys_proto.h>
Ashok Reddy Somabb8448a2019-12-27 04:47:12 -070023#include <dm.h>
Siva Durga Prasad Paladuguc41d5cd2016-09-27 10:55:46 +053024
25/* The NAND flash driver defines */
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/* Flash memory controller operating parameters */
38#define ZYNQ_NAND_CLR_CONFIG ((0x1 << 1) | /* Disable interrupt */ \
39 (0x1 << 4) | /* Clear interrupt */ \
40 (0x1 << 6)) /* Disable ECC interrupt */
41
Jeff Westfahl313b9c32017-11-06 00:34:46 -080042#ifndef CONFIG_NAND_ZYNQ_USE_BOOTLOADER1_TIMINGS
43
Siva Durga Prasad Paladuguc41d5cd2016-09-27 10:55:46 +053044/* Assuming 50MHz clock (20ns cycle time) and 3V operation */
45#define ZYNQ_NAND_SET_CYCLES ((0x2 << 20) | /* t_rr from nand_cycles */ \
46 (0x2 << 17) | /* t_ar from nand_cycles */ \
47 (0x1 << 14) | /* t_clr from nand_cycles */ \
48 (0x3 << 11) | /* t_wp from nand_cycles */ \
49 (0x2 << 8) | /* t_rea from nand_cycles */ \
50 (0x5 << 4) | /* t_wc from nand_cycles */ \
51 (0x5 << 0)) /* t_rc from nand_cycles */
Jeff Westfahl313b9c32017-11-06 00:34:46 -080052#endif
Siva Durga Prasad Paladuguc41d5cd2016-09-27 10:55:46 +053053
54
55#define ZYNQ_NAND_DIRECT_CMD ((0x4 << 23) | /* Chip 0 from interface 1 */ \
56 (0x2 << 21)) /* UpdateRegs operation */
57
58#define ZYNQ_NAND_ECC_CONFIG ((0x1 << 2) | /* ECC available on APB */ \
59 (0x1 << 4) | /* ECC read at end of page */ \
60 (0x0 << 5)) /* No Jumping */
61
62#define ZYNQ_NAND_ECC_CMD1 ((0x80) | /* Write command */ \
63 (0x00 << 8) | /* Read command */ \
64 (0x30 << 16) | /* Read End command */ \
65 (0x1 << 24)) /* Read End command calid */
66
67#define ZYNQ_NAND_ECC_CMD2 ((0x85) | /* Write col change cmd */ \
68 (0x05 << 8) | /* Read col change cmd */ \
69 (0xE0 << 16) | /* Read col change end cmd */ \
70 (0x1 << 24)) /* Read col change
71 end cmd valid */
72/* AXI Address definitions */
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) /* Set ECC_Last */
85#define ZYNQ_NAND_CLEAR_CS (1 << CLEAR_CS_SHIFT) /* Clear chip select */
86
87/* ECC block registers bit position and bit mask */
88#define ZYNQ_NAND_ECC_BUSY (1 << 6) /* ECC block is busy */
89#define ZYNQ_NAND_ECC_MASK 0x00FFFFFF /* ECC value mask */
90
Siva Durga Prasad Paladugu2e601592017-05-25 12:15:24 +053091#define ZYNQ_NAND_ROW_ADDR_CYCL_MASK 0x0F
92#define ZYNQ_NAND_COL_ADDR_CYCL_MASK 0xF0
93
Siva Durga Prasad Paladugu8597e8a2017-05-25 14:25:55 +053094#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
Joe Hershbergere7fa4372017-11-06 18:16:10 -0800103#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
Siva Durga Prasad Paladuguc41d5cd2016-09-27 10:55:46 +0530110
111/* SMC register set */
112struct zynq_nand_smc_regs {
113 u32 csr; /* 0x00 */
114 u32 reserved0[2];
115 u32 cfr; /* 0x0C */
116 u32 dcr; /* 0x10 */
117 u32 scr; /* 0x14 */
118 u32 sor; /* 0x18 */
119 u32 reserved1[249];
120 u32 esr; /* 0x400 */
121 u32 emcr; /* 0x404 */
122 u32 emcmd1r; /* 0x408 */
123 u32 emcmd2r; /* 0x40C */
124 u32 reserved2[2];
125 u32 eval0r; /* 0x418 */
126};
Siva Durga Prasad Paladuguc41d5cd2016-09-27 10:55:46 +0530127
128/*
Ashok Reddy Somabb8448a2019-12-27 04:47:12 -0700129 * struct nand_config - Defines the NAND flash driver instance
Siva Durga Prasad Paladuguc41d5cd2016-09-27 10:55:46 +0530130 * @parts: Pointer to the mtd_partition structure
131 * @nand_base: Virtual address of the NAND flash device
132 * @end_cmd_pending: End command is pending
133 * @end_cmd: End command
134 */
Ashok Reddy Somabb8448a2019-12-27 04:47:12 -0700135struct nand_config {
Siva Durga Prasad Paladuguc41d5cd2016-09-27 10:55:46 +0530136 void __iomem *nand_base;
137 u8 end_cmd_pending;
138 u8 end_cmd;
139};
140
Ashok Reddy Soma0c3ad692019-12-27 04:47:13 -0700141struct nand_drv {
142 struct zynq_nand_smc_regs *reg;
143 struct nand_config config;
144};
145
Ashok Reddy Somabb8448a2019-12-27 04:47:12 -0700146struct zynq_nand_info {
147 struct udevice *dev;
Ashok Reddy Soma0c3ad692019-12-27 04:47:13 -0700148 struct nand_drv nand_ctrl;
Ashok Reddy Somabb8448a2019-12-27 04:47:12 -0700149 struct nand_chip nand_chip;
150};
151
Siva Durga Prasad Paladuguc41d5cd2016-09-27 10:55:46 +0530152/*
153 * struct zynq_nand_command_format - Defines NAND flash command format
154 * @start_cmd: First cycle command (Start command)
155 * @end_cmd: Second cycle command (Last command)
156 * @addr_cycles: Number of address cycles required to send the address
157 * @end_cmd_valid: The second cycle command is valid for cmd or data phase
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/* The NAND flash operations command format */
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},
Joe Hershbergere7fa4372017-11-06 18:16:10 -0800179 {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},
Siva Durga Prasad Paladuguc41d5cd2016-09-27 10:55:46 +0530184 {NAND_CMD_NONE, NAND_CMD_NONE, 0, 0},
185 /* Add all the flash commands supported by the flash device */
186};
187
188/* Define default oob placement schemes for large and small page devices */
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/* bbt decriptors for chips with on-die ECC and
226 chips with 64-byte OOB */
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 * zynq_nand_waitfor_ecc_completion - Wait for ECC completion
252 *
253 * returns: status for command completion, -1 for Timeout
254 */
Ashok Reddy Soma0c3ad692019-12-27 04:47:13 -0700255static int zynq_nand_waitfor_ecc_completion(struct mtd_info *mtd)
Siva Durga Prasad Paladuguc41d5cd2016-09-27 10:55:46 +0530256{
Ashok Reddy Soma0c3ad692019-12-27 04:47:13 -0700257 struct nand_chip *nand_chip = mtd_to_nand(mtd);
258 struct nand_drv *smc = nand_get_controller_data(nand_chip);
Siva Durga Prasad Paladuguc41d5cd2016-09-27 10:55:46 +0530259 unsigned long timeout;
260 u32 status;
261
262 /* Wait max 10us */
263 timeout = 10;
Ashok Reddy Soma0c3ad692019-12-27 04:47:13 -0700264 status = readl(&smc->reg->esr);
Siva Durga Prasad Paladuguc41d5cd2016-09-27 10:55:46 +0530265 while (status & ZYNQ_NAND_ECC_BUSY) {
Ashok Reddy Soma0c3ad692019-12-27 04:47:13 -0700266 status = readl(&smc->reg->esr);
Siva Durga Prasad Paladuguc41d5cd2016-09-27 10:55:46 +0530267 if (timeout == 0)
268 return -1;
269 timeout--;
270 udelay(1);
271 }
272
273 return status;
274}
275
276/*
277 * zynq_nand_init_nand_flash - Initialize NAND controller
278 * @option: Device property flags
279 *
280 * This function initializes the NAND flash interface on the NAND controller.
281 *
282 * returns: 0 on success or error value on failure
283 */
Ashok Reddy Soma0c3ad692019-12-27 04:47:13 -0700284static int zynq_nand_init_nand_flash(struct mtd_info *mtd, int option)
Siva Durga Prasad Paladuguc41d5cd2016-09-27 10:55:46 +0530285{
Ashok Reddy Soma0c3ad692019-12-27 04:47:13 -0700286 struct nand_chip *nand_chip = mtd_to_nand(mtd);
287 struct nand_drv *smc = nand_get_controller_data(nand_chip);
Siva Durga Prasad Paladuguc41d5cd2016-09-27 10:55:46 +0530288 u32 status;
289
290 /* disable interrupts */
Ashok Reddy Soma0c3ad692019-12-27 04:47:13 -0700291 writel(ZYNQ_NAND_CLR_CONFIG, &smc->reg->cfr);
Jeff Westfahl313b9c32017-11-06 00:34:46 -0800292#ifndef CONFIG_NAND_ZYNQ_USE_BOOTLOADER1_TIMINGS
Siva Durga Prasad Paladuguc41d5cd2016-09-27 10:55:46 +0530293 /* Initialize the NAND interface by setting cycles and operation mode */
Ashok Reddy Soma0c3ad692019-12-27 04:47:13 -0700294 writel(ZYNQ_NAND_SET_CYCLES, &smc->reg->scr);
Jeff Westfahl313b9c32017-11-06 00:34:46 -0800295#endif
Siva Durga Prasad Paladuguc41d5cd2016-09-27 10:55:46 +0530296 if (option & NAND_BUSWIDTH_16)
Ashok Reddy Soma0c3ad692019-12-27 04:47:13 -0700297 writel(ZYNQ_NAND_SET_OPMODE_16BIT, &smc->reg->sor);
Siva Durga Prasad Paladuguc41d5cd2016-09-27 10:55:46 +0530298 else
Ashok Reddy Soma0c3ad692019-12-27 04:47:13 -0700299 writel(ZYNQ_NAND_SET_OPMODE_8BIT, &smc->reg->sor);
Siva Durga Prasad Paladuguc41d5cd2016-09-27 10:55:46 +0530300
Ashok Reddy Soma0c3ad692019-12-27 04:47:13 -0700301 writel(ZYNQ_NAND_DIRECT_CMD, &smc->reg->dcr);
Siva Durga Prasad Paladuguc41d5cd2016-09-27 10:55:46 +0530302
303 /* Wait till the ECC operation is complete */
Ashok Reddy Soma0c3ad692019-12-27 04:47:13 -0700304 status = zynq_nand_waitfor_ecc_completion(mtd);
Siva Durga Prasad Paladuguc41d5cd2016-09-27 10:55:46 +0530305 if (status < 0) {
306 printf("%s: Timeout\n", __func__);
307 return status;
308 }
309
310 /* Set the command1 and command2 register */
Ashok Reddy Soma0c3ad692019-12-27 04:47:13 -0700311 writel(ZYNQ_NAND_ECC_CMD1, &smc->reg->emcmd1r);
312 writel(ZYNQ_NAND_ECC_CMD2, &smc->reg->emcmd2r);
Siva Durga Prasad Paladuguc41d5cd2016-09-27 10:55:46 +0530313
314 return 0;
315}
316
317/*
318 * zynq_nand_calculate_hwecc - Calculate Hardware ECC
319 * @mtd: Pointer to the mtd_info structure
320 * @data: Pointer to the page data
321 * @ecc_code: Pointer to the ECC buffer where ECC data needs to be stored
322 *
323 * This function retrieves the Hardware ECC data from the controller and returns
324 * ECC data back to the MTD subsystem.
325 *
326 * returns: 0 on success or error value on failure
327 */
328static int zynq_nand_calculate_hwecc(struct mtd_info *mtd, const u8 *data,
329 u8 *ecc_code)
330{
Ashok Reddy Soma0c3ad692019-12-27 04:47:13 -0700331 struct nand_chip *nand_chip = mtd_to_nand(mtd);
332 struct nand_drv *smc = nand_get_controller_data(nand_chip);
Siva Durga Prasad Paladuguc41d5cd2016-09-27 10:55:46 +0530333 u32 ecc_value = 0;
334 u8 ecc_reg, ecc_byte;
335 u32 ecc_status;
336
337 /* Wait till the ECC operation is complete */
Ashok Reddy Soma0c3ad692019-12-27 04:47:13 -0700338 ecc_status = zynq_nand_waitfor_ecc_completion(mtd);
Siva Durga Prasad Paladuguc41d5cd2016-09-27 10:55:46 +0530339 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 /* Read ECC value for each block */
Ashok Reddy Soma0c3ad692019-12-27 04:47:13 -0700346 ecc_value = readl(&smc->reg->eval0r + ecc_reg);
Siva Durga Prasad Paladuguc41d5cd2016-09-27 10:55:46 +0530347
348 /* Get the ecc status from ecc read value */
349 ecc_status = (ecc_value >> 24) & 0xFF;
350
351 /* ECC value valid */
352 if (ecc_status & ZYNQ_NAND_ECC_STATUS) {
353 for (ecc_byte = 0; ecc_byte < 3; ecc_byte++) {
354 /* Copy ECC bytes to MTD buffer */
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 * onehot - onehot function
369 * @value: value to check for onehot
370 *
371 * This function checks whether a value is onehot or not.
372 * onehot is if and only if one bit is set.
373 *
374 * FIXME: Try to move this in common.h
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 * zynq_nand_correct_data - ECC correction function
386 * @mtd: Pointer to the mtd_info structure
387 * @buf: Pointer to the page data
388 * @read_ecc: Pointer to the ECC value read from spare data area
389 * @calc_ecc: Pointer to the calculated ECC value
390 *
391 * This function corrects the ECC single bit errors & detects 2-bit errors.
392 *
393 * returns: 0 if no ECC errors found
394 * 1 if single bit error found and corrected.
395 * -1 if multiple ECC errors found.
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; /* no error */
417
418 if (ecc_odd == (~ecc_even & 0xfff)) {
419 /* bits [11:3] of error code is byte offset */
420 byte_addr = (ecc_odd >> 3) & 0x1ff;
421 /* bits [2:0] of error code is bit offset */
422 bit_addr = ecc_odd & 0x7;
423 /* Toggling error bit */
424 buf[byte_addr] ^= (1 << bit_addr);
425 return 1;
426 }
427
428 if (onehot(ecc_odd | ecc_even))
429 return 1; /* one error in parity */
430
431 return -1; /* Uncorrectable error */
432}
433
434/*
435 * zynq_nand_read_oob - [REPLACABLE] the most common OOB data read function
436 * @mtd: mtd info structure
437 * @chip: nand chip info structure
438 * @page: page number to read
439 * @sndcmd: flag whether to issue read command or not
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 * zynq_nand_write_oob - [REPLACABLE] the most common OOB data write function
464 * @mtd: mtd info structure
465 * @chip: nand chip info structure
466 * @page: page number to write
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 /* Send command to program the OOB data */
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 * zynq_nand_read_page_raw - [Intern] read raw page data without ecc
495 * @mtd: mtd info structure
496 * @chip: nand chip info structure
497 * @buf: buffer to store read data
498 * @oob_required: must write chip->oob_poi to OOB
499 * @page: page number to read
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 * zynq_nand_write_page_raw - [Intern] raw page write function
544 * @mtd: mtd info structure
545 * @chip: nand chip info structure
546 * @buf: data buffer
547 * @oob_required: must write chip->oob_poi to OOB
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 * nand_write_page_hwecc - Hardware ECC based page write function
574 * @mtd: Pointer to the mtd info structure
575 * @chip: Pointer to the NAND chip info structure
576 * @buf: Pointer to the data buffer
577 * @oob_required: must write chip->oob_poi to OOB
578 *
579 * This functions writes data and hardware generated ECC values in to the page.
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 /* Set ECC Last bit to 1 */
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 /* Wait for ECC to be calculated and read the error values */
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 /* Clear ECC last bit */
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 /* Write the spare area with ECC bytes */
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 * zynq_nand_write_page_swecc - [REPLACABLE] software ecc based page
633 * write function
634 * @mtd: mtd info structure
635 * @chip: nand chip info structure
636 * @buf: data buffer
637 * @oob_required: must write chip->oob_poi to OOB
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 /* Software ecc calculation */
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 * nand_read_page_hwecc - Hardware ECC based page read function
661 * @mtd: Pointer to the mtd info structure
662 * @chip: Pointer to the NAND chip info structure
663 * @buf: Pointer to the buffer to store read data
664 * @oob_required: must write chip->oob_poi to OOB
665 * @page: page number to read
666 *
667 * This functions reads data and checks the data integrity by comparing hardware
668 * generated ECC values and read ECC values from spare area.
669 *
670 * returns: 0 always and updates ECC operation status in to MTD structure
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 /* Set ECC Last bit to 1 */
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 /* Read the calculated ECC value */
699 p = buf;
700 chip->ecc.calculate(mtd, p, &ecc_calc[0]);
701
702 /* Clear ECC last bit */
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 /* Read the stored ECC value */
708 oob_ptr = chip->oob_poi;
709 chip->read_buf(mtd, oob_ptr, (mtd->oobsize - data_width));
710
711 /* de-assert chip select */
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 /* Check ECC error for all blocks and correct if it is correctable */
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 * zynq_nand_read_page_swecc - [REPLACABLE] software ecc based page
738 * read function
739 * @mtd: mtd info structure
740 * @chip: nand chip info structure
741 * @buf: buffer to store read data
742 * @page: page number to read
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 * zynq_nand_select_chip - Select the flash device
780 * @mtd: Pointer to the mtd_info structure
781 * @chip: Chip number to be selected
782 *
783 * This function is empty as the NAND controller handles chip select line
784 * internally based on the chip address passed in command and data phase.
785 */
786static void zynq_nand_select_chip(struct mtd_info *mtd, int chip)
787{
788 /* Not support multiple chips yet */
789}
790
791/*
792 * zynq_nand_cmd_function - Send command to NAND device
793 * @mtd: Pointer to the mtd_info structure
794 * @command: The command to be sent to the flash device
795 * @column: The column address for this command, -1 if none
796 * @page_addr: The page address for this command, -1 if none
797 */
798static void zynq_nand_cmd_function(struct mtd_info *mtd, unsigned int command,
799 int column, int page_addr)
800{
Ashok Reddy Soma0c3ad692019-12-27 04:47:13 -0700801 struct nand_chip *chip = mtd_to_nand(mtd);
802 struct nand_drv *smc = nand_get_controller_data(chip);
Siva Durga Prasad Paladuguc41d5cd2016-09-27 10:55:46 +0530803 const struct zynq_nand_command_format *curr_cmd = NULL;
Siva Durga Prasad Paladugu2e601592017-05-25 12:15:24 +0530804 u8 addr_cycles = 0;
Ashok Reddy Soma0c3ad692019-12-27 04:47:13 -0700805 struct nand_config *xnand = &smc->config;
Siva Durga Prasad Paladuguc41d5cd2016-09-27 10:55:46 +0530806 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 /* Check for end command if this command request is same as the
816 * pending command then return
817 */
818 if (xnand->end_cmd == command) {
819 xnand->end_cmd = 0;
820 xnand->end_cmd_pending = 0;
821 return;
822 }
823 }
824
825 /* Emulate NAND_CMD_READOOB for large page device */
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 /* Get the command format */
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 /* Clear interrupt */
Ashok Reddy Soma0c3ad692019-12-27 04:47:13 -0700844 writel(ZYNQ_MEMC_CLRCR_INT_CLR1, &smc->reg->cfr);
Siva Durga Prasad Paladuguc41d5cd2016-09-27 10:55:46 +0530845
846 /* Get the command phase address */
847 if (curr_cmd->end_cmd_valid == ZYNQ_NAND_CMD_PHASE)
848 end_cmd_valid = 1;
849
Patrick van Gelderce9dfb92020-04-24 01:28:56 -0600850 if (curr_cmd->end_cmd == (u8)NAND_CMD_NONE)
Siva Durga Prasad Paladuguc41d5cd2016-09-27 10:55:46 +0530851 end_cmd = 0x0;
852 else
853 end_cmd = curr_cmd->end_cmd;
854
Siva Durga Prasad Paladugu2e601592017-05-25 12:15:24 +0530855 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
Siva Durga Prasad Paladuguc41d5cd2016-09-27 10:55:46 +0530865 cmd_phase_addr = (unsigned long)xnand->nand_base |
Siva Durga Prasad Paladugu2e601592017-05-25 12:15:24 +0530866 (addr_cycles << ADDR_CYCLES_SHIFT) |
Siva Durga Prasad Paladuguc41d5cd2016-09-27 10:55:46 +0530867 (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 /* Get the data phase address */
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 /* Command phase AXI Read & Write */
888 if (column != -1 && page_addr != -1) {
889 /* Adjust columns for 16 bit bus width */
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 /* Another address cycle for devices > 128MiB */
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) { /* Erase */
904 cmd_data = page_addr;
905 } else if (column != -1) { /* Change read/write column, read id etc */
906 /* Adjust columns for 16 bit bus width */
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 /* wait until command is processed */
930 nand_wait_ready(mtd);
931}
932
933/*
934 * zynq_nand_read_buf - read chip data into buffer
935 * @mtd: MTD device structure
936 * @buf: buffer to store date
937 * @len: number of bytes to read
938 */
939static void zynq_nand_read_buf(struct mtd_info *mtd, u8 *buf, int len)
940{
Ashok Reddy Soma0c3ad692019-12-27 04:47:13 -0700941 struct nand_chip *chip = mtd_to_nand(mtd);
Siva Durga Prasad Paladuguc41d5cd2016-09-27 10:55:46 +0530942
943 /* Make sure that buf is 32 bit aligned */
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 /* copy aligned data */
963 while (len >= 4) {
964 *(u32 *)buf = readl(chip->IO_ADDR_R);
965 buf += 4;
966 len -= 4;
967 }
968
969 /* mop up any remaining bytes */
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 * zynq_nand_write_buf - write buffer to chip
983 * @mtd: MTD device structure
984 * @buf: data buffer
985 * @len: number of bytes to write
986 */
987static void zynq_nand_write_buf(struct mtd_info *mtd, const u8 *buf, int len)
988{
Ashok Reddy Soma0c3ad692019-12-27 04:47:13 -0700989 struct nand_chip *chip = mtd_to_nand(mtd);
Siva Durga Prasad Paladuguc41d5cd2016-09-27 10:55:46 +0530990 const u32 *nand = chip->IO_ADDR_W;
991
992 /* Make sure that buf is 32 bit aligned */
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 /* copy aligned data */
1012 while (len >= 4) {
1013 writel(*(u32 *)buf, nand);
1014 buf += 4;
1015 len -= 4;
1016 }
1017
1018 /* mop up any remaining bytes */
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 * zynq_nand_device_ready - Check device ready/busy line
1033 * @mtd: Pointer to the mtd_info structure
1034 *
1035 * returns: 0 on busy or 1 on ready state
1036 */
1037static int zynq_nand_device_ready(struct mtd_info *mtd)
1038{
Ashok Reddy Soma0c3ad692019-12-27 04:47:13 -07001039 struct nand_chip *nand_chip = mtd_to_nand(mtd);
1040 struct nand_drv *smc = nand_get_controller_data(nand_chip);
Siva Durga Prasad Paladuguc41d5cd2016-09-27 10:55:46 +05301041 u32 csr_val;
1042
Ashok Reddy Soma0c3ad692019-12-27 04:47:13 -07001043 csr_val = readl(&smc->reg->csr);
Siva Durga Prasad Paladuguc41d5cd2016-09-27 10:55:46 +05301044 /* Check the raw_int_status1 bit */
1045 if (csr_val & ZYNQ_MEMC_SR_RAW_INT_ST1) {
1046 /* Clear the interrupt condition */
Ashok Reddy Soma0c3ad692019-12-27 04:47:13 -07001047 writel(ZYNQ_MEMC_SR_INT_ST1, &smc->reg->cfr);
Siva Durga Prasad Paladuguc41d5cd2016-09-27 10:55:46 +05301048 return 1;
1049 }
1050
1051 return 0;
1052}
1053
Siva Durga Prasad Paladugu8597e8a2017-05-25 14:25:55 +05301054static 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
Ashok Reddy Somabb8448a2019-12-27 04:47:12 -07001071static int zynq_nand_probe(struct udevice *dev)
Siva Durga Prasad Paladuguc41d5cd2016-09-27 10:55:46 +05301072{
Ashok Reddy Somabb8448a2019-12-27 04:47:12 -07001073 struct zynq_nand_info *zynq = dev_get_priv(dev);
1074 struct nand_chip *nand_chip = &zynq->nand_chip;
Ashok Reddy Soma0c3ad692019-12-27 04:47:13 -07001075 struct nand_drv *smc = &zynq->nand_ctrl;
1076 struct nand_config *xnand = &smc->config;
Siva Durga Prasad Paladuguc41d5cd2016-09-27 10:55:46 +05301077 struct mtd_info *mtd;
Ashok Reddy Soma0c3ad692019-12-27 04:47:13 -07001078 struct resource res;
1079 ofnode of_nand;
Siva Durga Prasad Paladuguc41d5cd2016-09-27 10:55:46 +05301080 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;
Siva Durga Prasad Paladugu8597e8a2017-05-25 14:25:55 +05301086 int is_16bit_bw;
Siva Durga Prasad Paladuguc41d5cd2016-09-27 10:55:46 +05301087
Ashok Reddy Soma0c3ad692019-12-27 04:47:13 -07001088 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");
Michal Simekd896a512020-02-25 14:51:48 +01001092 return -ENODEV;
Siva Durga Prasad Paladuguc41d5cd2016-09-27 10:55:46 +05301093 }
Michal Simekd896a512020-02-25 14:51:48 +01001094
Michal Simek4de73212020-02-25 14:40:42 +01001095 if (!ofnode_is_available(of_nand)) {
1096 debug("Nand node in dt disabled\n");
1097 return dm_scan_fdt_dev(dev);
1098 }
1099
Ashok Reddy Soma0c3ad692019-12-27 04:47:13 -07001100 if (ofnode_read_resource(of_nand, 0, &res)) {
1101 printf("Failed to get nand resource\n");
Michal Simekd896a512020-02-25 14:51:48 +01001102 return -ENODEV;
Ashok Reddy Soma0c3ad692019-12-27 04:47:13 -07001103 }
Siva Durga Prasad Paladuguc41d5cd2016-09-27 10:55:46 +05301104
Ashok Reddy Soma0c3ad692019-12-27 04:47:13 -07001105 xnand->nand_base = (void __iomem *)res.start;
Ezequiel Garcia9bdba1f2018-01-12 15:30:55 -03001106 mtd = nand_to_mtd(nand_chip);
Ashok Reddy Soma0c3ad692019-12-27 04:47:13 -07001107 nand_set_controller_data(nand_chip, &zynq->nand_ctrl);
Siva Durga Prasad Paladuguc41d5cd2016-09-27 10:55:46 +05301108
1109 /* Set address of NAND IO lines */
1110 nand_chip->IO_ADDR_R = xnand->nand_base;
1111 nand_chip->IO_ADDR_W = xnand->nand_base;
1112
1113 /* Set the driver entry points for MTD */
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 /* If we don't set this delay driver sets 20us by default */
1119 nand_chip->chip_delay = 30;
1120
1121 /* Buffer read/write routines */
1122 nand_chip->read_buf = zynq_nand_read_buf;
1123 nand_chip->write_buf = zynq_nand_write_buf;
1124
Siva Durga Prasad Paladugu8597e8a2017-05-25 14:25:55 +05301125 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__);
Michal Simekd896a512020-02-25 14:51:48 +01001129 return -EINVAL;
Siva Durga Prasad Paladugu8597e8a2017-05-25 14:25:55 +05301130 }
1131
1132 if (is_16bit_bw == NAND_BW_16BIT)
1133 nand_chip->options = NAND_BUSWIDTH_16;
1134
Siva Durga Prasad Paladuguc41d5cd2016-09-27 10:55:46 +05301135 nand_chip->bbt_options = NAND_BBT_USE_FLASH;
1136
1137 /* Initialize the NAND flash interface on NAND controller */
Ashok Reddy Soma0c3ad692019-12-27 04:47:13 -07001138 if (zynq_nand_init_nand_flash(mtd, nand_chip->options) < 0) {
Siva Durga Prasad Paladuguc41d5cd2016-09-27 10:55:46 +05301139 printf("%s: nand flash init failed\n", __func__);
Michal Simekd896a512020-02-25 14:51:48 +01001140 return -EINVAL;
Siva Durga Prasad Paladuguc41d5cd2016-09-27 10:55:46 +05301141 }
1142
1143 /* first scan to find the device and get the page size */
1144 if (nand_scan_ident(mtd, 1, NULL)) {
1145 printf("%s: nand_scan_ident failed\n", __func__);
Michal Simekd896a512020-02-25 14:51:48 +01001146 return -EINVAL;
Siva Durga Prasad Paladuguc41d5cd2016-09-27 10:55:46 +05301147 }
1148 /* Send the command for reading device ID */
1149 nand_chip->cmdfunc(mtd, NAND_CMD_RESET, -1, -1);
1150 nand_chip->cmdfunc(mtd, NAND_CMD_READID, 0x00, -1);
1151
1152 /* Read manufacturer and device IDs */
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 /* Wait for 1us after writing data with SET_FEATURES command */
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 /* Bypass the controller ECC block */
Ashok Reddy Soma0c3ad692019-12-27 04:47:13 -07001186 ecc_cfg = readl(&smc->reg->emcr);
Siva Durga Prasad Paladuguc41d5cd2016-09-27 10:55:46 +05301187 ecc_cfg &= ~ZYNQ_MEMC_NAND_ECC_MODE_MASK;
Ashok Reddy Soma0c3ad692019-12-27 04:47:13 -07001188 writel(ecc_cfg, &smc->reg->emcr);
Siva Durga Prasad Paladuguc41d5cd2016-09-27 10:55:46 +05301189
1190 /* The software ECC routines won't work
1191 * with the SMC controller
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 /* NAND with on-die ECC supports subpage reads */
1206 nand_chip->options |= NAND_SUBPAGE_READ;
1207
1208 /* On-Die ECC spare bytes offset 8 is used for ECC codes */
1209 if (ondie_ecc_enabled) {
1210 nand_chip->ecc.layout = &ondie_nand_oob_64;
1211 /* Use the BBT pattern descriptors */
1212 nand_chip->bbt_td = &bbt_main_descr;
1213 nand_chip->bbt_md = &bbt_mirror_descr;
1214 }
1215 } else {
1216 /* Hardware ECC generates 3 bytes ECC code for each 512 bytes */
1217 nand_chip->ecc.mode = NAND_ECC_HW;
1218 nand_chip->ecc.strength = 1;
1219 nand_chip->ecc.size = ZYNQ_NAND_ECC_SIZE;
1220 nand_chip->ecc.bytes = 3;
1221 nand_chip->ecc.calculate = zynq_nand_calculate_hwecc;
1222 nand_chip->ecc.correct = zynq_nand_correct_data;
1223 nand_chip->ecc.hwctl = NULL;
1224 nand_chip->ecc.read_page = zynq_nand_read_page_hwecc;
1225 nand_chip->ecc.write_page = zynq_nand_write_page_hwecc;
1226 nand_chip->ecc.read_page_raw = zynq_nand_read_page_raw;
1227 nand_chip->ecc.write_page_raw = zynq_nand_write_page_raw;
1228 nand_chip->ecc.read_oob = zynq_nand_read_oob;
1229 nand_chip->ecc.write_oob = zynq_nand_write_oob;
1230
1231 switch (mtd->writesize) {
1232 case 512:
1233 ecc_page_size = 0x1;
1234 /* Set the ECC memory config register */
1235 writel((ZYNQ_NAND_ECC_CONFIG | ecc_page_size),
Ashok Reddy Soma0c3ad692019-12-27 04:47:13 -07001236 &smc->reg->emcr);
Siva Durga Prasad Paladuguc41d5cd2016-09-27 10:55:46 +05301237 break;
1238 case 1024:
1239 ecc_page_size = 0x2;
1240 /* Set the ECC memory config register */
1241 writel((ZYNQ_NAND_ECC_CONFIG | ecc_page_size),
Ashok Reddy Soma0c3ad692019-12-27 04:47:13 -07001242 &smc->reg->emcr);
Siva Durga Prasad Paladuguc41d5cd2016-09-27 10:55:46 +05301243 break;
1244 case 2048:
1245 ecc_page_size = 0x3;
1246 /* Set the ECC memory config register */
1247 writel((ZYNQ_NAND_ECC_CONFIG | ecc_page_size),
Ashok Reddy Soma0c3ad692019-12-27 04:47:13 -07001248 &smc->reg->emcr);
Siva Durga Prasad Paladuguc41d5cd2016-09-27 10:55:46 +05301249 break;
1250 default:
1251 nand_chip->ecc.mode = NAND_ECC_SOFT;
1252 nand_chip->ecc.calculate = nand_calculate_ecc;
1253 nand_chip->ecc.correct = nand_correct_data;
1254 nand_chip->ecc.read_page = zynq_nand_read_page_swecc;
1255 nand_chip->ecc.write_page = zynq_nand_write_page_swecc;
1256 nand_chip->ecc.size = 256;
1257 break;
1258 }
1259
1260 if (mtd->oobsize == 16)
1261 nand_chip->ecc.layout = &nand_oob_16;
1262 else if (mtd->oobsize == 64)
1263 nand_chip->ecc.layout = &nand_oob_64;
1264 else
1265 printf("%s: No oob layout found\n", __func__);
1266 }
1267
1268 /* Second phase scan */
1269 if (nand_scan_tail(mtd)) {
1270 printf("%s: nand_scan_tail failed\n", __func__);
Michal Simekd896a512020-02-25 14:51:48 +01001271 return -EINVAL;
Siva Durga Prasad Paladuguc41d5cd2016-09-27 10:55:46 +05301272 }
Ashok Reddy Somabb8448a2019-12-27 04:47:12 -07001273 if (nand_register(0, mtd))
Michal Simekd896a512020-02-25 14:51:48 +01001274 return -EINVAL;
1275
Siva Durga Prasad Paladuguc41d5cd2016-09-27 10:55:46 +05301276 return 0;
Siva Durga Prasad Paladuguc41d5cd2016-09-27 10:55:46 +05301277}
1278
Ashok Reddy Somabb8448a2019-12-27 04:47:12 -07001279static const struct udevice_id zynq_nand_dt_ids[] = {
1280 {.compatible = "arm,pl353-smc-r2p1",},
1281 { /* sentinel */ }
1282};
1283
1284U_BOOT_DRIVER(zynq_nand) = {
Michal Simek33093082020-01-07 08:50:34 +01001285 .name = "zynq_nand",
Ashok Reddy Somabb8448a2019-12-27 04:47:12 -07001286 .id = UCLASS_MTD,
1287 .of_match = zynq_nand_dt_ids,
1288 .probe = zynq_nand_probe,
1289 .priv_auto_alloc_size = sizeof(struct zynq_nand_info),
1290};
Siva Durga Prasad Paladuguc41d5cd2016-09-27 10:55:46 +05301291
Ezequiel Garciaa26ee2e2018-01-13 14:56:17 -03001292void board_nand_init(void)
Siva Durga Prasad Paladuguc41d5cd2016-09-27 10:55:46 +05301293{
Ashok Reddy Somabb8448a2019-12-27 04:47:12 -07001294 struct udevice *dev;
1295 int ret;
Siva Durga Prasad Paladuguc41d5cd2016-09-27 10:55:46 +05301296
Ashok Reddy Somabb8448a2019-12-27 04:47:12 -07001297 ret = uclass_get_device_by_driver(UCLASS_MTD,
1298 DM_GET_DRIVER(zynq_nand), &dev);
1299 if (ret && ret != -ENODEV)
1300 pr_err("Failed to initialize %s. (error %d)\n", dev->name, ret);
Siva Durga Prasad Paladuguc41d5cd2016-09-27 10:55:46 +05301301}