1 // SPDX-License-Identifier: GPL-2.0+
7 * https://github.com/yuq/sunxi-nfc-mtd
10 * https://github.com/hno/Allwinner-Info
11 * Copyright (C) 2013 Henrik Nordström <Henrik Nordström>
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 <asm/global_data.h>
33 #include <dm/device_compat.h>
34 #include <dm/devres.h>
35 #include <linux/bitops.h>
36 #include <linux/delay.h>
37 #include <linux/err.h>
39 #include <linux/kernel.h>
40 #include <linux/mtd/mtd.h>
41 #include <linux/mtd/rawnand.h>
42 #include <linux/mtd/partitions.h>
46 #include <asm/arch/clock.h>
48 DECLARE_GLOBAL_DATA_PTR;
50 #define NFC_REG_CTL 0x0000
51 #define NFC_REG_ST 0x0004
52 #define NFC_REG_INT 0x0008
53 #define NFC_REG_TIMING_CTL 0x000C
54 #define NFC_REG_TIMING_CFG 0x0010
55 #define NFC_REG_ADDR_LOW 0x0014
56 #define NFC_REG_ADDR_HIGH 0x0018
57 #define NFC_REG_SECTOR_NUM 0x001C
58 #define NFC_REG_CNT 0x0020
59 #define NFC_REG_CMD 0x0024
60 #define NFC_REG_RCMD_SET 0x0028
61 #define NFC_REG_WCMD_SET 0x002C
62 #define NFC_REG_IO_DATA 0x0030
63 #define NFC_REG_ECC_CTL 0x0034
64 #define NFC_REG_ECC_ST 0x0038
65 #define NFC_REG_DEBUG 0x003C
66 #define NFC_REG_ECC_ERR_CNT(x) ((0x0040 + (x)) & ~0x3)
67 #define NFC_REG_USER_DATA(x) (0x0050 + ((x) * 4))
68 #define NFC_REG_SPARE_AREA 0x00A0
69 #define NFC_REG_PAT_ID 0x00A4
70 #define NFC_RAM0_BASE 0x0400
71 #define NFC_RAM1_BASE 0x0800
73 /* define bit use in NFC_CTL */
75 #define NFC_RESET BIT(1)
76 #define NFC_BUS_WIDTH_MSK BIT(2)
77 #define NFC_BUS_WIDTH_8 (0 << 2)
78 #define NFC_BUS_WIDTH_16 (1 << 2)
79 #define NFC_RB_SEL_MSK BIT(3)
80 #define NFC_RB_SEL(x) ((x) << 3)
81 #define NFC_CE_SEL_MSK (0x7 << 24)
82 #define NFC_CE_SEL(x) ((x) << 24)
83 #define NFC_CE_CTL BIT(6)
84 #define NFC_PAGE_SHIFT_MSK (0xf << 8)
85 #define NFC_PAGE_SHIFT(x) (((x) < 10 ? 0 : (x) - 10) << 8)
86 #define NFC_SAM BIT(12)
87 #define NFC_RAM_METHOD BIT(14)
88 #define NFC_DEBUG_CTL BIT(31)
90 /* define bit use in NFC_ST */
91 #define NFC_RB_B2R BIT(0)
92 #define NFC_CMD_INT_FLAG BIT(1)
93 #define NFC_DMA_INT_FLAG BIT(2)
94 #define NFC_CMD_FIFO_STATUS BIT(3)
95 #define NFC_STA BIT(4)
96 #define NFC_NATCH_INT_FLAG BIT(5)
97 #define NFC_RB_STATE(x) BIT(x + 8)
99 /* define bit use in NFC_INT */
100 #define NFC_B2R_INT_ENABLE BIT(0)
101 #define NFC_CMD_INT_ENABLE BIT(1)
102 #define NFC_DMA_INT_ENABLE BIT(2)
103 #define NFC_INT_MASK (NFC_B2R_INT_ENABLE | \
104 NFC_CMD_INT_ENABLE | \
107 /* define bit use in NFC_TIMING_CTL */
108 #define NFC_TIMING_CTL_EDO BIT(8)
110 /* define NFC_TIMING_CFG register layout */
111 #define NFC_TIMING_CFG(tWB, tADL, tWHR, tRHW, tCAD) \
112 (((tWB) & 0x3) | (((tADL) & 0x3) << 2) | \
113 (((tWHR) & 0x3) << 4) | (((tRHW) & 0x3) << 6) | \
114 (((tCAD) & 0x7) << 8))
116 /* define bit use in NFC_CMD */
117 #define NFC_CMD_LOW_BYTE_MSK 0xff
118 #define NFC_CMD_HIGH_BYTE_MSK (0xff << 8)
119 #define NFC_CMD(x) (x)
120 #define NFC_ADR_NUM_MSK (0x7 << 16)
121 #define NFC_ADR_NUM(x) (((x) - 1) << 16)
122 #define NFC_SEND_ADR BIT(19)
123 #define NFC_ACCESS_DIR BIT(20)
124 #define NFC_DATA_TRANS BIT(21)
125 #define NFC_SEND_CMD1 BIT(22)
126 #define NFC_WAIT_FLAG BIT(23)
127 #define NFC_SEND_CMD2 BIT(24)
128 #define NFC_SEQ BIT(25)
129 #define NFC_DATA_SWAP_METHOD BIT(26)
130 #define NFC_ROW_AUTO_INC BIT(27)
131 #define NFC_SEND_CMD3 BIT(28)
132 #define NFC_SEND_CMD4 BIT(29)
133 #define NFC_CMD_TYPE_MSK (0x3 << 30)
134 #define NFC_NORMAL_OP (0 << 30)
135 #define NFC_ECC_OP (1 << 30)
136 #define NFC_PAGE_OP (2 << 30)
138 /* define bit use in NFC_RCMD_SET */
139 #define NFC_READ_CMD_MSK 0xff
140 #define NFC_RND_READ_CMD0_MSK (0xff << 8)
141 #define NFC_RND_READ_CMD1_MSK (0xff << 16)
143 /* define bit use in NFC_WCMD_SET */
144 #define NFC_PROGRAM_CMD_MSK 0xff
145 #define NFC_RND_WRITE_CMD_MSK (0xff << 8)
146 #define NFC_READ_CMD0_MSK (0xff << 16)
147 #define NFC_READ_CMD1_MSK (0xff << 24)
149 /* define bit use in NFC_ECC_CTL */
150 #define NFC_ECC_EN BIT(0)
151 #define NFC_ECC_PIPELINE BIT(3)
152 #define NFC_ECC_EXCEPTION BIT(4)
153 #define NFC_ECC_BLOCK_SIZE_MSK BIT(5)
154 #define NFC_ECC_BLOCK_512 (1 << 5)
155 #define NFC_RANDOM_EN BIT(9)
156 #define NFC_RANDOM_DIRECTION BIT(10)
157 #define NFC_ECC_MODE_MSK (0xf << 12)
158 #define NFC_ECC_MODE(x) ((x) << 12)
159 #define NFC_RANDOM_SEED_MSK (0x7fff << 16)
160 #define NFC_RANDOM_SEED(x) ((x) << 16)
162 /* define bit use in NFC_ECC_ST */
163 #define NFC_ECC_ERR(x) BIT(x)
164 #define NFC_ECC_PAT_FOUND(x) BIT(x + 16)
165 #define NFC_ECC_ERR_CNT(b, x) (((x) >> ((b) * 8)) & 0xff)
167 #define NFC_DEFAULT_TIMEOUT_MS 1000
169 #define NFC_SRAM_SIZE 1024
174 * Ready/Busy detection type: describes the Ready/Busy detection modes
176 * @RB_NONE: no external detection available, rely on STATUS command
177 * and software timeouts
178 * @RB_NATIVE: use sunxi NAND controller Ready/Busy support. The Ready/Busy
179 * pin of the NAND flash chip must be connected to one of the
180 * native NAND R/B pins (those which can be muxed to the NAND
182 * @RB_GPIO: use a simple GPIO to handle Ready/Busy status. The Ready/Busy
183 * pin of the NAND flash chip must be connected to a GPIO capable
186 enum sunxi_nand_rb_type {
193 * Ready/Busy structure: stores information related to Ready/Busy detection
195 * @type: the Ready/Busy detection mode
196 * @info: information related to the R/B detection mode. Either a gpio
197 * id or a native R/B id (those supported by the NAND controller).
199 struct sunxi_nand_rb {
200 enum sunxi_nand_rb_type type;
202 struct gpio_desc gpio;
208 * Chip Select structure: stores information related to NAND Chip Select
210 * @cs: the NAND CS id used to communicate with a NAND Chip
211 * @rb: the Ready/Busy description
213 struct sunxi_nand_chip_sel {
215 struct sunxi_nand_rb rb;
219 * sunxi HW ECC infos: stores information related to HW ECC support
221 * @mode: the sunxi ECC mode field deduced from ECC requirements
222 * @layout: the OOB layout depending on the ECC requirements and the
225 struct sunxi_nand_hw_ecc {
227 struct nand_ecclayout layout;
231 * NAND chip structure: stores NAND chip device related information
233 * @node: used to store NAND chips into a list
234 * @nand: base NAND chip structure
235 * @mtd: base MTD structure
236 * @clk_rate: clk_rate required for this NAND chip
237 * @timing_cfg TIMING_CFG register value for this NAND chip
238 * @selected: current active CS
239 * @nsels: number of CS lines required by the NAND chip
240 * @sels: array of CS lines descriptions
242 struct sunxi_nand_chip {
243 struct list_head node;
244 struct nand_chip nand;
245 unsigned long clk_rate;
254 struct sunxi_nand_chip_sel sels[0];
257 static inline struct sunxi_nand_chip *to_sunxi_nand(struct nand_chip *nand)
259 return container_of(nand, struct sunxi_nand_chip, nand);
263 * NAND Controller structure: stores sunxi NAND controller information
265 * @controller: base controller structure
266 * @dev: parent device (used to print error messages)
267 * @regs: NAND controller registers
268 * @ahb_clk: NAND Controller AHB clock
269 * @mod_clk: NAND Controller mod clock
270 * @assigned_cs: bitmask describing already assigned CS lines
271 * @clk_rate: NAND controller current clock rate
272 * @chips: a list containing all the NAND chips attached to
273 * this NAND controller
274 * @complete: a completion object used to wait for NAND
278 struct nand_hw_control controller;
283 unsigned long assigned_cs;
284 unsigned long clk_rate;
285 struct list_head chips;
288 static inline struct sunxi_nfc *to_sunxi_nfc(struct nand_hw_control *ctrl)
290 return container_of(ctrl, struct sunxi_nfc, controller);
293 static void sunxi_nfc_set_clk_rate(unsigned long hz)
295 struct sunxi_ccm_reg *const ccm =
296 (struct sunxi_ccm_reg *)SUNXI_CCM_BASE;
299 div_m = (clock_get_pll6() + hz - 1) / hz;
300 for (div_n = 0; div_n < 3 && div_m > 16; div_n++) {
308 /* config mod clock */
309 writel(CCM_NAND_CTRL_ENABLE | CCM_NAND_CTRL_PLL6 |
310 CCM_NAND_CTRL_N(div_n) | CCM_NAND_CTRL_M(div_m),
311 &ccm->nand0_clk_cfg);
313 /* gate on nand clock */
314 setbits_le32(&ccm->ahb_gate0, (1 << AHB_GATE_OFFSET_NAND0));
315 #ifdef CONFIG_MACH_SUN9I
316 setbits_le32(&ccm->ahb_gate1, (1 << AHB_GATE_OFFSET_DMA));
318 setbits_le32(&ccm->ahb_gate0, (1 << AHB_GATE_OFFSET_DMA));
322 static int sunxi_nfc_wait_int(struct sunxi_nfc *nfc, u32 flags,
323 unsigned int timeout_ms)
325 unsigned int timeout_ticks;
326 u32 time_start, status;
327 int ret = -ETIMEDOUT;
330 timeout_ms = NFC_DEFAULT_TIMEOUT_MS;
332 timeout_ticks = (timeout_ms * CONFIG_SYS_HZ) / 1000;
334 time_start = get_timer(0);
337 status = readl(nfc->regs + NFC_REG_ST);
338 if ((status & flags) == flags) {
344 } while (get_timer(time_start) < timeout_ticks);
346 writel(status & flags, nfc->regs + NFC_REG_ST);
351 static int sunxi_nfc_wait_cmd_fifo_empty(struct sunxi_nfc *nfc)
353 unsigned long timeout = (CONFIG_SYS_HZ *
354 NFC_DEFAULT_TIMEOUT_MS) / 1000;
357 time_start = get_timer(0);
359 if (!(readl(nfc->regs + NFC_REG_ST) & NFC_CMD_FIFO_STATUS))
361 } while (get_timer(time_start) < timeout);
363 dev_err(nfc->dev, "wait for empty cmd FIFO timedout\n");
367 static int sunxi_nfc_rst(struct sunxi_nfc *nfc)
369 unsigned long timeout = (CONFIG_SYS_HZ *
370 NFC_DEFAULT_TIMEOUT_MS) / 1000;
373 writel(0, nfc->regs + NFC_REG_ECC_CTL);
374 writel(NFC_RESET, nfc->regs + NFC_REG_CTL);
376 time_start = get_timer(0);
378 if (!(readl(nfc->regs + NFC_REG_CTL) & NFC_RESET))
380 } while (get_timer(time_start) < timeout);
382 dev_err(nfc->dev, "wait for NAND controller reset timedout\n");
386 static int sunxi_nfc_dev_ready(struct mtd_info *mtd)
388 struct nand_chip *nand = mtd_to_nand(mtd);
389 struct sunxi_nand_chip *sunxi_nand = to_sunxi_nand(nand);
390 struct sunxi_nfc *nfc = to_sunxi_nfc(sunxi_nand->nand.controller);
391 struct sunxi_nand_rb *rb;
392 unsigned long timeo = (sunxi_nand->nand.state == FL_ERASING ? 400 : 20);
395 if (sunxi_nand->selected < 0)
398 rb = &sunxi_nand->sels[sunxi_nand->selected].rb;
402 ret = !!(readl(nfc->regs + NFC_REG_ST) &
403 NFC_RB_STATE(rb->info.nativeid));
407 sunxi_nfc_wait_int(nfc, NFC_RB_B2R, timeo);
408 ret = !!(readl(nfc->regs + NFC_REG_ST) &
409 NFC_RB_STATE(rb->info.nativeid));
412 ret = dm_gpio_get_value(&rb->info.gpio);
417 dev_err(nfc->dev, "cannot check R/B NAND status!\n");
424 static void sunxi_nfc_select_chip(struct mtd_info *mtd, int chip)
426 struct nand_chip *nand = mtd_to_nand(mtd);
427 struct sunxi_nand_chip *sunxi_nand = to_sunxi_nand(nand);
428 struct sunxi_nfc *nfc = to_sunxi_nfc(sunxi_nand->nand.controller);
429 struct sunxi_nand_chip_sel *sel;
432 if (chip > 0 && chip >= sunxi_nand->nsels)
435 if (chip == sunxi_nand->selected)
438 ctl = readl(nfc->regs + NFC_REG_CTL) &
439 ~(NFC_PAGE_SHIFT_MSK | NFC_CE_SEL_MSK | NFC_RB_SEL_MSK | NFC_EN);
442 sel = &sunxi_nand->sels[chip];
444 ctl |= NFC_CE_SEL(sel->cs) | NFC_EN |
445 NFC_PAGE_SHIFT(nand->page_shift - 10);
446 if (sel->rb.type == RB_NONE) {
447 nand->dev_ready = NULL;
449 nand->dev_ready = sunxi_nfc_dev_ready;
450 if (sel->rb.type == RB_NATIVE)
451 ctl |= NFC_RB_SEL(sel->rb.info.nativeid);
454 writel(mtd->writesize, nfc->regs + NFC_REG_SPARE_AREA);
456 if (nfc->clk_rate != sunxi_nand->clk_rate) {
457 sunxi_nfc_set_clk_rate(sunxi_nand->clk_rate);
458 nfc->clk_rate = sunxi_nand->clk_rate;
462 writel(sunxi_nand->timing_ctl, nfc->regs + NFC_REG_TIMING_CTL);
463 writel(sunxi_nand->timing_cfg, nfc->regs + NFC_REG_TIMING_CFG);
464 writel(ctl, nfc->regs + NFC_REG_CTL);
466 sunxi_nand->selected = chip;
469 static void sunxi_nfc_read_buf(struct mtd_info *mtd, uint8_t *buf, int len)
471 struct nand_chip *nand = mtd_to_nand(mtd);
472 struct sunxi_nand_chip *sunxi_nand = to_sunxi_nand(nand);
473 struct sunxi_nfc *nfc = to_sunxi_nfc(sunxi_nand->nand.controller);
480 cnt = min(len - offs, NFC_SRAM_SIZE);
482 ret = sunxi_nfc_wait_cmd_fifo_empty(nfc);
486 writel(cnt, nfc->regs + NFC_REG_CNT);
487 tmp = NFC_DATA_TRANS | NFC_DATA_SWAP_METHOD;
488 writel(tmp, nfc->regs + NFC_REG_CMD);
490 ret = sunxi_nfc_wait_int(nfc, NFC_CMD_INT_FLAG, 0);
495 memcpy_fromio(buf + offs, nfc->regs + NFC_RAM0_BASE,
501 static void sunxi_nfc_write_buf(struct mtd_info *mtd, const uint8_t *buf,
504 struct nand_chip *nand = mtd_to_nand(mtd);
505 struct sunxi_nand_chip *sunxi_nand = to_sunxi_nand(nand);
506 struct sunxi_nfc *nfc = to_sunxi_nfc(sunxi_nand->nand.controller);
513 cnt = min(len - offs, NFC_SRAM_SIZE);
515 ret = sunxi_nfc_wait_cmd_fifo_empty(nfc);
519 writel(cnt, nfc->regs + NFC_REG_CNT);
520 memcpy_toio(nfc->regs + NFC_RAM0_BASE, buf + offs, cnt);
521 tmp = NFC_DATA_TRANS | NFC_DATA_SWAP_METHOD |
523 writel(tmp, nfc->regs + NFC_REG_CMD);
525 ret = sunxi_nfc_wait_int(nfc, NFC_CMD_INT_FLAG, 0);
533 static uint8_t sunxi_nfc_read_byte(struct mtd_info *mtd)
537 sunxi_nfc_read_buf(mtd, &ret, 1);
542 static void sunxi_nfc_cmd_ctrl(struct mtd_info *mtd, int dat,
545 struct nand_chip *nand = mtd_to_nand(mtd);
546 struct sunxi_nand_chip *sunxi_nand = to_sunxi_nand(nand);
547 struct sunxi_nfc *nfc = to_sunxi_nfc(sunxi_nand->nand.controller);
551 ret = sunxi_nfc_wait_cmd_fifo_empty(nfc);
555 if (ctrl & NAND_CTRL_CHANGE) {
556 tmp = readl(nfc->regs + NFC_REG_CTL);
561 writel(tmp, nfc->regs + NFC_REG_CTL);
564 if (dat == NAND_CMD_NONE && (ctrl & NAND_NCE) &&
565 !(ctrl & (NAND_CLE | NAND_ALE))) {
568 if (!sunxi_nand->addr_cycles && !sunxi_nand->cmd_cycles)
571 if (sunxi_nand->cmd_cycles--)
572 cmd |= NFC_SEND_CMD1 | sunxi_nand->cmd[0];
574 if (sunxi_nand->cmd_cycles--) {
575 cmd |= NFC_SEND_CMD2;
576 writel(sunxi_nand->cmd[1],
577 nfc->regs + NFC_REG_RCMD_SET);
580 sunxi_nand->cmd_cycles = 0;
582 if (sunxi_nand->addr_cycles) {
583 cmd |= NFC_SEND_ADR |
584 NFC_ADR_NUM(sunxi_nand->addr_cycles);
585 writel(sunxi_nand->addr[0],
586 nfc->regs + NFC_REG_ADDR_LOW);
589 if (sunxi_nand->addr_cycles > 4)
590 writel(sunxi_nand->addr[1],
591 nfc->regs + NFC_REG_ADDR_HIGH);
593 writel(cmd, nfc->regs + NFC_REG_CMD);
594 sunxi_nand->addr[0] = 0;
595 sunxi_nand->addr[1] = 0;
596 sunxi_nand->addr_cycles = 0;
597 sunxi_nfc_wait_int(nfc, NFC_CMD_INT_FLAG, 0);
600 if (ctrl & NAND_CLE) {
601 sunxi_nand->cmd[sunxi_nand->cmd_cycles++] = dat;
602 } else if (ctrl & NAND_ALE) {
603 sunxi_nand->addr[sunxi_nand->addr_cycles / 4] |=
604 dat << ((sunxi_nand->addr_cycles % 4) * 8);
605 sunxi_nand->addr_cycles++;
609 /* These seed values have been extracted from Allwinner's BSP */
610 static const u16 sunxi_nfc_randomizer_page_seeds[] = {
611 0x2b75, 0x0bd0, 0x5ca3, 0x62d1, 0x1c93, 0x07e9, 0x2162, 0x3a72,
612 0x0d67, 0x67f9, 0x1be7, 0x077d, 0x032f, 0x0dac, 0x2716, 0x2436,
613 0x7922, 0x1510, 0x3860, 0x5287, 0x480f, 0x4252, 0x1789, 0x5a2d,
614 0x2a49, 0x5e10, 0x437f, 0x4b4e, 0x2f45, 0x216e, 0x5cb7, 0x7130,
615 0x2a3f, 0x60e4, 0x4dc9, 0x0ef0, 0x0f52, 0x1bb9, 0x6211, 0x7a56,
616 0x226d, 0x4ea7, 0x6f36, 0x3692, 0x38bf, 0x0c62, 0x05eb, 0x4c55,
617 0x60f4, 0x728c, 0x3b6f, 0x2037, 0x7f69, 0x0936, 0x651a, 0x4ceb,
618 0x6218, 0x79f3, 0x383f, 0x18d9, 0x4f05, 0x5c82, 0x2912, 0x6f17,
619 0x6856, 0x5938, 0x1007, 0x61ab, 0x3e7f, 0x57c2, 0x542f, 0x4f62,
620 0x7454, 0x2eac, 0x7739, 0x42d4, 0x2f90, 0x435a, 0x2e52, 0x2064,
621 0x637c, 0x66ad, 0x2c90, 0x0bad, 0x759c, 0x0029, 0x0986, 0x7126,
622 0x1ca7, 0x1605, 0x386a, 0x27f5, 0x1380, 0x6d75, 0x24c3, 0x0f8e,
623 0x2b7a, 0x1418, 0x1fd1, 0x7dc1, 0x2d8e, 0x43af, 0x2267, 0x7da3,
624 0x4e3d, 0x1338, 0x50db, 0x454d, 0x764d, 0x40a3, 0x42e6, 0x262b,
625 0x2d2e, 0x1aea, 0x2e17, 0x173d, 0x3a6e, 0x71bf, 0x25f9, 0x0a5d,
626 0x7c57, 0x0fbe, 0x46ce, 0x4939, 0x6b17, 0x37bb, 0x3e91, 0x76db,
630 * sunxi_nfc_randomizer_ecc512_seeds and sunxi_nfc_randomizer_ecc1024_seeds
631 * have been generated using
632 * sunxi_nfc_randomizer_step(seed, (step_size * 8) + 15), which is what
633 * the randomizer engine does internally before de/scrambling OOB data.
635 * Those tables are statically defined to avoid calculating randomizer state
638 static const u16 sunxi_nfc_randomizer_ecc512_seeds[] = {
639 0x3346, 0x367f, 0x1f18, 0x769a, 0x4f64, 0x068c, 0x2ef1, 0x6b64,
640 0x28a9, 0x15d7, 0x30f8, 0x3659, 0x53db, 0x7c5f, 0x71d4, 0x4409,
641 0x26eb, 0x03cc, 0x655d, 0x47d4, 0x4daa, 0x0877, 0x712d, 0x3617,
642 0x3264, 0x49aa, 0x7f9e, 0x588e, 0x4fbc, 0x7176, 0x7f91, 0x6c6d,
643 0x4b95, 0x5fb7, 0x3844, 0x4037, 0x0184, 0x081b, 0x0ee8, 0x5b91,
644 0x293d, 0x1f71, 0x0e6f, 0x402b, 0x5122, 0x1e52, 0x22be, 0x3d2d,
645 0x75bc, 0x7c60, 0x6291, 0x1a2f, 0x61d4, 0x74aa, 0x4140, 0x29ab,
646 0x472d, 0x2852, 0x017e, 0x15e8, 0x5ec2, 0x17cf, 0x7d0f, 0x06b8,
647 0x117a, 0x6b94, 0x789b, 0x3126, 0x6ac5, 0x5be7, 0x150f, 0x51f8,
648 0x7889, 0x0aa5, 0x663d, 0x77e8, 0x0b87, 0x3dcb, 0x360d, 0x218b,
649 0x512f, 0x7dc9, 0x6a4d, 0x630a, 0x3547, 0x1dd2, 0x5aea, 0x69a5,
650 0x7bfa, 0x5e4f, 0x1519, 0x6430, 0x3a0e, 0x5eb3, 0x5425, 0x0c7a,
651 0x5540, 0x3670, 0x63c1, 0x31e9, 0x5a39, 0x2de7, 0x5979, 0x2891,
652 0x1562, 0x014b, 0x5b05, 0x2756, 0x5a34, 0x13aa, 0x6cb5, 0x2c36,
653 0x5e72, 0x1306, 0x0861, 0x15ef, 0x1ee8, 0x5a37, 0x7ac4, 0x45dd,
654 0x44c4, 0x7266, 0x2f41, 0x3ccc, 0x045e, 0x7d40, 0x7c66, 0x0fa0,
657 static const u16 sunxi_nfc_randomizer_ecc1024_seeds[] = {
658 0x2cf5, 0x35f1, 0x63a4, 0x5274, 0x2bd2, 0x778b, 0x7285, 0x32b6,
659 0x6a5c, 0x70d6, 0x757d, 0x6769, 0x5375, 0x1e81, 0x0cf3, 0x3982,
660 0x6787, 0x042a, 0x6c49, 0x1925, 0x56a8, 0x40a9, 0x063e, 0x7bd9,
661 0x4dbf, 0x55ec, 0x672e, 0x7334, 0x5185, 0x4d00, 0x232a, 0x7e07,
662 0x445d, 0x6b92, 0x528f, 0x4255, 0x53ba, 0x7d82, 0x2a2e, 0x3a4e,
663 0x75eb, 0x450c, 0x6844, 0x1b5d, 0x581a, 0x4cc6, 0x0379, 0x37b2,
664 0x419f, 0x0e92, 0x6b27, 0x5624, 0x01e3, 0x07c1, 0x44a5, 0x130c,
665 0x13e8, 0x5910, 0x0876, 0x60c5, 0x54e3, 0x5b7f, 0x2269, 0x509f,
666 0x7665, 0x36fd, 0x3e9a, 0x0579, 0x6295, 0x14ef, 0x0a81, 0x1bcc,
667 0x4b16, 0x64db, 0x0514, 0x4f07, 0x0591, 0x3576, 0x6853, 0x0d9e,
668 0x259f, 0x38b7, 0x64fb, 0x3094, 0x4693, 0x6ddd, 0x29bb, 0x0bc8,
669 0x3f47, 0x490e, 0x0c0e, 0x7933, 0x3c9e, 0x5840, 0x398d, 0x3e68,
670 0x4af1, 0x71f5, 0x57cf, 0x1121, 0x64eb, 0x3579, 0x15ac, 0x584d,
671 0x5f2a, 0x47e2, 0x6528, 0x6eac, 0x196e, 0x6b96, 0x0450, 0x0179,
672 0x609c, 0x06e1, 0x4626, 0x42c7, 0x273e, 0x486f, 0x0705, 0x1601,
673 0x145b, 0x407e, 0x062b, 0x57a5, 0x53f9, 0x5659, 0x4410, 0x3ccd,
676 static u16 sunxi_nfc_randomizer_step(u16 state, int count)
681 * This loop is just a simple implementation of a Fibonacci LFSR using
682 * the x16 + x15 + 1 polynomial.
685 state = ((state >> 1) |
686 (((state ^ (state >> 1)) & 1) << 14)) & 0x7fff;
691 static u16 sunxi_nfc_randomizer_state(struct mtd_info *mtd, int page, bool ecc)
693 const u16 *seeds = sunxi_nfc_randomizer_page_seeds;
694 int mod = mtd->erasesize / mtd->writesize;
696 if (mod > ARRAY_SIZE(sunxi_nfc_randomizer_page_seeds))
697 mod = ARRAY_SIZE(sunxi_nfc_randomizer_page_seeds);
700 if (mtd->ecc_step_size == 512)
701 seeds = sunxi_nfc_randomizer_ecc512_seeds;
703 seeds = sunxi_nfc_randomizer_ecc1024_seeds;
706 return seeds[page % mod];
709 static void sunxi_nfc_randomizer_config(struct mtd_info *mtd,
712 struct nand_chip *nand = mtd_to_nand(mtd);
713 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
714 u32 ecc_ctl = readl(nfc->regs + NFC_REG_ECC_CTL);
717 if (!(nand->options & NAND_NEED_SCRAMBLING))
720 ecc_ctl = readl(nfc->regs + NFC_REG_ECC_CTL);
721 state = sunxi_nfc_randomizer_state(mtd, page, ecc);
722 ecc_ctl = readl(nfc->regs + NFC_REG_ECC_CTL) & ~NFC_RANDOM_SEED_MSK;
723 writel(ecc_ctl | NFC_RANDOM_SEED(state), nfc->regs + NFC_REG_ECC_CTL);
726 static void sunxi_nfc_randomizer_enable(struct mtd_info *mtd)
728 struct nand_chip *nand = mtd_to_nand(mtd);
729 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
731 if (!(nand->options & NAND_NEED_SCRAMBLING))
734 writel(readl(nfc->regs + NFC_REG_ECC_CTL) | NFC_RANDOM_EN,
735 nfc->regs + NFC_REG_ECC_CTL);
738 static void sunxi_nfc_randomizer_disable(struct mtd_info *mtd)
740 struct nand_chip *nand = mtd_to_nand(mtd);
741 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
743 if (!(nand->options & NAND_NEED_SCRAMBLING))
746 writel(readl(nfc->regs + NFC_REG_ECC_CTL) & ~NFC_RANDOM_EN,
747 nfc->regs + NFC_REG_ECC_CTL);
750 static void sunxi_nfc_randomize_bbm(struct mtd_info *mtd, int page, u8 *bbm)
752 u16 state = sunxi_nfc_randomizer_state(mtd, page, true);
755 bbm[1] ^= sunxi_nfc_randomizer_step(state, 8);
758 static void sunxi_nfc_randomizer_write_buf(struct mtd_info *mtd,
759 const uint8_t *buf, int len,
762 sunxi_nfc_randomizer_config(mtd, page, ecc);
763 sunxi_nfc_randomizer_enable(mtd);
764 sunxi_nfc_write_buf(mtd, buf, len);
765 sunxi_nfc_randomizer_disable(mtd);
768 static void sunxi_nfc_randomizer_read_buf(struct mtd_info *mtd, uint8_t *buf,
769 int len, bool ecc, int page)
771 sunxi_nfc_randomizer_config(mtd, page, ecc);
772 sunxi_nfc_randomizer_enable(mtd);
773 sunxi_nfc_read_buf(mtd, buf, len);
774 sunxi_nfc_randomizer_disable(mtd);
777 static void sunxi_nfc_hw_ecc_enable(struct mtd_info *mtd)
779 struct nand_chip *nand = mtd_to_nand(mtd);
780 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
781 struct sunxi_nand_hw_ecc *data = nand->ecc.priv;
784 ecc_ctl = readl(nfc->regs + NFC_REG_ECC_CTL);
785 ecc_ctl &= ~(NFC_ECC_MODE_MSK | NFC_ECC_PIPELINE |
786 NFC_ECC_BLOCK_SIZE_MSK);
787 ecc_ctl |= NFC_ECC_EN | NFC_ECC_MODE(data->mode) | NFC_ECC_EXCEPTION;
789 if (nand->ecc.size == 512)
790 ecc_ctl |= NFC_ECC_BLOCK_512;
792 writel(ecc_ctl, nfc->regs + NFC_REG_ECC_CTL);
795 static void sunxi_nfc_hw_ecc_disable(struct mtd_info *mtd)
797 struct nand_chip *nand = mtd_to_nand(mtd);
798 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
800 writel(readl(nfc->regs + NFC_REG_ECC_CTL) & ~NFC_ECC_EN,
801 nfc->regs + NFC_REG_ECC_CTL);
804 static inline void sunxi_nfc_user_data_to_buf(u32 user_data, u8 *buf)
807 buf[1] = user_data >> 8;
808 buf[2] = user_data >> 16;
809 buf[3] = user_data >> 24;
812 static int sunxi_nfc_hw_ecc_read_chunk(struct mtd_info *mtd,
813 u8 *data, int data_off,
814 u8 *oob, int oob_off,
816 unsigned int *max_bitflips,
819 struct nand_chip *nand = mtd_to_nand(mtd);
820 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
821 struct nand_ecc_ctrl *ecc = &nand->ecc;
826 if (*cur_off != data_off)
827 nand->cmdfunc(mtd, NAND_CMD_RNDOUT, data_off, -1);
829 sunxi_nfc_randomizer_read_buf(mtd, NULL, ecc->size, false, page);
831 if (data_off + ecc->size != oob_off)
832 nand->cmdfunc(mtd, NAND_CMD_RNDOUT, oob_off, -1);
834 ret = sunxi_nfc_wait_cmd_fifo_empty(nfc);
838 sunxi_nfc_randomizer_enable(mtd);
839 writel(NFC_DATA_TRANS | NFC_DATA_SWAP_METHOD | NFC_ECC_OP,
840 nfc->regs + NFC_REG_CMD);
842 ret = sunxi_nfc_wait_int(nfc, NFC_CMD_INT_FLAG, 0);
843 sunxi_nfc_randomizer_disable(mtd);
847 *cur_off = oob_off + ecc->bytes + 4;
849 status = readl(nfc->regs + NFC_REG_ECC_ST);
850 if (status & NFC_ECC_PAT_FOUND(0)) {
853 if (unlikely(!(readl(nfc->regs + NFC_REG_PAT_ID) & 0x1)))
856 memset(data, pattern, ecc->size);
857 memset(oob, pattern, ecc->bytes + 4);
862 ret = NFC_ECC_ERR_CNT(0, readl(nfc->regs + NFC_REG_ECC_ERR_CNT(0)));
864 memcpy_fromio(data, nfc->regs + NFC_RAM0_BASE, ecc->size);
866 nand->cmdfunc(mtd, NAND_CMD_RNDOUT, oob_off, -1);
867 sunxi_nfc_randomizer_read_buf(mtd, oob, ecc->bytes + 4, true, page);
869 if (status & NFC_ECC_ERR(0)) {
871 * Re-read the data with the randomizer disabled to identify
872 * bitflips in erased pages.
874 if (nand->options & NAND_NEED_SCRAMBLING) {
875 nand->cmdfunc(mtd, NAND_CMD_RNDOUT, data_off, -1);
876 nand->read_buf(mtd, data, ecc->size);
877 nand->cmdfunc(mtd, NAND_CMD_RNDOUT, oob_off, -1);
878 nand->read_buf(mtd, oob, ecc->bytes + 4);
881 ret = nand_check_erased_ecc_chunk(data, ecc->size,
883 NULL, 0, ecc->strength);
888 * The engine protects 4 bytes of OOB data per chunk.
889 * Retrieve the corrected OOB bytes.
891 sunxi_nfc_user_data_to_buf(readl(nfc->regs +
892 NFC_REG_USER_DATA(0)),
895 /* De-randomize the Bad Block Marker. */
896 if (bbm && nand->options & NAND_NEED_SCRAMBLING)
897 sunxi_nfc_randomize_bbm(mtd, page, oob);
901 mtd->ecc_stats.failed++;
903 mtd->ecc_stats.corrected += ret;
904 *max_bitflips = max_t(unsigned int, *max_bitflips, ret);
910 static void sunxi_nfc_hw_ecc_read_extra_oob(struct mtd_info *mtd,
911 u8 *oob, int *cur_off,
912 bool randomize, int page)
914 struct nand_chip *nand = mtd_to_nand(mtd);
915 struct nand_ecc_ctrl *ecc = &nand->ecc;
916 int offset = ((ecc->bytes + 4) * ecc->steps);
917 int len = mtd->oobsize - offset;
922 if (*cur_off != offset)
923 nand->cmdfunc(mtd, NAND_CMD_RNDOUT,
924 offset + mtd->writesize, -1);
927 sunxi_nfc_read_buf(mtd, oob + offset, len);
929 sunxi_nfc_randomizer_read_buf(mtd, oob + offset, len,
932 *cur_off = mtd->oobsize + mtd->writesize;
935 static inline u32 sunxi_nfc_buf_to_user_data(const u8 *buf)
937 return buf[0] | (buf[1] << 8) | (buf[2] << 16) | (buf[3] << 24);
940 static int sunxi_nfc_hw_ecc_write_chunk(struct mtd_info *mtd,
941 const u8 *data, int data_off,
942 const u8 *oob, int oob_off,
943 int *cur_off, bool bbm,
946 struct nand_chip *nand = mtd_to_nand(mtd);
947 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller);
948 struct nand_ecc_ctrl *ecc = &nand->ecc;
951 if (data_off != *cur_off)
952 nand->cmdfunc(mtd, NAND_CMD_RNDIN, data_off, -1);
954 sunxi_nfc_randomizer_write_buf(mtd, data, ecc->size, false, page);
956 /* Fill OOB data in */
957 if ((nand->options & NAND_NEED_SCRAMBLING) && bbm) {
960 memcpy(user_data, oob, 4);
961 sunxi_nfc_randomize_bbm(mtd, page, user_data);
962 writel(sunxi_nfc_buf_to_user_data(user_data),
963 nfc->regs + NFC_REG_USER_DATA(0));
965 writel(sunxi_nfc_buf_to_user_data(oob),
966 nfc->regs + NFC_REG_USER_DATA(0));
969 if (data_off + ecc->size != oob_off)
970 nand->cmdfunc(mtd, NAND_CMD_RNDIN, oob_off, -1);
972 ret = sunxi_nfc_wait_cmd_fifo_empty(nfc);
976 sunxi_nfc_randomizer_enable(mtd);
977 writel(NFC_DATA_TRANS | NFC_DATA_SWAP_METHOD |
978 NFC_ACCESS_DIR | NFC_ECC_OP,
979 nfc->regs + NFC_REG_CMD);
981 ret = sunxi_nfc_wait_int(nfc, NFC_CMD_INT_FLAG, 0);
982 sunxi_nfc_randomizer_disable(mtd);
986 *cur_off = oob_off + ecc->bytes + 4;
991 static void sunxi_nfc_hw_ecc_write_extra_oob(struct mtd_info *mtd,
992 u8 *oob, int *cur_off,
995 struct nand_chip *nand = mtd_to_nand(mtd);
996 struct nand_ecc_ctrl *ecc = &nand->ecc;
997 int offset = ((ecc->bytes + 4) * ecc->steps);
998 int len = mtd->oobsize - offset;
1003 if (*cur_off != offset)
1004 nand->cmdfunc(mtd, NAND_CMD_RNDIN,
1005 offset + mtd->writesize, -1);
1007 sunxi_nfc_randomizer_write_buf(mtd, oob + offset, len, false, page);
1009 *cur_off = mtd->oobsize + mtd->writesize;
1012 static int sunxi_nfc_hw_ecc_read_page(struct mtd_info *mtd,
1013 struct nand_chip *chip, uint8_t *buf,
1014 int oob_required, int page)
1016 struct nand_ecc_ctrl *ecc = &chip->ecc;
1017 unsigned int max_bitflips = 0;
1018 int ret, i, cur_off = 0;
1019 bool raw_mode = false;
1021 sunxi_nfc_hw_ecc_enable(mtd);
1023 for (i = 0; i < ecc->steps; i++) {
1024 int data_off = i * ecc->size;
1025 int oob_off = i * (ecc->bytes + 4);
1026 u8 *data = buf + data_off;
1027 u8 *oob = chip->oob_poi + oob_off;
1029 ret = sunxi_nfc_hw_ecc_read_chunk(mtd, data, data_off, oob,
1030 oob_off + mtd->writesize,
1031 &cur_off, &max_bitflips,
1040 sunxi_nfc_hw_ecc_read_extra_oob(mtd, chip->oob_poi, &cur_off,
1043 sunxi_nfc_hw_ecc_disable(mtd);
1045 return max_bitflips;
1048 static int sunxi_nfc_hw_ecc_read_subpage(struct mtd_info *mtd,
1049 struct nand_chip *chip,
1050 uint32_t data_offs, uint32_t readlen,
1051 uint8_t *bufpoi, int page)
1053 struct nand_ecc_ctrl *ecc = &chip->ecc;
1054 int ret, i, cur_off = 0;
1055 unsigned int max_bitflips = 0;
1057 sunxi_nfc_hw_ecc_enable(mtd);
1059 chip->cmdfunc(mtd, NAND_CMD_READ0, 0, page);
1060 for (i = data_offs / ecc->size;
1061 i < DIV_ROUND_UP(data_offs + readlen, ecc->size); i++) {
1062 int data_off = i * ecc->size;
1063 int oob_off = i * (ecc->bytes + 4);
1064 u8 *data = bufpoi + data_off;
1065 u8 *oob = chip->oob_poi + oob_off;
1067 ret = sunxi_nfc_hw_ecc_read_chunk(mtd, data, data_off,
1068 oob, oob_off + mtd->writesize,
1069 &cur_off, &max_bitflips, !i, page);
1074 sunxi_nfc_hw_ecc_disable(mtd);
1076 return max_bitflips;
1079 static int sunxi_nfc_hw_ecc_write_page(struct mtd_info *mtd,
1080 struct nand_chip *chip,
1081 const uint8_t *buf, int oob_required,
1084 struct nand_ecc_ctrl *ecc = &chip->ecc;
1085 int ret, i, cur_off = 0;
1087 sunxi_nfc_hw_ecc_enable(mtd);
1089 for (i = 0; i < ecc->steps; i++) {
1090 int data_off = i * ecc->size;
1091 int oob_off = i * (ecc->bytes + 4);
1092 const u8 *data = buf + data_off;
1093 const u8 *oob = chip->oob_poi + oob_off;
1095 ret = sunxi_nfc_hw_ecc_write_chunk(mtd, data, data_off, oob,
1096 oob_off + mtd->writesize,
1097 &cur_off, !i, page);
1102 if (oob_required || (chip->options & NAND_NEED_SCRAMBLING))
1103 sunxi_nfc_hw_ecc_write_extra_oob(mtd, chip->oob_poi,
1106 sunxi_nfc_hw_ecc_disable(mtd);
1111 static int sunxi_nfc_hw_ecc_write_subpage(struct mtd_info *mtd,
1112 struct nand_chip *chip,
1113 u32 data_offs, u32 data_len,
1114 const u8 *buf, int oob_required,
1117 struct nand_ecc_ctrl *ecc = &chip->ecc;
1118 int ret, i, cur_off = 0;
1120 sunxi_nfc_hw_ecc_enable(mtd);
1122 for (i = data_offs / ecc->size;
1123 i < DIV_ROUND_UP(data_offs + data_len, ecc->size); i++) {
1124 int data_off = i * ecc->size;
1125 int oob_off = i * (ecc->bytes + 4);
1126 const u8 *data = buf + data_off;
1127 const u8 *oob = chip->oob_poi + oob_off;
1129 ret = sunxi_nfc_hw_ecc_write_chunk(mtd, data, data_off, oob,
1130 oob_off + mtd->writesize,
1131 &cur_off, !i, page);
1136 sunxi_nfc_hw_ecc_disable(mtd);
1141 static int sunxi_nfc_hw_syndrome_ecc_read_page(struct mtd_info *mtd,
1142 struct nand_chip *chip,
1143 uint8_t *buf, int oob_required,
1146 struct nand_ecc_ctrl *ecc = &chip->ecc;
1147 unsigned int max_bitflips = 0;
1148 int ret, i, cur_off = 0;
1149 bool raw_mode = false;
1151 sunxi_nfc_hw_ecc_enable(mtd);
1153 for (i = 0; i < ecc->steps; i++) {
1154 int data_off = i * (ecc->size + ecc->bytes + 4);
1155 int oob_off = data_off + ecc->size;
1156 u8 *data = buf + (i * ecc->size);
1157 u8 *oob = chip->oob_poi + (i * (ecc->bytes + 4));
1159 ret = sunxi_nfc_hw_ecc_read_chunk(mtd, data, data_off, oob,
1161 &max_bitflips, !i, page);
1169 sunxi_nfc_hw_ecc_read_extra_oob(mtd, chip->oob_poi, &cur_off,
1172 sunxi_nfc_hw_ecc_disable(mtd);
1174 return max_bitflips;
1177 static int sunxi_nfc_hw_syndrome_ecc_write_page(struct mtd_info *mtd,
1178 struct nand_chip *chip,
1180 int oob_required, int page)
1182 struct nand_ecc_ctrl *ecc = &chip->ecc;
1183 int ret, i, cur_off = 0;
1185 sunxi_nfc_hw_ecc_enable(mtd);
1187 for (i = 0; i < ecc->steps; i++) {
1188 int data_off = i * (ecc->size + ecc->bytes + 4);
1189 int oob_off = data_off + ecc->size;
1190 const u8 *data = buf + (i * ecc->size);
1191 const u8 *oob = chip->oob_poi + (i * (ecc->bytes + 4));
1193 ret = sunxi_nfc_hw_ecc_write_chunk(mtd, data, data_off,
1194 oob, oob_off, &cur_off,
1200 if (oob_required || (chip->options & NAND_NEED_SCRAMBLING))
1201 sunxi_nfc_hw_ecc_write_extra_oob(mtd, chip->oob_poi,
1204 sunxi_nfc_hw_ecc_disable(mtd);
1209 static const s32 tWB_lut[] = {6, 12, 16, 20};
1210 static const s32 tRHW_lut[] = {4, 8, 12, 20};
1212 static int _sunxi_nand_lookup_timing(const s32 *lut, int lut_size, u32 duration,
1215 u32 clk_cycles = DIV_ROUND_UP(duration, clk_period);
1218 for (i = 0; i < lut_size; i++) {
1219 if (clk_cycles <= lut[i])
1227 #define sunxi_nand_lookup_timing(l, p, c) \
1228 _sunxi_nand_lookup_timing(l, ARRAY_SIZE(l), p, c)
1230 static int sunxi_nand_chip_set_timings(struct sunxi_nfc *nfc,
1231 struct sunxi_nand_chip *chip,
1232 const struct nand_sdr_timings *timings)
1234 u32 min_clk_period = 0;
1235 s32 tWB, tADL, tWHR, tRHW, tCAD;
1238 if (timings->tCLS_min > min_clk_period)
1239 min_clk_period = timings->tCLS_min;
1242 if (timings->tCLH_min > min_clk_period)
1243 min_clk_period = timings->tCLH_min;
1246 if (timings->tCS_min > min_clk_period)
1247 min_clk_period = timings->tCS_min;
1250 if (timings->tCH_min > min_clk_period)
1251 min_clk_period = timings->tCH_min;
1254 if (timings->tWP_min > min_clk_period)
1255 min_clk_period = timings->tWP_min;
1258 if (timings->tWH_min > min_clk_period)
1259 min_clk_period = timings->tWH_min;
1262 if (timings->tALS_min > min_clk_period)
1263 min_clk_period = timings->tALS_min;
1266 if (timings->tDS_min > min_clk_period)
1267 min_clk_period = timings->tDS_min;
1270 if (timings->tDH_min > min_clk_period)
1271 min_clk_period = timings->tDH_min;
1274 if (timings->tRR_min > (min_clk_period * 3))
1275 min_clk_period = DIV_ROUND_UP(timings->tRR_min, 3);
1278 if (timings->tALH_min > min_clk_period)
1279 min_clk_period = timings->tALH_min;
1282 if (timings->tRP_min > min_clk_period)
1283 min_clk_period = timings->tRP_min;
1286 if (timings->tREH_min > min_clk_period)
1287 min_clk_period = timings->tREH_min;
1290 if (timings->tRC_min > (min_clk_period * 2))
1291 min_clk_period = DIV_ROUND_UP(timings->tRC_min, 2);
1294 if (timings->tWC_min > (min_clk_period * 2))
1295 min_clk_period = DIV_ROUND_UP(timings->tWC_min, 2);
1297 /* T16 - T19 + tCAD */
1298 tWB = sunxi_nand_lookup_timing(tWB_lut, timings->tWB_max,
1301 dev_err(nfc->dev, "unsupported tWB\n");
1305 tADL = DIV_ROUND_UP(timings->tADL_min, min_clk_period) >> 3;
1307 dev_err(nfc->dev, "unsupported tADL\n");
1311 tWHR = DIV_ROUND_UP(timings->tWHR_min, min_clk_period) >> 3;
1313 dev_err(nfc->dev, "unsupported tWHR\n");
1317 tRHW = sunxi_nand_lookup_timing(tRHW_lut, timings->tRHW_min,
1320 dev_err(nfc->dev, "unsupported tRHW\n");
1325 * TODO: according to ONFI specs this value only applies for DDR NAND,
1326 * but Allwinner seems to set this to 0x7. Mimic them for now.
1330 /* TODO: A83 has some more bits for CDQSS, CS, CLHZ, CCS, WC */
1331 chip->timing_cfg = NFC_TIMING_CFG(tWB, tADL, tWHR, tRHW, tCAD);
1334 * ONFI specification 3.1, paragraph 4.15.2 dictates that EDO data
1335 * output cycle timings shall be used if the host drives tRC less than
1338 chip->timing_ctl = (timings->tRC_min < 30000) ? NFC_TIMING_CTL_EDO : 0;
1340 /* Convert min_clk_period from picoseconds to nanoseconds */
1341 min_clk_period = DIV_ROUND_UP(min_clk_period, 1000);
1344 * Convert min_clk_period into a clk frequency, then get the
1345 * appropriate rate for the NAND controller IP given this formula
1346 * (specified in the datasheet):
1347 * nand clk_rate = min_clk_rate
1349 chip->clk_rate = 1000000000L / min_clk_period;
1354 static int sunxi_nand_chip_init_timings(struct sunxi_nfc *nfc,
1355 struct sunxi_nand_chip *chip)
1357 struct mtd_info *mtd = nand_to_mtd(&chip->nand);
1358 const struct nand_sdr_timings *timings;
1362 mode = onfi_get_async_timing_mode(&chip->nand);
1363 if (mode == ONFI_TIMING_MODE_UNKNOWN) {
1364 mode = chip->nand.onfi_timing_mode_default;
1366 uint8_t feature[ONFI_SUBFEATURE_PARAM_LEN] = {};
1369 mode = fls(mode) - 1;
1374 for (i = 0; i < chip->nsels; i++) {
1375 chip->nand.select_chip(mtd, i);
1376 ret = chip->nand.onfi_set_features(mtd,
1378 ONFI_FEATURE_ADDR_TIMING_MODE,
1380 chip->nand.select_chip(mtd, -1);
1381 if (ret && ret != -ENOTSUPP)
1386 timings = onfi_async_timing_mode_to_sdr_timings(mode);
1387 if (IS_ERR(timings))
1388 return PTR_ERR(timings);
1390 return sunxi_nand_chip_set_timings(nfc, chip, timings);
1393 static int sunxi_nand_hw_common_ecc_ctrl_init(struct mtd_info *mtd,
1394 struct nand_ecc_ctrl *ecc)
1396 static const u8 strengths[] = { 16, 24, 28, 32, 40, 48, 56, 60, 64 };
1397 struct sunxi_nand_hw_ecc *data;
1398 struct nand_ecclayout *layout;
1403 data = kzalloc(sizeof(*data), GFP_KERNEL);
1407 if (ecc->size != 512 && ecc->size != 1024)
1410 /* Prefer 1k ECC chunk over 512 ones */
1411 if (ecc->size == 512 && mtd->writesize > 512) {
1416 /* Add ECC info retrieval from DT */
1417 for (i = 0; i < ARRAY_SIZE(strengths); i++) {
1418 if (ecc->strength <= strengths[i]) {
1420 * Update ecc->strength value with the actual strength
1421 * that will be used by the ECC engine.
1423 ecc->strength = strengths[i];
1428 if (i >= ARRAY_SIZE(strengths)) {
1429 dev_err(mtd->dev, "unsupported strength\n");
1436 /* HW ECC always request ECC bytes for 1024 bytes blocks */
1437 ecc->bytes = DIV_ROUND_UP(ecc->strength * fls(8 * 1024), 8);
1439 /* HW ECC always work with even numbers of ECC bytes */
1440 ecc->bytes = ALIGN(ecc->bytes, 2);
1442 layout = &data->layout;
1443 nsectors = mtd->writesize / ecc->size;
1445 if (mtd->oobsize < ((ecc->bytes + 4) * nsectors)) {
1450 layout->eccbytes = (ecc->bytes * nsectors);
1452 ecc->layout = layout;
1464 static void sunxi_nand_hw_common_ecc_ctrl_cleanup(struct nand_ecc_ctrl *ecc)
1468 #endif /* __UBOOT__ */
1470 static int sunxi_nand_hw_ecc_ctrl_init(struct mtd_info *mtd,
1471 struct nand_ecc_ctrl *ecc)
1473 struct nand_ecclayout *layout;
1478 ret = sunxi_nand_hw_common_ecc_ctrl_init(mtd, ecc);
1482 ecc->read_page = sunxi_nfc_hw_ecc_read_page;
1483 ecc->write_page = sunxi_nfc_hw_ecc_write_page;
1484 ecc->read_subpage = sunxi_nfc_hw_ecc_read_subpage;
1485 ecc->write_subpage = sunxi_nfc_hw_ecc_write_subpage;
1486 layout = ecc->layout;
1487 nsectors = mtd->writesize / ecc->size;
1489 for (i = 0; i < nsectors; i++) {
1491 layout->oobfree[i].offset =
1492 layout->oobfree[i - 1].offset +
1493 layout->oobfree[i - 1].length +
1495 layout->oobfree[i].length = 4;
1498 * The first 2 bytes are used for BB markers, hence we
1499 * only have 2 bytes available in the first user data
1502 layout->oobfree[i].length = 2;
1503 layout->oobfree[i].offset = 2;
1506 for (j = 0; j < ecc->bytes; j++)
1507 layout->eccpos[(ecc->bytes * i) + j] =
1508 layout->oobfree[i].offset +
1509 layout->oobfree[i].length + j;
1512 if (mtd->oobsize > (ecc->bytes + 4) * nsectors) {
1513 layout->oobfree[nsectors].offset =
1514 layout->oobfree[nsectors - 1].offset +
1515 layout->oobfree[nsectors - 1].length +
1517 layout->oobfree[nsectors].length = mtd->oobsize -
1518 ((ecc->bytes + 4) * nsectors);
1524 static int sunxi_nand_hw_syndrome_ecc_ctrl_init(struct mtd_info *mtd,
1525 struct nand_ecc_ctrl *ecc)
1527 struct nand_ecclayout *layout;
1532 ret = sunxi_nand_hw_common_ecc_ctrl_init(mtd, ecc);
1537 ecc->read_page = sunxi_nfc_hw_syndrome_ecc_read_page;
1538 ecc->write_page = sunxi_nfc_hw_syndrome_ecc_write_page;
1540 layout = ecc->layout;
1541 nsectors = mtd->writesize / ecc->size;
1543 for (i = 0; i < (ecc->bytes * nsectors); i++)
1544 layout->eccpos[i] = i;
1546 layout->oobfree[0].length = mtd->oobsize - i;
1547 layout->oobfree[0].offset = i;
1553 static void sunxi_nand_ecc_cleanup(struct nand_ecc_ctrl *ecc)
1555 switch (ecc->mode) {
1557 case NAND_ECC_HW_SYNDROME:
1558 sunxi_nand_hw_common_ecc_ctrl_cleanup(ecc);
1566 #endif /* __UBOOT__ */
1568 static int sunxi_nand_ecc_init(struct mtd_info *mtd, struct nand_ecc_ctrl *ecc)
1570 struct nand_chip *nand = mtd_to_nand(mtd);
1574 ecc->size = nand->ecc_step_ds;
1575 ecc->strength = nand->ecc_strength_ds;
1578 if (!ecc->size || !ecc->strength)
1581 switch (ecc->mode) {
1582 case NAND_ECC_SOFT_BCH:
1585 ret = sunxi_nand_hw_ecc_ctrl_init(mtd, ecc);
1589 case NAND_ECC_HW_SYNDROME:
1590 ret = sunxi_nand_hw_syndrome_ecc_ctrl_init(mtd, ecc);
1595 ecc->layout = kzalloc(sizeof(*ecc->layout), GFP_KERNEL);
1598 ecc->layout->oobfree[0].length = mtd->oobsize;
1608 static int sunxi_nand_chip_init(int node, struct sunxi_nfc *nfc, int devnum)
1610 const struct nand_sdr_timings *timings;
1611 const void *blob = gd->fdt_blob;
1612 struct sunxi_nand_chip *chip;
1613 struct mtd_info *mtd;
1614 struct nand_chip *nand;
1620 if (!fdt_getprop(blob, node, "reg", &nsels))
1623 nsels /= sizeof(u32);
1624 if (!nsels || nsels > 8) {
1625 dev_err(nfc->dev, "invalid reg property size\n");
1629 chip = kzalloc(sizeof(*chip) +
1630 (nsels * sizeof(struct sunxi_nand_chip_sel)),
1633 dev_err(nfc->dev, "could not allocate chip\n");
1637 chip->nsels = nsels;
1638 chip->selected = -1;
1640 for (i = 0; i < nsels; i++) {
1645 ret = fdtdec_get_int_array(gd->fdt_blob, node, "reg", cs, nsels);
1647 dev_err(nfc->dev, "could not retrieve reg property: %d\n", ret);
1651 ret = fdtdec_get_int_array(gd->fdt_blob, node, "allwinner,rb", rb,
1654 dev_err(nfc->dev, "could not retrieve reg property: %d\n", ret);
1658 for (i = 0; i < nsels; i++) {
1661 if (tmp > NFC_MAX_CS) {
1663 "invalid reg value: %u (max CS = 7)\n", tmp);
1667 if (test_and_set_bit(tmp, &nfc->assigned_cs)) {
1668 dev_err(nfc->dev, "CS %d already assigned\n", tmp);
1672 chip->sels[i].cs = tmp;
1675 if (tmp >= 0 && tmp < 2) {
1676 chip->sels[i].rb.type = RB_NATIVE;
1677 chip->sels[i].rb.info.nativeid = tmp;
1679 ret = gpio_request_by_name_nodev(offset_to_ofnode(node),
1681 &chip->sels[i].rb.info.gpio,
1684 chip->sels[i].rb.type = RB_GPIO;
1686 chip->sels[i].rb.type = RB_NONE;
1690 timings = onfi_async_timing_mode_to_sdr_timings(0);
1691 if (IS_ERR(timings)) {
1692 ret = PTR_ERR(timings);
1694 "could not retrieve timings for ONFI mode 0: %d\n",
1699 ret = sunxi_nand_chip_set_timings(nfc, chip, timings);
1701 dev_err(nfc->dev, "could not configure chip timings: %d\n", ret);
1706 /* Default tR value specified in the ONFI spec (chapter 4.15.1) */
1707 nand->chip_delay = 200;
1708 nand->controller = &nfc->controller;
1710 * Set the ECC mode to the default value in case nothing is specified
1713 nand->ecc.mode = NAND_ECC_HW;
1714 nand->flash_node = offset_to_ofnode(node);
1715 nand->select_chip = sunxi_nfc_select_chip;
1716 nand->cmd_ctrl = sunxi_nfc_cmd_ctrl;
1717 nand->read_buf = sunxi_nfc_read_buf;
1718 nand->write_buf = sunxi_nfc_write_buf;
1719 nand->read_byte = sunxi_nfc_read_byte;
1721 mtd = nand_to_mtd(nand);
1722 ret = nand_scan_ident(mtd, nsels, NULL);
1726 if (nand->bbt_options & NAND_BBT_USE_FLASH)
1727 nand->bbt_options |= NAND_BBT_NO_OOB;
1729 if (nand->options & NAND_NEED_SCRAMBLING)
1730 nand->options |= NAND_NO_SUBPAGE_WRITE;
1732 nand->options |= NAND_SUBPAGE_READ;
1734 ret = sunxi_nand_chip_init_timings(nfc, chip);
1736 dev_err(nfc->dev, "could not configure chip timings: %d\n", ret);
1740 ret = sunxi_nand_ecc_init(mtd, &nand->ecc);
1742 dev_err(nfc->dev, "ECC init failed: %d\n", ret);
1746 ret = nand_scan_tail(mtd);
1748 dev_err(nfc->dev, "nand_scan_tail failed: %d\n", ret);
1752 ret = nand_register(devnum, mtd);
1754 dev_err(nfc->dev, "failed to register mtd device: %d\n", ret);
1758 list_add_tail(&chip->node, &nfc->chips);
1763 static int sunxi_nand_chips_init(int node, struct sunxi_nfc *nfc)
1765 const void *blob = gd->fdt_blob;
1769 for (nand_node = fdt_first_subnode(blob, node); nand_node >= 0;
1770 nand_node = fdt_next_subnode(blob, nand_node))
1774 dev_err(nfc->dev, "too many NAND chips: %d (max = 8)\n", i);
1779 for (nand_node = fdt_first_subnode(blob, node); nand_node >= 0;
1780 nand_node = fdt_next_subnode(blob, nand_node)) {
1781 ret = sunxi_nand_chip_init(nand_node, nfc, i++);
1790 static void sunxi_nand_chips_cleanup(struct sunxi_nfc *nfc)
1792 struct sunxi_nand_chip *chip;
1794 while (!list_empty(&nfc->chips)) {
1795 chip = list_first_entry(&nfc->chips, struct sunxi_nand_chip,
1797 nand_release(&chip->mtd);
1798 sunxi_nand_ecc_cleanup(&chip->nand.ecc);
1799 list_del(&chip->node);
1803 #endif /* __UBOOT__ */
1805 void sunxi_nand_init(void)
1807 const void *blob = gd->fdt_blob;
1808 struct sunxi_nfc *nfc;
1813 nfc = kzalloc(sizeof(*nfc), GFP_KERNEL);
1817 spin_lock_init(&nfc->controller.lock);
1818 init_waitqueue_head(&nfc->controller.wq);
1819 INIT_LIST_HEAD(&nfc->chips);
1821 node = fdtdec_next_compatible(blob, 0, COMPAT_SUNXI_NAND);
1823 pr_err("unable to find nfc node in device tree\n");
1827 if (!fdtdec_get_is_enabled(blob, node)) {
1828 pr_err("nfc disabled in device tree\n");
1832 regs = fdtdec_get_addr(blob, node, "reg");
1833 if (regs == FDT_ADDR_T_NONE) {
1834 pr_err("unable to find nfc address in device tree\n");
1838 nfc->regs = (void *)regs;
1840 ret = sunxi_nfc_rst(nfc);
1844 ret = sunxi_nand_chips_init(node, nfc);
1846 dev_err(nfc->dev, "failed to init nand chips\n");
1856 MODULE_LICENSE("GPL v2");
1857 MODULE_AUTHOR("Boris BREZILLON");
1858 MODULE_DESCRIPTION("Allwinner NAND Flash Controller driver");