Lines Matching full:ecc
94 * gen_true_ecc - This function will generate true ECC value, which
97 * @ecc_buf: buffer to store ecc code
99 * @return: re-formatted ECC value
108 * omap_correct_data - Compares the ecc read from nand spare area with ECC
116 * @read_ecc: ecc read from nand flash
117 * @calc_ecc: ecc read from ECC registers
128 /* Regenerate the orginal ECC */ in omap_correct_data()
131 /* Get the XOR of real ecc */ in omap_correct_data()
145 printf("Error: Ecc is wrong\n"); in omap_correct_data()
146 /* ECC itself is corrupted */ in omap_correct_data()
153 * new_ecc: generated ecc while reading data area. in omap_correct_data()
154 * Note: if the ecc = 0, all data bits from which it was in omap_correct_data()
156 * The 3 byte(24 bits) ecc is generated per 512byte in omap_correct_data()
173 * omap_enable_hwecc - configures GPMC as per ECC scheme before read/write
190 /* configure GPMC for specific ecc-scheme */ in omap_enable_hwecc()
211 eccsize0 = 26; /* ECC bits in nibbles per sector */ in omap_enable_hwecc()
212 eccsize1 = 2; /* non-ECC bits in nibbles per sector */ in omap_enable_hwecc()
224 eccsize0 = 52; /* ECC bits in nibbles per sector */ in omap_enable_hwecc()
225 eccsize1 = 0; /* non-ECC bits in nibbles per sector */ in omap_enable_hwecc()
231 /* Clear ecc and enable bits */ in omap_enable_hwecc()
233 /* Configure ecc size for BCH */ in omap_enable_hwecc()
243 (cs << 1) | /* ECC CS */ in omap_enable_hwecc()
244 (0x1)); /* enable ECC */ in omap_enable_hwecc()
249 * omap_calculate_ecc - Read ECC result
253 * Using noninverted ECC can be considered ugly since writing a blank
254 * page ie. padding will clear the ECC bytes. This is no problem as
256 * Reading an erased page will produce an ECC mismatch between
257 * generated and read ECC bytes that has to be dealt with separately.
258 * E.g. if page is 0xFF (fresh erased), and if HW ECC engine within GPMC
259 * is used, the result of read will be 0x0 while the ECC offsets of the
260 * spare area will be 0xFF which will result in an ECC mismatch.
321 /* ECC scheme specific syndrome customizations */ in omap_calculate_ecc()
328 for (i = 0; i < chip->ecc.bytes; i++) in omap_calculate_ecc()
334 ecc_code[chip->ecc.bytes - 1] = 0x00; in omap_calculate_ecc()
482 * omap_correct_data_bch - Compares the ecc read from nand spare area
483 * with ECC registers values and corrects one bit error if it has occurred
487 * @read_ecc: ecc read from nand flash (ignored)
488 * @calc_ecc: ecc read from ECC registers
497 struct nand_ecc_ctrl *ecc = &chip->ecc; in omap_correct_data_bch() local
506 /* check calculated ecc */ in omap_correct_data_bch()
507 for (i = 0; i < ecc->bytes && !ecc_flag; i++) { in omap_correct_data_bch()
516 for (i = 0; i < ecc->bytes && !ecc_flag; i++) { in omap_correct_data_bch()
524 * while reading ECC result we read it in big endian. in omap_correct_data_bch()
530 omap_reverse_list(calc_ecc, ecc->bytes - 1); in omap_correct_data_bch()
534 omap_reverse_list(calc_ecc, ecc->bytes); in omap_correct_data_bch()
549 /* 14th byte in ECC is reserved to match ROM layout */ in omap_correct_data_bch()
550 error_max = SECTOR_BYTES + (ecc->bytes - 1); in omap_correct_data_bch()
553 error_max = SECTOR_BYTES + ecc->bytes; in omap_correct_data_bch()
576 * omap_read_page_bch - hardware ecc based page read function
587 int i, eccsize = chip->ecc.size; in omap_read_page_bch()
588 int eccbytes = chip->ecc.bytes; in omap_read_page_bch()
589 int eccsteps = chip->ecc.steps; in omap_read_page_bch()
593 uint32_t *eccpos = chip->ecc.layout->eccpos; in omap_read_page_bch()
600 oob_pos = (eccsize * eccsteps) + chip->ecc.layout->eccpos[0]; in omap_read_page_bch()
601 oob += chip->ecc.layout->eccpos[0]; in omap_read_page_bch()
605 chip->ecc.hwctl(mtd, NAND_ECC_READ); in omap_read_page_bch()
610 /* read respective ecc from oob area */ in omap_read_page_bch()
614 chip->ecc.calculate(mtd, p, &ecc_calc[i]); in omap_read_page_bch()
620 for (i = 0; i < chip->ecc.total; i++) in omap_read_page_bch()
623 eccsteps = chip->ecc.steps; in omap_read_page_bch()
629 stat = chip->ecc.correct(mtd, p, &ecc_code[i], &ecc_calc[i]); in omap_read_page_bch()
647 * @read_ecc: ecc read from nand flash
648 * @calc_ecc: ecc read from HW ECC registers
664 /* correct data only, not ecc bytes */ in omap_correct_data_bch_sw()
671 * BCH8 have 13 bytes of ECC; BCH4 needs adoption in omap_correct_data_bch_sw()
684 puts("ecc unrecoverable error\n"); in omap_correct_data_bch_sw()
690 * omap_free_bch - Release BCH ecc resources
706 * omap_select_ecc_scheme - configures driver for particular ecc-scheme
708 * @ecc_scheme: ecc scheme to configure
722 /* For this ecc-scheme, ecc.bytes, ecc.layout, ... are in omap_select_ecc_scheme()
723 * initialized in nand_scan_tail(), so just set ecc.mode */ in omap_select_ecc_scheme()
725 nand->ecc.mode = NAND_ECC_SOFT; in omap_select_ecc_scheme()
726 nand->ecc.layout = NULL; in omap_select_ecc_scheme()
727 nand->ecc.size = 0; in omap_select_ecc_scheme()
732 /* check ecc-scheme requirements before updating ecc info */ in omap_select_ecc_scheme()
739 /* populate ecc specific fields */ in omap_select_ecc_scheme()
740 memset(&nand->ecc, 0, sizeof(struct nand_ecc_ctrl)); in omap_select_ecc_scheme()
741 nand->ecc.mode = NAND_ECC_HW; in omap_select_ecc_scheme()
742 nand->ecc.strength = 1; in omap_select_ecc_scheme()
743 nand->ecc.size = SECTOR_BYTES; in omap_select_ecc_scheme()
744 nand->ecc.bytes = 3; in omap_select_ecc_scheme()
745 nand->ecc.hwctl = omap_enable_hwecc; in omap_select_ecc_scheme()
746 nand->ecc.correct = omap_correct_data; in omap_select_ecc_scheme()
747 nand->ecc.calculate = omap_calculate_ecc; in omap_select_ecc_scheme()
748 /* define ecc-layout */ in omap_select_ecc_scheme()
749 ecclayout->eccbytes = nand->ecc.bytes * eccsteps; in omap_select_ecc_scheme()
764 /* check ecc-scheme requirements before updating ecc info */ in omap_select_ecc_scheme()
776 /* populate ecc specific fields */ in omap_select_ecc_scheme()
777 memset(&nand->ecc, 0, sizeof(struct nand_ecc_ctrl)); in omap_select_ecc_scheme()
778 nand->ecc.mode = NAND_ECC_HW; in omap_select_ecc_scheme()
779 nand->ecc.strength = 8; in omap_select_ecc_scheme()
780 nand->ecc.size = SECTOR_BYTES; in omap_select_ecc_scheme()
781 nand->ecc.bytes = 13; in omap_select_ecc_scheme()
782 nand->ecc.hwctl = omap_enable_hwecc; in omap_select_ecc_scheme()
783 nand->ecc.correct = omap_correct_data_bch_sw; in omap_select_ecc_scheme()
784 nand->ecc.calculate = omap_calculate_ecc; in omap_select_ecc_scheme()
785 /* define ecc-layout */ in omap_select_ecc_scheme()
786 ecclayout->eccbytes = nand->ecc.bytes * eccsteps; in omap_select_ecc_scheme()
789 if (i % nand->ecc.bytes) in omap_select_ecc_scheme()
801 printf("nand: error: CONFIG_BCH required for ECC\n"); in omap_select_ecc_scheme()
808 /* check ecc-scheme requirements before updating ecc info */ in omap_select_ecc_scheme()
814 /* intialize ELM for ECC error detection */ in omap_select_ecc_scheme()
817 /* populate ecc specific fields */ in omap_select_ecc_scheme()
818 memset(&nand->ecc, 0, sizeof(struct nand_ecc_ctrl)); in omap_select_ecc_scheme()
819 nand->ecc.mode = NAND_ECC_HW; in omap_select_ecc_scheme()
820 nand->ecc.strength = 8; in omap_select_ecc_scheme()
821 nand->ecc.size = SECTOR_BYTES; in omap_select_ecc_scheme()
822 nand->ecc.bytes = 14; in omap_select_ecc_scheme()
823 nand->ecc.hwctl = omap_enable_hwecc; in omap_select_ecc_scheme()
824 nand->ecc.correct = omap_correct_data_bch; in omap_select_ecc_scheme()
825 nand->ecc.calculate = omap_calculate_ecc; in omap_select_ecc_scheme()
826 nand->ecc.read_page = omap_read_page_bch; in omap_select_ecc_scheme()
827 /* define ecc-layout */ in omap_select_ecc_scheme()
828 ecclayout->eccbytes = nand->ecc.bytes * eccsteps; in omap_select_ecc_scheme()
836 printf("nand: error: CONFIG_NAND_OMAP_ELM required for ECC\n"); in omap_select_ecc_scheme()
843 /* check ecc-scheme requirements before updating ecc info */ in omap_select_ecc_scheme()
849 /* intialize ELM for ECC error detection */ in omap_select_ecc_scheme()
851 /* populate ecc specific fields */ in omap_select_ecc_scheme()
852 nand->ecc.mode = NAND_ECC_HW; in omap_select_ecc_scheme()
853 nand->ecc.size = SECTOR_BYTES; in omap_select_ecc_scheme()
854 nand->ecc.bytes = 26; in omap_select_ecc_scheme()
855 nand->ecc.strength = 16; in omap_select_ecc_scheme()
856 nand->ecc.hwctl = omap_enable_hwecc; in omap_select_ecc_scheme()
857 nand->ecc.correct = omap_correct_data_bch; in omap_select_ecc_scheme()
858 nand->ecc.calculate = omap_calculate_ecc; in omap_select_ecc_scheme()
859 nand->ecc.read_page = omap_read_page_bch; in omap_select_ecc_scheme()
860 /* define ecc-layout */ in omap_select_ecc_scheme()
861 ecclayout->eccbytes = nand->ecc.bytes * eccsteps; in omap_select_ecc_scheme()
865 ecclayout->oobfree[0].length = oobsize - nand->ecc.bytes - in omap_select_ecc_scheme()
869 printf("nand: error: CONFIG_NAND_OMAP_ELM required for ECC\n"); in omap_select_ecc_scheme()
873 debug("nand: error: ecc scheme not enabled or supported\n"); in omap_select_ecc_scheme()
877 /* nand_scan_tail() sets ham1 sw ecc; hw ecc layout is set by driver */ in omap_select_ecc_scheme()
879 nand->ecc.layout = ecclayout; in omap_select_ecc_scheme()
887 * omap_nand_switch_ecc - switch the ECC operation between different engines
908 /* Setup the ecc configurations again */ in omap_nand_switch_ecc()
923 printf("nand: error: unsupported ECC scheme\n"); in omap_nand_switch_ecc()
936 printf("nand: error: unsupported ECC scheme\n"); in omap_nand_switch_ecc()
941 /* Update NAND handling after ECC mode switch */ in omap_nand_switch_ecc()
955 * - ecc.hwctl: function to enable (reset) hardware ecc generator
956 * - ecc.mode: mode of ecc, see defines
1003 nand->ecc.layout = &omap_ecclayout; in board_nand_init()
1014 /* select ECC scheme */ in board_nand_init()
1019 /* pagesize and oobsize are not required to configure sw ecc-scheme */ in board_nand_init()