1 // SPDX-License-Identifier: GPL-2.0+
3 * Copyright (C) 2013 Boris BREZILLON <b.brezillon.dev@gmail.com>
4 * Copyright (C) 2015 Roy Spliet <r.spliet@ultimaker.com>
7 * https://github.com/yuq/sunxi-nfc-mtd
8 * Copyright (C) 2013 Qiang Yu <yuq825@gmail.com>
10 * https://github.com/hno/Allwinner-Info
11 * Copyright (C) 2013 Henrik Nordström <Henrik Nordström>
13 * Copyright (C) 2013 Dmitriy B. <rzk333@gmail.com>
14 * Copyright (C) 2013 Sergey Lapin <slapin@ossfans.org>
16 * This program is free software; you can redistribute it and/or modify
17 * it under the terms of the GNU General Public License as published by
18 * the Free Software Foundation; either version 2 of the License, or
19 * (at your option) any later version.
21 * This program is distributed in the hope that it will be useful,
22 * but WITHOUT ANY WARRANTY; without even the implied warranty of
23 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
24 * GNU General Public License for more details.
32 #include <dm/device_compat.h>
33 #include <dm/devres.h>
34 #include <linux/delay.h>
35 #include <linux/err.h>
37 #include <linux/kernel.h>
38 #include <linux/mtd/mtd.h>
39 #include <linux/mtd/rawnand.h>
40 #include <linux/mtd/partitions.h>
44 #include <asm/arch/clock.h>
46 DECLARE_GLOBAL_DATA_PTR;
48 #define NFC_REG_CTL 0x0000
49 #define NFC_REG_ST 0x0004
50 #define NFC_REG_INT 0x0008
51 #define NFC_REG_TIMING_CTL 0x000C
52 #define NFC_REG_TIMING_CFG 0x0010
53 #define NFC_REG_ADDR_LOW 0x0014
54 #define NFC_REG_ADDR_HIGH 0x0018
55 #define NFC_REG_SECTOR_NUM 0x001C
56 #define NFC_REG_CNT 0x0020
57 #define NFC_REG_CMD 0x0024
58 #define NFC_REG_RCMD_SET 0x0028
59 #define NFC_REG_WCMD_SET 0x002C
60 #define NFC_REG_IO_DATA 0x0030
61 #define NFC_REG_ECC_CTL 0x0034
62 #define NFC_REG_ECC_ST 0x0038
63 #define NFC_REG_DEBUG 0x003C
64 #define NFC_REG_ECC_ERR_CNT(x) ((0x0040 + (x)) & ~0x3)
65 #define NFC_REG_USER_DATA(x) (0x0050 + ((x) * 4))
66 #define NFC_REG_SPARE_AREA 0x00A0
67 #define NFC_REG_PAT_ID 0x00A4
68 #define NFC_RAM0_BASE 0x0400
69 #define NFC_RAM1_BASE 0x0800
71 /* define bit use in NFC_CTL */
73 #define NFC_RESET BIT(1)
74 #define NFC_BUS_WIDTH_MSK BIT(2)
75 #define NFC_BUS_WIDTH_8 (0 << 2)
76 #define NFC_BUS_WIDTH_16 (1 << 2)
77 #define NFC_RB_SEL_MSK BIT(3)
78 #define NFC_RB_SEL(x) ((x) << 3)
79 #define NFC_CE_SEL_MSK (0x7 << 24)
80 #define NFC_CE_SEL(x) ((x) << 24)
81 #define NFC_CE_CTL BIT(6)
82 #define NFC_PAGE_SHIFT_MSK (0xf << 8)
83 #define NFC_PAGE_SHIFT(x) (((x) < 10 ? 0 : (x) - 10) << 8)
84 #define NFC_SAM BIT(12)
85 #define NFC_RAM_METHOD BIT(14)
86 #define NFC_DEBUG_CTL BIT(31)
88 /* define bit use in NFC_ST */
89 #define NFC_RB_B2R BIT(0)
90 #define NFC_CMD_INT_FLAG BIT(1)
91 #define NFC_DMA_INT_FLAG BIT(2)
92 #define NFC_CMD_FIFO_STATUS BIT(3)
93 #define NFC_STA BIT(4)
94 #define NFC_NATCH_INT_FLAG BIT(5)
95 #define NFC_RB_STATE(x) BIT(x + 8)
97 /* define bit use in NFC_INT */
98 #define NFC_B2R_INT_ENABLE BIT(0)
99 #define NFC_CMD_INT_ENABLE BIT(1)
100 #define NFC_DMA_INT_ENABLE BIT(2)
101 #define NFC_INT_MASK (NFC_B2R_INT_ENABLE | \
102 NFC_CMD_INT_ENABLE | \
105 /* define bit use in NFC_TIMING_CTL */
106 #define NFC_TIMING_CTL_EDO BIT(8)
108 /* define NFC_TIMING_CFG register layout */
109 #define NFC_TIMING_CFG(tWB, tADL, tWHR, tRHW, tCAD) \
110 (((tWB) & 0x3) | (((tADL) & 0x3) << 2) | \
111 (((tWHR) & 0x3) << 4) | (((tRHW) & 0x3) << 6) | \
112 (((tCAD) & 0x7) << 8))
114 /* define bit use in NFC_CMD */
115 #define NFC_CMD_LOW_BYTE_MSK 0xff
116 #define NFC_CMD_HIGH_BYTE_MSK (0xff << 8)
117 #define NFC_CMD(x) (x)
118 #define NFC_ADR_NUM_MSK (0x7 << 16)
119 #define NFC_ADR_NUM(x) (((x) - 1) << 16)
120 #define NFC_SEND_ADR BIT(19)
121 #define NFC_ACCESS_DIR BIT(20)
122 #define NFC_DATA_TRANS BIT(21)
123 #define NFC_SEND_CMD1 BIT(22)
124 #define NFC_WAIT_FLAG BIT(23)
125 #define NFC_SEND_CMD2 BIT(24)
126 #define NFC_SEQ BIT(25)
127 #define NFC_DATA_SWAP_METHOD BIT(26)
128 #define NFC_ROW_AUTO_INC BIT(27)
129 #define NFC_SEND_CMD3 BIT(28)
130 #define NFC_SEND_CMD4 BIT(29)
131 #define NFC_CMD_TYPE_MSK (0x3 << 30)
132 #define NFC_NORMAL_OP (0 << 30)
133 #define NFC_ECC_OP (1 << 30)
134 #define NFC_PAGE_OP (2 << 30)
136 /* define bit use in NFC_RCMD_SET */
137 #define NFC_READ_CMD_MSK 0xff
138 #define NFC_RND_READ_CMD0_MSK (0xff << 8)
139 #define NFC_RND_READ_CMD1_MSK (0xff << 16)
141 /* define bit use in NFC_WCMD_SET */
142 #define NFC_PROGRAM_CMD_MSK 0xff
143 #define NFC_RND_WRITE_CMD_MSK (0xff << 8)
144 #define NFC_READ_CMD0_MSK (0xff << 16)
145 #define NFC_READ_CMD1_MSK (0xff << 24)
147 /* define bit use in NFC_ECC_CTL */
148 #define NFC_ECC_EN BIT(0)
149 #define NFC_ECC_PIPELINE BIT(3)
150 #define NFC_ECC_EXCEPTION BIT(4)
151 #define NFC_ECC_BLOCK_SIZE_MSK BIT(5)
152 #define NFC_ECC_BLOCK_512 (1 << 5)
153 #define NFC_RANDOM_EN BIT(9)
154 #define NFC_RANDOM_DIRECTION BIT(10)
155 #define NFC_ECC_MODE_MSK (0xf << 12)
156 #define NFC_ECC_MODE(x) ((x) << 12)
157 #define NFC_RANDOM_SEED_MSK (0x7fff << 16)
158 #define NFC_RANDOM_SEED(x) ((x) << 16)
160 /* define bit use in NFC_ECC_ST */
161 #define NFC_ECC_ERR(x) BIT(x)
162 #define NFC_ECC_PAT_FOUND(x) BIT(x + 16)
163 #define NFC_ECC_ERR_CNT(b, x) (((x) >> ((b) * 8)) & 0xff)
165 #define NFC_DEFAULT_TIMEOUT_MS 1000
167 #define NFC_SRAM_SIZE 1024
172 * Ready/Busy detection type: describes the Ready/Busy detection modes
174 * @RB_NONE: no external detection available, rely on STATUS command
175 * and software timeouts
176 * @RB_NATIVE: use sunxi NAND controller Ready/Busy support. The Ready/Busy
177 * pin of the NAND flash chip must be connected to one of the
178 * native NAND R/B pins (those which can be muxed to the NAND
180 * @RB_GPIO: use a simple GPIO to handle Ready/Busy status. The Ready/Busy
181 * pin of the NAND flash chip must be connected to a GPIO capable
184 enum sunxi_nand_rb_type {
191 * Ready/Busy structure: stores information related to Ready/Busy detection
193 * @type: the Ready/Busy detection mode
194 * @info: information related to the R/B detection mode. Either a gpio
195 * id or a native R/B id (those supported by the NAND controller).
197 struct sunxi_nand_rb {
198 enum sunxi_nand_rb_type type;
200 struct gpio_desc gpio;
206 * Chip Select structure: stores information related to NAND Chip Select
208 * @cs: the NAND CS id used to communicate with a NAND Chip
209 * @rb: the Ready/Busy description
211 struct sunxi_nand_chip_sel {
213 struct sunxi_nand_rb rb;
217 * sunxi HW ECC infos: stores information related to HW ECC support
219 * @mode: the sunxi ECC mode field deduced from ECC requirements
220 * @layout: the OOB layout depending on the ECC requirements and the
223 struct sunxi_nand_hw_ecc {
225 struct nand_ecclayout layout;
229 * NAND chip structure: stores NAND chip device related information
231 * @node: used to store NAND chips into a list
232 * @nand: base NAND chip structure
233 * @mtd: base MTD structure
234 * @clk_rate: clk_rate required for this NAND chip
235 * @timing_cfg TIMING_CFG register value for this NAND chip
236 * @selected: current active CS
237 * @nsels: number of CS lines required by the NAND chip
238 * @sels: array of CS lines descriptions
240 struct sunxi_nand_chip {
241 struct list_head node;
242 struct nand_chip nand;
243 unsigned long clk_rate;
252 struct sunxi_nand_chip_sel sels[0];
255 static inline struct sunxi_nand_chip *to_sunxi_nand(struct nand_chip *nand)
257 return container_of(nand, struct sunxi_nand_chip, nand);
261 * NAND Controller structure: stores sunxi NAND controller information
263 * @controller: base controller structure
264 * @dev: parent device (used to print error messages)
265 * @regs: NAND controller registers
266 * @ahb_clk: NAND Controller AHB clock
267 * @mod_clk: NAND Controller mod clock
268 * @assigned_cs: bitmask describing already assigned CS lines
269 * @clk_rate: NAND controller current clock rate
270 * @chips: a list containing all the NAND chips attached to
271 * this NAND controller
272 * @complete: a completion object used to wait for NAND
276 struct nand_hw_control controller;
281 unsigned long assigned_cs;
282 unsigned long clk_rate;
283 struct list_head chips;
286 static inline struct sunxi_nfc *to_sunxi_nfc(struct nand_hw_control *ctrl)
288 return container_of(ctrl, struct sunxi_nfc, controller);
291 static void sunxi_nfc_set_clk_rate(unsigned long hz)
293 struct sunxi_ccm_reg *const ccm =
294 (struct sunxi_ccm_reg *)SUNXI_CCM_BASE;
297 div_m = (clock_get_pll6() + hz - 1) / hz;
298 for (div_n = 0; div_n < 3 && div_m > 16; div_n++) {
306 /* config mod clock */
307 writel(CCM_NAND_CTRL_ENABLE | CCM_NAND_CTRL_PLL6 |
308 CCM_NAND_CTRL_N(div_n) | CCM_NAND_CTRL_M(div_m),
309 &ccm->nand0_clk_cfg);
311 /* gate on nand clock */
312 setbits_le32(&ccm->ahb_gate0, (1 << AHB_GATE_OFFSET_NAND0));
313 #ifdef CONFIG_MACH_SUN9I
314 setbits_le32(&ccm->ahb_gate1, (1 << AHB_GATE_OFFSET_DMA));
316 setbits_le32(&ccm->ahb_gate0, (1 << AHB_GATE_OFFSET_DMA));
320 static int sunxi_nfc_wait_int(struct sunxi_nfc *nfc, u32 flags,
321 unsigned int timeout_ms)
323 unsigned int timeout_ticks;
324 u32 time_start, status;
325 int ret = -ETIMEDOUT;
328 timeout_ms = NFC_DEFAULT_TIMEOUT_MS;
330 timeout_ticks = (timeout_ms * CONFIG_SYS_HZ) / 1000;
332 time_start = get_timer(0);
335 status = readl(nfc->regs + NFC_REG_ST);
336 if ((status & flags) == flags) {
342 } while (get_timer(time_start) < timeout_ticks);
344 writel(status & flags, nfc->regs + NFC_REG_ST);
349 static int sunxi_nfc_wait_cmd_fifo_empty(struct sunxi_nfc *nfc)
351 unsigned long timeout = (CONFIG_SYS_HZ *
352 NFC_DEFAULT_TIMEOUT_MS) / 1000;
355 time_start = get_timer(0);
357 if (!(readl(nfc->regs + NFC_REG_ST) & NFC_CMD_FIFO_STATUS))
359 } while (get_timer(time_start) < timeout);
361 dev_err(nfc->dev, "wait for empty cmd FIFO timedout\n");
365 static int sunxi_nfc_rst(struct sunxi_nfc *nfc)
367 unsigned long timeout = (CONFIG_SYS_HZ *
368 NFC_DEFAULT_TIMEOUT_MS) / 1000;
371 writel(0, nfc->regs + NFC_REG_ECC_CTL);
372 writel(NFC_RESET, nfc->regs + NFC_REG_CTL);
374 time_start = get_timer(0);
376 if (!(readl(nfc->regs + NFC_REG_CTL) & NFC_RESET))
378 } while (get_timer(time_start) < timeout);
380 dev_err(nfc->dev, "wait for NAND controller reset timedout\n");
384 static int sunxi_nfc_dev_ready(struct mtd_info *mtd)
386 struct nand_chip *nand = mtd_to_nand(mtd);
387 struct sunxi_nand_chip *sunxi_nand = to_sunxi_nand(nand);
388 struct sunxi_nfc *nfc = to_sunxi_nfc(sunxi_nand->nand.controller);
389 struct sunxi_nand_rb *rb;
390 unsigned long timeo = (sunxi_nand->nand.state == FL_ERASING ? 400 : 20);
393 if (sunxi_nand->selected < 0)
396 rb = &sunxi_nand->sels[sunxi_nand->selected].rb;
400 ret = !!(readl(nfc->regs + NFC_REG_ST) &
401 NFC_RB_STATE(rb->info.nativeid));
405 sunxi_nfc_wait_int(nfc, NFC_RB_B2R, timeo);
406 ret = !!(readl(nfc->regs + NFC_REG_ST) &
407 NFC_RB_STATE(rb->info.nativeid));
410 ret = dm_gpio_get_value(&rb->info.gpio);
415 dev_err(nfc->dev, "cannot check R/B NAND status!\n");
422 static void sunxi_nfc_select_chip(struct mtd_info *mtd, int chip)
424 struct nand_chip *nand = mtd_to_nand(mtd);
425 struct sunxi_nand_chip *sunxi_nand = to_sunxi_nand(nand);
426 struct sunxi_nfc *nfc = to_sunxi_nfc(sunxi_nand->nand.controller);
427 struct sunxi_nand_chip_sel *sel;
430 if (chip > 0 && chip >= sunxi_nand->nsels)
433 if (chip == sunxi_nand->selected)
436 ctl = readl(nfc->regs + NFC_REG_CTL) &
437 ~(NFC_PAGE_SHIFT_MSK | NFC_CE_SEL_MSK | NFC_RB_SEL_MSK | NFC_EN);
440 sel = &sunxi_nand->sels[chip];
442 ctl |= NFC_CE_SEL(sel->cs) | NFC_EN |
443 NFC_PAGE_SHIFT(nand->page_shift - 10);
444 if (sel->rb.type == RB_NONE) {
445 nand->dev_ready = NULL;
447 nand->dev_ready = sunxi_nfc_dev_ready;
448 if (sel->rb.type == RB_NATIVE)
449 ctl |= NFC_RB_SEL(sel->rb.info.nativeid);
452 writel(mtd->writesize, nfc->regs + NFC_REG_SPARE_AREA);
454 if (nfc->clk_rate != sunxi_nand->clk_rate) {
455 sunxi_nfc_set_clk_rate(sunxi_nand->clk_rate);
456 nfc->clk_rate = sunxi_nand->clk_rate;
460 writel(sunxi_nand->timing_ctl, nfc->regs + NFC_REG_TIMING_CTL);
461 writel(sunxi_nand->timing_cfg, nfc->regs + NFC_REG_TIMING_CFG);
462 writel(ctl, nfc->regs + NFC_REG_CTL);
464 sunxi_nand->selected = chip;
467 static void sunxi_nfc_read_buf(struct mtd_info *mtd, uint8_t *buf, int len)
469 struct nand_chip *nand = mtd_to_nand(mtd);
470 struct sunxi_nand_chip *sunxi_nand = to_sunxi_nand(nand);
471 struct sunxi_nfc *nfc = to_sunxi_nfc(sunxi_nand->nand.controller);
478 cnt = min(len - offs, NFC_SRAM_SIZE);
480 ret = sunxi_nfc_wait_cmd_fifo_empty(nfc);
484 writel(cnt, nfc->regs + NFC_REG_CNT);
485 tmp = NFC_DATA_TRANS | NFC_DATA_SWAP_METHOD;
486 writel(tmp, nfc->regs + NFC_REG_CMD);
488 ret = sunxi_nfc_wait_int(nfc, NFC_CMD_INT_FLAG, 0);
493 memcpy_fromio(buf + offs, nfc->regs + NFC_RAM0_BASE,
499 static void sunxi_nfc_write_buf(struct mtd_info *mtd, const uint8_t *buf,
502 struct nand_chip *nand = mtd_to_nand(mtd);
503 struct sunxi_nand_chip *sunxi_nand = to_sunxi_nand(nand);
504 struct sunxi_nfc *nfc = to_sunxi_nfc(sunxi_nand->nand.controller);
511 cnt = min(len - offs, NFC_SRAM_SIZE);
513 ret = sunxi_nfc_wait_cmd_fifo_empty(nfc);
517 writel(cnt, nfc->regs + NFC_REG_CNT);
518 memcpy_toio(nfc->regs + NFC_RAM0_BASE, buf + offs, cnt);
519 tmp = NFC_DATA_TRANS | NFC_DATA_SWAP_METHOD |
521 writel(tmp, nfc->regs + NFC_REG_CMD);
523 ret = sunxi_nfc_wait_int(nfc, NFC_CMD_INT_FLAG, 0);
531 static uint8_t sunxi_nfc_read_byte(struct mtd_info *mtd)
535 sunxi_nfc_read_buf(mtd, &ret, 1);
540 static void sunxi_nfc_cmd_ctrl(struct mtd_info *mtd, int dat,
543 struct nand_chip *nand = mtd_to_nand(mtd);
544 struct sunxi_nand_chip *sunxi_nand = to_sunxi_nand(nand);
545 struct sunxi_nfc *nfc = to_sunxi_nfc(sunxi_nand->nand.controller);
549 ret = sunxi_nfc_wait_cmd_fifo_empty(nfc);
553 if (ctrl & NAND_CTRL_CHANGE) {
554 tmp = readl(nfc->regs + NFC_REG_CTL);
559 writel(tmp, nfc->regs + NFC_REG_CTL);
562 if (dat == NAND_CMD_NONE && (ctrl & NAND_NCE) &&
563 !(ctrl & (NAND_CLE | NAND_ALE))) {
566 if (!sunxi_nand->addr_cycles && !sunxi_nand->cmd_cycles)
569 if (sunxi_nand->cmd_cycles--)
570 cmd |= NFC_SEND_CMD1 | sunxi_nand->cmd[0];
572 if (sunxi_nand->cmd_cycles--) {
573 cmd |= NFC_SEND_CMD2;
574 writel(sunxi_nand->cmd[1],
575 nfc->regs + NFC_REG_RCMD_SET);
578 sunxi_nand->cmd_cycles = 0;
580 if (sunxi_nand->addr_cycles) {
581 cmd |= NFC_SEND_ADR |
582 NFC_ADR_NUM(sunxi_nand->addr_cycles);
583 writel(sunxi_nand->addr[0],
584 nfc->regs + NFC_REG_ADDR_LOW);
587 if (sunxi_nand->addr_cycles > 4)
588 writel(sunxi_nand->addr[1],
589 nfc->regs + NFC_REG_ADDR_HIGH);
591 writel(cmd, nfc->regs + NFC_REG_CMD);
592 sunxi_nand->addr[0] = 0;
593 sunxi_nand->addr[1] = 0;
594 sunxi_nand->addr_cycles = 0;
595 sunxi_nfc_wait_int(nfc, NFC_CMD_INT_FLAG, 0);
598 if (ctrl & NAND_CLE) {
599 sunxi_nand->cmd[sunxi_nand->cmd_cycles++] = dat;
600 } else if (ctrl & NAND_ALE) {
601 sunxi_nand->addr[sunxi_nand->addr_cycles / 4] |=
602 dat << ((sunxi_nand->addr_cycles % 4) * 8);
603 sunxi_nand->addr_cycles++;
607 /* These seed values have been extracted from Allwinner's BSP */
608 static const u16 sunxi_nfc_randomizer_page_seeds[] = {
609 0x2b75, 0x0bd0, 0x5ca3, 0x62d1, 0x1c93, 0x07e9, 0x2162, 0x3a72,
610 0x0d67, 0x67f9, 0x1be7, 0x077d, 0x032f, 0x0dac, 0x2716, 0x2436,
611 0x7922, 0x1510, 0x3860, 0x5287, 0x480f, 0x4252, 0x1789, 0x5a2d,
612 0x2a49, 0x5e10, 0x437f, 0x4b4e, 0x2f45, 0x216e, 0x5cb7, 0x7130,
613 0x2a3f, 0x60e4, 0x4dc9, 0x0ef0, 0x0f52, 0x1bb9, 0x6211, 0x7a56,
614 0x226d, 0x4ea7, 0x6f36, 0x3692, 0x38bf, 0x0c62, 0x05eb, 0x4c55,
615 0x60f4, 0x728c, 0x3b6f, 0x2037, 0x7f69, 0x0936, 0x651a, 0x4ceb,
616 0x6218, 0x79f3, 0x383f, 0x18d9, 0x4f05, 0x5c82, 0x2912, 0x6f17,
617 0x6856, 0x5938, 0x1007, 0x61ab, 0x3e7f, 0x57c2, 0x542f, 0x4f62,
618 0x7454, 0x2eac, 0x7739, 0x42d4, 0x2f90, 0x435a, 0x2e52, 0x2064,
619 0x637c, 0x66ad, 0x2c90, 0x0bad, 0x759c, 0x0029, 0x0986, 0x7126,
620 0x1ca7, 0x1605, 0x386a, 0x27f5, 0x1380, 0x6d75, 0x24c3, 0x0f8e,
621 0x2b7a, 0x1418, 0x1fd1, 0x7dc1, 0x2d8e, 0x43af, 0x2267, 0x7da3,
622 0x4e3d, 0x1338, 0x50db, 0x454d, 0x764d, 0x40a3, 0x42e6, 0x262b,
623 0x2d2e, 0x1aea, 0x2e17, 0x173d, 0x3a6e, 0x71bf, 0x25f9, 0x0a5d,
624 0x7c57, 0x0fbe, 0x46ce, 0x4939, 0x6b17, 0x37bb, 0x3e91, 0x76db,
628 * sunxi_nfc_randomizer_ecc512_seeds and sunxi_nfc_randomizer_ecc1024_seeds
629 * have been generated using
630 * sunxi_nfc_randomizer_step(seed, (step_size * 8) + 15), which is what
631 * the randomizer engine does internally before de/scrambling OOB data.
633 * Those tables are statically defined to avoid calculating randomizer state
636 static const u16 sunxi_nfc_randomizer_ecc512_seeds[] = {
637 0x3346, 0x367f, 0x1f18, 0x769a, 0x4f64, 0x068c, 0x2ef1, 0x6b64,
638 0x28a9, 0x15d7, 0x30f8, 0x3659, 0x53db, 0x7c5f, 0x71d4, 0x4409,
639 0x26eb, 0x03cc, 0x655d, 0x47d4, 0x4daa, 0x0877, 0x712d, 0x3617,
640 0x3264, 0x49aa, 0x7f9e, 0x588e, 0x4fbc, 0x7176, 0x7f91, 0x6c6d,
641 0x4b95, 0x5fb7, 0x3844, 0x4037, 0x0184, 0x081b, 0x0ee8, 0x5b91,
642 0x293d, 0x1f71, 0x0e6f, 0x402b, 0x5122, 0x1e52, 0x22be, 0x3d2d,
643 0x75bc, 0x7c60, 0x6291, 0x1a2f, 0x61d4, 0x74aa, 0x4140, 0x29ab,
644 0x472d, 0x2852, 0x017e, 0x15e8, 0x5ec2, 0x17cf, 0x7d0f, 0x06b8,
645 0x117a, 0x6b94, 0x789b, 0x3126, 0x6ac5, 0x5be7, 0x150f, 0x51f8,
646 0x7889, 0x0aa5, 0x663d, 0x77e8, 0x0b87, 0x3dcb, 0x360d, 0x218b,
647 0x512f, 0x7dc9, 0x6a4d, 0x630a, 0x3547, 0x1dd2, 0x5aea, 0x69a5,
648 0x7bfa, 0x5e4f, 0x1519, 0x6430, 0x3a0e, 0x5eb3, 0x5425, 0x0c7a,
649 0x5540, 0x3670, 0x63c1, 0x31e9, 0x5a39, 0x2de7, 0x5979, 0x2891,
650 0x1562, 0x014b, 0x5b05, 0x2756, 0x5a34, 0x13aa, 0x6cb5, 0x2c36,
651 0x5e72, 0x1306, 0x0861, 0x15ef, 0x1ee8, 0x5a37, 0x7ac4, 0x45dd,
652 0x44c4, 0x7266, 0x2f41, 0x3ccc, 0x045e, 0x7d40, 0x7c66, 0x0fa0,
655 static const u16 sunxi_nfc_randomizer_ecc1024_seeds[] = {
656 0x2cf5, 0x35f1, 0x63a4, 0x5274, 0x2bd2, 0x778b, 0x7285, 0x32b6,
657 0x6a5c, 0x70d6, 0x757d, 0x6769, 0x5375, 0x1e81, 0x0cf3, 0x3982,
658 0x6787, 0x042a, 0x6c49, 0x1925, 0x56a8, 0x40a9, 0x063e, 0x7bd9,
659 0x4dbf, 0x55ec, 0x672e, 0x7334, 0x5185, 0x4d00, 0x232a, 0x7e07,
660 0x445d, 0x6b92, 0x528f, 0x4255, 0x53ba, 0x7d82, 0x2a2e, 0x3a4e,
661 0x75eb, 0x450c, 0x6844, 0x1b5d, 0x581a, 0x4cc6, 0x0379, 0x37b2,
662 0x419f, 0x0e92, 0x6b27, 0x5624, 0x01e3, 0x07c1, 0x44a5, 0x130c,
663 0x13e8, 0x5910, 0x0876, 0x60c5, 0x54e3, 0x5b7f, 0x2269, 0x509f,
664 0x7665, 0x36fd, 0x3e9a, 0x0579, 0x6295, 0x14ef, 0x0a81, 0x1bcc,
665 0x4b16, 0x64db, 0x0514, 0x4f07, 0x0591, 0x3576, 0x6853, 0x0d9e,
666 0x259f, 0x38b7, 0x64fb, 0x3094, 0x4693, 0x6ddd, 0x29bb, 0x0bc8,
667 0x3f47, 0x490e, 0x0c0e, 0x7933, 0x3c9e, 0x5840, 0x398d, 0x3e68,
668 0x4af1, 0x71f5, 0x57cf, 0x1121, 0x64eb, 0x3579, 0x15ac, 0x584d,
669 0x5f2a, 0x47e2, 0x6528, 0x6eac, 0x196e, 0x6b96, 0x0450, 0x0179,
670 0x609c, 0x06e1, 0x4626, 0x42c7, 0x273e, 0x486f, 0x0705, 0x1601,
671 0x145b, 0x407e, 0x062b, 0x57a5, 0x53f9, 0x5659, 0x4410, 0x3ccd,
674 static u16 sunxi_nfc_randomizer_step(u16 state, int count)
679 * This loop is just a simple implementation of a Fibonacci LFSR using
680 * the x16 + x15 + 1 polynomial.
683 state = ((state >> 1) |
684 (((state ^ (state >> 1)) & 1) << 14)) & 0x7fff;
689 static u16 sunxi_nfc_randomizer_state(struct mtd_info *mtd, int page, bool ecc)
691 const u16 *seeds = sunxi_nfc_randomizer_page_seeds;
692 int mod = mtd->erasesize / mtd->writesize;
694 if (mod > ARRAY_SIZE(sunxi_nfc_randomizer_page_seeds))
695 mod = ARRAY_SIZE(sunxi_nfc_randomizer_page_seeds);
698 if (mtd->ecc_step_size == 512)
699 seeds = sunxi_nfc_randomizer_ecc512_seeds;
701 seeds = sunxi_nfc_randomizer_ecc1024_seeds;
704 return seeds[page % mod];
707 static void sunxi_nfc_randomizer_config(struct mtd_info *mtd,
710 struct nand_chip *nand = mtd_to_nand(mtd);
711 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
712 u32 ecc_ctl = readl(nfc->regs + NFC_REG_ECC_CTL);
715 if (!(nand->options & NAND_NEED_SCRAMBLING))
718 ecc_ctl = readl(nfc->regs + NFC_REG_ECC_CTL);
719 state = sunxi_nfc_randomizer_state(mtd, page, ecc);
720 ecc_ctl = readl(nfc->regs + NFC_REG_ECC_CTL) & ~NFC_RANDOM_SEED_MSK;
721 writel(ecc_ctl | NFC_RANDOM_SEED(state), nfc->regs + NFC_REG_ECC_CTL);
724 static void sunxi_nfc_randomizer_enable(struct mtd_info *mtd)
726 struct nand_chip *nand = mtd_to_nand(mtd);
727 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
729 if (!(nand->options & NAND_NEED_SCRAMBLING))
732 writel(readl(nfc->regs + NFC_REG_ECC_CTL) | NFC_RANDOM_EN,
733 nfc->regs + NFC_REG_ECC_CTL);
736 static void sunxi_nfc_randomizer_disable(struct mtd_info *mtd)
738 struct nand_chip *nand = mtd_to_nand(mtd);
739 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
741 if (!(nand->options & NAND_NEED_SCRAMBLING))
744 writel(readl(nfc->regs + NFC_REG_ECC_CTL) & ~NFC_RANDOM_EN,
745 nfc->regs + NFC_REG_ECC_CTL);
748 static void sunxi_nfc_randomize_bbm(struct mtd_info *mtd, int page, u8 *bbm)
750 u16 state = sunxi_nfc_randomizer_state(mtd, page, true);
753 bbm[1] ^= sunxi_nfc_randomizer_step(state, 8);
756 static void sunxi_nfc_randomizer_write_buf(struct mtd_info *mtd,
757 const uint8_t *buf, int len,
760 sunxi_nfc_randomizer_config(mtd, page, ecc);
761 sunxi_nfc_randomizer_enable(mtd);
762 sunxi_nfc_write_buf(mtd, buf, len);
763 sunxi_nfc_randomizer_disable(mtd);
766 static void sunxi_nfc_randomizer_read_buf(struct mtd_info *mtd, uint8_t *buf,
767 int len, bool ecc, int page)
769 sunxi_nfc_randomizer_config(mtd, page, ecc);
770 sunxi_nfc_randomizer_enable(mtd);
771 sunxi_nfc_read_buf(mtd, buf, len);
772 sunxi_nfc_randomizer_disable(mtd);
775 static void sunxi_nfc_hw_ecc_enable(struct mtd_info *mtd)
777 struct nand_chip *nand = mtd_to_nand(mtd);
778 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
779 struct sunxi_nand_hw_ecc *data = nand->ecc.priv;
782 ecc_ctl = readl(nfc->regs + NFC_REG_ECC_CTL);
783 ecc_ctl &= ~(NFC_ECC_MODE_MSK | NFC_ECC_PIPELINE |
784 NFC_ECC_BLOCK_SIZE_MSK);
785 ecc_ctl |= NFC_ECC_EN | NFC_ECC_MODE(data->mode) | NFC_ECC_EXCEPTION;
787 if (nand->ecc.size == 512)
788 ecc_ctl |= NFC_ECC_BLOCK_512;
790 writel(ecc_ctl, nfc->regs + NFC_REG_ECC_CTL);
793 static void sunxi_nfc_hw_ecc_disable(struct mtd_info *mtd)
795 struct nand_chip *nand = mtd_to_nand(mtd);
796 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
798 writel(readl(nfc->regs + NFC_REG_ECC_CTL) & ~NFC_ECC_EN,
799 nfc->regs + NFC_REG_ECC_CTL);
802 static inline void sunxi_nfc_user_data_to_buf(u32 user_data, u8 *buf)
805 buf[1] = user_data >> 8;
806 buf[2] = user_data >> 16;
807 buf[3] = user_data >> 24;
810 static int sunxi_nfc_hw_ecc_read_chunk(struct mtd_info *mtd,
811 u8 *data, int data_off,
812 u8 *oob, int oob_off,
814 unsigned int *max_bitflips,
817 struct nand_chip *nand = mtd_to_nand(mtd);
818 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
819 struct nand_ecc_ctrl *ecc = &nand->ecc;
824 if (*cur_off != data_off)
825 nand->cmdfunc(mtd, NAND_CMD_RNDOUT, data_off, -1);
827 sunxi_nfc_randomizer_read_buf(mtd, NULL, ecc->size, false, page);
829 if (data_off + ecc->size != oob_off)
830 nand->cmdfunc(mtd, NAND_CMD_RNDOUT, oob_off, -1);
832 ret = sunxi_nfc_wait_cmd_fifo_empty(nfc);
836 sunxi_nfc_randomizer_enable(mtd);
837 writel(NFC_DATA_TRANS | NFC_DATA_SWAP_METHOD | NFC_ECC_OP,
838 nfc->regs + NFC_REG_CMD);
840 ret = sunxi_nfc_wait_int(nfc, NFC_CMD_INT_FLAG, 0);
841 sunxi_nfc_randomizer_disable(mtd);
845 *cur_off = oob_off + ecc->bytes + 4;
847 status = readl(nfc->regs + NFC_REG_ECC_ST);
848 if (status & NFC_ECC_PAT_FOUND(0)) {
851 if (unlikely(!(readl(nfc->regs + NFC_REG_PAT_ID) & 0x1)))
854 memset(data, pattern, ecc->size);
855 memset(oob, pattern, ecc->bytes + 4);
860 ret = NFC_ECC_ERR_CNT(0, readl(nfc->regs + NFC_REG_ECC_ERR_CNT(0)));
862 memcpy_fromio(data, nfc->regs + NFC_RAM0_BASE, ecc->size);
864 nand->cmdfunc(mtd, NAND_CMD_RNDOUT, oob_off, -1);
865 sunxi_nfc_randomizer_read_buf(mtd, oob, ecc->bytes + 4, true, page);
867 if (status & NFC_ECC_ERR(0)) {
869 * Re-read the data with the randomizer disabled to identify
870 * bitflips in erased pages.
872 if (nand->options & NAND_NEED_SCRAMBLING) {
873 nand->cmdfunc(mtd, NAND_CMD_RNDOUT, data_off, -1);
874 nand->read_buf(mtd, data, ecc->size);
875 nand->cmdfunc(mtd, NAND_CMD_RNDOUT, oob_off, -1);
876 nand->read_buf(mtd, oob, ecc->bytes + 4);
879 ret = nand_check_erased_ecc_chunk(data, ecc->size,
881 NULL, 0, ecc->strength);
886 * The engine protects 4 bytes of OOB data per chunk.
887 * Retrieve the corrected OOB bytes.
889 sunxi_nfc_user_data_to_buf(readl(nfc->regs +
890 NFC_REG_USER_DATA(0)),
893 /* De-randomize the Bad Block Marker. */
894 if (bbm && nand->options & NAND_NEED_SCRAMBLING)
895 sunxi_nfc_randomize_bbm(mtd, page, oob);
899 mtd->ecc_stats.failed++;
901 mtd->ecc_stats.corrected += ret;
902 *max_bitflips = max_t(unsigned int, *max_bitflips, ret);
908 static void sunxi_nfc_hw_ecc_read_extra_oob(struct mtd_info *mtd,
909 u8 *oob, int *cur_off,
910 bool randomize, int page)
912 struct nand_chip *nand = mtd_to_nand(mtd);
913 struct nand_ecc_ctrl *ecc = &nand->ecc;
914 int offset = ((ecc->bytes + 4) * ecc->steps);
915 int len = mtd->oobsize - offset;
920 if (*cur_off != offset)
921 nand->cmdfunc(mtd, NAND_CMD_RNDOUT,
922 offset + mtd->writesize, -1);
925 sunxi_nfc_read_buf(mtd, oob + offset, len);
927 sunxi_nfc_randomizer_read_buf(mtd, oob + offset, len,
930 *cur_off = mtd->oobsize + mtd->writesize;
933 static inline u32 sunxi_nfc_buf_to_user_data(const u8 *buf)
935 return buf[0] | (buf[1] << 8) | (buf[2] << 16) | (buf[3] << 24);
938 static int sunxi_nfc_hw_ecc_write_chunk(struct mtd_info *mtd,
939 const u8 *data, int data_off,
940 const u8 *oob, int oob_off,
941 int *cur_off, bool bbm,
944 struct nand_chip *nand = mtd_to_nand(mtd);
945 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
946 struct nand_ecc_ctrl *ecc = &nand->ecc;
949 if (data_off != *cur_off)
950 nand->cmdfunc(mtd, NAND_CMD_RNDIN, data_off, -1);
952 sunxi_nfc_randomizer_write_buf(mtd, data, ecc->size, false, page);
954 /* Fill OOB data in */
955 if ((nand->options & NAND_NEED_SCRAMBLING) && bbm) {
958 memcpy(user_data, oob, 4);
959 sunxi_nfc_randomize_bbm(mtd, page, user_data);
960 writel(sunxi_nfc_buf_to_user_data(user_data),
961 nfc->regs + NFC_REG_USER_DATA(0));
963 writel(sunxi_nfc_buf_to_user_data(oob),
964 nfc->regs + NFC_REG_USER_DATA(0));
967 if (data_off + ecc->size != oob_off)
968 nand->cmdfunc(mtd, NAND_CMD_RNDIN, oob_off, -1);
970 ret = sunxi_nfc_wait_cmd_fifo_empty(nfc);
974 sunxi_nfc_randomizer_enable(mtd);
975 writel(NFC_DATA_TRANS | NFC_DATA_SWAP_METHOD |
976 NFC_ACCESS_DIR | NFC_ECC_OP,
977 nfc->regs + NFC_REG_CMD);
979 ret = sunxi_nfc_wait_int(nfc, NFC_CMD_INT_FLAG, 0);
980 sunxi_nfc_randomizer_disable(mtd);
984 *cur_off = oob_off + ecc->bytes + 4;
989 static void sunxi_nfc_hw_ecc_write_extra_oob(struct mtd_info *mtd,
990 u8 *oob, int *cur_off,
993 struct nand_chip *nand = mtd_to_nand(mtd);
994 struct nand_ecc_ctrl *ecc = &nand->ecc;
995 int offset = ((ecc->bytes + 4) * ecc->steps);
996 int len = mtd->oobsize - offset;
1001 if (*cur_off != offset)
1002 nand->cmdfunc(mtd, NAND_CMD_RNDIN,
1003 offset + mtd->writesize, -1);
1005 sunxi_nfc_randomizer_write_buf(mtd, oob + offset, len, false, page);
1007 *cur_off = mtd->oobsize + mtd->writesize;
1010 static int sunxi_nfc_hw_ecc_read_page(struct mtd_info *mtd,
1011 struct nand_chip *chip, uint8_t *buf,
1012 int oob_required, int page)
1014 struct nand_ecc_ctrl *ecc = &chip->ecc;
1015 unsigned int max_bitflips = 0;
1016 int ret, i, cur_off = 0;
1017 bool raw_mode = false;
1019 sunxi_nfc_hw_ecc_enable(mtd);
1021 for (i = 0; i < ecc->steps; i++) {
1022 int data_off = i * ecc->size;
1023 int oob_off = i * (ecc->bytes + 4);
1024 u8 *data = buf + data_off;
1025 u8 *oob = chip->oob_poi + oob_off;
1027 ret = sunxi_nfc_hw_ecc_read_chunk(mtd, data, data_off, oob,
1028 oob_off + mtd->writesize,
1029 &cur_off, &max_bitflips,
1038 sunxi_nfc_hw_ecc_read_extra_oob(mtd, chip->oob_poi, &cur_off,
1041 sunxi_nfc_hw_ecc_disable(mtd);
1043 return max_bitflips;
1046 static int sunxi_nfc_hw_ecc_read_subpage(struct mtd_info *mtd,
1047 struct nand_chip *chip,
1048 uint32_t data_offs, uint32_t readlen,
1049 uint8_t *bufpoi, int page)
1051 struct nand_ecc_ctrl *ecc = &chip->ecc;
1052 int ret, i, cur_off = 0;
1053 unsigned int max_bitflips = 0;
1055 sunxi_nfc_hw_ecc_enable(mtd);
1057 chip->cmdfunc(mtd, NAND_CMD_READ0, 0, page);
1058 for (i = data_offs / ecc->size;
1059 i < DIV_ROUND_UP(data_offs + readlen, ecc->size); i++) {
1060 int data_off = i * ecc->size;
1061 int oob_off = i * (ecc->bytes + 4);
1062 u8 *data = bufpoi + data_off;
1063 u8 *oob = chip->oob_poi + oob_off;
1065 ret = sunxi_nfc_hw_ecc_read_chunk(mtd, data, data_off,
1066 oob, oob_off + mtd->writesize,
1067 &cur_off, &max_bitflips, !i, page);
1072 sunxi_nfc_hw_ecc_disable(mtd);
1074 return max_bitflips;
1077 static int sunxi_nfc_hw_ecc_write_page(struct mtd_info *mtd,
1078 struct nand_chip *chip,
1079 const uint8_t *buf, int oob_required,
1082 struct nand_ecc_ctrl *ecc = &chip->ecc;
1083 int ret, i, cur_off = 0;
1085 sunxi_nfc_hw_ecc_enable(mtd);
1087 for (i = 0; i < ecc->steps; i++) {
1088 int data_off = i * ecc->size;
1089 int oob_off = i * (ecc->bytes + 4);
1090 const u8 *data = buf + data_off;
1091 const u8 *oob = chip->oob_poi + oob_off;
1093 ret = sunxi_nfc_hw_ecc_write_chunk(mtd, data, data_off, oob,
1094 oob_off + mtd->writesize,
1095 &cur_off, !i, page);
1100 if (oob_required || (chip->options & NAND_NEED_SCRAMBLING))
1101 sunxi_nfc_hw_ecc_write_extra_oob(mtd, chip->oob_poi,
1104 sunxi_nfc_hw_ecc_disable(mtd);
1109 static int sunxi_nfc_hw_ecc_write_subpage(struct mtd_info *mtd,
1110 struct nand_chip *chip,
1111 u32 data_offs, u32 data_len,
1112 const u8 *buf, int oob_required,
1115 struct nand_ecc_ctrl *ecc = &chip->ecc;
1116 int ret, i, cur_off = 0;
1118 sunxi_nfc_hw_ecc_enable(mtd);
1120 for (i = data_offs / ecc->size;
1121 i < DIV_ROUND_UP(data_offs + data_len, ecc->size); i++) {
1122 int data_off = i * ecc->size;
1123 int oob_off = i * (ecc->bytes + 4);
1124 const u8 *data = buf + data_off;
1125 const u8 *oob = chip->oob_poi + oob_off;
1127 ret = sunxi_nfc_hw_ecc_write_chunk(mtd, data, data_off, oob,
1128 oob_off + mtd->writesize,
1129 &cur_off, !i, page);
1134 sunxi_nfc_hw_ecc_disable(mtd);
1139 static int sunxi_nfc_hw_syndrome_ecc_read_page(struct mtd_info *mtd,
1140 struct nand_chip *chip,
1141 uint8_t *buf, int oob_required,
1144 struct nand_ecc_ctrl *ecc = &chip->ecc;
1145 unsigned int max_bitflips = 0;
1146 int ret, i, cur_off = 0;
1147 bool raw_mode = false;
1149 sunxi_nfc_hw_ecc_enable(mtd);
1151 for (i = 0; i < ecc->steps; i++) {
1152 int data_off = i * (ecc->size + ecc->bytes + 4);
1153 int oob_off = data_off + ecc->size;
1154 u8 *data = buf + (i * ecc->size);
1155 u8 *oob = chip->oob_poi + (i * (ecc->bytes + 4));
1157 ret = sunxi_nfc_hw_ecc_read_chunk(mtd, data, data_off, oob,
1159 &max_bitflips, !i, page);
1167 sunxi_nfc_hw_ecc_read_extra_oob(mtd, chip->oob_poi, &cur_off,
1170 sunxi_nfc_hw_ecc_disable(mtd);
1172 return max_bitflips;
1175 static int sunxi_nfc_hw_syndrome_ecc_write_page(struct mtd_info *mtd,
1176 struct nand_chip *chip,
1178 int oob_required, int page)
1180 struct nand_ecc_ctrl *ecc = &chip->ecc;
1181 int ret, i, cur_off = 0;
1183 sunxi_nfc_hw_ecc_enable(mtd);
1185 for (i = 0; i < ecc->steps; i++) {
1186 int data_off = i * (ecc->size + ecc->bytes + 4);
1187 int oob_off = data_off + ecc->size;
1188 const u8 *data = buf + (i * ecc->size);
1189 const u8 *oob = chip->oob_poi + (i * (ecc->bytes + 4));
1191 ret = sunxi_nfc_hw_ecc_write_chunk(mtd, data, data_off,
1192 oob, oob_off, &cur_off,
1198 if (oob_required || (chip->options & NAND_NEED_SCRAMBLING))
1199 sunxi_nfc_hw_ecc_write_extra_oob(mtd, chip->oob_poi,
1202 sunxi_nfc_hw_ecc_disable(mtd);
1207 static const s32 tWB_lut[] = {6, 12, 16, 20};
1208 static const s32 tRHW_lut[] = {4, 8, 12, 20};
1210 static int _sunxi_nand_lookup_timing(const s32 *lut, int lut_size, u32 duration,
1213 u32 clk_cycles = DIV_ROUND_UP(duration, clk_period);
1216 for (i = 0; i < lut_size; i++) {
1217 if (clk_cycles <= lut[i])
1225 #define sunxi_nand_lookup_timing(l, p, c) \
1226 _sunxi_nand_lookup_timing(l, ARRAY_SIZE(l), p, c)
1228 static int sunxi_nand_chip_set_timings(struct sunxi_nand_chip *chip,
1229 const struct nand_sdr_timings *timings)
1231 u32 min_clk_period = 0;
1232 s32 tWB, tADL, tWHR, tRHW, tCAD;
1235 if (timings->tCLS_min > min_clk_period)
1236 min_clk_period = timings->tCLS_min;
1239 if (timings->tCLH_min > min_clk_period)
1240 min_clk_period = timings->tCLH_min;
1243 if (timings->tCS_min > min_clk_period)
1244 min_clk_period = timings->tCS_min;
1247 if (timings->tCH_min > min_clk_period)
1248 min_clk_period = timings->tCH_min;
1251 if (timings->tWP_min > min_clk_period)
1252 min_clk_period = timings->tWP_min;
1255 if (timings->tWH_min > min_clk_period)
1256 min_clk_period = timings->tWH_min;
1259 if (timings->tALS_min > min_clk_period)
1260 min_clk_period = timings->tALS_min;
1263 if (timings->tDS_min > min_clk_period)
1264 min_clk_period = timings->tDS_min;
1267 if (timings->tDH_min > min_clk_period)
1268 min_clk_period = timings->tDH_min;
1271 if (timings->tRR_min > (min_clk_period * 3))
1272 min_clk_period = DIV_ROUND_UP(timings->tRR_min, 3);
1275 if (timings->tALH_min > min_clk_period)
1276 min_clk_period = timings->tALH_min;
1279 if (timings->tRP_min > min_clk_period)
1280 min_clk_period = timings->tRP_min;
1283 if (timings->tREH_min > min_clk_period)
1284 min_clk_period = timings->tREH_min;
1287 if (timings->tRC_min > (min_clk_period * 2))
1288 min_clk_period = DIV_ROUND_UP(timings->tRC_min, 2);
1291 if (timings->tWC_min > (min_clk_period * 2))
1292 min_clk_period = DIV_ROUND_UP(timings->tWC_min, 2);
1294 /* T16 - T19 + tCAD */
1295 tWB = sunxi_nand_lookup_timing(tWB_lut, timings->tWB_max,
1298 dev_err(nfc->dev, "unsupported tWB\n");
1302 tADL = DIV_ROUND_UP(timings->tADL_min, min_clk_period) >> 3;
1304 dev_err(nfc->dev, "unsupported tADL\n");
1308 tWHR = DIV_ROUND_UP(timings->tWHR_min, min_clk_period) >> 3;
1310 dev_err(nfc->dev, "unsupported tWHR\n");
1314 tRHW = sunxi_nand_lookup_timing(tRHW_lut, timings->tRHW_min,
1317 dev_err(nfc->dev, "unsupported tRHW\n");
1322 * TODO: according to ONFI specs this value only applies for DDR NAND,
1323 * but Allwinner seems to set this to 0x7. Mimic them for now.
1327 /* TODO: A83 has some more bits for CDQSS, CS, CLHZ, CCS, WC */
1328 chip->timing_cfg = NFC_TIMING_CFG(tWB, tADL, tWHR, tRHW, tCAD);
1331 * ONFI specification 3.1, paragraph 4.15.2 dictates that EDO data
1332 * output cycle timings shall be used if the host drives tRC less than
1335 chip->timing_ctl = (timings->tRC_min < 30000) ? NFC_TIMING_CTL_EDO : 0;
1337 /* Convert min_clk_period from picoseconds to nanoseconds */
1338 min_clk_period = DIV_ROUND_UP(min_clk_period, 1000);
1341 * Convert min_clk_period into a clk frequency, then get the
1342 * appropriate rate for the NAND controller IP given this formula
1343 * (specified in the datasheet):
1344 * nand clk_rate = min_clk_rate
1346 chip->clk_rate = 1000000000L / min_clk_period;
1351 static int sunxi_nand_chip_init_timings(struct sunxi_nand_chip *chip)
1353 struct mtd_info *mtd = nand_to_mtd(&chip->nand);
1354 const struct nand_sdr_timings *timings;
1358 mode = onfi_get_async_timing_mode(&chip->nand);
1359 if (mode == ONFI_TIMING_MODE_UNKNOWN) {
1360 mode = chip->nand.onfi_timing_mode_default;
1362 uint8_t feature[ONFI_SUBFEATURE_PARAM_LEN] = {};
1365 mode = fls(mode) - 1;
1370 for (i = 0; i < chip->nsels; i++) {
1371 chip->nand.select_chip(mtd, i);
1372 ret = chip->nand.onfi_set_features(mtd,
1374 ONFI_FEATURE_ADDR_TIMING_MODE,
1376 chip->nand.select_chip(mtd, -1);
1377 if (ret && ret != -ENOTSUPP)
1382 timings = onfi_async_timing_mode_to_sdr_timings(mode);
1383 if (IS_ERR(timings))
1384 return PTR_ERR(timings);
1386 return sunxi_nand_chip_set_timings(chip, timings);
1389 static int sunxi_nand_hw_common_ecc_ctrl_init(struct mtd_info *mtd,
1390 struct nand_ecc_ctrl *ecc)
1392 static const u8 strengths[] = { 16, 24, 28, 32, 40, 48, 56, 60, 64 };
1393 struct sunxi_nand_hw_ecc *data;
1394 struct nand_ecclayout *layout;
1399 data = kzalloc(sizeof(*data), GFP_KERNEL);
1403 if (ecc->size != 512 && ecc->size != 1024)
1406 /* Prefer 1k ECC chunk over 512 ones */
1407 if (ecc->size == 512 && mtd->writesize > 512) {
1412 /* Add ECC info retrieval from DT */
1413 for (i = 0; i < ARRAY_SIZE(strengths); i++) {
1414 if (ecc->strength <= strengths[i]) {
1416 * Update ecc->strength value with the actual strength
1417 * that will be used by the ECC engine.
1419 ecc->strength = strengths[i];
1424 if (i >= ARRAY_SIZE(strengths)) {
1425 dev_err(nfc->dev, "unsupported strength\n");
1432 /* HW ECC always request ECC bytes for 1024 bytes blocks */
1433 ecc->bytes = DIV_ROUND_UP(ecc->strength * fls(8 * 1024), 8);
1435 /* HW ECC always work with even numbers of ECC bytes */
1436 ecc->bytes = ALIGN(ecc->bytes, 2);
1438 layout = &data->layout;
1439 nsectors = mtd->writesize / ecc->size;
1441 if (mtd->oobsize < ((ecc->bytes + 4) * nsectors)) {
1446 layout->eccbytes = (ecc->bytes * nsectors);
1448 ecc->layout = layout;
1460 static void sunxi_nand_hw_common_ecc_ctrl_cleanup(struct nand_ecc_ctrl *ecc)
1464 #endif /* __UBOOT__ */
1466 static int sunxi_nand_hw_ecc_ctrl_init(struct mtd_info *mtd,
1467 struct nand_ecc_ctrl *ecc)
1469 struct nand_ecclayout *layout;
1474 ret = sunxi_nand_hw_common_ecc_ctrl_init(mtd, ecc);
1478 ecc->read_page = sunxi_nfc_hw_ecc_read_page;
1479 ecc->write_page = sunxi_nfc_hw_ecc_write_page;
1480 ecc->read_subpage = sunxi_nfc_hw_ecc_read_subpage;
1481 ecc->write_subpage = sunxi_nfc_hw_ecc_write_subpage;
1482 layout = ecc->layout;
1483 nsectors = mtd->writesize / ecc->size;
1485 for (i = 0; i < nsectors; i++) {
1487 layout->oobfree[i].offset =
1488 layout->oobfree[i - 1].offset +
1489 layout->oobfree[i - 1].length +
1491 layout->oobfree[i].length = 4;
1494 * The first 2 bytes are used for BB markers, hence we
1495 * only have 2 bytes available in the first user data
1498 layout->oobfree[i].length = 2;
1499 layout->oobfree[i].offset = 2;
1502 for (j = 0; j < ecc->bytes; j++)
1503 layout->eccpos[(ecc->bytes * i) + j] =
1504 layout->oobfree[i].offset +
1505 layout->oobfree[i].length + j;
1508 if (mtd->oobsize > (ecc->bytes + 4) * nsectors) {
1509 layout->oobfree[nsectors].offset =
1510 layout->oobfree[nsectors - 1].offset +
1511 layout->oobfree[nsectors - 1].length +
1513 layout->oobfree[nsectors].length = mtd->oobsize -
1514 ((ecc->bytes + 4) * nsectors);
1520 static int sunxi_nand_hw_syndrome_ecc_ctrl_init(struct mtd_info *mtd,
1521 struct nand_ecc_ctrl *ecc)
1523 struct nand_ecclayout *layout;
1528 ret = sunxi_nand_hw_common_ecc_ctrl_init(mtd, ecc);
1533 ecc->read_page = sunxi_nfc_hw_syndrome_ecc_read_page;
1534 ecc->write_page = sunxi_nfc_hw_syndrome_ecc_write_page;
1536 layout = ecc->layout;
1537 nsectors = mtd->writesize / ecc->size;
1539 for (i = 0; i < (ecc->bytes * nsectors); i++)
1540 layout->eccpos[i] = i;
1542 layout->oobfree[0].length = mtd->oobsize - i;
1543 layout->oobfree[0].offset = i;
1549 static void sunxi_nand_ecc_cleanup(struct nand_ecc_ctrl *ecc)
1551 switch (ecc->mode) {
1553 case NAND_ECC_HW_SYNDROME:
1554 sunxi_nand_hw_common_ecc_ctrl_cleanup(ecc);
1562 #endif /* __UBOOT__ */
1564 static int sunxi_nand_ecc_init(struct mtd_info *mtd, struct nand_ecc_ctrl *ecc)
1566 struct nand_chip *nand = mtd_to_nand(mtd);
1570 ecc->size = nand->ecc_step_ds;
1571 ecc->strength = nand->ecc_strength_ds;
1574 if (!ecc->size || !ecc->strength)
1577 switch (ecc->mode) {
1578 case NAND_ECC_SOFT_BCH:
1581 ret = sunxi_nand_hw_ecc_ctrl_init(mtd, ecc);
1585 case NAND_ECC_HW_SYNDROME:
1586 ret = sunxi_nand_hw_syndrome_ecc_ctrl_init(mtd, ecc);
1591 ecc->layout = kzalloc(sizeof(*ecc->layout), GFP_KERNEL);
1594 ecc->layout->oobfree[0].length = mtd->oobsize;
1604 static int sunxi_nand_chip_init(int node, struct sunxi_nfc *nfc, int devnum)
1606 const struct nand_sdr_timings *timings;
1607 const void *blob = gd->fdt_blob;
1608 struct sunxi_nand_chip *chip;
1609 struct mtd_info *mtd;
1610 struct nand_chip *nand;
1616 if (!fdt_getprop(blob, node, "reg", &nsels))
1619 nsels /= sizeof(u32);
1620 if (!nsels || nsels > 8) {
1621 dev_err(dev, "invalid reg property size\n");
1625 chip = kzalloc(sizeof(*chip) +
1626 (nsels * sizeof(struct sunxi_nand_chip_sel)),
1629 dev_err(dev, "could not allocate chip\n");
1633 chip->nsels = nsels;
1634 chip->selected = -1;
1636 for (i = 0; i < nsels; i++) {
1641 ret = fdtdec_get_int_array(gd->fdt_blob, node, "reg", cs, nsels);
1643 dev_err(dev, "could not retrieve reg property: %d\n", ret);
1647 ret = fdtdec_get_int_array(gd->fdt_blob, node, "allwinner,rb", rb,
1650 dev_err(dev, "could not retrieve reg property: %d\n", ret);
1654 for (i = 0; i < nsels; i++) {
1657 if (tmp > NFC_MAX_CS) {
1659 "invalid reg value: %u (max CS = 7)\n",
1664 if (test_and_set_bit(tmp, &nfc->assigned_cs)) {
1665 dev_err(dev, "CS %d already assigned\n", tmp);
1669 chip->sels[i].cs = tmp;
1672 if (tmp >= 0 && tmp < 2) {
1673 chip->sels[i].rb.type = RB_NATIVE;
1674 chip->sels[i].rb.info.nativeid = tmp;
1676 ret = gpio_request_by_name_nodev(offset_to_ofnode(node),
1678 &chip->sels[i].rb.info.gpio,
1681 chip->sels[i].rb.type = RB_GPIO;
1683 chip->sels[i].rb.type = RB_NONE;
1687 timings = onfi_async_timing_mode_to_sdr_timings(0);
1688 if (IS_ERR(timings)) {
1689 ret = PTR_ERR(timings);
1691 "could not retrieve timings for ONFI mode 0: %d\n",
1696 ret = sunxi_nand_chip_set_timings(chip, timings);
1698 dev_err(dev, "could not configure chip timings: %d\n", ret);
1703 /* Default tR value specified in the ONFI spec (chapter 4.15.1) */
1704 nand->chip_delay = 200;
1705 nand->controller = &nfc->controller;
1707 * Set the ECC mode to the default value in case nothing is specified
1710 nand->ecc.mode = NAND_ECC_HW;
1711 nand->flash_node = node;
1712 nand->select_chip = sunxi_nfc_select_chip;
1713 nand->cmd_ctrl = sunxi_nfc_cmd_ctrl;
1714 nand->read_buf = sunxi_nfc_read_buf;
1715 nand->write_buf = sunxi_nfc_write_buf;
1716 nand->read_byte = sunxi_nfc_read_byte;
1718 mtd = nand_to_mtd(nand);
1719 ret = nand_scan_ident(mtd, nsels, NULL);
1723 if (nand->bbt_options & NAND_BBT_USE_FLASH)
1724 nand->bbt_options |= NAND_BBT_NO_OOB;
1726 if (nand->options & NAND_NEED_SCRAMBLING)
1727 nand->options |= NAND_NO_SUBPAGE_WRITE;
1729 nand->options |= NAND_SUBPAGE_READ;
1731 ret = sunxi_nand_chip_init_timings(chip);
1733 dev_err(dev, "could not configure chip timings: %d\n", ret);
1737 ret = sunxi_nand_ecc_init(mtd, &nand->ecc);
1739 dev_err(dev, "ECC init failed: %d\n", ret);
1743 ret = nand_scan_tail(mtd);
1745 dev_err(dev, "nand_scan_tail failed: %d\n", ret);
1749 ret = nand_register(devnum, mtd);
1751 dev_err(dev, "failed to register mtd device: %d\n", ret);
1755 list_add_tail(&chip->node, &nfc->chips);
1760 static int sunxi_nand_chips_init(int node, struct sunxi_nfc *nfc)
1762 const void *blob = gd->fdt_blob;
1766 for (nand_node = fdt_first_subnode(blob, node); nand_node >= 0;
1767 nand_node = fdt_next_subnode(blob, nand_node))
1771 dev_err(dev, "too many NAND chips: %d (max = 8)\n", i);
1776 for (nand_node = fdt_first_subnode(blob, node); nand_node >= 0;
1777 nand_node = fdt_next_subnode(blob, nand_node)) {
1778 ret = sunxi_nand_chip_init(nand_node, nfc, i++);
1787 static void sunxi_nand_chips_cleanup(struct sunxi_nfc *nfc)
1789 struct sunxi_nand_chip *chip;
1791 while (!list_empty(&nfc->chips)) {
1792 chip = list_first_entry(&nfc->chips, struct sunxi_nand_chip,
1794 nand_release(&chip->mtd);
1795 sunxi_nand_ecc_cleanup(&chip->nand.ecc);
1796 list_del(&chip->node);
1800 #endif /* __UBOOT__ */
1802 void sunxi_nand_init(void)
1804 const void *blob = gd->fdt_blob;
1805 struct sunxi_nfc *nfc;
1810 nfc = kzalloc(sizeof(*nfc), GFP_KERNEL);
1814 spin_lock_init(&nfc->controller.lock);
1815 init_waitqueue_head(&nfc->controller.wq);
1816 INIT_LIST_HEAD(&nfc->chips);
1818 node = fdtdec_next_compatible(blob, 0, COMPAT_SUNXI_NAND);
1820 pr_err("unable to find nfc node in device tree\n");
1824 if (!fdtdec_get_is_enabled(blob, node)) {
1825 pr_err("nfc disabled in device tree\n");
1829 regs = fdtdec_get_addr(blob, node, "reg");
1830 if (regs == FDT_ADDR_T_NONE) {
1831 pr_err("unable to find nfc address in device tree\n");
1835 nfc->regs = (void *)regs;
1837 ret = sunxi_nfc_rst(nfc);
1841 ret = sunxi_nand_chips_init(node, nfc);
1843 dev_err(dev, "failed to init nand chips\n");
1853 MODULE_LICENSE("GPL v2");
1854 MODULE_AUTHOR("Boris BREZILLON");
1855 MODULE_DESCRIPTION("Allwinner NAND Flash Controller driver");