blob: a4d5a6205f38566f3647a6b05ca237229104a877 [file] [log] [blame]
Stefan Agner72d7bea2014-09-12 13:06:35 +02001/*
Stefan Agnere24bb2b2015-10-13 22:11:42 -07002 * Copyright 2009-2015 Freescale Semiconductor, Inc. and others
Stefan Agner72d7bea2014-09-12 13:06:35 +02003 *
4 * Description: MPC5125, VF610, MCF54418 and Kinetis K70 Nand driver.
5 * Ported to U-Boot by Stefan Agner
6 * Based on RFC driver posted on Kernel Mailing list by Bill Pringlemeir
7 * Jason ported to M54418TWR and MVFA5.
8 * Authors: Stefan Agner <stefan.agner@toradex.com>
9 * Bill Pringlemeir <bpringlemeir@nbsps.com>
10 * Shaohui Xie <b21989@freescale.com>
11 * Jason Jin <Jason.jin@freescale.com>
12 *
13 * Based on original driver mpc5121_nfc.c.
14 *
Tom Rini5b8031c2016-01-14 22:05:13 -050015 * SPDX-License-Identifier: GPL-2.0+
Stefan Agner72d7bea2014-09-12 13:06:35 +020016 *
17 * Limitations:
18 * - Untested on MPC5125 and M54418.
Stefan Agnere24bb2b2015-10-13 22:11:42 -070019 * - DMA and pipelining not used.
Stefan Agner72d7bea2014-09-12 13:06:35 +020020 * - 2K pages or less.
Stefan Agnere24bb2b2015-10-13 22:11:42 -070021 * - HW ECC: Only 2K page with 64+ OOB.
22 * - HW ECC: Only 24 and 32-bit error correction implemented.
Stefan Agner72d7bea2014-09-12 13:06:35 +020023 */
24
25#include <common.h>
26#include <malloc.h>
27
28#include <linux/mtd/mtd.h>
29#include <linux/mtd/nand.h>
30#include <linux/mtd/partitions.h>
31
32#include <nand.h>
33#include <errno.h>
34#include <asm/io.h>
35
36/* Register Offsets */
37#define NFC_FLASH_CMD1 0x3F00
38#define NFC_FLASH_CMD2 0x3F04
39#define NFC_COL_ADDR 0x3F08
40#define NFC_ROW_ADDR 0x3F0c
41#define NFC_ROW_ADDR_INC 0x3F14
42#define NFC_FLASH_STATUS1 0x3F18
43#define NFC_FLASH_STATUS2 0x3F1c
44#define NFC_CACHE_SWAP 0x3F28
45#define NFC_SECTOR_SIZE 0x3F2c
46#define NFC_FLASH_CONFIG 0x3F30
47#define NFC_IRQ_STATUS 0x3F38
48
49/* Addresses for NFC MAIN RAM BUFFER areas */
50#define NFC_MAIN_AREA(n) ((n) * 0x1000)
51
52#define PAGE_2K 0x0800
53#define OOB_64 0x0040
Stefan Agnere24bb2b2015-10-13 22:11:42 -070054#define OOB_MAX 0x0100
Stefan Agner72d7bea2014-09-12 13:06:35 +020055
56/*
57 * NFC_CMD2[CODE] values. See section:
58 * - 31.4.7 Flash Command Code Description, Vybrid manual
59 * - 23.8.6 Flash Command Sequencer, MPC5125 manual
60 *
61 * Briefly these are bitmasks of controller cycles.
62 */
63#define READ_PAGE_CMD_CODE 0x7EE0
Stefan Agner8fca2d82015-05-08 19:07:13 +020064#define READ_ONFI_PARAM_CMD_CODE 0x4860
Stefan Agner72d7bea2014-09-12 13:06:35 +020065#define PROGRAM_PAGE_CMD_CODE 0x7FC0
66#define ERASE_CMD_CODE 0x4EC0
67#define READ_ID_CMD_CODE 0x4804
68#define RESET_CMD_CODE 0x4040
69#define STATUS_READ_CMD_CODE 0x4068
70
71/* NFC ECC mode define */
72#define ECC_BYPASS 0
73#define ECC_45_BYTE 6
Stefan Agner080a71e2015-05-08 19:07:12 +020074#define ECC_60_BYTE 7
Stefan Agner72d7bea2014-09-12 13:06:35 +020075
76/*** Register Mask and bit definitions */
77
78/* NFC_FLASH_CMD1 Field */
79#define CMD_BYTE2_MASK 0xFF000000
80#define CMD_BYTE2_SHIFT 24
81
82/* NFC_FLASH_CM2 Field */
83#define CMD_BYTE1_MASK 0xFF000000
84#define CMD_BYTE1_SHIFT 24
85#define CMD_CODE_MASK 0x00FFFF00
86#define CMD_CODE_SHIFT 8
87#define BUFNO_MASK 0x00000006
88#define BUFNO_SHIFT 1
89#define START_BIT (1<<0)
90
91/* NFC_COL_ADDR Field */
92#define COL_ADDR_MASK 0x0000FFFF
93#define COL_ADDR_SHIFT 0
94
95/* NFC_ROW_ADDR Field */
96#define ROW_ADDR_MASK 0x00FFFFFF
97#define ROW_ADDR_SHIFT 0
98#define ROW_ADDR_CHIP_SEL_RB_MASK 0xF0000000
99#define ROW_ADDR_CHIP_SEL_RB_SHIFT 28
100#define ROW_ADDR_CHIP_SEL_MASK 0x0F000000
101#define ROW_ADDR_CHIP_SEL_SHIFT 24
102
103/* NFC_FLASH_STATUS2 Field */
104#define STATUS_BYTE1_MASK 0x000000FF
105
106/* NFC_FLASH_CONFIG Field */
107#define CONFIG_ECC_SRAM_ADDR_MASK 0x7FC00000
108#define CONFIG_ECC_SRAM_ADDR_SHIFT 22
109#define CONFIG_ECC_SRAM_REQ_BIT (1<<21)
110#define CONFIG_DMA_REQ_BIT (1<<20)
111#define CONFIG_ECC_MODE_MASK 0x000E0000
112#define CONFIG_ECC_MODE_SHIFT 17
113#define CONFIG_FAST_FLASH_BIT (1<<16)
114#define CONFIG_16BIT (1<<7)
115#define CONFIG_BOOT_MODE_BIT (1<<6)
116#define CONFIG_ADDR_AUTO_INCR_BIT (1<<5)
117#define CONFIG_BUFNO_AUTO_INCR_BIT (1<<4)
118#define CONFIG_PAGE_CNT_MASK 0xF
119#define CONFIG_PAGE_CNT_SHIFT 0
120
121/* NFC_IRQ_STATUS Field */
122#define IDLE_IRQ_BIT (1<<29)
123#define IDLE_EN_BIT (1<<20)
124#define CMD_DONE_CLEAR_BIT (1<<18)
125#define IDLE_CLEAR_BIT (1<<17)
126
127#define NFC_TIMEOUT (1000)
128
Stefan Agner72d7bea2014-09-12 13:06:35 +0200129/*
Stefan Agnere24bb2b2015-10-13 22:11:42 -0700130 * ECC status - seems to consume 8 bytes (double word). The documented
131 * status byte is located in the lowest byte of the second word (which is
132 * the 4th or 7th byte depending on endianness).
133 * Calculate an offset to store the ECC status at the end of the buffer.
Stefan Agner72d7bea2014-09-12 13:06:35 +0200134 */
Stefan Agnere24bb2b2015-10-13 22:11:42 -0700135#define ECC_SRAM_ADDR (PAGE_2K + OOB_MAX - 8)
136
137#define ECC_STATUS 0x4
138#define ECC_STATUS_MASK 0x80
139#define ECC_STATUS_ERR_COUNT 0x3F
140
141enum vf610_nfc_alt_buf {
142 ALT_BUF_DATA = 0,
143 ALT_BUF_ID = 1,
144 ALT_BUF_STAT = 2,
145 ALT_BUF_ONFI = 3,
146};
Stefan Agner72d7bea2014-09-12 13:06:35 +0200147
148struct vf610_nfc {
Stefan Agnere24bb2b2015-10-13 22:11:42 -0700149 struct mtd_info *mtd;
150 struct nand_chip chip;
151 void __iomem *regs;
152 uint buf_offset;
153 int write_sz;
Stefan Agner72d7bea2014-09-12 13:06:35 +0200154 /* Status and ID are in alternate locations. */
Stefan Agnere24bb2b2015-10-13 22:11:42 -0700155 enum vf610_nfc_alt_buf alt_buf;
Stefan Agner72d7bea2014-09-12 13:06:35 +0200156};
157
Scott Wood17cb4b82016-05-30 13:57:56 -0500158#define mtd_to_nfc(_mtd) nand_get_controller_data(mtd_to_nand(_mtd))
Stefan Agner72d7bea2014-09-12 13:06:35 +0200159
Stefan Agner080a71e2015-05-08 19:07:12 +0200160#if defined(CONFIG_SYS_NAND_VF610_NFC_45_ECC_BYTES)
161#define ECC_HW_MODE ECC_45_BYTE
162
163static struct nand_ecclayout vf610_nfc_ecc = {
Stefan Agner72d7bea2014-09-12 13:06:35 +0200164 .eccbytes = 45,
165 .eccpos = {19, 20, 21, 22, 23,
166 24, 25, 26, 27, 28, 29, 30, 31,
167 32, 33, 34, 35, 36, 37, 38, 39,
168 40, 41, 42, 43, 44, 45, 46, 47,
169 48, 49, 50, 51, 52, 53, 54, 55,
170 56, 57, 58, 59, 60, 61, 62, 63},
171 .oobfree = {
Stefan Agnere24bb2b2015-10-13 22:11:42 -0700172 {.offset = 2,
173 .length = 17} }
Stefan Agner72d7bea2014-09-12 13:06:35 +0200174};
Stefan Agner080a71e2015-05-08 19:07:12 +0200175#elif defined(CONFIG_SYS_NAND_VF610_NFC_60_ECC_BYTES)
176#define ECC_HW_MODE ECC_60_BYTE
177
178static struct nand_ecclayout vf610_nfc_ecc = {
179 .eccbytes = 60,
180 .eccpos = { 4, 5, 6, 7, 8, 9, 10, 11,
181 12, 13, 14, 15, 16, 17, 18, 19,
182 20, 21, 22, 23, 24, 25, 26, 27,
183 28, 29, 30, 31, 32, 33, 34, 35,
184 36, 37, 38, 39, 40, 41, 42, 43,
185 44, 45, 46, 47, 48, 49, 50, 51,
186 52, 53, 54, 55, 56, 57, 58, 59,
187 60, 61, 62, 63 },
188 .oobfree = {
189 {.offset = 2,
190 .length = 2} }
191};
192#endif
Stefan Agner72d7bea2014-09-12 13:06:35 +0200193
194static inline u32 vf610_nfc_read(struct mtd_info *mtd, uint reg)
195{
196 struct vf610_nfc *nfc = mtd_to_nfc(mtd);
197
198 return readl(nfc->regs + reg);
199}
200
201static inline void vf610_nfc_write(struct mtd_info *mtd, uint reg, u32 val)
202{
203 struct vf610_nfc *nfc = mtd_to_nfc(mtd);
204
205 writel(val, nfc->regs + reg);
206}
207
208static inline void vf610_nfc_set(struct mtd_info *mtd, uint reg, u32 bits)
209{
210 vf610_nfc_write(mtd, reg, vf610_nfc_read(mtd, reg) | bits);
211}
212
213static inline void vf610_nfc_clear(struct mtd_info *mtd, uint reg, u32 bits)
214{
215 vf610_nfc_write(mtd, reg, vf610_nfc_read(mtd, reg) & ~bits);
216}
217
218static inline void vf610_nfc_set_field(struct mtd_info *mtd, u32 reg,
219 u32 mask, u32 shift, u32 val)
220{
221 vf610_nfc_write(mtd, reg,
222 (vf610_nfc_read(mtd, reg) & (~mask)) | val << shift);
223}
224
225static inline void vf610_nfc_memcpy(void *dst, const void *src, size_t n)
226{
227 /*
Stefan Agnere24bb2b2015-10-13 22:11:42 -0700228 * Use this accessor for the internal SRAM buffers. On the ARM
229 * Freescale Vybrid SoC it's known that the driver can treat
230 * the SRAM buffer as if it's memory. Other platform might need
231 * to treat the buffers differently.
232 *
233 * For the time being, use memcpy
Stefan Agner72d7bea2014-09-12 13:06:35 +0200234 */
235 memcpy(dst, src, n);
236}
237
238/* Clear flags for upcoming command */
239static inline void vf610_nfc_clear_status(void __iomem *regbase)
240{
241 void __iomem *reg = regbase + NFC_IRQ_STATUS;
242 u32 tmp = __raw_readl(reg);
243 tmp |= CMD_DONE_CLEAR_BIT | IDLE_CLEAR_BIT;
244 __raw_writel(tmp, reg);
245}
246
247/* Wait for complete operation */
Stefan Agnere24bb2b2015-10-13 22:11:42 -0700248static void vf610_nfc_done(struct mtd_info *mtd)
Stefan Agner72d7bea2014-09-12 13:06:35 +0200249{
250 struct vf610_nfc *nfc = mtd_to_nfc(mtd);
251 uint start;
252
253 /*
254 * Barrier is needed after this write. This write need
255 * to be done before reading the next register the first
256 * time.
257 * vf610_nfc_set implicates such a barrier by using writel
258 * to write to the register.
259 */
260 vf610_nfc_set(mtd, NFC_FLASH_CMD2, START_BIT);
261
262 start = get_timer(0);
263
264 while (!(vf610_nfc_read(mtd, NFC_IRQ_STATUS) & IDLE_IRQ_BIT)) {
265 if (get_timer(start) > NFC_TIMEOUT) {
Stefan Agnere24bb2b2015-10-13 22:11:42 -0700266 printf("Timeout while waiting for IDLE.\n");
Stefan Agner72d7bea2014-09-12 13:06:35 +0200267 return;
268 }
269 }
270 vf610_nfc_clear_status(nfc->regs);
271}
272
273static u8 vf610_nfc_get_id(struct mtd_info *mtd, int col)
274{
275 u32 flash_id;
276
277 if (col < 4) {
278 flash_id = vf610_nfc_read(mtd, NFC_FLASH_STATUS1);
Stefan Agnere24bb2b2015-10-13 22:11:42 -0700279 flash_id >>= (3 - col) * 8;
Stefan Agner72d7bea2014-09-12 13:06:35 +0200280 } else {
281 flash_id = vf610_nfc_read(mtd, NFC_FLASH_STATUS2);
Stefan Agnere24bb2b2015-10-13 22:11:42 -0700282 flash_id >>= 24;
Stefan Agner72d7bea2014-09-12 13:06:35 +0200283 }
Stefan Agnere24bb2b2015-10-13 22:11:42 -0700284
285 return flash_id & 0xff;
Stefan Agner72d7bea2014-09-12 13:06:35 +0200286}
287
288static u8 vf610_nfc_get_status(struct mtd_info *mtd)
289{
290 return vf610_nfc_read(mtd, NFC_FLASH_STATUS2) & STATUS_BYTE1_MASK;
291}
292
293/* Single command */
294static void vf610_nfc_send_command(void __iomem *regbase, u32 cmd_byte1,
295 u32 cmd_code)
296{
297 void __iomem *reg = regbase + NFC_FLASH_CMD2;
298 u32 tmp;
299 vf610_nfc_clear_status(regbase);
300
301 tmp = __raw_readl(reg);
302 tmp &= ~(CMD_BYTE1_MASK | CMD_CODE_MASK | BUFNO_MASK);
303 tmp |= cmd_byte1 << CMD_BYTE1_SHIFT;
304 tmp |= cmd_code << CMD_CODE_SHIFT;
305 __raw_writel(tmp, reg);
306}
307
308/* Two commands */
309static void vf610_nfc_send_commands(void __iomem *regbase, u32 cmd_byte1,
310 u32 cmd_byte2, u32 cmd_code)
311{
312 void __iomem *reg = regbase + NFC_FLASH_CMD1;
313 u32 tmp;
314 vf610_nfc_send_command(regbase, cmd_byte1, cmd_code);
315
316 tmp = __raw_readl(reg);
317 tmp &= ~CMD_BYTE2_MASK;
318 tmp |= cmd_byte2 << CMD_BYTE2_SHIFT;
319 __raw_writel(tmp, reg);
320}
321
322static void vf610_nfc_addr_cycle(struct mtd_info *mtd, int column, int page)
323{
324 if (column != -1) {
325 struct vf610_nfc *nfc = mtd_to_nfc(mtd);
Stefan Agner5dec2862015-05-08 19:07:09 +0200326 if (nfc->chip.options & NAND_BUSWIDTH_16)
327 column = column / 2;
Stefan Agner72d7bea2014-09-12 13:06:35 +0200328 vf610_nfc_set_field(mtd, NFC_COL_ADDR, COL_ADDR_MASK,
329 COL_ADDR_SHIFT, column);
330 }
331 if (page != -1)
332 vf610_nfc_set_field(mtd, NFC_ROW_ADDR, ROW_ADDR_MASK,
333 ROW_ADDR_SHIFT, page);
334}
335
Stefan Agner5dec2862015-05-08 19:07:09 +0200336static inline void vf610_nfc_ecc_mode(struct mtd_info *mtd, int ecc_mode)
337{
338 vf610_nfc_set_field(mtd, NFC_FLASH_CONFIG,
339 CONFIG_ECC_MODE_MASK,
340 CONFIG_ECC_MODE_SHIFT, ecc_mode);
341}
342
Stefan Agner55765b12015-03-24 17:54:20 +0100343static inline void vf610_nfc_transfer_size(void __iomem *regbase, int size)
344{
345 __raw_writel(size, regbase + NFC_SECTOR_SIZE);
346}
347
Stefan Agner72d7bea2014-09-12 13:06:35 +0200348/* Send command to NAND chip */
349static void vf610_nfc_command(struct mtd_info *mtd, unsigned command,
350 int column, int page)
351{
352 struct vf610_nfc *nfc = mtd_to_nfc(mtd);
Stefan Agnere24bb2b2015-10-13 22:11:42 -0700353 int trfr_sz = nfc->chip.options & NAND_BUSWIDTH_16 ? 1 : 0;
Stefan Agner72d7bea2014-09-12 13:06:35 +0200354
Stefan Agnere24bb2b2015-10-13 22:11:42 -0700355 nfc->buf_offset = max(column, 0);
356 nfc->alt_buf = ALT_BUF_DATA;
Stefan Agner72d7bea2014-09-12 13:06:35 +0200357
358 switch (command) {
Stefan Agner6fcfd1e2015-05-08 19:07:07 +0200359 case NAND_CMD_SEQIN:
360 /* Use valid column/page from preread... */
361 vf610_nfc_addr_cycle(mtd, column, page);
Stefan Agnere24bb2b2015-10-13 22:11:42 -0700362 nfc->buf_offset = 0;
363
Stefan Agner6fcfd1e2015-05-08 19:07:07 +0200364 /*
365 * SEQIN => data => PAGEPROG sequence is done by the controller
366 * hence we do not need to issue the command here...
367 */
368 return;
Stefan Agner72d7bea2014-09-12 13:06:35 +0200369 case NAND_CMD_PAGEPROG:
Stefan Agnere24bb2b2015-10-13 22:11:42 -0700370 trfr_sz += nfc->write_sz;
371 vf610_nfc_ecc_mode(mtd, ECC_HW_MODE);
372 vf610_nfc_transfer_size(nfc->regs, trfr_sz);
Stefan Agner72d7bea2014-09-12 13:06:35 +0200373 vf610_nfc_send_commands(nfc->regs, NAND_CMD_SEQIN,
374 command, PROGRAM_PAGE_CMD_CODE);
Stefan Agner72d7bea2014-09-12 13:06:35 +0200375 break;
376
377 case NAND_CMD_RESET:
Stefan Agner55765b12015-03-24 17:54:20 +0100378 vf610_nfc_transfer_size(nfc->regs, 0);
Stefan Agner72d7bea2014-09-12 13:06:35 +0200379 vf610_nfc_send_command(nfc->regs, command, RESET_CMD_CODE);
380 break;
Stefan Agner5dec2862015-05-08 19:07:09 +0200381
Stefan Agner72d7bea2014-09-12 13:06:35 +0200382 case NAND_CMD_READOOB:
Stefan Agnere24bb2b2015-10-13 22:11:42 -0700383 trfr_sz += mtd->oobsize;
Stefan Agner5dec2862015-05-08 19:07:09 +0200384 column = mtd->writesize;
Stefan Agnere24bb2b2015-10-13 22:11:42 -0700385 vf610_nfc_transfer_size(nfc->regs, trfr_sz);
Stefan Agner72d7bea2014-09-12 13:06:35 +0200386 vf610_nfc_send_commands(nfc->regs, NAND_CMD_READ0,
387 NAND_CMD_READSTART, READ_PAGE_CMD_CODE);
388 vf610_nfc_addr_cycle(mtd, column, page);
Stefan Agner5dec2862015-05-08 19:07:09 +0200389 vf610_nfc_ecc_mode(mtd, ECC_BYPASS);
390 break;
391
392 case NAND_CMD_READ0:
Stefan Agnere24bb2b2015-10-13 22:11:42 -0700393 trfr_sz += mtd->writesize + mtd->oobsize;
394 vf610_nfc_transfer_size(nfc->regs, trfr_sz);
395 vf610_nfc_ecc_mode(mtd, ECC_HW_MODE);
Stefan Agner5dec2862015-05-08 19:07:09 +0200396 vf610_nfc_send_commands(nfc->regs, NAND_CMD_READ0,
397 NAND_CMD_READSTART, READ_PAGE_CMD_CODE);
398 vf610_nfc_addr_cycle(mtd, column, page);
Stefan Agner72d7bea2014-09-12 13:06:35 +0200399 break;
400
Stefan Agner8fca2d82015-05-08 19:07:13 +0200401 case NAND_CMD_PARAM:
402 nfc->alt_buf = ALT_BUF_ONFI;
Stefan Agnere24bb2b2015-10-13 22:11:42 -0700403 trfr_sz = 3 * sizeof(struct nand_onfi_params);
404 vf610_nfc_transfer_size(nfc->regs, trfr_sz);
Stefan Agner8fca2d82015-05-08 19:07:13 +0200405 vf610_nfc_send_command(nfc->regs, NAND_CMD_PARAM,
406 READ_ONFI_PARAM_CMD_CODE);
407 vf610_nfc_set_field(mtd, NFC_ROW_ADDR, ROW_ADDR_MASK,
408 ROW_ADDR_SHIFT, column);
409 vf610_nfc_ecc_mode(mtd, ECC_BYPASS);
410 break;
411
Stefan Agner72d7bea2014-09-12 13:06:35 +0200412 case NAND_CMD_ERASE1:
Stefan Agner55765b12015-03-24 17:54:20 +0100413 vf610_nfc_transfer_size(nfc->regs, 0);
Stefan Agner72d7bea2014-09-12 13:06:35 +0200414 vf610_nfc_send_commands(nfc->regs, command,
415 NAND_CMD_ERASE2, ERASE_CMD_CODE);
416 vf610_nfc_addr_cycle(mtd, column, page);
417 break;
418
419 case NAND_CMD_READID:
420 nfc->alt_buf = ALT_BUF_ID;
Stefan Agnere24bb2b2015-10-13 22:11:42 -0700421 nfc->buf_offset = 0;
Stefan Agner55765b12015-03-24 17:54:20 +0100422 vf610_nfc_transfer_size(nfc->regs, 0);
Stefan Agner72d7bea2014-09-12 13:06:35 +0200423 vf610_nfc_send_command(nfc->regs, command, READ_ID_CMD_CODE);
Stefan Agner8fca2d82015-05-08 19:07:13 +0200424 vf610_nfc_set_field(mtd, NFC_ROW_ADDR, ROW_ADDR_MASK,
425 ROW_ADDR_SHIFT, column);
Stefan Agner72d7bea2014-09-12 13:06:35 +0200426 break;
427
428 case NAND_CMD_STATUS:
429 nfc->alt_buf = ALT_BUF_STAT;
Stefan Agner55765b12015-03-24 17:54:20 +0100430 vf610_nfc_transfer_size(nfc->regs, 0);
Stefan Agnere24bb2b2015-10-13 22:11:42 -0700431 vf610_nfc_send_command(nfc->regs, command, STATUS_READ_CMD_CODE);
Stefan Agner72d7bea2014-09-12 13:06:35 +0200432 break;
433 default:
434 return;
435 }
436
437 vf610_nfc_done(mtd);
Stefan Agnere24bb2b2015-10-13 22:11:42 -0700438
439 nfc->write_sz = 0;
Stefan Agner72d7bea2014-09-12 13:06:35 +0200440}
441
Stefan Agner72d7bea2014-09-12 13:06:35 +0200442/* Read data from NFC buffers */
443static void vf610_nfc_read_buf(struct mtd_info *mtd, u_char *buf, int len)
444{
445 struct vf610_nfc *nfc = mtd_to_nfc(mtd);
Stefan Agnere24bb2b2015-10-13 22:11:42 -0700446 uint c = nfc->buf_offset;
Stefan Agner72d7bea2014-09-12 13:06:35 +0200447
Stefan Agner8fca2d82015-05-08 19:07:13 +0200448 /* Alternate buffers are only supported through read_byte */
449 if (nfc->alt_buf)
450 return;
451
452 vf610_nfc_memcpy(buf, nfc->regs + NFC_MAIN_AREA(0) + c, len);
Stefan Agner72d7bea2014-09-12 13:06:35 +0200453
Stefan Agnere24bb2b2015-10-13 22:11:42 -0700454 nfc->buf_offset += len;
Stefan Agner72d7bea2014-09-12 13:06:35 +0200455}
456
457/* Write data to NFC buffers */
Stefan Agnere24bb2b2015-10-13 22:11:42 -0700458static void vf610_nfc_write_buf(struct mtd_info *mtd, const uint8_t *buf,
Stefan Agner72d7bea2014-09-12 13:06:35 +0200459 int len)
460{
461 struct vf610_nfc *nfc = mtd_to_nfc(mtd);
Stefan Agnere24bb2b2015-10-13 22:11:42 -0700462 uint c = nfc->buf_offset;
Stefan Agner72d7bea2014-09-12 13:06:35 +0200463 uint l;
464
Stefan Agnere24bb2b2015-10-13 22:11:42 -0700465 l = min_t(uint, len, mtd->writesize + mtd->oobsize - c);
Stefan Agner72d7bea2014-09-12 13:06:35 +0200466 vf610_nfc_memcpy(nfc->regs + NFC_MAIN_AREA(0) + c, buf, l);
Stefan Agnere24bb2b2015-10-13 22:11:42 -0700467
468 nfc->write_sz += l;
469 nfc->buf_offset += l;
Stefan Agner72d7bea2014-09-12 13:06:35 +0200470}
471
472/* Read byte from NFC buffers */
Stefan Agnere24bb2b2015-10-13 22:11:42 -0700473static uint8_t vf610_nfc_read_byte(struct mtd_info *mtd)
Stefan Agner72d7bea2014-09-12 13:06:35 +0200474{
Stefan Agner8fca2d82015-05-08 19:07:13 +0200475 struct vf610_nfc *nfc = mtd_to_nfc(mtd);
Stefan Agner72d7bea2014-09-12 13:06:35 +0200476 u8 tmp;
Stefan Agnere24bb2b2015-10-13 22:11:42 -0700477 uint c = nfc->buf_offset;
Stefan Agner8fca2d82015-05-08 19:07:13 +0200478
479 switch (nfc->alt_buf) {
480 case ALT_BUF_ID:
481 tmp = vf610_nfc_get_id(mtd, c);
482 break;
483 case ALT_BUF_STAT:
484 tmp = vf610_nfc_get_status(mtd);
485 break;
Stefan Agner8fca2d82015-05-08 19:07:13 +0200486#ifdef __LITTLE_ENDIAN
Stefan Agnere24bb2b2015-10-13 22:11:42 -0700487 case ALT_BUF_ONFI:
Stefan Agner8fca2d82015-05-08 19:07:13 +0200488 /* Reverse byte since the controller uses big endianness */
Stefan Agnere24bb2b2015-10-13 22:11:42 -0700489 c = nfc->buf_offset ^ 0x3;
490 /* fall-through */
Stefan Agner8fca2d82015-05-08 19:07:13 +0200491#endif
492 default:
493 tmp = *((u8 *)(nfc->regs + NFC_MAIN_AREA(0) + c));
494 break;
495 }
Stefan Agnere24bb2b2015-10-13 22:11:42 -0700496 nfc->buf_offset++;
Stefan Agner72d7bea2014-09-12 13:06:35 +0200497 return tmp;
498}
499
500/* Read word from NFC buffers */
501static u16 vf610_nfc_read_word(struct mtd_info *mtd)
502{
503 u16 tmp;
Stefan Agnere24bb2b2015-10-13 22:11:42 -0700504
Stefan Agner72d7bea2014-09-12 13:06:35 +0200505 vf610_nfc_read_buf(mtd, (u_char *)&tmp, sizeof(tmp));
506 return tmp;
507}
508
509/* If not provided, upper layers apply a fixed delay. */
510static int vf610_nfc_dev_ready(struct mtd_info *mtd)
511{
512 /* NFC handles R/B internally; always ready. */
513 return 1;
514}
515
516/*
517 * This function supports Vybrid only (MPC5125 would have full RB and four CS)
518 */
519static void vf610_nfc_select_chip(struct mtd_info *mtd, int chip)
520{
521#ifdef CONFIG_VF610
522 u32 tmp = vf610_nfc_read(mtd, NFC_ROW_ADDR);
523 tmp &= ~(ROW_ADDR_CHIP_SEL_RB_MASK | ROW_ADDR_CHIP_SEL_MASK);
Stefan Agner72d7bea2014-09-12 13:06:35 +0200524
Stefan Agnere24bb2b2015-10-13 22:11:42 -0700525 if (chip >= 0) {
526 tmp |= 1 << ROW_ADDR_CHIP_SEL_RB_SHIFT;
527 tmp |= (1 << chip) << ROW_ADDR_CHIP_SEL_SHIFT;
528 }
Stefan Agner72d7bea2014-09-12 13:06:35 +0200529
530 vf610_nfc_write(mtd, NFC_ROW_ADDR, tmp);
531#endif
532}
533
534/* Count the number of 0's in buff upto max_bits */
535static inline int count_written_bits(uint8_t *buff, int size, int max_bits)
536{
537 uint32_t *buff32 = (uint32_t *)buff;
538 int k, written_bits = 0;
539
540 for (k = 0; k < (size / 4); k++) {
541 written_bits += hweight32(~buff32[k]);
542 if (written_bits > max_bits)
543 break;
544 }
545
546 return written_bits;
547}
548
Stefan Agnere24bb2b2015-10-13 22:11:42 -0700549static inline int vf610_nfc_correct_data(struct mtd_info *mtd, uint8_t *dat,
550 uint8_t *oob, int page)
Stefan Agner72d7bea2014-09-12 13:06:35 +0200551{
552 struct vf610_nfc *nfc = mtd_to_nfc(mtd);
Stefan Agnere24bb2b2015-10-13 22:11:42 -0700553 u32 ecc_status_off = NFC_MAIN_AREA(0) + ECC_SRAM_ADDR + ECC_STATUS;
Stefan Agner72d7bea2014-09-12 13:06:35 +0200554 u8 ecc_status;
555 u8 ecc_count;
Stefan Agnere24bb2b2015-10-13 22:11:42 -0700556 int flips;
557 int flips_threshold = nfc->chip.ecc.strength / 2;
Stefan Agner72d7bea2014-09-12 13:06:35 +0200558
Stefan Agnere24bb2b2015-10-13 22:11:42 -0700559 ecc_status = vf610_nfc_read(mtd, ecc_status_off) & 0xff;
560 ecc_count = ecc_status & ECC_STATUS_ERR_COUNT;
561
Stefan Agner72d7bea2014-09-12 13:06:35 +0200562 if (!(ecc_status & ECC_STATUS_MASK))
563 return ecc_count;
564
Stefan Agnere24bb2b2015-10-13 22:11:42 -0700565 /* Read OOB without ECC unit enabled */
566 vf610_nfc_command(mtd, NAND_CMD_READOOB, 0, page);
567 vf610_nfc_read_buf(mtd, oob, mtd->oobsize);
Stefan Agner72d7bea2014-09-12 13:06:35 +0200568
Stefan Agnere24bb2b2015-10-13 22:11:42 -0700569 /*
570 * On an erased page, bit count (including OOB) should be zero or
571 * at least less then half of the ECC strength.
572 */
573 flips = count_written_bits(dat, nfc->chip.ecc.size, flips_threshold);
574 flips += count_written_bits(oob, mtd->oobsize, flips_threshold);
575
576 if (unlikely(flips > flips_threshold))
577 return -EINVAL;
Stefan Agner72d7bea2014-09-12 13:06:35 +0200578
579 /* Erased page. */
580 memset(dat, 0xff, nfc->chip.ecc.size);
Stefan Agnere24bb2b2015-10-13 22:11:42 -0700581 memset(oob, 0xff, mtd->oobsize);
582 return flips;
Stefan Agner72d7bea2014-09-12 13:06:35 +0200583}
584
Stefan Agner72d7bea2014-09-12 13:06:35 +0200585static int vf610_nfc_read_page(struct mtd_info *mtd, struct nand_chip *chip,
586 uint8_t *buf, int oob_required, int page)
587{
588 int eccsize = chip->ecc.size;
589 int stat;
Stefan Agner72d7bea2014-09-12 13:06:35 +0200590
Stefan Agnere24bb2b2015-10-13 22:11:42 -0700591 vf610_nfc_read_buf(mtd, buf, eccsize);
Stefan Agner72d7bea2014-09-12 13:06:35 +0200592 if (oob_required)
593 vf610_nfc_read_buf(mtd, chip->oob_poi, mtd->oobsize);
594
Stefan Agnere24bb2b2015-10-13 22:11:42 -0700595 stat = vf610_nfc_correct_data(mtd, buf, chip->oob_poi, page);
Stefan Agner72d7bea2014-09-12 13:06:35 +0200596
Stefan Agnere24bb2b2015-10-13 22:11:42 -0700597 if (stat < 0) {
Stefan Agner72d7bea2014-09-12 13:06:35 +0200598 mtd->ecc_stats.failed++;
Stefan Agnere24bb2b2015-10-13 22:11:42 -0700599 return 0;
600 } else {
Stefan Agner72d7bea2014-09-12 13:06:35 +0200601 mtd->ecc_stats.corrected += stat;
Stefan Agnere24bb2b2015-10-13 22:11:42 -0700602 return stat;
603 }
Stefan Agner72d7bea2014-09-12 13:06:35 +0200604}
605
606/*
607 * ECC will be calculated automatically
608 */
609static int vf610_nfc_write_page(struct mtd_info *mtd, struct nand_chip *chip,
610 const uint8_t *buf, int oob_required)
611{
Stefan Agnere24bb2b2015-10-13 22:11:42 -0700612 struct vf610_nfc *nfc = mtd_to_nfc(mtd);
613
Stefan Agner72d7bea2014-09-12 13:06:35 +0200614 vf610_nfc_write_buf(mtd, buf, mtd->writesize);
615 if (oob_required)
616 vf610_nfc_write_buf(mtd, chip->oob_poi, mtd->oobsize);
617
Stefan Agnere24bb2b2015-10-13 22:11:42 -0700618 /* Always write whole page including OOB due to HW ECC */
619 nfc->write_sz = mtd->writesize + mtd->oobsize;
620
Stefan Agner72d7bea2014-09-12 13:06:35 +0200621 return 0;
622}
623
624struct vf610_nfc_config {
625 int hardware_ecc;
626 int width;
627 int flash_bbt;
628};
629
630static int vf610_nfc_nand_init(int devnum, void __iomem *addr)
631{
Scott Woodb616d9b2016-05-30 13:57:55 -0500632 struct mtd_info *mtd;
Stefan Agner72d7bea2014-09-12 13:06:35 +0200633 struct nand_chip *chip;
634 struct vf610_nfc *nfc;
635 int err = 0;
Stefan Agner72d7bea2014-09-12 13:06:35 +0200636 struct vf610_nfc_config cfg = {
637 .hardware_ecc = 1,
638#ifdef CONFIG_SYS_NAND_BUSWIDTH_16BIT
639 .width = 16,
640#else
641 .width = 8,
642#endif
643 .flash_bbt = 1,
644 };
645
646 nfc = malloc(sizeof(*nfc));
647 if (!nfc) {
648 printf(KERN_ERR "%s: Memory exhausted!\n", __func__);
649 return -ENOMEM;
650 }
651
652 chip = &nfc->chip;
653 nfc->regs = addr;
654
Scott Wood17cb4b82016-05-30 13:57:56 -0500655 mtd = nand_to_mtd(chip);
656 nand_set_controller_data(chip, nfc);
Stefan Agner72d7bea2014-09-12 13:06:35 +0200657
Stefan Agner8fca2d82015-05-08 19:07:13 +0200658 if (cfg.width == 16)
Stefan Agner72d7bea2014-09-12 13:06:35 +0200659 chip->options |= NAND_BUSWIDTH_16;
Stefan Agner8fca2d82015-05-08 19:07:13 +0200660
Stefan Agner72d7bea2014-09-12 13:06:35 +0200661 chip->dev_ready = vf610_nfc_dev_ready;
662 chip->cmdfunc = vf610_nfc_command;
663 chip->read_byte = vf610_nfc_read_byte;
664 chip->read_word = vf610_nfc_read_word;
665 chip->read_buf = vf610_nfc_read_buf;
666 chip->write_buf = vf610_nfc_write_buf;
667 chip->select_chip = vf610_nfc_select_chip;
668
Stefan Agnere24bb2b2015-10-13 22:11:42 -0700669 chip->options |= NAND_NO_SUBPAGE_WRITE;
670
671 chip->ecc.size = PAGE_2K;
Stefan Agner72d7bea2014-09-12 13:06:35 +0200672
Stefan Agner72d7bea2014-09-12 13:06:35 +0200673 /* Set configuration register. */
Stefan Agnere24bb2b2015-10-13 22:11:42 -0700674 vf610_nfc_clear(mtd, NFC_FLASH_CONFIG, CONFIG_16BIT);
Stefan Agner72d7bea2014-09-12 13:06:35 +0200675 vf610_nfc_clear(mtd, NFC_FLASH_CONFIG, CONFIG_ADDR_AUTO_INCR_BIT);
676 vf610_nfc_clear(mtd, NFC_FLASH_CONFIG, CONFIG_BUFNO_AUTO_INCR_BIT);
677 vf610_nfc_clear(mtd, NFC_FLASH_CONFIG, CONFIG_BOOT_MODE_BIT);
678 vf610_nfc_clear(mtd, NFC_FLASH_CONFIG, CONFIG_DMA_REQ_BIT);
679 vf610_nfc_set(mtd, NFC_FLASH_CONFIG, CONFIG_FAST_FLASH_BIT);
680
Stefan Agnere24bb2b2015-10-13 22:11:42 -0700681 /* Disable virtual pages, only one elementary transfer unit */
Stefan Agner72d7bea2014-09-12 13:06:35 +0200682 vf610_nfc_set_field(mtd, NFC_FLASH_CONFIG, CONFIG_PAGE_CNT_MASK,
683 CONFIG_PAGE_CNT_SHIFT, 1);
684
Stefan Agner72d7bea2014-09-12 13:06:35 +0200685 /* first scan to find the device and get the page size */
686 if (nand_scan_ident(mtd, CONFIG_SYS_MAX_NAND_DEVICE, NULL)) {
687 err = -ENXIO;
688 goto error;
689 }
690
Stefan Agner8fca2d82015-05-08 19:07:13 +0200691 if (cfg.width == 16)
692 vf610_nfc_set(mtd, NFC_FLASH_CONFIG, CONFIG_16BIT);
693
Stefan Agnere24bb2b2015-10-13 22:11:42 -0700694 /* Bad block options. */
695 if (cfg.flash_bbt)
696 chip->bbt_options = NAND_BBT_USE_FLASH | NAND_BBT_NO_OOB |
697 NAND_BBT_CREATE;
Stefan Agner72d7bea2014-09-12 13:06:35 +0200698
Stefan Agner72d7bea2014-09-12 13:06:35 +0200699 /* Single buffer only, max 256 OOB minus ECC status */
Stefan Agnere24bb2b2015-10-13 22:11:42 -0700700 if (mtd->writesize + mtd->oobsize > PAGE_2K + OOB_MAX - 8) {
701 dev_err(nfc->dev, "Unsupported flash page size\n");
Stefan Agner72d7bea2014-09-12 13:06:35 +0200702 err = -ENXIO;
703 goto error;
704 }
Stefan Agner72d7bea2014-09-12 13:06:35 +0200705
706 if (cfg.hardware_ecc) {
707 if (mtd->writesize != PAGE_2K && mtd->oobsize < 64) {
708 dev_err(nfc->dev, "Unsupported flash with hwecc\n");
709 err = -ENXIO;
710 goto error;
711 }
712
Stefan Agnere24bb2b2015-10-13 22:11:42 -0700713 if (chip->ecc.size != mtd->writesize) {
714 dev_err(nfc->dev, "ecc size: %d\n", chip->ecc.size);
715 dev_err(nfc->dev, "Step size needs to be page size\n");
716 err = -ENXIO;
717 goto error;
718 }
719
Stefan Agner080a71e2015-05-08 19:07:12 +0200720 /* Current HW ECC layouts only use 64 bytes of OOB */
721 if (mtd->oobsize > 64)
722 mtd->oobsize = 64;
Stefan Agner72d7bea2014-09-12 13:06:35 +0200723
724 /* propagate ecc.layout to mtd_info */
725 mtd->ecclayout = chip->ecc.layout;
726 chip->ecc.read_page = vf610_nfc_read_page;
727 chip->ecc.write_page = vf610_nfc_write_page;
728 chip->ecc.mode = NAND_ECC_HW;
729
Stefan Agner72d7bea2014-09-12 13:06:35 +0200730 chip->ecc.size = PAGE_2K;
Stefan Agner080a71e2015-05-08 19:07:12 +0200731 chip->ecc.layout = &vf610_nfc_ecc;
732#if defined(CONFIG_SYS_NAND_VF610_NFC_45_ECC_BYTES)
Stefan Agner72d7bea2014-09-12 13:06:35 +0200733 chip->ecc.strength = 24;
Stefan Agner080a71e2015-05-08 19:07:12 +0200734 chip->ecc.bytes = 45;
735#elif defined(CONFIG_SYS_NAND_VF610_NFC_60_ECC_BYTES)
736 chip->ecc.strength = 32;
737 chip->ecc.bytes = 60;
738#endif
Stefan Agner72d7bea2014-09-12 13:06:35 +0200739
Stefan Agnere24bb2b2015-10-13 22:11:42 -0700740 /* Set ECC_STATUS offset */
741 vf610_nfc_set_field(mtd, NFC_FLASH_CONFIG,
742 CONFIG_ECC_SRAM_ADDR_MASK,
743 CONFIG_ECC_SRAM_ADDR_SHIFT,
744 ECC_SRAM_ADDR >> 3);
745
746 /* Enable ECC status in SRAM */
Stefan Agner72d7bea2014-09-12 13:06:35 +0200747 vf610_nfc_set(mtd, NFC_FLASH_CONFIG, CONFIG_ECC_SRAM_REQ_BIT);
748 }
749
750 /* second phase scan */
751 err = nand_scan_tail(mtd);
752 if (err)
753 return err;
754
Scott Woodb616d9b2016-05-30 13:57:55 -0500755 err = nand_register(devnum, mtd);
Stefan Agner72d7bea2014-09-12 13:06:35 +0200756 if (err)
757 return err;
758
759 return 0;
760
761error:
762 return err;
763}
764
765void board_nand_init(void)
766{
767 int err = vf610_nfc_nand_init(0, (void __iomem *)CONFIG_SYS_NAND_BASE);
768 if (err)
769 printf("VF610 NAND init failed (err %d)\n", err);
770}