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