Lines Matching full:ecc
93 * gen_true_ecc - This function will generate true ECC value, which
96 * @ecc_buf: buffer to store ecc code
98 * @return: re-formatted ECC value
107 * omap_correct_data - Compares the ecc read from nand spare area with ECC
115 * @read_ecc: ecc read from nand flash
116 * @calc_ecc: ecc read from ECC registers
127 /* Regenerate the orginal ECC */ in omap_correct_data()
130 /* Get the XOR of real ecc */ in omap_correct_data()
144 printf("Error: Ecc is wrong\n"); in omap_correct_data()
145 /* ECC itself is corrupted */ in omap_correct_data()
152 * new_ecc: generated ecc while reading data area. in omap_correct_data()
153 * Note: if the ecc = 0, all data bits from which it was in omap_correct_data()
155 * The 3 byte(24 bits) ecc is generated per 512byte in omap_correct_data()
172 * omap_enable_hwecc - configures GPMC as per ECC scheme before read/write
189 /* configure GPMC for specific ecc-scheme */ in omap_enable_hwecc()
210 eccsize0 = 26; /* ECC bits in nibbles per sector */ in omap_enable_hwecc()
211 eccsize1 = 2; /* non-ECC bits in nibbles per sector */ in omap_enable_hwecc()
223 eccsize0 = 52; /* ECC bits in nibbles per sector */ in omap_enable_hwecc()
224 eccsize1 = 0; /* non-ECC bits in nibbles per sector */ in omap_enable_hwecc()
230 /* Clear ecc and enable bits */ in omap_enable_hwecc()
232 /* Configure ecc size for BCH */ in omap_enable_hwecc()
242 (cs << 1) | /* ECC CS */ in omap_enable_hwecc()
243 (0x1)); /* enable ECC */ in omap_enable_hwecc()
248 * omap_calculate_ecc - Read ECC result
252 * Using noninverted ECC can be considered ugly since writing a blank
253 * page ie. padding will clear the ECC bytes. This is no problem as
255 * Reading an erased page will produce an ECC mismatch between
256 * generated and read ECC bytes that has to be dealt with separately.
257 * E.g. if page is 0xFF (fresh erased), and if HW ECC engine within GPMC
258 * is used, the result of read will be 0x0 while the ECC offsets of the
259 * spare area will be 0xFF which will result in an ECC mismatch.
320 /* ECC scheme specific syndrome customizations */ in omap_calculate_ecc()
327 for (i = 0; i < chip->ecc.bytes; i++) in omap_calculate_ecc()
333 ecc_code[chip->ecc.bytes - 1] = 0x00; in omap_calculate_ecc()
481 * omap_correct_data_bch - Compares the ecc read from nand spare area
482 * with ECC registers values and corrects one bit error if it has occurred
486 * @read_ecc: ecc read from nand flash (ignored)
487 * @calc_ecc: ecc read from ECC registers
496 struct nand_ecc_ctrl *ecc = &chip->ecc; in omap_correct_data_bch() local
505 /* check calculated ecc */ in omap_correct_data_bch()
506 for (i = 0; i < ecc->bytes && !ecc_flag; i++) { in omap_correct_data_bch()
515 for (i = 0; i < ecc->bytes && !ecc_flag; i++) { in omap_correct_data_bch()
523 * while reading ECC result we read it in big endian. in omap_correct_data_bch()
529 omap_reverse_list(calc_ecc, ecc->bytes - 1); in omap_correct_data_bch()
533 omap_reverse_list(calc_ecc, ecc->bytes); in omap_correct_data_bch()
548 /* 14th byte in ECC is reserved to match ROM layout */ in omap_correct_data_bch()
549 error_max = SECTOR_BYTES + (ecc->bytes - 1); in omap_correct_data_bch()
552 error_max = SECTOR_BYTES + ecc->bytes; in omap_correct_data_bch()
575 * omap_read_page_bch - hardware ecc based page read function
586 int i, eccsize = chip->ecc.size; in omap_read_page_bch()
587 int eccbytes = chip->ecc.bytes; in omap_read_page_bch()
588 int eccsteps = chip->ecc.steps; in omap_read_page_bch()
592 uint32_t *eccpos = chip->ecc.layout->eccpos; in omap_read_page_bch()
599 oob_pos = (eccsize * eccsteps) + chip->ecc.layout->eccpos[0]; in omap_read_page_bch()
600 oob += chip->ecc.layout->eccpos[0]; in omap_read_page_bch()
604 chip->ecc.hwctl(mtd, NAND_ECC_READ); in omap_read_page_bch()
609 /* read respective ecc from oob area */ in omap_read_page_bch()
613 chip->ecc.calculate(mtd, p, &ecc_calc[i]); in omap_read_page_bch()
619 for (i = 0; i < chip->ecc.total; i++) in omap_read_page_bch()
622 eccsteps = chip->ecc.steps; in omap_read_page_bch()
628 stat = chip->ecc.correct(mtd, p, &ecc_code[i], &ecc_calc[i]); in omap_read_page_bch()
646 * @read_ecc: ecc read from nand flash
647 * @calc_ecc: ecc read from HW ECC registers
663 /* correct data only, not ecc bytes */ in omap_correct_data_bch_sw()
670 * BCH8 have 13 bytes of ECC; BCH4 needs adoption in omap_correct_data_bch_sw()
683 puts("ecc unrecoverable error\n"); in omap_correct_data_bch_sw()
689 * omap_free_bch - Release BCH ecc resources
705 * omap_select_ecc_scheme - configures driver for particular ecc-scheme
707 * @ecc_scheme: ecc scheme to configure
721 /* For this ecc-scheme, ecc.bytes, ecc.layout, ... are in omap_select_ecc_scheme()
722 * initialized in nand_scan_tail(), so just set ecc.mode */ in omap_select_ecc_scheme()
724 nand->ecc.mode = NAND_ECC_SOFT; in omap_select_ecc_scheme()
725 nand->ecc.layout = NULL; in omap_select_ecc_scheme()
726 nand->ecc.size = 0; in omap_select_ecc_scheme()
731 /* check ecc-scheme requirements before updating ecc info */ in omap_select_ecc_scheme()
738 /* populate ecc specific fields */ in omap_select_ecc_scheme()
739 memset(&nand->ecc, 0, sizeof(struct nand_ecc_ctrl)); in omap_select_ecc_scheme()
740 nand->ecc.mode = NAND_ECC_HW; in omap_select_ecc_scheme()
741 nand->ecc.strength = 1; in omap_select_ecc_scheme()
742 nand->ecc.size = SECTOR_BYTES; in omap_select_ecc_scheme()
743 nand->ecc.bytes = 3; in omap_select_ecc_scheme()
744 nand->ecc.hwctl = omap_enable_hwecc; in omap_select_ecc_scheme()
745 nand->ecc.correct = omap_correct_data; in omap_select_ecc_scheme()
746 nand->ecc.calculate = omap_calculate_ecc; in omap_select_ecc_scheme()
747 /* define ecc-layout */ in omap_select_ecc_scheme()
748 ecclayout->eccbytes = nand->ecc.bytes * eccsteps; in omap_select_ecc_scheme()
763 /* check ecc-scheme requirements before updating ecc info */ in omap_select_ecc_scheme()
775 /* populate ecc specific fields */ in omap_select_ecc_scheme()
776 memset(&nand->ecc, 0, sizeof(struct nand_ecc_ctrl)); in omap_select_ecc_scheme()
777 nand->ecc.mode = NAND_ECC_HW; in omap_select_ecc_scheme()
778 nand->ecc.strength = 8; in omap_select_ecc_scheme()
779 nand->ecc.size = SECTOR_BYTES; in omap_select_ecc_scheme()
780 nand->ecc.bytes = 13; in omap_select_ecc_scheme()
781 nand->ecc.hwctl = omap_enable_hwecc; in omap_select_ecc_scheme()
782 nand->ecc.correct = omap_correct_data_bch_sw; in omap_select_ecc_scheme()
783 nand->ecc.calculate = omap_calculate_ecc; in omap_select_ecc_scheme()
784 /* define ecc-layout */ in omap_select_ecc_scheme()
785 ecclayout->eccbytes = nand->ecc.bytes * eccsteps; in omap_select_ecc_scheme()
788 if (i % nand->ecc.bytes) in omap_select_ecc_scheme()
800 printf("nand: error: CONFIG_BCH required for ECC\n"); in omap_select_ecc_scheme()
807 /* check ecc-scheme requirements before updating ecc info */ in omap_select_ecc_scheme()
813 /* intialize ELM for ECC error detection */ in omap_select_ecc_scheme()
816 /* populate ecc specific fields */ in omap_select_ecc_scheme()
817 memset(&nand->ecc, 0, sizeof(struct nand_ecc_ctrl)); in omap_select_ecc_scheme()
818 nand->ecc.mode = NAND_ECC_HW; in omap_select_ecc_scheme()
819 nand->ecc.strength = 8; in omap_select_ecc_scheme()
820 nand->ecc.size = SECTOR_BYTES; in omap_select_ecc_scheme()
821 nand->ecc.bytes = 14; in omap_select_ecc_scheme()
822 nand->ecc.hwctl = omap_enable_hwecc; in omap_select_ecc_scheme()
823 nand->ecc.correct = omap_correct_data_bch; in omap_select_ecc_scheme()
824 nand->ecc.calculate = omap_calculate_ecc; in omap_select_ecc_scheme()
825 nand->ecc.read_page = omap_read_page_bch; in omap_select_ecc_scheme()
826 /* define ecc-layout */ in omap_select_ecc_scheme()
827 ecclayout->eccbytes = nand->ecc.bytes * eccsteps; in omap_select_ecc_scheme()
835 printf("nand: error: CONFIG_NAND_OMAP_ELM required for ECC\n"); in omap_select_ecc_scheme()
842 /* check ecc-scheme requirements before updating ecc info */ in omap_select_ecc_scheme()
848 /* intialize ELM for ECC error detection */ in omap_select_ecc_scheme()
850 /* populate ecc specific fields */ in omap_select_ecc_scheme()
851 nand->ecc.mode = NAND_ECC_HW; in omap_select_ecc_scheme()
852 nand->ecc.size = SECTOR_BYTES; in omap_select_ecc_scheme()
853 nand->ecc.bytes = 26; in omap_select_ecc_scheme()
854 nand->ecc.strength = 16; in omap_select_ecc_scheme()
855 nand->ecc.hwctl = omap_enable_hwecc; in omap_select_ecc_scheme()
856 nand->ecc.correct = omap_correct_data_bch; in omap_select_ecc_scheme()
857 nand->ecc.calculate = omap_calculate_ecc; in omap_select_ecc_scheme()
858 nand->ecc.read_page = omap_read_page_bch; in omap_select_ecc_scheme()
859 /* define ecc-layout */ in omap_select_ecc_scheme()
860 ecclayout->eccbytes = nand->ecc.bytes * eccsteps; in omap_select_ecc_scheme()
864 ecclayout->oobfree[0].length = oobsize - nand->ecc.bytes - in omap_select_ecc_scheme()
868 printf("nand: error: CONFIG_NAND_OMAP_ELM required for ECC\n"); in omap_select_ecc_scheme()
872 debug("nand: error: ecc scheme not enabled or supported\n"); in omap_select_ecc_scheme()
876 /* nand_scan_tail() sets ham1 sw ecc; hw ecc layout is set by driver */ in omap_select_ecc_scheme()
878 nand->ecc.layout = ecclayout; in omap_select_ecc_scheme()
886 * omap_nand_switch_ecc - switch the ECC operation between different engines
907 /* Setup the ecc configurations again */ in omap_nand_switch_ecc()
922 printf("nand: error: unsupported ECC scheme\n"); in omap_nand_switch_ecc()
935 printf("nand: error: unsupported ECC scheme\n"); in omap_nand_switch_ecc()
940 /* Update NAND handling after ECC mode switch */ in omap_nand_switch_ecc()
954 * - ecc.hwctl: function to enable (reset) hardware ecc generator
955 * - ecc.mode: mode of ecc, see defines
1002 nand->ecc.layout = &omap_ecclayout; in board_nand_init()
1013 /* select ECC scheme */ in board_nand_init()
1018 /* pagesize and oobsize are not required to configure sw ecc-scheme */ in board_nand_init()