Lines Matching full:ecc

37 				(0x1 << 6))	/* Disable ECC interrupt */
55 #define ZYNQ_NAND_ECC_CONFIG ((0x1 << 2) | /* ECC available on APB */ \
56 (0x1 << 4) | /* ECC read at end of page */ \
84 /* ECC block registers bit position and bit mask */
85 #define ZYNQ_NAND_ECC_BUSY (1 << 6) /* ECC block is busy */
86 #define ZYNQ_NAND_ECC_MASK 0x00FFFFFF /* ECC value mask */
213 /* bbt decriptors for chips with on-die ECC and
239 * zynq_nand_waitfor_ecc_completion - Wait for ECC completion
287 /* Wait till the ECC operation is complete */ in zynq_nand_init_nand_flash()
302 * zynq_nand_calculate_hwecc - Calculate Hardware ECC
305 * @ecc_code: Pointer to the ECC buffer where ECC data needs to be stored
307 * This function retrieves the Hardware ECC data from the controller and returns
308 * ECC data back to the MTD subsystem.
319 /* Wait till the ECC operation is complete */ in zynq_nand_calculate_hwecc()
327 /* Read ECC value for each block */ in zynq_nand_calculate_hwecc()
330 /* Get the ecc status from ecc read value */ in zynq_nand_calculate_hwecc()
333 /* ECC value valid */ in zynq_nand_calculate_hwecc()
336 /* Copy ECC bytes to MTD buffer */ in zynq_nand_calculate_hwecc()
342 debug("%s: ecc status failed\n", __func__); in zynq_nand_calculate_hwecc()
367 * zynq_nand_correct_data - ECC correction function
370 * @read_ecc: Pointer to the ECC value read from spare data area
371 * @calc_ecc: Pointer to the calculated ECC value
373 * This function corrects the ECC single bit errors & detects 2-bit errors.
375 * returns: 0 if no ECC errors found
377 * -1 if multiple ECC errors found.
476 * zynq_nand_read_page_raw - [Intern] read raw page data without ecc
555 * nand_write_page_hwecc - Hardware ECC based page write function
561 * This functions writes data and hardware generated ECC values in to the page.
566 int i, eccsteps, eccsize = chip->ecc.size; in zynq_nand_write_page_hwecc()
569 u32 *eccpos = chip->ecc.layout->eccpos; in zynq_nand_write_page_hwecc()
574 for (eccsteps = chip->ecc.steps; (eccsteps - 1); eccsteps--) { in zynq_nand_write_page_hwecc()
581 /* Set ECC Last bit to 1 */ in zynq_nand_write_page_hwecc()
587 /* Wait for ECC to be calculated and read the error values */ in zynq_nand_write_page_hwecc()
589 chip->ecc.calculate(mtd, p, &ecc_calc[0]); in zynq_nand_write_page_hwecc()
591 for (i = 0; i < chip->ecc.total; i++) in zynq_nand_write_page_hwecc()
594 /* Clear ECC last bit */ in zynq_nand_write_page_hwecc()
599 /* Write the spare area with ECC bytes */ in zynq_nand_write_page_hwecc()
614 * zynq_nand_write_page_swecc - [REPLACABLE] software ecc based page
624 int i, eccsize = chip->ecc.size; in zynq_nand_write_page_swecc()
625 int eccbytes = chip->ecc.bytes; in zynq_nand_write_page_swecc()
626 int eccsteps = chip->ecc.steps; in zynq_nand_write_page_swecc()
629 u32 *eccpos = chip->ecc.layout->eccpos; in zynq_nand_write_page_swecc()
631 /* Software ecc calculation */ in zynq_nand_write_page_swecc()
633 chip->ecc.calculate(mtd, p, &ecc_calc[i]); in zynq_nand_write_page_swecc()
635 for (i = 0; i < chip->ecc.total; i++) in zynq_nand_write_page_swecc()
638 return chip->ecc.write_page_raw(mtd, chip, buf, 1, page); in zynq_nand_write_page_swecc()
642 * nand_read_page_hwecc - Hardware ECC based page read function
650 * generated ECC values and read ECC values from spare area.
652 * returns: 0 always and updates ECC operation status in to MTD structure
657 int i, stat, eccsteps, eccsize = chip->ecc.size; in zynq_nand_read_page_hwecc()
658 int eccbytes = chip->ecc.bytes; in zynq_nand_read_page_hwecc()
662 u32 *eccpos = chip->ecc.layout->eccpos; in zynq_nand_read_page_hwecc()
667 for (eccsteps = chip->ecc.steps; (eccsteps - 1); eccsteps--) { in zynq_nand_read_page_hwecc()
674 /* Set ECC Last bit to 1 */ in zynq_nand_read_page_hwecc()
680 /* Read the calculated ECC value */ in zynq_nand_read_page_hwecc()
682 chip->ecc.calculate(mtd, p, &ecc_calc[0]); in zynq_nand_read_page_hwecc()
684 /* Clear ECC last bit */ in zynq_nand_read_page_hwecc()
689 /* Read the stored ECC value */ in zynq_nand_read_page_hwecc()
701 for (i = 0; i < chip->ecc.total; i++) in zynq_nand_read_page_hwecc()
704 eccsteps = chip->ecc.steps; in zynq_nand_read_page_hwecc()
707 /* Check ECC error for all blocks and correct if it is correctable */ in zynq_nand_read_page_hwecc()
709 stat = chip->ecc.correct(mtd, p, &ecc_code[i], &ecc_calc[i]); in zynq_nand_read_page_hwecc()
719 * zynq_nand_read_page_swecc - [REPLACABLE] software ecc based page
729 int i, eccsize = chip->ecc.size; in zynq_nand_read_page_swecc()
730 int eccbytes = chip->ecc.bytes; in zynq_nand_read_page_swecc()
731 int eccsteps = chip->ecc.steps; in zynq_nand_read_page_swecc()
735 u32 *eccpos = chip->ecc.layout->eccpos; in zynq_nand_read_page_swecc()
737 chip->ecc.read_page_raw(mtd, chip, buf, 1, page); in zynq_nand_read_page_swecc()
740 chip->ecc.calculate(mtd, p, &ecc_calc[i]); in zynq_nand_read_page_swecc()
742 for (i = 0; i < chip->ecc.total; i++) in zynq_nand_read_page_swecc()
745 eccsteps = chip->ecc.steps; in zynq_nand_read_page_swecc()
751 stat = chip->ecc.correct(mtd, p, &ecc_code[i], &ecc_calc[i]); in zynq_nand_read_page_swecc()
1143 debug("%s: OnDie ECC flash\n", __func__); in zynq_nand_init()
1146 printf("%s: Unable to detect OnDie ECC\n", __func__); in zynq_nand_init()
1151 /* Bypass the controller ECC block */ in zynq_nand_init()
1156 /* The software ECC routines won't work in zynq_nand_init()
1159 nand_chip->ecc.mode = NAND_ECC_HW; in zynq_nand_init()
1160 nand_chip->ecc.strength = 1; in zynq_nand_init()
1161 nand_chip->ecc.read_page = zynq_nand_read_page_raw_nooob; in zynq_nand_init()
1162 nand_chip->ecc.read_subpage = zynq_nand_read_subpage_raw; in zynq_nand_init()
1163 nand_chip->ecc.write_page = zynq_nand_write_page_raw; in zynq_nand_init()
1164 nand_chip->ecc.read_page_raw = zynq_nand_read_page_raw; in zynq_nand_init()
1165 nand_chip->ecc.write_page_raw = zynq_nand_write_page_raw; in zynq_nand_init()
1166 nand_chip->ecc.read_oob = zynq_nand_read_oob; in zynq_nand_init()
1167 nand_chip->ecc.write_oob = zynq_nand_write_oob; in zynq_nand_init()
1168 nand_chip->ecc.size = mtd->writesize; in zynq_nand_init()
1169 nand_chip->ecc.bytes = 0; in zynq_nand_init()
1171 /* NAND with on-die ECC supports subpage reads */ in zynq_nand_init()
1174 /* On-Die ECC spare bytes offset 8 is used for ECC codes */ in zynq_nand_init()
1176 nand_chip->ecc.layout = &ondie_nand_oob_64; in zynq_nand_init()
1182 /* Hardware ECC generates 3 bytes ECC code for each 512 bytes */ in zynq_nand_init()
1183 nand_chip->ecc.mode = NAND_ECC_HW; in zynq_nand_init()
1184 nand_chip->ecc.strength = 1; in zynq_nand_init()
1185 nand_chip->ecc.size = ZYNQ_NAND_ECC_SIZE; in zynq_nand_init()
1186 nand_chip->ecc.bytes = 3; in zynq_nand_init()
1187 nand_chip->ecc.calculate = zynq_nand_calculate_hwecc; in zynq_nand_init()
1188 nand_chip->ecc.correct = zynq_nand_correct_data; in zynq_nand_init()
1189 nand_chip->ecc.hwctl = NULL; in zynq_nand_init()
1190 nand_chip->ecc.read_page = zynq_nand_read_page_hwecc; in zynq_nand_init()
1191 nand_chip->ecc.write_page = zynq_nand_write_page_hwecc; in zynq_nand_init()
1192 nand_chip->ecc.read_page_raw = zynq_nand_read_page_raw; in zynq_nand_init()
1193 nand_chip->ecc.write_page_raw = zynq_nand_write_page_raw; in zynq_nand_init()
1194 nand_chip->ecc.read_oob = zynq_nand_read_oob; in zynq_nand_init()
1195 nand_chip->ecc.write_oob = zynq_nand_write_oob; in zynq_nand_init()
1200 /* Set the ECC memory config register */ in zynq_nand_init()
1206 /* Set the ECC memory config register */ in zynq_nand_init()
1212 /* Set the ECC memory config register */ in zynq_nand_init()
1217 nand_chip->ecc.mode = NAND_ECC_SOFT; in zynq_nand_init()
1218 nand_chip->ecc.calculate = nand_calculate_ecc; in zynq_nand_init()
1219 nand_chip->ecc.correct = nand_correct_data; in zynq_nand_init()
1220 nand_chip->ecc.read_page = zynq_nand_read_page_swecc; in zynq_nand_init()
1221 nand_chip->ecc.write_page = zynq_nand_write_page_swecc; in zynq_nand_init()
1222 nand_chip->ecc.size = 256; in zynq_nand_init()
1227 nand_chip->ecc.layout = &nand_oob_16; in zynq_nand_init()
1229 nand_chip->ecc.layout = &nand_oob_64; in zynq_nand_init()