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