]>
Commit | Line | Data |
---|---|---|
1 | // SPDX-License-Identifier: GPL-2.0+ | |
2 | /* | |
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 | |
7 | */ | |
8 | ||
9 | #include <common.h> | |
10 | #include <log.h> | |
11 | #include <malloc.h> | |
12 | #include <asm/io.h> | |
13 | #include <linux/delay.h> | |
14 | #include <linux/errno.h> | |
15 | #include <nand.h> | |
16 | #include <linux/ioport.h> | |
17 | #include <linux/mtd/mtd.h> | |
18 | #include <linux/mtd/rawnand.h> | |
19 | #include <linux/mtd/partitions.h> | |
20 | #include <linux/mtd/nand_ecc.h> | |
21 | #include <asm/arch/hardware.h> | |
22 | #include <asm/arch/sys_proto.h> | |
23 | #include <dm.h> | |
24 | ||
25 | /* 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 | ||
42 | #ifndef CONFIG_NAND_ZYNQ_USE_BOOTLOADER1_TIMINGS | |
43 | ||
44 | /* 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 */ | |
52 | #endif | |
53 | ||
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 | ||
91 | #define ZYNQ_NAND_ROW_ADDR_CYCL_MASK 0x0F | |
92 | #define ZYNQ_NAND_COL_ADDR_CYCL_MASK 0xF0 | |
93 | ||
94 | #define ZYNQ_NAND_MIO_NUM_NAND_8BIT 13 | |
95 | #define ZYNQ_NAND_MIO_NUM_NAND_16BIT 8 | |
96 | ||
97 | enum zynq_nand_bus_width { | |
98 | NAND_BW_UNKNOWN = -1, | |
99 | NAND_BW_8BIT, | |
100 | NAND_BW_16BIT, | |
101 | }; | |
102 | ||
103 | #ifndef NAND_CMD_LOCK_TIGHT | |
104 | #define NAND_CMD_LOCK_TIGHT 0x2c | |
105 | #endif | |
106 | ||
107 | #ifndef NAND_CMD_LOCK_STATUS | |
108 | #define NAND_CMD_LOCK_STATUS 0x7a | |
109 | #endif | |
110 | ||
111 | /* SMC register set */ | |
112 | struct 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 | }; | |
127 | ||
128 | /* | |
129 | * struct nand_config - Defines the NAND flash driver instance | |
130 | * @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 | */ | |
135 | struct nand_config { | |
136 | void __iomem *nand_base; | |
137 | u8 end_cmd_pending; | |
138 | u8 end_cmd; | |
139 | }; | |
140 | ||
141 | struct nand_drv { | |
142 | struct zynq_nand_smc_regs *reg; | |
143 | struct nand_config config; | |
144 | }; | |
145 | ||
146 | struct zynq_nand_info { | |
147 | struct udevice *dev; | |
148 | struct nand_drv nand_ctrl; | |
149 | struct nand_chip nand_chip; | |
150 | }; | |
151 | ||
152 | /* | |
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 | */ | |
159 | struct 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 */ | |
167 | static const struct zynq_nand_command_format zynq_nand_commands[] = { | |
168 | {NAND_CMD_READ0, NAND_CMD_READSTART, 5, ZYNQ_NAND_CMD_PHASE}, | |
169 | {NAND_CMD_RNDOUT, NAND_CMD_RNDOUTSTART, 2, ZYNQ_NAND_CMD_PHASE}, | |
170 | {NAND_CMD_READID, NAND_CMD_NONE, 1, 0}, | |
171 | {NAND_CMD_STATUS, NAND_CMD_NONE, 0, 0}, | |
172 | {NAND_CMD_SEQIN, NAND_CMD_PAGEPROG, 5, ZYNQ_NAND_DATA_PHASE}, | |
173 | {NAND_CMD_RNDIN, NAND_CMD_NONE, 2, 0}, | |
174 | {NAND_CMD_ERASE1, NAND_CMD_ERASE2, 3, ZYNQ_NAND_CMD_PHASE}, | |
175 | {NAND_CMD_RESET, NAND_CMD_NONE, 0, 0}, | |
176 | {NAND_CMD_PARAM, NAND_CMD_NONE, 1, 0}, | |
177 | {NAND_CMD_GET_FEATURES, NAND_CMD_NONE, 1, 0}, | |
178 | {NAND_CMD_SET_FEATURES, NAND_CMD_NONE, 1, 0}, | |
179 | {NAND_CMD_LOCK, NAND_CMD_NONE, 0, 0}, | |
180 | {NAND_CMD_LOCK_TIGHT, NAND_CMD_NONE, 0, 0}, | |
181 | {NAND_CMD_UNLOCK1, NAND_CMD_NONE, 3, 0}, | |
182 | {NAND_CMD_UNLOCK2, NAND_CMD_NONE, 3, 0}, | |
183 | {NAND_CMD_LOCK_STATUS, NAND_CMD_NONE, 3, 0}, | |
184 | {NAND_CMD_NONE, NAND_CMD_NONE, 0, 0}, | |
185 | /* Add all the flash commands supported by the flash device */ | |
186 | }; | |
187 | ||
188 | /* Define default oob placement schemes for large and small page devices */ | |
189 | static struct nand_ecclayout nand_oob_16 = { | |
190 | .eccbytes = 3, | |
191 | .eccpos = {0, 1, 2}, | |
192 | .oobfree = { | |
193 | { .offset = 8, .length = 8 } | |
194 | } | |
195 | }; | |
196 | ||
197 | static 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 | ||
207 | static 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 */ | |
227 | static u8 bbt_pattern[] = {'B', 'b', 't', '0' }; | |
228 | static u8 mirror_pattern[] = {'1', 't', 'b', 'B' }; | |
229 | ||
230 | static 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 | ||
240 | static 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 | */ | |
255 | static int zynq_nand_waitfor_ecc_completion(struct mtd_info *mtd) | |
256 | { | |
257 | struct nand_chip *nand_chip = mtd_to_nand(mtd); | |
258 | struct nand_drv *smc = nand_get_controller_data(nand_chip); | |
259 | unsigned long timeout; | |
260 | u32 status; | |
261 | ||
262 | /* Wait max 10us */ | |
263 | timeout = 10; | |
264 | status = readl(&smc->reg->esr); | |
265 | while (status & ZYNQ_NAND_ECC_BUSY) { | |
266 | status = readl(&smc->reg->esr); | |
267 | if (timeout == 0) | |
268 | return -1; | |
269 | timeout--; | |
270 | udelay(1); | |
271 | } | |
272 | ||
273 | return status; | |
274 | } | |
275 | ||
276 | /* | |
277 | * 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 | */ | |
284 | static int zynq_nand_init_nand_flash(struct mtd_info *mtd, int option) | |
285 | { | |
286 | struct nand_chip *nand_chip = mtd_to_nand(mtd); | |
287 | struct nand_drv *smc = nand_get_controller_data(nand_chip); | |
288 | u32 status; | |
289 | ||
290 | /* disable interrupts */ | |
291 | writel(ZYNQ_NAND_CLR_CONFIG, &smc->reg->cfr); | |
292 | #ifndef CONFIG_NAND_ZYNQ_USE_BOOTLOADER1_TIMINGS | |
293 | /* Initialize the NAND interface by setting cycles and operation mode */ | |
294 | writel(ZYNQ_NAND_SET_CYCLES, &smc->reg->scr); | |
295 | #endif | |
296 | if (option & NAND_BUSWIDTH_16) | |
297 | writel(ZYNQ_NAND_SET_OPMODE_16BIT, &smc->reg->sor); | |
298 | else | |
299 | writel(ZYNQ_NAND_SET_OPMODE_8BIT, &smc->reg->sor); | |
300 | ||
301 | writel(ZYNQ_NAND_DIRECT_CMD, &smc->reg->dcr); | |
302 | ||
303 | /* Wait till the ECC operation is complete */ | |
304 | status = zynq_nand_waitfor_ecc_completion(mtd); | |
305 | if (status < 0) { | |
306 | printf("%s: Timeout\n", __func__); | |
307 | return status; | |
308 | } | |
309 | ||
310 | /* Set the command1 and command2 register */ | |
311 | writel(ZYNQ_NAND_ECC_CMD1, &smc->reg->emcmd1r); | |
312 | writel(ZYNQ_NAND_ECC_CMD2, &smc->reg->emcmd2r); | |
313 | ||
314 | return 0; | |
315 | } | |
316 | ||
317 | /* | |
318 | * 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 | */ | |
328 | static int zynq_nand_calculate_hwecc(struct mtd_info *mtd, const u8 *data, | |
329 | u8 *ecc_code) | |
330 | { | |
331 | struct nand_chip *nand_chip = mtd_to_nand(mtd); | |
332 | struct nand_drv *smc = nand_get_controller_data(nand_chip); | |
333 | u32 ecc_value = 0; | |
334 | u8 ecc_reg, ecc_byte; | |
335 | u32 ecc_status; | |
336 | ||
337 | /* Wait till the ECC operation is complete */ | |
338 | ecc_status = zynq_nand_waitfor_ecc_completion(mtd); | |
339 | if (ecc_status < 0) { | |
340 | printf("%s: Timeout\n", __func__); | |
341 | return ecc_status; | |
342 | } | |
343 | ||
344 | for (ecc_reg = 0; ecc_reg < 4; ecc_reg++) { | |
345 | /* Read ECC value for each block */ | |
346 | ecc_value = readl(&smc->reg->eval0r + ecc_reg); | |
347 | ||
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 | */ | |
376 | static 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 | */ | |
397 | static 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 | */ | |
441 | static 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 | */ | |
468 | static 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 | */ | |
501 | static 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 | ||
522 | static 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 | ||
529 | static 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 | */ | |
549 | static 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 | */ | |
581 | static 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 | */ | |
639 | static 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 | */ | |
672 | static 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 | */ | |
744 | static 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 | */ | |
786 | static 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 | */ | |
798 | static void zynq_nand_cmd_function(struct mtd_info *mtd, unsigned int command, | |
799 | int column, int page_addr) | |
800 | { | |
801 | struct nand_chip *chip = mtd_to_nand(mtd); | |
802 | struct nand_drv *smc = nand_get_controller_data(chip); | |
803 | const struct zynq_nand_command_format *curr_cmd = NULL; | |
804 | u8 addr_cycles = 0; | |
805 | struct nand_config *xnand = &smc->config; | |
806 | void *cmd_addr; | |
807 | unsigned long cmd_data = 0; | |
808 | unsigned long cmd_phase_addr = 0; | |
809 | unsigned long data_phase_addr = 0; | |
810 | u8 end_cmd = 0; | |
811 | u8 end_cmd_valid = 0; | |
812 | u32 index; | |
813 | ||
814 | if (xnand->end_cmd_pending) { | |
815 | /* 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 */ | |
844 | writel(ZYNQ_MEMC_CLRCR_INT_CLR1, &smc->reg->cfr); | |
845 | ||
846 | /* Get the command phase address */ | |
847 | if (curr_cmd->end_cmd_valid == ZYNQ_NAND_CMD_PHASE) | |
848 | end_cmd_valid = 1; | |
849 | ||
850 | if (curr_cmd->end_cmd == (u8)NAND_CMD_NONE) | |
851 | end_cmd = 0x0; | |
852 | else | |
853 | end_cmd = curr_cmd->end_cmd; | |
854 | ||
855 | if (command == NAND_CMD_READ0 || | |
856 | command == NAND_CMD_SEQIN) { | |
857 | addr_cycles = chip->onfi_params.addr_cycles & | |
858 | ZYNQ_NAND_ROW_ADDR_CYCL_MASK; | |
859 | addr_cycles += ((chip->onfi_params.addr_cycles & | |
860 | ZYNQ_NAND_COL_ADDR_CYCL_MASK) >> 4); | |
861 | } else { | |
862 | addr_cycles = curr_cmd->addr_cycles; | |
863 | } | |
864 | ||
865 | cmd_phase_addr = (unsigned long)xnand->nand_base | | |
866 | (addr_cycles << ADDR_CYCLES_SHIFT) | | |
867 | (end_cmd_valid << END_CMD_VALID_SHIFT) | | |
868 | (COMMAND_PHASE) | | |
869 | (end_cmd << END_CMD_SHIFT) | | |
870 | (curr_cmd->start_cmd << START_CMD_SHIFT); | |
871 | ||
872 | cmd_addr = (void __iomem *)cmd_phase_addr; | |
873 | ||
874 | /* 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 | */ | |
939 | static void zynq_nand_read_buf(struct mtd_info *mtd, u8 *buf, int len) | |
940 | { | |
941 | struct nand_chip *chip = mtd_to_nand(mtd); | |
942 | ||
943 | /* 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 | */ | |
987 | static void zynq_nand_write_buf(struct mtd_info *mtd, const u8 *buf, int len) | |
988 | { | |
989 | struct nand_chip *chip = mtd_to_nand(mtd); | |
990 | const u32 *nand = chip->IO_ADDR_W; | |
991 | ||
992 | /* 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 | */ | |
1037 | static int zynq_nand_device_ready(struct mtd_info *mtd) | |
1038 | { | |
1039 | struct nand_chip *nand_chip = mtd_to_nand(mtd); | |
1040 | struct nand_drv *smc = nand_get_controller_data(nand_chip); | |
1041 | u32 csr_val; | |
1042 | ||
1043 | csr_val = readl(&smc->reg->csr); | |
1044 | /* Check the raw_int_status1 bit */ | |
1045 | if (csr_val & ZYNQ_MEMC_SR_RAW_INT_ST1) { | |
1046 | /* Clear the interrupt condition */ | |
1047 | writel(ZYNQ_MEMC_SR_INT_ST1, &smc->reg->cfr); | |
1048 | return 1; | |
1049 | } | |
1050 | ||
1051 | return 0; | |
1052 | } | |
1053 | ||
1054 | static 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 | ||
1071 | static int zynq_nand_probe(struct udevice *dev) | |
1072 | { | |
1073 | struct zynq_nand_info *zynq = dev_get_priv(dev); | |
1074 | struct nand_chip *nand_chip = &zynq->nand_chip; | |
1075 | struct nand_drv *smc = &zynq->nand_ctrl; | |
1076 | struct nand_config *xnand = &smc->config; | |
1077 | struct mtd_info *mtd; | |
1078 | struct resource res; | |
1079 | ofnode of_nand; | |
1080 | unsigned long ecc_page_size; | |
1081 | u8 maf_id, dev_id, i; | |
1082 | u8 get_feature[4]; | |
1083 | u8 set_feature[4] = {ONDIE_ECC_FEATURE_ENABLE, 0x00, 0x00, 0x00}; | |
1084 | unsigned long ecc_cfg; | |
1085 | int ondie_ecc_enabled = 0; | |
1086 | int is_16bit_bw; | |
1087 | ||
1088 | smc->reg = (struct zynq_nand_smc_regs *)dev_read_addr(dev); | |
1089 | of_nand = dev_read_subnode(dev, "flash@e1000000"); | |
1090 | if (!ofnode_valid(of_nand)) { | |
1091 | printf("Failed to find nand node in dt\n"); | |
1092 | return -ENODEV; | |
1093 | } | |
1094 | ||
1095 | if (!ofnode_is_available(of_nand)) { | |
1096 | debug("Nand node in dt disabled\n"); | |
1097 | return dm_scan_fdt_dev(dev); | |
1098 | } | |
1099 | ||
1100 | if (ofnode_read_resource(of_nand, 0, &res)) { | |
1101 | printf("Failed to get nand resource\n"); | |
1102 | return -ENODEV; | |
1103 | } | |
1104 | ||
1105 | xnand->nand_base = (void __iomem *)res.start; | |
1106 | mtd = nand_to_mtd(nand_chip); | |
1107 | nand_set_controller_data(nand_chip, &zynq->nand_ctrl); | |
1108 | ||
1109 | /* 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 | ||
1125 | is_16bit_bw = zynq_nand_check_is_16bit_bw_flash(); | |
1126 | if (is_16bit_bw == NAND_BW_UNKNOWN) { | |
1127 | printf("%s: Unable detect NAND based on MIO settings\n", | |
1128 | __func__); | |
1129 | return -EINVAL; | |
1130 | } | |
1131 | ||
1132 | if (is_16bit_bw == NAND_BW_16BIT) | |
1133 | nand_chip->options = NAND_BUSWIDTH_16; | |
1134 | ||
1135 | nand_chip->bbt_options = NAND_BBT_USE_FLASH; | |
1136 | ||
1137 | /* Initialize the NAND flash interface on NAND controller */ | |
1138 | if (zynq_nand_init_nand_flash(mtd, nand_chip->options) < 0) { | |
1139 | printf("%s: nand flash init failed\n", __func__); | |
1140 | return -EINVAL; | |
1141 | } | |
1142 | ||
1143 | /* 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__); | |
1146 | return -EINVAL; | |
1147 | } | |
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 */ | |
1186 | ecc_cfg = readl(&smc->reg->emcr); | |
1187 | ecc_cfg &= ~ZYNQ_MEMC_NAND_ECC_MODE_MASK; | |
1188 | writel(ecc_cfg, &smc->reg->emcr); | |
1189 | ||
1190 | /* 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), | |
1236 | &smc->reg->emcr); | |
1237 | 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), | |
1242 | &smc->reg->emcr); | |
1243 | 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), | |
1248 | &smc->reg->emcr); | |
1249 | 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__); | |
1271 | return -EINVAL; | |
1272 | } | |
1273 | if (nand_register(0, mtd)) | |
1274 | return -EINVAL; | |
1275 | ||
1276 | return 0; | |
1277 | } | |
1278 | ||
1279 | static const struct udevice_id zynq_nand_dt_ids[] = { | |
1280 | {.compatible = "arm,pl353-smc-r2p1",}, | |
1281 | { /* sentinel */ } | |
1282 | }; | |
1283 | ||
1284 | U_BOOT_DRIVER(zynq_nand) = { | |
1285 | .name = "zynq_nand", | |
1286 | .id = UCLASS_MTD, | |
1287 | .of_match = zynq_nand_dt_ids, | |
1288 | .probe = zynq_nand_probe, | |
1289 | .priv_auto = sizeof(struct zynq_nand_info), | |
1290 | }; | |
1291 | ||
1292 | void board_nand_init(void) | |
1293 | { | |
1294 | struct udevice *dev; | |
1295 | int ret; | |
1296 | ||
1297 | ret = uclass_get_device_by_driver(UCLASS_MTD, | |
1298 | DM_DRIVER_GET(zynq_nand), &dev); | |
1299 | if (ret && ret != -ENODEV) | |
1300 | pr_err("Failed to initialize %s. (error %d)\n", dev->name, ret); | |
1301 | } |