uboot/drivers/mtd/nand/raw/zynq_nand.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0+
   2/*
   3 * (C) Copyright 2016 Xilinx, Inc.
   4 *
   5 * Xilinx Zynq NAND Flash Controller Driver
   6 * This driver is based on plat_nand.c and mxc_nand.c drivers
   7 */
   8
   9#include <common.h>
  10#include <malloc.h>
  11#include <asm/io.h>
  12#include <linux/errno.h>
  13#include <nand.h>
  14#include <linux/mtd/mtd.h>
  15#include <linux/mtd/rawnand.h>
  16#include <linux/mtd/partitions.h>
  17#include <linux/mtd/nand_ecc.h>
  18#include <asm/arch/hardware.h>
  19#include <asm/arch/sys_proto.h>
  20
  21/* The NAND flash driver defines */
  22#define ZYNQ_NAND_CMD_PHASE             1
  23#define ZYNQ_NAND_DATA_PHASE            2
  24#define ZYNQ_NAND_ECC_SIZE              512
  25#define ZYNQ_NAND_SET_OPMODE_8BIT       (0 << 0)
  26#define ZYNQ_NAND_SET_OPMODE_16BIT      (1 << 0)
  27#define ZYNQ_NAND_ECC_STATUS            (1 << 6)
  28#define ZYNQ_MEMC_CLRCR_INT_CLR1        (1 << 4)
  29#define ZYNQ_MEMC_SR_RAW_INT_ST1        (1 << 6)
  30#define ZYNQ_MEMC_SR_INT_ST1            (1 << 4)
  31#define ZYNQ_MEMC_NAND_ECC_MODE_MASK    0xC
  32
  33/* Flash memory controller operating parameters */
  34#define ZYNQ_NAND_CLR_CONFIG    ((0x1 << 1)  |  /* Disable interrupt */ \
  35                                (0x1 << 4)   |  /* Clear interrupt */ \
  36                                (0x1 << 6))     /* Disable ECC interrupt */
  37
  38#ifndef CONFIG_NAND_ZYNQ_USE_BOOTLOADER1_TIMINGS
  39
  40/* Assuming 50MHz clock (20ns cycle time) and 3V operation */
  41#define ZYNQ_NAND_SET_CYCLES    ((0x2 << 20) |  /* t_rr from nand_cycles */ \
  42                                (0x2 << 17)  |  /* t_ar from nand_cycles */ \
  43                                (0x1 << 14)  |  /* t_clr from nand_cycles */ \
  44                                (0x3 << 11)  |  /* t_wp from nand_cycles */ \
  45                                (0x2 << 8)   |  /* t_rea from nand_cycles */ \
  46                                (0x5 << 4)   |  /* t_wc from nand_cycles */ \
  47                                (0x5 << 0))     /* t_rc from nand_cycles */
  48#endif
  49
  50
  51#define ZYNQ_NAND_DIRECT_CMD    ((0x4 << 23) |  /* Chip 0 from interface 1 */ \
  52                                (0x2 << 21))    /* UpdateRegs operation */
  53
  54#define ZYNQ_NAND_ECC_CONFIG    ((0x1 << 2)  |  /* ECC available on APB */ \
  55                                (0x1 << 4)   |  /* ECC read at end of page */ \
  56                                (0x0 << 5))     /* No Jumping */
  57
  58#define ZYNQ_NAND_ECC_CMD1      ((0x80)      |  /* Write command */ \
  59                                (0x00 << 8)  |  /* Read command */ \
  60                                (0x30 << 16) |  /* Read End command */ \
  61                                (0x1 << 24))    /* Read End command calid */
  62
  63#define ZYNQ_NAND_ECC_CMD2      ((0x85)      |  /* Write col change cmd */ \
  64                                (0x05 << 8)  |  /* Read col change cmd */ \
  65                                (0xE0 << 16) |  /* Read col change end cmd */ \
  66                                (0x1 << 24))    /* Read col change
  67                                                        end cmd valid */
  68/* AXI Address definitions */
  69#define START_CMD_SHIFT                 3
  70#define END_CMD_SHIFT                   11
  71#define END_CMD_VALID_SHIFT             20
  72#define ADDR_CYCLES_SHIFT               21
  73#define CLEAR_CS_SHIFT                  21
  74#define ECC_LAST_SHIFT                  10
  75#define COMMAND_PHASE                   (0 << 19)
  76#define DATA_PHASE                      (1 << 19)
  77#define ONDIE_ECC_FEATURE_ADDR          0x90
  78#define ONDIE_ECC_FEATURE_ENABLE        0x08
  79
  80#define ZYNQ_NAND_ECC_LAST      (1 << ECC_LAST_SHIFT)   /* Set ECC_Last */
  81#define ZYNQ_NAND_CLEAR_CS      (1 << CLEAR_CS_SHIFT)   /* Clear chip select */
  82
  83/* ECC block registers bit position and bit mask */
  84#define ZYNQ_NAND_ECC_BUSY      (1 << 6)        /* ECC block is busy */
  85#define ZYNQ_NAND_ECC_MASK      0x00FFFFFF      /* ECC value mask */
  86
  87#define ZYNQ_NAND_ROW_ADDR_CYCL_MASK    0x0F
  88#define ZYNQ_NAND_COL_ADDR_CYCL_MASK    0xF0
  89
  90#define ZYNQ_NAND_MIO_NUM_NAND_8BIT     13
  91#define ZYNQ_NAND_MIO_NUM_NAND_16BIT    8
  92
  93enum zynq_nand_bus_width {
  94        NAND_BW_UNKNOWN = -1,
  95        NAND_BW_8BIT,
  96        NAND_BW_16BIT,
  97};
  98
  99#ifndef NAND_CMD_LOCK_TIGHT
 100#define NAND_CMD_LOCK_TIGHT 0x2c
 101#endif
 102
 103#ifndef NAND_CMD_LOCK_STATUS
 104#define NAND_CMD_LOCK_STATUS 0x7a
 105#endif
 106
 107/* SMC register set */
 108struct zynq_nand_smc_regs {
 109        u32 csr;                /* 0x00 */
 110        u32 reserved0[2];
 111        u32 cfr;                /* 0x0C */
 112        u32 dcr;                /* 0x10 */
 113        u32 scr;                /* 0x14 */
 114        u32 sor;                /* 0x18 */
 115        u32 reserved1[249];
 116        u32 esr;                /* 0x400 */
 117        u32 emcr;               /* 0x404 */
 118        u32 emcmd1r;            /* 0x408 */
 119        u32 emcmd2r;            /* 0x40C */
 120        u32 reserved2[2];
 121        u32 eval0r;             /* 0x418 */
 122};
 123#define zynq_nand_smc_base      ((struct zynq_nand_smc_regs __iomem *)\
 124                                ZYNQ_SMC_BASEADDR)
 125
 126/*
 127 * struct zynq_nand_info - Defines the NAND flash driver instance
 128 * @parts:              Pointer to the mtd_partition structure
 129 * @nand_base:          Virtual address of the NAND flash device
 130 * @end_cmd_pending:    End command is pending
 131 * @end_cmd:            End command
 132 */
 133struct zynq_nand_info {
 134        void __iomem    *nand_base;
 135        u8              end_cmd_pending;
 136        u8              end_cmd;
 137};
 138
 139/*
 140 * struct zynq_nand_command_format - Defines NAND flash command format
 141 * @start_cmd:          First cycle command (Start command)
 142 * @end_cmd:            Second cycle command (Last command)
 143 * @addr_cycles:        Number of address cycles required to send the address
 144 * @end_cmd_valid:      The second cycle command is valid for cmd or data phase
 145 */
 146struct zynq_nand_command_format {
 147        u8 start_cmd;
 148        u8 end_cmd;
 149        u8 addr_cycles;
 150        u8 end_cmd_valid;
 151};
 152
 153/*  The NAND flash operations command format */
 154static const struct zynq_nand_command_format zynq_nand_commands[] = {
 155        {NAND_CMD_READ0, NAND_CMD_READSTART, 5, ZYNQ_NAND_CMD_PHASE},
 156        {NAND_CMD_RNDOUT, NAND_CMD_RNDOUTSTART, 2, ZYNQ_NAND_CMD_PHASE},
 157        {NAND_CMD_READID, NAND_CMD_NONE, 1, 0},
 158        {NAND_CMD_STATUS, NAND_CMD_NONE, 0, 0},
 159        {NAND_CMD_SEQIN, NAND_CMD_PAGEPROG, 5, ZYNQ_NAND_DATA_PHASE},
 160        {NAND_CMD_RNDIN, NAND_CMD_NONE, 2, 0},
 161        {NAND_CMD_ERASE1, NAND_CMD_ERASE2, 3, ZYNQ_NAND_CMD_PHASE},
 162        {NAND_CMD_RESET, NAND_CMD_NONE, 0, 0},
 163        {NAND_CMD_PARAM, NAND_CMD_NONE, 1, 0},
 164        {NAND_CMD_GET_FEATURES, NAND_CMD_NONE, 1, 0},
 165        {NAND_CMD_SET_FEATURES, NAND_CMD_NONE, 1, 0},
 166        {NAND_CMD_LOCK, NAND_CMD_NONE, 0, 0},
 167        {NAND_CMD_LOCK_TIGHT, NAND_CMD_NONE, 0, 0},
 168        {NAND_CMD_UNLOCK1, NAND_CMD_NONE, 3, 0},
 169        {NAND_CMD_UNLOCK2, NAND_CMD_NONE, 3, 0},
 170        {NAND_CMD_LOCK_STATUS, NAND_CMD_NONE, 3, 0},
 171        {NAND_CMD_NONE, NAND_CMD_NONE, 0, 0},
 172        /* Add all the flash commands supported by the flash device */
 173};
 174
 175/* Define default oob placement schemes for large and small page devices */
 176static struct nand_ecclayout nand_oob_16 = {
 177        .eccbytes = 3,
 178        .eccpos = {0, 1, 2},
 179        .oobfree = {
 180                { .offset = 8, .length = 8 }
 181        }
 182};
 183
 184static struct nand_ecclayout nand_oob_64 = {
 185        .eccbytes = 12,
 186        .eccpos = {
 187                   52, 53, 54, 55, 56, 57,
 188                   58, 59, 60, 61, 62, 63},
 189        .oobfree = {
 190                { .offset = 2, .length = 50 }
 191        }
 192};
 193
 194static struct nand_ecclayout ondie_nand_oob_64 = {
 195        .eccbytes = 32,
 196
 197        .eccpos = {
 198                8, 9, 10, 11, 12, 13, 14, 15,
 199                24, 25, 26, 27, 28, 29, 30, 31,
 200                40, 41, 42, 43, 44, 45, 46, 47,
 201                56, 57, 58, 59, 60, 61, 62, 63
 202        },
 203
 204        .oobfree = {
 205                { .offset = 4, .length = 4 },
 206                { .offset = 20, .length = 4 },
 207                { .offset = 36, .length = 4 },
 208                { .offset = 52, .length = 4 }
 209        }
 210};
 211
 212/* bbt decriptors for chips with on-die ECC and
 213   chips with 64-byte OOB */
 214static u8 bbt_pattern[] = {'B', 'b', 't', '0' };
 215static u8 mirror_pattern[] = {'1', 't', 'b', 'B' };
 216
 217static struct nand_bbt_descr bbt_main_descr = {
 218        .options = NAND_BBT_LASTBLOCK | NAND_BBT_CREATE | NAND_BBT_WRITE |
 219                NAND_BBT_2BIT | NAND_BBT_VERSION | NAND_BBT_PERCHIP,
 220        .offs = 4,
 221        .len = 4,
 222        .veroffs = 20,
 223        .maxblocks = 4,
 224        .pattern = bbt_pattern
 225};
 226
 227static struct nand_bbt_descr bbt_mirror_descr = {
 228        .options = NAND_BBT_LASTBLOCK | NAND_BBT_CREATE | NAND_BBT_WRITE |
 229                NAND_BBT_2BIT | NAND_BBT_VERSION | NAND_BBT_PERCHIP,
 230        .offs = 4,
 231        .len = 4,
 232        .veroffs = 20,
 233        .maxblocks = 4,
 234        .pattern = mirror_pattern
 235};
 236
 237/*
 238 * zynq_nand_waitfor_ecc_completion - Wait for ECC completion
 239 *
 240 * returns: status for command completion, -1 for Timeout
 241 */
 242static int zynq_nand_waitfor_ecc_completion(void)
 243{
 244        unsigned long timeout;
 245        u32 status;
 246
 247        /* Wait max 10us */
 248        timeout = 10;
 249        status = readl(&zynq_nand_smc_base->esr);
 250        while (status & ZYNQ_NAND_ECC_BUSY) {
 251                status = readl(&zynq_nand_smc_base->esr);
 252                if (timeout == 0)
 253                        return -1;
 254                timeout--;
 255                udelay(1);
 256        }
 257
 258        return status;
 259}
 260
 261/*
 262 * zynq_nand_init_nand_flash - Initialize NAND controller
 263 * @option:     Device property flags
 264 *
 265 * This function initializes the NAND flash interface on the NAND controller.
 266 *
 267 * returns:     0 on success or error value on failure
 268 */
 269static int zynq_nand_init_nand_flash(int option)
 270{
 271        u32 status;
 272
 273        /* disable interrupts */
 274        writel(ZYNQ_NAND_CLR_CONFIG, &zynq_nand_smc_base->cfr);
 275#ifndef CONFIG_NAND_ZYNQ_USE_BOOTLOADER1_TIMINGS
 276        /* Initialize the NAND interface by setting cycles and operation mode */
 277        writel(ZYNQ_NAND_SET_CYCLES, &zynq_nand_smc_base->scr);
 278#endif
 279        if (option & NAND_BUSWIDTH_16)
 280                writel(ZYNQ_NAND_SET_OPMODE_16BIT, &zynq_nand_smc_base->sor);
 281        else
 282                writel(ZYNQ_NAND_SET_OPMODE_8BIT, &zynq_nand_smc_base->sor);
 283
 284        writel(ZYNQ_NAND_DIRECT_CMD, &zynq_nand_smc_base->dcr);
 285
 286        /* Wait till the ECC operation is complete */
 287        status = zynq_nand_waitfor_ecc_completion();
 288        if (status < 0) {
 289                printf("%s: Timeout\n", __func__);
 290                return status;
 291        }
 292
 293        /* Set the command1 and command2 register */
 294        writel(ZYNQ_NAND_ECC_CMD1, &zynq_nand_smc_base->emcmd1r);
 295        writel(ZYNQ_NAND_ECC_CMD2, &zynq_nand_smc_base->emcmd2r);
 296
 297        return 0;
 298}
 299
 300/*
 301 * zynq_nand_calculate_hwecc - Calculate Hardware ECC
 302 * @mtd:        Pointer to the mtd_info structure
 303 * @data:       Pointer to the page data
 304 * @ecc_code:   Pointer to the ECC buffer where ECC data needs to be stored
 305 *
 306 * This function retrieves the Hardware ECC data from the controller and returns
 307 * ECC data back to the MTD subsystem.
 308 *
 309 * returns:     0 on success or error value on failure
 310 */
 311static int zynq_nand_calculate_hwecc(struct mtd_info *mtd, const u8 *data,
 312                u8 *ecc_code)
 313{
 314        u32 ecc_value = 0;
 315        u8 ecc_reg, ecc_byte;
 316        u32 ecc_status;
 317
 318        /* Wait till the ECC operation is complete */
 319        ecc_status = zynq_nand_waitfor_ecc_completion();
 320        if (ecc_status < 0) {
 321                printf("%s: Timeout\n", __func__);
 322                return ecc_status;
 323        }
 324
 325        for (ecc_reg = 0; ecc_reg < 4; ecc_reg++) {
 326                /* Read ECC value for each block */
 327                ecc_value = readl(&zynq_nand_smc_base->eval0r + ecc_reg);
 328
 329                /* Get the ecc status from ecc read value */
 330                ecc_status = (ecc_value >> 24) & 0xFF;
 331
 332                /* ECC value valid */
 333                if (ecc_status & ZYNQ_NAND_ECC_STATUS) {
 334                        for (ecc_byte = 0; ecc_byte < 3; ecc_byte++) {
 335                                /* Copy ECC bytes to MTD buffer */
 336                                *ecc_code = ecc_value & 0xFF;
 337                                ecc_value = ecc_value >> 8;
 338                                ecc_code++;
 339                        }
 340                } else {
 341                        debug("%s: ecc status failed\n", __func__);
 342                }
 343        }
 344
 345        return 0;
 346}
 347
 348/*
 349 * onehot - onehot function
 350 * @value:      value to check for onehot
 351 *
 352 * This function checks whether a value is onehot or not.
 353 * onehot is if and only if one bit is set.
 354 *
 355 * FIXME: Try to move this in common.h
 356 */
 357static bool onehot(unsigned short value)
 358{
 359        bool onehot;
 360
 361        onehot = value && !(value & (value - 1));
 362        return onehot;
 363}
 364
 365/*
 366 * zynq_nand_correct_data - ECC correction function
 367 * @mtd:        Pointer to the mtd_info structure
 368 * @buf:        Pointer to the page data
 369 * @read_ecc:   Pointer to the ECC value read from spare data area
 370 * @calc_ecc:   Pointer to the calculated ECC value
 371 *
 372 * This function corrects the ECC single bit errors & detects 2-bit errors.
 373 *
 374 * returns:     0 if no ECC errors found
 375 *              1 if single bit error found and corrected.
 376 *              -1 if multiple ECC errors found.
 377 */
 378static int zynq_nand_correct_data(struct mtd_info *mtd, unsigned char *buf,
 379                        unsigned char *read_ecc, unsigned char *calc_ecc)
 380{
 381        unsigned char bit_addr;
 382        unsigned int byte_addr;
 383        unsigned short ecc_odd, ecc_even;
 384        unsigned short read_ecc_lower, read_ecc_upper;
 385        unsigned short calc_ecc_lower, calc_ecc_upper;
 386
 387        read_ecc_lower = (read_ecc[0] | (read_ecc[1] << 8)) & 0xfff;
 388        read_ecc_upper = ((read_ecc[1] >> 4) | (read_ecc[2] << 4)) & 0xfff;
 389
 390        calc_ecc_lower = (calc_ecc[0] | (calc_ecc[1] << 8)) & 0xfff;
 391        calc_ecc_upper = ((calc_ecc[1] >> 4) | (calc_ecc[2] << 4)) & 0xfff;
 392
 393        ecc_odd = read_ecc_lower ^ calc_ecc_lower;
 394        ecc_even = read_ecc_upper ^ calc_ecc_upper;
 395
 396        if ((ecc_odd == 0) && (ecc_even == 0))
 397                return 0;       /* no error */
 398
 399        if (ecc_odd == (~ecc_even & 0xfff)) {
 400                /* bits [11:3] of error code is byte offset */
 401                byte_addr = (ecc_odd >> 3) & 0x1ff;
 402                /* bits [2:0] of error code is bit offset */
 403                bit_addr = ecc_odd & 0x7;
 404                /* Toggling error bit */
 405                buf[byte_addr] ^= (1 << bit_addr);
 406                return 1;
 407        }
 408
 409        if (onehot(ecc_odd | ecc_even))
 410                return 1; /* one error in parity */
 411
 412        return -1; /* Uncorrectable error */
 413}
 414
 415/*
 416 * zynq_nand_read_oob - [REPLACABLE] the most common OOB data read function
 417 * @mtd:        mtd info structure
 418 * @chip:       nand chip info structure
 419 * @page:       page number to read
 420 * @sndcmd:     flag whether to issue read command or not
 421 */
 422static int zynq_nand_read_oob(struct mtd_info *mtd, struct nand_chip *chip,
 423                        int page)
 424{
 425        unsigned long data_phase_addr = 0;
 426        int data_width = 4;
 427        u8 *p;
 428
 429        chip->cmdfunc(mtd, NAND_CMD_READOOB, 0, page);
 430
 431        p = chip->oob_poi;
 432        chip->read_buf(mtd, p, (mtd->oobsize - data_width));
 433        p += mtd->oobsize - data_width;
 434
 435        data_phase_addr = (unsigned long)chip->IO_ADDR_R;
 436        data_phase_addr |= ZYNQ_NAND_CLEAR_CS;
 437        chip->IO_ADDR_R = (void __iomem *)data_phase_addr;
 438        chip->read_buf(mtd, p, data_width);
 439
 440        return 0;
 441}
 442
 443/*
 444 * zynq_nand_write_oob - [REPLACABLE] the most common OOB data write function
 445 * @mtd:        mtd info structure
 446 * @chip:       nand chip info structure
 447 * @page:       page number to write
 448 */
 449static int zynq_nand_write_oob(struct mtd_info *mtd, struct nand_chip *chip,
 450                             int page)
 451{
 452        int status = 0, data_width = 4;
 453        const u8 *buf = chip->oob_poi;
 454        unsigned long data_phase_addr = 0;
 455
 456        chip->cmdfunc(mtd, NAND_CMD_SEQIN, mtd->writesize, page);
 457
 458        chip->write_buf(mtd, buf, (mtd->oobsize - data_width));
 459        buf += mtd->oobsize - data_width;
 460
 461        data_phase_addr = (unsigned long)chip->IO_ADDR_W;
 462        data_phase_addr |= ZYNQ_NAND_CLEAR_CS;
 463        data_phase_addr |= (1 << END_CMD_VALID_SHIFT);
 464        chip->IO_ADDR_W = (void __iomem *)data_phase_addr;
 465        chip->write_buf(mtd, buf, data_width);
 466
 467        /* Send command to program the OOB data */
 468        chip->cmdfunc(mtd, NAND_CMD_PAGEPROG, -1, -1);
 469        status = chip->waitfunc(mtd, chip);
 470
 471        return status & NAND_STATUS_FAIL ? -EIO : 0;
 472}
 473
 474/*
 475 * zynq_nand_read_page_raw - [Intern] read raw page data without ecc
 476 * @mtd:        mtd info structure
 477 * @chip:       nand chip info structure
 478 * @buf:        buffer to store read data
 479 * @oob_required: must write chip->oob_poi to OOB
 480 * @page:       page number to read
 481 */
 482static int zynq_nand_read_page_raw(struct mtd_info *mtd, struct nand_chip *chip,
 483                                   u8 *buf,  int oob_required, int page)
 484{
 485        unsigned long data_width = 4;
 486        unsigned long data_phase_addr = 0;
 487        u8 *p;
 488
 489        chip->read_buf(mtd, buf, mtd->writesize);
 490
 491        p = chip->oob_poi;
 492        chip->read_buf(mtd, p, (mtd->oobsize - data_width));
 493        p += (mtd->oobsize - data_width);
 494
 495        data_phase_addr = (unsigned long)chip->IO_ADDR_R;
 496        data_phase_addr |= ZYNQ_NAND_CLEAR_CS;
 497        chip->IO_ADDR_R = (void __iomem *)data_phase_addr;
 498
 499        chip->read_buf(mtd, p, data_width);
 500        return 0;
 501}
 502
 503static int zynq_nand_read_page_raw_nooob(struct mtd_info *mtd,
 504                struct nand_chip *chip, u8 *buf, int oob_required, int page)
 505{
 506        chip->read_buf(mtd, buf, mtd->writesize);
 507        return 0;
 508}
 509
 510static int zynq_nand_read_subpage_raw(struct mtd_info *mtd,
 511                                    struct nand_chip *chip, u32 data_offs,
 512                                    u32 readlen, u8 *buf, int page)
 513{
 514        if (data_offs != 0) {
 515                chip->cmdfunc(mtd, NAND_CMD_RNDOUT, data_offs, -1);
 516                buf += data_offs;
 517        }
 518        chip->read_buf(mtd, buf, readlen);
 519
 520        return 0;
 521}
 522
 523/*
 524 * zynq_nand_write_page_raw - [Intern] raw page write function
 525 * @mtd:        mtd info structure
 526 * @chip:       nand chip info structure
 527 * @buf:        data buffer
 528 * @oob_required: must write chip->oob_poi to OOB
 529 */
 530static int zynq_nand_write_page_raw(struct mtd_info *mtd,
 531        struct nand_chip *chip, const u8 *buf, int oob_required, int page)
 532{
 533        unsigned long data_width = 4;
 534        unsigned long data_phase_addr = 0;
 535        u8 *p;
 536
 537        chip->write_buf(mtd, buf, mtd->writesize);
 538
 539        p = chip->oob_poi;
 540        chip->write_buf(mtd, p, (mtd->oobsize - data_width));
 541        p += (mtd->oobsize - data_width);
 542
 543        data_phase_addr = (unsigned long)chip->IO_ADDR_W;
 544        data_phase_addr |= ZYNQ_NAND_CLEAR_CS;
 545        data_phase_addr |= (1 << END_CMD_VALID_SHIFT);
 546        chip->IO_ADDR_W = (void __iomem *)data_phase_addr;
 547
 548        chip->write_buf(mtd, p, data_width);
 549
 550        return 0;
 551}
 552
 553/*
 554 * nand_write_page_hwecc - Hardware ECC based page write function
 555 * @mtd:        Pointer to the mtd info structure
 556 * @chip:       Pointer to the NAND chip info structure
 557 * @buf:        Pointer to the data buffer
 558 * @oob_required: must write chip->oob_poi to OOB
 559 *
 560 * This functions writes data and hardware generated ECC values in to the page.
 561 */
 562static int zynq_nand_write_page_hwecc(struct mtd_info *mtd,
 563        struct nand_chip *chip, const u8 *buf, int oob_required, int page)
 564{
 565        int i, eccsteps, eccsize = chip->ecc.size;
 566        u8 *ecc_calc = chip->buffers->ecccalc;
 567        const u8 *p = buf;
 568        u32 *eccpos = chip->ecc.layout->eccpos;
 569        unsigned long data_phase_addr = 0;
 570        unsigned long data_width = 4;
 571        u8 *oob_ptr;
 572
 573        for (eccsteps = chip->ecc.steps; (eccsteps - 1); eccsteps--) {
 574                chip->write_buf(mtd, p, eccsize);
 575                p += eccsize;
 576        }
 577        chip->write_buf(mtd, p, (eccsize - data_width));
 578        p += eccsize - data_width;
 579
 580        /* Set ECC Last bit to 1 */
 581        data_phase_addr = (unsigned long) chip->IO_ADDR_W;
 582        data_phase_addr |= ZYNQ_NAND_ECC_LAST;
 583        chip->IO_ADDR_W = (void __iomem *)data_phase_addr;
 584        chip->write_buf(mtd, p, data_width);
 585
 586        /* Wait for ECC to be calculated and read the error values */
 587        p = buf;
 588        chip->ecc.calculate(mtd, p, &ecc_calc[0]);
 589
 590        for (i = 0; i < chip->ecc.total; i++)
 591                chip->oob_poi[eccpos[i]] = ~(ecc_calc[i]);
 592
 593        /* Clear ECC last bit */
 594        data_phase_addr = (unsigned long)chip->IO_ADDR_W;
 595        data_phase_addr &= ~ZYNQ_NAND_ECC_LAST;
 596        chip->IO_ADDR_W = (void __iomem *)data_phase_addr;
 597
 598        /* Write the spare area with ECC bytes */
 599        oob_ptr = chip->oob_poi;
 600        chip->write_buf(mtd, oob_ptr, (mtd->oobsize - data_width));
 601
 602        data_phase_addr = (unsigned long)chip->IO_ADDR_W;
 603        data_phase_addr |= ZYNQ_NAND_CLEAR_CS;
 604        data_phase_addr |= (1 << END_CMD_VALID_SHIFT);
 605        chip->IO_ADDR_W = (void __iomem *)data_phase_addr;
 606        oob_ptr += (mtd->oobsize - data_width);
 607        chip->write_buf(mtd, oob_ptr, data_width);
 608
 609        return 0;
 610}
 611
 612/*
 613 * zynq_nand_write_page_swecc - [REPLACABLE] software ecc based page
 614 * write function
 615 * @mtd:        mtd info structure
 616 * @chip:       nand chip info structure
 617 * @buf:        data buffer
 618 * @oob_required: must write chip->oob_poi to OOB
 619 */
 620static int zynq_nand_write_page_swecc(struct mtd_info *mtd,
 621        struct nand_chip *chip, const u8 *buf, int oob_required, int page)
 622{
 623        int i, eccsize = chip->ecc.size;
 624        int eccbytes = chip->ecc.bytes;
 625        int eccsteps = chip->ecc.steps;
 626        u8 *ecc_calc = chip->buffers->ecccalc;
 627        const u8 *p = buf;
 628        u32 *eccpos = chip->ecc.layout->eccpos;
 629
 630        /* Software ecc calculation */
 631        for (i = 0; eccsteps; eccsteps--, i += eccbytes, p += eccsize)
 632                chip->ecc.calculate(mtd, p, &ecc_calc[i]);
 633
 634        for (i = 0; i < chip->ecc.total; i++)
 635                chip->oob_poi[eccpos[i]] = ecc_calc[i];
 636
 637        return chip->ecc.write_page_raw(mtd, chip, buf, 1, page);
 638}
 639
 640/*
 641 * nand_read_page_hwecc - Hardware ECC based page read function
 642 * @mtd:        Pointer to the mtd info structure
 643 * @chip:       Pointer to the NAND chip info structure
 644 * @buf:        Pointer to the buffer to store read data
 645 * @oob_required: must write chip->oob_poi to OOB
 646 * @page:       page number to read
 647 *
 648 * This functions reads data and checks the data integrity by comparing hardware
 649 * generated ECC values and read ECC values from spare area.
 650 *
 651 * returns:     0 always and updates ECC operation status in to MTD structure
 652 */
 653static int zynq_nand_read_page_hwecc(struct mtd_info *mtd,
 654        struct nand_chip *chip, u8 *buf, int oob_required, int page)
 655{
 656        int i, stat, eccsteps, eccsize = chip->ecc.size;
 657        int eccbytes = chip->ecc.bytes;
 658        u8 *p = buf;
 659        u8 *ecc_calc = chip->buffers->ecccalc;
 660        u8 *ecc_code = chip->buffers->ecccode;
 661        u32 *eccpos = chip->ecc.layout->eccpos;
 662        unsigned long data_phase_addr = 0;
 663        unsigned long data_width = 4;
 664        u8 *oob_ptr;
 665
 666        for (eccsteps = chip->ecc.steps; (eccsteps - 1); eccsteps--) {
 667                chip->read_buf(mtd, p, eccsize);
 668                p += eccsize;
 669        }
 670        chip->read_buf(mtd, p, (eccsize - data_width));
 671        p += eccsize - data_width;
 672
 673        /* Set ECC Last bit to 1 */
 674        data_phase_addr = (unsigned long)chip->IO_ADDR_R;
 675        data_phase_addr |= ZYNQ_NAND_ECC_LAST;
 676        chip->IO_ADDR_R = (void __iomem *)data_phase_addr;
 677        chip->read_buf(mtd, p, data_width);
 678
 679        /* Read the calculated ECC value */
 680        p = buf;
 681        chip->ecc.calculate(mtd, p, &ecc_calc[0]);
 682
 683        /* Clear ECC last bit */
 684        data_phase_addr = (unsigned long)chip->IO_ADDR_R;
 685        data_phase_addr &= ~ZYNQ_NAND_ECC_LAST;
 686        chip->IO_ADDR_R = (void __iomem *)data_phase_addr;
 687
 688        /* Read the stored ECC value */
 689        oob_ptr = chip->oob_poi;
 690        chip->read_buf(mtd, oob_ptr, (mtd->oobsize - data_width));
 691
 692        /* de-assert chip select */
 693        data_phase_addr = (unsigned long)chip->IO_ADDR_R;
 694        data_phase_addr |= ZYNQ_NAND_CLEAR_CS;
 695        chip->IO_ADDR_R = (void __iomem *)data_phase_addr;
 696
 697        oob_ptr += (mtd->oobsize - data_width);
 698        chip->read_buf(mtd, oob_ptr, data_width);
 699
 700        for (i = 0; i < chip->ecc.total; i++)
 701                ecc_code[i] = ~(chip->oob_poi[eccpos[i]]);
 702
 703        eccsteps = chip->ecc.steps;
 704        p = buf;
 705
 706        /* Check ECC error for all blocks and correct if it is correctable */
 707        for (i = 0; eccsteps; eccsteps--, i += eccbytes, p += eccsize) {
 708                stat = chip->ecc.correct(mtd, p, &ecc_code[i], &ecc_calc[i]);
 709                if (stat < 0)
 710                        mtd->ecc_stats.failed++;
 711                else
 712                        mtd->ecc_stats.corrected += stat;
 713        }
 714        return 0;
 715}
 716
 717/*
 718 * zynq_nand_read_page_swecc - [REPLACABLE] software ecc based page
 719 * read function
 720 * @mtd:        mtd info structure
 721 * @chip:       nand chip info structure
 722 * @buf:        buffer to store read data
 723 * @page:       page number to read
 724 */
 725static int zynq_nand_read_page_swecc(struct mtd_info *mtd,
 726        struct nand_chip *chip, u8 *buf, int oob_required,  int page)
 727{
 728        int i, eccsize = chip->ecc.size;
 729        int eccbytes = chip->ecc.bytes;
 730        int eccsteps = chip->ecc.steps;
 731        u8 *p = buf;
 732        u8 *ecc_calc = chip->buffers->ecccalc;
 733        u8 *ecc_code = chip->buffers->ecccode;
 734        u32 *eccpos = chip->ecc.layout->eccpos;
 735
 736        chip->ecc.read_page_raw(mtd, chip, buf, 1, page);
 737
 738        for (i = 0; eccsteps; eccsteps--, i += eccbytes, p += eccsize)
 739                chip->ecc.calculate(mtd, p, &ecc_calc[i]);
 740
 741        for (i = 0; i < chip->ecc.total; i++)
 742                ecc_code[i] = chip->oob_poi[eccpos[i]];
 743
 744        eccsteps = chip->ecc.steps;
 745        p = buf;
 746
 747        for (i = 0; eccsteps; eccsteps--, i += eccbytes, p += eccsize) {
 748                int stat;
 749
 750                stat = chip->ecc.correct(mtd, p, &ecc_code[i], &ecc_calc[i]);
 751                if (stat < 0)
 752                        mtd->ecc_stats.failed++;
 753                else
 754                        mtd->ecc_stats.corrected += stat;
 755        }
 756        return 0;
 757}
 758
 759/*
 760 * zynq_nand_select_chip - Select the flash device
 761 * @mtd:        Pointer to the mtd_info structure
 762 * @chip:       Chip number to be selected
 763 *
 764 * This function is empty as the NAND controller handles chip select line
 765 * internally based on the chip address passed in command and data phase.
 766 */
 767static void zynq_nand_select_chip(struct mtd_info *mtd, int chip)
 768{
 769        /* Not support multiple chips yet */
 770}
 771
 772/*
 773 * zynq_nand_cmd_function - Send command to NAND device
 774 * @mtd:        Pointer to the mtd_info structure
 775 * @command:    The command to be sent to the flash device
 776 * @column:     The column address for this command, -1 if none
 777 * @page_addr:  The page address for this command, -1 if none
 778 */
 779static void zynq_nand_cmd_function(struct mtd_info *mtd, unsigned int command,
 780                                 int column, int page_addr)
 781{
 782        struct nand_chip *chip = mtd->priv;
 783        const struct zynq_nand_command_format *curr_cmd = NULL;
 784        u8 addr_cycles = 0;
 785        struct zynq_nand_info *xnand = (struct zynq_nand_info *)chip->priv;
 786        void *cmd_addr;
 787        unsigned long cmd_data = 0;
 788        unsigned long cmd_phase_addr = 0;
 789        unsigned long data_phase_addr = 0;
 790        u8 end_cmd = 0;
 791        u8 end_cmd_valid = 0;
 792        u32 index;
 793
 794        if (xnand->end_cmd_pending) {
 795                /* Check for end command if this command request is same as the
 796                 * pending command then return
 797                 */
 798                if (xnand->end_cmd == command) {
 799                        xnand->end_cmd = 0;
 800                        xnand->end_cmd_pending = 0;
 801                        return;
 802                }
 803        }
 804
 805        /* Emulate NAND_CMD_READOOB for large page device */
 806        if ((mtd->writesize > ZYNQ_NAND_ECC_SIZE) &&
 807            (command == NAND_CMD_READOOB)) {
 808                column += mtd->writesize;
 809                command = NAND_CMD_READ0;
 810        }
 811
 812        /* Get the command format */
 813        for (index = 0; index < ARRAY_SIZE(zynq_nand_commands); index++)
 814                if (command == zynq_nand_commands[index].start_cmd)
 815                        break;
 816
 817        if (index == ARRAY_SIZE(zynq_nand_commands)) {
 818                printf("%s: Unsupported start cmd %02x\n", __func__, command);
 819                return;
 820        }
 821        curr_cmd = &zynq_nand_commands[index];
 822
 823        /* Clear interrupt */
 824        writel(ZYNQ_MEMC_CLRCR_INT_CLR1, &zynq_nand_smc_base->cfr);
 825
 826        /* Get the command phase address */
 827        if (curr_cmd->end_cmd_valid == ZYNQ_NAND_CMD_PHASE)
 828                end_cmd_valid = 1;
 829
 830        if (curr_cmd->end_cmd == NAND_CMD_NONE)
 831                end_cmd = 0x0;
 832        else
 833                end_cmd = curr_cmd->end_cmd;
 834
 835        if (command == NAND_CMD_READ0 ||
 836            command == NAND_CMD_SEQIN) {
 837                addr_cycles = chip->onfi_params.addr_cycles &
 838                                ZYNQ_NAND_ROW_ADDR_CYCL_MASK;
 839                addr_cycles += ((chip->onfi_params.addr_cycles &
 840                                ZYNQ_NAND_COL_ADDR_CYCL_MASK) >> 4);
 841        } else {
 842                addr_cycles = curr_cmd->addr_cycles;
 843        }
 844
 845        cmd_phase_addr = (unsigned long)xnand->nand_base        |
 846                        (addr_cycles << ADDR_CYCLES_SHIFT)      |
 847                        (end_cmd_valid << END_CMD_VALID_SHIFT)          |
 848                        (COMMAND_PHASE)                                 |
 849                        (end_cmd << END_CMD_SHIFT)                      |
 850                        (curr_cmd->start_cmd << START_CMD_SHIFT);
 851
 852        cmd_addr = (void __iomem *)cmd_phase_addr;
 853
 854        /* Get the data phase address */
 855        end_cmd_valid = 0;
 856
 857        data_phase_addr = (unsigned long)xnand->nand_base       |
 858                        (0x0 << CLEAR_CS_SHIFT)                         |
 859                        (end_cmd_valid << END_CMD_VALID_SHIFT)          |
 860                        (DATA_PHASE)                                    |
 861                        (end_cmd << END_CMD_SHIFT)                      |
 862                        (0x0 << ECC_LAST_SHIFT);
 863
 864        chip->IO_ADDR_R = (void  __iomem *)data_phase_addr;
 865        chip->IO_ADDR_W = chip->IO_ADDR_R;
 866
 867        /* Command phase AXI Read & Write */
 868        if (column != -1 && page_addr != -1) {
 869                /* Adjust columns for 16 bit bus width */
 870                if (chip->options & NAND_BUSWIDTH_16)
 871                        column >>= 1;
 872                cmd_data = column;
 873                if (mtd->writesize > ZYNQ_NAND_ECC_SIZE) {
 874                        cmd_data |= page_addr << 16;
 875                        /* Another address cycle for devices > 128MiB */
 876                        if (chip->chipsize > (128 << 20)) {
 877                                writel(cmd_data, cmd_addr);
 878                                cmd_data = (page_addr >> 16);
 879                        }
 880                } else {
 881                        cmd_data |= page_addr << 8;
 882                }
 883        } else if (page_addr != -1)  { /* Erase */
 884                cmd_data = page_addr;
 885        } else if (column != -1) { /* Change read/write column, read id etc */
 886                /* Adjust columns for 16 bit bus width */
 887                if ((chip->options & NAND_BUSWIDTH_16) &&
 888                    ((command == NAND_CMD_READ0) ||
 889                     (command == NAND_CMD_SEQIN) ||
 890                     (command == NAND_CMD_RNDOUT) ||
 891                     (command == NAND_CMD_RNDIN)))
 892                        column >>= 1;
 893                cmd_data = column;
 894        }
 895
 896        writel(cmd_data, cmd_addr);
 897
 898        if (curr_cmd->end_cmd_valid) {
 899                xnand->end_cmd = curr_cmd->end_cmd;
 900                xnand->end_cmd_pending = 1;
 901        }
 902
 903        ndelay(100);
 904
 905        if ((command == NAND_CMD_READ0) ||
 906            (command == NAND_CMD_RESET) ||
 907            (command == NAND_CMD_PARAM) ||
 908            (command == NAND_CMD_GET_FEATURES))
 909                /* wait until command is processed */
 910                nand_wait_ready(mtd);
 911}
 912
 913/*
 914 * zynq_nand_read_buf - read chip data into buffer
 915 * @mtd:        MTD device structure
 916 * @buf:        buffer to store date
 917 * @len:        number of bytes to read
 918 */
 919static void zynq_nand_read_buf(struct mtd_info *mtd, u8 *buf, int len)
 920{
 921        struct nand_chip *chip = mtd->priv;
 922
 923        /* Make sure that buf is 32 bit aligned */
 924        if (((unsigned long)buf & 0x3) != 0) {
 925                if (((unsigned long)buf & 0x1) != 0) {
 926                        if (len) {
 927                                *buf = readb(chip->IO_ADDR_R);
 928                                buf += 1;
 929                                len--;
 930                        }
 931                }
 932
 933                if (((unsigned long)buf & 0x3) != 0) {
 934                        if (len >= 2) {
 935                                *(u16 *)buf = readw(chip->IO_ADDR_R);
 936                                buf += 2;
 937                                len -= 2;
 938                        }
 939                }
 940        }
 941
 942        /* copy aligned data */
 943        while (len >= 4) {
 944                *(u32 *)buf = readl(chip->IO_ADDR_R);
 945                buf += 4;
 946                len -= 4;
 947        }
 948
 949        /* mop up any remaining bytes */
 950        if (len) {
 951                if (len >= 2) {
 952                        *(u16 *)buf = readw(chip->IO_ADDR_R);
 953                        buf += 2;
 954                        len -= 2;
 955                }
 956                if (len)
 957                        *buf = readb(chip->IO_ADDR_R);
 958        }
 959}
 960
 961/*
 962 * zynq_nand_write_buf - write buffer to chip
 963 * @mtd:        MTD device structure
 964 * @buf:        data buffer
 965 * @len:        number of bytes to write
 966 */
 967static void zynq_nand_write_buf(struct mtd_info *mtd, const u8 *buf, int len)
 968{
 969        struct nand_chip *chip = mtd->priv;
 970        const u32 *nand = chip->IO_ADDR_W;
 971
 972        /* Make sure that buf is 32 bit aligned */
 973        if (((unsigned long)buf & 0x3) != 0) {
 974                if (((unsigned long)buf & 0x1) != 0) {
 975                        if (len) {
 976                                writeb(*buf, nand);
 977                                buf += 1;
 978                                len--;
 979                        }
 980                }
 981
 982                if (((unsigned long)buf & 0x3) != 0) {
 983                        if (len >= 2) {
 984                                writew(*(u16 *)buf, nand);
 985                                buf += 2;
 986                                len -= 2;
 987                        }
 988                }
 989        }
 990
 991        /* copy aligned data */
 992        while (len >= 4) {
 993                writel(*(u32 *)buf, nand);
 994                buf += 4;
 995                len -= 4;
 996        }
 997
 998        /* mop up any remaining bytes */
 999        if (len) {
1000                if (len >= 2) {
1001                        writew(*(u16 *)buf, nand);
1002                        buf += 2;
1003                        len -= 2;
1004                }
1005
1006                if (len)
1007                        writeb(*buf, nand);
1008        }
1009}
1010
1011/*
1012 * zynq_nand_device_ready - Check device ready/busy line
1013 * @mtd:        Pointer to the mtd_info structure
1014 *
1015 * returns:     0 on busy or 1 on ready state
1016 */
1017static int zynq_nand_device_ready(struct mtd_info *mtd)
1018{
1019        u32 csr_val;
1020
1021        csr_val = readl(&zynq_nand_smc_base->csr);
1022        /* Check the raw_int_status1 bit */
1023        if (csr_val & ZYNQ_MEMC_SR_RAW_INT_ST1) {
1024                /* Clear the interrupt condition */
1025                writel(ZYNQ_MEMC_SR_INT_ST1, &zynq_nand_smc_base->cfr);
1026                return 1;
1027        }
1028
1029        return 0;
1030}
1031
1032static int zynq_nand_check_is_16bit_bw_flash(void)
1033{
1034        int is_16bit_bw = NAND_BW_UNKNOWN;
1035        int mio_num_8bit = 0, mio_num_16bit = 0;
1036
1037        mio_num_8bit = zynq_slcr_get_mio_pin_status("nand8");
1038        if (mio_num_8bit == ZYNQ_NAND_MIO_NUM_NAND_8BIT)
1039                is_16bit_bw = NAND_BW_8BIT;
1040
1041        mio_num_16bit = zynq_slcr_get_mio_pin_status("nand16");
1042        if (mio_num_8bit == ZYNQ_NAND_MIO_NUM_NAND_8BIT &&
1043            mio_num_16bit == ZYNQ_NAND_MIO_NUM_NAND_16BIT)
1044                is_16bit_bw = NAND_BW_16BIT;
1045
1046        return is_16bit_bw;
1047}
1048
1049static int zynq_nand_init(struct nand_chip *nand_chip, int devnum)
1050{
1051        struct zynq_nand_info *xnand;
1052        struct mtd_info *mtd;
1053        unsigned long ecc_page_size;
1054        u8 maf_id, dev_id, i;
1055        u8 get_feature[4];
1056        u8 set_feature[4] = {ONDIE_ECC_FEATURE_ENABLE, 0x00, 0x00, 0x00};
1057        unsigned long ecc_cfg;
1058        int ondie_ecc_enabled = 0;
1059        int err = -1;
1060        int is_16bit_bw;
1061
1062        xnand = calloc(1, sizeof(struct zynq_nand_info));
1063        if (!xnand) {
1064                printf("%s: failed to allocate\n", __func__);
1065                goto fail;
1066        }
1067
1068        xnand->nand_base = (void __iomem *)ZYNQ_NAND_BASEADDR;
1069        mtd = nand_to_mtd(nand_chip);
1070
1071        nand_chip->priv = xnand;
1072        mtd->priv = nand_chip;
1073
1074        /* Set address of NAND IO lines */
1075        nand_chip->IO_ADDR_R = xnand->nand_base;
1076        nand_chip->IO_ADDR_W = xnand->nand_base;
1077
1078        /* Set the driver entry points for MTD */
1079        nand_chip->cmdfunc = zynq_nand_cmd_function;
1080        nand_chip->dev_ready = zynq_nand_device_ready;
1081        nand_chip->select_chip = zynq_nand_select_chip;
1082
1083        /* If we don't set this delay driver sets 20us by default */
1084        nand_chip->chip_delay = 30;
1085
1086        /* Buffer read/write routines */
1087        nand_chip->read_buf = zynq_nand_read_buf;
1088        nand_chip->write_buf = zynq_nand_write_buf;
1089
1090        is_16bit_bw = zynq_nand_check_is_16bit_bw_flash();
1091        if (is_16bit_bw == NAND_BW_UNKNOWN) {
1092                printf("%s: Unable detect NAND based on MIO settings\n",
1093                       __func__);
1094                goto fail;
1095        }
1096
1097        if (is_16bit_bw == NAND_BW_16BIT)
1098                nand_chip->options = NAND_BUSWIDTH_16;
1099
1100        nand_chip->bbt_options = NAND_BBT_USE_FLASH;
1101
1102        /* Initialize the NAND flash interface on NAND controller */
1103        if (zynq_nand_init_nand_flash(nand_chip->options) < 0) {
1104                printf("%s: nand flash init failed\n", __func__);
1105                goto fail;
1106        }
1107
1108        /* first scan to find the device and get the page size */
1109        if (nand_scan_ident(mtd, 1, NULL)) {
1110                printf("%s: nand_scan_ident failed\n", __func__);
1111                goto fail;
1112        }
1113        /* Send the command for reading device ID */
1114        nand_chip->cmdfunc(mtd, NAND_CMD_RESET, -1, -1);
1115        nand_chip->cmdfunc(mtd, NAND_CMD_READID, 0x00, -1);
1116
1117        /* Read manufacturer and device IDs */
1118        maf_id = nand_chip->read_byte(mtd);
1119        dev_id = nand_chip->read_byte(mtd);
1120
1121        if ((maf_id == 0x2c) && ((dev_id == 0xf1) ||
1122                                 (dev_id == 0xa1) || (dev_id == 0xb1) ||
1123                                 (dev_id == 0xaa) || (dev_id == 0xba) ||
1124                                 (dev_id == 0xda) || (dev_id == 0xca) ||
1125                                 (dev_id == 0xac) || (dev_id == 0xbc) ||
1126                                 (dev_id == 0xdc) || (dev_id == 0xcc) ||
1127                                 (dev_id == 0xa3) || (dev_id == 0xb3) ||
1128                                 (dev_id == 0xd3) || (dev_id == 0xc3))) {
1129                nand_chip->cmdfunc(mtd, NAND_CMD_SET_FEATURES,
1130                                                ONDIE_ECC_FEATURE_ADDR, -1);
1131                for (i = 0; i < 4; i++)
1132                        writeb(set_feature[i], nand_chip->IO_ADDR_W);
1133
1134                /* Wait for 1us after writing data with SET_FEATURES command */
1135                ndelay(1000);
1136
1137                nand_chip->cmdfunc(mtd, NAND_CMD_GET_FEATURES,
1138                                                ONDIE_ECC_FEATURE_ADDR, -1);
1139                nand_chip->read_buf(mtd, get_feature, 4);
1140
1141                if (get_feature[0] & ONDIE_ECC_FEATURE_ENABLE) {
1142                        debug("%s: OnDie ECC flash\n", __func__);
1143                        ondie_ecc_enabled = 1;
1144                } else {
1145                        printf("%s: Unable to detect OnDie ECC\n", __func__);
1146                }
1147        }
1148
1149        if (ondie_ecc_enabled) {
1150                /* Bypass the controller ECC block */
1151                ecc_cfg = readl(&zynq_nand_smc_base->emcr);
1152                ecc_cfg &= ~ZYNQ_MEMC_NAND_ECC_MODE_MASK;
1153                writel(ecc_cfg, &zynq_nand_smc_base->emcr);
1154
1155                /* The software ECC routines won't work
1156                 * with the SMC controller
1157                 */
1158                nand_chip->ecc.mode = NAND_ECC_HW;
1159                nand_chip->ecc.strength = 1;
1160                nand_chip->ecc.read_page = zynq_nand_read_page_raw_nooob;
1161                nand_chip->ecc.read_subpage = zynq_nand_read_subpage_raw;
1162                nand_chip->ecc.write_page = zynq_nand_write_page_raw;
1163                nand_chip->ecc.read_page_raw = zynq_nand_read_page_raw;
1164                nand_chip->ecc.write_page_raw = zynq_nand_write_page_raw;
1165                nand_chip->ecc.read_oob = zynq_nand_read_oob;
1166                nand_chip->ecc.write_oob = zynq_nand_write_oob;
1167                nand_chip->ecc.size = mtd->writesize;
1168                nand_chip->ecc.bytes = 0;
1169
1170                /* NAND with on-die ECC supports subpage reads */
1171                nand_chip->options |= NAND_SUBPAGE_READ;
1172
1173                /* On-Die ECC spare bytes offset 8 is used for ECC codes */
1174                if (ondie_ecc_enabled) {
1175                        nand_chip->ecc.layout = &ondie_nand_oob_64;
1176                        /* Use the BBT pattern descriptors */
1177                        nand_chip->bbt_td = &bbt_main_descr;
1178                        nand_chip->bbt_md = &bbt_mirror_descr;
1179                }
1180        } else {
1181                /* Hardware ECC generates 3 bytes ECC code for each 512 bytes */
1182                nand_chip->ecc.mode = NAND_ECC_HW;
1183                nand_chip->ecc.strength = 1;
1184                nand_chip->ecc.size = ZYNQ_NAND_ECC_SIZE;
1185                nand_chip->ecc.bytes = 3;
1186                nand_chip->ecc.calculate = zynq_nand_calculate_hwecc;
1187                nand_chip->ecc.correct = zynq_nand_correct_data;
1188                nand_chip->ecc.hwctl = NULL;
1189                nand_chip->ecc.read_page = zynq_nand_read_page_hwecc;
1190                nand_chip->ecc.write_page = zynq_nand_write_page_hwecc;
1191                nand_chip->ecc.read_page_raw = zynq_nand_read_page_raw;
1192                nand_chip->ecc.write_page_raw = zynq_nand_write_page_raw;
1193                nand_chip->ecc.read_oob = zynq_nand_read_oob;
1194                nand_chip->ecc.write_oob = zynq_nand_write_oob;
1195
1196                switch (mtd->writesize) {
1197                case 512:
1198                        ecc_page_size = 0x1;
1199                        /* Set the ECC memory config register */
1200                        writel((ZYNQ_NAND_ECC_CONFIG | ecc_page_size),
1201                               &zynq_nand_smc_base->emcr);
1202                        break;
1203                case 1024:
1204                        ecc_page_size = 0x2;
1205                        /* Set the ECC memory config register */
1206                        writel((ZYNQ_NAND_ECC_CONFIG | ecc_page_size),
1207                               &zynq_nand_smc_base->emcr);
1208                        break;
1209                case 2048:
1210                        ecc_page_size = 0x3;
1211                        /* Set the ECC memory config register */
1212                        writel((ZYNQ_NAND_ECC_CONFIG | ecc_page_size),
1213                               &zynq_nand_smc_base->emcr);
1214                        break;
1215                default:
1216                        nand_chip->ecc.mode = NAND_ECC_SOFT;
1217                        nand_chip->ecc.calculate = nand_calculate_ecc;
1218                        nand_chip->ecc.correct = nand_correct_data;
1219                        nand_chip->ecc.read_page = zynq_nand_read_page_swecc;
1220                        nand_chip->ecc.write_page = zynq_nand_write_page_swecc;
1221                        nand_chip->ecc.size = 256;
1222                        break;
1223                }
1224
1225                if (mtd->oobsize == 16)
1226                        nand_chip->ecc.layout = &nand_oob_16;
1227                else if (mtd->oobsize == 64)
1228                        nand_chip->ecc.layout = &nand_oob_64;
1229                else
1230                        printf("%s: No oob layout found\n", __func__);
1231        }
1232
1233        /* Second phase scan */
1234        if (nand_scan_tail(mtd)) {
1235                printf("%s: nand_scan_tail failed\n", __func__);
1236                goto fail;
1237        }
1238        if (nand_register(devnum, mtd))
1239                goto fail;
1240        return 0;
1241fail:
1242        free(xnand);
1243        return err;
1244}
1245
1246static struct nand_chip nand_chip[CONFIG_SYS_MAX_NAND_DEVICE];
1247
1248void board_nand_init(void)
1249{
1250        struct nand_chip *nand = &nand_chip[0];
1251
1252        if (zynq_nand_init(nand, 0))
1253                puts("ZYNQ NAND init failed\n");
1254}
1255