Lines Matching full:ecc
33 * The 1-bit ECC hardware is supported, as well as the newer 4-bit ECC
85 * 1-bit hardware ECC ... context maintained for each core chipselect
104 /* Reset ECC hardware */ in nand_davinci_hwctl_1bit()
109 /* Restart ECC hardware */ in nand_davinci_hwctl_1bit()
118 * Read hardware ECC value and pack into three bytes
126 /* invert so that erased block ecc is correct */ in nand_davinci_calculate_1bit()
147 if ((diff >> (12 + 3)) < chip->ecc.size) { in nand_davinci_correct_1bit()
154 /* Single bit ECC error in the ECC itself, in nand_davinci_correct_1bit()
169 * 4-bit hardware ECC ... context maintained over entire AEMIF
174 * Also, and specific to this hardware, it ECC-protects the "prepad"
175 * in the OOB ... while having ECC protection for parts of OOB would
177 * OOB without recomputing ECC.
186 /* Reset ECC hardware */ in nand_davinci_hwctl_4bit()
191 /* Start 4-bit ECC calculation for read/write */ in nand_davinci_hwctl_4bit()
202 /* Read raw ECC code after writing to NAND. */
214 /* Terminate read ECC; or return ECC (as bytes) of data written to NAND. */
222 /* After a read, terminate ECC calculation by a dummy read in nand_davinci_calculate_4bit()
223 * of some 4-bit ECC register. ECC covers everything that in nand_davinci_calculate_4bit()
232 /* Pack eight raw 10-bit ecc values into ten bytes, making in nand_davinci_calculate_4bit()
280 /* Tell ECC controller about the expected ECC codes. */ in nand_davinci_correct_4bit()
311 * long as ECC_STATE reads less than 4. After that, ECC HW has entered in nand_davinci_correct_4bit()
375 * nand_read_page_hwecc_oob_first - hw ecc, read oob first
381 * Hardware ECC for large page chips, require OOB to be read first. For this
382 * ECC mode, the write_page method is re-used from ECC_HW. These methods
383 * read/write ECC from the OOB area, unlike the ECC_HW_SYNDROME support with
384 * multiple ECC steps, follows the "infix ECC" scheme and reads/writes ECC from
392 int i, eccsize = chip->ecc.size, ret; in nand_davinci_read_page_hwecc_oob_first()
393 int eccbytes = chip->ecc.bytes; in nand_davinci_read_page_hwecc_oob_first()
394 int eccsteps = chip->ecc.steps; in nand_davinci_read_page_hwecc_oob_first()
396 uint8_t *ecc_code = chip->ecc.code_buf; in nand_davinci_read_page_hwecc_oob_first()
397 uint8_t *ecc_calc = chip->ecc.calc_buf; in nand_davinci_read_page_hwecc_oob_first()
410 chip->ecc.total); in nand_davinci_read_page_hwecc_oob_first()
417 chip->ecc.hwctl(chip, NAND_ECC_READ); in nand_davinci_read_page_hwecc_oob_first()
423 chip->ecc.calculate(chip, p, &ecc_calc[i]); in nand_davinci_read_page_hwecc_oob_first()
425 stat = chip->ecc.correct(chip, p, &ecc_code[i], NULL); in nand_davinci_read_page_hwecc_oob_first()
427 (chip->ecc.options & NAND_ECC_GENERIC_ERASED_CHECK)) { in nand_davinci_read_page_hwecc_oob_first()
432 chip->ecc.strength); in nand_davinci_read_page_hwecc_oob_first()
447 /* An ECC layout for using 4-bit ECC with small-page flash, storing
448 * ten ECC bytes plus the manufacturer's bad block marker byte, and
489 .ecc = hwecc4_ooblayout_small_ecc,
531 "ti,davinci-ecc-mode", &mode)) { in nand_davinci_get_pdata()
540 "ti,davinci-ecc-bits", &prop)) in nand_davinci_get_pdata()
553 * use of 4-bit hardware ECC with subpages and verified on in nand_davinci_get_pdata()
588 /* Use board-specific ECC config */ in davinci_nand_attach_chip()
589 info->chip.ecc.engine_type = pdata->engine_type; in davinci_nand_attach_chip()
590 info->chip.ecc.placement = pdata->ecc_placement; in davinci_nand_attach_chip()
592 switch (info->chip.ecc.engine_type) { in davinci_nand_attach_chip()
599 * This driver expects Hamming based ECC when engine_type is set in davinci_nand_attach_chip()
600 * to NAND_ECC_ENGINE_TYPE_SOFT. Force ecc.algo to in davinci_nand_attach_chip()
604 info->chip.ecc.algo = NAND_ECC_ALGO_HAMMING; in davinci_nand_attach_chip()
631 info->chip.ecc.calculate = nand_davinci_calculate_4bit; in davinci_nand_attach_chip()
632 info->chip.ecc.correct = nand_davinci_correct_4bit; in davinci_nand_attach_chip()
633 info->chip.ecc.hwctl = nand_davinci_hwctl_4bit; in davinci_nand_attach_chip()
634 info->chip.ecc.bytes = 10; in davinci_nand_attach_chip()
635 info->chip.ecc.options = NAND_ECC_GENERIC_ERASED_CHECK; in davinci_nand_attach_chip()
636 info->chip.ecc.algo = NAND_ECC_ALGO_BCH; in davinci_nand_attach_chip()
639 * Update ECC layout if needed ... for 1-bit HW ECC, the in davinci_nand_attach_chip()
641 * are needed (for each 512 bytes). For 4-bit HW ECC, in davinci_nand_attach_chip()
654 info->chip.ecc.read_page = nand_davinci_read_page_hwecc_oob_first; in davinci_nand_attach_chip()
659 /* 1bit ecc hamming */ in davinci_nand_attach_chip()
660 info->chip.ecc.calculate = nand_davinci_calculate_1bit; in davinci_nand_attach_chip()
661 info->chip.ecc.correct = nand_davinci_correct_1bit; in davinci_nand_attach_chip()
662 info->chip.ecc.hwctl = nand_davinci_hwctl_1bit; in davinci_nand_attach_chip()
663 info->chip.ecc.bytes = 3; in davinci_nand_attach_chip()
664 info->chip.ecc.algo = NAND_ECC_ALGO_HAMMING; in davinci_nand_attach_chip()
666 info->chip.ecc.size = 512; in davinci_nand_attach_chip()
667 info->chip.ecc.strength = pdata->ecc_bits; in davinci_nand_attach_chip()
902 if (info->chip.ecc.placement == NAND_ECC_PLACEMENT_INTERLEAVED) in nand_davinci_remove()