[PATCH v4 3/5] mtd: rawnand: meson: always read whole OOB bytes

Miquel Raynal miquel.raynal at bootlin.com
Mon May 22 08:38:13 PDT 2023


Hi Arseniy,

AVKrasnov at sberdevices.ru wrote on Mon, 15 May 2023 12:44:37 +0300:

> This changes size of read access to OOB area by reading all bytes of
> OOB (free bytes + ECC engine bytes).

This is normally up to the user (user in your case == jffs2). The
controller driver should expose a number of user accessible bytes and
then when users want the OOB area, they should access it entirely. On
top of that read, they can extract (or "write only") the user bytes.

> Signed-off-by: Arseniy Krasnov <AVKrasnov at sberdevices.ru>
> ---
>  drivers/mtd/nand/raw/meson_nand.c | 24 ++++++++++++++++++++++++
>  1 file changed, 24 insertions(+)
> 
> diff --git a/drivers/mtd/nand/raw/meson_nand.c b/drivers/mtd/nand/raw/meson_nand.c
> index 8526a6b87720..a31106c943d7 100644
> --- a/drivers/mtd/nand/raw/meson_nand.c
> +++ b/drivers/mtd/nand/raw/meson_nand.c
> @@ -755,6 +755,30 @@ static int __meson_nfc_read_oob(struct nand_chip *nand, int page,
>  	u32 oob_bytes;
>  	u32 page_size;
>  	int ret;
> +	int i;
> +
> +	/* Read ECC codes and user bytes. */
> +	for (i = 0; i < nand->ecc.steps; i++) {
> +		u32 ecc_offs = nand->ecc.size * (i + 1) +
> +			       NFC_OOB_PER_ECC(nand) * i;
> +
> +		ret = nand_read_page_op(nand, page, 0, NULL, 0);
> +		if (ret)
> +			return ret;
> +
> +		/* Use temporary buffer, because 'nand_change_read_column_op()'
> +		 * seems work with some alignment, so we can't read data to
> +		 * 'oob_buf' directly.

DMA?

> +		 */
> +		ret = nand_change_read_column_op(nand, ecc_offs, meson_chip->oob_buf,
> +						 NFC_OOB_PER_ECC(nand), false);
> +		if (ret)
> +			return ret;
> +
> +		memcpy(oob_buf + i * NFC_OOB_PER_ECC(nand),
> +		       meson_chip->oob_buf,
> +		       NFC_OOB_PER_ECC(nand));
> +	}
>  
>  	oob_bytes = meson_nfc_get_oob_bytes(nand);
>  


Thanks,
Miquèl



More information about the linux-arm-kernel mailing list