uboot/drivers/mtd/nand/fsl_ifc_nand.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0+
   2/* Integrated Flash Controller NAND Machine Driver
   3 *
   4 * Copyright (c) 2012 Freescale Semiconductor, Inc
   5 *
   6 * Authors: Dipen Dudhat <Dipen.Dudhat@freescale.com>
   7 */
   8
   9#include <common.h>
  10#include <malloc.h>
  11#include <nand.h>
  12
  13#include <linux/mtd/mtd.h>
  14#include <linux/mtd/rawnand.h>
  15#include <linux/mtd/nand_ecc.h>
  16
  17#include <asm/io.h>
  18#include <linux/errno.h>
  19#include <fsl_ifc.h>
  20
  21#ifndef CONFIG_SYS_FSL_IFC_BANK_COUNT
  22#define CONFIG_SYS_FSL_IFC_BANK_COUNT   4
  23#endif
  24
  25#define MAX_BANKS       CONFIG_SYS_FSL_IFC_BANK_COUNT
  26#define ERR_BYTE        0xFF /* Value returned for read bytes
  27                                when read failed */
  28
  29struct fsl_ifc_ctrl;
  30
  31/* mtd information per set */
  32struct fsl_ifc_mtd {
  33        struct nand_chip chip;
  34        struct fsl_ifc_ctrl *ctrl;
  35
  36        struct device *dev;
  37        int bank;               /* Chip select bank number                */
  38        unsigned int bufnum_mask; /* bufnum = page & bufnum_mask */
  39        u8 __iomem *vbase;      /* Chip select base virtual address       */
  40};
  41
  42/* overview of the fsl ifc controller */
  43struct fsl_ifc_ctrl {
  44        struct nand_hw_control controller;
  45        struct fsl_ifc_mtd *chips[MAX_BANKS];
  46
  47        /* device info */
  48        struct fsl_ifc regs;
  49        void __iomem *addr;      /* Address of assigned IFC buffer        */
  50        unsigned int page;       /* Last page written to / read from      */
  51        unsigned int read_bytes; /* Number of bytes read during command   */
  52        unsigned int column;     /* Saved column from SEQIN               */
  53        unsigned int index;      /* Pointer to next byte to 'read'        */
  54        unsigned int status;     /* status read from NEESR after last op  */
  55        unsigned int oob;        /* Non zero if operating on OOB data     */
  56        unsigned int eccread;    /* Non zero for a full-page ECC read     */
  57};
  58
  59static struct fsl_ifc_ctrl *ifc_ctrl;
  60
  61/* 512-byte page with 4-bit ECC, 8-bit */
  62static struct nand_ecclayout oob_512_8bit_ecc4 = {
  63        .eccbytes = 8,
  64        .eccpos = {8, 9, 10, 11, 12, 13, 14, 15},
  65        .oobfree = { {0, 5}, {6, 2} },
  66};
  67
  68/* 512-byte page with 4-bit ECC, 16-bit */
  69static struct nand_ecclayout oob_512_16bit_ecc4 = {
  70        .eccbytes = 8,
  71        .eccpos = {8, 9, 10, 11, 12, 13, 14, 15},
  72        .oobfree = { {2, 6}, },
  73};
  74
  75/* 2048-byte page size with 4-bit ECC */
  76static struct nand_ecclayout oob_2048_ecc4 = {
  77        .eccbytes = 32,
  78        .eccpos = {
  79                8, 9, 10, 11, 12, 13, 14, 15,
  80                16, 17, 18, 19, 20, 21, 22, 23,
  81                24, 25, 26, 27, 28, 29, 30, 31,
  82                32, 33, 34, 35, 36, 37, 38, 39,
  83        },
  84        .oobfree = { {2, 6}, {40, 24} },
  85};
  86
  87/* 4096-byte page size with 4-bit ECC */
  88static struct nand_ecclayout oob_4096_ecc4 = {
  89        .eccbytes = 64,
  90        .eccpos = {
  91                8, 9, 10, 11, 12, 13, 14, 15,
  92                16, 17, 18, 19, 20, 21, 22, 23,
  93                24, 25, 26, 27, 28, 29, 30, 31,
  94                32, 33, 34, 35, 36, 37, 38, 39,
  95                40, 41, 42, 43, 44, 45, 46, 47,
  96                48, 49, 50, 51, 52, 53, 54, 55,
  97                56, 57, 58, 59, 60, 61, 62, 63,
  98                64, 65, 66, 67, 68, 69, 70, 71,
  99        },
 100        .oobfree = { {2, 6}, {72, 56} },
 101};
 102
 103/* 4096-byte page size with 8-bit ECC -- requires 218-byte OOB */
 104static struct nand_ecclayout oob_4096_ecc8 = {
 105        .eccbytes = 128,
 106        .eccpos = {
 107                8, 9, 10, 11, 12, 13, 14, 15,
 108                16, 17, 18, 19, 20, 21, 22, 23,
 109                24, 25, 26, 27, 28, 29, 30, 31,
 110                32, 33, 34, 35, 36, 37, 38, 39,
 111                40, 41, 42, 43, 44, 45, 46, 47,
 112                48, 49, 50, 51, 52, 53, 54, 55,
 113                56, 57, 58, 59, 60, 61, 62, 63,
 114                64, 65, 66, 67, 68, 69, 70, 71,
 115                72, 73, 74, 75, 76, 77, 78, 79,
 116                80, 81, 82, 83, 84, 85, 86, 87,
 117                88, 89, 90, 91, 92, 93, 94, 95,
 118                96, 97, 98, 99, 100, 101, 102, 103,
 119                104, 105, 106, 107, 108, 109, 110, 111,
 120                112, 113, 114, 115, 116, 117, 118, 119,
 121                120, 121, 122, 123, 124, 125, 126, 127,
 122                128, 129, 130, 131, 132, 133, 134, 135,
 123        },
 124        .oobfree = { {2, 6}, {136, 82} },
 125};
 126
 127/* 8192-byte page size with 4-bit ECC */
 128static struct nand_ecclayout oob_8192_ecc4 = {
 129        .eccbytes = 128,
 130        .eccpos = {
 131                8, 9, 10, 11, 12, 13, 14, 15,
 132                16, 17, 18, 19, 20, 21, 22, 23,
 133                24, 25, 26, 27, 28, 29, 30, 31,
 134                32, 33, 34, 35, 36, 37, 38, 39,
 135                40, 41, 42, 43, 44, 45, 46, 47,
 136                48, 49, 50, 51, 52, 53, 54, 55,
 137                56, 57, 58, 59, 60, 61, 62, 63,
 138                64, 65, 66, 67, 68, 69, 70, 71,
 139                72, 73, 74, 75, 76, 77, 78, 79,
 140                80, 81, 82, 83, 84, 85, 86, 87,
 141                88, 89, 90, 91, 92, 93, 94, 95,
 142                96, 97, 98, 99, 100, 101, 102, 103,
 143                104, 105, 106, 107, 108, 109, 110, 111,
 144                112, 113, 114, 115, 116, 117, 118, 119,
 145                120, 121, 122, 123, 124, 125, 126, 127,
 146                128, 129, 130, 131, 132, 133, 134, 135,
 147        },
 148        .oobfree = { {2, 6}, {136, 208} },
 149};
 150
 151/* 8192-byte page size with 8-bit ECC -- requires 218-byte OOB */
 152static struct nand_ecclayout oob_8192_ecc8 = {
 153        .eccbytes = 256,
 154        .eccpos = {
 155                8, 9, 10, 11, 12, 13, 14, 15,
 156                16, 17, 18, 19, 20, 21, 22, 23,
 157                24, 25, 26, 27, 28, 29, 30, 31,
 158                32, 33, 34, 35, 36, 37, 38, 39,
 159                40, 41, 42, 43, 44, 45, 46, 47,
 160                48, 49, 50, 51, 52, 53, 54, 55,
 161                56, 57, 58, 59, 60, 61, 62, 63,
 162                64, 65, 66, 67, 68, 69, 70, 71,
 163                72, 73, 74, 75, 76, 77, 78, 79,
 164                80, 81, 82, 83, 84, 85, 86, 87,
 165                88, 89, 90, 91, 92, 93, 94, 95,
 166                96, 97, 98, 99, 100, 101, 102, 103,
 167                104, 105, 106, 107, 108, 109, 110, 111,
 168                112, 113, 114, 115, 116, 117, 118, 119,
 169                120, 121, 122, 123, 124, 125, 126, 127,
 170                128, 129, 130, 131, 132, 133, 134, 135,
 171                136, 137, 138, 139, 140, 141, 142, 143,
 172                144, 145, 146, 147, 148, 149, 150, 151,
 173                152, 153, 154, 155, 156, 157, 158, 159,
 174                160, 161, 162, 163, 164, 165, 166, 167,
 175                168, 169, 170, 171, 172, 173, 174, 175,
 176                176, 177, 178, 179, 180, 181, 182, 183,
 177                184, 185, 186, 187, 188, 189, 190, 191,
 178                192, 193, 194, 195, 196, 197, 198, 199,
 179                200, 201, 202, 203, 204, 205, 206, 207,
 180                208, 209, 210, 211, 212, 213, 214, 215,
 181                216, 217, 218, 219, 220, 221, 222, 223,
 182                224, 225, 226, 227, 228, 229, 230, 231,
 183                232, 233, 234, 235, 236, 237, 238, 239,
 184                240, 241, 242, 243, 244, 245, 246, 247,
 185                248, 249, 250, 251, 252, 253, 254, 255,
 186                256, 257, 258, 259, 260, 261, 262, 263,
 187        },
 188        .oobfree = { {2, 6}, {264, 80} },
 189};
 190
 191/*
 192 * Generic flash bbt descriptors
 193 */
 194static u8 bbt_pattern[] = {'B', 'b', 't', '0' };
 195static u8 mirror_pattern[] = {'1', 't', 'b', 'B' };
 196
 197static struct nand_bbt_descr bbt_main_descr = {
 198        .options = NAND_BBT_LASTBLOCK | NAND_BBT_CREATE | NAND_BBT_WRITE |
 199                   NAND_BBT_2BIT | NAND_BBT_VERSION,
 200        .offs = 2, /* 0 on 8-bit small page */
 201        .len = 4,
 202        .veroffs = 6,
 203        .maxblocks = 4,
 204        .pattern = bbt_pattern,
 205};
 206
 207static struct nand_bbt_descr bbt_mirror_descr = {
 208        .options = NAND_BBT_LASTBLOCK | NAND_BBT_CREATE | NAND_BBT_WRITE |
 209                   NAND_BBT_2BIT | NAND_BBT_VERSION,
 210        .offs = 2, /* 0 on 8-bit small page */
 211        .len = 4,
 212        .veroffs = 6,
 213        .maxblocks = 4,
 214        .pattern = mirror_pattern,
 215};
 216
 217/*
 218 * Set up the IFC hardware block and page address fields, and the ifc nand
 219 * structure addr field to point to the correct IFC buffer in memory
 220 */
 221static void set_addr(struct mtd_info *mtd, int column, int page_addr, int oob)
 222{
 223        struct nand_chip *chip = mtd_to_nand(mtd);
 224        struct fsl_ifc_mtd *priv = nand_get_controller_data(chip);
 225        struct fsl_ifc_ctrl *ctrl = priv->ctrl;
 226        struct fsl_ifc_runtime *ifc = ctrl->regs.rregs;
 227        int buf_num;
 228
 229        ctrl->page = page_addr;
 230
 231        /* Program ROW0/COL0 */
 232        ifc_out32(&ifc->ifc_nand.row0, page_addr);
 233        ifc_out32(&ifc->ifc_nand.col0, (oob ? IFC_NAND_COL_MS : 0) | column);
 234
 235        buf_num = page_addr & priv->bufnum_mask;
 236
 237        ctrl->addr = priv->vbase + buf_num * (mtd->writesize * 2);
 238        ctrl->index = column;
 239
 240        /* for OOB data point to the second half of the buffer */
 241        if (oob)
 242                ctrl->index += mtd->writesize;
 243}
 244
 245static int is_blank(struct mtd_info *mtd, struct fsl_ifc_ctrl *ctrl,
 246                    unsigned int bufnum)
 247{
 248        struct nand_chip *chip = mtd_to_nand(mtd);
 249        struct fsl_ifc_mtd *priv = nand_get_controller_data(chip);
 250        u8 __iomem *addr = priv->vbase + bufnum * (mtd->writesize * 2);
 251        u32 __iomem *main = (u32 *)addr;
 252        u8 __iomem *oob = addr + mtd->writesize;
 253        int i;
 254
 255        for (i = 0; i < mtd->writesize / 4; i++) {
 256                if (__raw_readl(&main[i]) != 0xffffffff)
 257                        return 0;
 258        }
 259
 260        for (i = 0; i < chip->ecc.layout->eccbytes; i++) {
 261                int pos = chip->ecc.layout->eccpos[i];
 262
 263                if (__raw_readb(&oob[pos]) != 0xff)
 264                        return 0;
 265        }
 266
 267        return 1;
 268}
 269
 270/* returns nonzero if entire page is blank */
 271static int check_read_ecc(struct mtd_info *mtd, struct fsl_ifc_ctrl *ctrl,
 272                          u32 eccstat, unsigned int bufnum)
 273{
 274        return (eccstat >> ((3 - bufnum % 4) * 8)) & 15;
 275}
 276
 277/*
 278 * execute IFC NAND command and wait for it to complete
 279 */
 280static int fsl_ifc_run_command(struct mtd_info *mtd)
 281{
 282        struct nand_chip *chip = mtd_to_nand(mtd);
 283        struct fsl_ifc_mtd *priv = nand_get_controller_data(chip);
 284        struct fsl_ifc_ctrl *ctrl = priv->ctrl;
 285        struct fsl_ifc_runtime *ifc = ctrl->regs.rregs;
 286        u32 timeo = (CONFIG_SYS_HZ * 10) / 1000;
 287        u32 time_start;
 288        u32 eccstat;
 289        int i;
 290
 291        /* set the chip select for NAND Transaction */
 292        ifc_out32(&ifc->ifc_nand.nand_csel, priv->bank << IFC_NAND_CSEL_SHIFT);
 293
 294        /* start read/write seq */
 295        ifc_out32(&ifc->ifc_nand.nandseq_strt,
 296                  IFC_NAND_SEQ_STRT_FIR_STRT);
 297
 298        /* wait for NAND Machine complete flag or timeout */
 299        time_start = get_timer(0);
 300
 301        while (get_timer(time_start) < timeo) {
 302                ctrl->status = ifc_in32(&ifc->ifc_nand.nand_evter_stat);
 303
 304                if (ctrl->status & IFC_NAND_EVTER_STAT_OPC)
 305                        break;
 306        }
 307
 308        ifc_out32(&ifc->ifc_nand.nand_evter_stat, ctrl->status);
 309
 310        if (ctrl->status & IFC_NAND_EVTER_STAT_FTOER)
 311                printf("%s: Flash Time Out Error\n", __func__);
 312        if (ctrl->status & IFC_NAND_EVTER_STAT_WPER)
 313                printf("%s: Write Protect Error\n", __func__);
 314
 315        if (ctrl->eccread) {
 316                int errors;
 317                int bufnum = ctrl->page & priv->bufnum_mask;
 318                int sector_start = bufnum * chip->ecc.steps;
 319                int sector_end = sector_start + chip->ecc.steps - 1;
 320                u32 *eccstat_regs;
 321
 322                eccstat_regs = ifc->ifc_nand.nand_eccstat;
 323                eccstat = ifc_in32(&eccstat_regs[sector_start / 4]);
 324
 325                for (i = sector_start; i <= sector_end; i++) {
 326                        if ((i != sector_start) && !(i % 4))
 327                                eccstat = ifc_in32(&eccstat_regs[i / 4]);
 328
 329                        errors = check_read_ecc(mtd, ctrl, eccstat, i);
 330
 331                        if (errors == 15) {
 332                                /*
 333                                 * Uncorrectable error.
 334                                 * OK only if the whole page is blank.
 335                                 *
 336                                 * We disable ECCER reporting due to erratum
 337                                 * IFC-A002770 -- so report it now if we
 338                                 * see an uncorrectable error in ECCSTAT.
 339                                 */
 340                                if (!is_blank(mtd, ctrl, bufnum))
 341                                        ctrl->status |=
 342                                                IFC_NAND_EVTER_STAT_ECCER;
 343                                break;
 344                        }
 345
 346                        mtd->ecc_stats.corrected += errors;
 347                }
 348
 349                ctrl->eccread = 0;
 350        }
 351
 352        /* returns 0 on success otherwise non-zero) */
 353        return ctrl->status == IFC_NAND_EVTER_STAT_OPC ? 0 : -EIO;
 354}
 355
 356static void fsl_ifc_do_read(struct nand_chip *chip,
 357                            int oob,
 358                            struct mtd_info *mtd)
 359{
 360        struct fsl_ifc_mtd *priv = nand_get_controller_data(chip);
 361        struct fsl_ifc_ctrl *ctrl = priv->ctrl;
 362        struct fsl_ifc_runtime *ifc = ctrl->regs.rregs;
 363
 364        /* Program FIR/IFC_NAND_FCR0 for Small/Large page */
 365        if (mtd->writesize > 512) {
 366                ifc_out32(&ifc->ifc_nand.nand_fir0,
 367                          (IFC_FIR_OP_CW0 << IFC_NAND_FIR0_OP0_SHIFT) |
 368                          (IFC_FIR_OP_CA0 << IFC_NAND_FIR0_OP1_SHIFT) |
 369                          (IFC_FIR_OP_RA0 << IFC_NAND_FIR0_OP2_SHIFT) |
 370                          (IFC_FIR_OP_CMD1 << IFC_NAND_FIR0_OP3_SHIFT) |
 371                          (IFC_FIR_OP_RBCD << IFC_NAND_FIR0_OP4_SHIFT));
 372                ifc_out32(&ifc->ifc_nand.nand_fir1, 0x0);
 373
 374                ifc_out32(&ifc->ifc_nand.nand_fcr0,
 375                          (NAND_CMD_READ0 << IFC_NAND_FCR0_CMD0_SHIFT) |
 376                          (NAND_CMD_READSTART << IFC_NAND_FCR0_CMD1_SHIFT));
 377        } else {
 378                ifc_out32(&ifc->ifc_nand.nand_fir0,
 379                          (IFC_FIR_OP_CW0 << IFC_NAND_FIR0_OP0_SHIFT) |
 380                          (IFC_FIR_OP_CA0 << IFC_NAND_FIR0_OP1_SHIFT) |
 381                          (IFC_FIR_OP_RA0  << IFC_NAND_FIR0_OP2_SHIFT) |
 382                          (IFC_FIR_OP_RBCD << IFC_NAND_FIR0_OP3_SHIFT));
 383
 384                if (oob)
 385                        ifc_out32(&ifc->ifc_nand.nand_fcr0,
 386                                  NAND_CMD_READOOB << IFC_NAND_FCR0_CMD0_SHIFT);
 387                else
 388                        ifc_out32(&ifc->ifc_nand.nand_fcr0,
 389                                  NAND_CMD_READ0 << IFC_NAND_FCR0_CMD0_SHIFT);
 390        }
 391}
 392
 393/* cmdfunc send commands to the IFC NAND Machine */
 394static void fsl_ifc_cmdfunc(struct mtd_info *mtd, unsigned int command,
 395                             int column, int page_addr)
 396{
 397        struct nand_chip *chip = mtd_to_nand(mtd);
 398        struct fsl_ifc_mtd *priv = nand_get_controller_data(chip);
 399        struct fsl_ifc_ctrl *ctrl = priv->ctrl;
 400        struct fsl_ifc_runtime *ifc = ctrl->regs.rregs;
 401
 402        /* clear the read buffer */
 403        ctrl->read_bytes = 0;
 404        if (command != NAND_CMD_PAGEPROG)
 405                ctrl->index = 0;
 406
 407        switch (command) {
 408        /* READ0 read the entire buffer to use hardware ECC. */
 409        case NAND_CMD_READ0: {
 410                ifc_out32(&ifc->ifc_nand.nand_fbcr, 0);
 411                set_addr(mtd, 0, page_addr, 0);
 412
 413                ctrl->read_bytes = mtd->writesize + mtd->oobsize;
 414                ctrl->index += column;
 415
 416                if (chip->ecc.mode == NAND_ECC_HW)
 417                        ctrl->eccread = 1;
 418
 419                fsl_ifc_do_read(chip, 0, mtd);
 420                fsl_ifc_run_command(mtd);
 421                return;
 422        }
 423
 424        /* READOOB reads only the OOB because no ECC is performed. */
 425        case NAND_CMD_READOOB:
 426                ifc_out32(&ifc->ifc_nand.nand_fbcr, mtd->oobsize - column);
 427                set_addr(mtd, column, page_addr, 1);
 428
 429                ctrl->read_bytes = mtd->writesize + mtd->oobsize;
 430
 431                fsl_ifc_do_read(chip, 1, mtd);
 432                fsl_ifc_run_command(mtd);
 433
 434                return;
 435
 436        /* READID must read all possible bytes while CEB is active */
 437        case NAND_CMD_READID:
 438        case NAND_CMD_PARAM: {
 439                int timing = IFC_FIR_OP_RB;
 440                if (command == NAND_CMD_PARAM)
 441                        timing = IFC_FIR_OP_RBCD;
 442
 443                ifc_out32(&ifc->ifc_nand.nand_fir0,
 444                          (IFC_FIR_OP_CW0 << IFC_NAND_FIR0_OP0_SHIFT) |
 445                          (IFC_FIR_OP_UA  << IFC_NAND_FIR0_OP1_SHIFT) |
 446                          (timing << IFC_NAND_FIR0_OP2_SHIFT));
 447                ifc_out32(&ifc->ifc_nand.nand_fcr0,
 448                          command << IFC_NAND_FCR0_CMD0_SHIFT);
 449                ifc_out32(&ifc->ifc_nand.row3, column);
 450
 451                /*
 452                 * although currently it's 8 bytes for READID, we always read
 453                 * the maximum 256 bytes(for PARAM)
 454                 */
 455                ifc_out32(&ifc->ifc_nand.nand_fbcr, 256);
 456                ctrl->read_bytes = 256;
 457
 458                set_addr(mtd, 0, 0, 0);
 459                fsl_ifc_run_command(mtd);
 460                return;
 461        }
 462
 463        /* ERASE1 stores the block and page address */
 464        case NAND_CMD_ERASE1:
 465                set_addr(mtd, 0, page_addr, 0);
 466                return;
 467
 468        /* ERASE2 uses the block and page address from ERASE1 */
 469        case NAND_CMD_ERASE2:
 470                ifc_out32(&ifc->ifc_nand.nand_fir0,
 471                          (IFC_FIR_OP_CW0 << IFC_NAND_FIR0_OP0_SHIFT) |
 472                          (IFC_FIR_OP_RA0 << IFC_NAND_FIR0_OP1_SHIFT) |
 473                          (IFC_FIR_OP_CMD1 << IFC_NAND_FIR0_OP2_SHIFT));
 474
 475                ifc_out32(&ifc->ifc_nand.nand_fcr0,
 476                          (NAND_CMD_ERASE1 << IFC_NAND_FCR0_CMD0_SHIFT) |
 477                          (NAND_CMD_ERASE2 << IFC_NAND_FCR0_CMD1_SHIFT));
 478
 479                ifc_out32(&ifc->ifc_nand.nand_fbcr, 0);
 480                ctrl->read_bytes = 0;
 481                fsl_ifc_run_command(mtd);
 482                return;
 483
 484        /* SEQIN sets up the addr buffer and all registers except the length */
 485        case NAND_CMD_SEQIN: {
 486                u32 nand_fcr0;
 487                ctrl->column = column;
 488                ctrl->oob = 0;
 489
 490                if (mtd->writesize > 512) {
 491                        nand_fcr0 =
 492                                (NAND_CMD_SEQIN << IFC_NAND_FCR0_CMD0_SHIFT) |
 493                                (NAND_CMD_STATUS << IFC_NAND_FCR0_CMD1_SHIFT) |
 494                                (NAND_CMD_PAGEPROG << IFC_NAND_FCR0_CMD2_SHIFT);
 495
 496                        ifc_out32(&ifc->ifc_nand.nand_fir0,
 497                                  (IFC_FIR_OP_CW0 << IFC_NAND_FIR0_OP0_SHIFT) |
 498                                  (IFC_FIR_OP_CA0 << IFC_NAND_FIR0_OP1_SHIFT) |
 499                                  (IFC_FIR_OP_RA0 << IFC_NAND_FIR0_OP2_SHIFT) |
 500                                  (IFC_FIR_OP_WBCD  <<
 501                                                IFC_NAND_FIR0_OP3_SHIFT) |
 502                                  (IFC_FIR_OP_CMD2 << IFC_NAND_FIR0_OP4_SHIFT));
 503                        ifc_out32(&ifc->ifc_nand.nand_fir1,
 504                                  (IFC_FIR_OP_CW1 << IFC_NAND_FIR1_OP5_SHIFT) |
 505                                  (IFC_FIR_OP_RDSTAT <<
 506                                        IFC_NAND_FIR1_OP6_SHIFT) |
 507                                  (IFC_FIR_OP_NOP << IFC_NAND_FIR1_OP7_SHIFT));
 508                } else {
 509                        nand_fcr0 = ((NAND_CMD_PAGEPROG <<
 510                                        IFC_NAND_FCR0_CMD1_SHIFT) |
 511                                    (NAND_CMD_SEQIN <<
 512                                        IFC_NAND_FCR0_CMD2_SHIFT) |
 513                                    (NAND_CMD_STATUS <<
 514                                        IFC_NAND_FCR0_CMD3_SHIFT));
 515
 516                        ifc_out32(&ifc->ifc_nand.nand_fir0,
 517                                  (IFC_FIR_OP_CW0 << IFC_NAND_FIR0_OP0_SHIFT) |
 518                                  (IFC_FIR_OP_CMD2 << IFC_NAND_FIR0_OP1_SHIFT) |
 519                                  (IFC_FIR_OP_CA0 << IFC_NAND_FIR0_OP2_SHIFT) |
 520                                  (IFC_FIR_OP_RA0 << IFC_NAND_FIR0_OP3_SHIFT) |
 521                                  (IFC_FIR_OP_WBCD << IFC_NAND_FIR0_OP4_SHIFT));
 522                        ifc_out32(&ifc->ifc_nand.nand_fir1,
 523                                  (IFC_FIR_OP_CMD1 << IFC_NAND_FIR1_OP5_SHIFT) |
 524                                  (IFC_FIR_OP_CW3 << IFC_NAND_FIR1_OP6_SHIFT) |
 525                                  (IFC_FIR_OP_RDSTAT <<
 526                                        IFC_NAND_FIR1_OP7_SHIFT) |
 527                                  (IFC_FIR_OP_NOP << IFC_NAND_FIR1_OP8_SHIFT));
 528
 529                        if (column >= mtd->writesize)
 530                                nand_fcr0 |=
 531                                NAND_CMD_READOOB << IFC_NAND_FCR0_CMD0_SHIFT;
 532                        else
 533                                nand_fcr0 |=
 534                                NAND_CMD_READ0 << IFC_NAND_FCR0_CMD0_SHIFT;
 535                }
 536
 537                if (column >= mtd->writesize) {
 538                        /* OOB area --> READOOB */
 539                        column -= mtd->writesize;
 540                        ctrl->oob = 1;
 541                }
 542                ifc_out32(&ifc->ifc_nand.nand_fcr0, nand_fcr0);
 543                set_addr(mtd, column, page_addr, ctrl->oob);
 544                return;
 545        }
 546
 547        /* PAGEPROG reuses all of the setup from SEQIN and adds the length */
 548        case NAND_CMD_PAGEPROG:
 549                if (ctrl->oob)
 550                        ifc_out32(&ifc->ifc_nand.nand_fbcr,
 551                                  ctrl->index - ctrl->column);
 552                else
 553                        ifc_out32(&ifc->ifc_nand.nand_fbcr, 0);
 554
 555                fsl_ifc_run_command(mtd);
 556                return;
 557
 558        case NAND_CMD_STATUS:
 559                ifc_out32(&ifc->ifc_nand.nand_fir0,
 560                          (IFC_FIR_OP_CW0 << IFC_NAND_FIR0_OP0_SHIFT) |
 561                          (IFC_FIR_OP_RB << IFC_NAND_FIR0_OP1_SHIFT));
 562                ifc_out32(&ifc->ifc_nand.nand_fcr0,
 563                          NAND_CMD_STATUS << IFC_NAND_FCR0_CMD0_SHIFT);
 564                ifc_out32(&ifc->ifc_nand.nand_fbcr, 1);
 565                set_addr(mtd, 0, 0, 0);
 566                ctrl->read_bytes = 1;
 567
 568                fsl_ifc_run_command(mtd);
 569
 570                /*
 571                 * The chip always seems to report that it is
 572                 * write-protected, even when it is not.
 573                 */
 574                if (chip->options & NAND_BUSWIDTH_16)
 575                        ifc_out16(ctrl->addr,
 576                                  ifc_in16(ctrl->addr) | NAND_STATUS_WP);
 577                else
 578                        out_8(ctrl->addr, in_8(ctrl->addr) | NAND_STATUS_WP);
 579                return;
 580
 581        case NAND_CMD_RESET:
 582                ifc_out32(&ifc->ifc_nand.nand_fir0,
 583                          IFC_FIR_OP_CW0 << IFC_NAND_FIR0_OP0_SHIFT);
 584                ifc_out32(&ifc->ifc_nand.nand_fcr0,
 585                          NAND_CMD_RESET << IFC_NAND_FCR0_CMD0_SHIFT);
 586                fsl_ifc_run_command(mtd);
 587                return;
 588
 589        default:
 590                printf("%s: error, unsupported command 0x%x.\n",
 591                        __func__, command);
 592        }
 593}
 594
 595/*
 596 * Write buf to the IFC NAND Controller Data Buffer
 597 */
 598static void fsl_ifc_write_buf(struct mtd_info *mtd, const u8 *buf, int len)
 599{
 600        struct nand_chip *chip = mtd_to_nand(mtd);
 601        struct fsl_ifc_mtd *priv = nand_get_controller_data(chip);
 602        struct fsl_ifc_ctrl *ctrl = priv->ctrl;
 603        unsigned int bufsize = mtd->writesize + mtd->oobsize;
 604
 605        if (len <= 0) {
 606                printf("%s of %d bytes", __func__, len);
 607                ctrl->status = 0;
 608                return;
 609        }
 610
 611        if ((unsigned int)len > bufsize - ctrl->index) {
 612                printf("%s beyond end of buffer "
 613                       "(%d requested, %u available)\n",
 614                        __func__, len, bufsize - ctrl->index);
 615                len = bufsize - ctrl->index;
 616        }
 617
 618        memcpy_toio(ctrl->addr + ctrl->index, buf, len);
 619        ctrl->index += len;
 620}
 621
 622/*
 623 * read a byte from either the IFC hardware buffer if it has any data left
 624 * otherwise issue a command to read a single byte.
 625 */
 626static u8 fsl_ifc_read_byte(struct mtd_info *mtd)
 627{
 628        struct nand_chip *chip = mtd_to_nand(mtd);
 629        struct fsl_ifc_mtd *priv = nand_get_controller_data(chip);
 630        struct fsl_ifc_ctrl *ctrl = priv->ctrl;
 631        unsigned int offset;
 632
 633        /*
 634         * If there are still bytes in the IFC buffer, then use the
 635         * next byte.
 636         */
 637        if (ctrl->index < ctrl->read_bytes) {
 638                offset = ctrl->index++;
 639                return in_8(ctrl->addr + offset);
 640        }
 641
 642        printf("%s beyond end of buffer\n", __func__);
 643        return ERR_BYTE;
 644}
 645
 646/*
 647 * Read two bytes from the IFC hardware buffer
 648 * read function for 16-bit buswith
 649 */
 650static uint8_t fsl_ifc_read_byte16(struct mtd_info *mtd)
 651{
 652        struct nand_chip *chip = mtd_to_nand(mtd);
 653        struct fsl_ifc_mtd *priv = nand_get_controller_data(chip);
 654        struct fsl_ifc_ctrl *ctrl = priv->ctrl;
 655        uint16_t data;
 656
 657        /*
 658         * If there are still bytes in the IFC buffer, then use the
 659         * next byte.
 660         */
 661        if (ctrl->index < ctrl->read_bytes) {
 662                data = ifc_in16(ctrl->addr + ctrl->index);
 663                ctrl->index += 2;
 664                return (uint8_t)data;
 665        }
 666
 667        printf("%s beyond end of buffer\n", __func__);
 668        return ERR_BYTE;
 669}
 670
 671/*
 672 * Read from the IFC Controller Data Buffer
 673 */
 674static void fsl_ifc_read_buf(struct mtd_info *mtd, u8 *buf, int len)
 675{
 676        struct nand_chip *chip = mtd_to_nand(mtd);
 677        struct fsl_ifc_mtd *priv = nand_get_controller_data(chip);
 678        struct fsl_ifc_ctrl *ctrl = priv->ctrl;
 679        int avail;
 680
 681        if (len < 0)
 682                return;
 683
 684        avail = min((unsigned int)len, ctrl->read_bytes - ctrl->index);
 685        memcpy_fromio(buf, ctrl->addr + ctrl->index, avail);
 686        ctrl->index += avail;
 687
 688        if (len > avail)
 689                printf("%s beyond end of buffer "
 690                       "(%d requested, %d available)\n",
 691                       __func__, len, avail);
 692}
 693
 694/* This function is called after Program and Erase Operations to
 695 * check for success or failure.
 696 */
 697static int fsl_ifc_wait(struct mtd_info *mtd, struct nand_chip *chip)
 698{
 699        struct fsl_ifc_mtd *priv = nand_get_controller_data(chip);
 700        struct fsl_ifc_ctrl *ctrl = priv->ctrl;
 701        struct fsl_ifc_runtime *ifc = ctrl->regs.rregs;
 702        u32 nand_fsr;
 703        int status;
 704
 705        if (ctrl->status != IFC_NAND_EVTER_STAT_OPC)
 706                return NAND_STATUS_FAIL;
 707
 708        /* Use READ_STATUS command, but wait for the device to be ready */
 709        ifc_out32(&ifc->ifc_nand.nand_fir0,
 710                  (IFC_FIR_OP_CW0 << IFC_NAND_FIR0_OP0_SHIFT) |
 711                  (IFC_FIR_OP_RDSTAT << IFC_NAND_FIR0_OP1_SHIFT));
 712        ifc_out32(&ifc->ifc_nand.nand_fcr0, NAND_CMD_STATUS <<
 713                  IFC_NAND_FCR0_CMD0_SHIFT);
 714        ifc_out32(&ifc->ifc_nand.nand_fbcr, 1);
 715        set_addr(mtd, 0, 0, 0);
 716        ctrl->read_bytes = 1;
 717
 718        fsl_ifc_run_command(mtd);
 719
 720        if (ctrl->status != IFC_NAND_EVTER_STAT_OPC)
 721                return NAND_STATUS_FAIL;
 722
 723        nand_fsr = ifc_in32(&ifc->ifc_nand.nand_fsr);
 724        status = nand_fsr >> 24;
 725
 726        /* Chip sometimes reporting write protect even when it's not */
 727        return status | NAND_STATUS_WP;
 728}
 729
 730static int fsl_ifc_read_page(struct mtd_info *mtd, struct nand_chip *chip,
 731                             uint8_t *buf, int oob_required, int page)
 732{
 733        struct fsl_ifc_mtd *priv = nand_get_controller_data(chip);
 734        struct fsl_ifc_ctrl *ctrl = priv->ctrl;
 735
 736        fsl_ifc_read_buf(mtd, buf, mtd->writesize);
 737        fsl_ifc_read_buf(mtd, chip->oob_poi, mtd->oobsize);
 738
 739        if (ctrl->status != IFC_NAND_EVTER_STAT_OPC)
 740                mtd->ecc_stats.failed++;
 741
 742        return 0;
 743}
 744
 745/* ECC will be calculated automatically, and errors will be detected in
 746 * waitfunc.
 747 */
 748static int fsl_ifc_write_page(struct mtd_info *mtd, struct nand_chip *chip,
 749                               const uint8_t *buf, int oob_required, int page)
 750{
 751        fsl_ifc_write_buf(mtd, buf, mtd->writesize);
 752        fsl_ifc_write_buf(mtd, chip->oob_poi, mtd->oobsize);
 753
 754        return 0;
 755}
 756
 757static void fsl_ifc_ctrl_init(void)
 758{
 759        uint32_t ver = 0;
 760        ifc_ctrl = kzalloc(sizeof(*ifc_ctrl), GFP_KERNEL);
 761        if (!ifc_ctrl)
 762                return;
 763
 764        ifc_ctrl->regs.gregs = IFC_FCM_BASE_ADDR;
 765
 766        ver = ifc_in32(&ifc_ctrl->regs.gregs->ifc_rev);
 767        if (ver >= FSL_IFC_V2_0_0)
 768                ifc_ctrl->regs.rregs =
 769                        (void *)CONFIG_SYS_IFC_ADDR + IFC_RREGS_64KOFFSET;
 770        else
 771                ifc_ctrl->regs.rregs =
 772                        (void *)CONFIG_SYS_IFC_ADDR + IFC_RREGS_4KOFFSET;
 773
 774        /* clear event registers */
 775        ifc_out32(&ifc_ctrl->regs.rregs->ifc_nand.nand_evter_stat, ~0U);
 776        ifc_out32(&ifc_ctrl->regs.rregs->ifc_nand.pgrdcmpl_evt_stat, ~0U);
 777
 778        /* Enable error and event for any detected errors */
 779        ifc_out32(&ifc_ctrl->regs.rregs->ifc_nand.nand_evter_en,
 780                  IFC_NAND_EVTER_EN_OPC_EN |
 781                  IFC_NAND_EVTER_EN_PGRDCMPL_EN |
 782                  IFC_NAND_EVTER_EN_FTOER_EN |
 783                  IFC_NAND_EVTER_EN_WPER_EN);
 784
 785        ifc_out32(&ifc_ctrl->regs.rregs->ifc_nand.ncfgr, 0x0);
 786}
 787
 788static void fsl_ifc_select_chip(struct mtd_info *mtd, int chip)
 789{
 790}
 791
 792static int fsl_ifc_sram_init(struct fsl_ifc_mtd *priv, uint32_t ver)
 793{
 794        struct fsl_ifc_runtime *ifc = ifc_ctrl->regs.rregs;
 795        uint32_t cs = 0, csor = 0, csor_8k = 0, csor_ext = 0;
 796        uint32_t ncfgr = 0;
 797        u32 timeo = (CONFIG_SYS_HZ * 10) / 1000;
 798        u32 time_start;
 799
 800        if (ver > FSL_IFC_V1_1_0) {
 801                ncfgr = ifc_in32(&ifc->ifc_nand.ncfgr);
 802                ifc_out32(&ifc->ifc_nand.ncfgr, ncfgr | IFC_NAND_SRAM_INIT_EN);
 803
 804                /* wait for  SRAM_INIT bit to be clear or timeout */
 805                time_start = get_timer(0);
 806                while (get_timer(time_start) < timeo) {
 807                        ifc_ctrl->status =
 808                                ifc_in32(&ifc->ifc_nand.nand_evter_stat);
 809
 810                        if (!(ifc_ctrl->status & IFC_NAND_SRAM_INIT_EN))
 811                                return 0;
 812                }
 813                printf("fsl-ifc: Failed to Initialise SRAM\n");
 814                return 1;
 815        }
 816
 817        cs = priv->bank;
 818
 819        /* Save CSOR and CSOR_ext */
 820        csor = ifc_in32(&ifc_ctrl->regs.gregs->csor_cs[cs].csor);
 821        csor_ext = ifc_in32(&ifc_ctrl->regs.gregs->csor_cs[cs].csor_ext);
 822
 823        /* chage PageSize 8K and SpareSize 1K*/
 824        csor_8k = (csor & ~(CSOR_NAND_PGS_MASK)) | 0x0018C000;
 825        ifc_out32(&ifc_ctrl->regs.gregs->csor_cs[cs].csor, csor_8k);
 826        ifc_out32(&ifc_ctrl->regs.gregs->csor_cs[cs].csor_ext, 0x0000400);
 827
 828        /* READID */
 829        ifc_out32(&ifc->ifc_nand.nand_fir0,
 830                  (IFC_FIR_OP_CW0 << IFC_NAND_FIR0_OP0_SHIFT) |
 831                  (IFC_FIR_OP_UA  << IFC_NAND_FIR0_OP1_SHIFT) |
 832                  (IFC_FIR_OP_RB << IFC_NAND_FIR0_OP2_SHIFT));
 833        ifc_out32(&ifc->ifc_nand.nand_fcr0,
 834                  NAND_CMD_READID << IFC_NAND_FCR0_CMD0_SHIFT);
 835        ifc_out32(&ifc->ifc_nand.row3, 0x0);
 836
 837        ifc_out32(&ifc->ifc_nand.nand_fbcr, 0x0);
 838
 839        /* Program ROW0/COL0 */
 840        ifc_out32(&ifc->ifc_nand.row0, 0x0);
 841        ifc_out32(&ifc->ifc_nand.col0, 0x0);
 842
 843        /* set the chip select for NAND Transaction */
 844        ifc_out32(&ifc->ifc_nand.nand_csel, priv->bank << IFC_NAND_CSEL_SHIFT);
 845
 846        /* start read seq */
 847        ifc_out32(&ifc->ifc_nand.nandseq_strt, IFC_NAND_SEQ_STRT_FIR_STRT);
 848
 849        time_start = get_timer(0);
 850
 851        while (get_timer(time_start) < timeo) {
 852                ifc_ctrl->status = ifc_in32(&ifc->ifc_nand.nand_evter_stat);
 853
 854                if (ifc_ctrl->status & IFC_NAND_EVTER_STAT_OPC)
 855                        break;
 856        }
 857
 858        if (ifc_ctrl->status != IFC_NAND_EVTER_STAT_OPC) {
 859                printf("fsl-ifc: Failed to Initialise SRAM\n");
 860                return 1;
 861        }
 862
 863        ifc_out32(&ifc->ifc_nand.nand_evter_stat, ifc_ctrl->status);
 864
 865        /* Restore CSOR and CSOR_ext */
 866        ifc_out32(&ifc_ctrl->regs.gregs->csor_cs[cs].csor, csor);
 867        ifc_out32(&ifc_ctrl->regs.gregs->csor_cs[cs].csor_ext, csor_ext);
 868
 869        return 0;
 870}
 871
 872static int fsl_ifc_chip_init(int devnum, u8 *addr)
 873{
 874        struct mtd_info *mtd;
 875        struct nand_chip *nand;
 876        struct fsl_ifc_mtd *priv;
 877        struct nand_ecclayout *layout;
 878        struct fsl_ifc_fcm *gregs = NULL;
 879        uint32_t cspr = 0, csor = 0, ver = 0;
 880        int ret = 0;
 881
 882        if (!ifc_ctrl) {
 883                fsl_ifc_ctrl_init();
 884                if (!ifc_ctrl)
 885                        return -1;
 886        }
 887
 888        priv = kzalloc(sizeof(*priv), GFP_KERNEL);
 889        if (!priv)
 890                return -ENOMEM;
 891
 892        priv->ctrl = ifc_ctrl;
 893        priv->vbase = addr;
 894        gregs = ifc_ctrl->regs.gregs;
 895
 896        /* Find which chip select it is connected to.
 897         */
 898        for (priv->bank = 0; priv->bank < MAX_BANKS; priv->bank++) {
 899                phys_addr_t phys_addr = virt_to_phys(addr);
 900
 901                cspr = ifc_in32(&gregs->cspr_cs[priv->bank].cspr);
 902                csor = ifc_in32(&gregs->csor_cs[priv->bank].csor);
 903
 904                if ((cspr & CSPR_V) && (cspr & CSPR_MSEL) == CSPR_MSEL_NAND &&
 905                    (cspr & CSPR_BA) == CSPR_PHYS_ADDR(phys_addr))
 906                        break;
 907        }
 908
 909        if (priv->bank >= MAX_BANKS) {
 910                printf("%s: address did not match any "
 911                       "chip selects\n", __func__);
 912                kfree(priv);
 913                return -ENODEV;
 914        }
 915
 916        nand = &priv->chip;
 917        mtd = nand_to_mtd(nand);
 918
 919        ifc_ctrl->chips[priv->bank] = priv;
 920
 921        /* fill in nand_chip structure */
 922        /* set up function call table */
 923
 924        nand->write_buf = fsl_ifc_write_buf;
 925        nand->read_buf = fsl_ifc_read_buf;
 926        nand->select_chip = fsl_ifc_select_chip;
 927        nand->cmdfunc = fsl_ifc_cmdfunc;
 928        nand->waitfunc = fsl_ifc_wait;
 929
 930        /* set up nand options */
 931        nand->bbt_td = &bbt_main_descr;
 932        nand->bbt_md = &bbt_mirror_descr;
 933
 934        /* set up nand options */
 935        nand->options = NAND_NO_SUBPAGE_WRITE;
 936        nand->bbt_options = NAND_BBT_USE_FLASH;
 937
 938        if (cspr & CSPR_PORT_SIZE_16) {
 939                nand->read_byte = fsl_ifc_read_byte16;
 940                nand->options |= NAND_BUSWIDTH_16;
 941        } else {
 942                nand->read_byte = fsl_ifc_read_byte;
 943        }
 944
 945        nand->controller = &ifc_ctrl->controller;
 946        nand_set_controller_data(nand, priv);
 947
 948        nand->ecc.read_page = fsl_ifc_read_page;
 949        nand->ecc.write_page = fsl_ifc_write_page;
 950
 951        /* Hardware generates ECC per 512 Bytes */
 952        nand->ecc.size = 512;
 953        nand->ecc.bytes = 8;
 954
 955        switch (csor & CSOR_NAND_PGS_MASK) {
 956        case CSOR_NAND_PGS_512:
 957                if (nand->options & NAND_BUSWIDTH_16) {
 958                        layout = &oob_512_16bit_ecc4;
 959                } else {
 960                        layout = &oob_512_8bit_ecc4;
 961
 962                        /* Avoid conflict with bad block marker */
 963                        bbt_main_descr.offs = 0;
 964                        bbt_mirror_descr.offs = 0;
 965                }
 966
 967                nand->ecc.strength = 4;
 968                priv->bufnum_mask = 15;
 969                break;
 970
 971        case CSOR_NAND_PGS_2K:
 972                layout = &oob_2048_ecc4;
 973                nand->ecc.strength = 4;
 974                priv->bufnum_mask = 3;
 975                break;
 976
 977        case CSOR_NAND_PGS_4K:
 978                if ((csor & CSOR_NAND_ECC_MODE_MASK) ==
 979                    CSOR_NAND_ECC_MODE_4) {
 980                        layout = &oob_4096_ecc4;
 981                        nand->ecc.strength = 4;
 982                } else {
 983                        layout = &oob_4096_ecc8;
 984                        nand->ecc.strength = 8;
 985                        nand->ecc.bytes = 16;
 986                }
 987
 988                priv->bufnum_mask = 1;
 989                break;
 990
 991        case CSOR_NAND_PGS_8K:
 992                if ((csor & CSOR_NAND_ECC_MODE_MASK) ==
 993                    CSOR_NAND_ECC_MODE_4) {
 994                        layout = &oob_8192_ecc4;
 995                        nand->ecc.strength = 4;
 996                } else {
 997                        layout = &oob_8192_ecc8;
 998                        nand->ecc.strength = 8;
 999                        nand->ecc.bytes = 16;
1000                }
1001
1002                priv->bufnum_mask = 0;
1003                break;
1004
1005
1006        default:
1007                printf("ifc nand: bad csor %#x: bad page size\n", csor);
1008                return -ENODEV;
1009        }
1010
1011        /* Must also set CSOR_NAND_ECC_ENC_EN if DEC_EN set */
1012        if (csor & CSOR_NAND_ECC_DEC_EN) {
1013                nand->ecc.mode = NAND_ECC_HW;
1014                nand->ecc.layout = layout;
1015        } else {
1016                nand->ecc.mode = NAND_ECC_SOFT;
1017        }
1018
1019        ver = ifc_in32(&gregs->ifc_rev);
1020        if (ver >= FSL_IFC_V1_1_0)
1021                ret = fsl_ifc_sram_init(priv, ver);
1022        if (ret)
1023                return ret;
1024
1025        if (ver >= FSL_IFC_V2_0_0)
1026                priv->bufnum_mask = (priv->bufnum_mask * 2) + 1;
1027
1028        ret = nand_scan_ident(mtd, 1, NULL);
1029        if (ret)
1030                return ret;
1031
1032        ret = nand_scan_tail(mtd);
1033        if (ret)
1034                return ret;
1035
1036        ret = nand_register(devnum, mtd);
1037        if (ret)
1038                return ret;
1039        return 0;
1040}
1041
1042#ifndef CONFIG_SYS_NAND_BASE_LIST
1043#define CONFIG_SYS_NAND_BASE_LIST { CONFIG_SYS_NAND_BASE }
1044#endif
1045
1046static unsigned long base_address[CONFIG_SYS_MAX_NAND_DEVICE] =
1047        CONFIG_SYS_NAND_BASE_LIST;
1048
1049void board_nand_init(void)
1050{
1051        int i;
1052
1053        for (i = 0; i < CONFIG_SYS_MAX_NAND_DEVICE; i++)
1054                fsl_ifc_chip_init(i, (u8 *)base_address[i]);
1055}
1056