Skip to content

Commit b562652

Browse files
palimiquelraynal
authored andcommitted
mtd: rawnand: fsl_elbc: Propagate HW ECC settings to HW
It is possible that current chip->ecc.engine_type value does not match to configured HW value (if HW ECC checking and generating is enabled or not). This can happen with old U-Boot bootloader version which either does not initialize NAND (and let it in some default unusable state) or initialize NAND with different parameters than what is specified in kernel DTS file. So if kernel chose to use some chip->ecc.engine_type settings (e.g. from DTS file) then do not depend on bootloader HW configuration and configures HW ECC settings according to chip->ecc.engine_type value. BR_DECC must be set to BR_DECC_CHK_GEN when HW is doing ECC (both generating and checking), or to BR_DECC_OFF when HW is not doing ECC. This change fixes usage of SW ECC support in case bootloader explicitly enabled HW ECC support and kernel DTS file has specified to use SW ECC. (Of course this works only in case when NAND is not a boot device and both bootloader and kernel are loaded from different location, e.g. FLASH NOR.) Fixes: f6424c2 ("mtd: rawnand: fsl_elbc: Make SW ECC work") Signed-off-by: Pali Rohár <pali@kernel.org> Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com> Link: https://lore.kernel.org/linux-mtd/20230128134111.32559-1-pali@kernel.org
1 parent 724ef01 commit b562652

1 file changed

Lines changed: 8 additions & 0 deletions

File tree

drivers/mtd/nand/raw/fsl_elbc_nand.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -725,6 +725,7 @@ static int fsl_elbc_attach_chip(struct nand_chip *chip)
725725
struct fsl_lbc_ctrl *ctrl = priv->ctrl;
726726
struct fsl_lbc_regs __iomem *lbc = ctrl->regs;
727727
unsigned int al;
728+
u32 br;
728729

729730
/*
730731
* if ECC was not chosen in DT, decide whether to use HW or SW ECC from
@@ -764,6 +765,13 @@ static int fsl_elbc_attach_chip(struct nand_chip *chip)
764765
return -EINVAL;
765766
}
766767

768+
/* enable/disable HW ECC checking and generating based on if HW ECC was chosen */
769+
br = in_be32(&lbc->bank[priv->bank].br) & ~BR_DECC;
770+
if (chip->ecc.engine_type == NAND_ECC_ENGINE_TYPE_ON_HOST)
771+
out_be32(&lbc->bank[priv->bank].br, br | BR_DECC_CHK_GEN);
772+
else
773+
out_be32(&lbc->bank[priv->bank].br, br | BR_DECC_OFF);
774+
767775
/* calculate FMR Address Length field */
768776
al = 0;
769777
if (chip->pagemask & 0xffff0000)

0 commit comments

Comments
 (0)