1 // SPDX-License-Identifier: GPL-2.0+ 2 /* 3 * Copyright (C) 2013 Boris BREZILLON <b.brezillon.dev@gmail.com> 4 * 5 * Derived from: 6 * https://github.com/yuq/sunxi-nfc-mtd 7 * Copyright (C) 2013 Qiang Yu <yuq825@gmail.com> 8 * 9 * https://github.com/hno/Allwinner-Info 10 * Copyright (C) 2013 Henrik Nordström <Henrik Nordström> 11 * 12 * Copyright (C) 2013 Dmitriy B. <rzk333@gmail.com> 13 * Copyright (C) 2013 Sergey Lapin <slapin@ossfans.org> 14 */ 15 16 #include <linux/dma-mapping.h> 17 #include <linux/slab.h> 18 #include <linux/module.h> 19 #include <linux/moduleparam.h> 20 #include <linux/platform_device.h> 21 #include <linux/of.h> 22 #include <linux/mtd/mtd.h> 23 #include <linux/mtd/rawnand.h> 24 #include <linux/mtd/partitions.h> 25 #include <linux/clk.h> 26 #include <linux/delay.h> 27 #include <linux/dmaengine.h> 28 #include <linux/interrupt.h> 29 #include <linux/iopoll.h> 30 #include <linux/reset.h> 31 32 #define NFC_REG_CTL 0x0000 33 #define NFC_REG_ST 0x0004 34 #define NFC_REG_INT 0x0008 35 #define NFC_REG_TIMING_CTL 0x000C 36 #define NFC_REG_TIMING_CFG 0x0010 37 #define NFC_REG_ADDR_LOW 0x0014 38 #define NFC_REG_ADDR_HIGH 0x0018 39 #define NFC_REG_SECTOR_NUM 0x001C 40 #define NFC_REG_CNT 0x0020 41 #define NFC_REG_CMD 0x0024 42 #define NFC_REG_RCMD_SET 0x0028 43 #define NFC_REG_WCMD_SET 0x002C 44 #define NFC_REG_A10_IO_DATA 0x0030 45 #define NFC_REG_A23_IO_DATA 0x0300 46 #define NFC_REG_ECC_CTL 0x0034 47 #define NFC_REG_ECC_ST 0x0038 48 #define NFC_REG_DEBUG 0x003C 49 #define NFC_REG_ECC_ERR_CNT(x) ((0x0040 + (x)) & ~0x3) 50 #define NFC_REG_USER_DATA(x) (0x0050 + ((x) * 4)) 51 #define NFC_REG_SPARE_AREA 0x00A0 52 #define NFC_REG_PAT_ID 0x00A4 53 #define NFC_REG_MDMA_ADDR 0x00C0 54 #define NFC_REG_MDMA_CNT 0x00C4 55 #define NFC_RAM0_BASE 0x0400 56 #define NFC_RAM1_BASE 0x0800 57 58 /* define bit use in NFC_CTL */ 59 #define NFC_EN BIT(0) 60 #define NFC_RESET BIT(1) 61 #define NFC_BUS_WIDTH_MSK BIT(2) 62 #define NFC_BUS_WIDTH_8 (0 << 2) 63 #define NFC_BUS_WIDTH_16 (1 << 2) 64 #define NFC_RB_SEL_MSK BIT(3) 65 #define NFC_RB_SEL(x) ((x) << 3) 66 #define NFC_CE_SEL_MSK GENMASK(26, 24) 67 #define NFC_CE_SEL(x) ((x) << 24) 68 #define NFC_CE_CTL BIT(6) 69 #define NFC_PAGE_SHIFT_MSK GENMASK(11, 8) 70 #define NFC_PAGE_SHIFT(x) (((x) < 10 ? 0 : (x) - 10) << 8) 71 #define NFC_SAM BIT(12) 72 #define NFC_RAM_METHOD BIT(14) 73 #define NFC_DMA_TYPE_NORMAL BIT(15) 74 #define NFC_DEBUG_CTL BIT(31) 75 76 /* define bit use in NFC_ST */ 77 #define NFC_RB_B2R BIT(0) 78 #define NFC_CMD_INT_FLAG BIT(1) 79 #define NFC_DMA_INT_FLAG BIT(2) 80 #define NFC_CMD_FIFO_STATUS BIT(3) 81 #define NFC_STA BIT(4) 82 #define NFC_NATCH_INT_FLAG BIT(5) 83 #define NFC_RB_STATE(x) BIT(x + 8) 84 85 /* define bit use in NFC_INT */ 86 #define NFC_B2R_INT_ENABLE BIT(0) 87 #define NFC_CMD_INT_ENABLE BIT(1) 88 #define NFC_DMA_INT_ENABLE BIT(2) 89 #define NFC_INT_MASK (NFC_B2R_INT_ENABLE | \ 90 NFC_CMD_INT_ENABLE | \ 91 NFC_DMA_INT_ENABLE) 92 93 /* define bit use in NFC_TIMING_CTL */ 94 #define NFC_TIMING_CTL_EDO BIT(8) 95 96 /* define NFC_TIMING_CFG register layout */ 97 #define NFC_TIMING_CFG(tWB, tADL, tWHR, tRHW, tCAD) \ 98 (((tWB) & 0x3) | (((tADL) & 0x3) << 2) | \ 99 (((tWHR) & 0x3) << 4) | (((tRHW) & 0x3) << 6) | \ 100 (((tCAD) & 0x7) << 8)) 101 102 /* define bit use in NFC_CMD */ 103 #define NFC_CMD_LOW_BYTE_MSK GENMASK(7, 0) 104 #define NFC_CMD_HIGH_BYTE_MSK GENMASK(15, 8) 105 #define NFC_CMD(x) (x) 106 #define NFC_ADR_NUM_MSK GENMASK(18, 16) 107 #define NFC_ADR_NUM(x) (((x) - 1) << 16) 108 #define NFC_SEND_ADR BIT(19) 109 #define NFC_ACCESS_DIR BIT(20) 110 #define NFC_DATA_TRANS BIT(21) 111 #define NFC_SEND_CMD1 BIT(22) 112 #define NFC_WAIT_FLAG BIT(23) 113 #define NFC_SEND_CMD2 BIT(24) 114 #define NFC_SEQ BIT(25) 115 #define NFC_DATA_SWAP_METHOD BIT(26) 116 #define NFC_ROW_AUTO_INC BIT(27) 117 #define NFC_SEND_CMD3 BIT(28) 118 #define NFC_SEND_CMD4 BIT(29) 119 #define NFC_CMD_TYPE_MSK GENMASK(31, 30) 120 #define NFC_NORMAL_OP (0 << 30) 121 #define NFC_ECC_OP (1 << 30) 122 #define NFC_PAGE_OP (2U << 30) 123 124 /* define bit use in NFC_RCMD_SET */ 125 #define NFC_READ_CMD_MSK GENMASK(7, 0) 126 #define NFC_RND_READ_CMD0_MSK GENMASK(15, 8) 127 #define NFC_RND_READ_CMD1_MSK GENMASK(23, 16) 128 129 /* define bit use in NFC_WCMD_SET */ 130 #define NFC_PROGRAM_CMD_MSK GENMASK(7, 0) 131 #define NFC_RND_WRITE_CMD_MSK GENMASK(15, 8) 132 #define NFC_READ_CMD0_MSK GENMASK(23, 16) 133 #define NFC_READ_CMD1_MSK GENMASK(31, 24) 134 135 /* define bit use in NFC_ECC_CTL */ 136 #define NFC_ECC_EN BIT(0) 137 #define NFC_ECC_PIPELINE BIT(3) 138 #define NFC_ECC_EXCEPTION BIT(4) 139 #define NFC_ECC_BLOCK_SIZE_MSK BIT(5) 140 #define NFC_ECC_BLOCK_512 BIT(5) 141 #define NFC_RANDOM_EN BIT(9) 142 #define NFC_RANDOM_DIRECTION BIT(10) 143 #define NFC_ECC_MODE_MSK GENMASK(15, 12) 144 #define NFC_ECC_MODE(x) ((x) << 12) 145 #define NFC_RANDOM_SEED_MSK GENMASK(30, 16) 146 #define NFC_RANDOM_SEED(x) ((x) << 16) 147 148 /* define bit use in NFC_ECC_ST */ 149 #define NFC_ECC_ERR(x) BIT(x) 150 #define NFC_ECC_ERR_MSK GENMASK(15, 0) 151 #define NFC_ECC_PAT_FOUND(x) BIT(x + 16) 152 #define NFC_ECC_ERR_CNT(b, x) (((x) >> (((b) % 4) * 8)) & 0xff) 153 154 #define NFC_DEFAULT_TIMEOUT_MS 1000 155 156 #define NFC_SRAM_SIZE 1024 157 158 #define NFC_MAX_CS 7 159 160 /** 161 * struct sunxi_nand_chip_sel - stores information related to NAND Chip Select 162 * 163 * @cs: the NAND CS id used to communicate with a NAND Chip 164 * @rb: the Ready/Busy pin ID. -1 means no R/B pin connected to the NFC 165 */ 166 struct sunxi_nand_chip_sel { 167 u8 cs; 168 s8 rb; 169 }; 170 171 /** 172 * struct sunxi_nand_hw_ecc - stores information related to HW ECC support 173 * 174 * @ecc_ctl: ECC_CTL register value for this NAND chip 175 */ 176 struct sunxi_nand_hw_ecc { 177 u32 ecc_ctl; 178 }; 179 180 /** 181 * struct sunxi_nand_chip - stores NAND chip device related information 182 * 183 * @node: used to store NAND chips into a list 184 * @nand: base NAND chip structure 185 * @ecc: ECC controller structure 186 * @clk_rate: clk_rate required for this NAND chip 187 * @timing_cfg: TIMING_CFG register value for this NAND chip 188 * @timing_ctl: TIMING_CTL register value for this NAND chip 189 * @nsels: number of CS lines required by the NAND chip 190 * @sels: array of CS lines descriptions 191 */ 192 struct sunxi_nand_chip { 193 struct list_head node; 194 struct nand_chip nand; 195 struct sunxi_nand_hw_ecc ecc; 196 unsigned long clk_rate; 197 u32 timing_cfg; 198 u32 timing_ctl; 199 int nsels; 200 struct sunxi_nand_chip_sel sels[] __counted_by(nsels); 201 }; 202 203 static inline struct sunxi_nand_chip *to_sunxi_nand(struct nand_chip *nand) 204 { 205 return container_of(nand, struct sunxi_nand_chip, nand); 206 } 207 208 /* 209 * NAND Controller capabilities structure: stores NAND controller capabilities 210 * for distinction between compatible strings. 211 * 212 * @has_mdma: Use mbus dma mode, otherwise general dma 213 * through MBUS on A23/A33 needs extra configuration. 214 * @reg_io_data: I/O data register 215 * @dma_maxburst: DMA maxburst 216 */ 217 struct sunxi_nfc_caps { 218 bool has_mdma; 219 unsigned int reg_io_data; 220 unsigned int dma_maxburst; 221 }; 222 223 /** 224 * struct sunxi_nfc - stores sunxi NAND controller information 225 * 226 * @controller: base controller structure 227 * @dev: parent device (used to print error messages) 228 * @regs: NAND controller registers 229 * @ahb_clk: NAND controller AHB clock 230 * @mod_clk: NAND controller mod clock 231 * @reset: NAND controller reset line 232 * @assigned_cs: bitmask describing already assigned CS lines 233 * @clk_rate: NAND controller current clock rate 234 * @chips: a list containing all the NAND chips attached to this NAND 235 * controller 236 * @complete: a completion object used to wait for NAND controller events 237 * @dmac: the DMA channel attached to the NAND controller 238 * @caps: NAND Controller capabilities 239 */ 240 struct sunxi_nfc { 241 struct nand_controller controller; 242 struct device *dev; 243 void __iomem *regs; 244 struct clk *ahb_clk; 245 struct clk *mod_clk; 246 struct reset_control *reset; 247 unsigned long assigned_cs; 248 unsigned long clk_rate; 249 struct list_head chips; 250 struct completion complete; 251 struct dma_chan *dmac; 252 const struct sunxi_nfc_caps *caps; 253 }; 254 255 static inline struct sunxi_nfc *to_sunxi_nfc(struct nand_controller *ctrl) 256 { 257 return container_of(ctrl, struct sunxi_nfc, controller); 258 } 259 260 static irqreturn_t sunxi_nfc_interrupt(int irq, void *dev_id) 261 { 262 struct sunxi_nfc *nfc = dev_id; 263 u32 st = readl(nfc->regs + NFC_REG_ST); 264 u32 ien = readl(nfc->regs + NFC_REG_INT); 265 266 if (!(ien & st)) 267 return IRQ_NONE; 268 269 if ((ien & st) == ien) 270 complete(&nfc->complete); 271 272 writel(st & NFC_INT_MASK, nfc->regs + NFC_REG_ST); 273 writel(~st & ien & NFC_INT_MASK, nfc->regs + NFC_REG_INT); 274 275 return IRQ_HANDLED; 276 } 277 278 static int sunxi_nfc_wait_events(struct sunxi_nfc *nfc, u32 events, 279 bool use_polling, unsigned int timeout_ms) 280 { 281 int ret; 282 283 if (events & ~NFC_INT_MASK) 284 return -EINVAL; 285 286 if (!timeout_ms) 287 timeout_ms = NFC_DEFAULT_TIMEOUT_MS; 288 289 if (!use_polling) { 290 init_completion(&nfc->complete); 291 292 writel(events, nfc->regs + NFC_REG_INT); 293 294 ret = wait_for_completion_timeout(&nfc->complete, 295 msecs_to_jiffies(timeout_ms)); 296 if (!ret) 297 ret = -ETIMEDOUT; 298 else 299 ret = 0; 300 301 writel(0, nfc->regs + NFC_REG_INT); 302 } else { 303 u32 status; 304 305 ret = readl_poll_timeout(nfc->regs + NFC_REG_ST, status, 306 (status & events) == events, 1, 307 timeout_ms * 1000); 308 } 309 310 writel(events & NFC_INT_MASK, nfc->regs + NFC_REG_ST); 311 312 if (ret) 313 dev_err(nfc->dev, "wait interrupt timedout\n"); 314 315 return ret; 316 } 317 318 static int sunxi_nfc_wait_cmd_fifo_empty(struct sunxi_nfc *nfc) 319 { 320 u32 status; 321 int ret; 322 323 ret = readl_poll_timeout(nfc->regs + NFC_REG_ST, status, 324 !(status & NFC_CMD_FIFO_STATUS), 1, 325 NFC_DEFAULT_TIMEOUT_MS * 1000); 326 if (ret) 327 dev_err(nfc->dev, "wait for empty cmd FIFO timedout\n"); 328 329 return ret; 330 } 331 332 static int sunxi_nfc_rst(struct sunxi_nfc *nfc) 333 { 334 u32 ctl; 335 int ret; 336 337 writel(0, nfc->regs + NFC_REG_ECC_CTL); 338 writel(NFC_RESET, nfc->regs + NFC_REG_CTL); 339 340 ret = readl_poll_timeout(nfc->regs + NFC_REG_CTL, ctl, 341 !(ctl & NFC_RESET), 1, 342 NFC_DEFAULT_TIMEOUT_MS * 1000); 343 if (ret) 344 dev_err(nfc->dev, "wait for NAND controller reset timedout\n"); 345 346 return ret; 347 } 348 349 static int sunxi_nfc_dma_op_prepare(struct sunxi_nfc *nfc, const void *buf, 350 int chunksize, int nchunks, 351 enum dma_data_direction ddir, 352 struct scatterlist *sg) 353 { 354 struct dma_async_tx_descriptor *dmad; 355 enum dma_transfer_direction tdir; 356 dma_cookie_t dmat; 357 int ret; 358 359 if (ddir == DMA_FROM_DEVICE) 360 tdir = DMA_DEV_TO_MEM; 361 else 362 tdir = DMA_MEM_TO_DEV; 363 364 sg_init_one(sg, buf, nchunks * chunksize); 365 ret = dma_map_sg(nfc->dev, sg, 1, ddir); 366 if (!ret) 367 return -ENOMEM; 368 369 if (!nfc->caps->has_mdma) { 370 dmad = dmaengine_prep_slave_sg(nfc->dmac, sg, 1, tdir, DMA_CTRL_ACK); 371 if (!dmad) { 372 ret = -EINVAL; 373 goto err_unmap_buf; 374 } 375 } 376 377 writel(readl(nfc->regs + NFC_REG_CTL) | NFC_RAM_METHOD, 378 nfc->regs + NFC_REG_CTL); 379 writel(nchunks, nfc->regs + NFC_REG_SECTOR_NUM); 380 writel(chunksize, nfc->regs + NFC_REG_CNT); 381 382 if (nfc->caps->has_mdma) { 383 writel(readl(nfc->regs + NFC_REG_CTL) & ~NFC_DMA_TYPE_NORMAL, 384 nfc->regs + NFC_REG_CTL); 385 writel(chunksize * nchunks, nfc->regs + NFC_REG_MDMA_CNT); 386 writel(sg_dma_address(sg), nfc->regs + NFC_REG_MDMA_ADDR); 387 } else { 388 dmat = dmaengine_submit(dmad); 389 390 ret = dma_submit_error(dmat); 391 if (ret) 392 goto err_clr_dma_flag; 393 } 394 395 return 0; 396 397 err_clr_dma_flag: 398 writel(readl(nfc->regs + NFC_REG_CTL) & ~NFC_RAM_METHOD, 399 nfc->regs + NFC_REG_CTL); 400 401 err_unmap_buf: 402 dma_unmap_sg(nfc->dev, sg, 1, ddir); 403 return ret; 404 } 405 406 static void sunxi_nfc_dma_op_cleanup(struct sunxi_nfc *nfc, 407 enum dma_data_direction ddir, 408 struct scatterlist *sg) 409 { 410 dma_unmap_sg(nfc->dev, sg, 1, ddir); 411 writel(readl(nfc->regs + NFC_REG_CTL) & ~NFC_RAM_METHOD, 412 nfc->regs + NFC_REG_CTL); 413 } 414 415 static void sunxi_nfc_select_chip(struct nand_chip *nand, unsigned int cs) 416 { 417 struct mtd_info *mtd = nand_to_mtd(nand); 418 struct sunxi_nand_chip *sunxi_nand = to_sunxi_nand(nand); 419 struct sunxi_nfc *nfc = to_sunxi_nfc(sunxi_nand->nand.controller); 420 struct sunxi_nand_chip_sel *sel; 421 u32 ctl; 422 423 if (cs >= sunxi_nand->nsels) 424 return; 425 426 ctl = readl(nfc->regs + NFC_REG_CTL) & 427 ~(NFC_PAGE_SHIFT_MSK | NFC_CE_SEL_MSK | NFC_RB_SEL_MSK | NFC_EN); 428 429 sel = &sunxi_nand->sels[cs]; 430 ctl |= NFC_CE_SEL(sel->cs) | NFC_EN | NFC_PAGE_SHIFT(nand->page_shift); 431 if (sel->rb >= 0) 432 ctl |= NFC_RB_SEL(sel->rb); 433 434 writel(mtd->writesize, nfc->regs + NFC_REG_SPARE_AREA); 435 436 if (nfc->clk_rate != sunxi_nand->clk_rate) { 437 clk_set_rate(nfc->mod_clk, sunxi_nand->clk_rate); 438 nfc->clk_rate = sunxi_nand->clk_rate; 439 } 440 441 writel(sunxi_nand->timing_ctl, nfc->regs + NFC_REG_TIMING_CTL); 442 writel(sunxi_nand->timing_cfg, nfc->regs + NFC_REG_TIMING_CFG); 443 writel(ctl, nfc->regs + NFC_REG_CTL); 444 } 445 446 static void sunxi_nfc_read_buf(struct nand_chip *nand, uint8_t *buf, int len) 447 { 448 struct sunxi_nand_chip *sunxi_nand = to_sunxi_nand(nand); 449 struct sunxi_nfc *nfc = to_sunxi_nfc(sunxi_nand->nand.controller); 450 int ret; 451 int cnt; 452 int offs = 0; 453 u32 tmp; 454 455 while (len > offs) { 456 bool poll = false; 457 458 cnt = min(len - offs, NFC_SRAM_SIZE); 459 460 ret = sunxi_nfc_wait_cmd_fifo_empty(nfc); 461 if (ret) 462 break; 463 464 writel(cnt, nfc->regs + NFC_REG_CNT); 465 tmp = NFC_DATA_TRANS | NFC_DATA_SWAP_METHOD; 466 writel(tmp, nfc->regs + NFC_REG_CMD); 467 468 /* Arbitrary limit for polling mode */ 469 if (cnt < 64) 470 poll = true; 471 472 ret = sunxi_nfc_wait_events(nfc, NFC_CMD_INT_FLAG, poll, 0); 473 if (ret) 474 break; 475 476 if (buf) 477 memcpy_fromio(buf + offs, nfc->regs + NFC_RAM0_BASE, 478 cnt); 479 offs += cnt; 480 } 481 } 482 483 static void sunxi_nfc_write_buf(struct nand_chip *nand, const uint8_t *buf, 484 int len) 485 { 486 struct sunxi_nand_chip *sunxi_nand = to_sunxi_nand(nand); 487 struct sunxi_nfc *nfc = to_sunxi_nfc(sunxi_nand->nand.controller); 488 int ret; 489 int cnt; 490 int offs = 0; 491 u32 tmp; 492 493 while (len > offs) { 494 bool poll = false; 495 496 cnt = min(len - offs, NFC_SRAM_SIZE); 497 498 ret = sunxi_nfc_wait_cmd_fifo_empty(nfc); 499 if (ret) 500 break; 501 502 writel(cnt, nfc->regs + NFC_REG_CNT); 503 memcpy_toio(nfc->regs + NFC_RAM0_BASE, buf + offs, cnt); 504 tmp = NFC_DATA_TRANS | NFC_DATA_SWAP_METHOD | 505 NFC_ACCESS_DIR; 506 writel(tmp, nfc->regs + NFC_REG_CMD); 507 508 /* Arbitrary limit for polling mode */ 509 if (cnt < 64) 510 poll = true; 511 512 ret = sunxi_nfc_wait_events(nfc, NFC_CMD_INT_FLAG, poll, 0); 513 if (ret) 514 break; 515 516 offs += cnt; 517 } 518 } 519 520 /* These seed values have been extracted from Allwinner's BSP */ 521 static const u16 sunxi_nfc_randomizer_page_seeds[] = { 522 0x2b75, 0x0bd0, 0x5ca3, 0x62d1, 0x1c93, 0x07e9, 0x2162, 0x3a72, 523 0x0d67, 0x67f9, 0x1be7, 0x077d, 0x032f, 0x0dac, 0x2716, 0x2436, 524 0x7922, 0x1510, 0x3860, 0x5287, 0x480f, 0x4252, 0x1789, 0x5a2d, 525 0x2a49, 0x5e10, 0x437f, 0x4b4e, 0x2f45, 0x216e, 0x5cb7, 0x7130, 526 0x2a3f, 0x60e4, 0x4dc9, 0x0ef0, 0x0f52, 0x1bb9, 0x6211, 0x7a56, 527 0x226d, 0x4ea7, 0x6f36, 0x3692, 0x38bf, 0x0c62, 0x05eb, 0x4c55, 528 0x60f4, 0x728c, 0x3b6f, 0x2037, 0x7f69, 0x0936, 0x651a, 0x4ceb, 529 0x6218, 0x79f3, 0x383f, 0x18d9, 0x4f05, 0x5c82, 0x2912, 0x6f17, 530 0x6856, 0x5938, 0x1007, 0x61ab, 0x3e7f, 0x57c2, 0x542f, 0x4f62, 531 0x7454, 0x2eac, 0x7739, 0x42d4, 0x2f90, 0x435a, 0x2e52, 0x2064, 532 0x637c, 0x66ad, 0x2c90, 0x0bad, 0x759c, 0x0029, 0x0986, 0x7126, 533 0x1ca7, 0x1605, 0x386a, 0x27f5, 0x1380, 0x6d75, 0x24c3, 0x0f8e, 534 0x2b7a, 0x1418, 0x1fd1, 0x7dc1, 0x2d8e, 0x43af, 0x2267, 0x7da3, 535 0x4e3d, 0x1338, 0x50db, 0x454d, 0x764d, 0x40a3, 0x42e6, 0x262b, 536 0x2d2e, 0x1aea, 0x2e17, 0x173d, 0x3a6e, 0x71bf, 0x25f9, 0x0a5d, 537 0x7c57, 0x0fbe, 0x46ce, 0x4939, 0x6b17, 0x37bb, 0x3e91, 0x76db, 538 }; 539 540 /* 541 * sunxi_nfc_randomizer_ecc512_seeds and sunxi_nfc_randomizer_ecc1024_seeds 542 * have been generated using 543 * sunxi_nfc_randomizer_step(seed, (step_size * 8) + 15), which is what 544 * the randomizer engine does internally before de/scrambling OOB data. 545 * 546 * Those tables are statically defined to avoid calculating randomizer state 547 * at runtime. 548 */ 549 static const u16 sunxi_nfc_randomizer_ecc512_seeds[] = { 550 0x3346, 0x367f, 0x1f18, 0x769a, 0x4f64, 0x068c, 0x2ef1, 0x6b64, 551 0x28a9, 0x15d7, 0x30f8, 0x3659, 0x53db, 0x7c5f, 0x71d4, 0x4409, 552 0x26eb, 0x03cc, 0x655d, 0x47d4, 0x4daa, 0x0877, 0x712d, 0x3617, 553 0x3264, 0x49aa, 0x7f9e, 0x588e, 0x4fbc, 0x7176, 0x7f91, 0x6c6d, 554 0x4b95, 0x5fb7, 0x3844, 0x4037, 0x0184, 0x081b, 0x0ee8, 0x5b91, 555 0x293d, 0x1f71, 0x0e6f, 0x402b, 0x5122, 0x1e52, 0x22be, 0x3d2d, 556 0x75bc, 0x7c60, 0x6291, 0x1a2f, 0x61d4, 0x74aa, 0x4140, 0x29ab, 557 0x472d, 0x2852, 0x017e, 0x15e8, 0x5ec2, 0x17cf, 0x7d0f, 0x06b8, 558 0x117a, 0x6b94, 0x789b, 0x3126, 0x6ac5, 0x5be7, 0x150f, 0x51f8, 559 0x7889, 0x0aa5, 0x663d, 0x77e8, 0x0b87, 0x3dcb, 0x360d, 0x218b, 560 0x512f, 0x7dc9, 0x6a4d, 0x630a, 0x3547, 0x1dd2, 0x5aea, 0x69a5, 561 0x7bfa, 0x5e4f, 0x1519, 0x6430, 0x3a0e, 0x5eb3, 0x5425, 0x0c7a, 562 0x5540, 0x3670, 0x63c1, 0x31e9, 0x5a39, 0x2de7, 0x5979, 0x2891, 563 0x1562, 0x014b, 0x5b05, 0x2756, 0x5a34, 0x13aa, 0x6cb5, 0x2c36, 564 0x5e72, 0x1306, 0x0861, 0x15ef, 0x1ee8, 0x5a37, 0x7ac4, 0x45dd, 565 0x44c4, 0x7266, 0x2f41, 0x3ccc, 0x045e, 0x7d40, 0x7c66, 0x0fa0, 566 }; 567 568 static const u16 sunxi_nfc_randomizer_ecc1024_seeds[] = { 569 0x2cf5, 0x35f1, 0x63a4, 0x5274, 0x2bd2, 0x778b, 0x7285, 0x32b6, 570 0x6a5c, 0x70d6, 0x757d, 0x6769, 0x5375, 0x1e81, 0x0cf3, 0x3982, 571 0x6787, 0x042a, 0x6c49, 0x1925, 0x56a8, 0x40a9, 0x063e, 0x7bd9, 572 0x4dbf, 0x55ec, 0x672e, 0x7334, 0x5185, 0x4d00, 0x232a, 0x7e07, 573 0x445d, 0x6b92, 0x528f, 0x4255, 0x53ba, 0x7d82, 0x2a2e, 0x3a4e, 574 0x75eb, 0x450c, 0x6844, 0x1b5d, 0x581a, 0x4cc6, 0x0379, 0x37b2, 575 0x419f, 0x0e92, 0x6b27, 0x5624, 0x01e3, 0x07c1, 0x44a5, 0x130c, 576 0x13e8, 0x5910, 0x0876, 0x60c5, 0x54e3, 0x5b7f, 0x2269, 0x509f, 577 0x7665, 0x36fd, 0x3e9a, 0x0579, 0x6295, 0x14ef, 0x0a81, 0x1bcc, 578 0x4b16, 0x64db, 0x0514, 0x4f07, 0x0591, 0x3576, 0x6853, 0x0d9e, 579 0x259f, 0x38b7, 0x64fb, 0x3094, 0x4693, 0x6ddd, 0x29bb, 0x0bc8, 580 0x3f47, 0x490e, 0x0c0e, 0x7933, 0x3c9e, 0x5840, 0x398d, 0x3e68, 581 0x4af1, 0x71f5, 0x57cf, 0x1121, 0x64eb, 0x3579, 0x15ac, 0x584d, 582 0x5f2a, 0x47e2, 0x6528, 0x6eac, 0x196e, 0x6b96, 0x0450, 0x0179, 583 0x609c, 0x06e1, 0x4626, 0x42c7, 0x273e, 0x486f, 0x0705, 0x1601, 584 0x145b, 0x407e, 0x062b, 0x57a5, 0x53f9, 0x5659, 0x4410, 0x3ccd, 585 }; 586 587 static u16 sunxi_nfc_randomizer_step(u16 state, int count) 588 { 589 state &= 0x7fff; 590 591 /* 592 * This loop is just a simple implementation of a Fibonacci LFSR using 593 * the x16 + x15 + 1 polynomial. 594 */ 595 while (count--) 596 state = ((state >> 1) | 597 (((state ^ (state >> 1)) & 1) << 14)) & 0x7fff; 598 599 return state; 600 } 601 602 static u16 sunxi_nfc_randomizer_state(struct nand_chip *nand, int page, 603 bool ecc) 604 { 605 struct mtd_info *mtd = nand_to_mtd(nand); 606 const u16 *seeds = sunxi_nfc_randomizer_page_seeds; 607 int mod = mtd_div_by_ws(mtd->erasesize, mtd); 608 609 if (mod > ARRAY_SIZE(sunxi_nfc_randomizer_page_seeds)) 610 mod = ARRAY_SIZE(sunxi_nfc_randomizer_page_seeds); 611 612 if (ecc) { 613 if (mtd->ecc_step_size == 512) 614 seeds = sunxi_nfc_randomizer_ecc512_seeds; 615 else 616 seeds = sunxi_nfc_randomizer_ecc1024_seeds; 617 } 618 619 return seeds[page % mod]; 620 } 621 622 static void sunxi_nfc_randomizer_config(struct nand_chip *nand, int page, 623 bool ecc) 624 { 625 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller); 626 u32 ecc_ctl = readl(nfc->regs + NFC_REG_ECC_CTL); 627 u16 state; 628 629 if (!(nand->options & NAND_NEED_SCRAMBLING)) 630 return; 631 632 ecc_ctl = readl(nfc->regs + NFC_REG_ECC_CTL); 633 state = sunxi_nfc_randomizer_state(nand, page, ecc); 634 ecc_ctl = readl(nfc->regs + NFC_REG_ECC_CTL) & ~NFC_RANDOM_SEED_MSK; 635 writel(ecc_ctl | NFC_RANDOM_SEED(state), nfc->regs + NFC_REG_ECC_CTL); 636 } 637 638 static void sunxi_nfc_randomizer_enable(struct nand_chip *nand) 639 { 640 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller); 641 642 if (!(nand->options & NAND_NEED_SCRAMBLING)) 643 return; 644 645 writel(readl(nfc->regs + NFC_REG_ECC_CTL) | NFC_RANDOM_EN, 646 nfc->regs + NFC_REG_ECC_CTL); 647 } 648 649 static void sunxi_nfc_randomizer_disable(struct nand_chip *nand) 650 { 651 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller); 652 653 if (!(nand->options & NAND_NEED_SCRAMBLING)) 654 return; 655 656 writel(readl(nfc->regs + NFC_REG_ECC_CTL) & ~NFC_RANDOM_EN, 657 nfc->regs + NFC_REG_ECC_CTL); 658 } 659 660 static void sunxi_nfc_randomize_bbm(struct nand_chip *nand, int page, u8 *bbm) 661 { 662 u16 state = sunxi_nfc_randomizer_state(nand, page, true); 663 664 bbm[0] ^= state; 665 bbm[1] ^= sunxi_nfc_randomizer_step(state, 8); 666 } 667 668 static void sunxi_nfc_randomizer_write_buf(struct nand_chip *nand, 669 const uint8_t *buf, int len, 670 bool ecc, int page) 671 { 672 sunxi_nfc_randomizer_config(nand, page, ecc); 673 sunxi_nfc_randomizer_enable(nand); 674 sunxi_nfc_write_buf(nand, buf, len); 675 sunxi_nfc_randomizer_disable(nand); 676 } 677 678 static void sunxi_nfc_randomizer_read_buf(struct nand_chip *nand, uint8_t *buf, 679 int len, bool ecc, int page) 680 { 681 sunxi_nfc_randomizer_config(nand, page, ecc); 682 sunxi_nfc_randomizer_enable(nand); 683 sunxi_nfc_read_buf(nand, buf, len); 684 sunxi_nfc_randomizer_disable(nand); 685 } 686 687 static void sunxi_nfc_hw_ecc_enable(struct nand_chip *nand) 688 { 689 struct sunxi_nand_chip *sunxi_nand = to_sunxi_nand(nand); 690 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller); 691 692 writel(sunxi_nand->ecc.ecc_ctl, nfc->regs + NFC_REG_ECC_CTL); 693 } 694 695 static void sunxi_nfc_hw_ecc_disable(struct nand_chip *nand) 696 { 697 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller); 698 699 writel(0, nfc->regs + NFC_REG_ECC_CTL); 700 } 701 702 static inline void sunxi_nfc_user_data_to_buf(u32 user_data, u8 *buf) 703 { 704 buf[0] = user_data; 705 buf[1] = user_data >> 8; 706 buf[2] = user_data >> 16; 707 buf[3] = user_data >> 24; 708 } 709 710 static inline u32 sunxi_nfc_buf_to_user_data(const u8 *buf) 711 { 712 return buf[0] | (buf[1] << 8) | (buf[2] << 16) | (buf[3] << 24); 713 } 714 715 static void sunxi_nfc_hw_ecc_get_prot_oob_bytes(struct nand_chip *nand, u8 *oob, 716 int step, bool bbm, int page) 717 { 718 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller); 719 720 sunxi_nfc_user_data_to_buf(readl(nfc->regs + NFC_REG_USER_DATA(step)), 721 oob); 722 723 /* De-randomize the Bad Block Marker. */ 724 if (bbm && (nand->options & NAND_NEED_SCRAMBLING)) 725 sunxi_nfc_randomize_bbm(nand, page, oob); 726 } 727 728 static void sunxi_nfc_hw_ecc_set_prot_oob_bytes(struct nand_chip *nand, 729 const u8 *oob, int step, 730 bool bbm, int page) 731 { 732 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller); 733 u8 user_data[4]; 734 735 /* Randomize the Bad Block Marker. */ 736 if (bbm && (nand->options & NAND_NEED_SCRAMBLING)) { 737 memcpy(user_data, oob, sizeof(user_data)); 738 sunxi_nfc_randomize_bbm(nand, page, user_data); 739 oob = user_data; 740 } 741 742 writel(sunxi_nfc_buf_to_user_data(oob), 743 nfc->regs + NFC_REG_USER_DATA(step)); 744 } 745 746 static void sunxi_nfc_hw_ecc_update_stats(struct nand_chip *nand, 747 unsigned int *max_bitflips, int ret) 748 { 749 struct mtd_info *mtd = nand_to_mtd(nand); 750 751 if (ret < 0) { 752 mtd->ecc_stats.failed++; 753 } else { 754 mtd->ecc_stats.corrected += ret; 755 *max_bitflips = max_t(unsigned int, *max_bitflips, ret); 756 } 757 } 758 759 static int sunxi_nfc_hw_ecc_correct(struct nand_chip *nand, u8 *data, u8 *oob, 760 int step, u32 status, bool *erased) 761 { 762 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller); 763 struct nand_ecc_ctrl *ecc = &nand->ecc; 764 u32 tmp; 765 766 *erased = false; 767 768 if (status & NFC_ECC_ERR(step)) 769 return -EBADMSG; 770 771 if (status & NFC_ECC_PAT_FOUND(step)) { 772 u8 pattern; 773 774 if (unlikely(!(readl(nfc->regs + NFC_REG_PAT_ID) & 0x1))) { 775 pattern = 0x0; 776 } else { 777 pattern = 0xff; 778 *erased = true; 779 } 780 781 if (data) 782 memset(data, pattern, ecc->size); 783 784 if (oob) 785 memset(oob, pattern, ecc->bytes + 4); 786 787 return 0; 788 } 789 790 tmp = readl(nfc->regs + NFC_REG_ECC_ERR_CNT(step)); 791 792 return NFC_ECC_ERR_CNT(step, tmp); 793 } 794 795 static int sunxi_nfc_hw_ecc_read_chunk(struct nand_chip *nand, 796 u8 *data, int data_off, 797 u8 *oob, int oob_off, 798 int *cur_off, 799 unsigned int *max_bitflips, 800 bool bbm, bool oob_required, int page) 801 { 802 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller); 803 struct nand_ecc_ctrl *ecc = &nand->ecc; 804 int raw_mode = 0; 805 bool erased; 806 int ret; 807 808 if (*cur_off != data_off) 809 nand_change_read_column_op(nand, data_off, NULL, 0, false); 810 811 sunxi_nfc_randomizer_read_buf(nand, NULL, ecc->size, false, page); 812 813 if (data_off + ecc->size != oob_off) 814 nand_change_read_column_op(nand, oob_off, NULL, 0, false); 815 816 ret = sunxi_nfc_wait_cmd_fifo_empty(nfc); 817 if (ret) 818 return ret; 819 820 sunxi_nfc_randomizer_enable(nand); 821 writel(NFC_DATA_TRANS | NFC_DATA_SWAP_METHOD | NFC_ECC_OP, 822 nfc->regs + NFC_REG_CMD); 823 824 ret = sunxi_nfc_wait_events(nfc, NFC_CMD_INT_FLAG, false, 0); 825 sunxi_nfc_randomizer_disable(nand); 826 if (ret) 827 return ret; 828 829 *cur_off = oob_off + ecc->bytes + 4; 830 831 ret = sunxi_nfc_hw_ecc_correct(nand, data, oob_required ? oob : NULL, 0, 832 readl(nfc->regs + NFC_REG_ECC_ST), 833 &erased); 834 if (erased) 835 return 1; 836 837 if (ret < 0) { 838 /* 839 * Re-read the data with the randomizer disabled to identify 840 * bitflips in erased pages. 841 */ 842 if (nand->options & NAND_NEED_SCRAMBLING) 843 nand_change_read_column_op(nand, data_off, data, 844 ecc->size, false); 845 else 846 memcpy_fromio(data, nfc->regs + NFC_RAM0_BASE, 847 ecc->size); 848 849 nand_change_read_column_op(nand, oob_off, oob, ecc->bytes + 4, 850 false); 851 852 ret = nand_check_erased_ecc_chunk(data, ecc->size, 853 oob, ecc->bytes + 4, 854 NULL, 0, ecc->strength); 855 if (ret >= 0) 856 raw_mode = 1; 857 } else { 858 memcpy_fromio(data, nfc->regs + NFC_RAM0_BASE, ecc->size); 859 860 if (oob_required) { 861 nand_change_read_column_op(nand, oob_off, NULL, 0, 862 false); 863 sunxi_nfc_randomizer_read_buf(nand, oob, ecc->bytes + 4, 864 true, page); 865 866 sunxi_nfc_hw_ecc_get_prot_oob_bytes(nand, oob, 0, 867 bbm, page); 868 } 869 } 870 871 sunxi_nfc_hw_ecc_update_stats(nand, max_bitflips, ret); 872 873 return raw_mode; 874 } 875 876 static void sunxi_nfc_hw_ecc_read_extra_oob(struct nand_chip *nand, 877 u8 *oob, int *cur_off, 878 bool randomize, int page) 879 { 880 struct mtd_info *mtd = nand_to_mtd(nand); 881 struct nand_ecc_ctrl *ecc = &nand->ecc; 882 int offset = ((ecc->bytes + 4) * ecc->steps); 883 int len = mtd->oobsize - offset; 884 885 if (len <= 0) 886 return; 887 888 if (!cur_off || *cur_off != offset) 889 nand_change_read_column_op(nand, mtd->writesize, NULL, 0, 890 false); 891 892 if (!randomize) 893 sunxi_nfc_read_buf(nand, oob + offset, len); 894 else 895 sunxi_nfc_randomizer_read_buf(nand, oob + offset, len, 896 false, page); 897 898 if (cur_off) 899 *cur_off = mtd->oobsize + mtd->writesize; 900 } 901 902 static int sunxi_nfc_hw_ecc_read_chunks_dma(struct nand_chip *nand, uint8_t *buf, 903 int oob_required, int page, 904 int nchunks) 905 { 906 bool randomized = nand->options & NAND_NEED_SCRAMBLING; 907 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller); 908 struct mtd_info *mtd = nand_to_mtd(nand); 909 struct nand_ecc_ctrl *ecc = &nand->ecc; 910 unsigned int max_bitflips = 0; 911 int ret, i, raw_mode = 0; 912 struct scatterlist sg; 913 u32 status, wait; 914 915 ret = sunxi_nfc_wait_cmd_fifo_empty(nfc); 916 if (ret) 917 return ret; 918 919 ret = sunxi_nfc_dma_op_prepare(nfc, buf, ecc->size, nchunks, 920 DMA_FROM_DEVICE, &sg); 921 if (ret) 922 return ret; 923 924 sunxi_nfc_hw_ecc_enable(nand); 925 sunxi_nfc_randomizer_config(nand, page, false); 926 sunxi_nfc_randomizer_enable(nand); 927 928 writel((NAND_CMD_RNDOUTSTART << 16) | (NAND_CMD_RNDOUT << 8) | 929 NAND_CMD_READSTART, nfc->regs + NFC_REG_RCMD_SET); 930 931 wait = NFC_CMD_INT_FLAG; 932 933 if (nfc->caps->has_mdma) 934 wait |= NFC_DMA_INT_FLAG; 935 else 936 dma_async_issue_pending(nfc->dmac); 937 938 writel(NFC_PAGE_OP | NFC_DATA_SWAP_METHOD | NFC_DATA_TRANS, 939 nfc->regs + NFC_REG_CMD); 940 941 ret = sunxi_nfc_wait_events(nfc, wait, false, 0); 942 if (ret && !nfc->caps->has_mdma) 943 dmaengine_terminate_all(nfc->dmac); 944 945 sunxi_nfc_randomizer_disable(nand); 946 sunxi_nfc_hw_ecc_disable(nand); 947 948 sunxi_nfc_dma_op_cleanup(nfc, DMA_FROM_DEVICE, &sg); 949 950 if (ret) 951 return ret; 952 953 status = readl(nfc->regs + NFC_REG_ECC_ST); 954 955 for (i = 0; i < nchunks; i++) { 956 int data_off = i * ecc->size; 957 int oob_off = i * (ecc->bytes + 4); 958 u8 *data = buf + data_off; 959 u8 *oob = nand->oob_poi + oob_off; 960 bool erased; 961 962 ret = sunxi_nfc_hw_ecc_correct(nand, randomized ? data : NULL, 963 oob_required ? oob : NULL, 964 i, status, &erased); 965 966 /* ECC errors are handled in the second loop. */ 967 if (ret < 0) 968 continue; 969 970 if (oob_required && !erased) { 971 /* TODO: use DMA to retrieve OOB */ 972 nand_change_read_column_op(nand, 973 mtd->writesize + oob_off, 974 oob, ecc->bytes + 4, false); 975 976 sunxi_nfc_hw_ecc_get_prot_oob_bytes(nand, oob, i, 977 !i, page); 978 } 979 980 if (erased) 981 raw_mode = 1; 982 983 sunxi_nfc_hw_ecc_update_stats(nand, &max_bitflips, ret); 984 } 985 986 if (status & NFC_ECC_ERR_MSK) { 987 for (i = 0; i < nchunks; i++) { 988 int data_off = i * ecc->size; 989 int oob_off = i * (ecc->bytes + 4); 990 u8 *data = buf + data_off; 991 u8 *oob = nand->oob_poi + oob_off; 992 993 if (!(status & NFC_ECC_ERR(i))) 994 continue; 995 996 /* 997 * Re-read the data with the randomizer disabled to 998 * identify bitflips in erased pages. 999 * TODO: use DMA to read page in raw mode 1000 */ 1001 if (randomized) 1002 nand_change_read_column_op(nand, data_off, 1003 data, ecc->size, 1004 false); 1005 1006 /* TODO: use DMA to retrieve OOB */ 1007 nand_change_read_column_op(nand, 1008 mtd->writesize + oob_off, 1009 oob, ecc->bytes + 4, false); 1010 1011 ret = nand_check_erased_ecc_chunk(data, ecc->size, 1012 oob, ecc->bytes + 4, 1013 NULL, 0, 1014 ecc->strength); 1015 if (ret >= 0) 1016 raw_mode = 1; 1017 1018 sunxi_nfc_hw_ecc_update_stats(nand, &max_bitflips, ret); 1019 } 1020 } 1021 1022 if (oob_required) 1023 sunxi_nfc_hw_ecc_read_extra_oob(nand, nand->oob_poi, 1024 NULL, !raw_mode, 1025 page); 1026 1027 return max_bitflips; 1028 } 1029 1030 static int sunxi_nfc_hw_ecc_write_chunk(struct nand_chip *nand, 1031 const u8 *data, int data_off, 1032 const u8 *oob, int oob_off, 1033 int *cur_off, bool bbm, 1034 int page) 1035 { 1036 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller); 1037 struct nand_ecc_ctrl *ecc = &nand->ecc; 1038 int ret; 1039 1040 if (data_off != *cur_off) 1041 nand_change_write_column_op(nand, data_off, NULL, 0, false); 1042 1043 sunxi_nfc_randomizer_write_buf(nand, data, ecc->size, false, page); 1044 1045 if (data_off + ecc->size != oob_off) 1046 nand_change_write_column_op(nand, oob_off, NULL, 0, false); 1047 1048 ret = sunxi_nfc_wait_cmd_fifo_empty(nfc); 1049 if (ret) 1050 return ret; 1051 1052 sunxi_nfc_randomizer_enable(nand); 1053 sunxi_nfc_hw_ecc_set_prot_oob_bytes(nand, oob, 0, bbm, page); 1054 1055 writel(NFC_DATA_TRANS | NFC_DATA_SWAP_METHOD | 1056 NFC_ACCESS_DIR | NFC_ECC_OP, 1057 nfc->regs + NFC_REG_CMD); 1058 1059 ret = sunxi_nfc_wait_events(nfc, NFC_CMD_INT_FLAG, false, 0); 1060 sunxi_nfc_randomizer_disable(nand); 1061 if (ret) 1062 return ret; 1063 1064 *cur_off = oob_off + ecc->bytes + 4; 1065 1066 return 0; 1067 } 1068 1069 static void sunxi_nfc_hw_ecc_write_extra_oob(struct nand_chip *nand, 1070 u8 *oob, int *cur_off, 1071 int page) 1072 { 1073 struct mtd_info *mtd = nand_to_mtd(nand); 1074 struct nand_ecc_ctrl *ecc = &nand->ecc; 1075 int offset = ((ecc->bytes + 4) * ecc->steps); 1076 int len = mtd->oobsize - offset; 1077 1078 if (len <= 0) 1079 return; 1080 1081 if (!cur_off || *cur_off != offset) 1082 nand_change_write_column_op(nand, offset + mtd->writesize, 1083 NULL, 0, false); 1084 1085 sunxi_nfc_randomizer_write_buf(nand, oob + offset, len, false, page); 1086 1087 if (cur_off) 1088 *cur_off = mtd->oobsize + mtd->writesize; 1089 } 1090 1091 static int sunxi_nfc_hw_ecc_read_page(struct nand_chip *nand, uint8_t *buf, 1092 int oob_required, int page) 1093 { 1094 struct mtd_info *mtd = nand_to_mtd(nand); 1095 struct nand_ecc_ctrl *ecc = &nand->ecc; 1096 unsigned int max_bitflips = 0; 1097 int ret, i, cur_off = 0; 1098 bool raw_mode = false; 1099 1100 sunxi_nfc_select_chip(nand, nand->cur_cs); 1101 1102 nand_read_page_op(nand, page, 0, NULL, 0); 1103 1104 sunxi_nfc_hw_ecc_enable(nand); 1105 1106 for (i = 0; i < ecc->steps; i++) { 1107 int data_off = i * ecc->size; 1108 int oob_off = i * (ecc->bytes + 4); 1109 u8 *data = buf + data_off; 1110 u8 *oob = nand->oob_poi + oob_off; 1111 1112 ret = sunxi_nfc_hw_ecc_read_chunk(nand, data, data_off, oob, 1113 oob_off + mtd->writesize, 1114 &cur_off, &max_bitflips, 1115 !i, oob_required, page); 1116 if (ret < 0) 1117 return ret; 1118 else if (ret) 1119 raw_mode = true; 1120 } 1121 1122 if (oob_required) 1123 sunxi_nfc_hw_ecc_read_extra_oob(nand, nand->oob_poi, &cur_off, 1124 !raw_mode, page); 1125 1126 sunxi_nfc_hw_ecc_disable(nand); 1127 1128 return max_bitflips; 1129 } 1130 1131 static int sunxi_nfc_hw_ecc_read_page_dma(struct nand_chip *nand, u8 *buf, 1132 int oob_required, int page) 1133 { 1134 int ret; 1135 1136 sunxi_nfc_select_chip(nand, nand->cur_cs); 1137 1138 nand_read_page_op(nand, page, 0, NULL, 0); 1139 1140 ret = sunxi_nfc_hw_ecc_read_chunks_dma(nand, buf, oob_required, page, 1141 nand->ecc.steps); 1142 if (ret >= 0) 1143 return ret; 1144 1145 /* Fallback to PIO mode */ 1146 return sunxi_nfc_hw_ecc_read_page(nand, buf, oob_required, page); 1147 } 1148 1149 static int sunxi_nfc_hw_ecc_read_subpage(struct nand_chip *nand, 1150 u32 data_offs, u32 readlen, 1151 u8 *bufpoi, int page) 1152 { 1153 struct mtd_info *mtd = nand_to_mtd(nand); 1154 struct nand_ecc_ctrl *ecc = &nand->ecc; 1155 int ret, i, cur_off = 0; 1156 unsigned int max_bitflips = 0; 1157 1158 sunxi_nfc_select_chip(nand, nand->cur_cs); 1159 1160 nand_read_page_op(nand, page, 0, NULL, 0); 1161 1162 sunxi_nfc_hw_ecc_enable(nand); 1163 1164 for (i = data_offs / ecc->size; 1165 i < DIV_ROUND_UP(data_offs + readlen, ecc->size); i++) { 1166 int data_off = i * ecc->size; 1167 int oob_off = i * (ecc->bytes + 4); 1168 u8 *data = bufpoi + data_off; 1169 u8 *oob = nand->oob_poi + oob_off; 1170 1171 ret = sunxi_nfc_hw_ecc_read_chunk(nand, data, data_off, 1172 oob, 1173 oob_off + mtd->writesize, 1174 &cur_off, &max_bitflips, !i, 1175 false, page); 1176 if (ret < 0) 1177 return ret; 1178 } 1179 1180 sunxi_nfc_hw_ecc_disable(nand); 1181 1182 return max_bitflips; 1183 } 1184 1185 static int sunxi_nfc_hw_ecc_read_subpage_dma(struct nand_chip *nand, 1186 u32 data_offs, u32 readlen, 1187 u8 *buf, int page) 1188 { 1189 int nchunks = DIV_ROUND_UP(data_offs + readlen, nand->ecc.size); 1190 int ret; 1191 1192 sunxi_nfc_select_chip(nand, nand->cur_cs); 1193 1194 nand_read_page_op(nand, page, 0, NULL, 0); 1195 1196 ret = sunxi_nfc_hw_ecc_read_chunks_dma(nand, buf, false, page, nchunks); 1197 if (ret >= 0) 1198 return ret; 1199 1200 /* Fallback to PIO mode */ 1201 return sunxi_nfc_hw_ecc_read_subpage(nand, data_offs, readlen, 1202 buf, page); 1203 } 1204 1205 static int sunxi_nfc_hw_ecc_write_page(struct nand_chip *nand, 1206 const uint8_t *buf, int oob_required, 1207 int page) 1208 { 1209 struct mtd_info *mtd = nand_to_mtd(nand); 1210 struct nand_ecc_ctrl *ecc = &nand->ecc; 1211 int ret, i, cur_off = 0; 1212 1213 sunxi_nfc_select_chip(nand, nand->cur_cs); 1214 1215 nand_prog_page_begin_op(nand, page, 0, NULL, 0); 1216 1217 sunxi_nfc_hw_ecc_enable(nand); 1218 1219 for (i = 0; i < ecc->steps; i++) { 1220 int data_off = i * ecc->size; 1221 int oob_off = i * (ecc->bytes + 4); 1222 const u8 *data = buf + data_off; 1223 const u8 *oob = nand->oob_poi + oob_off; 1224 1225 ret = sunxi_nfc_hw_ecc_write_chunk(nand, data, data_off, oob, 1226 oob_off + mtd->writesize, 1227 &cur_off, !i, page); 1228 if (ret) 1229 return ret; 1230 } 1231 1232 if (oob_required || (nand->options & NAND_NEED_SCRAMBLING)) 1233 sunxi_nfc_hw_ecc_write_extra_oob(nand, nand->oob_poi, 1234 &cur_off, page); 1235 1236 sunxi_nfc_hw_ecc_disable(nand); 1237 1238 return nand_prog_page_end_op(nand); 1239 } 1240 1241 static int sunxi_nfc_hw_ecc_write_subpage(struct nand_chip *nand, 1242 u32 data_offs, u32 data_len, 1243 const u8 *buf, int oob_required, 1244 int page) 1245 { 1246 struct mtd_info *mtd = nand_to_mtd(nand); 1247 struct nand_ecc_ctrl *ecc = &nand->ecc; 1248 int ret, i, cur_off = 0; 1249 1250 sunxi_nfc_select_chip(nand, nand->cur_cs); 1251 1252 nand_prog_page_begin_op(nand, page, 0, NULL, 0); 1253 1254 sunxi_nfc_hw_ecc_enable(nand); 1255 1256 for (i = data_offs / ecc->size; 1257 i < DIV_ROUND_UP(data_offs + data_len, ecc->size); i++) { 1258 int data_off = i * ecc->size; 1259 int oob_off = i * (ecc->bytes + 4); 1260 const u8 *data = buf + data_off; 1261 const u8 *oob = nand->oob_poi + oob_off; 1262 1263 ret = sunxi_nfc_hw_ecc_write_chunk(nand, data, data_off, oob, 1264 oob_off + mtd->writesize, 1265 &cur_off, !i, page); 1266 if (ret) 1267 return ret; 1268 } 1269 1270 sunxi_nfc_hw_ecc_disable(nand); 1271 1272 return nand_prog_page_end_op(nand); 1273 } 1274 1275 static int sunxi_nfc_hw_ecc_write_page_dma(struct nand_chip *nand, 1276 const u8 *buf, 1277 int oob_required, 1278 int page) 1279 { 1280 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller); 1281 struct nand_ecc_ctrl *ecc = &nand->ecc; 1282 struct scatterlist sg; 1283 u32 wait; 1284 int ret, i; 1285 1286 sunxi_nfc_select_chip(nand, nand->cur_cs); 1287 1288 ret = sunxi_nfc_wait_cmd_fifo_empty(nfc); 1289 if (ret) 1290 return ret; 1291 1292 ret = sunxi_nfc_dma_op_prepare(nfc, buf, ecc->size, ecc->steps, 1293 DMA_TO_DEVICE, &sg); 1294 if (ret) 1295 goto pio_fallback; 1296 1297 for (i = 0; i < ecc->steps; i++) { 1298 const u8 *oob = nand->oob_poi + (i * (ecc->bytes + 4)); 1299 1300 sunxi_nfc_hw_ecc_set_prot_oob_bytes(nand, oob, i, !i, page); 1301 } 1302 1303 nand_prog_page_begin_op(nand, page, 0, NULL, 0); 1304 1305 sunxi_nfc_hw_ecc_enable(nand); 1306 sunxi_nfc_randomizer_config(nand, page, false); 1307 sunxi_nfc_randomizer_enable(nand); 1308 1309 writel((NAND_CMD_RNDIN << 8) | NAND_CMD_PAGEPROG, 1310 nfc->regs + NFC_REG_WCMD_SET); 1311 1312 wait = NFC_CMD_INT_FLAG; 1313 1314 if (nfc->caps->has_mdma) 1315 wait |= NFC_DMA_INT_FLAG; 1316 else 1317 dma_async_issue_pending(nfc->dmac); 1318 1319 writel(NFC_PAGE_OP | NFC_DATA_SWAP_METHOD | 1320 NFC_DATA_TRANS | NFC_ACCESS_DIR, 1321 nfc->regs + NFC_REG_CMD); 1322 1323 ret = sunxi_nfc_wait_events(nfc, wait, false, 0); 1324 if (ret && !nfc->caps->has_mdma) 1325 dmaengine_terminate_all(nfc->dmac); 1326 1327 sunxi_nfc_randomizer_disable(nand); 1328 sunxi_nfc_hw_ecc_disable(nand); 1329 1330 sunxi_nfc_dma_op_cleanup(nfc, DMA_TO_DEVICE, &sg); 1331 1332 if (ret) 1333 return ret; 1334 1335 if (oob_required || (nand->options & NAND_NEED_SCRAMBLING)) 1336 /* TODO: use DMA to transfer extra OOB bytes ? */ 1337 sunxi_nfc_hw_ecc_write_extra_oob(nand, nand->oob_poi, 1338 NULL, page); 1339 1340 return nand_prog_page_end_op(nand); 1341 1342 pio_fallback: 1343 return sunxi_nfc_hw_ecc_write_page(nand, buf, oob_required, page); 1344 } 1345 1346 static int sunxi_nfc_hw_ecc_read_oob(struct nand_chip *nand, int page) 1347 { 1348 u8 *buf = nand_get_data_buf(nand); 1349 1350 return nand->ecc.read_page(nand, buf, 1, page); 1351 } 1352 1353 static int sunxi_nfc_hw_ecc_write_oob(struct nand_chip *nand, int page) 1354 { 1355 struct mtd_info *mtd = nand_to_mtd(nand); 1356 u8 *buf = nand_get_data_buf(nand); 1357 int ret; 1358 1359 memset(buf, 0xff, mtd->writesize); 1360 ret = nand->ecc.write_page(nand, buf, 1, page); 1361 if (ret) 1362 return ret; 1363 1364 /* Send command to program the OOB data */ 1365 return nand_prog_page_end_op(nand); 1366 } 1367 1368 static const s32 tWB_lut[] = {6, 12, 16, 20}; 1369 static const s32 tRHW_lut[] = {4, 8, 12, 20}; 1370 1371 static int _sunxi_nand_lookup_timing(const s32 *lut, int lut_size, u32 duration, 1372 u32 clk_period) 1373 { 1374 u32 clk_cycles = DIV_ROUND_UP(duration, clk_period); 1375 int i; 1376 1377 for (i = 0; i < lut_size; i++) { 1378 if (clk_cycles <= lut[i]) 1379 return i; 1380 } 1381 1382 /* Doesn't fit */ 1383 return -EINVAL; 1384 } 1385 1386 #define sunxi_nand_lookup_timing(l, p, c) \ 1387 _sunxi_nand_lookup_timing(l, ARRAY_SIZE(l), p, c) 1388 1389 static int sunxi_nfc_setup_interface(struct nand_chip *nand, int csline, 1390 const struct nand_interface_config *conf) 1391 { 1392 struct sunxi_nand_chip *sunxi_nand = to_sunxi_nand(nand); 1393 struct sunxi_nfc *nfc = to_sunxi_nfc(sunxi_nand->nand.controller); 1394 const struct nand_sdr_timings *timings; 1395 u32 min_clk_period = 0; 1396 s32 tWB, tADL, tWHR, tRHW, tCAD; 1397 long real_clk_rate; 1398 1399 timings = nand_get_sdr_timings(conf); 1400 if (IS_ERR(timings)) 1401 return -ENOTSUPP; 1402 1403 /* T1 <=> tCLS */ 1404 if (timings->tCLS_min > min_clk_period) 1405 min_clk_period = timings->tCLS_min; 1406 1407 /* T2 <=> tCLH */ 1408 if (timings->tCLH_min > min_clk_period) 1409 min_clk_period = timings->tCLH_min; 1410 1411 /* T3 <=> tCS */ 1412 if (timings->tCS_min > min_clk_period) 1413 min_clk_period = timings->tCS_min; 1414 1415 /* T4 <=> tCH */ 1416 if (timings->tCH_min > min_clk_period) 1417 min_clk_period = timings->tCH_min; 1418 1419 /* T5 <=> tWP */ 1420 if (timings->tWP_min > min_clk_period) 1421 min_clk_period = timings->tWP_min; 1422 1423 /* T6 <=> tWH */ 1424 if (timings->tWH_min > min_clk_period) 1425 min_clk_period = timings->tWH_min; 1426 1427 /* T7 <=> tALS */ 1428 if (timings->tALS_min > min_clk_period) 1429 min_clk_period = timings->tALS_min; 1430 1431 /* T8 <=> tDS */ 1432 if (timings->tDS_min > min_clk_period) 1433 min_clk_period = timings->tDS_min; 1434 1435 /* T9 <=> tDH */ 1436 if (timings->tDH_min > min_clk_period) 1437 min_clk_period = timings->tDH_min; 1438 1439 /* T10 <=> tRR */ 1440 if (timings->tRR_min > (min_clk_period * 3)) 1441 min_clk_period = DIV_ROUND_UP(timings->tRR_min, 3); 1442 1443 /* T11 <=> tALH */ 1444 if (timings->tALH_min > min_clk_period) 1445 min_clk_period = timings->tALH_min; 1446 1447 /* T12 <=> tRP */ 1448 if (timings->tRP_min > min_clk_period) 1449 min_clk_period = timings->tRP_min; 1450 1451 /* T13 <=> tREH */ 1452 if (timings->tREH_min > min_clk_period) 1453 min_clk_period = timings->tREH_min; 1454 1455 /* T14 <=> tRC */ 1456 if (timings->tRC_min > (min_clk_period * 2)) 1457 min_clk_period = DIV_ROUND_UP(timings->tRC_min, 2); 1458 1459 /* T15 <=> tWC */ 1460 if (timings->tWC_min > (min_clk_period * 2)) 1461 min_clk_period = DIV_ROUND_UP(timings->tWC_min, 2); 1462 1463 /* T16 - T19 + tCAD */ 1464 if (timings->tWB_max > (min_clk_period * 20)) 1465 min_clk_period = DIV_ROUND_UP(timings->tWB_max, 20); 1466 1467 if (timings->tADL_min > (min_clk_period * 32)) 1468 min_clk_period = DIV_ROUND_UP(timings->tADL_min, 32); 1469 1470 if (timings->tWHR_min > (min_clk_period * 32)) 1471 min_clk_period = DIV_ROUND_UP(timings->tWHR_min, 32); 1472 1473 if (timings->tRHW_min > (min_clk_period * 20)) 1474 min_clk_period = DIV_ROUND_UP(timings->tRHW_min, 20); 1475 1476 /* 1477 * In non-EDO, tREA should be less than tRP to guarantee that the 1478 * controller does not sample the IO lines too early. Unfortunately, 1479 * the sunxi NAND controller does not allow us to have different 1480 * values for tRP and tREH (tRP = tREH = tRW / 2). 1481 * 1482 * We have 2 options to overcome this limitation: 1483 * 1484 * 1/ Extend tRC to fulfil the tREA <= tRC / 2 constraint 1485 * 2/ Use EDO mode (only works if timings->tRLOH > 0) 1486 */ 1487 if (timings->tREA_max > min_clk_period && !timings->tRLOH_min) 1488 min_clk_period = timings->tREA_max; 1489 1490 tWB = sunxi_nand_lookup_timing(tWB_lut, timings->tWB_max, 1491 min_clk_period); 1492 if (tWB < 0) { 1493 dev_err(nfc->dev, "unsupported tWB\n"); 1494 return tWB; 1495 } 1496 1497 tADL = DIV_ROUND_UP(timings->tADL_min, min_clk_period) >> 3; 1498 if (tADL > 3) { 1499 dev_err(nfc->dev, "unsupported tADL\n"); 1500 return -EINVAL; 1501 } 1502 1503 tWHR = DIV_ROUND_UP(timings->tWHR_min, min_clk_period) >> 3; 1504 if (tWHR > 3) { 1505 dev_err(nfc->dev, "unsupported tWHR\n"); 1506 return -EINVAL; 1507 } 1508 1509 tRHW = sunxi_nand_lookup_timing(tRHW_lut, timings->tRHW_min, 1510 min_clk_period); 1511 if (tRHW < 0) { 1512 dev_err(nfc->dev, "unsupported tRHW\n"); 1513 return tRHW; 1514 } 1515 1516 if (csline == NAND_DATA_IFACE_CHECK_ONLY) 1517 return 0; 1518 1519 /* 1520 * TODO: according to ONFI specs this value only applies for DDR NAND, 1521 * but Allwinner seems to set this to 0x7. Mimic them for now. 1522 */ 1523 tCAD = 0x7; 1524 1525 /* TODO: A83 has some more bits for CDQSS, CS, CLHZ, CCS, WC */ 1526 sunxi_nand->timing_cfg = NFC_TIMING_CFG(tWB, tADL, tWHR, tRHW, tCAD); 1527 1528 /* Convert min_clk_period from picoseconds to nanoseconds */ 1529 min_clk_period = DIV_ROUND_UP(min_clk_period, 1000); 1530 1531 /* 1532 * Unlike what is stated in Allwinner datasheet, the clk_rate should 1533 * be set to (1 / min_clk_period), and not (2 / min_clk_period). 1534 * This new formula was verified with a scope and validated by 1535 * Allwinner engineers. 1536 */ 1537 sunxi_nand->clk_rate = NSEC_PER_SEC / min_clk_period; 1538 real_clk_rate = clk_round_rate(nfc->mod_clk, sunxi_nand->clk_rate); 1539 if (real_clk_rate <= 0) { 1540 dev_err(nfc->dev, "Unable to round clk %lu\n", 1541 sunxi_nand->clk_rate); 1542 return -EINVAL; 1543 } 1544 1545 sunxi_nand->timing_ctl = 0; 1546 1547 /* 1548 * ONFI specification 3.1, paragraph 4.15.2 dictates that EDO data 1549 * output cycle timings shall be used if the host drives tRC less than 1550 * 30 ns. We should also use EDO mode if tREA is bigger than tRP. 1551 */ 1552 min_clk_period = NSEC_PER_SEC / real_clk_rate; 1553 if (min_clk_period * 2 < 30 || min_clk_period * 1000 < timings->tREA_max) 1554 sunxi_nand->timing_ctl = NFC_TIMING_CTL_EDO; 1555 1556 return 0; 1557 } 1558 1559 static int sunxi_nand_ooblayout_ecc(struct mtd_info *mtd, int section, 1560 struct mtd_oob_region *oobregion) 1561 { 1562 struct nand_chip *nand = mtd_to_nand(mtd); 1563 struct nand_ecc_ctrl *ecc = &nand->ecc; 1564 1565 if (section >= ecc->steps) 1566 return -ERANGE; 1567 1568 oobregion->offset = section * (ecc->bytes + 4) + 4; 1569 oobregion->length = ecc->bytes; 1570 1571 return 0; 1572 } 1573 1574 static int sunxi_nand_ooblayout_free(struct mtd_info *mtd, int section, 1575 struct mtd_oob_region *oobregion) 1576 { 1577 struct nand_chip *nand = mtd_to_nand(mtd); 1578 struct nand_ecc_ctrl *ecc = &nand->ecc; 1579 1580 if (section > ecc->steps) 1581 return -ERANGE; 1582 1583 /* 1584 * The first 2 bytes are used for BB markers, hence we 1585 * only have 2 bytes available in the first user data 1586 * section. 1587 */ 1588 if (!section && ecc->engine_type == NAND_ECC_ENGINE_TYPE_ON_HOST) { 1589 oobregion->offset = 2; 1590 oobregion->length = 2; 1591 1592 return 0; 1593 } 1594 1595 /* 1596 * The controller does not provide access to OOB bytes 1597 * past the end of the ECC data. 1598 */ 1599 if (section == ecc->steps && ecc->engine_type == NAND_ECC_ENGINE_TYPE_ON_HOST) 1600 return -ERANGE; 1601 1602 oobregion->offset = section * (ecc->bytes + 4); 1603 1604 if (section < ecc->steps) 1605 oobregion->length = 4; 1606 else 1607 oobregion->length = mtd->oobsize - oobregion->offset; 1608 1609 return 0; 1610 } 1611 1612 static const struct mtd_ooblayout_ops sunxi_nand_ooblayout_ops = { 1613 .ecc = sunxi_nand_ooblayout_ecc, 1614 .free = sunxi_nand_ooblayout_free, 1615 }; 1616 1617 static int sunxi_nand_hw_ecc_ctrl_init(struct nand_chip *nand, 1618 struct nand_ecc_ctrl *ecc, 1619 struct device_node *np) 1620 { 1621 static const u8 strengths[] = { 16, 24, 28, 32, 40, 48, 56, 60, 64 }; 1622 struct sunxi_nand_chip *sunxi_nand = to_sunxi_nand(nand); 1623 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller); 1624 struct mtd_info *mtd = nand_to_mtd(nand); 1625 struct nand_device *nanddev = mtd_to_nanddev(mtd); 1626 int nsectors; 1627 int i; 1628 1629 if (nanddev->ecc.user_conf.flags & NAND_ECC_MAXIMIZE_STRENGTH) { 1630 int bytes; 1631 1632 ecc->size = 1024; 1633 nsectors = mtd->writesize / ecc->size; 1634 1635 /* Reserve 2 bytes for the BBM */ 1636 bytes = (mtd->oobsize - 2) / nsectors; 1637 1638 /* 4 non-ECC bytes are added before each ECC bytes section */ 1639 bytes -= 4; 1640 1641 /* and bytes has to be even. */ 1642 if (bytes % 2) 1643 bytes--; 1644 1645 ecc->strength = bytes * 8 / fls(8 * ecc->size); 1646 1647 for (i = 0; i < ARRAY_SIZE(strengths); i++) { 1648 if (strengths[i] > ecc->strength) 1649 break; 1650 } 1651 1652 if (!i) 1653 ecc->strength = 0; 1654 else 1655 ecc->strength = strengths[i - 1]; 1656 } 1657 1658 if (ecc->size != 512 && ecc->size != 1024) 1659 return -EINVAL; 1660 1661 /* Prefer 1k ECC chunk over 512 ones */ 1662 if (ecc->size == 512 && mtd->writesize > 512) { 1663 ecc->size = 1024; 1664 ecc->strength *= 2; 1665 } 1666 1667 /* Add ECC info retrieval from DT */ 1668 for (i = 0; i < ARRAY_SIZE(strengths); i++) { 1669 if (ecc->strength <= strengths[i]) { 1670 /* 1671 * Update ecc->strength value with the actual strength 1672 * that will be used by the ECC engine. 1673 */ 1674 ecc->strength = strengths[i]; 1675 break; 1676 } 1677 } 1678 1679 if (i >= ARRAY_SIZE(strengths)) { 1680 dev_err(nfc->dev, "unsupported strength\n"); 1681 return -ENOTSUPP; 1682 } 1683 1684 /* HW ECC always request ECC bytes for 1024 bytes blocks */ 1685 ecc->bytes = DIV_ROUND_UP(ecc->strength * fls(8 * 1024), 8); 1686 1687 /* HW ECC always work with even numbers of ECC bytes */ 1688 ecc->bytes = ALIGN(ecc->bytes, 2); 1689 1690 nsectors = mtd->writesize / ecc->size; 1691 1692 if (mtd->oobsize < ((ecc->bytes + 4) * nsectors)) 1693 return -EINVAL; 1694 1695 ecc->read_oob = sunxi_nfc_hw_ecc_read_oob; 1696 ecc->write_oob = sunxi_nfc_hw_ecc_write_oob; 1697 mtd_set_ooblayout(mtd, &sunxi_nand_ooblayout_ops); 1698 1699 if (nfc->dmac || nfc->caps->has_mdma) { 1700 ecc->read_page = sunxi_nfc_hw_ecc_read_page_dma; 1701 ecc->read_subpage = sunxi_nfc_hw_ecc_read_subpage_dma; 1702 ecc->write_page = sunxi_nfc_hw_ecc_write_page_dma; 1703 nand->options |= NAND_USES_DMA; 1704 } else { 1705 ecc->read_page = sunxi_nfc_hw_ecc_read_page; 1706 ecc->read_subpage = sunxi_nfc_hw_ecc_read_subpage; 1707 ecc->write_page = sunxi_nfc_hw_ecc_write_page; 1708 } 1709 1710 /* TODO: support DMA for raw accesses and subpage write */ 1711 ecc->write_subpage = sunxi_nfc_hw_ecc_write_subpage; 1712 ecc->read_oob_raw = nand_read_oob_std; 1713 ecc->write_oob_raw = nand_write_oob_std; 1714 1715 sunxi_nand->ecc.ecc_ctl = NFC_ECC_MODE(i) | NFC_ECC_EXCEPTION | 1716 NFC_ECC_PIPELINE | NFC_ECC_EN; 1717 1718 if (ecc->size == 512) 1719 sunxi_nand->ecc.ecc_ctl |= NFC_ECC_BLOCK_512; 1720 1721 return 0; 1722 } 1723 1724 static int sunxi_nand_attach_chip(struct nand_chip *nand) 1725 { 1726 const struct nand_ecc_props *requirements = 1727 nanddev_get_ecc_requirements(&nand->base); 1728 struct nand_ecc_ctrl *ecc = &nand->ecc; 1729 struct device_node *np = nand_get_flash_node(nand); 1730 int ret; 1731 1732 if (nand->bbt_options & NAND_BBT_USE_FLASH) 1733 nand->bbt_options |= NAND_BBT_NO_OOB; 1734 1735 if (nand->options & NAND_NEED_SCRAMBLING) 1736 nand->options |= NAND_NO_SUBPAGE_WRITE; 1737 1738 nand->options |= NAND_SUBPAGE_READ; 1739 1740 if (!ecc->size) { 1741 ecc->size = requirements->step_size; 1742 ecc->strength = requirements->strength; 1743 } 1744 1745 if (!ecc->size || !ecc->strength) 1746 return -EINVAL; 1747 1748 switch (ecc->engine_type) { 1749 case NAND_ECC_ENGINE_TYPE_ON_HOST: 1750 ret = sunxi_nand_hw_ecc_ctrl_init(nand, ecc, np); 1751 if (ret) 1752 return ret; 1753 break; 1754 case NAND_ECC_ENGINE_TYPE_NONE: 1755 case NAND_ECC_ENGINE_TYPE_SOFT: 1756 break; 1757 default: 1758 return -EINVAL; 1759 } 1760 1761 return 0; 1762 } 1763 1764 static int sunxi_nfc_exec_subop(struct nand_chip *nand, 1765 const struct nand_subop *subop) 1766 { 1767 struct sunxi_nfc *nfc = to_sunxi_nfc(nand->controller); 1768 u32 cmd = 0, extcmd = 0, cnt = 0, addrs[2] = { }; 1769 unsigned int i, j, remaining, start; 1770 void *inbuf = NULL; 1771 int ret; 1772 1773 for (i = 0; i < subop->ninstrs; i++) { 1774 const struct nand_op_instr *instr = &subop->instrs[i]; 1775 1776 switch (instr->type) { 1777 case NAND_OP_CMD_INSTR: 1778 if (cmd & NFC_SEND_CMD1) { 1779 if (WARN_ON(cmd & NFC_SEND_CMD2)) 1780 return -EINVAL; 1781 1782 cmd |= NFC_SEND_CMD2; 1783 extcmd |= instr->ctx.cmd.opcode; 1784 } else { 1785 cmd |= NFC_SEND_CMD1 | 1786 NFC_CMD(instr->ctx.cmd.opcode); 1787 } 1788 break; 1789 1790 case NAND_OP_ADDR_INSTR: 1791 remaining = nand_subop_get_num_addr_cyc(subop, i); 1792 start = nand_subop_get_addr_start_off(subop, i); 1793 for (j = 0; j < 8 && j + start < remaining; j++) { 1794 u32 addr = instr->ctx.addr.addrs[j + start]; 1795 1796 addrs[j / 4] |= addr << (j % 4) * 8; 1797 } 1798 1799 if (j) 1800 cmd |= NFC_SEND_ADR | NFC_ADR_NUM(j); 1801 1802 break; 1803 1804 case NAND_OP_DATA_IN_INSTR: 1805 case NAND_OP_DATA_OUT_INSTR: 1806 start = nand_subop_get_data_start_off(subop, i); 1807 remaining = nand_subop_get_data_len(subop, i); 1808 cnt = min_t(u32, remaining, NFC_SRAM_SIZE); 1809 cmd |= NFC_DATA_TRANS | NFC_DATA_SWAP_METHOD; 1810 1811 if (instr->type == NAND_OP_DATA_OUT_INSTR) { 1812 cmd |= NFC_ACCESS_DIR; 1813 memcpy_toio(nfc->regs + NFC_RAM0_BASE, 1814 instr->ctx.data.buf.out + start, 1815 cnt); 1816 } else { 1817 inbuf = instr->ctx.data.buf.in + start; 1818 } 1819 1820 break; 1821 1822 case NAND_OP_WAITRDY_INSTR: 1823 cmd |= NFC_WAIT_FLAG; 1824 break; 1825 } 1826 } 1827 1828 ret = sunxi_nfc_wait_cmd_fifo_empty(nfc); 1829 if (ret) 1830 return ret; 1831 1832 if (cmd & NFC_SEND_ADR) { 1833 writel(addrs[0], nfc->regs + NFC_REG_ADDR_LOW); 1834 writel(addrs[1], nfc->regs + NFC_REG_ADDR_HIGH); 1835 } 1836 1837 if (cmd & NFC_SEND_CMD2) 1838 writel(extcmd, 1839 nfc->regs + 1840 (cmd & NFC_ACCESS_DIR ? 1841 NFC_REG_WCMD_SET : NFC_REG_RCMD_SET)); 1842 1843 if (cmd & NFC_DATA_TRANS) 1844 writel(cnt, nfc->regs + NFC_REG_CNT); 1845 1846 writel(cmd, nfc->regs + NFC_REG_CMD); 1847 1848 ret = sunxi_nfc_wait_events(nfc, NFC_CMD_INT_FLAG, 1849 !(cmd & NFC_WAIT_FLAG) && cnt < 64, 1850 0); 1851 if (ret) 1852 return ret; 1853 1854 if (inbuf) 1855 memcpy_fromio(inbuf, nfc->regs + NFC_RAM0_BASE, cnt); 1856 1857 return 0; 1858 } 1859 1860 static int sunxi_nfc_soft_waitrdy(struct nand_chip *nand, 1861 const struct nand_subop *subop) 1862 { 1863 return nand_soft_waitrdy(nand, 1864 subop->instrs[0].ctx.waitrdy.timeout_ms); 1865 } 1866 1867 static const struct nand_op_parser sunxi_nfc_op_parser = NAND_OP_PARSER( 1868 NAND_OP_PARSER_PATTERN(sunxi_nfc_exec_subop, 1869 NAND_OP_PARSER_PAT_CMD_ELEM(true), 1870 NAND_OP_PARSER_PAT_ADDR_ELEM(true, 8), 1871 NAND_OP_PARSER_PAT_CMD_ELEM(true), 1872 NAND_OP_PARSER_PAT_WAITRDY_ELEM(true), 1873 NAND_OP_PARSER_PAT_DATA_IN_ELEM(true, 1024)), 1874 NAND_OP_PARSER_PATTERN(sunxi_nfc_exec_subop, 1875 NAND_OP_PARSER_PAT_CMD_ELEM(true), 1876 NAND_OP_PARSER_PAT_ADDR_ELEM(true, 8), 1877 NAND_OP_PARSER_PAT_DATA_OUT_ELEM(true, 1024), 1878 NAND_OP_PARSER_PAT_CMD_ELEM(true), 1879 NAND_OP_PARSER_PAT_WAITRDY_ELEM(true)), 1880 ); 1881 1882 static const struct nand_op_parser sunxi_nfc_norb_op_parser = NAND_OP_PARSER( 1883 NAND_OP_PARSER_PATTERN(sunxi_nfc_exec_subop, 1884 NAND_OP_PARSER_PAT_CMD_ELEM(true), 1885 NAND_OP_PARSER_PAT_ADDR_ELEM(true, 8), 1886 NAND_OP_PARSER_PAT_CMD_ELEM(true), 1887 NAND_OP_PARSER_PAT_DATA_IN_ELEM(true, 1024)), 1888 NAND_OP_PARSER_PATTERN(sunxi_nfc_exec_subop, 1889 NAND_OP_PARSER_PAT_CMD_ELEM(true), 1890 NAND_OP_PARSER_PAT_ADDR_ELEM(true, 8), 1891 NAND_OP_PARSER_PAT_DATA_OUT_ELEM(true, 1024), 1892 NAND_OP_PARSER_PAT_CMD_ELEM(true)), 1893 NAND_OP_PARSER_PATTERN(sunxi_nfc_soft_waitrdy, 1894 NAND_OP_PARSER_PAT_WAITRDY_ELEM(false)), 1895 ); 1896 1897 static int sunxi_nfc_exec_op(struct nand_chip *nand, 1898 const struct nand_operation *op, bool check_only) 1899 { 1900 struct sunxi_nand_chip *sunxi_nand = to_sunxi_nand(nand); 1901 const struct nand_op_parser *parser; 1902 1903 if (!check_only) 1904 sunxi_nfc_select_chip(nand, op->cs); 1905 1906 if (sunxi_nand->sels[op->cs].rb >= 0) 1907 parser = &sunxi_nfc_op_parser; 1908 else 1909 parser = &sunxi_nfc_norb_op_parser; 1910 1911 return nand_op_parser_exec_op(nand, parser, op, check_only); 1912 } 1913 1914 static const struct nand_controller_ops sunxi_nand_controller_ops = { 1915 .attach_chip = sunxi_nand_attach_chip, 1916 .setup_interface = sunxi_nfc_setup_interface, 1917 .exec_op = sunxi_nfc_exec_op, 1918 }; 1919 1920 static void sunxi_nand_chips_cleanup(struct sunxi_nfc *nfc) 1921 { 1922 struct sunxi_nand_chip *sunxi_nand; 1923 struct nand_chip *chip; 1924 int ret; 1925 1926 while (!list_empty(&nfc->chips)) { 1927 sunxi_nand = list_first_entry(&nfc->chips, 1928 struct sunxi_nand_chip, 1929 node); 1930 chip = &sunxi_nand->nand; 1931 ret = mtd_device_unregister(nand_to_mtd(chip)); 1932 WARN_ON(ret); 1933 nand_cleanup(chip); 1934 list_del(&sunxi_nand->node); 1935 } 1936 } 1937 1938 static int sunxi_nand_chip_init(struct device *dev, struct sunxi_nfc *nfc, 1939 struct device_node *np) 1940 { 1941 struct sunxi_nand_chip *sunxi_nand; 1942 struct mtd_info *mtd; 1943 struct nand_chip *nand; 1944 int nsels; 1945 int ret; 1946 int i; 1947 u32 tmp; 1948 1949 if (!of_get_property(np, "reg", &nsels)) 1950 return -EINVAL; 1951 1952 nsels /= sizeof(u32); 1953 if (!nsels) { 1954 dev_err(dev, "invalid reg property size\n"); 1955 return -EINVAL; 1956 } 1957 1958 sunxi_nand = devm_kzalloc(dev, struct_size(sunxi_nand, sels, nsels), 1959 GFP_KERNEL); 1960 if (!sunxi_nand) 1961 return -ENOMEM; 1962 1963 sunxi_nand->nsels = nsels; 1964 1965 for (i = 0; i < nsels; i++) { 1966 ret = of_property_read_u32_index(np, "reg", i, &tmp); 1967 if (ret) { 1968 dev_err(dev, "could not retrieve reg property: %d\n", 1969 ret); 1970 return ret; 1971 } 1972 1973 if (tmp > NFC_MAX_CS) { 1974 dev_err(dev, 1975 "invalid reg value: %u (max CS = 7)\n", 1976 tmp); 1977 return -EINVAL; 1978 } 1979 1980 if (test_and_set_bit(tmp, &nfc->assigned_cs)) { 1981 dev_err(dev, "CS %d already assigned\n", tmp); 1982 return -EINVAL; 1983 } 1984 1985 sunxi_nand->sels[i].cs = tmp; 1986 1987 if (!of_property_read_u32_index(np, "allwinner,rb", i, &tmp) && 1988 tmp < 2) 1989 sunxi_nand->sels[i].rb = tmp; 1990 else 1991 sunxi_nand->sels[i].rb = -1; 1992 } 1993 1994 nand = &sunxi_nand->nand; 1995 /* Default tR value specified in the ONFI spec (chapter 4.15.1) */ 1996 nand->controller = &nfc->controller; 1997 nand->controller->ops = &sunxi_nand_controller_ops; 1998 1999 /* 2000 * Set the ECC mode to the default value in case nothing is specified 2001 * in the DT. 2002 */ 2003 nand->ecc.engine_type = NAND_ECC_ENGINE_TYPE_ON_HOST; 2004 nand_set_flash_node(nand, np); 2005 2006 mtd = nand_to_mtd(nand); 2007 mtd->dev.parent = dev; 2008 2009 ret = nand_scan(nand, nsels); 2010 if (ret) 2011 return ret; 2012 2013 ret = mtd_device_register(mtd, NULL, 0); 2014 if (ret) { 2015 dev_err(dev, "failed to register mtd device: %d\n", ret); 2016 nand_cleanup(nand); 2017 return ret; 2018 } 2019 2020 list_add_tail(&sunxi_nand->node, &nfc->chips); 2021 2022 return 0; 2023 } 2024 2025 static int sunxi_nand_chips_init(struct device *dev, struct sunxi_nfc *nfc) 2026 { 2027 struct device_node *np = dev->of_node; 2028 int ret; 2029 2030 for_each_child_of_node_scoped(np, nand_np) { 2031 ret = sunxi_nand_chip_init(dev, nfc, nand_np); 2032 if (ret) { 2033 sunxi_nand_chips_cleanup(nfc); 2034 return ret; 2035 } 2036 } 2037 2038 return 0; 2039 } 2040 2041 static int sunxi_nfc_dma_init(struct sunxi_nfc *nfc, struct resource *r) 2042 { 2043 int ret; 2044 2045 if (nfc->caps->has_mdma) 2046 return 0; 2047 2048 nfc->dmac = dma_request_chan(nfc->dev, "rxtx"); 2049 if (IS_ERR(nfc->dmac)) { 2050 ret = PTR_ERR(nfc->dmac); 2051 if (ret == -EPROBE_DEFER) 2052 return ret; 2053 2054 /* Ignore errors to fall back to PIO mode */ 2055 dev_warn(nfc->dev, "failed to request rxtx DMA channel: %d\n", ret); 2056 nfc->dmac = NULL; 2057 } else { 2058 struct dma_slave_config dmac_cfg = { }; 2059 2060 dmac_cfg.src_addr = r->start + nfc->caps->reg_io_data; 2061 dmac_cfg.dst_addr = dmac_cfg.src_addr; 2062 dmac_cfg.src_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES; 2063 dmac_cfg.dst_addr_width = dmac_cfg.src_addr_width; 2064 dmac_cfg.src_maxburst = nfc->caps->dma_maxburst; 2065 dmac_cfg.dst_maxburst = nfc->caps->dma_maxburst; 2066 dmaengine_slave_config(nfc->dmac, &dmac_cfg); 2067 } 2068 return 0; 2069 } 2070 2071 static int sunxi_nfc_probe(struct platform_device *pdev) 2072 { 2073 struct device *dev = &pdev->dev; 2074 struct resource *r; 2075 struct sunxi_nfc *nfc; 2076 int irq; 2077 int ret; 2078 2079 nfc = devm_kzalloc(dev, sizeof(*nfc), GFP_KERNEL); 2080 if (!nfc) 2081 return -ENOMEM; 2082 2083 nfc->dev = dev; 2084 nand_controller_init(&nfc->controller); 2085 INIT_LIST_HEAD(&nfc->chips); 2086 2087 nfc->regs = devm_platform_get_and_ioremap_resource(pdev, 0, &r); 2088 if (IS_ERR(nfc->regs)) 2089 return PTR_ERR(nfc->regs); 2090 2091 irq = platform_get_irq(pdev, 0); 2092 if (irq < 0) 2093 return irq; 2094 2095 nfc->ahb_clk = devm_clk_get_enabled(dev, "ahb"); 2096 if (IS_ERR(nfc->ahb_clk)) { 2097 dev_err(dev, "failed to retrieve ahb clk\n"); 2098 return PTR_ERR(nfc->ahb_clk); 2099 } 2100 2101 nfc->mod_clk = devm_clk_get_enabled(dev, "mod"); 2102 if (IS_ERR(nfc->mod_clk)) { 2103 dev_err(dev, "failed to retrieve mod clk\n"); 2104 return PTR_ERR(nfc->mod_clk); 2105 } 2106 2107 nfc->reset = devm_reset_control_get_optional_exclusive(dev, "ahb"); 2108 if (IS_ERR(nfc->reset)) 2109 return PTR_ERR(nfc->reset); 2110 2111 ret = reset_control_deassert(nfc->reset); 2112 if (ret) { 2113 dev_err(dev, "reset err %d\n", ret); 2114 return ret; 2115 } 2116 2117 nfc->caps = of_device_get_match_data(&pdev->dev); 2118 if (!nfc->caps) { 2119 ret = -EINVAL; 2120 goto out_ahb_reset_reassert; 2121 } 2122 2123 ret = sunxi_nfc_rst(nfc); 2124 if (ret) 2125 goto out_ahb_reset_reassert; 2126 2127 writel(0, nfc->regs + NFC_REG_INT); 2128 ret = devm_request_irq(dev, irq, sunxi_nfc_interrupt, 2129 0, "sunxi-nand", nfc); 2130 if (ret) 2131 goto out_ahb_reset_reassert; 2132 2133 ret = sunxi_nfc_dma_init(nfc, r); 2134 2135 if (ret) 2136 goto out_ahb_reset_reassert; 2137 2138 platform_set_drvdata(pdev, nfc); 2139 2140 ret = sunxi_nand_chips_init(dev, nfc); 2141 if (ret) { 2142 dev_err(dev, "failed to init nand chips\n"); 2143 goto out_release_dmac; 2144 } 2145 2146 return 0; 2147 2148 out_release_dmac: 2149 if (nfc->dmac) 2150 dma_release_channel(nfc->dmac); 2151 out_ahb_reset_reassert: 2152 reset_control_assert(nfc->reset); 2153 2154 return ret; 2155 } 2156 2157 static void sunxi_nfc_remove(struct platform_device *pdev) 2158 { 2159 struct sunxi_nfc *nfc = platform_get_drvdata(pdev); 2160 2161 sunxi_nand_chips_cleanup(nfc); 2162 2163 reset_control_assert(nfc->reset); 2164 2165 if (nfc->dmac) 2166 dma_release_channel(nfc->dmac); 2167 } 2168 2169 static const struct sunxi_nfc_caps sunxi_nfc_a10_caps = { 2170 .reg_io_data = NFC_REG_A10_IO_DATA, 2171 .dma_maxburst = 4, 2172 }; 2173 2174 static const struct sunxi_nfc_caps sunxi_nfc_a23_caps = { 2175 .has_mdma = true, 2176 .reg_io_data = NFC_REG_A23_IO_DATA, 2177 .dma_maxburst = 8, 2178 }; 2179 2180 static const struct of_device_id sunxi_nfc_ids[] = { 2181 { 2182 .compatible = "allwinner,sun4i-a10-nand", 2183 .data = &sunxi_nfc_a10_caps, 2184 }, 2185 { 2186 .compatible = "allwinner,sun8i-a23-nand-controller", 2187 .data = &sunxi_nfc_a23_caps, 2188 }, 2189 { /* sentinel */ } 2190 }; 2191 MODULE_DEVICE_TABLE(of, sunxi_nfc_ids); 2192 2193 static struct platform_driver sunxi_nfc_driver = { 2194 .driver = { 2195 .name = "sunxi_nand", 2196 .of_match_table = sunxi_nfc_ids, 2197 }, 2198 .probe = sunxi_nfc_probe, 2199 .remove_new = sunxi_nfc_remove, 2200 }; 2201 module_platform_driver(sunxi_nfc_driver); 2202 2203 MODULE_LICENSE("GPL"); 2204 MODULE_AUTHOR("Boris BREZILLON"); 2205 MODULE_DESCRIPTION("Allwinner NAND Flash Controller driver"); 2206 MODULE_ALIAS("platform:sunxi_nand"); 2207