From: Boris Brezillon <boris.brezillon@free-electrons.com>
To: Pavel Machek <pavel@ucw.cz>
Cc: richard@nod.at, dwmw2@infradead.org, computersforpeace@gmail.com,
marek.vasut@gmail.com, cyrille.pitchen@atmel.com,
linux-mtd@lists.infradead.org, linux-kernel@vger.kernel.org,
mark.marshall@omicronenergy.com, b44839@freescale.com,
prabhakar@freescale.com
Subject: Re: [PATCH] fsl_ifc_nand: fix handing of bit flips in erased nand
Date: Wed, 17 May 2017 14:32:11 +0200 [thread overview]
Message-ID: <20170517143211.205ff5de@bbrezillon> (raw)
In-Reply-To: <20170517122224.GB583@amd>
On Wed, 17 May 2017 14:22:24 +0200
Pavel Machek <pavel@ucw.cz> wrote:
> If we see unrecoverable ECC error, we need to count number of bitflips
> from all-ones and report correctable/uncorrectable according to
> that. Otherwise we report ECC failed on erased flash with single bit error.
>
> Signed-off-by: Pavel Machek <pavel@denx.de>
>
> diff --git a/drivers/mtd/nand/fsl_ifc_nand.c b/drivers/mtd/nand/fsl_ifc_nand.c
> index d1570f5..1c66696 100644
> --- a/drivers/mtd/nand/fsl_ifc_nand.c
> +++ b/drivers/mtd/nand/fsl_ifc_nand.c
> @@ -171,34 +171,6 @@ static void set_addr(struct mtd_info *mtd, int column, int page_addr, int oob)
> ifc_nand_ctrl->index += mtd->writesize;
> }
>
> -static int is_blank(struct mtd_info *mtd, unsigned int bufnum)
> -{
> - struct nand_chip *chip = mtd_to_nand(mtd);
> - struct fsl_ifc_mtd *priv = nand_get_controller_data(chip);
> - u8 __iomem *addr = priv->vbase + bufnum * (mtd->writesize * 2);
> - u32 __iomem *mainarea = (u32 __iomem *)addr;
> - u8 __iomem *oob = addr + mtd->writesize;
> - struct mtd_oob_region oobregion = { };
> - int i, section = 0;
> -
> - for (i = 0; i < mtd->writesize / 4; i++) {
> - if (__raw_readl(&mainarea[i]) != 0xffffffff)
> - return 0;
> - }
> -
> - mtd_ooblayout_ecc(mtd, section++, &oobregion);
> - while (oobregion.length) {
> - for (i = 0; i < oobregion.length; i++) {
> - if (__raw_readb(&oob[oobregion.offset + i]) != 0xff)
> - return 0;
> - }
> -
> - mtd_ooblayout_ecc(mtd, section++, &oobregion);
> - }
> -
> - return 1;
> -}
> -
> /* returns nonzero if entire page is blank */
> static int check_read_ecc(struct mtd_info *mtd, struct fsl_ifc_ctrl *ctrl,
> u32 *eccstat, unsigned int bufnum)
> @@ -274,16 +246,13 @@ static void fsl_ifc_run_command(struct mtd_info *mtd)
> if (errors == 15) {
> /*
> * Uncorrectable error.
> - * OK only if the whole page is blank.
> + * We'll check for blank pages later.
> *
> * We disable ECCER reporting due to...
> * erratum IFC-A002770 -- so report it now if we
> * see an uncorrectable error in ECCSTAT.
> */
> - if (!is_blank(mtd, bufnum))
> - ctrl->nand_stat |=
> - IFC_NAND_EVTER_STAT_ECCER;
> - break;
> + ctrl->nand_stat |= IFC_NAND_EVTER_STAT_ECCER;
> }
>
> mtd->ecc_stats.corrected += errors;
> @@ -678,6 +648,41 @@ static int fsl_ifc_wait(struct mtd_info *mtd, struct nand_chip *chip)
> return nand_fsr | NAND_STATUS_WP;
> }
>
> +/*
> + * The controller does not check for bitflips in erased pages,
> + * therefore software must check instead.
> + */
> +static int check_erased_page(struct nand_chip *chip, u8 *buf)
> +{
> + struct mtd_info *mtd = nand_to_mtd(chip);
> + u8 *ecc = chip->oob_poi;
> + const int ecc_size = chip->ecc.bytes;
> + const int pkt_size = chip->ecc.size;
> + int i, res, bitflips = 0;
> + struct mtd_oob_region oobregion = { };
> +
> + mtd_ooblayout_ecc(mtd, 0, &oobregion);
> + ecc += oobregion.offset;
> +
> + for (i = 0; i < chip->ecc.steps; ++i) {
> + res = nand_check_erased_ecc_chunk(buf, pkt_size, ecc, ecc_size,
> + NULL, 0,
> + chip->ecc.strength);
> + if (res < 0)
> + mtd->ecc_stats.failed++;
> + else
> + mtd->ecc_stats.corrected += res;
> +
> + bitflips = max(res, bitflips);
> + buf += pkt_size;
> + ecc += ecc_size;
> + }
> +
> + mtd_ooblayout_ecc(mtd, 1, &oobregion);
Why is this needed?
> +
> + return bitflips;
> +}
> +
> static int fsl_ifc_read_page(struct mtd_info *mtd, struct nand_chip *chip,
> uint8_t *buf, int oob_required, int page)
> {
> @@ -689,11 +695,19 @@ static int fsl_ifc_read_page(struct mtd_info *mtd, struct nand_chip *chip,
> if (oob_required)
> fsl_ifc_read_buf(mtd, chip->oob_poi, mtd->oobsize);
>
> - if (ctrl->nand_stat & IFC_NAND_EVTER_STAT_ECCER)
> - dev_err(priv->dev, "NAND Flash ECC Uncorrectable Error\n");
> -
> if (ctrl->nand_stat != IFC_NAND_EVTER_STAT_OPC)
> mtd->ecc_stats.failed++;
> +
> + if (ctrl->nand_stat & IFC_NAND_EVTER_STAT_ECCER) {
> + int res;
> +
> + if (!oob_required)
> + fsl_ifc_read_buf(mtd, chip->oob_poi, mtd->oobsize);
> +
> + res = check_erased_page(chip, buf);
> + return res;
> + }
> +
>
> return nctrl->max_bitflips;
> }
> @@ -904,6 +922,21 @@ static int fsl_ifc_chip_init(struct fsl_ifc_mtd *priv)
> chip->ecc.algo = NAND_ECC_HAMMING;
> }
>
> + {
> + struct mtd_oob_region oobregion = { };
> +
> + mtd_ooblayout_ecc(mtd, 0, &oobregion);
> + if (!oobregion.length) {
> + dev_err(priv->dev, "No ECC in oobregion?\n");
> + return -EINVAL;
> + }
> + mtd_ooblayout_ecc(mtd, 1, &oobregion);
> + if (oobregion.length) {
> + dev_err(priv->dev, "Extra data in oobregion?\n");
> + return -EINVAL;
> + }
> + }
This clearly doesn't belong in this patch. And if you really want to
check that, please create a separate function instead of defining a
non-conditional code block inside fsl_ifc_chip_init().
> +
> if (ctrl->version == FSL_IFC_VERSION_1_1_0)
> fsl_ifc_sram_init(priv);
>
>
>
>
next prev parent reply other threads:[~2017-05-17 12:32 UTC|newest]
Thread overview: 42+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-04-19 12:13 fsl_ifc_nand: are blank pages protected by ECC? Pavel Machek
2017-04-19 21:18 ` Boris Brezillon
2017-04-19 22:15 ` Pavel Machek
2017-04-19 22:27 ` Boris Brezillon
2017-04-20 11:40 ` Pavel Machek
2017-04-20 12:15 ` Boris Brezillon
2017-04-21 10:51 ` [PATCH] nand_base: optimize checking of erased buffers Pavel Machek
2017-05-17 11:27 ` Mason
2017-05-17 11:39 ` Mason
2017-05-17 11:52 ` Pavel Machek
2017-05-17 12:22 ` [PATCH] fsl_ifc_nand: fix handing of bit flips in erased nand Pavel Machek
2017-05-17 12:32 ` Boris Brezillon [this message]
2017-05-17 13:00 ` Pavel Machek
2017-05-17 13:25 ` Boris Brezillon
2017-05-17 20:03 ` [PATCH] mtd: nand: fsl_ifc: fix handing of bit flips in erased pages Pavel Machek
2017-05-31 20:59 ` [PATCHv2] " Pavel Machek
2017-05-31 22:59 ` Darwin Dingel
2017-06-01 1:09 ` Darwin Dingel
2017-06-01 13:12 ` Pavel Machek
2017-06-01 13:21 ` Boris Brezillon
2017-06-07 7:31 ` Boris Brezillon
2017-04-21 10:08 ` fsl_ifc_nand: are blank pages protected by ECC? Pavel Machek
2017-04-21 10:12 ` Richard Weinberger
2017-04-21 12:04 ` Boris Brezillon
2017-04-21 13:37 ` Pavel Machek
2017-04-21 13:49 ` Boris Brezillon
2017-04-22 7:01 ` Pavel Machek
2017-04-22 10:40 ` [PATCH] tango_nand.c: fix ecc.stats_corrected in empty flash case Pavel Machek
2017-04-24 8:58 ` Marc Gonzalez
2017-04-24 9:03 ` Pavel Machek
2017-05-02 9:42 ` Boris Brezillon
2017-05-02 11:52 ` Marc Gonzalez
2017-05-02 12:20 ` Boris Brezillon
2017-05-03 20:02 ` Pavel Machek
2017-05-03 20:04 ` Pavel Machek
2017-05-04 8:42 ` Boris Brezillon
2017-05-12 15:34 ` [PATCH] mtd: nand: tango: Update ecc_stats.corrected Marc Gonzalez
2017-05-15 8:56 ` Boris Brezillon
2017-05-15 20:47 ` Boris Brezillon
2017-05-17 12:04 ` [PATCH] tango_nand.c: fix ecc.stats_corrected in empty flash case Pavel Machek
2017-04-23 9:58 ` tango_nand: is logic right in error cases? (was Re: fsl_ifc_nand: are blank pages protected by ECC?) Pavel Machek
2017-04-24 7:12 ` Boris Brezillon
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20170517143211.205ff5de@bbrezillon \
--to=boris.brezillon@free-electrons.com \
--cc=b44839@freescale.com \
--cc=computersforpeace@gmail.com \
--cc=cyrille.pitchen@atmel.com \
--cc=dwmw2@infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mtd@lists.infradead.org \
--cc=marek.vasut@gmail.com \
--cc=mark.marshall@omicronenergy.com \
--cc=pavel@ucw.cz \
--cc=prabhakar@freescale.com \
--cc=richard@nod.at \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.