浏览代码

spl mxc nand: Fix broken boot for correctable ECC errors

Do not stop boot as soon as an ECC error is detected. Only stop boot for
uncorrectable ECC errors.

This fixes boards no longer booting after some time because a NAND Flash bit has
flipped.

Signed-off-by: Benoît Thébaudeau <benoit.thebaudeau@advansee.com>
Cc: Scott Wood <scottwood@freescale.com>
Cc: Stefano Babic <sbabic@denx.de>
Signed-off-by: Scott Wood <scottwood@freescale.com>
Benoît Thébaudeau 12 年之前
父节点
当前提交
b8fea2b27d
共有 1 个文件被更改,包括 14 次插入2 次删除
  1. 14 2
      nand_spl/nand_boot_fsl_nfc.c

+ 14 - 2
nand_spl/nand_boot_fsl_nfc.c

@@ -140,9 +140,21 @@ static void nfc_nand_data_output(void)
 static int nfc_nand_check_ecc(void)
 {
 #if defined(MXC_NFC_V1)
-	return readw(&nfc->ecc_status_result);
+	u16 ecc_status = readw(&nfc->ecc_status_result);
+	return (ecc_status & 0x3) == 2 || (ecc_status >> 2) == 2;
 #elif defined(MXC_NFC_V1_1)
-	return readl(&nfc->ecc_status_result);
+	u32 ecc_status = readl(&nfc->ecc_status_result);
+	int ecc_per_page = CONFIG_SYS_NAND_PAGE_SIZE / 512;
+	int err_limit = CONFIG_SYS_NAND_SPARE_SIZE / ecc_per_page > 16 ? 8 : 4;
+	int subpages = CONFIG_SYS_NAND_PAGE_SIZE / 512;
+
+	do {
+		if ((ecc_status & 0xf) > err_limit)
+			return 1;
+		ecc_status >>= 4;
+	} while (--subpages);
+
+	return 0;
 #endif
 }