Lines Matching full:ecc

36 				(0x1 << 6))	/* Disable ECC interrupt */
54 #define ZYNQ_NAND_ECC_CONFIG ((0x1 << 2) | /* ECC available on APB */ \
55 (0x1 << 4) | /* ECC read at end of page */ \
83 /* ECC block registers bit position and bit mask */
84 #define ZYNQ_NAND_ECC_BUSY (1 << 6) /* ECC block is busy */
85 #define ZYNQ_NAND_ECC_MASK 0x00FFFFFF /* ECC value mask */
212 /* bbt decriptors for chips with on-die ECC and
238 * zynq_nand_waitfor_ecc_completion - Wait for ECC completion
286 /* Wait till the ECC operation is complete */ in zynq_nand_init_nand_flash()
301 * zynq_nand_calculate_hwecc - Calculate Hardware ECC
304 * @ecc_code: Pointer to the ECC buffer where ECC data needs to be stored
306 * This function retrieves the Hardware ECC data from the controller and returns
307 * ECC data back to the MTD subsystem.
318 /* Wait till the ECC operation is complete */ in zynq_nand_calculate_hwecc()
326 /* Read ECC value for each block */ in zynq_nand_calculate_hwecc()
329 /* Get the ecc status from ecc read value */ in zynq_nand_calculate_hwecc()
332 /* ECC value valid */ in zynq_nand_calculate_hwecc()
335 /* Copy ECC bytes to MTD buffer */ in zynq_nand_calculate_hwecc()
341 debug("%s: ecc status failed\n", __func__); in zynq_nand_calculate_hwecc()
366 * zynq_nand_correct_data - ECC correction function
369 * @read_ecc: Pointer to the ECC value read from spare data area
370 * @calc_ecc: Pointer to the calculated ECC value
372 * This function corrects the ECC single bit errors & detects 2-bit errors.
374 * returns: 0 if no ECC errors found
376 * -1 if multiple ECC errors found.
475 * zynq_nand_read_page_raw - [Intern] read raw page data without ecc
554 * nand_write_page_hwecc - Hardware ECC based page write function
560 * This functions writes data and hardware generated ECC values in to the page.
565 int i, eccsteps, eccsize = chip->ecc.size; in zynq_nand_write_page_hwecc()
568 u32 *eccpos = chip->ecc.layout->eccpos; in zynq_nand_write_page_hwecc()
573 for (eccsteps = chip->ecc.steps; (eccsteps - 1); eccsteps--) { in zynq_nand_write_page_hwecc()
580 /* Set ECC Last bit to 1 */ in zynq_nand_write_page_hwecc()
586 /* Wait for ECC to be calculated and read the error values */ in zynq_nand_write_page_hwecc()
588 chip->ecc.calculate(mtd, p, &ecc_calc[0]); in zynq_nand_write_page_hwecc()
590 for (i = 0; i < chip->ecc.total; i++) in zynq_nand_write_page_hwecc()
593 /* Clear ECC last bit */ in zynq_nand_write_page_hwecc()
598 /* Write the spare area with ECC bytes */ in zynq_nand_write_page_hwecc()
613 * zynq_nand_write_page_swecc - [REPLACABLE] software ecc based page
623 int i, eccsize = chip->ecc.size; in zynq_nand_write_page_swecc()
624 int eccbytes = chip->ecc.bytes; in zynq_nand_write_page_swecc()
625 int eccsteps = chip->ecc.steps; in zynq_nand_write_page_swecc()
628 u32 *eccpos = chip->ecc.layout->eccpos; in zynq_nand_write_page_swecc()
630 /* Software ecc calculation */ in zynq_nand_write_page_swecc()
632 chip->ecc.calculate(mtd, p, &ecc_calc[i]); in zynq_nand_write_page_swecc()
634 for (i = 0; i < chip->ecc.total; i++) in zynq_nand_write_page_swecc()
637 return chip->ecc.write_page_raw(mtd, chip, buf, 1, page); in zynq_nand_write_page_swecc()
641 * nand_read_page_hwecc - Hardware ECC based page read function
649 * generated ECC values and read ECC values from spare area.
651 * returns: 0 always and updates ECC operation status in to MTD structure
656 int i, stat, eccsteps, eccsize = chip->ecc.size; in zynq_nand_read_page_hwecc()
657 int eccbytes = chip->ecc.bytes; in zynq_nand_read_page_hwecc()
661 u32 *eccpos = chip->ecc.layout->eccpos; in zynq_nand_read_page_hwecc()
666 for (eccsteps = chip->ecc.steps; (eccsteps - 1); eccsteps--) { in zynq_nand_read_page_hwecc()
673 /* Set ECC Last bit to 1 */ in zynq_nand_read_page_hwecc()
679 /* Read the calculated ECC value */ in zynq_nand_read_page_hwecc()
681 chip->ecc.calculate(mtd, p, &ecc_calc[0]); in zynq_nand_read_page_hwecc()
683 /* Clear ECC last bit */ in zynq_nand_read_page_hwecc()
688 /* Read the stored ECC value */ in zynq_nand_read_page_hwecc()
700 for (i = 0; i < chip->ecc.total; i++) in zynq_nand_read_page_hwecc()
703 eccsteps = chip->ecc.steps; in zynq_nand_read_page_hwecc()
706 /* Check ECC error for all blocks and correct if it is correctable */ in zynq_nand_read_page_hwecc()
708 stat = chip->ecc.correct(mtd, p, &ecc_code[i], &ecc_calc[i]); in zynq_nand_read_page_hwecc()
718 * zynq_nand_read_page_swecc - [REPLACABLE] software ecc based page
728 int i, eccsize = chip->ecc.size; in zynq_nand_read_page_swecc()
729 int eccbytes = chip->ecc.bytes; in zynq_nand_read_page_swecc()
730 int eccsteps = chip->ecc.steps; in zynq_nand_read_page_swecc()
734 u32 *eccpos = chip->ecc.layout->eccpos; in zynq_nand_read_page_swecc()
736 chip->ecc.read_page_raw(mtd, chip, buf, 1, page); in zynq_nand_read_page_swecc()
739 chip->ecc.calculate(mtd, p, &ecc_calc[i]); in zynq_nand_read_page_swecc()
741 for (i = 0; i < chip->ecc.total; i++) in zynq_nand_read_page_swecc()
744 eccsteps = chip->ecc.steps; in zynq_nand_read_page_swecc()
750 stat = chip->ecc.correct(mtd, p, &ecc_code[i], &ecc_calc[i]); in zynq_nand_read_page_swecc()
1142 debug("%s: OnDie ECC flash\n", __func__); in zynq_nand_init()
1145 printf("%s: Unable to detect OnDie ECC\n", __func__); in zynq_nand_init()
1150 /* Bypass the controller ECC block */ in zynq_nand_init()
1155 /* The software ECC routines won't work in zynq_nand_init()
1158 nand_chip->ecc.mode = NAND_ECC_HW; in zynq_nand_init()
1159 nand_chip->ecc.strength = 1; in zynq_nand_init()
1160 nand_chip->ecc.read_page = zynq_nand_read_page_raw_nooob; in zynq_nand_init()
1161 nand_chip->ecc.read_subpage = zynq_nand_read_subpage_raw; in zynq_nand_init()
1162 nand_chip->ecc.write_page = zynq_nand_write_page_raw; in zynq_nand_init()
1163 nand_chip->ecc.read_page_raw = zynq_nand_read_page_raw; in zynq_nand_init()
1164 nand_chip->ecc.write_page_raw = zynq_nand_write_page_raw; in zynq_nand_init()
1165 nand_chip->ecc.read_oob = zynq_nand_read_oob; in zynq_nand_init()
1166 nand_chip->ecc.write_oob = zynq_nand_write_oob; in zynq_nand_init()
1167 nand_chip->ecc.size = mtd->writesize; in zynq_nand_init()
1168 nand_chip->ecc.bytes = 0; in zynq_nand_init()
1170 /* NAND with on-die ECC supports subpage reads */ in zynq_nand_init()
1173 /* On-Die ECC spare bytes offset 8 is used for ECC codes */ in zynq_nand_init()
1175 nand_chip->ecc.layout = &ondie_nand_oob_64; in zynq_nand_init()
1181 /* Hardware ECC generates 3 bytes ECC code for each 512 bytes */ in zynq_nand_init()
1182 nand_chip->ecc.mode = NAND_ECC_HW; in zynq_nand_init()
1183 nand_chip->ecc.strength = 1; in zynq_nand_init()
1184 nand_chip->ecc.size = ZYNQ_NAND_ECC_SIZE; in zynq_nand_init()
1185 nand_chip->ecc.bytes = 3; in zynq_nand_init()
1186 nand_chip->ecc.calculate = zynq_nand_calculate_hwecc; in zynq_nand_init()
1187 nand_chip->ecc.correct = zynq_nand_correct_data; in zynq_nand_init()
1188 nand_chip->ecc.hwctl = NULL; in zynq_nand_init()
1189 nand_chip->ecc.read_page = zynq_nand_read_page_hwecc; in zynq_nand_init()
1190 nand_chip->ecc.write_page = zynq_nand_write_page_hwecc; in zynq_nand_init()
1191 nand_chip->ecc.read_page_raw = zynq_nand_read_page_raw; in zynq_nand_init()
1192 nand_chip->ecc.write_page_raw = zynq_nand_write_page_raw; in zynq_nand_init()
1193 nand_chip->ecc.read_oob = zynq_nand_read_oob; in zynq_nand_init()
1194 nand_chip->ecc.write_oob = zynq_nand_write_oob; in zynq_nand_init()
1199 /* Set the ECC memory config register */ in zynq_nand_init()
1205 /* Set the ECC memory config register */ in zynq_nand_init()
1211 /* Set the ECC memory config register */ in zynq_nand_init()
1216 nand_chip->ecc.mode = NAND_ECC_SOFT; in zynq_nand_init()
1217 nand_chip->ecc.calculate = nand_calculate_ecc; in zynq_nand_init()
1218 nand_chip->ecc.correct = nand_correct_data; in zynq_nand_init()
1219 nand_chip->ecc.read_page = zynq_nand_read_page_swecc; in zynq_nand_init()
1220 nand_chip->ecc.write_page = zynq_nand_write_page_swecc; in zynq_nand_init()
1221 nand_chip->ecc.size = 256; in zynq_nand_init()
1226 nand_chip->ecc.layout = &nand_oob_16; in zynq_nand_init()
1228 nand_chip->ecc.layout = &nand_oob_64; in zynq_nand_init()